哪个TDataSet,TDbGrid事件用于实现Un-Do功能

时间:2012-01-15 02:14:17

标签: delphi

我打算编写一个un-do功能,用于连接到TTable(BDE)的TDBGrid。我希望它能够在网格单元级别工作。

我想要一些关于实现这个的好方法的建议。

我计划保留一个已更改的记录列表,字段名称及其以前的值。

我认为,我需要的是单元格的OnEnter和OnExit

TDataSet.BeforeEdit是我需要的一半,我想。但是,TDataSet.AfterEdit有点名不副实 - 在编辑完成后不会调用它,而是“在TDataSet进入编辑模式后”(引用帮助系统)。

TField.OnChange会工作但我认为......

我的想法是AfterEdit会抓取单元格的内容。 TField.OnChange会将更改记录到我保留的堆栈中。 (感谢Delphi的Generics。在我们拥有它之前,我从来不知道我错过了什么!)

有关我的想法,警告或更好的方法的任何建议?

PS Standard mea culpa:是的,是的:BDE已被弃用,我不应该使用它,yada,yada,yada。告诉我的老板谁让我保留了150万行遗留代码。是的,是的:总有一天,BDE会消失,我们应该积极主动,立即采取行动。我们知道。谢谢。

2 个答案:

答案 0 :(得分:1)

  1. 如果要为BDE数据集实现撤消/重做功能,那么最好是继承自己的数据集,并覆盖一些方法,而不是挂钩事件。然后将所有TQuery替换为TYourQuery
  2. 更简单的方法是在需要撤消/重做的地方使用TClientDataSet + TDataSetProvider。将TClientDataSetLogChanges设置为True。撤消编辑调用UndoLastChange。对不起,你不能重做,不过。
  3. 从BDE迁移到某些3d方数据访问组件可能很简单直接。例如,AnyDAC具有与BDE兼容的API,良好的documented迁移过程,用于自动迁移的工具。此外,迁移后您将获得(2)开箱即用。

答案 1 :(得分:1)

根据罗伯特的要求,我的评论改写为asnwer。

通过键入Ctrl-Z或Esc,单元格是否已支持撤销?

或者,如果您想对多个单元格进行一堆编辑并让“撤消”逐个还原它们,那么您可以组合数据集和字段事件。数据集OnBeforeEdit将为您提供所有单元格的基础,每个字段的onchange将为您提供OnAfterEdit,当用户返回时,它将呈现与(虚构)Field.OnBeforeEdit相同的值再次编辑同一个单元格。