Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   No me dibuja en un label en el tiempo correcto (https://www.clubdelphi.com/foros/showthread.php?t=63391)

noob 11-02-2009 22:09:24

No se actualiza la propiedad Caption de un label en el tiempo correcto
 
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'.

Código Delphi [-]
procedure MiClase.Procesar;
begin
  Label1.Caption := 'Procesando';
  repeat
    // Proceso largo
  until ;
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.

Código Delphi [-]
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...

Código Delphi [-]
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:

Código Delphi [-]
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

Cita:

Empezado por noob (Mensaje 337837)
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.


La franja horaria es GMT +2. Ahora son las 08:26:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi