【问题标题】:How to Implement multiple Undo / Redo?如何实现多个撤消/重做?
【发布时间】:2012-07-02 20:22:24
【问题描述】:

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

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

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

我正在使用 Delphi 7

【问题讨论】:

标签: delphi undo redo


【解决方案1】:

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

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

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

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

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

【讨论】:

  • “反向增量”技术会降低从上一个版本开始撤消文本更改的速度
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-10
      • 2016-02-18
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 2011-11-14
      • 2021-06-04
      相关资源
      最近更新 更多