Clique para saber mais...
  Home     Download     Produtos / Cursos     Revista     Vídeo Aulas     Fórum     Contato   Clique aqui para logar | 12 de Junho de 2026
  Login

Codinome
Senha
Salvar informações

 Esqueci minha senha
 Novo Cadastro

  Usuários
94 Usuários Online

  Revista ActiveDelphi
 Assine Já!
 Edições
 Sobre a Revista

  Conteúdo
 Apostilas
 Artigos
 Componentes
 Dicas
 News
 Programas / Exemplos
 Vídeo Aulas

  Serviços
 Active News
 Fórum
 Produtos / Cursos

  Outros
 Colunistas
 Contato
 Top 10

  Publicidade

  [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)
Comentários comentar   Enviar esta notícia a um amigo Enviar para um amigo   Versão para Impressão Versão para impressão
Diego Garcia 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
   Ordem:  
Comentários pertencem aos seus respectivos autores. Não somos responsáveis pelo seus conteúdos.
  Edição 112

Revista ActiveDelphi

  50 Programas Fontes


  Produtos

Conheça Nossos Produtos

Copyright© 2001-2016 – Active Delphi – Todos os direitos reservados