Bem amigos,

 

A dica de hoje fala sobre como criar um programa para fazer download com barra de progresso, algo bastante procurando entre os colegas em nosso Fórum. Para exemplificar isso Eu criei um exemplo bem simples. Este exemplo foi desenvolvido com a ajuda técnica dos membros Michael, Bruno e Martins do fórum ClubeDelphi. Muito obrigado amigos.

Bem, o segredo todo está na dll UrlMon.dll. Fazendo uma chamada a função UrlDownloadToFile podemos “baixar” o arquivo informando sua origem e seu destino, veja:

 

UrlDownloadToFile(nil, PChar(‘http://www.seudominio.com.br/arquivo.zip’), PChar(‘C:\Temp\arquivo.zip’), 0, nil);

 

Obs. Não esqueça de declarar a unit UrlMon na uses do seu projeto.

 

Para mostra o status de download, basta usar a interface IbindStatusCallback. Ela é responsável possui o evento onProgress que pode ser usado para atualizar uma ProgressBar. Para usa-la basta criar uma classe herdando seus métodos e propriedades e então criar a variável do tipo de sua classe para poder acessar as informações da Interface. Veja:

Declaração da Classe

type

  TMeuObjetoInterface = class(TInterfacedObject, IBindStatusCallback);

  public

    function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;

    function GetPriority(out nPriority): HResult; stdcall;

    function OnLowResource(reserved: DWORD): HResult; stdcall;

    function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;

      szStatusText: LPCWSTR): HResult; stdcall;

    function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult;

      stdcall;

    function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult;

      stdcall;

    function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc:

      PFormatEtc; stgmed: PStgMedium): HResult; stdcall;

    function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult;

      stdcall;

  end;

Declaração e uso da Variável

procedure TForm1.Button1Click(Sender: TObject);

var

  MeuEstatus: TMeuObjetoInterface;

begin

  MeuEstatus := TMeuObjetoInterface.Create;

  UrlDownloadToFile(nil, PChar(Edit1.Text), PChar(Edit2.Text), 0, MeuEstatus);

  Form1.lblProgresso.Caption := 'Download concluído';

end;

 

Obs. As units UrlMon e ShellApi, ActiveX no uses do form.

 


 

Um abraço a todos.