Delphi - TListView komponens

TListView 4. rész

forráskód letöltése
Az előző részben kiveséztük az elemek gyűjtőobjektumát, a TListItems-et. Most megismerkedünk az elemek (TListItem) tulajdonságaival, és a hozzájuk tartozó metódusokkal. A mostani részhez tartozó példaprogram az előző programok kombinációja: virtuális listával megvalósított lemezböngésző program, amely egy ötödik - a Windows 2000-ben használatos - stílust, az előnézetet (thumbnail view) is tartalmazza. TListItem objektum

A TListItem tulajdonságai

Caption: string Az elem címkéjének szövegét adja meg.
Checked: boolean Már az első részből ismerős lehet: ha a komponens Checkboxes tulajdonsága igazra van állítva, a Checked adja meg, hogy az adott elem ki van-e pipálva.
Cut: boolean Ha igaz, az adott elem szürkítve jelenik meg. Ilyen, pl. a képen a Bootlog.prv fájl.
Data: pointer A listaelemhez lehet hozzárendelni saját adatokat. Használatára a legjobb példa a harmadik rész példaprogramja. (Megj.: a data tulajdonságot felhasználhatjuk pl. integer típusú adatok tárolására is: Item.data:=pointer(szam); Ennél sokkal elegánsabb egy integer-re mutató pointer átadása, de kétségkívül hatékonyabb.)
Focused: boolean Igaz esetén az adott elem birtokolja az input fókuszt. Egyszerre mindig csak egy elem lehet aktív. (Valamint Item.Listview=Item, ha Item.Focused=true)
Handle: HWND A TListView komponenst azonosító érték, melyet a windows rendel hozzá a komponenshez. Segítségével Windows API rutinokkal is szabályozhatjuk a komponens működését.
ImageIndex: integer Megadja, hogy hányadik kép tartozik a listaelemhez a SmallImages ill. LargeImages által mutatott TImageList-ekből. Ha értéke -1, nincs kép hozzárendelve az elemhez.
Indent: integer Csak akkor értelmezett, ha a komponens ViewStyle tulajdonsága vsReport. Megadja, hogy mennyivel helyezkedik beljebb az adott listaelem, méghozzá a következő képlet szerint: LV.SmallImages.Width*Item.Indent. A tulajdonság alkalmazásával a TTreeView-re hasonlító hatást hozhatunk létre.
Index: integer Az elem sorszámát adja meg. Ne felejtsük, az első elem sorszáma 0.
Left: integer Az elem távolságát adja meg a komponens bal szélétől. Csak akkor értelmezett, ha a komponens ViewStyle tulajdonsága vsIcon vagy vsSmallIcon.
ListView: TCustom ListView A komponenst azonosítja, amelyhez a listaelem tartozik.
OverlayIndex: integer A komponens képes egy második képet is kirajzolni az elemhez, ezt a képet pedig a StateImages által mutatott TImageList-ből veszi. (Figyeljük meg a Windowsban a parancsikonokat! Az a kis nyíl szintén egy ilyen kép.)
Owner: TListItems Azt a TListItems objektumot azonosítja, amelyhez az elem tartozik - azaz: Item.Owner=ListView.Items.
Position: TPoint Az elem pozícióját adja meg a TListView komponens koordinátarendszerében.
Selected: boolean Megadja, hogy az elem ki van-e jelölve. Egynél több elemnél csak akkor lehet igaz, ha a TListView komponens MultiSelect tulajdonsága igaz.
StateIndex: integer Egy második kép, amellyel különféle állapotokat rendelhetünk az elemhez. Ugyanazok érvényesek rá, mint pl. az ImageIndex-re, kivéve, hogy a képet a komponens a StateImages tulajdonság által mutatott TImageLIst-ből veszi. Szintén ezt a tulajdonságot használja a komponens, ha a Checkboxes igazra van állítva. (ld. első rész)
Subitems: TStrings Csak akkor használatos, ha a kompones ViewStyle tulajdonsága vsReport-ra van állítva. Ekkor a második oszloptól kezdődően minden egyes oszlopban megjelenő adat a SubItems egy-egy elemének felel meg. A tulajdonság automatikusan jön létre, és semmisül meg, így programból ne hívjuk meg pl. a Destroy destruktort!A példaprogram a fájlok információit helyezi el a Subitems tulajdonságban.
Top: integer Az elem függőleges pozícióját adhatjuk meg. (Csak ha vsIcon, vagy vsSmallIcon a beállított mód.)

A TListItem metódusai

procedure Assign(Source: TPersistent); override;

Egy másik listaelemet tudjuk vele lemásolni. Használata: <cél elem>.Assign(<forrás elem>);

procedure Delete;

Az adott listaelem törlése. A metódus először eltávolítja az elemet a listából, mielőtt felszabadítaná a Free metódus meghívásával.

function EditCaption: boolean;

A függvény kijelöli az elemet, láthatóvá teszi, majd létrehoz egy szerkesztőt, amellyel az elem címkéjét szerkeszthetjük (Amely tulajdonképpen egy TEdit vezérlő.) A visszatérési érték igaz, ha a függvény hívása sikeres volt.

procedure CancelEdit;

Megszakítja az aktuális szerkesztést, és eldobja a változtatásokat.

function DisplayRect(Code: TDisplayCode): TRect;

type TDisplayCode = (drBounds, drIcon, drLabel, drSelectBounds);

A DisplayRect meghívásával tudunk információt szerezni a listaelem és részeinek elhelyezkedéséről. Ez különösen fontos lehet, ha új kinézetet tervezünk a komponensnek, pl. a harmadik cikk példaprogramja.
A Code paraméter azonosítja, hogy milyen információra van szükségünk:
drBounds: a listaelemet befoglaló téglalap.
drIcon: csak az elem ikonja
drLabel: csak a címke
drSelectBounds: az a rész, amely az elem kijelölésekor más színnel látszik

function GetPosition: TPoint és procedure SetPosition(const Value: TPoint);

A GetPosition-nal az elem pozícióját kérdezhetjük le, míg a SetPosition-nal új pozíciót állíthatunk be. Az x koordináta az elem Left tulajdonságának, míg az y a Top tulajdonságának felel meg.

procedure MakeVisible(PartialOK: Boolean);

Úgy görgeti a lista tartalmát, hogy az adott elem látható legyen. Ha a PartialOk igaz, nem történik görgetés, ha az elem egy kis része - akár csak egy pixelnyi - is látszik.

procedure Update;

Frissíti az elemet, és a változtatások megjelennek a listában is. Általában virtuális listáknál használatos. (pl. az ImageIndex, vagy a Caption megváltoztatása automatikusan frissíti az elemet)


A példaprogramról

Az előnézet

Az előnézet működési elve egy nagyon egyszerű elvet követ.

procedure TfrmDiskBrowser.ModifyEntry(i:integer);
begin
[…]
if not thumbnails then
p^.imageindex:=sfi.iIcon
else
p^.imageindex:=RenderThumbnail(sfi.hIcon,p^.RealName);
[…]
end;
Ha az előnézet az aktív, akkor az ikont a RenderThumbnail függvény állítja elő, különben a normál shell ikont használja. A függvénynek két paramétere van: a fájl ikonjának a leírója (handle) és a fájl elérési útja. A képeket egy private-ként deklarált ilThumbs TImageList tárolja, ugyanúgy, mint a shell ikonokat az ilSmall és az ilLarge. A listához a megfelelő képeket a nézetet váltó metódusok rendelik hozzá.
De térjünk vissza a RenderThumbnail-ra! Az elv a következő. A program az induláskor létrehoz egy pic:TPicture és egy bmp:TBitmap változót, melyek segédváltozó szerepet töltenek be.
Ezeket létrehozhatná a függvény is, de az nagyon lelassítaná a programot, hogy pl. egy több száz fájlt tartalmazó könyvtár esetén mindannyiszor létrehozná, majd felszabadítaná ezt a két objektumot.
Először egy try…except blokkal megpróbálja betölteni képfájlként a paraméterként átadott fájlt.
try
pic.LoadFromFile(fn);
except
pic.Icon.Handle:=im;
end;
A következő történik: ha sikerül betölteni, tehát a fájl egy képfájl, a pic fogja tartalmazni a képet valódi méretében. Ellenkező esetben a pic egy ikon lesz, mivel megkapja az ikon leíróját.
Ezután már csak kozmetikázni kell. Ha a kép nagyobb, mint az előnézet gombja (a thumbnail), akkor kiszámolja a csökkentés mértékét, majd egy StretchDraw hívással kirajzolja a bmp-re. A bmp-n létrehoz egy keretet, majd ez hozzáadja az ilThumbs-hoz, és visszatér a hozzáadott kép indexével.
Az előnézet méretét egy egyszerű beállító ablakkal módosíthatjuk is.

Dokumentumok, fájlok "futtatása"

Ha duplán kattintunk egy könyvtáron, az könyvtárváltásnak felel meg. Ha azonban egy egyéb fájlra kattintunk, és az adott fájltípushoz van valamilyen program hozzárendelve, az elindul. Ezt a ShellExecute függvénnyel lehet elérni.

HINSTANCE ShellExecute(HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile,
LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd);

A hwnd azonosítja a hívó ablakot, ez lehet nil is. Az lpOperation adja meg, hogy milyen műveletet kell a fájllal/könyvtárral végezni. Ez lehet open, ekkor megnyitja a fájlt, explore ez értelemszerűen csak könyvtárakra vonatkozik: ekkor a Windows Intéző indul el az adott könyvtárral, és lehet print ekkor kinyomtatja a fájlt. Az lpFile adja meg az elérési utat. Az lpParameters a paramétereket specifikálja, ez csak akkor használatos, ha az elérési út futtatható fájlt ad meg. Az lpDirectory a kezdőkönyvtárat állítja be, az nShowCmd pedig, hogy az elindított alkalmazás ablaka hogyan legyen látható. A függvény visszatérési értéke sikeres indításkor a dokumentumhoz rendelt alkalmazás leírója, hiba esetén pedig egy hibakód.

TListView cikksorozat