
A mellékelt példaprogram megnyitása előtt a MulTable.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponens használata
A MulTable komponens által megjelenítendő számok és szorzatok beállítását kétféleképpen tehetjük meg. Az egyik, hogy az értéktartományokat egyesével állítjuk be. A ColumnMin és ColumnMax tulajdonságok az oszlopok alsó és felső értékét határozzák meg. A sorok beállításához a RowMin és RowMax property-ket használhatjuk.
A másik lehetőség. A könnyebb beállíthatóság érdekében a komponens rendelkezik egy beállításra szolgáló metódussal.
procedure SetTable(ColMin, ColMax, RowMin, RowMax: Integer);
A SetTable metódus segítségével, egy lépésben beállíthatjuk a szorzótábla által megjelenítendő tartományt. A paraméterek jelentése, sorrendben: oszlop alsó-, oszlop felső-, sor alsó-, sor felső érték.
A Font tulajdonság segítségével állíthatjuk be a megjelenítendő számok betűtípusát. Az oszlop és sor fejlécek mindig félkövéren, a többi szám pedig normál betűstílussal jelenik meg.
A komponens rendelkezik az AutoSize és a Visible tulajdonságokkal, valamint az OnClick, OnDblClick, OnMouseDown, OnMouseMove, OnMouseUp és OnResize eseményekkel.
A komponens elkészítése
Komponensünket a TGraphicControl osztályból származtatjuk.
Az egyes tulajdonságok értékeinek módosulása során, a Set* metódusokban figyelnünk kell arra, hogy a minimum értékek soha ne legyenek nagyobbak a maximum értékeknél.
A Visible tulajdonságot és az eseményeket közvetett módon örököljük a TControl osztálytól, így azok neveit csak fel kell sorolnunk, más teendőnk nincs velük.
A szorzótábla megrajzolásához felül kell írnunk a Paint metódust. Mielőtt azonban elkezdenénk rajzolni, ki kell számolnunk az oszlopok és sorok metszéspontjait, azaz a szorzatokat. A számítási műveleteket a Calculate metódus végzi el, amelyet a Paint-ből hívunk meg.
Nem tudjuk előre, hogy a felhasználó mekkora tartományt ad meg az oszlopok és a sorok esetében. Ezen oknál fogva egy kétdimenziós, dinamikus tömbre van szükségünk, amelyet az alábbi módon deklarálhatunk.
FTable: array of array of LongInt;
A tömb aktuális méretét mindig a Calculate metódusban határozzuk meg, a megadott tartományok alapján.
SetLength(FTable,FColumnMax-FColumnMin+1,FRowMax-FRowMin+1);
A tömböt egy dupla for ciklus segítségével tudjuk feltölteni értékekkel. A tömb első koordinátája az oszlopot, a második a sort jelenti. Miközben kiszámoljuk az egyes értékeket, folyamatosan meg kell vizsgálnunk, hogy az éppen beírt szám milyen szélességgel fog rendelkezni a kirajzolás során. A szorzatok kiszámolása közben fel kell jegyeznünk a legszélesebb helyet foglaló szám szélességét, hiszen olyan cellaméretet kell kialakítanunk, amelybe minden szám belefér. A legszélesebb értéket az FMaxWidth változóba mentjük el.
Egy szöveg szélességét a TCanvas osztály TextWidth metódusával határozhatjuk meg.
w:=Canvas.TextWidth(IntToStr(FTable[i-FColumnMin,j-FRowMin]));
Ha megvagyunk a számításokkal, folytathatjuk a Paint metódust. Most már rendelkezésünkre áll az FTable tömb, a kiszámolt értékekkel, valamint tudjuk a maximális cellaszélességet is.
A maximális szélességhez adjunk még hozzá 5-öt, hogy maradjon hely a cellában a szám két oldalán. Szükségünk van a kirajzolandó cellák maximális magasságára is, ezt a MaxHeight változóba mentjük el.
MaxHeight:=Canvas.TextHeight('1')+4;
A maximális magasság meghatározásakor a TextHeight metódusnak bármilyen számot értékül adhatunk, hiszen a számok magassága egyforma.
A megjelenítendő oszlopok és sorok száma alapján meg kell határoznunk a táblázat szélességi és magassági adatait.
w:=(FColumnMax-FColumnMin+2)*FMaxWidth+2;
h:=(FRowMax-FRowMin+2)*MaxHeight+2;
Ha az AutoSize property értéke igaz, akkor ezeket a méreteket a komponensnek is fel kell vennie.
A rácsozatot, az oszlop és sor fejléceket egy-egy for ciklus segítségével és némi koordinátaszámolással könnyedén megrajzolhatjuk.
Az egyes szorzatok kirajzolásához két, egymásba ágyazott for ciklusra van szükség.
Fontos, hogy a megjelenítendő feliratok a cellán belül minden irányban középre essenek. Egy adott felirat helyét az adott cella koordinátái és szélessége, valamint a felirat szélessége és magassága alapján ki tudjuk számolni.