|
Usuários |
|
94 Usuários Online
|
|
[Artigos]
[Intermediário] - Como utilizar barra de progressão nos componentes Indy |
Publicado por rboaro : Quinta, Abril 18, 2013 - 11:54 GMT-3 (543 leituras)
comentar Enviar para um amigo Versão para impressão
|
Venho ultimamente trabalhando bastante com os protocolos TCP/IP e HTTP e pra isso os componentes Indy estão me atendendo perfeitamente.
Uma necessidade que apareceu recentemente foi realizar downloads pesados. Até ai sem problemas, porém, como todo processamento mais pesado, é preciso de alguma forma prover feedbacks para o usuário, para que este não pense que o sistema parou de funcionar.
A partir dessa necessidade, fiz algumas pesquisas e descobri os eventos Work dos componentes Indy:

OnWorkBegin: Basicamente esse evento é disparado quando se inicia a resolução da resposta do servidor, ou seja, é disparado quando se começa recuperar alguma informação.
OnWork: Esse evento é disparado algumas vezes durante a resolução da resposta do servidor. Notei que o Indy trabalha com blocos de dados, a cada bloco, esse evento é disparado.
OnWorkEnd: Por fim, esse evento é disparado após a resposta ser totalmente recuperada.
Vejamos um exemplo de como utilizar esses eventos. Considerando que estou trabalhando com um form (TfrmDownload) com um label (lblLegenda), um progress bar (pgbDownload) e um IdHttp (idHttp1), faremos um exemplo bem simples, começando pela função que realiza o download.
Antes, para quem não conhece, o componente IdHttp é utilizado para trabalhar com o protocolo Http.
procedure TfrmDownload.RealizarDownload(const AUrl: string);
var
oStream : TMemoryStream;
begin
oStream := TMemoryStream.Create;
try
IdHTTP1.Get(AUrl,oStream);
finally
oStream.Free;
end;
end;
Como o intuito do exemplo é demonstrar o uso dos eventos Work, não faremos nada com o conteúdo do download (que está sendo salvo no objeto oStream).
Agora vamos trabalhar com o evento OnWorkBegin, nele iremos preparar o ambiente para prover os feedbacks do processamento. O evento OnWorkBegin possui o parâmetroAWorkCountMax, esse parâmetro representa o tamanho total do trabalho a ser realizado, em outras palavras, ele pode representar o tamanho do arquivo que será baixado.
procedure TfrmDownload.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
begin
Self.lblLegenda.Caption := 'Iniciando Download';
Self.pgbDownload.Max := AWorkCountMax;
Self.pgbDownload.Position := 0;
Application.ProcessMessages();
end;
Agora, faremos a barra de progresso andar através do evento OnWork. Este evento possui o parâmetro AWorkCount, que representa o quanto já foi progredido do trabalho atual, ou seja, quanto que já foi baixado do arquivo por exemplo.
procedure TfrmDownload.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
Self.lblLegenda.Caption := 'Realizando Download';
Self.pgbDownload.Position := AWorkCount;
Application.ProcessMessages();
end;
E por fim, informaremos ao usuário que nosso processamento chegou ao fim através do evento OnWorkEnd, esse, sem nenhum mistério.
procedure TfrmDownload.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
Self.lblLegenda.Caption := 'Download Finalizado';
Application.ProcessMessages();
end;
Por mais simples que seja, considero esse tipo de recurso indispensável para processamentos longos, até mesmo quando esses são feitos dentro de threads. Isso evita a clássica frase “acho que travou, está parado e nada acontece“, que faz com que o usuário force a interrupção do sistema. Outros componentes da família Indy possuem esses eventos (como é o caso do IdTCP) e funcionam de forma semelhante, basta realizar os testes necessários.
|
|
Comentários | |
| | Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos. |
|
|
Edição 112 |
|
|
50 Programas Fontes |
|
|
Produtos |
|
|