06 April 2009

Menampilkan Browse Dialog

Delphi mempunyai beberapa cara untuk menampilkan direktori dari komputer. Dan yang dibahas disini adalah menampilkan dialog untuk browse direktori menggunakan fungsi dari Windows API yaitu SHBrowseForFolder. Disini yang penting adalah parameter dengan tipe TBrowseInfo dari fungsi SHBrowseForFolder. Tiga elemen utama dari TBrowseInfo adalah lpszTitle, ulFlags dan lpfn. lpszTitle yang bertipe Pchar akan ditampilkan diatas treeview yang menampilkan direktori. Untuk menampilkan direktori saja, parameter ulFlags diisi dengan BIF_RETURNONLYFSDIRS. Parameter lpfn adalah pointer ke fungsi callback. Fungsi ini bisa digunakan untuk menampilkan parameter lpszTitle dan menampilkan dialog di tengah layar, karena secara default posisi dialog adalah random.
function OpenBrowseDialogCallBack(aWnd: HWND; aMsg: UINT; aParam, aData: LPARAM): Integer stdcall;
var
  workarea, rect: TRect;
  dlgpoint: TPoint;
begin
  if aMsg = BFFM_INITIALIZED then
  begin
    workarea := Screen.WorkAreaRect;
    GetWindowRect(aWnd, rect);
    dlgpoint.X := ((workarea.Right - workarea.Left) div 2) - ((rect.Right - rect.Left) div 2);
    dlgpoint.Y := ((workarea.Bottom - workarea.Top) div 2) - ((rect.Bottom - rect.Top) div 2);
    MoveWindow(aWnd, dlgpoint.X, dlgpoint.Y, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top, True);
    if aData <> 0 then
      SendMessage(aWnd, BFFM_SETSELECTION, Integer(True), aData);
  end;
  Result := 0;
end;

function OpenBrowseDialog(const aTitle: string; const aFlag: Integer): string;
var
  pitemid: PItemIDList;
  browseinfo: TBrowseInfo;
  displayname, temppath: array [0..MAX_PATH] of Char;
begin
  Result := '';
  FillChar(browseinfo, SizeOf(TBrowseInfo), #0);
  with browseinfo do
  begin
    hwndOwner := Application.Handle;
    pszDisplayName := @displayname;
    lpszTitle := PChar(aTitle);
    ulFlags := aFlag;
    lpfn := OpenBrowseDialogCallBack;
  end;
  pitemid := SHBrowseForFolder(browseinfo);
  if pitemid <> nil then
  begin
    SHGetPathFromIDList(pitemid, temppath);
    Result := temppath;
    GlobalFreePtr(pitemid);
  end;
end;
Contoh penggunaannya:
var
  dir: string;
begin
  dir := OpenBrowseDialog('Pilih direktori', BIF_RETURNONLYFSDIRS);
  // …
end;

Tidak ada komentar:

Posting Komentar