我有一个带有 4 个编辑框和一个备忘录的表单,并试图弄清楚如何实现多个撤消的重做,例如-
因此,如果用户在编辑 3、1、2、备忘录中输入文本,然后编辑 4 我想按修订顺序撤消,并按原始顺序重做。
但是,我不确定如何跟踪订单。任何这方面的帮助将不胜感激
我正在使用德尔福 7
最简单的方法是捕获对任何包含控件的任何更改,并将所有 4 个控件的状态(内容、选择、插入符号位置)写下来。对每个更改执行此操作,您将拥有一个撤消堆栈。现在,当您需要撤消该操作时,您可以将所有控件还原到其保存状态。
此方案可能非常消耗资源,一旦实现,您将希望通过仅保存差异或对特定控件执行的最后一个操作来优化它。问题是
(a) 标准编辑/备忘录不会为您提供有关确切更改的信息,因此您需要以某种方式计算更改(例如,通过将其与先前记录的状态进行比较,但这意味着您需要从初始状态"重建"内容并通过所有更改,然后将当前状态与当前状态进行比较只是为了找出更改,
(b) 标准控件本身处理撤消操作,用户可以还原一个控件,从而破坏撤消堆栈的顺序。
也许您可以使用一些第三方编辑/备忘录控件,这些控件可以更容许您的需求,并允许您控制撤消/重做操作。例如,我曾经为ElPack(现在LMD ElPack由LMD Innovation拥有)创建了TElEdit控件,并且该控件以及其他功能具有撤消/重做堆栈,我知道TElEdit如何帮助您对其源代码进行轻微修改。您可能需要检查 TElEdit 或其他类似组件,看看它们可以为您提供什么。
为此使用 Command 模式。 我不会解释整个概念,因为已经有很多了,但是可以在这里找到一个很好的例子,如果您搜索"命令模式撤消重做",还有很多其他示例
使用 TClientDataSet 控件作为内存存储和 4 个 tdbedit 控件。请参阅 TClientDataSet revert, undolastchange 方法。