我需要创建一个撤消上一个任务/添加/更改的函数。我如何在 Borland C++ 中做到这一点?
(该程序使用“列表”将文本字符串存储在文本文件中。除非我使用我创建的保存功能,否则它会被存储然后擦除。)
顺便说一下,我的意思是在一个简单的控制台应用程序中创建一个撤消功能。
我需要创建一个撤消上一个任务/添加/更改的函数。我如何在 Borland C++ 中做到这一点?
(该程序使用“列表”将文本字符串存储在文本文件中。除非我使用我创建的保存功能,否则它会被存储然后擦除。)
顺便说一下,我的意思是在一个简单的控制台应用程序中创建一个撤消功能。
我再给出一个答案,但我认为到目前为止覆盖范围还不够。
这个主题远非微不足道,谷歌搜索它会返回大量结果。许多应用程序实现了“撤消”操作,并且有许多变体。
有两种设计模式可以帮助我们:
Command
: 这是一个动作的具体化Memento
:包括存储状态(通常意味着某种形式的序列化)该Command
模式在图形环境中被大量使用,因为通常有多种方式来完成一个动作。以 Microsoft Word 中的保存为例:
当然save可能是按照save as来实现的。
这里模式的优点Command
是双重的:
undo
操作现在,有各种问题适合undo
:
rm
在 Linux 上或在 Windows 上清空垃圾箱操作)因为有各种各样的问题,所以有各种各样的策略:
Memento
启动的地方)Memento
s 会占用空间,那么您可以使用一种方法,即每 10 或 20 个命令只记住一个快照,然后从最新快照重做命令直到撤消命令事实上,您可以随意混合Command
,Memento
这取决于您的系统的具体情况以及两者的复杂性。
我只会考虑撤消开始执行的最后一个动作(然后使用一堆动作)。撤消用户希望的任何操作的功能要复杂得多。
要实现撤消,您需要在应用程序中创建一个“动作堆栈”。但是,有两种基本方法:
了解您的基线(上次保存文件或创建文件以来),记住所做的每一个更改,以便在需要撤消某些操作时,您只需丢弃“最顶层”项目并重新生成当前从基线查看所有更改。单击“重做”,然后将该项目放回堆栈。这有一个附带好处,即能够在堆栈中的任何位置轻松删除项目,而不会弄乱其他撤消/重做选项,尽管需要特别注意确保“更高”状态的应用符合用户的预期。
对于每个操作,存储对先前状态所做的更改以及在您要撤消时恢复先前状态所需的更改。现在,当用户单击“撤消”时,只需执行“撤消”步骤。单击“重做”时,重新应用所做的更改。在某些情况下,“撤消”步骤将是“这就是以前的样子”,但是如果您希望允许用户删除不在堆栈顶部的项目然后需要删除上面的某些内容,这可能会造成严重破坏它。
正确的选择取决于很多因素,包括您可以/将携带多少数据。选项 #1 在某种意义上更容易,但如果操作堆栈很大,撤消任何操作可能会变得非常慢。
您应该查看Command Pattern。
另一个参考:使用命令模式实现撤消功能
另请参阅纪念品图案。有时,撤消操作的命令中必须包含的情报非常复杂。例如,在绘图程序中绘制对象。只存储一个备忘录然后从该备忘录恢复以实现撤消会更容易。
您可以存储状态快照。状态是动作可以修改的数据集。单击撤消时,当前状态将替换为先前状态。实际上,这不是一项微不足道的任务,尤其是在状态复杂的情况下。
我最近一直在尝试这个主题。如果您不需要二进制兼容性,请查看https://github.com/d-led/undoredo-cpp