A mellékelt példában egyetlen nyomógombot találunk a Form-on, melynek segítségével a kiválasztott meghajtó vagy mappa gyermekeit kigyűjthetjük, és a TreeView komponensben megjeleníthetjük. A nyomógombra kattintva megjelenik egy mappaválasztó ablak, melyben megadhatjuk az elérési útvonalat.
Ez utóbbi műveletet a GetFolder metódusban végezzük el. A metódusban egy TBrowseInfo rekordot töltünk fel a megfelelő adatokkal, majd meghívjuk a SHBrowseForFolder metódust, hogy megjelenjen a mappaválasztó dialógusablak.
FillChar(BrowseInfo,SizeOf(BrowseInfo),#0);
BrowseInfo.hwndOwner := Handle;
BrowseInfo.pszDisplayName := @path[0];
BrowseInfo.lpszTitle := 'Select a folder';
BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS;
PIDL := SHBrowseForFolder(BrowseInfo);
A metódus visszatérési értékét vizsgáljuk meg a következő lépésben, majd amennyiben az megfelelő, visszaadjuk a kapott elérési útvonalat.
if Assigned(PIDL) then begin
if SHGetPathFromIDList(PIDL, path) then
Result := string(path);
end;
Miután az elérési útvonal rendelkezésünkre áll, elhelyezünk egy gyökérelemet a Treeview komponensben, majd meghívjuk a FilesCollect metódust, mely rekurzívan kigyűjti a mappa gyermekobjektumait.
TreeView1.Items.Clear;
root := TreeView1.Items.Add(nil, path);
root.ImageIndex := ISAClosedFolder;
root.SelectedIndex := ISAOpenFolder;
FilesCollect(path + '\' + '*.*', root);
A metódusban meghívjuk a FindFilesIcon függvényt, mely a megfelelő módszerekkel lekérdezi az adott elemhez (mappa, vagy állomány) tartozó ikont.
A megoldás lényege, hogy a Shell32.dll, illetve a Windows rendszerben található egyéb állományok bináris kódja tartalmaz ikonokat, csupán az adott ikon erőforrás sorszámát kell ismerni.
Mappák esetében könnyű dolgunk van, hiszen ott minden esetben a hagyományos ikont kell megjeleníteni. Az állományok esetében viszont meghívjuk a RegistryIconExtraction metódust, melyben megvizsgáljuk, hogy az adott kiterjesztéshez milyen állomány van eltárolva a Registry-ben, vagyis milyen állományban tárolódik az ikon.
A Registry HKEY_CLASSES_ROOT nevű főkulcsa alatt találjuk meg a kiterjesztéseket. A kiterjesztés kulcsának első bejegyzése egy újabb kulcsnév, melynek DefaultIcon kulcsa alatt találjuk meg az állomány nevét, valamint egy sorszámot, mely az ikon sorszámát jelenti.
Amennyiben ezek az információk rendelkezésre állnak, akkor hívjuk meg az ExtractIconEx metódust, melynek segítségével kinyerjük az állományból az ikon kezelőjét, melyet már felhasználhatunk az ikon objektum létrehozásához.
IconHandle := ExtractIconEx(PChar(FileName), IconPos,PLargeIcon, PSmallIcon, 1);