Datei/Verzeichnisauswahl 'explorer style'

Hallo,

ich muss auf einem Form ein Quellverzeichnis (keine Dateien!) wählen. Derzeit benütze ich dazu eine Kombination aus TDriveComboBox und TDirectoryListBox. Klappt auch ganz gut, ist aber nicht State of the Art.

Hip sind Auswahldialoge „Explorer Style“ wo man alle möglichen physikalischen und virtuellen Ordner wählen kann, also Laufwerke, Verzeichnisse, „Eigene Dateien“ usw. Wenn das zu unklar war: man drücke Windows-E, ich meine die linke Seite :smile:.

Außerdem ist jetzt bereits absehbar, dass ich für die allfällige Nachfolgeversion besondere Quellen (Internetadressen) auswählbar machen muss, die weder Standardordner noch Laufwerke sind, also muss ich irgendwo in der Liste der Quellverzeichnisse auch noch einen eigenen Eintrag unterbringen können.

Bevor ich mich jetzt dranmache, einen eigene Treeview zu programmieren: gibt es irgendwo in der Tiefe der Klassenbibliotheken was passendes, kennt jemand ein passendes Stück freien Code, kann ich das sonst irgendwo aus den Tiefen von Windows „erben“? Eventuell sogar vom Expülorer selbst „ausborgen“? Sorry wegen der nebligen Fragerei, aber ich habe als Gelegenheitstäter in Sachen Programmierung längst keinen Überblick mehr, was genau welche Microsoft Bibliothek an Segnungen zur Verfügung stellt.

Wichtig: das Programm muss (Kundenvorgabe) ohne die Segnungen von nachzuinstallierenden Microsoft Klassenbibliotheken wie .Net Framework auf einer „nackten“ Windows XP Maschine lauffähig sein, ich darf also nur einsetzen, was bei Delphi 2006 mit dabei ist, was sich direkt eincompilieren lässt, oder was sich über Windows Common Controls und APIs abwickeln lässt.

Außerdem muss das Control ins Formular eingebettet sein, ein modaler Dialog a la „Datei öffnen“ ist nicht verwendbar.

Danke für Hinweise …

…Armin

Hallo,

meinst du einen in der Form:

function BrowseForDirectory(hWnd: HWND; Text: PChar; Root: PChar; var Dir: PChar): LongBool;
var
 BI: BROWSEINFO;
 Buffer: array [0..260]of char;
 PID : PITemIDList;
 buffer2: array [0..260]of char;
begin
 with BI do
 begin
 hwndOwner := hWND;
 lpszTitle := Text;
 ulFlags := BIF\_RETURNONLYFSDIRS or BIF\_BROWSEFORCOMPUTER;
// If Root = '' then
 pidlRoot := nil;// else
// pidlRoot := @Root;
 pszDisplayName := @buffer;
 end;
 PID := SHBrowseForFolder(BI);
 Result := SHGetPathFromIDList(PID, @Buffer2);
 Dir := Buffer2;
end;

Aufruf erfolgt dann mit

var
 szDir: string;

BrowseForDirectory(MainForm.Handle, 'Verzeichnis wählen', nil, szDir);

für diese Funktion benötigst du die ShlObj.pas, Windows.pas & Messages.pas

Okay? Wenn Fragen sind, bitte melden
-Chris

Hallo,

Hi hris,

ist schon eine Weile her, aber das Projekt ist immer noch aktuell - wenn ich gerade mal Zeit dafür habe.

Die Lösung riecht nach modalem Dialog, eigentlich war ich auf ein Control aus, das ich in mein Form einsetzen kann. Aber egal, eventuell geht das ja auch. Ich wollte es schnell ausprobieren. VCL Applikation erstellt, definiert wie üblich Unit1 mit var Form1:TForm1 von Class TForm. Hab da einen Button draufgeklebt und Deinen Code reinkopiert. Aber: in der Zeile

procedure TForm1.Button1Click(Sender: TObject);
var
szDir: string;

begin
BrowseForDirectory(Mainform.Handle, ‚Verzeichnis wählen‘, nil, szDir);
end;

streikt der Compiler, weil es Mainform.Handle nicht gibt. Alternativen wie Application.Handle oder Form1.Handle führen zu Fehler „Property Handle inaccessible here“. Wie komme ich an ein passendes Handle, das ich in die Funktion reinstopfen kann?

…Armin

Hmm ich hab mir diese Function ohne große Tests schnell mal aus den Fingern gesaugt :smile: Weiß nicht ob sie 100pro funktioniert.

Wenn du für Handle 0 (Null) nimmst, hat der Dialog keinen Owner, soll heißen, das aufrufende Fenster ist nicht inaktiv.

sollte funktionieren.