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
显示为多行。
我在 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
显示为多行。