// Ein Dialog zum Auswählen von Ordnern und bei Bedarf auch von Dateien,
// bei dem ein Startverzeichnis festgelegt werden kann und der in einer
// Statuszeile den Pfad anzeigen kann.
// Getestet mit D4 unter XP / Rs 10.4 unter W11


uses ShlObj;   {Winapi.ShlObj;}
 
function OpenFolderOrFile(Ownerhandle: HWND; Txt, InitDir: PChar; 
  Files, Status: boolean): string; 
var 
  Info: TBrowseInfo; 
  pidl: PItemIDList; 
  Buffer: PChar; 
 
  function BrowseCallbackProc(hwnd: HWND; uMsg: UINT; lParam: Cardinal; 
    lpData: Cardinal): Integer; stdcall; 
   var Pfad: array[0..MAX_PATH] of Char; 
  begin 
    case uMsg of 
      BFFM_INITIALIZED: SendMessage(Hwnd, BFFM_SETSELECTION, 1, 
          Integer(lpData)); 
      BFFM_SELCHANGED: begin 
          SHGetPathFromIDList(PItemIDList(lParam), @Pfad); 
          SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, Longint(@Pfad)); 
        end; 
    end; 
    Result := 0; 
  end; 
 
begin 
  GetMem(Buffer, MAX_PATH); 
  Zeromemory(@Info, SizeOf(TBrowseInfo)); 
  with Info do begin 
    hwndOwner := Ownerhandle; 
    pszDisplayName := Buffer; 
    lpszTitle := Txt; 
    ulFlags := BIF_RETURNONLYFSDIRS; 
    if Files then 
      ulFlags := ulFlags or BIF_BROWSEINCLUDEFILES; 
    if Status then 
      ulFlags := ulFlags or BIF_STATUSTEXT; 
    lpfn := @BrowseCallbackProc; 
    lParam := Integer(InitDir); 
  end; 
  pidl := SHBrowseForFolder(Info); 
  if (pidl <> nil) and SHGetPathFromIDList(pidl, Buffer) 
    then Result := Buffer else Result := ''; 
  FreeMem(Buffer); 
end; 
 
// Beispiel 
procedure TForm1.Button1Click(Sender: TObject); 
var 
  s: string; 
begin 
  s := OpenFolderOrFile(Handle, 'Bitte wählen:', 'C:\Program Files (x86)', 
    True, True); 
  if s <> '' then 
    showmessage(s); 
end;



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke