PDA

Ver la Versión Completa : ProgressBar + tiempo en realizar un GET HTTP


Missael
16-11-2018, 18:32:29
Buenos dias, tengo un problema con mi tiempo en que el progressBar se llena de manera total

Descargo un archivo y obtengo su Content-Length, quiero visualizar en un progressBar el avance de descarga con ese Content-Length del archivo, eh visto que con los componentes Indy en el TIdHttp se puede realizar, yo no estoy usando el componente como tal para invocar un evento, estoy declarando variables de tipo TIdHttp para realizar el GET.

¿Cómo puedo realizar esto?

Saludos

dec
16-11-2018, 18:53:16
Hola a todos,

Independientemente de sitúes o no el componente de forma "visual", tendrás que usar los eventos que tienes disponibles en la clase "TIdHttp". Se trata, por tanto, de preparar los métodos adecuados para asignarlos a los eventos que necesites usar. Fíjate en el siguiente código.


type
TForm1 = class(TForm)
ProgressBar1: TProgressBar;
procedure FormCreate(Sender: TObject);
private
procedure IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Int64);
procedure IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64);
procedure IdHTTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
end;


Arriba podemos ver que declaramos tres métodos privados en un formulario: en el mismo formulario tenemos un componente "ProgressBar" y también usamos el evento "FormCreate":


procedure TForm1.FormCreate(Sender: TObject);
var
IdHttp: TIdHTTP;
begin
IdHttp := TIdHTTP.Create();
try
IdHttp.OnWork := Self.IdHTTPWork;
IdHttp.OnWorkBegin := Self.IdHTTPWorkBegin;
IdHttp.OnWorkEnd := Self.IdHTTPWorkEnd;

// IdHttp.Get();
finally
IdHttp.Free();
end;
end;


Arriba vemos el evento "FormCreate", donde usamos utilizamos una variable del tipo "TIdHttp". Como ves, creamos la variable, asignamos los métodos que hemos preparado a los eventos que nos interesa, llevamos a cabo la llamada HTTP "GET", y, finalmente, destruímos la variable. Abajo puedes ver el cuerpo de los métodos en cuestión, preparados para ser asignados a los eventos de "TIdHttp":


procedure TForm1.IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
ProgressBar1.Position := AWorkCount;
end;

procedure TForm1.IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
begin
ProgressBar1.Max := AWorkCountMax;
end;

procedure TForm1.IdHTTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
ProgressBar1.Position := 0;
end;


Como ves, en dichos eventos usamos el componente "ProgressBar" que tenemos en el formulario, para mostrar el progreso de la llamada HTTP.

P.D. Nota que aquí no usamos el "Content length" del archivo, sino que establecemos el "máximo" de nuestro "ProgressBar" con la variable "AWorkCountMax" que nos llega en el evento "IdHTTPWorkBegin". De hecho, si no he entendido mal, y, usas el "Content length" del archivo, una vez descargado el mismo... no tendría sentido mostrar ya "ProgressBar" alguno, puesto que el archivo ya ha sido descargado. Tal vez me estoy perdiendo algo...

Missael
21-11-2018, 18:09:40
Lo que pasa es que el ContentLength lo obtenia para visualizarlo en el ProgressBar, esto dando clic a un botton 'Download' de esta forma en como me explicas, como puedo realizarlo?

un ejemplo, Si dicho archivo pesa 14000 Bytes, quiero que eso se vaya proyectando en el progressBar, para que el usuario pueda ver que esta trabajando el programa y unas vez descargados los 14000Bytes, el progressBar se llene, y mande un mensaje de 'Download Success'

Espero puedas apoyarme dec, Muchas Gracias