2

我有一个带有 4 个编辑框和一个备忘录的表单,并且正在尝试弄清楚如何实现多个撤消的重做,例如-

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

但是我不太确定如何跟踪订单。对此的任何帮助将不胜感激

我正在使用德尔福 7

4

3 回答 3

4

最简单的方法是捕获对任何包含控件的任何更改,并一起写下所有 4 个控件的状态(内容、选择、插入符号位置)。对每次更改都执行此操作,您将拥有一个撤消堆栈。现在,当您需要撤消操作时,您可以将所有控件恢复到其保存状态。

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

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

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

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

于 2012-07-02T12:13:03.933 回答
1

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

于 2012-07-04T03:23:24.810 回答
0

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

于 2012-07-02T22:26:39.670 回答