ProgressBar não funciona

Delphi

16/06/2012

Por quê minha ProgressBar, num download via FTP não funciona?
Vejam o código abaixo:

unit U_FTPDownload;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdFTP, ComCtrls, DateUtils, IdAntiFreezeBase, IdAntiFreeze;

type
TF_FTPDownload = class(TForm)
ButtonConectar: TButton;
ButtonDesconectar: TButton;
IdFTP1: TIdFTP;
ProgressBar: TProgressBar;
LabelConect: TLabel;
IdAntiFreeze1: TIdAntiFreeze;
procedure ButtonConectarClick(Sender: TObject);
procedure ButtonDesconectarClick(Sender: TObject);
procedure IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
procedure IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
procedure IdFTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
private
{ Private declarations }
BytesToTransfer: LongWord;
public
{ Public declarations }
end;

var
F_FTPDownload: TF_FTPDownload;

implementation

{$R *.dfm}

procedure TF_FTPDownload.ButtonConectarClick(Sender: TObject);
begin

if not IdFTP1.Connected then
begin
IdFTP1.TransferType := ftBinary;
IdFTP1.User := usuario;
IdFTP1.Password := password;
IdFTP1.Host := ftp.meuftp.com.br;
IdFTP1.Connect;
LabelConect.Enabled := true;
LabelConect.Caption := Transferindo;
ButtonConectar.Enabled := false;
ButtonDesconectar.Enabled := false;
IdFTP1.ChangeDir(/);
IdFTP1.Get(DADOS.DBF , DADOS.DBF , true);
ButtonDesconectar.Enabled := true;
end;

if IdFTP1.Connected then
begin
LabelConect.Caption := Conectado;
ButtonConectar.Enabled := false;
ButtonDesconectar.Enabled := true;
end;
end;

procedure TF_FTPDownload.ButtonDesconectarClick(Sender: TObject);
begin
if IdFTP1.Connected then
begin
IdFTP1.Disconnect;
ButtonConectar.Enabled := true;
ButtonDesconectar.Enabled := false;
LabelConect.Caption := Desconectado;
end;
end;


procedure TF_FTPDownload.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
ProgressBar.Position := AWorkCount;
end;

procedure TF_FTPDownload.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
if AWorkCountMax > 0 then
ProgressBar.Max := AWorkCountMax
else
ProgressBar.Max := BytesToTransfer;
end;

procedure TF_FTPDownload.IdFTP1WorkEnd(Sender: TObject;
AWorkMode: TWorkMode);
begin
BytesToTransfer := 0;
ProgressBar.Position := 0;
end;

end.


Alguem pode me dar uma luz?
Clovis Perazza

Clovis Perazza

Curtidas 0

Respostas

Bruno Leandro

Bruno Leandro

16/06/2012

Ola tente alterar esses dois eventos conforme modelo a seguir

procedure TF_FTPDownload.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
ProgressBar.Position := ProgressBar.Position + AWorkCount;
end;

procedure TF_FTPDownload.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
ProgressBar.Min := 0;
if AWorkCountMax > 0 then
ProgressBar.Max := AWorkCountMax
else
ProgressBar.Max := BytesToTransfer;
end;
GOSTEI 0
Clovis Perazza

Clovis Perazza

16/06/2012

Olá Bruno, obrigado pela atenção, mas ainda assim não funciona.

Coloquei uma Label na procedure para poder visualizar o valor do ProgressBar.Position, mas o valor fica sempre 0 (zero).

////////
procedure TF_FTPDownload.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
ProgressBar.Position := ProgressBar.Position + AWorkCount;
Label1.Caption := IntToStr(ProgressBar.Position); <-----
end;
////////

Já não tô entendendo mais nada.
GOSTEI 0
Clovis Perazza

Clovis Perazza

16/06/2012

Olá Bruno.

Descobri cara.
Coisa besta que a gente não observa.
Eu não estava carregando a variável BytesToTransfer , que define a posição máxima da ProgressBar.
Eu a defini em Privates mas esqueci de carrega-la.
Então não há necessidade de alterar meu código como você sugeriu, bastou isso:

///////
if not IdFTP1.Connected then
begin
IdFTP1.TransferType := ftBinary;
IdFTP1.User := perazza;
IdFTP1.Password := 07081426;
IdFTP1.Host := ftp.xpg.com.br;
IdFTP1.Connect;
LabelConect.Enabled := true;
LabelConect.Caption := Transferindo;
ButtonConectar.Enabled := false;
ButtonDesconectar.Enabled := false;
IdFTP1.ChangeDir(/);
BytesToTransfer := IdFTP1.Size(DADOS.DBF); <-----------------------
IdFTP1.Get(DADOS.DBF , DADOS.DBF , true);
ButtonDesconectar.Enabled := true;
end;
////////////////

Valeu pela sua ajuda.
Um grande abraço.
GOSTEI 0
POSTAR