Este tutor es un ejemplo de cómo manejar eventos en los objetos visuales de nuestras aplicaciones. Podremos programar que se dispare un manejador de evento cuando en un objeto visual se dispare una señal determinada, por ejemplo, ejecutar una serie de instrucciones cuando un control concreto de un formulario pierda el foco.
Un manejador de evento es un contenedor de instrucciones, similar al proceso, pero que no tiene entidad por sí solo sino que depende de un objeto principal. Es decir, se trata de un subobjeto de un objeto de interfaz.
Para configurar qué señal disparará un evento usaremos otro subobjeto, llamado conexión de evento. En este se configura qué señal disparará un manejador de evento determinado. Una conexión de evento puede estar asociada al objeto de interfaz o a un subobjeto del mismo. Por ejemplo, podremos configurar una conexión de evento para que dispare un manejador de evento cuando se abra un formulario, o configurar una para que se dispare cuando gane el foco un control concreto del formulario.
Como decíamos más arriba, el manejador de evento es un subobjeto de un objeto de interfaz. Al tratarse de un subobjeto, éste tendrá acceso al resto de los subobjetos del objeto principal. Por ejemplo, si en un formulario declaramos una variable local, desde un manejador de evento podremos consultar su valor.
Para ampliar información sobre cómo se declarar un manejador de evento y otra información sobre el mismo hacer clic aquí.
En este tutor veremos distintas señales de ejemplo; no todas. Todos los eventos que se disparan generarán un mensaje que se mostrará en el formulario. Para ampliar información sobre cómo se declara una conexión de evento así com conocer todas las señales disponibles hacer clic aquí.
Todo se ha programado en el formulario TUT_EVE del proyecto de aplicación de vTutor. Que encontraremos dentro de la carpeta tutores/avanzados/eventos.
Como se observar, entre otros controles, contiene una rejilla, un control de edición, un botón y un control donde se muestran los mensajes que se vayan emitiendo desde los distintos manejadores de evento que se han programado.
A continuación iremos explicando cada uno de los manejadores y conexiones de evento programados.
Se trata de una señal que se dispara después de inicializarse el objeto. En este caso lo que haremos será disparar un manejador de evento tras haberse inicializado el formulario. Para ello hemos programado el manejador de evento siguiente, al que hemos llamado POS_INI:
Y hemos declarado la conexión de evento siguiente:
La propiedad control vacía indica que esta conexión de evento estará asociada al formulario directamente.
En la propiedad señal indicaremos qué señal debe disparar el evento. En este caso hemos seleccionado la señal post inicializado. Esta señal será disparada una vez se haya inicializado el objeto asociado (el formulario). Se disparará una única vez al abrirlo.
Se trata de una señal que se dispara cuando se muestra el objeto de interfaz o un control concreto del mismo. Si el objeto está en pantalla pero abrimos otro encima, al cerrar el nuevo objeto abierto y volver al anterior también se disparará el evento.
Para ello hemos programado el manejador al que hemos llamado ON_SHOW. Es idéntico al anterior, solamente cambia el texto que se añade a la variable que usamos para mostrar los mensajes.
Y hemos declarado la conexión de evento siguiente:
En la propiedad control hemos seleccionado el control que hará que se dispare la conexión de evento, en este caso la rejilla.
Y como señal hemos seleccionado el valor on show.
Hemos creado varios manejadores de evento de ganancia de foco, uno por cada control del formulario (rejilla, botón, control de edición y control de mensajes). Explicaremos solamente uno de ellos, pues todos se programan igual. Lo explicaremos con la rejilla. Se ha creado el manejador de evento llamado ON_FOCUS_REJ:
Como podemos observar el casi idéntico al anterior y solamente cambia el texto que se añade a la variable que usamos para mostrar los mensajes.
Y se ha creado la siguiente conexión de evento:
En la propiedad control hemos seleccionado el control que hará que se dispare la conexión de evento, en este caso la rejilla.
Y como señal hemos seleccionado el valor gana foco.
Se trata de ejecutar un manejador de evento cuando se dispare una acción. La acción debe ser disparada en el ámbito del objeto, es decir, un formulario solamente atrapará las señal si la acción es disparada desde el propio formulario; una rejilla solamente atrapará la señal cuando la acción es disparada, por ejemplo, desde la toolbar asociada a la misma.
En este caso hemos programado el manejador de evento llamado ACC_DIS, como en casos anteriores, simplemente concatena un texto a la variable local que se usa para mostrar los mensajes.
En este caso también es necesario crear una acción (que hemos llamado TUT_EVE_ACC). La acción debe tener asignado el valor disparar señal en la propiedad comando.
Y hemos creado la conexión de evento siguiente:
Como se puede observar, en la propiedad señal hemos establecido al valor acción disparada. Al hacerlo aparece una nueva propiedad llamada acción disparada en la que seleccionaremos la acción explicada anteriormente.
Por último, hemos añadido un botón al formulario que dispara la acción.
Se trata de una señal que se dispara cuando cambia el contenido de un control de edición del formulario. La señal solamente se dispara cuando el usuario final interactúa directamente con el control, no cuando modificamos el contenido del campo o variable editado por proceso o desde un manejador de evento.
Para ello hemos programado el manejador al que hemos llamado VAL_CHG_ED_TXT. Como en ejemplos anteriores, solamente cambia el texto que se añade a la variable que usamos para mostrar los mensajes.
Y hemos declarado la conexión de evento siguiente:
Como podemos observar, en la propiedad señal hemos seleccionado el valor value changed y la señal está asociada al control de edición de texto que está bajo la rejilla.
Tal y como está programado en este momento, la señal se dispararía por cada pulsación de teclado que el usuario. Si queremos que no se dispara por cada pulsación sino que espere unos milisegundos para dispararse, entonces debemos editar el control de edición asociado y activarle el estilo retardo señal valueChanged:
Se trata de un evento específico para objetos de lista, por ejemplo, para rejillas. Se trata de disparar un manejador de evento cada vez que cambie el ítem seleccionado en la rejilla. Para ello hemos programado el manejador de evento llamado CAM_SEL_REJ:
En el manejador evento nos posicionamos sobre la rejilla, leemos el registro seleccionado y modificamos la variable que usamos para los mensajes con los datos del mismo.