我有一个使用 ClientDataSets 和本地文件存储的应用程序。一些信息显示在数据库网格中,我发现它被截断了——显示了字符串的前 500 个字符左右,但基础字段需要更长。所以我回到我的代码并增加了底层 FieldDef 的大小以及它们的显示宽度。我还创建了一个新数据集(在设计时)。最后,我运行了应用程序,并创建了一个新数据库。然而,只显示了约 500 个字符。
我应该在哪里查看限制我的字段长度的因素?
我有一个使用 ClientDataSets 和本地文件存储的应用程序。一些信息显示在数据库网格中,我发现它被截断了——显示了字符串的前 500 个字符左右,但基础字段需要更长。所以我回到我的代码并增加了底层 FieldDef 的大小以及它们的显示宽度。我还创建了一个新数据集(在设计时)。最后,我运行了应用程序,并创建了一个新数据库。然而,只显示了约 500 个字符。
我应该在哪里查看限制我的字段长度的因素?
我怀疑您遇到了TDBGrid
列宽的内部限制,因为显示 500 个字符的列将超过典型的屏幕宽度。(如果您想浏览 VCL 源代码,可以选中此项;以 . 开头Grids.pas
。)
通常, aTDBGrid
不会在单个列中显示大量文本。它会导致用户大量滚动,而水平滚动阅读宽文本对大多数人来说非常烦人。
执行此操作的常用方法是使用ftMemo
类型字段,它可以包含几乎无限的文本内容。当该列分配给 aTDBGrid
时,网格列显示(MEMO)
,并且应用程序处理单击或双击该列以显示带有 a 的辅助表单TEdit
或TRichEdit
显示/编辑该列的全部内容。
这是一个TDBGrid
附加到TClientDataSet
命名的示例,其中使用在对象检查器中CDS
定义了以下列(无用,但是一个示例) :CDS.FieldDefs
Column Persistent Name FieldType Size
------ --------------- --------- ----
ID CDSID ftInteger 0
Name CDSName ftString 25
Notes CDSNotes ftMemo 0
由于底层数据集不存在,我分配一个FileName
, 并使用以下代码在运行时创建它:
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
.
在 Object Inspector 中,选择TDBGrid
,转到 Events 选项卡,然后将以下内容添加到OnCellClick
事件中(当然只是为了显示):
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
if Column.FieldName := 'CDSNotes' then
ShowMessage(Column.Field.AsString); // Display other form here instead
end;
这是单击CDSNotes
第 1 行的列后的显示TDBGrid
:
如果您必须在 中显示较长文本列的部分内容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;
使用上面的示例应用程序执行此操作会将显示更改为: