我有一个应用程序使用ClientDataSets和本地文件存储。有些信息显示在DB网格中,但我发现它被截断了 - 仅显示了字符串的前500个字符左右,但底层字段需要更长。所以我回到我的代码并增加了底层FieldDefs的大小和它们的显示宽度。我还创建了一个新的数据集(在设计时)。最后,我运行了应用程序并创建了一个新的数据库。尽管如此,仅显示了约500个字符。
我应该在哪里查看限制我的字段长度呢?
我应该在哪里查看限制我的字段长度呢?
TDBGrid
列宽的内部限制,因为显示500个字符的列已经超过了典型屏幕宽度。(如果您想阅读VCL源代码,可以检查一下。请从Grids.pas
开始。)TDBGrid
不会在单列中显示大量文本。这会导致用户频繁滚动,并且对于大多数人来说,水平滚动以阅读宽文本非常令人恼火。ftMemo
类型字段,该字段可以包含几乎无限的文本内容。当该列被分配给TDBGrid
时,网格列将显示(MEMO)
,并且应用程序会处理单击或双击该列以显示具有TEdit
或TRichEdit
的二次窗体,以显示/编辑该列的全部内容。TDBGrid
附加到名为CDS
的TClientDataSet
,并使用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
列后,显示如下:
如果您必须在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;
使用上面的示例应用程序进行操作,会更改显示为:
TField.Size
中,因此我建议您首先检查此值。 - TLamaTVirtualStringTree
,它具有你似乎需要的功能,或者替换TDBGrid
的其他控件,比如ExpressQuantumGrid。TDBGrid
默认并不支持这个功能。 - Ken White