
A mellékelt példaprogram megnyitása előtt az SrcImageList.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
Komponensünket tehát a TImageList osztályból származtatjuk. Kibővítjük a Directory, Files és SearchSub tulajdonságokkal.
A Directory tulajdonságban állíthatjuk be annak a könyvtárnak az elérési útját, amelyben keresni szeretnénk. A Files tulajdonságban két választási lehetőségünk van. Választhatunk, hogy BMP vagy ICO képeket szeretnénk keresni. A SearchSub tulajdonság igazra vagy hamisra állításával állíthatjuk be az alkönyvtárakban történő keresést.
Amikor felhasználjuk a komponenst, figyelni kell arra, hogy olyan könyvtárat adjunk meg, amelyben egyforma méretű képek vannak. A TImageList osztály ugyanis csak egyforma méretű képek tárolására alkalmas.
A képek beállításához hozzunk létre egy új típust.
type TFiles = (BMP, ICO);
Amikor módosul a Files tulajdonság értéke, akkor a kiválasztott kép típusnak megfelelő kiterjesztést eltároljuk az FExtension változóba.
procedure TSrcImageList.SetFiles(Value: TFiles);
begin
FFiles:=Value;
if Value=BMP then FExtension:='.bmp'
else FExtension:='.ico';
end;
end;
Az FExtension változó tartalmát a ScanFiles eljárásban használjuk fel.
A keresés megvalósításához a TImageList osztályt bővítenünk kell egy új metódussal is. Amikor a felhasználó beállította a kereséshez szükséges tulajdonságokat, akkor nincs más dolga, mint meghívni a Search metódust. A Search metódus a háttérben meghívja a ScanFiles metódust. A ScanFiles metódus hajtja végre a tényleges keresést.
ScanFiles metódus
procedure TSrcImageList.ScanFiles(Dir: String);
Szükségünk van egy Picture, TPicture típusú objektumra, amelybe az éppen megtalált képet fogjuk ideiglenesen beolvasni.
A kereséshez a FindFirst – FindNext párost használjuk. Ha a keresés során egy könyvtárat találunk és a SearchSub metódus értéke is igazra van állítva, akkor rekurzív módon meghívjuk a ScanFiles eljárást, melynek paramétereként a megtalált könyvtár nevét adjuk.
if FSearchSub and (F.Name[1]<>'.') then ScanFiles(Dir+F.Name);
Ha egy képet találtunk, akkor azt beolvassuk és elmentjük a képlistába.
if LowerCase(ExtractFileExt(F.Name))=FExtension then begin
try
Picture.LoadFromFile(Dir+F.Name);
if FFirst then begin
Width:=Picture.Graphic.Width;
Height:=Picture.Graphic.Height;
FFirst:=False;
end;
if Files=BMP then Add(Picture.Bitmap,Picture.Bitmap)
else AddIcon(Picture.Icon);
except
end;
end;
A fenti kódban feldolgozás szempontjából különbséget kell tennünk BMP és ikon között, ezért különböző függvényt használunk a beolvasásukra.
Az FFirst egy globális változó, logikai típussal. Értékét a Search metódus állítja igazra. A TImageList osztály, így komponensünk is, csak egyforma méretű képek tárolására alkalmas. Az első beolvasott kép méretét fogja felvenni a komponens. Ha a méretezés megtörtént, akkor az FFirst értéke hamis lesz és a méretező algoritmus nem fut le többet az aktuális keresésben.