sábado, 30 de julio de 2011

10. Utextbox: deshacer y rehacer

Este código creado inicialmente por angelnu, y mejorado por fabianfv en el hilo del foro gambas-es.org (http://www.gambas-es.org/viewtopic.php?f=4&t=1031&postdays=0&postorder=asc&start=0), nos describe como crear un control textbox añadiendole la propiedad de deshacer y rehacer. A destacar que crea sus propios eventos con su propio observador de eventos y con varios niveles de undo.
Según la documentación:
hObserver = NEW Observer ( Object AS Object [ , After AS Boolean ] )
Crea un nuevo observador en el objeto especificado.
Si el valor de After se establece en TRUE, entonces el observador capturará los eventos después de que hayan sido procesados. En ese caso, no podrá cancelarlos.
A continuación el código:
EXPORT
INHERITS TextBox
'Para que el control se dibuje como un TextBox
PUBLIC CONST _DrawWith AS String = "TextBox"
PRIVATE MiTexto AS String[] 'almacena el texto
PRIVATE indice AS Integer ' numero de elementos del array
PRIVATE DondeEstoy AS Integer ' posicion dentro del array
PRIVATE $hObserver AS Observer ' interceptar el evento change del textbox
PRIVATE BolDeshago AS Boolean ' bandera para no disparar el evento change cada vez que deshacemos o rehacemos

PUBLIC SUB _new()
MiTexto = NEW String[]
MiTexto.Add(SUPER.Text, 0)
$hObserver = NEW Observer(ME) AS "TextBox"
END

PUBLIC SUB TextBox_Change()
IF BolDeshago THEN
STOP EVENT
ELSE
indice += 1
MiTexto.Add(SUPER.Text, indice)
DondeEstoy = indice
ENDIF
END

PUBLIC SUB Deshacer()
IF indice > 0 AND DondeEstoy > 0 THEN
BolDeshago = TRUE
DondeEstoy -= 1
SUPER.Text = MiTexto[DondeEstoy]
BolDeshago = FALSE
ENDIF
END

PUBLIC SUB Rehacer()
IF indice > 0 AND DondeEstoy < indice THEN
BolDeshago = TRUE
DondeEstoy += 1
SUPER.Text = MiTexto[DondeEstoy]
BolDeshago = FALSE
ENDIF
END

PUBLIC SUB Limpiar_Deshacer()
MiTexto.Clear
MiTexto.Add("", 0) 'Añadimos un elemento vacio
indice = 0
BolDeshago = FALSE
DondeEstoy = 0
END


Bien, una vez hecho todo esto, para crear el control haríamos como los casos anteriores (no los voy a explicar ya que están dicho en las paginas 18 y 19 )

Ahora vamos a probarlo en un programa. Creamos un programa llamado “pruebautextbox”, añadimos el componente que hemos diseñado “utextbox” y en el formulario, añadimos 2 botones (hacer y deshacer) y un utextbox, que quede así:


Luego en el código ponemos:

PUBLIC SUB Buttonrehacer_Click()
utextbox1.Rehacer()
END

PUBLIC SUB Buttondeshacer_Click()
utextbox1.Deshacer()
END

Le damos a ejecutar, metemos varios caracteres (incluso podemos borrar) y pulsando el boton deshacer y rehacer vemos como se van realizado los cambios.

No hay comentarios:

Publicar un comentario