如何实现多重撤销/重做?

3

我有一个包含4个编辑框和一个备忘录的表单,并试图找出如何实现多个撤销和重做,例如-

所以如果用户在编辑3、1、2、备忘录中输入文本,然后在编辑4中,我想要按相反的顺序撤销,并按原始顺序重做。

但是我不确定如何跟踪顺序。对此的任何帮助都将不胜感激

我正在使用Delphi 7


请参阅命令设计模式备忘录设计模式 - undefined
3个回答

4
最简单的方法是捕获所有包含控件的变化并记录它们的状态(内容、选择和光标位置)。每次进行更改时,都要这样做,这样就会有一个撤销堆栈。现在当您需要撤消操作时,您可以将所有控件恢复到它们保存的状态。
这种方案可能会占用相当多的资源,一旦实施,您会希望通过仅保存差异或特定控件上执行的最后一个操作来进行优化。问题在于:
(a) 标准编辑/备忘录不能提供有关已更改内容的确切信息,因此您需要以某种方式计算更改(例如,通过将其与先前记录的状态进行比较,但这意味着您需要从初始状态开始重建内容,并通过所有更改,然后将当前-1状态与当前状态进行比较,才能找出更改)。
(b) 标准控件自行处理撤消操作,用户可以还原一个控件,从而破坏您的撤销堆栈的顺序。
也许您可以使用一些第三方编辑/备忘录控件,它们可能更容易满足您的需求,并且会让您控制撤消/重做操作。例如,我曾经为LMD Innovative拥有的LMD ElPack创建了TElEdit控件,该控件在其他功能之外还具有撤消/重做堆栈,我知道如何对TElEdit的源代码进行轻微修改以帮助您。您可能需要查看TElEdit或其他类似组件以了解它们能为您提供什么。

“反向增量”技术将减少撤销文本更改的速度,从最后一版本开始。 - undefined

1
使用命令模式来实现。我不会解释整个概念,因为已经有很多相关的内容了,但是可以在这里找到一个很好的例子,如果你搜索“命令模式撤销重做”,还会有很多其他的例子。

0
使用TClientDataSet控件作为内存存储,以及4个TDBEdit控件。请参阅TClientDataSet的revert和undolastchange方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接