¿Como refrescar la fecha y hora en un formulario sin los efectos “colaterales” de un timer?
Y cuando digo efectos “colaterales” me refiero a que necesito que se ejecute el timer cada segundo, sin embargo cada que se refresca, si estoy editando algún campo se me borra y como si acabara de ganar el foco.
Creo que ese efecto colateral no tiene nada que ver con el TIMER. Seguramente tienes el campo de edición sin vincular a Variable o Campo (propiedad Contenido vacía).
Esto provoca su vaciado cada vez que se refresca el formulario, cosa que ocurre en el evento Timer entre otros.
Amplio la información:
Me pasa al mostrar el contenido de una variable. Al tratar de bajar con la scroll bar, siempre me manda arriba.
Una vez que edito el campo, ese efecto desaparece, y deja de “reinicializarse”.
Saludos.
No es eso, los campos de edición están correctamente vinculados.
Si estoy escribiendo en un momento dado dentro de un campo o buscando algún valor (con propiedad autocompletado), el comportamiento es que o me borra todo el contenido al activarse el timer, o me regresa al contenido anterior, y, en muy contadas ocasiones me permite (si lo hago con la suficiente rapidez entre cada ciclo del timer) que quede el valor que yo deseo.
Dado que no me es posible aplicar el timer solo a un control específico del formulario pues haber si por ahí alguien tiene algún método que pudiera compartir.
Saludos.
Martin Ibarra.
P.D. Intenté meter el control que se refresca en otro formulario, luego visualizar dicho formulario en el principal mediante una vista de datos (son dos objetos distintos, uno embebido en el principal), pero el efecto es el mismo.
Entonces solo falla en los campos vinculados a Maestro y será porque interfiere con el evento Value Changed.
¿Esto es un bug de ahora a ha existido siempre?
Mmmmmmm, en mi experiencia siempre he tenido ese tipo de problemas al utilizar un timer (Creo que desde V6) en un formulario con el objetivo de estar refrescando horas, minutos y segundos.
No había caido en cuenta que con campos no enlazados a maestros no sucede eso, pero si en los enlazados.
Sinceramente creo es un punto de mejora, a menos que se pueda hacer con vJavaScript, cosa que no he revisado ni probado.
Esperemos opiniones de otros colegas que nos pudieran dar más luz al respecto, o puede que solo me suceda a mi por que omito “algo” que no tengo NPI de qué pueda ser.
De momento me sirve usar el visor HTML y el código javascript para resolverlo.
Este fallo ocurre solo con Activar el Timer en el formulario, no es necesario que tengas que refrescar nada. Afecta claramente a la búsqueda en los controles vinculados a Maestro.
En mi caso, necesito el Timer para muchas cosas, no solo para mostrar la hora.
Ya lo he comunicado a soporte, a ver que me contestan.
Bueno, en soporte me han confirmado que el efecto colateral es debido efectivamente al refresco que realiza el Timer, en este caso cada segundo.
Entonces, lo de la HORA podemos solucionarlo de la siguiente forma:
Añadimos un objeto Variable Global THORA en memoria
Añadimos un Dock al Autoexec con el Timer activado y refrescando la variable THORA cada segundo. Podemos incluso tener oculto este Dock.
Ya podemos añadir un Texto Estático a cualquier formulario con el contenido de THORA y teóricamente sin el problema colateral en los controles Maestros.
Olvidaros del ejemplo anterior.
El efecto colateral sigue existiendo aun cuando el Timer esté en otro formulario y el intérvalo sea largo (10 segundos).
Cada vez que se ejecuta el evento Timer y éste refresca la variable Global, se produce a su vez el refresco del formulario activo y como consecuencia algunos controles tiene un comportamiento extraño.
Para mostrar mensajes durante unos segundos no hay problema.
Te montas una función de Velneo que haga uso de las funciones del API VAbstractDataView.startTimer(msec) para mostrarlo y VAbstractDataView.stopTimer() para ocultarlo.
Aún a riesgo de ser un poco pesado, pongo la siguiente nota publicada por Rafael Cueto (https://velneo.zendesk.com/entries/20249068-%C3%81mbito-de-las-variables) que aclara totalmente el efecto colateral en algunos controles cuando actualizamos variables glabales, por ejemplo desde un Timer.
Dado el carácter de globalidad de este tipo de variables, debemos tener en cuenta que cada vez que modifiquemos su valor se sincronizarán las propiedades fórmula de los elementos que intervengan en la aplicación. Por ejemplo, si en un proceso ejecutado en primer plano modificamos el valor de una variable global, se sincronizarán todas las propiedades que sean fórmula en todos los elementos de interfaz activos.
Vaya tela, ¡¡ y solo queríamos mostrar la hora en un formulario !!
Pues tambien si lo hago con variables locales me la aplica igual, o sea, no habrá manera de un timer “local”, jajajajaja, vamos, “focalizar” el efecto del timer o tener más control sobre él, digamos pudiendo ver la señal timer y aplicarla a un control específico del formulario.
Por otra parte no sabía que los enlaces a maestros fuerán considerados fórmula, toda vez que tengo un ID en la tabla, y como tal no lo calcúlo en ningún momento, bueno así lo veo yo.
Habrá que trabajar por parte de nuestros amigos de Velneo en pulir y mucho el timer, porque si te platicara lo que pienso hacer con él (con el timer), vamos, si funcionara mejor podríamos hacer muchas cosas interesantes.
El punto aquí es, que refresques lo que refresques, sean campos, rejillas, variables, etc. hay efectos indeseados porque el timer “jode” a todos los controles de tipo fórmula de una interfaz activa, valiendole sorbete si “value changed” o no, “chanclas diabólicas”, nunca espere que los efectos de la globalización “política” aplicaran igual a la globalización o efecto global de las variables globales y sus primos, los controles tipo fórmula que yo no sabía que lo eran o así se consideraban.
Bueno, después de esta buena cantinfleada a seguirle dando que hay que comer.
Saludos.
Martín Ibarra.
Paco, gracias por tu valioso tiempo en investigar y probar al respecto.