如何实现操作的撤消功能 ( 积分: 100 )

  • 主题发起人 主题发起人 wskanss
  • 开始时间 开始时间
W

wskanss

Unregistered / Unconfirmed
GUEST, unregistred user!
如何实现撤消功能,像word中编辑下的撤消一样,可以实现十来步以内操作的撤消。。。
大家给个思路也好,有实际的代码那就更好了,感激不尽。。。。。。
 
先建立一个堆栈,然后纪录下每一步的操作,将操作的各项信息保存到这个堆栈中,撤销时,从堆栈中读出相关信息,然后进行还原就好了。每撤销一步,就删除堆栈中一个纪录。
本人曾经做过一个数据库的程序,删除纪录时都纪录了删除的信息,为了避免误删的情况出现,所以就按照上面的方法做了一个撤销删除纪录的功能。
 
数据库可以用事务来处理,误删就回滚。
 
一般的单次操作的话只需要一个变量来记录上次的值,在change事件里如果操作了你定义的键就把值还原就OK.如果是多步操作的话可以在数据库里弄个索引表,具体操作类似单步操作.但会麻烦的多.
 
现在开发的不是一个信息管理系统,而是就像windows下的画图
类似的软件,如何撤消操作了,
 
那样的话,你的软件应该有一套指令系统吧,基于文本形式的,类似DOS命令
配合楼上说的,用栈实现就行
 
买本 《设计模式:可复用面向对象软件的基础》看看
 
如果你是画图的,让我想想你是怎么画图的。我想,你每进行一次画图操作,应该是执行一个画图的指令,而执行这个指令,应该就是执行一个过程或是一个函数吧。
比如,你画一条直线,调用画直线指令Line(Point1,Point2,Color),Point1,Point2表示直线的起点和终点,Color表示线条颜色。当然应该还有很多其他参数吧,比如线宽等等,这里就不啰嗦了。
那么你每执行一条指令,就在你的撤销指令堆栈中增加一条纪录,纪录下操作的指令以及其参数。
要撤销时,你再调用这个指令,比如说上面的这个画直线的指令,只是将颜色这个参数换成你的背景色,是不是就相当于就擦除了原来画的那条线了呢。也就相当于撤销操作了。
当然这只是一种变通的方法,提供一种思路。
希望你能实现你想要的功能。
 
我也想了解下,我只想说,怎么才算“一次操作”,就类似于Delphi的撤销,似乎只要光标没有移动,所做的书写都属于“一次操作”
 
谢谢各位的解答,我觉得这个问题可能还得具体问题具体分析吧
总的思路应该还是用个堆栈记录每步的操作,撤消做逆向工作吧,
一次操作应该就是执行一个过程.不包括自定义的过程吧
实际问题比较复杂,因为有些过程中执行时根据不同的运行结果执行不同的操作.
各类操作都有,也不只是单纯的画图,也有数据库方面,
可惜我只有100分,不好意思 呵呵
 
所有的操作都建立一个反向的撤销操作,比如输入文字“abc”,那么输入文字的反操作就是删除文字,到底怎么才算“一次操作”那就看你怎么定义了
 
后退
顶部