Access - ACCESS VBA evitar parpadeo al actualizar un form con el Time

 
Vista:
sin imagen de perfil
Val: 23
Ha disminuido su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Juan Carlos (9 intervenciones) el 20/01/2020 14:48:57
Por código voy leyendo las piezas que se van fabricando y el resultado lo voy colocando en el campo correspondiente de la tabla. Los resultados de esta tabla los muestro en un subformulario continuo y sus txt recogen la información (origen de control) de la tabla que voy actualizando cada 30''. No logro actualizar los valores de los txt si no presiono F5 o utilizo el método requery o recalc, pero si uso estos métodos la pantalla parpadea y la propiedad Painting no evita este parpadeo. He probado con actualizar únicamente los txt afectados y tb escribir directamente en los txt, pero si no le doy a F5 no refresca el subform.

En esta pagina encontré esta función pero cuando llega el programa a “Me.Recalc” la pantalla se refresca y carga. Necesito evitar eso para que no sea incomodo al usar el formulario

1
2
3
Application.Echo False
Me.Recalc
Application.Echo True
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Anonimo (3316 intervenciones) el 20/01/2020 19:33:37
Si la pantalla parpadea al refrescarse …. seria interesante verificar si el contenido tiene espacio en el contenedor, esto es: que el subformulario pueda contener -sin constreñir- a los objetos, los parpadeos que se suelen apreciar es porque los 'objetos se empujan' dentro del espacio que los contiene, si no fuera así, el repintado de la pantalla no se apreciaría (aunque hay tarjetas graficas un tanto revoltosas).

Las opciones de refrescar contenidos en los formularios son (de menor consumidor de recursos a mayor consumidor)

REPAINT (---> Me.MiObjeto.Repaint)
.- actualiza la presentación, suele ser necesaria cuando el ordenador esta ocupado en procesos internos -como estar a la escucha de la recepción de un dato-, SOLO redibuja los objetos.

RECALC (---> Me.MiObjeto.Recalc)
.- hace lo mismo que el anterior, pero además recalcula los datos de los objetos que tengan cálculos (el clásico = Cantidad * precio)

REQUERY (---> Me.MiObjeto.Requery)
.- Hace lo anterior pero 'además' vuelve a cargar el origen de datos de los objetos implicados (un clásico es añadir externamente datos y necesitar visualizarlos en el formulario activo … equivale a cerrar y volver a abrir el formulario).

Ojo con el evento TIMER, suele interrumpir en los momentos inoportunos y …. si es posible, refrescar lo indispensable (no el 'refrescar por refrescar').
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 23
Ha disminuido su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Juan Carlos (9 intervenciones) el 20/01/2020 20:30:44
Muchas gracias Anonimo,

He borrado algunas labels para dejar más espacio en el contenedor y sigue parpadeando. He creado otro formulario con un subFormulario para hacer una simulación de tu respuesta. 1º) he agregado los mismos controles sin colorear y no parpadea pulsando "F5" o "F9". Si cambio el color de fondo de las celdas aunque sean colores oscuros o vivos no parpadea. Cuando aplico colores con formato condicional aunque se los aplique a pocas labels estas parpadean al actualizar. En el formulario que vengo trabajando tienen mas labels con formato condicional. El problema esta cuando repinta los formatos condicionales. Conoces alguna alternativa
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan
Val: 414
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Juan (150 intervenciones) el 20/01/2020 21:22:21
Hola,

- Cuanto más antiguo sea el el monitor, más notarás el parpadeo.
- Con el application.echo funciona lo del refresco, pero si tienes formatos condicionales es normal que lo haga.
- Has probado con me.refresh?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 23
Ha disminuido su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Juan Carlos (9 intervenciones) el 20/01/2020 21:50:36
Hola,

Si utilizo el método me.refresh, Requery o Recal, cuando termina de actualizar los campos la pantalla parpadea. Como podría desactivar el formato condicional y después volverlo a activar, esto evitaría el parpadeo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan
Val: 414
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Juan (150 intervenciones) el 20/01/2020 22:20:39
Elimina el timer y ponlo en el evento después de actualizar un campo, cuando introduces un dato, posiblemente el timer te afecta más al parpadeo, pero es una suposición.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 23
Ha disminuido su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Juan Carlos (9 intervenciones) el 21/01/2020 08:56:05
El Timer lo estoy usando para que me ejecute un procedimiento que cada minuto va leyendo las piezas fabricadas y después me las sitúa dentro de la taba. Aplicó el método Recal o Requery para que los Labels muestren el nuevo valor de piezas fabricadas. Si quito el Timer el programa dejaría de contar piezas de forma automática y debe hacerlo sin intervención del usuario. Estoy intentando desconectar el formato condicional mientras el código se ejecuta y después volverlo a conectar, para congelar la pantalla. Lo ves factible ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Juan
Val: 414
Bronce
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Juan (150 intervenciones) el 21/01/2020 09:01:50
Hola,

Si el formato condicional lo haces por VBA sí, lo puedes hacer cuando tú se lo indiques en el evento que quieras. Si lo haces por el Formato condicional del Formato de controles no.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Anonimo (3316 intervenciones) el 21/01/2020 09:35:03
El formato condicional se aplica (normalmente) en los subformularios continuos, por ser una de las pocas formas de crear la ilusión de que los registros están 'vivos' (activos) cuando solo existe uno.

Eliminar ese parpadeo es difícil por lo que supone (redibujar dos veces lo mismo, una para refrescar sin colorines y acto seguido aplicar la nueva 'mano de pintura') …. lo ideal es cambiar la estética y evitar los formularios continuos (simple ilusión óptica).

Se puede crear la ilusión de que hay un símil de formulario continuo (con objetos independientes) y aplicarles en tiempo de ejecución valores y colores, es donde es útil y se aprecia la acción Repaint.

Al aplicar 'a mano' los valores y colores, desaparece la necesidad del recalculo (ese 'automatismo' se hace en la cocina al aplicar los valores actualizados), tampoco se necesitaría la opción Requery, dado que se puede acceder a los datos de forma directa.

En fin, es mas trabajo a la hora de programar, pero bien planificado y resuelto es mas eficiente, rápido y transparente que la onerosa opción de formato condicional.

Por cierto, que se aprecie el repintado (al menos bajo mi punto de vista) no lo defino como parpadeo (personalmente el parpadeo lo considero 'un movimiento oscilatorio', por ello lo de evitar constreñir los objetos).

Un bucle bien diseñado que actúe sobre una serie de objetos de forma síncrona y eficiente resuelve el 'problema' de presentar un conjunto de datos organizados en filas y columnas

Permite incluso la excelencia de adaptarse de forma dinámica borrando/ocultando/refrescando los objetos en los dos sentidos (estéticos)
.- del primero al ultimo para presentar
.- del ultimo al primero para limpiar y nuevamente del primero al ultimo para refrescar (y sin efectos colaterales).

Requiere un tiempo de diseño y un poco mas de programación, pero (apreciado o no apreciado por ajenos) es un trabajo del que sentirse orgulloso (uno a cero contra la maquina)

Nota:
En muchos de los calendarios que se publican para mostrar días activos o vacaciones o …. se puede ver como se conjugan las columnas (semanas) en grupos (meses) presentando los días (filas) y no son formularios continuos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 23
Ha disminuido su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Juan Carlos (9 intervenciones) el 21/01/2020 20:25:57
Muchas gracias, me habéis aclarado muchísimo.

He eliminado todos los formatos condicionales de las etiquetas y quiero modificar el color de las etiquetas al cargar el formulario continuo para darle un color a cada etiqueta según la condición que cumplan. Cómo podría hacer que este procedimiento valorara la condición de cada linea y no solo valore la primera?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub PlanFormatoCondicional()
 
Dim Gris As Long, Verde As Long, Rosa As Long, Amarillo As Long, Azul As Long
Dim Ref As TextBox, Turno As TextBox
 
Set Ref = Form_PlanSemSub.Ref
Set Turno = Form_PlanSemSub.Ref
'Colores
Gris = RGB(205, 205, 255)
Verde = RGB(141, 195, 5)
Rosa = RGB(255, 153, 204)
Amarillo = RGB(255, 255, 102)
Azul = RGB(87, 143, 255)
 
'Pintamos el fondo de las etiquetas según condición que cumplan
If IsNull(Ref.Value) Then Ref.BackColor = Gris
If Turno.Value = "Tarde" Then Ref.BackColor = Rosa
If Turno.Value = "Noche" Then Ref.BackColor = Amarillo
If Turno.Value = "Mañana" Then Ref.BackColor = Azul
 
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Anonimo (3316 intervenciones) el 22/01/2020 15:10:07
Simple curiosidad (tras ojear el enlace y no encontrar una respuesta clara):

El método Paint permite diferentes formatos a la misma columna en diferentes filas 'en un formulario continuo'?

Porque cambiar una propiedad en un formulario que no sea continuo (y sin los limites que tiene el formato condicional) se puede hacer en el propio evento CURRENT y básicamente ya ha sido mencionado en este mismo hilo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 23
Ha disminuido su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Juan Carlos (9 intervenciones) el 22/01/2020 18:17:13
Tu respuesta ha sido la clave para encontrar la causa del parpadeo en la pantalla, diste una definición paso a paso del comportamiento de los formularios continuos y sobretodo como se redibujan los formatos condicionales. Estuve buscando días en internet esa información y gracias a ti pude comprender como estaban actuando los formatos condicionales. Valore la solución que me indicaste de realizar por código de forma dinámica los labels y pasarles los valores y el color de los campos. Pero como este formulario llevo trabajando en el tanto tiempo y no tengo mucha fluidez en crear objetos y darles una ubicación en dentro del sub formulario, no quise optar por ahí. Sino si la habría explorado para ver el comportamiento de los campos a la hora de refrescar. Pero me encantaría poder tener mas información respecto a esta otra vía porque es muy útil crear de forma dinámica objetos y así mostrar los objetos que se necesitan sin depender de las herramientas predeterminadas que ofrece Access.

Muchas gracias Anonimo por tu ayuda y a Juan también que también me ayudo en esta pregunta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Anonimo (3316 intervenciones) el 23/01/2020 23:00:50
Si alguna vez has jugado al clásico juego de barcos (A1 = agua, A5 = agua, B3= hundido ….)

Solo has de recrear un entorno afín, en el que dos bucles (uno externo que cambia las letras y otro interno que avanza los números) te permiten el absoluto control del espacio a controlar y lo atrás y adelante es …
1
2
For AAA = 1 To 5 '(adelante)
For AAA = 5 To 1 Step -1 '(atrás)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 23
Ha disminuido su posición en 2 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Juan Carlos (9 intervenciones) el 27/01/2020 17:54:37
Hola Anonimo,

Dar colores a los campos desde programación según el criterio que se defina desde el evento repintar es un opción para los formularios principales, pero para los subformularios continuos no tiene el efecto deseado de disimular el parpadeo e incluso es peor solución que aplicar un formato condicional con el asistente de Access. Por ello creo que tu argumentación tiene mucho sentido.

Adjunto tu parte de tu comentario inicial:

Si la pantalla parpadea al refrescarse …. seria interesante verificar si el contenido tiene espacio en el contenedor, esto es: que el subformulario pueda contener -sin constreñir- a los objetos, los parpadeos que se suelen apreciar es porque los 'objetos se empujan' dentro del espacio que los contiene, si no fuera así, el repintado de la pantalla no se apreciaría (aunque hay tarjetas graficas un tanto revoltosas).

Sobre hacerlo con arrays es tentador, pero tendría que dedicarle bastante tiempo para darle el aspecto que necesito y ahora mismo no dispongo de tanto tiempo. Pero es muy interesante y una herramienta básica para un programador.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Anonimo (3316 intervenciones) el 28/01/2020 10:07:57
Siento que la falta de tiempo te impida experimentar con el método que he propuesto, al respecto del apunte que haces sobre mi comentario:

He vuelto a releer el hilo desde su inicio y 'antes' de mi respuesta no era publico que se estaba utilizando como opción 'estética' el formato condicional, tras publicarlo (y por mi parte dar indicaciones de como funcionaba a nivel interno) lograste encontrar la causa y aplicar un remedio, posiblemente si por mi parte hubiese deducido que se estaba utilizando esa opción (me despisto lo repaint, recalc …) o si ese dato figurase en la exposición original, antes hubiéramos llegado al mismo final.

MI posterior solicitud de aclaración era porque 'nadie lo sabe todo' y si alguien había encontrado una solución a ese problema en/con los formularios continuos, me gustaría conocerla para poder -en circunstancias similares- publicarla haciendo referencia al articulo del autor original.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

ACCESS VBA evitar parpadeo al actualizar un form con el Time

Publicado por Carlos Rosado (3 intervenciones) el 28/04/2021 16:11:01
Hola, para evitar el parpadeo dejo una API. Es muy sencillo:

En un modulo colocas:

1
Public Declare PtrSafe Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long

Tienes que crear un ListView dentro del fomulario que no quieres que parpadee, este ListView únicamente lo usaremos para ejecutar la API, es decir lo ocultaremos o lo haremos invisible.

Dentro del formulario y en el evento donde cargas la información colocamos:

1
2
LockWindowUpdate ListView1.hwnd
Screen.MousePointer = 0

Después colocas tu código del Time usando Reqery o Recalc.

Y al final de tu código colocamos:

1
LockWindowUpdate 0

Con esto estaremos evitando el parpadeo del formulario cada que se cargue la información con el Time.

Código Completo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
'API colocada dentro de un modulo
Public Declare PtrSafe Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
 
'Codigo dentro del formulario
Private Sub Form_Timer()
'Desactivamos parpadeo
Application.Echo False
LockWindowUpdate ListView1.hwnd
Screen.MousePointer = 0
'Mi codigo
If TabCtl67.Value = 0 Then
    Call ListDB
Else
    Exit Sub
End If
'Activamos parpadeo
LockWindowUpdate 0
Application.Echo True
End Sub

Espero con esta solución poder ayudar en futuras ocasiones.

Cualquier duda por aquí ando
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar