Fonte: www.activedelphi.com.br
Andei procurando muito pela web algum exemplo de como medir o progresso da transferência de um arquivo através do componente idFtp, no Delphi 6. Depois de muito procurar e nada encontrar, um pequeno exemplo que não funcionava muito bem me fez pensar um pouco e me levou, após alguns testes, a um medidor de progresso funcional, feito com um gauge.
Para fazer um exemplo, coloque um componente idFTP, um ListBox e um Button no seu formulário. Configure o seu componente de conexão de acordo com os dados do ftp que irá se conectar e declare uma variável global chamada bytesToTransfer
var
Form1: TForm1;
bytesToTransfer: integer;
em seguida, faremos a conexão e o download de todos os arquivos .exe que estiverem no ftp. No exemplo, o código foi implementado no evento onClick do botão:
procedure TForm1.Button1Click(Sender: TObject);
var
indice: integer;
begin
try
//efetua a conexão ao FTP
if IdFTP1.Connected then
IdFTP1.Disconnect;
IdFTP1.Connect();
//lista todos os arquivos do tipo .exe do ftp no ListBox1
IdFTP1.List(ListBox1.Items,'*.exe',false);
//se não houverem arquivos, aborta
if ListBox1.Items.Count = 0 then
Abort;
//para cada ítem do ListBox1
for indice:=0 to ListBox1.Items.Count -1 do
begin
try
//marca o ítem selecionado
ListBox1.Selected[indice] := true;
//captura o tamanho do arquivo para a varíavel global
bytesToTransfer := IdFTP1.Size(ListBox1.Items.Strings[indice]);
//inicia a transferência do arquivo
IdFTP1.Get(ListBox1.Items.Strings[indice],
'' + ListBox1.Items.Strings[indice],true);
except
on e:exception do
showmessage(e.Message);
end;
end;
finally
//desconecta
IdFTP1.Disconnect;
end;
end;
No eventoWorkBegin do idFTP, que é disparado no momento em que o Download do arquivo é iniciado, faça:
procedure TForm1.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
//limpa a barra de progresso
Gauge1.Progress := 0;
//define o tamanho máximo para o Gauge
if AWorkCountMax > 0 then
Gauge1.MaxValue := AWorkCountMax
else
Gauge1.MaxValue := bytesToTransfer;
end;
E finalmente, a cada conjunto de bytes trazidos pelo componente, incrementamos o Gauge. Isso é feito no evento Work do idFTP:
procedure TForm1.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
//incrementa o Gauge
Gauge1.Progress := AWorkCount;
end;
Para fazer um exemplo, coloque um componente idFTP, um ListBox e um Button no seu formulário. Configure o seu componente de conexão de acordo com os dados do ftp que irá se conectar e declare uma variável global chamada bytesToTransfer
var
Form1: TForm1;
bytesToTransfer: integer;
em seguida, faremos a conexão e o download de todos os arquivos .exe que estiverem no ftp. No exemplo, o código foi implementado no evento onClick do botão:
procedure TForm1.Button1Click(Sender: TObject);
var
indice: integer;
begin
try
//efetua a conexão ao FTP
if IdFTP1.Connected then
IdFTP1.Disconnect;
IdFTP1.Connect();
//lista todos os arquivos do tipo .exe do ftp no ListBox1
IdFTP1.List(ListBox1.Items,'*.exe',false);
//se não houverem arquivos, aborta
if ListBox1.Items.Count = 0 then
Abort;
//para cada ítem do ListBox1
for indice:=0 to ListBox1.Items.Count -1 do
begin
try
//marca o ítem selecionado
ListBox1.Selected[indice] := true;
//captura o tamanho do arquivo para a varíavel global
bytesToTransfer := IdFTP1.Size(ListBox1.Items.Strings[indice]);
//inicia a transferência do arquivo
IdFTP1.Get(ListBox1.Items.Strings[indice],
'
except
on e:exception do
showmessage(e.Message);
end;
end;
finally
//desconecta
IdFTP1.Disconnect;
end;
end;
No eventoWorkBegin do idFTP, que é disparado no momento em que o Download do arquivo é iniciado, faça:
procedure TForm1.IdFTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
//limpa a barra de progresso
Gauge1.Progress := 0;
//define o tamanho máximo para o Gauge
if AWorkCountMax > 0 then
Gauge1.MaxValue := AWorkCountMax
else
Gauge1.MaxValue := bytesToTransfer;
end;
E finalmente, a cada conjunto de bytes trazidos pelo componente, incrementamos o Gauge. Isso é feito no evento Work do idFTP:
procedure TForm1.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
//incrementa o Gauge
Gauge1.Progress := AWorkCount;
end;