我有一个使用ClientDataSets和本地文件存储的应用程序。一些信息显示在数据库网格中,我发现它已被截断了-显示了字符串的前500个字符左右,但是基础字段需要更长。因此,我返回了代码,并增加了底层FieldDef的大小以及它们的显示宽度。我还(在设计时)创建了一个新的数据集。最后,我运行了该应用程序,并创建了一个新数据库。但是,仅显示了约500个字符。

我应该在哪里查看限制我的字段长度的内容?

最佳答案

我怀疑您会遇到TDBGrid列宽的内部限制,因为显示500个字符的列会比典型的屏幕宽还要大。 (如果您想遍历VCL源,可以进行检查;以Grids.pas开头。)

通常,TDBGrid在单个列中不会显示很多文本。这导致了用户的大量滚动,而水平滚动以读取宽文本对于大多数人来说是非常烦人的。

这样做的通常方法是使用ftMemo类型字段,该字段实际上可以包含不受限制的文本内容。当将该列分配给TDBGrid时,网格列将显示(MEMO),应用程序将对该列进行单击或双击以显示带有TEditTRichEdit来显示/编辑的辅助表单。该列的全部内容。

这是一个附加到名为TDBGridTClientDataSetCDS的示例,其中使用对象检查器中的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事件中(当然,仅用于显示):

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
  if Column.FieldName := 'CDSNotes' then
    ShowMessage(Column.Field.AsString); // Display other form here instead
end;


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



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

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;


使用上面的示例应用程序执行此操作会将显示更改为:

09-07 04:41