Pestañas, OnHide, no salir


([N4] victorgt) #1

Hola. Una de separadores de pestañas…

Tengo un separador de formularios. En el form 2º, al pasar al siguiente (o sea, al ocultarlo, señal OnHide) disparo un evento que controla ciertos errores (en concreto, que algunos campos no esten vacios). Si estan vacios, aviso con un mensaje…

Y ME GUSTARIA DEJAR LA MISMA PESTAÑA ACTIVA… pero ni pa tras…

He creado un evento en el subformulario llamado JS_ANTERIOR:
var miSep = theRoot.dataView().mainForm().control(“SEP_MAIN”);
miSep.setCurrentIndex(miSep.currentIndex-1);
theRoot.dataView().updateControls();
theApp.processEvents();

Y justo al final de mi evento OnHide (codigo Velneo), llamo a JS_ANTERIOR
si hay errores para “volver” al 2º form, pero no funciona.

Me hace una cosa bastante rara: pone la pestaña 2º como activa (blanca) pero
muestra el contenido del 3er form. O sea, no va…

Seguro que es facil y yo estoy muy torpe, pero no caigo…

¿Alguna forma de hacer esto? O similares…
Controlar que no cambie de pestaña si encontramos errores en el evento onHide.
Tambien me valdria una forma de establecer una pestaña por posicion (o por nombre),
pero debe funcionar en un evento disparado con OnHide.

Saludos y gracias.


([N1] wikan) #2

Buenas, ¿has probado con set retorno NO?


([N4] victorgt) #3

No, pero acabo de hacerlo. “Set retorno = NO” aparentemente no hace nada, me pasa a la tercera pestaña sin mas
(pestaña correcta y contenido correcto).

¿Alguna idea mas?

Saludos.


([N3] pacosatu) #4

Hola victorgt.

Por construcción, el evento ON_HIDE se produce después de haber ocultado el formulario y cuando ya hemos activado otro formulario del Separador. Tendría que existir un evento PRE_ON_HIDE para conseguir el efecto que quieres.

En estos casos yo recurro a la socorrida “chapucilla” de forzar un evento a nuestro gusto. Uso para ello el evento Timer del formulario principal.

Procede de la siguiente manera:

  • En el evento ON_HIDE del formulario de la pestaña llama al manejador JS_ANTERIOR tal como lo haces ahora
  • En el manejador javascript JS_ANTERIOR escribes una sola linea theRoot.dataView().mainForm().startTimer(100)
  • En el evento TIMER del formulario principal escribes
    Interfaz: Ejecutar manejador de evento(PARA_TIMER_JS) // ejecuta un theRoot.dataView().stopTimer()
    Interfaz: Activar subcontrol del contenedor de formularios(SEP_MAIN, <<pestaña>>)

LLega a verse el subformulario que has activado por un instante con un efecto visual algo desconcertante, pero se consigue el efecto deseado.

Pruébalo.
Saludos
Paco Satué


([N4] victorgt) #5

Gracias por las explicaciones, Paco. Clarificadoras y didacticas como siempre.

Respecto a tu solucion, bueno, en mi manual personal “Cosas que un programador no
debe hacer si no quiere meterse en lios”, el uso de Timers esta en 1ª posicion.

De todas formas, lo probare, el que tenga un pequeño defecto estetico no me preocupa,
es una situacion de error que se supone sera poco frecuente.

Ademas, por lo que entiendo, el Timer no lo usas como tal, sino para disparar una sola
ejecucion del evento. Lo usas como un atajo para disparar el evento del Timer del
formulario principal desde cualquier subformulario en cualquier momento.

Saludos y gracias.


([N3] josemp) #6

Hola seh,

Cuando dices que deberia existir un evento PRE_ON_HIDE, en realidad, ya existe y se llama ON_SHOW.
Lo que quiero decir, es que bastaria con guardar en ID del formulario o pestaña actual en el ON_SHOW, para luego poder recuperarlo en el ON_HIDE y saber a que pestaña debemos volver.
En realidad no lo he probado y no se si funcionará, pero prueba y nos informas y de paso, si victorgt nos documenta el resultado, te estaremos agradecidos.

saludos.


([N3] pacosatu) #7

Hola josemp.

El problema no es saber a qué pestaña (formulario) tenemos que volver, el problema es que desde el evento ON_HIDE no funciona el comando para activar la pestaña a la que queremos regresar ->> miSep.setCurrentIndex(miSep.currentIndex-1).

De todas formas, seguro que habrá otras formas de hacerlo.

Saludos.
Paco Satué


([N4] victorgt) #8

Hola. Sigo por aqui…

La solucion de Paco no he conseguido hacerla funcionar, seguramente porque tengo una “guarreria”
de eventos en ese formulario de campeonato. Parecia que tenia algun problema de estilo recursivo
y me hacia cosas realmente raras (saltarme de la 4 a la primera, pasando por la 3 y por la 2).
Talmente parecia que se me lanzaban eventos en cascada… Tampoco investigue mucho mas porque…

Hoy mismo he puesto una consulta a soporte sobre esto, que para eso esta.
No vaya a ser que sea mas facil de lo que pensamos (lease virgueria JS).

Saludos.


([N4] victorgt) #9

La solución de soporte es usar un objeto “pila de formularios”. En fin… lo de siempre…

Saludos.