Hola.
Me imagino que habrá muchos desarrolladores que pensarán que el sistema de gestión de las Vistas en Velneo es claramente insuficiente. Ha salido algún añadido, como el script que impide la apertura de la misma Vista varias veces, que por cierto podrían añadirlo también a vDevelop.
Os planteo una situación en la que el uso de Vistas es muy práctico y necesitamos un cierto control sobre las Vistas Abiertas.
Imaginaros una Vista principal con la Lista de Pedidos del cliente FRM_PEDIDOSLISTA. Este formulario se ejecuta en modo Vista una sola vez desde el menú de la Aplicación. Desde la rejilla de pedidos de FRM_PEDIDOSLISTA el usuario puede hacer doble-click para ir abriendo en modo Vista uno o varios pedidos FRM_PEDIDO. Esto le permite al usuario cambiar rápidamente entre los pedidos seleccionados.
El comportamiento que quiero arreglar es que cuando se cierra la Vista del Pedido FRM_PEDIDO se active automáticamente la Vista correspondiente a FRM_PEDIDOSLISTA. El comportamiento por defecto de Velneo es activar la Vista inmediatamente anterior y esto muchas veces produce confusión al usuario. Esto se complica si además tenemos otra Lista en pantalla, por ejem la Lista de Albaranes .
Si has abierto el Pedido desde la Rejilla de Pedidos, el usuario espera que al cerrar el Pedido se vuelva a la lista de Pedidos.
Mi solución a este problemilla es la siguiente (lo siento, pero hay que usar JavaScript):
Primero el código heredable.
Funcion: FUN_VISTA_GUARDAR()
Esta función nos devuelve el identificativo del formulario que ha llamado al formulario actual
Por ejemplo: FRM_PEDIDO es llamado por FRM_PEDIDOSLISTA
Rem ( Se llama desde el PRE-INIT de los formularios )
Rem ( Guarda en _CID_VISTA_ORIGEN el Identificativo de la Vista desde la que se abre el Formulario actual )
Rem ( Todos los formularios deberán tener una variable Local _CID_FORMULARIO que identifique el formulario )
Crear manejador de objeto ( hVista, Proceso PRO_VISTA_GUARDAR_JS@0PS__Sistema_app )
Disparar objeto ( hVista, 1º plano: Local (síncrono), )
Libre
Get variable local de objeto ( hVista, CID_VISTA_ACTIVA, CRESULTADO )
Set dato de retorno ( CRESULTADO )
Proceso JavaScript PRO_VISTA_GUARDAR_JS
// Llamado desde la función FUN_VISTA_GUARDAR
// Devolver el identificativo único de la Vista activa que está guardado en la variable local _CID_FORMULARIO
var cIDActiva = theMainWindow.currentView().root().varToString("_CID_FORMULARIO")
theRoot.setVar("CID_VISTA_ACTIVA",cIDActiva)
Proceso JavaScript PRO_VISTA_EVENTOCERRAR_JS
// Activa la Vista, si existe, con identificativo _CID_VISTA_ORIGEN
var cIDFormulario = theMainWindow.currentView().root().varToString("_CID_FORMULARIO")
var cIDActivar = theMainWindow.currentView().root().varToString("_CID_VISTA_ORIGEN")
if (cIDActivar) {
theMainWindow.showMessageStatusBar("Cerrando " + cIDFormulario,1000)
var oVista = null;
var numVistas = theMainWindow.viewsCount();
for (numVista = 0; numVista < numVistas; numVista++){
oVista = theMainWindow.getViewAt(numVista);
if (oVista.root().varToString("_CID_FORMULARIO") == cIDActivar){
theMainWindow.setCurrentView(oVista)
break
};
};
}
Ahora el código que debe ir en los formularios.
- Formularios principales (ejem. FRM_PEDIDOSLISTA, …)
Añadir variable local _CID_FORMULARIO
Manejador del evento pre-Inicializado en todos los formularios principales
Manejador de Evento: PRE_INI
Rem ( Identificamos el formulario para activarlo desde las Vistas que éste llama )
Set ( _CID_FORMULARIO, "FRM_" + timeToString(currentTime(), "HHmmsszzz") )
- Formularios secundarios (ejem. FRM_PEDIDO, …)
Añadir variable local _CID_FORMULARIO y _CID_VISTA_ORIGEN
Manejador del evento pre-Inicializado en los formularios llamados desde el formulario principal
Manejador de Evento: PRE_INI
Rem ( Identificamos el formulario para activarlo desde las Vistas que éste llama )
Set ( _CID_FORMULARIO, "FRM_" + timeToString(currentTime(), "HHmmsszzz") )
Rem ( Guarda el identificativo de la Vista actual para volver a ella cuando cerramos esta Vista )
Set ( _CID_VISTA_ORIGEN, fun:FUN_VISTA_GUARDAR@0PS__Sistema_app.app() )
Por último añadimos un manejador al evento Pre-Vista cerrada del marco Autoexec
Rem (Se va a cerrar una Vista. Recuerda que si devuelve 0 evitamos el cierre de la Vista (control de la X))
Ejecutar proceso ( PRO_VISTA_EVENTOCERRAR_JS@0PS__Sistema_app, 1º plano: Local (síncrono), LOK, , )
Los formularios modales NO disparan el evento Pre-Vista cerrada, por lo tanto no hay problema.
Esto funciona con varios niveles, por ejemplo desde FRM_PEDIDO1 podemos abrir la Ficha del cliente FRM_CLIENTE1 y al cerrar éste se activará la Vista con el pedido FRM_PEDIDO1.
Y esto es todo.
Probadlo y espero sea útil
Saludos
Paco Satué