gpt4 book ai didi

delphi - 在运行时从 Delphi DBGrid 后代显示 DBGrid 之前,如何以编程方式更改 Column 属性?

转载 作者:行者123 更新时间:2023-12-04 08:21:03 27 4
gpt4 key购买 nike

我从 TDBGrid 继承了一个类,我希望它能够记住特定用户对列顺序和列宽所做的任何修改。而且,我希望能够完全在网格本身内做到这一点。我不想将代码附加到 TDataSet,因为这个网格在我的应用程序中被广泛使用,我想在我所有的网格中实现这个功能而不需要重复代码。
我已经完成了持久性部分。我能够检测到用户在 session 期间对网格列进行了更改,并在关联的 TDataSet 关闭或网格本身被破坏时保留该信息。如果您有兴趣,可以从覆盖的 ColumnMoved 方法以及覆盖的 ColsWidthChanged 方法中捕获列参数。 (请注意,当 FGridState 字段等于 gsColSizing 时,这只能从 ColsWidthChanged 完成。)
我还可以在初始化网格时但在显示之前检索持久信息。我的问题是,虽然我成功恢复了持久的列顺序及其宽度,但在显示网格之前这些设置会丢失。具体来说,在应用持久设置后,我可以立即确认我已恢复保存的列顺序和宽度。但是当显示网格时,它会显示默认的列顺序和宽度。这表明我在加载过程中过早地应用了持久化设置。
(顺便说一下,您可以通过更改单独的 TColumn.Index 属性来更改 TDBGrid 中 TColumn 的顺序。还有一个 MoveColumn 方法。一旦默认的 TColumn 已经创建和配置,这些技术就会起作用。)
当此方法的参数值等于 True 时,我试图从覆盖的 LinkActive 方法中恢复以前保留的列设置。
我已经检查了 DBGrid 层次结构中的各种网格类,但我没有看到在加载周期后期覆盖的方法。有没有人对一种方法提出建议,该方法将成功地在网格显示基础 TDataSet 的内容之前立即恢复先前保存的列顺序定义。同样,我想完全从网格中执行此操作,而不必为 TDataSet 分配事件处理程序。另一方面,如果我需要在 TDBGrid 内部的某些内容(例如它的 TGridDataLink)中覆盖某个方法,那就没问题了。
编辑 - - - - - - - - - - - - - - - - -
似乎覆盖 LinkActive 并测试参数 True(并稍微巧妙一些,例如确保您尚未加载持久化数据)是正确的方法。我的问题是我加载的持久数据有一些问题。具体来说,当我更改默认字段的位置时,其他字段也更改了位置,这些更改需要考虑在内。
编辑 2 - - - - - - - - - - - - - - - - -
好了,这个就解决了。当我让持久性部分工作时,我在恢复过程中犯了一个错误。所以,这里需要什么。为了根据持久化的新顺序重新排列列,您还必须知道这些字段的默认或当前顺序。诀窍在于,当您开始更改 Columns 属性中的列顺序时,您还必须更改字段当前位置的列表。我没能做到这一点。
我的代码现在不仅更改了网格的 TColumns 属性中字段的顺序,而且还更新了我创建的列表以跟踪当前顺序。

最佳答案

事实证明,在 TDBBGrid 类中覆盖 LinkActive 是恢复以前保留的列位置数据的好地方(有关更多信息,请参阅对我的问题的编辑)。因此,问题不在于选择要覆盖的方法。
您可能还记得我的问题,您可以通过更改单个列的 TColumn.Index 属性来更改 TDBGrid 中 TColumns 的顺序。还有一个 MoveColumn 方法。但是,为了使这些工作,您必须知道 Columns 属性中字段的当前位置。虽然我在恢复保存的位置之前捕获了这些信息,但我忽略了每次更改给定字段的顺序时许多字段的当前位置都会更改。意识到这一点后,我不仅更改了列中字段的顺序,而且还更新了包含字段当前位置的列表。

关于delphi - 在运行时从 Delphi DBGrid 后代显示 DBGrid 之前,如何以编程方式更改 Column 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65499388/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com