A mellékelt példaprogram megnyitása előtt az OwnerDrawProperty.pas-ban lévő property szerkesztőt telepítenie kell a Delphi alá.
A példához nem készítünk saját komponenst, csak egy property szerkesztőt a TCustomForm osztály WindowState property-jéhez. Ez egy TWindowState típusú property, amely felsorolt típus, tehát az egyszerű begépelésen kívül egy legördíthető listából is kiválaszthatjuk a beállítani kívánt értéket. A property szerkesztőnkben a lista és a beállított érték megrajzolásáról mi gondoskodunk úgy, hogy az érték előtt megjelenítjük hozzá tartozó gomb képét.
Mivel a property felsorolt típusú, az új property szerkesztőt a TEnumProperty osztályból kell származtatni. Az új osztályban csak két eljárást kell felülírnunk. Az első a ListDrawValue, ami a legördített lista elemeit rajzolja meg, a második pedig a PropDrawValue, ami a kiválasztott értéket jeleníti meg. Mivel mindkét eljárásban ugyanazt a megjelenítést alkalmazzuk, készítünk egy eljárást, amely a rajzolást elvégzi a paraméterként megadott Canvas-ra.
Nézzük először a ListDrawValue eljárást:
ListDrawValue
Osztály: TPropertyEditor
procedure ListDrawValue(
const Value: string;
ACanvas: TCanvas;
const ARect: TRect;
ASelected: Boolean
);
Az eljárás minden egyes elemnél külön meghívódik, tehát mindig csak az aktuális elem kirajzolásával kell foglalkozni.
Paraméterek
const Value: string
Ebben a paraméterben kapjuk meg a megjelenítendő értéket.
ACanvas: TCanvas
A legördített lista Canvas objektuma, amire a rajzolást el kell végezni.
const ARect: TRect
Ebben a paraméterben a lista elem befoglaló téglalapjának koordinátáit kapjuk meg.
ASelected: Boolean
A paraméter értéke igaz, ha az elem kiválasztott, és hamis, ha nem. A paraméter felhasználására csak speciális esetben lesz szükség, mivel a helyes megjelenítés akkor is megtörténik, ha mi nem gondoskodunk róla a terület törlésével, színek beállításával, stb.
A másik eljárás nagyon hasonlít az előzőhöz:
PropDrawValue
Osztály: TPropertyEditor
procedure PropDrawValue(
ACanvas: TCanvas;
const ARect: TRect;
ASelected: Boolean
);
Mint látható, ennek kevesebb paramétere van, hiszen a Value paraméterre itt nincs szükség, mivel a megjelenítendő érték a Value property-ből kiolvasható.
Paraméterek
ACanvas: TCanvas
A Canvas objektum, amire az értéket meg kell rajzolni. Ez az Object Inspector második oszlopának a property-hez tartozó mezőjébe történik meg.
const ARect: TRect
A mező befoglaló téglalapjának koordinátái. Erre a területre rajzolhatunk.
ASelected: Boolean
A paraméter értéke igaz, ha a property a kiválasztott, és hamis, ha nem.
Most nézzük meg, hogy a konkrét példát hogyan oldottuk meg. A fent említett két eljárásban nem teszünk mást, mint meghívjuk a DrawValue eljárást. Ez egy saját eljárás, tehát a szülő osztályokban ez nem található meg. Az eljárás deklarációja a következőképpen néz ki:
procedure DrawValue(const Value: string; ACanvas: TCanvas; const ARect: TRect);
Megkapjuk tehát a megjelenítendő értéket (Value), a Canvas objektumot (ACanvas) és a területet, ahová rajzolnunk kell (ARect).
A WindowState property értékeihez tartozó képeket megtaláljuk a Marlett betűkészletben, a Windows is ezt használja. A WindowStateValues egy tömb property, amely egy listát tartalmaz, melyben megtalálhatók a WindowState property lehetséges értékei és a hozzájuk tartozó karakterek a Marlett betűkészletből. Az elem megrajzolása egyszerűen a Canvas objektum eljárásaival és objektumaival történik.
Ebben a részben a megjelenítés „testre-szabásának” csak a legegyszerűbb eseteit néztük át. A következő részben a további lehetőségeket vizsgáljuk meg.