Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-02-2009
noob noob is offline
Miembro
 
Registrado: sep 2008
Posts: 212
Poder: 16
noob Va por buen camino
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.

Última edición por noob fecha: 11-02-2009 a las 22:23:38.
Responder Con Cita
  #2  
Antiguo 11-02-2009
Avatar de Lord Delfos
Lord Delfos Lord Delfos is offline
Miembro
 
Registrado: ene 2008
Ubicación: Tandil, Argentina
Posts: 558
Poder: 17
Lord Delfos Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 11-02-2009
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
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 .
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #4  
Antiguo 11-02-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 11-02-2009
noob noob is offline
Miembro
 
Registrado: sep 2008
Posts: 212
Poder: 16
noob Va por buen camino
Muchas gracias.

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

Saludos.

Última edición por noob fecha: 11-02-2009 a las 22:39:31.
Responder Con Cita
  #6  
Antiguo 11-02-2009
Avatar de Black_Ocean
Black_Ocean Black_Ocean is offline
Miembro
 
Registrado: nov 2006
Posts: 128
Poder: 18
Black_Ocean Va por buen camino
Cita:
Empezado por noob Ver Mensaje
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.

Última edición por Black_Ocean fecha: 11-02-2009 a las 23:18:53.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Crear Un Label En Tiempo De Ejecucion En C++ Builder soancatl55 C++ Builder 12 30-11-2011 18:49:15
Label vertical o a 90º andrestsas Varios 3 10-10-2007 12:33:59
controles en tiempo de ejecución verlos como si estubieran en tiempo de diseño gulder Varios 7 21-04-2007 22:57:30
¿ Label ? !3d1@n Varios 2 08-03-2005 19:42:47
label transparente b3nshi Varios 1 06-03-2005 20:07:02


La franja horaria es GMT +2. Ahora son las 18:08:44.


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
Copyright 1996-2007 Club Delphi