07 April 2009

Download dari Internet dengan Progress Bar

Kita membuat aplikasi yang kompleks dari awal, dengan banyak client dan beberapa client jauh dari kita. Pada saat ada update program, kita ingin client bisa download update program dari suatu situs web yang sudah kita tentukan. Banyak juga pengembang software yang memanfaatkan internet atau web sebagai sarana untuk memberikan update bagi client. Dengan begini kita tidak perlu repot harus datang ke banyak tempat hanya untuk melakukan update program.
Berikut ini adalah cara download dari internet dengan menggunakan interface IBindStatusCallback dari unit UrlMon. Interface ini digunakan untuk proses binding secara asynchronous.
uses SysUtils, Windows, UrlMon, ActiveX;

type
  TBindStatusCallback = class(TObject, IBindStatusCallback)
  protected
    FRefCount: Integer;
    function QueryInterface(const IID: TGUID; out Obj): Integer; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  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;

function TBindStatusCallback.QueryInterface(const IID: TGUID;
  out Obj): Integer;
begin
  if GetInterface(IID, Obj) then Result := S_OK
  else Result := E_NOINTERFACE;
end;

function TBindStatusCallback._AddRef: Integer;
begin
  Inc(FRefCount);
  Result := FRefCount;
end;

function TBindStatusCallback._Release: Integer;
begin
  Dec(FRefCount);
  Result := FRefCount;
end;

function TBindStatusCallback.GetBindInfo(out grfBINDF: DWORD;
  var bindinfo: TBindInfo): HRESULT;
begin
  Result := E_NOTIMPL;
end;

function TBindStatusCallback.GetPriority(out nPriority): HRESULT;
begin
  Result := E_NOTIMPL;
end;

function TBindStatusCallback.OnDataAvailable(grfBSCF, dwSize: DWORD;
  formatetc: PFormatEtc; stgmed: PStgMedium): HRESULT;
begin
  Result := E_NOTIMPL;
end;

function TBindStatusCallback.OnLowResource(reserved: DWORD): HRESULT;
begin
  Result := E_NOTIMPL;
end;

function TBindStatusCallback.OnObjectAvailable(const iid: TGUID;
  punk: IUnknown): HRESULT;
begin
  Result := E_NOTIMPL;
end;

function TBindStatusCallback.OnStartBinding(dwReserved: DWORD;
  pib: IBinding): HRESULT;
begin
  Result := E_NOTIMPL;
end;

function TBindStatusCallback.OnStopBinding(hresult: HRESULT;
  szError: LPCWSTR): HRESULT;
begin
  Result := E_NOTIMPL;
end;

function TBindStatusCallback.OnProgress(ulProgress, ulProgressMax,
  ulStatusCode: ULONG; szStatusText: LPCWSTR): HRESULT;
begin
  Result := OnDownloadProgress(ulProgress, ulProgressMax, ulStatusCode, szStatusText);
end;

function OnDownloadProgress(ulProgress, ulProgressMax,
  ulStatusCode: ULONG; szStatusText: LPCWSTR): HRESULT;
begin
  ProgressBar1.Position := ulProgress;
  ProgressBar1.Max := ulProgressMax;
end;

Contoh pemakaiannya:
var
  bsc: TBindStatusCallback;
begin
  bsc := TBindStatusCallback.Create;
  URLDownloadToFile(nil, PChar(‘http://www.google.com/intl/de/images/home_title.gif’), PChar(‘C:\ home_title.gif’), 0, bsc)
end;

Tidak ada komentar:

Posting Komentar