Hola.
Desde la versión 29 disponemos del Estilo Vista única en el formulario que nos permite abrir solo una instancia del mismo. De forma nativa se comprueba si ya existe una pestaña abierta con el formulario sin origen o con la misma ficha que se va a editar.
Ahora se nos plantea el problema de regresar a la pestaña desde la que un determinado formulario ha sido llamado. Es el caso del formulario principal con la lista de maestros, desde el que ejecutamos el formulario de edición en modo Vista de los registros de la lista.
La siguiente imagen es una captura de la aplicación vERP. Queremos conseguir que el usuario regrese a la pestaña de Artículos cuando se cierra el formulario de edición del Artículo.
La idea que os planteo es guardar en el formulario hijo una referencia a la pestaña con el formulario padre. Esta referencia nos servirá para activar la pestaña padre desde el evento cerrar del formulario hijo.
El formulario padre se identifica con un Id único _CID_FORMULARIO para localizarlo en la lista de Vistas abiertas.
Rem (Evento PRE_INI del formulario padre)
Rem (Identificamos el formulario con un ID único)
Set ( _CID_FORMULARIO, "FRM_" + timeToString(currentTime(), "HHmmsszzz") )
En el evento PRE_INI del formulario hijo guardamos en _CID_VISTA_ORIGEN el ID del formulario padre.
Rem (Evento PRE_INI del formulario hijo)
Rem ( Guarda el identificativo de la Vista actual para volver a ella cuando cerramos esta Vista )
Set ( _CID_FORMULARIO, "FRM_" + timeToString(currentTime(), "HHmmsszzz") )
Set ( _CID_VISTA_ORIGEN, fun:FUN_VISTA_GUARDAR@proyecto.app() )
La función FUN_VISTA_GUARDAR devuelve el ID del formulario padre _CID_FORMULARIO y lo guarda en la variable _CID_VISTA_ORIGEN del formulario hijo.
// Función FUN_VISTA_GUARDAR
var oVistaActiva = theMainWindow.currentView()
var cIDActiva = ''
if (oVistaActiva) {
cIDActiva = oVistaActiva.root().varToString("_CID_FORMULARIO")
}
theRoot.setVar("CID_VISTA_ACTIVA",cIDActiva)
Ahora solo nos falta capturar el cierre del formulario desde el evento PRE-Vista cerrada del Marco AUTOEXEC .
// Se dispara en el Evento PRE-Vista cerrada del Marco AUTOEXEC
// Activa la Vista, si existe, con identificativo _CID_VISTA_ORIGEN
// El formulario que se está cerrando es cIDFormulario
var oVista = theMainWindow.currentView()
// Las Vistas genéricas (como el Visor HTML) no son Vistas de datos
if (oVista.type() > 0) {
var cIDFormulario = oVista.root().varToString("_CID_FORMULARIO")
// El formulario que queremos activar es cIDActivar
var cIDActivar = theMainWindow.currentView().root().varToString("_CID_VISTA_ORIGEN")
var numVistas = theMainWindow.viewsCount();
if (cIDActivar) {
theMainWindow.showMessageStatusBar("Cerrando - " + cIDFormulario,1000)
for (numVista = 0; numVista < numVistas; numVista++){
oVista = theMainWindow.getViewAt(numVista);
// Comprobamos si el formulario es el que queremos activar
// En la variable local _CID_FORMULARIO se guarda el ID del formulario
if (oVista.root().varToString("_CID_FORMULARIO") == cIDActivar){
theMainWindow.setCurrentView(oVista)
break
};
};
}
}
Usamos en este caso un poco de código javascript porque necesitamos el objeto theMainWindow para recorrer la lista de Vistas activas. Espero os sea de utilidad.
Saludos
Paco Satué