Ver Mensaje Individual
  #14  
Antiguo 30-04-2007
andresilvaus andresilvaus is offline
Miembro
 
Registrado: abr 2007
Posts: 10
Reputación: 0
andresilvaus Va por buen camino
Cita:
Empezado por dec
Hola,

Los componentes "ProgressBar" y "Gauge" cuentan con dos propiedades básicas en para su utilización: "MaxValue" y "Progress" -en el caso del "Gauge"-, y "Max" y "Position" en el caso del "ProgressBar". Estas dos propiedades indican el máximo valor que represente la barra de progreso, y el progreso actual, la posición actual del progreso. No dejes de revisar la ayuda para informarte sobre estas y otras propiedades.

Por otro lado, algunos componentes del paquete Indy añaden una serie de eventos para echarnos una mano a la hora de mostrar el progreso de las tareas que se llevan a cabo con ellos. Estos eventos son "OnWorkBegin", "OnWork" y "OnWorkEnd". También deberías revisar la ayuda sobre estos eventos, por supuesto.

Esto es lo que podría codificarse en el evento "OnWorkBegin" del componente "IdHttp" que estás usando:

Código Delphi [-]procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); begin Gauge1.MaxValue := AWorkCountMax; ProgressBar1.Max := AWorkCountMax; end;


"AWorkMode" indica qué está haciendo el componente: ¿está escribiendo datos (enviando) o los está leyendo (recibiendo)? Empero, como ves no tengo en cuenta este parámetro y me limito a usar "AWorkCountMax", que ha de indicar el número de "bytes" que se estiman necesarios para realizar la tarea. Este mismo número, sin más, lo usamos para las propiedades "MaxValue" y "Max" del "Gauge" y del "ProgressBar", respectivamente.

Ahora veamos el evento "OnWork":

Código Delphi [-]procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin Application.ProcessMessages(); Gauge1.Progress := AWorkCount; ProgressBar1.Position := AWorkCount; end;


Aquí como ves lo primero que hacemos es decirle a la aplicación "Oyes, procesa tus mensajes, no te quedes parada"... y aprovechamos este evento para ello puesto que será el que más se ejecute de los tres que estamos tocando, y para evitar, obviamente, que la interfaz de la aplicación "se congele". En todo caso, como ves, nos limitamos a usar el parámetro "AWorkCount", que indica el número de "bytes" leídos o escritos por el componente a la hora del evento.

Es decir, teníamos antes el máximo número de bytes que iban a ser necesarios para realizar la tarea, y ahora tenemos el número de "bytes" que llevamos leídos o escritos... y ya con esto podemos perfectamente mostrar el progreso de la tarea que estemos llevando a cabo. Como ves en el evento "OnWork" nos limitamos a establecer las propiedades "Progress" y "Position" de los componentes "Gauge" y "ProgressBar", respectivamente, con el valor de "AWorkCount".

Por último tal vez nos interese tratar con el evento "OnWorkEnd":

Código Delphi [-]procedure TForm1.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin Gauge1.Progress := 0; ProgressBar1.Position := 0; end;


Y como ves aquí no nos queda sino reinicializar a cero los valores del "Gauge" y del "ProgressBar", puesto que el trabajo (petición HTTP o POST en este caso) ya llegado a su término. Nota que estos eventos están presentes en varios componentes de Indy, no sólo en "IdHttp", y así tratar con ellos será siempre igual, sea cual sea el componente que los implemente.

Adjunto un sencillo ejemplo que descarga (pero no hace más que descargarlo) cierto programa de Internet, y va mostrando el progreso en un "Gauge" y en un "ProgressBar".
hola,

más onde está o ficheiro download? (googledestokp?)
Responder Con Cita