Eventos de teclado en Xojo

Ayer recibí una amable consulta por parte de un usuario de Xojo, quería saber de qué modo se puede actualizar el texto de un control Label a partir del introducido en un TextField sin que debamos de ayudarnos de un botón para ello.

¡Fácil! Pocos segundos después de leer el mensaje de correo electrónico ya envié la primera solución; y posteriormente una segunda en la que se contemplaba la detección de la tecla de borrado sobre el TextField, e incluso una tercera donde también contemplé el hecho de que se utilizase la tecla de borrado cuando el texto original (en el TextField) contaba con parte de su contenido seleccionado.

Es una de las cosas que me encanta de Xojo, la capacidad de llevar a la práctica una idea en cuestión de pocos segundos. Sölo es cuestión de abrir el IDE, crear un nuevo proyecto y escribir el código que se encarga de realizar aquello que hemos imaginado previamente.

He de reconocer que no siempre es así. Este es un caso sencillo y, aún así, quedan casos sin contemplar… pero se aprecia a simple vista que es una cuestión de continuar añadiendo código o, mejor aún, llegado el momento en que empiezan a complicarse las cosas, sentarse y pensar en la arquitectura del asunto desde una perspectiva OOP (Programación Orientada a Objetos), antes de terminar con código espagueti que, además, no podremos reutilizar como componente independiente en otros proyectos.

¡Son los eventos!

Como digo siempre que tengo ocasión (y si no, la busco), otra de las cosas que más me gusta de Xojo es que no sólo utiliza un potente lenguaje de programación orientado a objetos, sino que también se trata de ¡programación orientada a eventos!

Es decir, sobre los controles de interfaz gráfica —controles UI— tenemos la capacidad de implementar aquellos eventos que se dispararán como resultado de una interacción por parte del usuario; simplificando de este modo enormemente nuestra capacidad a la hora de definir un comportamiento determinado.

Por ejemplo, en el caso de un TextField (aunque no sólo exclusivo a este control), podemos añadir un evento cuyo código se ejecute en respuesta a la pulsación de una tecla por parte del usuario, cuando deje de pulsarla o bien cuando abandone el control pasando a otro elemento (es decir, cuando el control pierde el foco).

Y esto nos lleva a la solución rápida, fácil (e incompleta) que supone uno de los resultados posibles sobre la consulta recibida.

La solución

Una vez añadidos los controles TextField y Label a la ventana por omisión (Window1) de un nuevo proyecto, todo lo que queda es seleccionar en el panel de la izquierda el control TextField, acceder al Menú contextual > Add to TextField1  y elegir la entrada Event Handler (Manejador de Evento).

Luego, en el panel resultante, solo tendremos que seleccionar el evento KeyDown y confirmar. Esta acción nos llevará directamente al Editor de Código en el IDE correspondiente al evento recién añadido.

Y ya por último, sólo nos restará añadir el código que se ejecutará en respuesta a dicho evento:

if asc(key) = 8 then
if me.SelLength > 0 then
dim texto as string = me.text.Left(me.SelStart) + me.Text.mid(me.SelStart + me.SelLength + 1)
Label1.Text = texto
else
Label1.Text = Label1.Text.Left(Label1.Text.len-1)
end
else
Label1.Text = Label1.Text + key
end
 return false

 

Y aquí puedes ver un pequeño vídeo de ejemplo sobre el resultado que se obtiene. Como decía, no se trata de una solución óptima que contemple todos los posibles casos… ¡acabaría siendo un editor de textos! Ahora bien, da una idea sobre la escasa cantidad de código necesario para que logremos hacer ciertas cosas en nuestros programas Xojo 😉

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *