Propagación de eventos

Imagino que esto se puede hacer en Xojo, pero estoy buscando en la documentación y no consigo encontrar la respuesta:

Tengo una ventana. Uno de sus controles es un Container. Dentro del container tengo dos botones, por ejemplo “Start” y “Stop”.

Bien, lo que quiero hacer es que cuando el usuario pulse el botón Start, por ejemplo, se genere un evento tipo “botón start pulsado” (btnStartClicked), de manera que el evento se propage del botón al container y del container a la ventana, y finalmente sea en la ventana donde “capturo” este evento y reacciono en consecuencia, por ejemplo mostrando un mensaje de un TextArea.

Como he dicho al principio, estoy seguro de que esto se puede hacer en Xojo, pero no consigo encontrar la técnica en la documentación. Agradecería cualquier ayuda.

Un saludo.
Óscar.

Hola @Óscar_Jesús_López_Sierra

Te dejo el enlace a un proyecto que he hecho en un “pispás” y que aplica una de las posibles técnicas.

Hace uso de una interfaz de clase (ButtonPropagator) en la que definimos un método que recibe un PushButton como parámetro. Puedes mejorarlo para que también reciba un enumerador o cualquier otro tipo de dato que consideres más útil.

ButtonProp

Luego en la ventana implementamos dicha interfaz de clase… y así el evento Action de cada uno de los PushButton sólo tienen que comprobar si la ventana real en la cual están contenidos “es una” clase ButtonPropagator. Si es así, hacemos un cast de la ventana a dicha clase e invocamos el método pasando el objeto (el botón en cuestión) como parámetro.

https://www.dropbox.com/s/mouxi2q4ifc5h2q/ButtonPropagator.xojo_binary_project?dl=1

1 Like

Gracias por la solución, Javier. Lo cierto es tu solución propuesta me sirve para lo que necesito.

Tu ejemplo me ha servido también para aprender la propiedad TrueWindow, muy útil para conocer la ventana principal de cualquier control.

El estudio de las interfaces me ha permitido ver que ya había definida una interfaz parecida a la que has escrito: ActionNotificationReceiver, que trabaja en colaboración con ActionSource, pero a diferencia de la tuya esta no me sirve porque al no recibir el botón como parámetro no se puede distinguir la identidad de la fuente del evento.

Tu solución, como dije, me sirve. Si veo que necesito más complejidad, entonces ya me meteré a implementar el patrón Observer.

La pregunta inicial era sobre todo para saber si Xojo implementaba por defecto la propagación de eventos a través de los contenedores, algo parecido a lo que hace por ejemplo LiveCode, donde pinchando un botón se genera un evento, pero si este evento no lo capturas con el propio botón se va propagando hacia arriba en la jerarquía de contenedores, de forma que lo puedes capturar donde más te convenga.

Un saludo.
Óscar.

1 Like

En realidad es más fácil agregar un evento en el container. Asi como se agrega una propiedad, agregas un “Event Definition”, en el evento del boton solo llamas el nuevo evento.

RaiseEvent NombreDelEvento

Y eso es todo, en la ventana, ahora el container mostrara el nuevo evento en la lista de agregar evento.

1 Like

Gracias, Iván. No conocía esa técnica. Voy a documentarme más sobre ella.

Aquí puedes ver un vídeo donde se explica eso :+1:

1 Like
Forum for Xojo Programming Language and IDE. Copyright © 2021 Xojo, Inc.