首页 > 解决方案 > TDBCtrlGrid 中多行 DBMemo 的单行渲染

问题描述

我在 Delphi 10.3 中使用带有多行 DBMemo 的 TDBCtrlGrid。当面板处于焦点时,行为是正常的。在未聚焦的面板中,文本变为单行。

如何使所有面板看起来一样?

在此处输入图像描述

不同记录的字段值是相等的。第一个焦点记录。

标签: delphidelphi-10.3-rio

解决方案


下面是一个包含 TClientDataSet 的最小测试项目的代码。TDataSource、TDBGrid 和 TDBCtrlGrid。它旨在完全独立,因为所有相关的组件属性和记录数据都在FormCreate事件的代码中设置。它包含一个编译器定义,用于控制 TDBMemo 中显示的字段是 TStringField 还是 TMemoField。

如果我编译并运行项目,我会得到这个显示,无论编译器定义是否处于活动状态。

截屏

如您所见,DBMemo 图像的 3 个实例都正确显示了 4 行数据,正如预期的那样。显然,这不会重现您说明的行为。也许通过将其与您的项目进行比较,您可能能够确定您的行为不同的原因。也许这与 DBMemo 字符串的内容或您使用的字体有关?

TForm1 = class(TForm)
  DBGrid1: TDBGrid;
  DBNavigator1: TDBNavigator;
  DataSource1: TDataSource;
  DBCtrlGrid1: TDBCtrlGrid;
  DBMemo1: TDBMemo;
  ClientDataSet1: TClientDataSet;
[...]
procedure TForm1.FormCreate(Sender: TObject);
var
  AField : TField;
  MemoValue : String;
  i : Integer;
begin
  AField := TIntegerField.Create(ClientDataSet1);
  AField.FieldName := 'Field1';
  AField.DataSet := ClientDataSet1;

{.$define UseStringField}
{$ifdef  UseStringField}
  AField := TStringField.Create(ClientDataSet1);
  AField.FieldName := 'Field2';
  AField.Size := 1024;
  AField.DataSet := ClientDataSet1;
{$else}
  AField := TMemoField.Create(ClientDataSet1);
  AField.FieldName := 'Field2';
  AField.DataSet := ClientDataSet1;
{$endif}

  ClientDataSet1.IndexFieldNames := 'Field1';
  ClientDataSet1.CreateDataSet;
  ClientDataSet1.Open;

  DBMemo1.Width := 150;
  DbCtrlGrid1.RowCount := 1;
  DbCtrlGrid1.ColCount := 3;
  DbCtrlGrid1.PanelWidth := DBMemo1.Width + 20;
  DBMemo1.Left := 10;
  DbCtrlGrid1.Width := 3 * DbCtrlGrid1.PanelWidth;

  for i := 1 to 3 do begin
    MemoValue := 'record: %d' + sLineBreak + 'line2' + sLineBreak + 'line3' + sLineBreak + 'line4' + SLineBreak;
    MemoValue := Format(MemoValue, [i]);
    ClientDataSet1.InsertRecord([i, MemoValue]);
  end;
  ClientDataSet1.First;
end;

推荐阅读