PDA

Ver la Versión Completa : No me dibuja en un label en el tiempo correcto


noob
11-02-2009, 22:09:24
Hola, tengo este código y quiero que Label1 actualice su Caption con el mensaje 'Procesando' y cuando acabe tres segundos después, que es lo que dura mi proceso aproximadamente, se actualice con el mensaje 'Procesado'.


procedure MiClase.Procesar;
begin
Label1.Caption := 'Procesando';
repeat
// Proceso largo
until <Condicion>;
end;

procedure MiClase.GestionarProceso;
begin
Procesar;
Label1.Caption := 'Procesado';
end;


El problema es que el mensaje 'Procesando' lo actualiza inexplicablemente después del proceso con lo que nunca llega a verse.

Realmente lo que ocurre es:

1.- Procesa el repeat until
2.- Actualiza el caption de Label1 a Procesando
3.- Actualiza el caption de Label1 a Procesado

¿Qué he de hacer para que lo haga en el tiempo adecuado? ¿Por qué hace esto Delphi?

Gracias.

Lord Delfos
11-02-2009, 22:27:59
Creo que bastaría con llamar a Application.ProcessMessages. Con eso se le da tiempo a la aplicación para que responda a los cambios visuales necesarios.


procedure MiClase.Procesar;
begin
Label1.Caption := 'Procesando';
Application.ProcessMessages; // < ------------------
repeat
// Proceso largo
until ;
end;

procedure MiClase.GestionarProceso;
begin
Procesar;
Label1.Caption := 'Procesado';
end;





Saludos.

jhonny
11-02-2009, 22:28:14
Prueba con lo siguiente...


procedure MiClase.Procesar;
begin
Label1.Caption := 'Procesando';
Application.ProcessMessages;
repeat
// Proceso largo
until ;
end;


Nota: Veo que se me han adelantado ;).

Neftali [Germán.Estévez]
11-02-2009, 22:28:34
Añade:

Application.ProcessMessages;

Después del cambio del Caption, o mejor aun, dentro del While si el proceso es muy largo. Eso permitirá a Windows que procese mensajes mientras se ejecuta el proceso (entre ellos el de pintado del Label).

noob
11-02-2009, 22:31:36
Muchas gracias.

Otra pregunta, ¿tienen los métodos BeginUpdate y EndUpdate algo que ver con esto?

Saludos.

Black_Ocean
11-02-2009, 23:15:38
Muchas gracias.

Otra pregunta, ¿tienen los métodos BeginUpdate y EndUpdate algo que ver con esto?

Saludos.

El componente Label no tienen los métodos BeginUpdate y tampoco EndUpdate, esos métodos son de otros componentes tales como el ListView.

En tu caso, debería bastar con poner Application.ProcessMessages como te lo indicaron ateriormente cuando se trata de un cliclo con For, while, Repeat, etc. Si tu proceso es de otra cosa, tendrías que leer el bloque actual que se está ejecutando para indicarle que cuando ese bloque se ejecute, siempre te muestre el mensaje de 'Procesando' con Application.ProcessMessages, pero ahí es requiere de más trabajo, ya que hay que leer bloques de procesos. Cuando se trata de copia de archivos u otros, es fácil. También es fácil ocupar el ProcessMessages cuando se ocupa la API CreateProcess si es que lo que estás ejecutando es un proceso para Windows.

Saludos.