在Delphi中使用FDMemtable时,如何正确对齐DBGrid标题?

在Delphi中使用FDMemtable时,如何正确对齐DBGrid标题?,delphi,dbgrid,fdmemtable,Delphi,Dbgrid,Fdmemtable,在使用FDMemtable时,我似乎无法使DBGrid中的固定行标题右对齐。每当我将字段对齐设置为taRightJustify时,它都会正确对齐数据单元格。但是,DBGrid标题总是左对齐 更令人沮丧的是,我可以将相应的DBGrid列标题对齐设置为taRightJustify,并且它在IDE中看起来非常好。但当我运行程序时,列标题显示为左对齐 是否有人找到了一种方法,使DBGrid列标题在使用FDMemtable时保持右对齐 顺便说一句,taCenter也会出现这种情况。数据单元格居中对齐,但标

在使用FDMemtable时,我似乎无法使DBGrid中的固定行标题右对齐。每当我将字段对齐设置为taRightJustify时,它都会正确对齐数据单元格。但是,DBGrid标题总是左对齐

更令人沮丧的是,我可以将相应的DBGrid列标题对齐设置为taRightJustify,并且它在IDE中看起来非常好。但当我运行程序时,列标题显示为左对齐

是否有人找到了一种方法,使DBGrid列标题在使用FDMemtable时保持右对齐

顺便说一句,taCenter也会出现这种情况。数据单元格居中对齐,但标题保持左对齐

PEBKAC
这个问题是我自己造成的。我没有调用DBGrid列编辑器并添加所有字段。相反,我使用的是“结构”窗格,并以这种方式访问DBGrid列。虽然“结构”窗格允许我修改列标题,但这只是临时的,在程序运行时不会持久。

下面的代码在西雅图对我有效。我使用的是TClientDataSet而不是TFDMemTable,但我看不出这会有什么不同

如果在DBGrid上定义了持久列,还可以通过对象检查器设置列的标题对齐方式-使用它选择列,然后展开其标题节点,然后在那里设置标题对齐方式

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中设置对齐,但它被忽略,请查看是否可以找出原因,如下所示:

  • 确保您的表单已保存,然后右键单击它并选择
    查看为文本
    。然后,在IDE编辑器窗口中,您可以看到对齐属性是否按照在OI中指定的方式保存。使用编辑器关联菜单返回以表单形式查看表单

  • 如我在注释中所述,添加对表单加载方法的重写。使用
    Loaded
    s正文中
    inherited
    上的断点,可以在调用
    inherited
    之前和之后检查对齐值


为什么我建议查看加载的
?嗯,它是在从DFM流式导入表单后调用的,是运行时系统完成表单设置的例程。有时,无可否认,另一个组件(通常是第三方组件)会出现异常行为,并导致其他组件的属性出现异常行为。

我也无法使用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;
如果我在设计时设置所有内容,它也可以正常工作。重复我上面使用的相同设置步骤,但不要使用代码,而是使用以下步骤:

  • 在对象检查器中选择FDMemTable1。在OI的底部,单击LoadFromFile链接,导航到BDS样本数据文件夹(默认情况下,在C:\Users\Public\Public Documents\Embarcadero\Studio\17.0\Samples\data中)并选择animals.fds。(选择该字段没有具体原因,只是它有一个数字字段,我们可以用于测试。)

  • 右键单击DBGrid,选择Columns Editor,或单击对象检查器中DBGrid.Columns属性上的省略号按钮。在列编辑器中单击鼠标右键,然后选择“添加所有字段”

  • 选择“大小”或“权重”列,展开其标题属性,并将对齐设置为
    taRightJustify

  • 运行应用程序。您在上面步骤#3中修改的列具有右对齐的标题。(这里我使用了“大小”列。)


  • 设置DBGrid1.Columns[3]。Title.Alignment:=TAlignment.taRightJustify;Indeed有用吗,谢谢。你知道为什么使用对象检查器设置相同的值不起作用吗?@MichaelRiley AKAGunny:对不起,迈克。我还没有机会调查这件事;我将在本周末尝试查看它。重写窗体的Loaded方法并调用其中继承的方法。调用inherited后,在其中放置一个断点,然后可以查看列[].Title.Alignment是否已设置为taRightJustify。@MartynA我很想尝试一下,但我不知道如何执行您的建议。你能给我一个资源的链接,描述你在说什么吗?@MichaelRiley AKAGunny:刚刚做了一个新的测试。使用与上述相同的设置,但删除FieldDefs和AddRecord代码除外。相反,使用Samples anivers.FDS文件(从C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\Data文件夹)从文件加载FDMemTable。添加所有列,然后使用列编辑器在对象检查器中将大小列标题的对齐方式更改为taRightJustify,然后运行应用程序。正如您所期望的那样,标题看起来是右对齐的。顺便说一句,鉴于您得到的答案,您是否检查过该问题是否特定于使用FDMemTable?如果有,结果如何?