【发布时间】:2012-07-02 20:22:24
【问题描述】:
我有一个带有 4 个编辑框和一个备忘录的表单,我正在尝试弄清楚如何实现多个撤消的重做,例如 -
因此,如果用户在编辑 3、1、2、备忘录然后编辑 4 中输入文本,我想按反向顺序撤消并按原始顺序重做。
但是我不太确定如何跟踪订单。对此的任何帮助将不胜感激
我正在使用 Delphi 7
【问题讨论】:
我有一个带有 4 个编辑框和一个备忘录的表单,我正在尝试弄清楚如何实现多个撤消的重做,例如 -
因此,如果用户在编辑 3、1、2、备忘录然后编辑 4 中输入文本,我想按反向顺序撤消并按原始顺序重做。
但是我不太确定如何跟踪订单。对此的任何帮助将不胜感激
我正在使用 Delphi 7
【问题讨论】:
最简单的方法是捕获对任何包含的控件的任何更改,并一起写下所有 4 个控件的状态(内容、选择、插入符号位置)。对每次更改都执行此操作,您将拥有一个撤消堆栈。现在,当您需要撤消操作时,您可以将所有控件恢复到其保存状态。
此方案可能会非常消耗资源,并且一旦实施,您可能希望通过仅保存差异或对特定控件完成的最后操作来优化它。问题是
(a) 标准编辑/备忘录不会为您提供确切更改的信息,因此您需要以某种方式计算更改(例如,通过将其与之前记录的状态进行比较,但这意味着您需要从初始状态“重建”内容并通过所有更改,然后将 current-1 状态与当前状态进行比较以找出更改,
(b) 标准控件自己处理撤消操作,用户可以恢复一个控件,从而破坏撤消堆栈的顺序。
也许您可以使用一些第三方编辑/备忘录控件,这些控件将更能满足您的需求,并且可以让您控制撤消/重做操作。例如,我曾经为 ElPack(现在 LMD ElPack 由 LMD Innovative 拥有)创建了 TElEdit 控件,并且该控件在其他功能中具有撤消/重做堆栈,我知道 TElEdit 如何帮助您对其源代码进行轻微修改。您可能需要检查 TElEdit 或其他类似组件,看看他们可以为您提供什么。
【讨论】:
使用一个 TClientDataSet 控件作为 mem 存储和 4 个 tdbedit 控件。参见 TClientDataSet revert, undolastchange 方法。
【讨论】:
为此使用Command pattern。我不会解释整个概念,因为已经有很多了,但是可以找到一个很好的例子here,如果你搜索“命令模式撤消重做”,还有很多其他的
【讨论】: