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)“.