Implementar la función "Deshacer" en una caja de texto
Publicado: 26 Jul 2009, 22:51
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:
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:
7º Añada el siguiente código al evento Click de Command2:
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