TDBCtrlGrid 中多行 DBMemo 的一行渲染

One-line rendering of a multi-line DBMemo in a TDBCtrlGrid

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

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

不同记录的字段值相等。关注第一条记录。

下面是代码 os 一个包含 TClientDataSet 的最小测试项目。 TDataSource、TDBGrid 和 TDBCtrl网格。它旨在完全独立,因为所有 相关组件属性和记录数据在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;

分析完@MartynA的示例代码

我的问题是字段的数据类型。

数据类型TStringField显示在一行。 数据类型 TMemoField 显示为多行。