HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

DirListBox komponens készítése ikonokkal


Példaprogram letöltése

5527 bájt

A DirListBox egy olyan komponens, amely a Windows Intézőhöz hasonlóan képes megjeleníteni egy megadott mappa tartalmát, úgy, hogy közben az egyes mappákhoz és állományokhoz hozzárendelt ikonokat is megjeleníti. Így a könyvtártartalom megjelenítése sokkal látványosabbá tehető. A komponens lehetőséget biztosít a mappák és a könyvtárak megjelenítésének ki- és bekapcsolására, valamint kis és nagy ikonok használatára.

A mellékelt példaprogram megnyitása előtt a DirListBox.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponens a TCustomListBox osztályból származik. Rendelkezik egy Dir tulajdonsággal, amelyen keresztül megadható annak a mappának az elérési útja, amelynek tartalmát meg szeretnénk jeleníteni. A ShowDir és ShowFile logikai típusú tulajdonságok igazra vagy hamisra állításával állíthatjuk be a mappák és állományok megjelenítését. Ha mindkét tulajdonság igazra van állítva, akkor a mappák és az állományok is megjelennek, ugyanúgy, mint az intézőben. Először a mappák ABC rendben, majd az állományok, szintén ABC rendben.
A GreatIcons logikai típusú tulajdonság igazra vagy hamisra állításával befolyásolhatjuk a megjelenő ikonok méretét. Igaz érték esetén nagy méretű ikon látható.
A ListBox-ban szeretnénk képeket megjeleníteni, erre azonban a ListBox csak úgy önmagától nem képes. A Style tulajdonságát át kell állítanunk lbOwnerDrawFixed-re vagy lbOwnerDrawVariable-ra, attól függően, hogy nagy, vagy kis ikonokat akarunk használni. A Style tulajdonság értékének megváltoztatása azzal jár, hogy ezután nekünk kell gondoskodnunk az elemek megjelenítéséről. Ehhez felül kell írnunk a DrawItem és a MeasureItem metódusokat.
Először fel kell töltenünk a listát, az adott mappa tartalmával. Ezt meg kell tennünk minden egyes alkalommal, amikor a Dir, ShowDir vagy a ShowFile tulajdonságok értéke megváltozik. A lista feltöltését a ScanFiles eljárás fogja végrehajtani.
A ScanFiles eljárás
Először tennünk kell néhány biztonsági intézkedést, hogy a komponens le tudja kezelni a hibásan megadott Dir tulajdonságot.
if FDir='' then Exit;
if FDir[Length(FDir)]<>'\' then FDir:=FDir+'\';
A mappa tartalmának beolvasását két részre kell bontanunk, mappák és állományok beolvasására. Mindkettő beolvasása egy TStringList típusú változóba történik, melynek segítségével könnyedén rendezhetjük listánk tartalmát és az elemeket csak a rendezés után fogjuk az Items tulajdonságba átmásolni. A beolvasáshoz a FindFirst - FindNext párost használjuk. Kezdjük a mappákkal.
i:=0;
if FShowDir then begin
   if FindFirst(FDir+'*.*',faDirectory, F)=0 then begin
      repeat
        if (F.Name<>'.') and (F.Name<>'..') and ((F.Attr and faDirectory)=faDirectory) then begin
           DirList.Add(F.Name);
           Inc(i);
        end;
      until (FindNext(F)<>0) or (i=32000);
      FindClose(F);
   end;
end;
DirList.Sort;
A beolvasás tartalmát a DirList változóban tároljuk ideiglenesen. Az i változóval megszámoljuk a beolvasott elemek számát. A ListBox Integer számú elemet tud tárolni. Ha elérjük ezt a határt (kb. 32 000), nem olvasunk be több elemet. A beolvasott listát a DirList.Sort metódussal rendezzük.
Az állományok beolvasásának algoritmusa ugyanaz, mint a mappáké, csak a keresési feltétel más.
if FindFirst(FDir+'*.*',faHidden+faSysFile+faArchive, F)=0 then
Ikon beolvasása
Icon.Handle:=ExtractAssociatedIcon(Application.Handle,PChar(FDir+Items[Index]),x);
Az ikon képét kétszer kell beolvasnunk. Egyszer a MeasureItem és egyszer pedig a DrawItem metódusban. A MeasureItem metódus csak akkor hajtódik végre, ha a GreatIcons tulajdonság értéke igaz (azaz Style= lbOwnerDrawVariable).
DrawItem metódus
Ez a metódus rajzolja ki a ListBox éppen látható elemeit. Az ikon képét az ExtractAssociatedIcon függvény segítségével tudjuk beolvasni. Egy ikon TIcon mérete nem változtatható meg, ezért át kell a képet konvertálnunk Bitmap-pé.
with Bitmap do
  begin
    Height:=Icon.Height;
    Width:=Icon.Width;
    Canvas.Draw(1,1, Icon);
    if FGreatIcons=False then begin
StretchBlt(Bitmap.Canvas.Handle,0,0,15,15,Bitmap.Canvas.Handle,0,0,Width,Height,SRCCOPY);
       Height:=15;
       Width:=15;
    end;
  end;
Ha a GreatIcons tulajdonság értéke hamis, akkor az ikont 16x16-os méretben jelenítjük meg. A méret megváltoztatása a StretchBlt eljárással történik.
Ezután nincs más dolgunk, mint az ikon képét és az állományneveket megjeleníteni a ListBox-ban.
Canvas.Draw(Rect.Left+2, Rect.Top+1, Bitmap);
if FGreatIcons then
   Canvas.TextOut(Bitmap.Width+4, Rect.Top+Bitmap.Height div 3, Items[Index])
else Canvas.TextOut(22, Rect.Top+2, Items[Index]);

Cikksorozat

#IDKategóriaCikk címeSorozat
3047WindowsAz XML bemutatása1. rész
3059WindowsAz XML bemutatása2. rész
3068WindowsAz XML bemutatása3. rész
3077WindowsAz XML bemutatása - deklarációk4. rész
3086WindowsAz XML bemutatása - MSXML, XSLT5. rész
3094WindowsAz XML bemutatása - DTD6. rész
3105WindowsXML adatok megjelenítése Excel-ben7. rész
3114WindowsDokumentum hivatkozások az XML-ben8. rész
3123WindowsXML adattípusok9. rész
3132WindowsXML adatok HTML oldalakon10. rész
3141WindowsXML Notepad11. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2002 évkönyv 656. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |