撤销和重做
一般来说,编辑操作的软件都有撤销和重做的功能。
首先要明白,这究竟是怎样的一个功能。那word来说把,我们连续输入三个字,然后可以撤销3次,再可以重做3次,在未输入之前,是不能撤销和重做的。然后你输入了,这时可以撤销了,但仍然不能重做。也就是说,只有你撤销后才可以重做。但是不是你撤销多少次就可以重做多少次呢,这要看是不是紧接着做完撤销就重做。例如,当你撤销三个字之后,你紧接着输入一个字,此时并不能进行重做操作。不会因为你之前撤销过三次就可以重做三次,事实上,当你撤销三次后,确实可以重做三次,但一定是紧接着进行的,而且重做的次数是当前撤销的次数,和之前的撤销次数没有任何关系。在不考虑撤销次数限制的情况下,当前有多少文字就可以撤销多少次。重做和输入都可以增加撤销数,而只有撤销可以增加重做数。但输入时,重做数为0。
Ok,明白以上特点后,就可以来实现撤销和重做了。可以看到,后输入的将先撤销,后撤销的将先重做。数据结构就是栈。因此我们可以创建一个最多可以连续撤销100次的栈,名为record[100]。Top为栈顶指针。初始值为-1。接下来就是定义两个变量,分别为undoNum,redoNum。分别表示可撤销次数和重做次数。
接下来就是写三个重要的函数,分别为AddRecord(),Undo(),Redo();
当我们添加内容时,同时也向栈中添加,调用AddRecord函数,栈顶指针,undoNum都增加。
top = (top >= 99)? 0: ++top;
undoNum = (undoNum >=100) ? 100:++undoNum;
因为一旦有输入,就不可以重做了,因此, 我们可以在这里让redoNum = 0;
当undo时,栈顶指针下移,可撤销次数减少。同时重做次数增加。
Redo时,undoNum次数又增加,但有一点要注意,如果redoNum= 0写在了AddRecord()里,那么redo时不要调用该函数,否则你不管撤销多少次,你只能重做一次。
一个简单的撤销和重做就这样实现了。我现在也是一个初学编程的人。欢迎大家来交流。
我的blog:http://blog.csdn.net/booirror
我的邮箱:booirror@163.com