关于撤销、恢复的基本想法
涉及《数据结构》--创建堆栈记录步骤
我们知道,应用程序在每次操作后都改变着它的状态。由于程序本身一直被用户操作着,它的状态也在一直改变中。撤销操作就是回到上一个操作后的状态,因此,为了实现撤消操作,我们必须存储程序使用中的每一个状态。而恢复操作就是从之前一个状态切换至下一个状态。
为了实现撤销、恢复功能,我们需要为撤销功能存储上一个操作后的状态信息,还需要为恢复功能存储下一个操作后的状态信息,也就是我们必须维护应用程序的多个状态。为了在各种操作和各种实现中维护应用程序的状态,我们使用两个内存堆栈。一个存储撤销操作的状态,一个存储恢复操作的状态。撤消操作通过从撤销堆栈中弹出一个状态来回到前一个程序运行状态,同样,恢复操作通过从恢复堆栈中弹出一个状态来进入下一个程序运行状态。
现在我们了解到,为了实现撤销、恢复操作,关键问题就在于如何保持并维护应用程序运行中的各种状态。在这篇文章的方法中,每次单一的操作导致的变化被记录成为一个状态,这个状态变更保存在一个对象中,这个对象用来保存所有类型的操作中需要保存的数据,所以这个对象中的很多属性对于特定操作是冗余的。
VB模拟撤销代码(转载)
Dim back1$,back2$ '撤消使用的字符串记录
Dim backsw1 As Boolean,backsw2 As Boolean,backsw3 As Boolean '撤消使用过程中的开关
'sw1是用来判断是否更新原记录back1的
'sw2是用来抵制由于撤消操作引起的text改变而使back1重新赋值的
'sw3是专门判断按下backspace时是否需要更新back1,2的
Private Sub Form_Load()
back1 = Text1
back2 = Text1
backsw1 = True 'sw1是用来判断是否更新原记录back1的
backsw2 = True 'sw2是用来抵制由于撤消操作引起的text改变而使back1重新赋值的
backsw3 = True
end sub
Private Sub muback_Click()
'撤消
Dim backtem$
backtem = back1
back1 = back2
back2 = backtem
backsw2 = False 'sw2是用来抵制由于撤消操作引起的text改变而使back1重新赋值的
Text1 = back2
backsw2 = True
backsw1 = False 'sw1是用来判断是否更新原记录back1的
backsw3 = True 'sw3是专门判断按下backspace时是否需要更新back1,2的
End Sub
Private Sub text1_change()
'撤消所需的监视记事本的变动
If backsw2 = True Then
If backsw1 = False Then
back1 = back2
End If
back2 = Text1
backsw1 = True
End If
backsw0 = True
End Sub
Private Sub Text1_KeyDown(KeyCode As Integer,Shift As Integer)
'实现用backspace删除字符后能够撤消删除的字符
If KeyCode = 8 Then
backsw2 = True
If backsw3 = True Then
backsw1 = False
End If
backsw3 = False
End If
End Sub
待续……