在TextArea中实现撤消/重做

时间:2009-12-02 05:24:53

标签: flex flash actionscript-3

我想知道如何使用TextArea实现撤消重做功能。我已经有一个undoredo框架功能,现在我有两个问题。

  1. 我何时开始/停止新的撤消/重做命令,例如当用户点击撤消时,我会走多远。
  2. 如何在普通的TextArea
  3. 中实现此功能(1.)

    我的想法: 我认为我应该创建一个新的撤销命令,除了alphanumber + space之外什么都没有。为此,我将使用keyDown事件并测试密钥是否为alpha num,如果不是,我将重置命令。

    听起来不错?

3 个答案:

答案 0 :(得分:2)

侦听keydown事件将错过用户使用鼠标进行的任何文本编辑(剪切/复制/粘贴)。

我认为更好的方法是监听控件上的“更改”事件(每当内容通过用户输入更改时触发),并且只需按下控件的全部内容(其“text”或“htmlText”)属性)将每个更改事件放入一个undo-buffer(一个字符串数组)。我假设内存使用不是问题(可能不是,取决于控件内容的预期大小和撤消级别的数量)。

这样,只需将撤消缓冲区中相应的控制状态(基本上通过数组上下移动)复制回控件即可实现undo / redo。

“正确”的方法是跟踪实际编辑,并且会更加复杂。

答案 1 :(得分:1)

  

1.当我开始/停止新的撤消/重做命令时,例如当用户点击撤消时,我会走多远。

您认为您的用户需要撤消多个步骤吗?如果是这样,那么你可能想要一个历史(例如Paint .NET)并允许无限的undo-s。否则,只需记住最近执行的操作。

答案 2 :(得分:1)

1。)您应该在TextField上侦听Event.CHANGE事件,并在每次触发事件时创建历史记录步骤。历史步骤包含两个值的情况:旧的和新的。 Old是更改前TextField的值,new是更改后的值。

2。)您的历史记录是一系列操作,或者您可以使用Memento Pattern。我认为行动更容易使用。历史操作有两个方法,undo()和redo()。所以在undo()中你必须说textField.text = oldContent并在redo()方法中说textField.text = newContent。您的历史记录还需要指向当前操作的指针。

3.)为了让它更好一些。您不应该只监听Event.CHANGE,而是监听第一个CHANGE,然后监听该TextField的下一个FOCUS_OUT。在这种情况下,只有在我停止编辑TextField后才会创建历史记录步骤。但这取决于您的TextField以及您希望如何分发历史记录步骤。多行TextField不应仅在FOCUS_OUT上创建历史记录步骤:)