Mint kiderült a komponens stílusát be lehet állítani lbOwnerDrawVariable típusra, és így már leprogramozható, hogy képek is kerüljenek a lista soraiba. Ehhez a Listbox két eseményét kellett megírjam. Az egyik az OnMeasureItem, amit lényegében csak arra használok, hogy beállítsam a lista sormagasságát. Illetve mivel egy ImageList is lett a Formra dobva, ebben ugyanis kényelmesebb az ikonokat tárolni, így ennek a magasságát vettem alapul a Listbox sormagasságának beállításához. A kód így alakult:
A másik esemény, az OnDrawItem, amely a kirajzolást végzi, egy hangyányit komplikáltabb, de ez sem veszélyes. Ami okozott egy kis meglepetést, hogy fel kellett vegyek egy külön változót az állapot tárolására a Listbox minden egyes sorához, mert ha ezt nem teszem, akkor minden egyes kirajzolásnál az utolsó beállított dizájn fog megjelenni a lista minden egyes során. Ami sajnos nem jó, lévén valahogy jelezni kell, ha valamelyik fájl MD5 ellenőrző összege nem egyezik meg a hasheket tartalmazó fájlban foglaltakkal. A kód ezért így alakult:
Mint az látható a fState nevű tömb az, ami az egyes sorok állapotát tárolja és ennek függvényében van beállítva az egyes sorok háttérszíne (Canvas.Brush.Color), illetve az ImageList Draw eljárása is ennek függvényében rajzol ki más más ikont a lista sorainak elejére. A CenterText változóban kiszámoljuk, hogy mennyit kell majd hozzáadni a lista adott sorában a szöveg tetejéhez, hogy az középre essen. A szöveg kiírásáért a Canvas.TextOut sor felel.
A program természetesen még közel sincsen kész, ez csak amolyan "tech demo", hogy kipróbáljam, hogy mit lehet kihozni belőle. Kellemes dolog, hogy a Lazarus ilyesmire is képes és nem egy ördöngösség a megvalósítás.
Végezetül álljon itt egy rövid videó, hogy a "tech demo" hogy vizsgázott egy próba alkalmával (a youtube-on megtekinthető jobb minőségben is a videó).
Nincsenek megjegyzések:
Megjegyzés küldése