
A mellékelt példaprogram megnyitása előtt a GasMeter.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A GasMeter komponens Value tulajdonságában adhatjuk meg a megjelenítendő értéket. Az itt megadható szám Double típusú. A komponens 6 helyi értéket használ az érték megjelenítésére, ebből adódóan a maximálisan megadható szám 999999.
Az óra hátterének színét a BackColor, a számlapok színét a ForeColor tulajdonságok segítségével adhatjuk meg. A számlapokon megjelenő számok betűtípusát a Font property-n keresztül módosíthatjuk.
A komponenst a TGraphicControl osztályból származtatjuk.
A gázórákhoz hasonló kijelzőkön, egy helyi értéken maximum két szám látható egyszerre, ha az óra görgője éppen két szám között áll. Ilyenkor mindig a felső számot kell néznünk, amíg az el nem tűnik.
Ahhoz, hogy a komponenssel folyamatos görgetést tudjunk biztosítani, elegendő helyi értékenként két számlapot elkészítenünk. Ennek a két számlapnak a Top koordinátáját és az általuk megjelenített számokat folyamatosan frissítjük. Mivel a számlap szélessége függ a komponens Width tulajdonságától, azt nem kell eltárolnunk. Elegendő a számlapon megjelenítendő számot és a lap Top koordinátáját megjegyeznünk. Ehhez létrehozunk egy új típust.
TCards = record
Top: Integer;
Number: Char;
end;
A számlapokat egy kétdimenziós tömbben tároljuk el. Az első index az oszlopot, a második a sort jelenti.
FCards: array[1..6,1..2] of TCards;
A komponens megrajzolásához felül kell írnunk a Paint metódust. A megjelenítést két részre bontjuk, előkészítésre és kirajzolásra. A Paint metódusban meghívjuk a SetCards metódust, amely beállítja a szükséges számokat a számlapokra, valamint a lapok Top koordinátáit, ezzel elvégezve az előkészítési fázist.
Procedure SetCards;
A Value tulajdonságban megadott szám tartalmazhat egész vagy tört értékeket egyaránt. A komponens csak az egész részt jeleníti meg, de az utolsó helyi értéken szereplő számlapra hatással van a tört rész is.
A Value property-ben megadott szám egész részét, sztring formában eltároljuk a Decimal változóban. A változó tartalmát balról feltöltjük 0 karakterekkel, hogy mérete pont 6 karakter legyen. Így egy for ciklus segítségével könnyedén beállíthatjuk az első sor számértékét.
FCards[i,1].Number:=Decimal[i];
A második sorban elhelyezkedő számlapoknak eggyel nagyobb számot kell megjeleníteniük, mint az első sornak.
if Ord(Decimal[i])<57 then
FCards[i,2].Number:=Chr(Ord(Decimal[i])+1)
else
FCards[i,2].Number:='0';
A számok meghatározásakor kihasználjuk azt, hogy az ASCII kódtáblában a számok 0-9 sorrendben egymás után helyezkednek el.
A számok beállításával kész vagyunk, most meg kell határoznunk, hogy az egyes számlapokból mennyi rész legyen látható. A Decimal változó tárolja az egész részt, a d változóba eltároljuk a tört részt.
d:=FValue-StrToFloat(Decimal);
A számlapok magasságát a komponens Height tulajdonságának függvényében határozzuk meg, úgy hogy alul és felül is még 3 képpontnyi sáv maradjon. A lapokat a 3 sortól kezdjük majd kirajzolni.
A d változóban eltárolt tört rész az utolsó helyi értéken lévő számlap megjelenésére van hatással.
FCards[6,1].Top:=3-Round(CardHeight*d);
A maradék 5 számlap helyzete mindig csak a mögötte lévő értékétől függ.
for i:=5 downto 1 do
FCards[i,1].Top:=3-Round(CardHeight/10*StrToInt(FCards[i+1,1].Number));
Ezzel meghatároztuk az első számlapsor Top koordinátáit. A második sor tetejének mindig egy CardHeight magassággal kell lejjebb lennie.
Miután minden adatot előkészítettünk, a Paint metódusban csak meg kell rajzolnunk a kijelzőt.
A koordináták számolásánál itt is be kell kalkulálnunk, hogy a számlapok körül 3 képpont szabadon maradjon a háttérnek. Az egyes helyi értékek között 2 képpontot hagyunk ki.