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