如何实现多个撤消/重做?

时间:2012-07-02 12:06:09

标签: delphi undo redo

我有一个包含4个编辑框和备忘录的表单,我正试图弄清楚如何实现多个撤销的重做,所以例如 -

因此,如果用户在编辑3,1,2,备忘录中输入文本,则编辑4我想在revrese顺序中撤消,并按原始顺序重做。

但是我不确定如何跟踪订单。任何有关这方面的帮助将不胜感激

我正在使用Delphi 7

3 个答案:

答案 0 :(得分:4)

最简单的方法是捕获任何包含控件的任何更改,并将所有4个控件的状态(内容,选择,插入位置)记录在一起。为每个更改执行此操作,并且您具有撤消堆栈。现在,当您需要撤消操作时,将所有控件恢复为其已保存状态。

此方案可能非常耗费资源,一旦实施,您可能希望通过仅保存特定控件上的差异或最后一次操作来优化它。问题是

(a)标准编辑/备忘录不会向您提供有关确切变化的信息,因此您需要以某种方式计算变化(例如,通过将其与先前记录的状态进行比较,但这意味着您需要从初始状态到所有更改“重建”内容,然后将当前状态与当前状态进行比较,以找出变化,

(b)标准控件本身处理撤消操作,用户可以恢复一个控件,从而打破撤消堆栈的顺序。

也许您可以使用一些更能容忍您需求的第三方编辑/备忘录控件,并让您控制撤消/重做操作。例如,我曾经为ElPack创建了TElEdit控件(现在由LMD Innovative拥有的LMD ElPack),并且其他功能中的控件具有撤销/重做堆栈,我知道TElEdit如何帮助您稍微修改其源代码。您可能需要检查TElEdit或其他类似组件以查看它们可以为您提供的内容。

答案 1 :(得分:0)

使用TClientDataSet控件作为mem存储和4个tdbedit控件。请参阅TClientDataSet revert,undolastchange方法。

答案 2 :(得分:0)

使用Command pattern进行此操作。我不会解释整个概念,因为已经存在很多概念,但是可以找到一个很好的例子here,如果搜索“命令模式撤消重做”,还有很多其他概念