Gestionar eventos entre formularios

Hola.

Ya sabemos que desde un formulario de Velneo no podemos ejecutar el Manejador de evento de otro formulario. Para conseguirlo tenemos que recurrir al API y usar un código parecido a este:

theMainWindow.currentView().centralWidget().control("SEP").form("ALIAS_PROYECO/IMP_DAT").control("BTN_RFE").click()

Esta forma de programar no es muy eficiente, ya que no es refactorizable y dejará de funcionar en cuanto cambiemos el identificador de algún control de los formularios.

Os propongo un nuevo diseño que facilite la ejecución de un Manejador de evento de un formulario cualquiera del proyecto de aplicación.

En la imagen siguiente muestro el esquema de funcionamiento.

  • El elemento principal es un DOCK del objeto AUTOEXEC, que contiene una Vista de datos con un Formulario FRM_TIMER_GLOBAL. Este formulario y su Variable local NACCION es accesible desde cualquier formulario de la aplicación y en cualquier momento.
  • Los formularios que queremos controlar (FRM_DESTINO_x) disponen de una Conexión de evento EVT_TIMER_GLOBAL a la señal Timer del formulario global FRM_TIMER_GLOBAL. Leyendo la variable NACCION del formulario global podemos decidir si ejecutamos el Manejador de evento del formulario de destino.
  • Un determinado formulario de origen FRM_ORIGEN fija el valor de la variable NACCION y dispara el Timer del formulario global. La señal Timer dispara los eventos EVT_TIMER_GLOBAL de todos los formularios abiertos en ese momento y se ejecutan solo los Manejadores de los formularios cuya variable local NACCION_MIA coincida con NACCION. Al mismo tiempo el Timer del formulario global se detiene para esperar la siguiente petición de otro formulario origen.

El DOCK puede estar oculto o usar uno que ya tengamos en uso en nuestra aplicación.

Probadlo y comentarme que os parece esta forma de incorporar una sencilla gestión de eventos entre los formularios de la aplicación.

Una pequeña aportación antes de que termine este dichoso 2020.

Saludos y feliz 2021.
Paco Satué

2 Me gusta

Gracias Paco! Feliz 2021 y adios a este maldito 2020

Gracias Paco. Muy life is soft. Lo he probado y va perfecto.

Feliz 2021

Un abrazo
Enrique Alcalá

Hola.

Muchas gracias a los que leéis el foro y sobre todo a los que perdéis un minuto en agradecer las aportaciones de conocimiento y experieciencias con Velneo.

Nos alegra el día y nos da motivos para seguir aportando.

Saludos
Paco Satué

Hola Paco,

Me ha ido muy bien este aporte, pues necesitaba ejecutar un manejador para el control de usuarios, y con tus comentarios y la idea que tenia se ha complementado perfectamente.

Saludos, y gracias.

Ramon Denuc
:+1:

Excelente aporte Paco,

Lo probé y funciona perfectamente.

Solo un inconveniente que veo es que funciona solo con el dock de un marco especifico, en mi caso en el ON_INIT_CLIENT dependiendo de ciertos parámetros se selecciona el marco, ya que tengo varios , por lo tanto no funciona el timer si no selecciono el marco que tiene el Dock . ¿Alguna idea de como solucionar esto?

Hola estisoft.

Dices:

Solo un inconveniente que veo es que funciona solo con el dock de un marco especifico …

En realidad no es un incoveniente, esa es la esencia de Velneo, en diseño debemos seleccionar el objeto sobre el que queremos trabajar, sin posibilidad de ejecución dinámica. Es una característica intrínseca del paradigma de programación con Velneo y debemos sufrirla para tener luego aplicaciones que nunca fallan.

Cuando Velneo añadió la posibilidad de seleccionar en tiempo de ejecución (proceso ON_INIT_CLIENT) el marco que se usará, se les olvidó implementar una forma “LifeIsSoft” de seleccionar ese Marco en vDevelop.

Por lo tanto, y como ya estamos acostumbrados en Velneo, tendrás que duplicar códigos y funcionalidades. Sin embargo, gracias al API podemos minimizar algo esta tarea.

Si tenemos 3 AUTOEXEC distintos en nuestra aplicación:

  • En los 3 Marcos creas el Dock DOCK_TIMER que apuntarán al mismo formulario DOCK_TIMER_GLOBAL.
  • El manejador de evento de FRM_ORIGEN no varía ya que theMainWindow siempre apunta al Marco activo.
  • Lo que sí habrá que hacer es crear 3 Conexiones de evento EVT_TIMER_GLOBAL, una por cada Marco.
  • El Manejador de evento TIMER_GLOBAL lo cambias a javascript para trabajar de forma dinámica con la instrucción theMainWindow.dockDataView(“DOCK_TIMER”) y leer la variable NACCION.

Y esto no ocurre solo en este caso, sino con cualquier funcionalidad que quieras repetir en los diferentes marcos de tu aplicación.

Saludos
Paco Satué

Buen día, excelente aporte, me ha servido bastante, sigan compartiendo informacion util!