Tengo aquí una aplicación heredada que tiene unos pocos bucles "que requieren mucho tiempo" que se activan como resultado de varias interacciones del usuario. El código que consume tiempo actualiza periódicamente algo en la pantalla con información de progreso (generalmente una etiqueta) y luego, aparentemente persuade que la actualización visual ocurra allí y, a continuación, el código llama a Application.ProcessMessages (argh!).¿Obtener ventana para actualizar (etc) sin llamar a Application.ProcessMessages?
Todos sabemos ahora qué tipo de problemas puede presentar esto en una aplicación GUI (ser caritativa, era un momento más inocente en aquel entonces) y estamos seguros de que, de vez en cuando, conseguimos que los usuarios logren lo imposible con el programa porque están haciendo clic en los controles mientras el programa está "ocupado".
¿Cuál es la mejor manera de actualizar periódicamente las imágenes del formulario sin asumir otros eventos/mensajes, etc.?
Mis pensamientos fueron a cualquiera;
- desactivar todos los controles antes de hacer nada que consume tiempo, y dejando las llamadas'... ProcessMessages en el lugar para 'forzar' el refresco, o
- encontrar otra manera de refrescar periódicamente un control
Puedo hacer lo primero, pero me dejó pensando: ¿hay una mejor solución?
código de ejemplo de legacy;
i:=0; while FJobToBeDone do begin DoStepOfLoop; inc(i); if i mod 100 = 0 then begin UpdateLabelsEtc; Application.ProcessMessages; end; end;
Ya puedo escuchar todos los desmayos, en la parte posterior. :-)
el clavo mghie , ¡Gracias! Lo dejé caer en un par de lugares clave de muestra y le di una prueba rápida; las actualizaciones de la pantalla suceden bien, pero los controles no generan eventos 'nuevos' mientras el formulario está ocupado. Si combino esto junto con el bloqueo explícito del formulario cuando el trabajo comienza, tengo la esperanza de que esto evitará que los eventos deshonestos lleguen a su fin. ¡Muchas gracias! – robsoft