在 Delphi 中使用 FDMemtable 时如何调整 DBGrid 标题?
How do you right justify DBGrid titles when using a FDMemtable in Delphi?
在使用 FDMemtable 时,我似乎无法让 DBGrid 中的固定行标题右对齐。每当我将字段对齐方式设置为 taRightJustify 时,它就会完美地对齐数据单元格。但是,DBGrid 标题始终左对齐。
更令人沮丧的是,我可以将相应的 DBGrid 列标题对齐设置为 taRightJustify,它在 IDE 中显示得非常好。但是当我 运行 程序时,列标题显示为左对齐。
有没有人找到让 DBGrid 列标题在使用 FDMemtable 时保持右对齐的方法?
顺便说一句,taCenter 也会发生这种情况。数据单元格居中对齐,但标题保持左对齐。
佩布卡奇
问题是我自己造成的。我没有调用 DBGrid 列编辑器并添加所有字段。相反,我使用 "Structure" 窗格并以这种方式访问 DBGrid 列。尽管“结构”窗格允许我修改列标题,但这只是暂时的,并且在程序 运行.
时不会持续存在
下面的代码适用于西雅图的我。我使用的是 TClientDataSet 而不是 TFDMemTable,但我看不出这会有什么不同。
如果您在 DBGrid 上定义了持久列,您还可以通过 Object 检查器设置列的标题对齐方式 - 将其用于 select 列,然后展开其标题节点,然后您可以在那里设置标题对齐方式。
procedure TForm1.CDS1AfterOpen(DataSet: TDataSet);
var
i : Integer;
begin
for i := 0 to DBGrid1.Columns.Count - 1 do
DBGrid1.Columns[i].Title.Alignment := taRightJustify;
end;
顺便说一句,如果您认为自己在 OI 中设置对齐但它被忽略了,请查看是否可以找出原因,如下所示:
确保您的表格已保存,然后 right-click 和 select View as text
。然后,在 IDE 编辑器 window 中,您可以查看对齐 属性 是否按照您在 OI 中指定的那样保存。使用编辑器上下文菜单 return 以表单形式查看表单。
如我在评论中所述,添加对表单的 Loaded 方法的覆盖。在 Loaded
中的 inherited
上设置断点 body,您可以检查调用 inherited
前后的 Alignment 值。
为什么我建议调查 Loaded
?好吧,它是在表单从 DFM 流入之后调用的,并且是 run-time 系统完成表单设置的例程。有时,诚然很少见,另一个组件(通常是第 3 方组件)行为不当并导致其他组件的属性出现奇怪的行为。
我也无法使用 TFDMemTable 重现该问题。
我在新的 VCL 应用程序的主窗体上放置了 TFDMemTable
、TDataSource
和 TDBGrid
,并像往常一样连接它们(网格的数据源设置为 DataSource1
,数据源的 DataSet
设置为 FDMemTable1
),然后将以下代码添加到表单的 OnCreate
事件中:
procedure TForm3.FormCreate(Sender: TObject);
begin
FDMemTable1.FieldDefs.Add('ID', ftInteger, 0, True);
FDMemTable1.FieldDefs.Add('LastName', ftString, 20);
FDMemTable1.FieldDefs.Add('FirstName', ftString, 20);
FDMemTable1.FieldDefs.Add('Salary', ftCurrency);
FDMemTable1.CreateDataSet;
FDMemTable1.Active := True;
FDMemTable1.AppendRecord([1, 'Smith', 'John', 30000]);
FDMemTable1.AppendRecord([2, 'Jones', 'Jane', 40000]);
FDMemTable1.AppendRecord([3, 'Doe', 'David', 2500]);
DBGrid1.Columns[3].Alignment := TAlignment.taRightJustify;
DBGrid1.Columns[3].Title.Alignment := TAlignment.taRightJustify;
end;
如果我在设计时设置所有内容,它也能正常工作。重复我上面使用的相同设置步骤,但不使用代码,而是使用以下步骤:
Select Object 检查器中的 FDMemTable1。在 OI 的底部,单击 LoadFromFile link,然后导航到 BDS Samples 数据文件夹(默认情况下,在 C:\Users\Public\Public Documents\Embarcadero\Studio.0\Samples\Data) 和 select animals.fds。 (没有选择那个的具体原因,除了它有一个我们可以用来测试的数字字段。)
Right-click 在 DBGrid 上,然后选择 Columns Editor,或单击 DBGrid.Columns [=78= 上的省略号按钮] 在 Object 检查器中。 Right-click 在列编辑器中选择 添加所有字段。
Select Size 或 Weight 列,展开它的 Title 属性,并将 Alignment 设置为 taRightJustify
.
运行 申请。您在上面的第 3 步中修改的列具有 right-aligned 标题。 (这里我使用了 Size 列。)
在使用 FDMemtable 时,我似乎无法让 DBGrid 中的固定行标题右对齐。每当我将字段对齐方式设置为 taRightJustify 时,它就会完美地对齐数据单元格。但是,DBGrid 标题始终左对齐。
更令人沮丧的是,我可以将相应的 DBGrid 列标题对齐设置为 taRightJustify,它在 IDE 中显示得非常好。但是当我 运行 程序时,列标题显示为左对齐。
有没有人找到让 DBGrid 列标题在使用 FDMemtable 时保持右对齐的方法?
顺便说一句,taCenter 也会发生这种情况。数据单元格居中对齐,但标题保持左对齐。
佩布卡奇
问题是我自己造成的。我没有调用 DBGrid 列编辑器并添加所有字段。相反,我使用 "Structure" 窗格并以这种方式访问 DBGrid 列。尽管“结构”窗格允许我修改列标题,但这只是暂时的,并且在程序 运行.
时不会持续存在下面的代码适用于西雅图的我。我使用的是 TClientDataSet 而不是 TFDMemTable,但我看不出这会有什么不同。
如果您在 DBGrid 上定义了持久列,您还可以通过 Object 检查器设置列的标题对齐方式 - 将其用于 select 列,然后展开其标题节点,然后您可以在那里设置标题对齐方式。
procedure TForm1.CDS1AfterOpen(DataSet: TDataSet);
var
i : Integer;
begin
for i := 0 to DBGrid1.Columns.Count - 1 do
DBGrid1.Columns[i].Title.Alignment := taRightJustify;
end;
顺便说一句,如果您认为自己在 OI 中设置对齐但它被忽略了,请查看是否可以找出原因,如下所示:
确保您的表格已保存,然后 right-click 和 select
View as text
。然后,在 IDE 编辑器 window 中,您可以查看对齐 属性 是否按照您在 OI 中指定的那样保存。使用编辑器上下文菜单 return 以表单形式查看表单。如我在评论中所述,添加对表单的 Loaded 方法的覆盖。在
Loaded
中的inherited
上设置断点 body,您可以检查调用inherited
前后的 Alignment 值。
为什么我建议调查 Loaded
?好吧,它是在表单从 DFM 流入之后调用的,并且是 run-time 系统完成表单设置的例程。有时,诚然很少见,另一个组件(通常是第 3 方组件)行为不当并导致其他组件的属性出现奇怪的行为。
我也无法使用 TFDMemTable 重现该问题。
我在新的 VCL 应用程序的主窗体上放置了 TFDMemTable
、TDataSource
和 TDBGrid
,并像往常一样连接它们(网格的数据源设置为 DataSource1
,数据源的 DataSet
设置为 FDMemTable1
),然后将以下代码添加到表单的 OnCreate
事件中:
procedure TForm3.FormCreate(Sender: TObject);
begin
FDMemTable1.FieldDefs.Add('ID', ftInteger, 0, True);
FDMemTable1.FieldDefs.Add('LastName', ftString, 20);
FDMemTable1.FieldDefs.Add('FirstName', ftString, 20);
FDMemTable1.FieldDefs.Add('Salary', ftCurrency);
FDMemTable1.CreateDataSet;
FDMemTable1.Active := True;
FDMemTable1.AppendRecord([1, 'Smith', 'John', 30000]);
FDMemTable1.AppendRecord([2, 'Jones', 'Jane', 40000]);
FDMemTable1.AppendRecord([3, 'Doe', 'David', 2500]);
DBGrid1.Columns[3].Alignment := TAlignment.taRightJustify;
DBGrid1.Columns[3].Title.Alignment := TAlignment.taRightJustify;
end;
如果我在设计时设置所有内容,它也能正常工作。重复我上面使用的相同设置步骤,但不使用代码,而是使用以下步骤:
Select Object 检查器中的 FDMemTable1。在 OI 的底部,单击 LoadFromFile link,然后导航到 BDS Samples 数据文件夹(默认情况下,在 C:\Users\Public\Public Documents\Embarcadero\Studio.0\Samples\Data) 和 select animals.fds。 (没有选择那个的具体原因,除了它有一个我们可以用来测试的数字字段。)
Right-click 在 DBGrid 上,然后选择 Columns Editor,或单击 DBGrid.Columns [=78= 上的省略号按钮] 在 Object 检查器中。 Right-click 在列编辑器中选择 添加所有字段。
Select Size 或 Weight 列,展开它的 Title 属性,并将 Alignment 设置为
taRightJustify
.运行 申请。您在上面的第 3 步中修改的列具有 right-aligned 标题。 (这里我使用了 Size 列。)