Ver Mensaje Individual
  #2  
Antiguo 16-11-2018
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Reputación: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.

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

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

Código Delphi [-]
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...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita