Página 1 de 1

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

Publicado: 26 Jul 2009, 22:51
por nahuel
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

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

Publicado: 27 Jul 2009, 02:36
por linkgl
no lo sabia, crei que eso se aplicaba solo voy a intentarlo