Delphi - A Shell ikon dialógus ablaka

forráskód letöltése
Amikor valamely program ikonján jobb gombbal kattintunk és kiválasztjuk a tulajdonság menüpontot, akkor a megjelenő lapon találunk egy nyomógombot, melynek segítségével kicserélhetjük az ikont egy másikra.

Ekkor megjelenik egy olyan ablak, melyben kiválaszthatunk akár csak egy ICO állományt, de akár egy DLL-t is betölthetünk és az abban található ikonok közül válogathatunk.

Mellékelt programban ezt az ikon cserélő ablakot próbáljuk meg előcsalogatni a Windows mélyéről. Amint az látható lesz, ily módon a saját programunkban is felhasználható lesz tetszőlegesen kiválasztott ikon. A dialógus ablak használatához nincs is másra szükségünk, mint hogy ismerjük annak a függvénynek a nevét és paramétereit, melynek segítségével az ablak megjeleníthető.

Ennek a dialógus ablaknak is a Dialogs palettán lenne a helye, mint ahogy sok más a Windows-ban használt dialógus ablak meg is található itt. Valami oknál fogva ez és még jó néhány társa azonban lemaradt.

A Shell32.dll Windows rendszerállomány lesz az, ahol ez a dialógus ablak is megtalálható. Most már csak deklarálnunk kell a PickIconDlg függvényt külső (external) függvényként és használható is.

function PickIconDlg(hWndOwner: hWnd; szFile: PChar; nMaxCount: integer; var IconIndex: integer): bool; stdcall; external 'shell32.dll' index 62;

Paraméterezése a következő: az első paraméterben kell megadni a hívó ablak azonosítóját, mint szülő ablakét.
Ezután jöhet annak az állománynak a neve, melyből az ikonokat válogatni szeretnénk. Ha itt null sztringet adunk meg, akkor magának a Shell32.dll-nek az ikonjai jelennek meg.
Harmadik paraméterként az előbbi sztringet tároló buffer maximális méretét kell megadnunk.
Végül pedig egy olyan változóra lesz szükségünk, melyben majd visszatérési értékként kapjuk azt, hogy az adott állományból hányadik ikon is lett kiválasztva.

A függvény igaz értékkel tér vissza, ha minden rendben volt a hívásakor és a felhasználó választott is ikont. Ebben az esetben az ExtractIcon függvény hívásával az adott állományból kivonhatjuk a választott ikont és ezt például egy TImage komponens segítségével meg is jeleníthetjük. Ezek után a TImage használatával már bármit megtehetünk a megszerzett képpel, akár állományba is menthetjük.