Home » Tipps & Tricks » System » Systemdialoge » Standard Path-Dialog anzeigen

Standard Path-Dialog anzeigen

Folgende Funktion zeigt den Standarddialog von Windows an, um ein Verzeichnis auswählen zu lassen. Die Funktion erwartet zwei Parameter. Über den ersten Parameter kann man das Rootverzeichnis auswählen. Auf diese Weise kann man den Dialog so aufrufen, dass beispielsweise nur Netzwerkverzeichnisse ausgewählt werden können. Dem zweite Parameter kann ein möglicher Titel für den Dialog übergeben werden. Die Funktion gibt das ausgewählte Verzeichnis zurück. Klickt der Anwender auf ‚Abbrechen‘ gibt die Funktino einen Leerstring zurück. Es muss die Unit ShlObj eingebunden werden.

uses
  ShlObj, ActiveX;

function GetFolder(const ARoot: integer; const ACaption: String): String;
var
  bi: TBROWSEINFO;
  lpBuffer: PChar;
  pidlPrograms,
  pidlBrowse: PItemIDList;
  ShellH: IMalloc;
begin
  if (not SUCCEEDED(SHGetSpecialFolderLocation(GetActiveWindow,
                                               ARoot,
                                               pidlPrograms))) then
    Exit;
  try
    GetMem(lpBuffer, MAX_PATH);
    try
      bi.hwndOwner:=GetActiveWindow;
      bi.pidlRoot:=pidlPrograms;
      bi.pszDisplayName:=lpBuffer;
      bi.lpszTitle:=PChar(ACaption);
      bi.ulFlags:=BIF_RETURNONLYFSDIRS;
      bi.lpfn:=NIL;
      bi.lParam:=0;
      pidlBrowse:=SHBrowseForFolder(bi);

      if (pidlBrowse <> nil) and (SHGetPathFromIDList(pidlBrowse,
                                                      lpBuffer)) then
        Result:=lpBuffer;
    finally
      FreeMem(lpBuffer);
    end;
  finally
    if SHGetMalloc(ShellH) = NOERROR then
       ShellH.Free(pidlBrowse);
  end;
end;

Aufgerufen werden kann die Funktion beispielsweise so:

procedure TForm1.Button3Click(Sender: TObject);
begin
  Caption := GetFolder(CSIDL_DRIVES, 'Zielverzeichnis wählen');
end;

CSIDL_DRIVES bedeutet, dass der Anwender den ‚Arbeitsplatz‘ als Rootverzeichnis angezeigt bekommt. Weitere Werte finen Sie in der Unit ShlObj oder in untenstehender Liste:

CSIDL_DESKTOP
CSIDL_INTERNET
CSIDL_PROGRAMS
CSIDL_CONTROLS
CSIDL_PRINTERS
CSIDL_PERSONAL
CSIDL_FAVORITES
CSIDL_STARTUP
CSIDL_RECENT
CSIDL_SENDTO
CSIDL_BITBUCKET
CSIDL_STARTMENU
CSIDL_DESKTOPDIRECTORY
CSIDL_DRIVES
CSIDL_NETWORK
CSIDL_NETHOOD
CSIDL_FONTS
CSIDL_TEMPLATES
CSIDL_COMMON_STARTMENU
CSIDL_COMMON_PROGRAMS
CSIDL_COMMON_STAR TUP
CSIDL_COMMON_DESKTOPDIRECTORY
CSIDL_APPDATA
CSIDL_PRINTHOOD
CSIDL_ALTSTARTUP
CSIDL_COMMON_ALTSTARTUP
CSIDL_COMMON_FAVORITES
CSIDL_INTERNET_CACHE
CSIDL_COOKIES
CSIDL_HISTORY

Des Weiteren gibt es die Möglichkeit den Benutzer über die in der Unit FileCtrl vorhandene Funktion SelectDirectory ein Verzeichnis auswählen zu lassen. Je nach Betriebssystem und Delphi-Version kann dieser Dialog allerdings veraltet aussehen. In neueren Delphi-Versionen gibt es zwei Deklarationen der Funktion:

function SelectDirectory(const Caption: string; const Root: WideString; out Directory: string): Boolean; overload;

function SelectDirectory(var Directory: string; Options: TSelectDirOpts; HelpCtx: Longint): Boolean; overload;

Erstere Funktion zeigt unter Windows 2000 und Windows XP einen zeitgemäßen Dialog an. Unter Windows NT sieht der Dialog mehr nach 16 Bit aus. Letztere Funktion zeigt auch unter Windows XP den alten Dialog an. Weitere Informationen zum Aufruf der Funktion finden Sie in der Onlinehilfe unter dem Stichwort „SelectDirectory (Funktion)“.