Cześć
A nie można prościej wywoływać tego okienka ? np:
Uses FileCtrl, //itd....
//Najprostrza instrukcja wywołania okna wyboru katalogów
PROCEDURE TForm1.Button1Click(Sender: TObject);
var
katalog :String;
Begin
SelectDirectory('Wybierz katalog', '',katalog );
Edit1.Text:=katalog;
End;
A gdy chcesz mieć większe możliwości z opcjami tego okna to podaje przykładowy kod:
UNIT OknoWybierzKatalog_Form;
Uses
ActiveX, ShlObj, Windows, StdCtrls, Classes, Controls, Forms;
Type
TForm1 = class(TForm)
Edit1: TEdit;
btnWybierzKatalog: TButton;
PROCEDURE btnWybierzKatalogClick(Sender: TObject);
Private
{ Private declarations }
Public
{ Public declarations }
End;
{Funkcja wywołuje systemowe okienko wyboru katalogu i pobiera nazwę katalogu.
W zmienną Uchwyt wpisujemy uchwyt okna dla którego mamy przypisać te okienko,
np: WybierzKatalog(Form1.Handle); }
FUNCTION WybierzKatalog(uchwyt :THandle) :String;
VAR
Form1 :TForm1;
IMPLEMENTATION {$R *.DFM}
PROCEDURE TForm1.btnWybierzKatalogClick(Sender: TObject);
Begin
Edit1.Text:= WybierzKatalog(Form1.handle);
end; //ok
//Okienko systemowe wyboru katalogu
FUNCTION WybierzKatalog(uchwyt :THandle) :String;
var
browser :TBrowseInfo;
buf :PChar;
dirs,root :PItemIDList;
alloc :IMalloc;
Begin
SHGetMalloc(alloc); //pobieranie obiektu zarządzającego pamięcią
buf:= Alloc.Alloc(Max_Path); //przydzielenie pamięci na string
//ograniczenie wybóru tylko do katalogu "Menu Start\Programs"
SHGetSpecialFolderLocation(uchwyt,CSIDL_DESKTOP,root);
//ustawianie parametrów okienka systemowego...
with browser do
begin
HwndOwner:= uchwyt; //przydzielony uchwyt okna
//pidlRoot:= root; //pokazuje zamkniętą gałąź katalogów
PidlRoot:= nil; //pokazuje otwartą gałąź katalogów
PszDisplayName:= buf;
LpszTitle:= 'Wybierz katalog :'; //etykieta przed listą katalogów
UlFlags:= 0; //Ulflags =1 powoduje schowanie kat. drukarek,panelu ster itp.
Lpfn:= nil;
end;
//pobieranie nazwy...
try
dirs:=SHBrowseForFolder(browser); //pokazanie okienka systemowego
SHGetPathFromIDList(dirs ,buf); //pobiernie pełnej ścieżki do katalogu
Result:= buf; //pobieranie nazwy katalogu do funkcji
finally
Alloc.Free(root);
Alloc.Free(buf);
end;
End;
//------------------------------------------------------------------------------------
//PS. To w razie potrzeby zależne od wersji Delphi - u mnie działa bez tego:
initialization //uaktywnienie kontrolki OCX potrzebnej do opcji kopiowania
OleInitialize(nil);
finalization
OleUninitialize;
END.