Control de apertura de pestañas


([N4] Enrique) #1

Hola comunidad, no se si este tema se ha resuelto de alguna otra manera pero yo no encontré nada mas allá del ejemplo de javascript para el control de aperturas de pestañas. El cual, nobleza obliga, que esta muy bien pero como que le falta una “vuelta mas de tuerca” y ser mas Life is Soft.

Por eso me puse a darle vuelta al asunto (aclaro que es muy grande mi pelea con Javascript!!) y creo haber logrado una forma muy sencilla de controlar esto. Todo está resumido en el marco AUTOEXEC con la conexión de evento AL_AÑADIR_PESTAÑA y el manejador de evento CONTROLAR_PESTAÑAS.

En el adjunto (.vin) encontrán una solución donde esta documentado todo el proceso y que claro está, si algo está mal en ese script o en la forma en que se usa, pido a los mas avezados con Javascript me lo hagan saber para seguir aprendiendo.

Un gran saludo para todos desde Uruguay.

Enrique.

pestañas.vin_.zip (1.86 KB)


([N3] veldevelop) #2

Muchas Gracias por el aporte, como siempre Genial.


([N1] wikan) #3

Gracias Enrique,

el problema que le veo a tu solucion frente a la propuesta de Velneo, es que tu abres la vista nueva y cierras la anterior. Si la vista carga datos nuevamente, estaremos relentizando la interfaz.

Sin embargo, ambas soluciones son totalmente válidas, casi que depende del comportamiento que queramos.
Si en la 7.17, se introduce una señal Pre-Vista añadida, tu solución será igual que de la Velneo y para cambiar el comportamiento creo que solo habría que cambiar la señal usada.


([N3] pacosatu) #4

Hola Enrique.

Como dice Manuel estás abriendo la Vista (con toda la carga de los eventos pre-ini pos-ini y on-show) para luego cerrarla si ya está abierta. Desde el punto de vista de rendimiento esta solución no sería válida frente a la solución clásica.

Además hay otro tema. Existe un Bug que hace que el evento “Vista cerrada” dispare el manejador asociado al evento “Vista añadida” con lo que el código JavaScript se estaría ejecutamdo 2 veces, una al abrir la vista y otra al cerrar.
Este bug se se ha reportado a Soporte.
Estas señales no están documentadas en la 7.16 y veremos qué pasa en la 7.17.

Ante todo, muchas gracias por tu aporte y esfuerzo.
Saludos
Paco Satué


([N4] Enrique) #5

Hola gente, antes que nada muchas gracias por el feedback.

Manuel, Paco es muy verdad lo que apuntan en cuanto a rendimiento. Pero, a la falta de un sistema mas sencillo para controlar este tipo de cosas, penalizar en algo el rendimiento se puede por ahí “tolerar” frente a lo sencillo que resulta poner en un solo lugar este tipo de control.

Esta claro que si los formularios tienen mucha data a cargar con los eventos, se va a complicar, pero como reza un dicho muy común por estas tierras “es lo que hay!!”, al menos hasta que tengamos de serie algo mas “fluido” para controlar mejor estas cuestiones de interface.

Saludos!


([N4] Enrique) #6

Después de haber respondido, me puse a pensar que lo que necesitariamos de serie en la herramienta es que, por ejemplo, los formularios tengan en la propiedad Estilo, una opción que permita controlar por apertura duplicada o no. Eso seria genial, “tener de fábrica” esa característica, porque en realidad son cuestiones directamente relacionadas a los objetos que tenemos disponibles.

Pero bueno, como pasa en los autos, que tienen funciones y características de fábrica, también podemos hacerles un tunning para llevarlos mas allá de sus prestaciones originales o solventar algo que a nuestro entender falta. Por eso volví a “estacionar” este proyecto en el “garage” y le hice este “tunning”.

La diferencia es que se debe aplicar la lógica a cada objeto que querramos controlar, pero quedo “facilito” por cierto. Para que tengan una referencia rápida de lo que habría que incluir en cada formulario les agrego además un archivo pdf con las capturas de pantalla de los cambios que hice.

Saludos para todos!!

pestañas.pdf (204 KB)

pestañas.vin_1.zip (2.55 KB)


([N4] Enrique) #7

Hola gente,

por si a alguien le sirve, “una vuelta más de tuerca” a esta solución. Ahora es todavía mucho mas sencillo. Está todo explicado en el PDF adjunto.

Saludos!

Control-de-pestañas.pdf (475 KB)


([N2] ramiro) #8

Buenos dias:

Aprovechando el trabajo de Enrique, he realizado algunos retoques que expongo a continuación:

  • He dejado 2 manejadores de evento: Pre-Init y Win_Open (control de apertura del Formulario)
  • Añado revisar el #ID de registro, de tal forma que se admita el mismo formulario pero no el mismo #ID

Imagen 1 - Evento Pre-Init, en donde L_OPEN es la variable local que se modificada en el manejador Js
Imagen 2 - Evento JS lanzado en el Pre-Init y que comprueba 2 cosas:

  1. Si está abierta alguna vista cuyo idRef sea igual al Formulario X que se intenta abrir.
  2. En caso positivo revisa si el #ID del registro en esa Vista es igual al #ID del Formulario X

Si el punto 2 es positivo activa la vista ya abierta y cancela la apertura del nuevo formulario
En caso contrario no cancela nada y por consiguiente el Formulario se abre.

Gracias a Enrique por todo su esfuerzo anterior.

Saludos. Ramiro




([N3] pacosatu) #9

Hola Enrique, Ramiro.

Gracias por vuestra aportación.
Es cierto que Velneo debería de facilitarnos el acceso a las Vistas, arreglando los bugs de determinados eventos de Cierre y Apertura de Ventanas así como en facilitar su gestión con comandos nativos.

Permitidme una corrección a vuestro código pues de lo contrario creo que no funcionará.
El bucle For que recorre las Vistas abiertas debe comenzar con la línea
Win = theMainWindow.getViewAt(x)
para ir obteniendo en Win las sucesivas Vistas abiertas.

También tened en cuenta que en el evento Pre_Init todavía no está activa la Vista que estamos abriendo, por lo tanto no cuenta en theMainWindow.viewsCount()

Saludos
Paco Satue


([N2] ramiro) #10

Hola Paco:

Al margen de que pueda mejorarse, tal como se veía en la imagen funciona correctamente.

Yo también pensaba que theMainWindow.viewsCount() no incluiría la vista en curso de ser abierta, pero me ha parecido que la incluye. Lo de restar una unidad se debe a la observación, no ha sido un descuido (aunque también funcionaba sin la resta)

Respecto al uso de theMainWindow.getViewAt(x), seguramente es otra forma de hacerlo; en ese caso haría innecesario usar theMainWindow.nextView(), que es quien ahora se encarga de pasar de una vista a la siguiente.

Saludos. Ramiro


([N2] ramiro) #11

Buenas de nuevo:

He probado las modificaciones que sugerías y queda más conciso, así que me la quedo.
Curiosamente en esta nueva forma no va bien si se resta la unidad en …viewsCount()

Adjunto imagen de la versión ajustada

Saludos. Ramiro



([N3] pacosatu) #12

Hola Ramiro.

No había visto el nextView(), mis disculpas a ambos.
En cuanto al viewCount() inserta un Alert(theMainWindow.viewsCount()) antes del For y mira que valor devuelve.

Saludos
Paco Satué


([N2] ramiro) #13

¿Disculpas…?

La nueva versión es más clara y concisa que la anterior, así que por mi parte agradecido…

Saludos. Ramiro