我有一个应用程序,它使用ClientDataSets和本地文件存储。一些信息显示在DB网格中,我发现它被切断了--一个字符串的前500个字符被显示出来,但是底层字段需要更长的时间。因此,我回到我的代码,并增加了基础FieldDefs的大小和它们的显示宽度。我还创建了一个新的数据集(在设计时)。最后,我运行了应用程序,并创建了一个新的数据库。然而,只显示了大约500个字符。
我应该在哪里看看是什么限制了我的字段长度?
发布于 2012-05-10 16:01:46
我怀疑您遇到了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
由于底层数据集不存在,所以我分配一个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
。
在对象检查器中,选择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
列后的TDBGrid
第1行的显示
如果必须在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;
使用上面的示例应用程序将显示更改为:
https://stackoverflow.com/questions/10541853
复制