Delphi - Komponens fejlesztés haladóknak

4. rész

forráskód letöltése
Komponens fejlesztés rovatunkban a múlt héten létrehoztunk egy komponenst, melynek egy olyan property-e volt, amely nem egy egyszerű adattípus, hanem egy általunk készített tetszőleges osztály. Erre jó példa, ha megnézzük például a TForm Font property-t, az szintén egy osztály típusú property.

Ha megfigyeljük a TFont típusú property-k esetében, hogy ha a property-re kattintunk, akkor egy kis nyomógomb jelenik meg amelyet kiválasztva kapunk egy dialógus ablakot, ahol a TFont minden jellemző értékét könnyedén beállíthatjuk.

Visszatérve a múlt heti példánkhoz, ott erre nem volt lehetőségünk, kénytelenek voltunk az Object Inspectoron keresztül megadni a NewClass nevű újonnan létrehozott property-nk adatait.

Ebből a cikkből megtudhatjuk, hogy miként tudunk egy saját osztályhoz (jelen esetben a TNewClass-hoz) mi is egy tetszőleges dialógus ablakot készíteni, hogy az adatbevitel azon keresztül is megtörténhessen, pont úgy, mint ahogy a TFont típusú property-knél is használhatjuk. Komponens fejlesztés rovatunkban a múlt héten létrehoztunk egy komponenst, melynek egy olyan property-e volt, amely nem egy egyszerű adattípus, hanem egy általunk készített tetszőleges osztály. Erre jó példa, ha megnézzük például a TForm Font property-t, az szintén egy osztály típusú property.

Ha megfigyeljük a TFont típusú property-k esetében, hogy ha a property-re kattintunk, akkor egy kis nyomógomb jelenik meg amelyet kiválasztva kapunk egy dialógus ablakot, ahol a TFont minden jellemző értékét könnyedén beállíthatjuk.

Visszatérve a múlt heti példánkhoz, ott erre nem volt lehetőségünk, kénytelenek voltunk az Object Inspectoron keresztül megadni a NewClass nevű újonnan létrehozott property-nk adatait.

Ebből a cikkből megtudhatjuk, hogy miként tudunk egy saját osztályhoz (jelen esetben a TNewClass-hoz) mi is egy tetszőleges dialógus ablakot készíteni, hogy az adatbevitel azon keresztül is megtörténhessen, pont úgy, mint ahogy a TFont típusú property-knél is használhatjuk.

A példaprogram megnyitása előtt a SampleComponent3.pas-ban lévő komponenst előbb telepíteni kell a Delphi-be.

Mivel ez a példa a múlt hetire épül, így a SampleComponent3.pas teljesen megegyezik az akkori SampleComponent2.pas-al, valamint a NewClass.pas-ban lévő osztály is ugyanaz. Ezért itt most ezek ismertetését nem ismételjük meg.

Nézzük inkább azt, hogy miként tudunk egyedi property szerkesztő dialógus ablakot létrehozni.

Ehhez két dologra lesz szükségünk az eddigi állományokon kívül. Az egyik, hogy létre kell hoznunk magát a dialógus ablakot, amelyben majd a TNewClass két property-t (IntProp, StrProp) szerkeszthetjük. Második lépésként pedig létre kell hoznunk egy ún. property editor osztályt. Hogy mi is ez arról majd később, most nézzük a dialógus ablakot.

Ennek a forráskódja a NewClassPropertyDlg.pas-ban található.

Különösebb tennivalónk nincs is. Létrehozzuk a Form-ot, beállítjuk, hogy dialógus ablakként működjön, felteszünk rá két TEdit-et, melyben majd a property-k szerkesztése történik és végül két nyomógombot is elhelyezünk az adatbevitel lezárásához.

Ezzel a dialógus ablakkal kész is vagyunk. Persze a példa nem teljes, hiszen ellenőriznünk kellene kilépés előtt, hogy az IntProp property-hez tartozó TEdit-be a felhasználó olyan értéket írt-e be, ami konvertálható lesz majd integer típussá, mivel ez a property is ilyen típusú.

Nézzük most a property editor osztály létrehozását. Ennek forráskódja a NewClassPropertyEditor.pas-ban található.

Ha olyan komponenst hozunk létre, melyben ilyen sajátságos property-t használunk, akkor ehhez létre kell hoznunk egy property szerkesztőt is. Ez abból áll, hogy egy már meglévő property szerkesztő osztályból származtatunk egy újat és kiegészítjük a számunkra szükséges funkciókkal.

Ebben az osztályban felülírjuk az ős osztály Edit, illetve GetAttributes eljárásait.

A GetAttributes-t akkor fogja meghívni a Delphi, amikor szüksége lesz arra az információra, hogy milyen attribútumokkal is rendelkezik a property-nk. Ez leginkább akkor szükséges, mikor az Object Inspectoron keresztül hozzá akarunk férni a property-hez.

Itt nincs más dolgunk, mint a függvény visszatérési értékének az alábbi konstansok közül válogatva a megfelelő értékeket visszaadni.

paValueList - a property-nk egy felsorolt lista
paSortList - ez a felsorolt lista ABC szerint rendezett lesz
paSubProperties - a property-nk tartalmaz újabb property-ket (ekkor fog megjelenni a + jel a property neve előtt)
paDialog - a property-nkhez tartozik szerkesztő dialóg ablak (ekkor jelenik meg a property-nél jobb oldalon a nyomógomb, mellyel megnyithatjuk a szerkesztő ablakot)
paMultiSelect - ha ezt a konstanst is megadjuk, akkor ez a property látható marad abban az esetben, ha a Delphi-ben egyszerre több komponenst is kiválasztunk, így egyszerre többnél is beállíthatjuk ennek a property-nek az értékét
paAutoUpdate - ha ez a konstans is adott, akkor amikor változtatjuk a property értékét, az automatikusan és folyamatosan megjelenik a komponensen is, ilyen például a TLabel Caption property-e
paReadOnly - ez a property az Object Inspector-ban nem lesz szerkeszthető (ez nem jelenti azt, hogy ha ennek a property-nek vannak más property-ei is (paSubProperties), akkor azok sem szerkeszthetők)


A másik felülírt eljárás az Edit. Ezt akkor fogja a Delphi meghívni, amikor szerkeszteni kell az adott property-t. Jelen esetben ez akkor fog bekövetkezni, amikor a szerkesztő dialógra szükség van.
Ekkor a menet a következő:
- létrehozzuk a dialóg ablakot
- értéket adunk egy átmeneti változónak, melynek típusa megegyezik a szerkesztett property típusával, ehhez GetOrdValue függvényt használjuk
- megjelenítjük a szerkesztő ablakot
- ennek bezárása után vizsgáljuk, hogy OK-val történt-e a kilépés
- ha igen, akkor és csak akkor megváltoztatjuk a property-nk értékét arra, amit a felhasználó az ablakba beírt
- és végül megszüntetjük az ablakot



Legvégső lépésként még egy teendőnk van azért. Ahhoz, hogy az így létrehozott property szerkesztőről maga a Delphi is tudjon, értesítenünk kell. Ez abból áll, hogy amikor a komponensünket a Register eljárással installáljuk, akkor a property editor-t is meg kell adnunk a RegisterPropertyEditor eljárás meghívásával.

Ezek után, ha megtörtént a komponens telepítése a Delphi-be már is kipróbálhatjuk a property szerkesztőt, kattintsunk a komponens új property-ére és nézzük meg, hogy működik-e a szerkesztő ablakon keresztüli adatbevitel. Ha mindent jól csináltunk, akkor igen.

Komponens fejlesztés haladóknak cikksorozat