Implementar la función "Deshacer" en una caja de texto


Cuando se modifica el contenido de una caja de texto, el sistema operativo Windows mantiene un buffer con los datos añadidos o borrados. Se puede utilizar la función de la API SendMessage para recuperar el texto modificado.

El mensaje EM_UNDO permite recuperar el texto modificado en una caja de texto. El mensaje EM_EMPTYUNDOBUFFER vacía el buffer de "Deshacer". El mensaje EM_CANUNDO devuelve True si hay texto en el buffer de "Deshacer". A continuación, se muestra un ejemplo:

1º Cree un nuevo proyecto en Visual Basic. Form1 es creado por defecto. 

2º Añada el siguiente código a la sección "Declaraciones" de Form1: 

Private Declare Function SendMessage Lib "User" (ByVal hWnd _
As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _
lParam As Long) As Long 
Const WM_USER = &H400
Const EM_CANUNDO = WM_USER + 22
Const EM_EMPTYUNDOBUFFER = WM_USER + 29
Const EM_UNDO = WM_USER + 23 

3º Añada una caja de texto a Form1. Text1 es creado por defecto.  Establezca su propiedad MultiLine a True. 

4º Añada un botón a Form1. Command1 es creado por defecto. Establezca su propiedad Caption a "Undo". 

5º Añada el siguiente código al evento Click de Command1: 

Private Sub Command1_Click()
Dim OK As Long
OK = SendMessage(Text1.hWnd, EM_UNDO, 0, 0&)
OK = SendMessage(Text1.hWnd, EM_EMPTYUNDOBUFFER, 0, 0&)
End Sub 

6º Añada un segundo botón a Form1. Command2 es creado por defecto. Establezca su propiedad Caption a "Redo". 

7º Añada el siguiente código al evento Click de Command2: 

Private Sub Command2_Click()
Dim OK As Long
OK = SendMessage(Text1.hWnd, EM_CANUNDO, 0, 0&)
If OK = 0 Then
MsgBox "No puedo deshacer los cambios", 16, "Error"
End If 
OK = SendMessage(Text1.hWnd, EM_UNDO, 0, 0&)
End Sub