Zwar hat Tino bereits hier ein im ersten gezeigt wie man eine modernes Verzeichnis-Auswahl-Dialogfenster bekommt, ich dann noch zusäzlich wie man das
Delphi eigene Verzeichnis-Auswahl-Dialogfenster bekommt, aber hier noch eine dritte Variante (bzw. zwei Versionen davon), die eine verkürzete Tino-Variante ist. Die Version zwei (weiter unten) ist übrigens die einfachere Version.
Version 1:
Die Funktion benötigt zwei Parameter:
- eine System-Konstante für eine Systemordner
- Beschreibung für die Dialogbox, nicht Titel
Als Ergebnis bekommt man den ausgewählten Pfad.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| uses ShlObj;
function SelFolderA(Root: Integer; Caption: string): String; var bi: TBrowseInfo; lpBuffer: array[0..MAX_PATH+1] of Char; pidlPrograms, pidlBrowse: PItemIDList; begin if (not SUCCEEDED(SHGetSpecialFolderLocation(GetActiveWindow, Root, pidlPrograms))) then Exit;
with bi do begin hwndOwner := GetActiveWindow; pidlRoot := pidlPrograms; pszDisplayName := lpBuffer; lpszTitle := PChar(Caption); ulFlags := BIF_RETURNONLYFSDIRS; lpfn := nil; lParam := 0; end;
pidlBrowse := SHBrowseForFolder(bi); if (pidlBrowse <> nil) then if SHGetPathFromIDList(pidlBrowse, lpBuffer) then Result := lpBuffer; end; |
Hier die benötigten Konstanten. Falls die obere Funktion in einer separaten Unit eingebaut wird, die Funktion dann wiederum aus einer weiteren Unit aufgerufen wird, dann muß dort die Unit ShlObj unter Uses eintragen werden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| uses ShlObj;
|
Beispiel:
Öffnet im Eigene Dateien-Verzeichnisbaum
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button1Click(Sender: TObject); var S: String; begin S := SelFolderA(CSIDL_Personal, 'Bitte Ordner wählen'); if DirectoryExists(S) then ShowMessage(S); end; |
Version 2:
Diese Version ist besonders einfach, da hier keine System-Konstanten benötigt werden. Hier wird von CSIDL_Desktop Variante ausgegangen, was den typischen Haupt-Explorer-Verzeichnisbaum anzeigt.
Die Funktion benötigt ein Parameter:
- Beschreibung für die Dialogbox, nicht Titel
Als Ergebnis bekommt man den ausgewählten Pfad.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| uses ShlObj;
function SelFolderB(Caption: string): String; var bi: TBrowseInfo; lpBuffer: array[0..MAX_PATH+1] of Char; pidlPrograms, pidlBrowse: PItemIDList; begin SHGetSpecialFolderLocation(GetActiveWindow, CSIDL_Desktop, pidlPrograms);
with bi do begin hwndOwner := GetActiveWindow; pidlRoot := pidlPrograms; pszDisplayName := lpBuffer; lpszTitle := PChar(Caption); ulFlags := BIF_RETURNONLYFSDIRS; lpfn := nil; lParam := 0; end;
pidlBrowse := SHBrowseForFolder(bi); if (pidlBrowse <> nil) then if SHGetPathFromIDList(pidlBrowse, lpBuffer) then Result := lpBuffer; end; |
Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button1Click(Sender: TObject); var S: String; begin S := SelFolderB('Bitte Ordner wählen'); if DirectoryExists(S) then ShowMessage(S); end; |
Hinweis:
Die oberen Funktionen hab ich nicht entwickelt, aber für meine Bedürfnissen abgeändet und vereinfacht. Ich weiß aber nicht wer die Originalfunktion geschrieben hat.
Moderiert von jasocul: Beiträge zusammengefasst.