【问题标题】:How do you right justify DBGrid titles when using a FDMemtable in Delphi?在 Delphi 中使用 FDMemtable 时,如何正确证明 DBGrid 标题?
【发布时间】:2016-03-25 00:11:05
【问题描述】:

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

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

有没有人找到一种方法让 DBGrid 列标题在使用 FDMemtable 时保持右对齐?

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

PEBKAC

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

【问题讨论】:

  • 顺便说一句,鉴于您的答案,您是否检查过问题是否特定于使用 FDMemTable?如果有,结果如何?

标签: delphi dbgrid fdmemtable


【解决方案1】:

我也无法使用 TFDMemTable 重现该问题。

我在一个新的 VCL 应用程序的主窗体上删除了 TFDMemTableTDataSourceTDBGrid,照常连接它们(网格的数据源设置为 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;

如果我在设计时设置所有内容,它也可以正常工作。重复我上面使用的相同设置步骤,但不要使用代码,而是使用以下步骤:

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

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

  3. 选择 SizeWeight 列,展开它的 Title 属性,然后设置 AlignmenttaRightJustify

  4. 运行应用程序。您在上面第 3 步中修改的列有一个右对齐的标题。 (这里我使用了 Size 列。)

【讨论】:

  • 设置 DBGrid1.Columns[3].Title.Alignment := TAlignment.taRightJustify;确实有效,谢谢。你知道为什么使用 Object Inspector 设置相同的值不起作用吗?
  • @MichaelRiley-AKAGunny:对不起,迈克。我还没有机会对此进行调查;这个周末我会试试看。
  • 覆盖表单的 Loaded 方法并在其中调用继承。在调用inherited之后在其中放置一个断点,然后您可以查看Columns[].Title.Alignment是否已设置为taRightJustify。
  • @MartynA 我很想尝试一下,但我不知道该怎么做你的建议。你能给我一个资源链接,描述你在说什么。
  • @MichaelRiley-AKAGunny:刚刚做了一个新测试。使用与上面相同的设置,除了删除 FieldDefs 和 AddRecord 代码。相反,使用 Samples Animals.FDS 文件(来自 C:\Users\Public\Documents\Embarcadero\Studio\17.0\Samples\Data 文件夹)从文件加载 FDMemTable。添加所有列,然后使用列编辑器在 Object Inspector 中将 Size 列的 Title 的对齐方式更改为 taRightJustify 并运行应用程序。正如您所期望的那样,标题显示为右对齐。
【解决方案2】:

下面的代码在西雅图适合我。我使用的是 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 中设置了对齐但它被忽略了,看看你是否能找出原因,如下所示:

  • 确保您的表单已保存,然后右键单击它并选择View as text。然后,在 IDE 编辑器窗口中,您可以查看 Alignment 属性是否按照您在 OI 中指定的方式保存。使用编辑器上下文菜单返回以表单形式查看表单。

  • 添加表单的 Loaded 方法的覆盖,正如我在评论中描述的那样。在Loadeds 主体中的inherited 上设置断点,您可以在调用inherited 之前和之后检查对齐值。

为什么我建议调查Loaded?嗯,它在表单从 DFM 流入后被调用,并且是运行时系统完成设置表单的例程。有时,诚然非常罕见,另一个组件(通常是第 3 方组件)行为不端并导致其他组件的属性出现奇怪的行为。

【讨论】:

    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多