Programación Rtfw
Agregue una dosis de "medicina para el arrepentimiento" a su programa de edición de texto
Función de implementación del programa: use el control RichTextBox para proporcionar funciones de edición al usuario, agregando palabras como "deshacer" y " restaurar" Función.
'****************************************** *****************************
Este programa se basa en la lectura de Zhang Zhixin de Tianjin el 4 de abril de 2005 Mejorado sobre la base del artículo publicado en "Computer News".
Cuando aplique el código siguiente, asegúrese de mantener el contenido entre las líneas "*" sin cambios.
Hay dos mejoras principales:
1. Agrega una variable para controlar el número de veces recuperables, limitando así el uso ilimitado de la memoria para evitar el desbordamiento de la misma.
2. Corrija los errores del código original para evitar errores del usuario durante la recuperación.
El programa original del periódico se puede utilizar para la detección de errores ingresando continuamente 0123456789.
Descubrirás que la entrada es correcta cuando la deshaces, pero se producen errores cuando la restauras.
El contenido entre las líneas de puntos lo agregué recientemente yo. Después de agregar estos códigos, este programa será más completo.
Me gustaría agradecer al Sr. Zhang Zhixin.
El programa fuente modificado se puede descargar a través del siguiente enlace: /software/vbundo.rar.
gt gt gt Qingdao>; gt Xu>; gt gt2005.4.7
'********************* ************************************************** * *
Ejecute VB6 para crear un nuevo estándar. exe, haga clic en el menú "Proyecto/Componente", seleccione "Control de cuadro de texto enriquecido de Microsoft"
Marque "√" antes de "6.0", aparecerá un control "RichTextBox" en la caja de herramientas y en el formulario Cree un control "RichTextBox", asígnele el nombre "rtbText" y luego cree dos botones.
, llamados "cmdUndo" y "cmdRedo" respectivamente, simplemente ingrese los siguientes códigos en secuencia.
Este programa se ejecuta en el entorno de servidor VB6 WIN2000.
Opción explícita
Dimrtbundstack() como cadena "Deshacer pila."
DimrtbRedoStack() como cadena "Restaurar pila"
" Dim bChg As Boolean" registra si el contenido del cuadro de texto enriquecido ha cambiado.
-
Modifique el programa original y agregue una variable para controlar el número de veces recuperables, limitando así el uso ilimitado de la memoria y evitando el desbordamiento de la memoria.
Atenuar UndoNum siempre
-
Sub cmdUndo_Click()
Si UBound(rtbUndoStack)>Entonces 1
bChg = true
ReDim retiene rtbRedoStack(UBound(rtbRedoStack) 1) como cadena
rtbRedoStack(UBound(rtbRedoStack)) = texto rtb. TextoRTF
RTBTexto.
text rtf = rtbUndoStack(UBound(rtbUndoStack)-1)
ReDim retiene rtbUndoStack(UBound(rtbUndoStack)-1) como una cadena
Terminará si...
-
Agregue la función de juzgar y limitar el número de deshacer
Si UBound(rtbRedoStack)>entonces abandone
cmdUndo. Enable = False
MsgBox("Permitir solo deshacer"; UndoNum amp "Era")
Terminará si...
-
Conector final
Subform_Load() privado
ReDim conserva rtbUndoStack(1) como una cadena
ReDim conserva rtbRedoStack(1) como una cadena String p>
Rtbundostack (1) = rtbtext. "textrtf" inicializa el elemento de la pila de deshacer.
Rtbredostack (1) = rtbtext. La inicialización "textrtf" restaura los elementos de la pila.
bChg = false
-
Agrega algún código de inicialización.
"UndoNum = 3" limita el número de veces recuperables a 3.
cmdRehacer. habilitado = falso
cmdUndo. Habilitado=Falso
-
Conector final
Sub RTBText_Change()
Atenuar N mientras
Dim M As Long
Si bChg = False, determine si el contenido del cuadro de texto enriquecido se ha modificado por primera vez.
ReDim retiene rtbUndoStack(UBound(rtbUndoStack) 1) como una cadena
M = UBound(rtbUndoStack)
rtbUndoStack(M) = RTBText. TextRTF
redim preserve rtbredostack(1)as string 'Borrar el contenido de la pila de recuperación.
-
Uno de los dos principales defectos del programa original del periódico: si no hay límite, puede provocar un desbordamiento de la memoria.
If M gtUndoNum 1 Then 'Limita el número de veces que se puede restaurar.
Para N = 1 a M
rtbUndoStack(N-1) = rtbUndoStack(N)
El siguiente N
ReDim rtbUndoStack(M - 1) permanece como una cadena
Terminará si...
-
Otro
bChg = false
p>
Terminará si...
Determina y establece si el botón de restauración está disponible.
Si UBound(rtbUndoStack)>Entonces 1
cmdUndo. enable=True
Otro
cmdUndo. enable = false
Finalizar si...
Si UBound(rtbRedoStack)>entonces1
cmdRedo. enable=Verdadero
Otro
cmdRedo.
Enabled=false
Finalizar si 1
bChg = true
ReDim conserva rtbUndoStack(UBound(rtbUndoStack) 1) como cadena
rtbundostack (ubound(rtbundostack) = rtb text.' textrtf 'La posición original del programa en el periódico, elimínela y colóquela debajo
RTBText. text rtf = rtbRedoStack(UBound(rtbRedoStack))
ReDim rtbRedoStack(. UBound(rtbRedoStack)-1) se conserva como una cadena
El programa original en el periódico tiene dos defectos: si se coloca en la posición original, la recuperación fallar.
rtbUndoStack(UBound). (rtbUndoStack))= texto rtb
Terminará si...
-
Agregue la función de juzgar y limitar el número de rehaceres
si UBound(rtbRedoStack) lt;= 1 entonces
cmdRedo.enabled=false
lo hará finalizar si...
-
Conector final
-
Restaurar:
Función de declaración privada Enviar mensaje Lib "usuario 32" Alias "SendMessage a" (ByVal hwnd As Long, _
ByVal wMsg tiene la misma longitud, ByVal wParam tiene la misma longitud, lParam tiene la misma longitud
Const EM _ UNDO = ampHC7
Private Sub mnuundo_Click()
Dim UndoResult es largo
Deshacer resultado = SendMessage(cuadro de texto enriquecido 1. hwnd, EM_UNDO , 0, 0)
El valor de retorno de UndoResult = -1 indica que la deshacer no tuvo éxito
p>Conector final
Recortado
Private Sub mnucut_Click()
Borrar el contenido del portapapeles
Borrar portapapeles
Copia el texto marcado al portapapeles.
Portapapeles. Establecer texto RichTextBox1. SelText
Borrar texto de etiqueta
RichTextBox1. SelText = " "
Conector final
Copiar
Private Sub mnucopy_Click()
Borrar el contenido del portapapeles.
Portapapeles. borrar
Copia el texto marcado al portapapeles.
Portapapeles. Establecer texto RichTextBox1. SelText
Conector final
Persistencia
Private Sub mnupaste_Click()
Si hay un área marcada, copia el contenido del portapapeles al cursor Área marcada.
Si no hay ningún área marcada, inserte el contenido del portapapeles en la posición del cursor.
RichTextBox1. SelText = Portapapeles.
GetText
Conector final
Eliminar
Private Sub mnudelete_Click()
Borrar texto de etiqueta
RichTextBox1. SelText = " "
Conector final
Marcar todo
Sub privado mnuselall _ Click()
Marcar todas las palabras en el cuadro de texto
RichTextBox1. SelStart = 0
RichTextBox1. SelLength = Len(cuadro de texto enriquecido 1. Texto)
Conector final