什么属性决定ClientDataSet字段的大小?

3
我有一个应用程序使用ClientDataSets和本地文件存储。有些信息显示在DB网格中,但我发现它被截断了 - 仅显示了字符串的前500个字符左右,但底层字段需要更长。所以我回到我的代码并增加了底层FieldDefs的大小和它们的显示宽度。我还创建了一个新的数据集(在设计时)。最后,我运行了应用程序并创建了一个新的数据库。尽管如此,仅显示了约500个字符。
我应该在哪里查看限制我的字段长度呢?

字段大小(字符串字段类型中的最大字符数)存储在 TField.Size 中,因此我建议您首先检查此值。 - TLama
1
你如何期望在DBGrid中显示500个或更多字符?(你能说出主要的滚动问题吗?我看到你的用户未来会有重复性压力伤害。 <G>)通常的做法是显示部分文本,并允许用户双击以阅读其余部分;当他们这样做时,您打开一个带有TMemo或TRichEdit或其他控件的辅助窗口,以可读格式显示整个文本。 - Ken White
@Ken,+1 给你的评论(我希望在答案中提到这一点;-)。我讨厌网格列尝试自动调整大小,超过当前位置一个页面滚动的大小。没有手动拖动滚动条就无法阅读内容,因此我更喜欢提示窗口或双击显示其余内容。 - TLama
@Ken,乍一看似乎很奇怪,但是网格只有两列,文本大小为9或10pt。长的TStringField条目很少被编辑。用户界面的视觉外观类似于文字处理器中的表格。我在http://www.csulb.edu/~acolburn/screenshot.doc发布了部分截图。 - Al C
@AlC,对于你的用户界面来说,选择TDBGrid可能不是一个好选择(就像你选择使用Word文档来发布示例截图一样<g>)。你可以考虑使用TVirtualStringTree,它具有你似乎需要的功能,或者替换TDBGrid的其他控件,比如ExpressQuantumGridTDBGrid默认并不支持这个功能。 - Ken White
显示剩余4条评论
1个回答

4
我怀疑你遇到了TDBGrid列宽的内部限制,因为显示500个字符的列已经超过了典型屏幕宽度。(如果您想阅读VCL源代码,可以检查一下。请从Grids.pas开始。)
通常,TDBGrid不会在单列中显示大量文本。这会导致用户频繁滚动,并且对于大多数人来说,水平滚动以阅读宽文本非常令人恼火。
通常的解决方法是使用ftMemo类型字段,该字段可以包含几乎无限的文本内容。当该列被分配给TDBGrid时,网格列将显示(MEMO),并且应用程序会处理单击或双击该列以显示具有TEditTRichEdit的二次窗体,以显示/编辑该列的全部内容。
以下是一个例子,其中TDBGrid附加到名为CDSTClientDataSet,并使用CDS.FieldDefs在对象查看器中定义以下列(无用,但是一个例子):
Column      Persistent Name    FieldType    Size
------      ---------------    ---------    ----
ID          CDSID              ftInteger     0
Name        CDSName            ftString     25
Notes       CDSNotes           ftMemo        0

由于底层数据集不存在,我指定一个文件名,并使用以下代码在运行时创建它:

procedure TForm1.FormCreate(Sender: TObject);
begin
  if not FileExists(CDS.FileName) then
  begin
    CDS.CreateDataSet;
    CDS.Active := True;
    CDS.InsertRecord([1, 'John Smith', 'This is some longer text'#13'for testing.']);
    CDS.InsertRecord([2, 'Fred Jones', 'A note about Fred goes'#13'here for now.']);
    CDS.Active := False;
  end;
  CDS.Active := True;
end;

我在表单上放置了一个 TDataSource,并将它的 DataSource 设置为 CDS。我添加了一个 TDBGrid,并将其 DataSet 设置为 DataSource1
在对象检查器中,选择 TDBGrid,转到事件选项卡,并在 OnCellClick 事件中添加以下内容(仅用于显示):
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
  if Column.FieldName := 'CDSNotes' then
    ShowMessage(Column.Field.AsString); // Display other form here instead
end;

在单击TDBGrid的第1行CDSNotes列后,显示如下:

enter image description here

如果您必须在TDBGrid中显示较长文本列的部分内容,可以使用以下内容:

procedure TForm2.CDSNotesGetText(Sender: TField; var Text: string;
  DisplayText: Boolean);
begin
  // Again, a trivial example using an arbitrary chunk of the first 20
  // characters just for demo purposes.
  if DisplayText then
    Text := Copy(Sender.AsString, 1, 20)
  else
    // Not for display only; return all the text.
    Text := Sender.AsString;
end;

使用上面的示例应用程序进行操作,会更改显示为:

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接