
A mellékelt példaprogram megnyitása előtt a FontTable.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 komponens Font tulajdonságán keresztül tudjuk beállítani azt a karakterkészletet, amelyet meg kell hogy jelenítsen. Amikor a karaktertáblázatban rákattintunk egy karakterre, akkor az nagyítva megjelenik. Ez azt jelenti, hogy kijelöltük. Minden egyes alkalommal, amikor rákattintunk egy karakterre, létrejön az OnItemClick esemény.
A kijelölt karaktert az alábbi függvénnyel kérdezhetjük le. Ha nincs kijelölt karakter, akkor a függvény ’ ’-t ad eredményül.
function GetSelected: Char;
Egy karakter kijelölését forráskódból is megtehetjük. Ehhez használjuk az alábbi függvényt.
procedure SetSelected(Index : Byte);
A karakter tömb indexelése 0-255 között történik.
A komponens létrehozása
A komponens létrehozásához két osztályra van szükségünk. A TFontTable osztály lesz maga a komponens. Ezt a TCustomPanel osztályból származtatjuk. Ezen a panelen grafikai objektumokat kell elhelyeznünk. Minden egyes betű megjelenítését egy-egy külön objektum valósítja meg. Ehhez létre kell hoznunk a TBox osztályt, amelyet a TGraphicControl osztályból származtatunk.
A TBox osztály
Az osztály FChar mezőjében tároljuk el azt a karaktert, amelyet meg kell majd jelenítenie. A megjelenítés az FFontName változóban megadott betűtípussal történik meg. Szükség van egy OnClick eseményre, amellyel a felhasználó kijelölheti az adott betűt. Amikor egy betű ki van jelölve, megnagyítjuk annak méretét, ezzel látványosan kiemelhetjük őt a többi betű közül. Ehhez szükséges egy LargeSize tulajdonság, amelynek igazra vagy hamisra állításával tudjuk befolyásolni az objektum méretét. A tulajdonsághoz tartozó eljárás állítja be az objektum méretét és az FFontSize változó értékét.
Az objektum megrajzolásához felül kell írnunk a Paint metódust. A rajzolást a TCanvas osztályon keresztül hajtjuk végre. A szöveg kiírását az alábbi kóddal valósítjuk meg.
Canvas.Font.Style:=[];
Canvas.Font.Size:=FFontSize;
Canvas.Font.Name:=FFontName;
Canvas.TextOut(Width div 2 - Canvas.TextWidth(FChar) div 2,Height div 15,FChar);
A kódot egyaránt használhatjuk a kis és a nagy méretű betű kirajzolására, mivel a koordináták helyén megadott méretek relatívak.
A SetChar metódussal állítjuk be az adott karaktert és betűtípust. Amikor a konténer objektum, azaz a TFontTable osztályban megváltozik a betű típusa, ezt az eljárást kell majd meghívnia.
procedure TBox.SetChar(IName: TFontName; IChar: Char);
begin
FFontName:=IName;
FChar:=IChar;
Invalidate;
end;
A TFontTable osztály
Ez az osztály lesz a konténer osztály. Egy FBoxes nevű tömb segítségével tartjuk nyilván az egyes TBox objektumokat. Mivel 256 karakter van egy betűkészletben, egy for ciklus segítségével könnyedén frissíteni tudjuk majd az elemeket.
Ebben az osztályban kell megvalósítanunk a TBox objektumok kirajzolását és tartalmuk frissítésének vezérlését. Szükséges egy Font tulajdonság, amely TFontName típusú. Ezen keresztül lehet majd beállítani a megjelenítendő betűtípust.
Az FBoxes tömböt a Crete metódusban hozzuk létre.
constructor TFontTable.Create(AOwner: TComponent);
begin
inherited;
...
for i:=0 to 255 do begin
FBoxes[i]:=TBox.Create(Nil);
FBoxes[i].Parent:=Self;
FBoxes[i].OnClick:=BoxClick;
FBoxes[i].Left:=1+j*19;
FBoxes[i].Top:=Top;
FBoxes[i].SetChar(FFontName,Chr(i));
Inc(j);
if j=20 then begin
j:=0;
Inc(Top,24);
end;
end;
end;
A SetChar metóduson keresztül, kezdő karakterkészletként az „MS Sans Serif” betűtípust fogjuk beállítani. Az FFontName alapértékként „MS Sans Serif”-et kapott a Create metódus egy korábbi sorában.
Amikor a Font tulajdonság értéke megváltozik, gondoskodnunk kell arról, hogy az egyes TBox objektumok a frissített karakterkészletet jelenítsék meg.
procedure TFontTable.SetFontName(Value: TFontName);
var
i: Byte;
begin
FFontName:=Value;
for i:=0 to 255 do
FBoxes[i].SetChar(Value,Chr(i));
end;
Az egyes TBox elemek méretezését a BoxClick eljárás segítségével irányítjuk. Minden egyes TBox objektum OnClick eseményét erre az eljárásra állítottuk be a Create metódusban. Az alábbiakban a BoxClick metódus teljes kódja látható, részekre bontva.
procedure TFontTable.BoxClick(Sender: TObject);
var
i : Byte;
PrevSender : TObject;
begin
PrevSender:=Nil;
for i:=0 to 255 do
if FBoxes[i].LargeSize then begin
PrevSender:=FBoxes[i];
FBoxes[i].LargeSize:=False;
if (i=19) or ((i-19) mod 20=0) then FBoxes[i].Left:=FBoxes[i].Left+15;
if i in [239..255] then FBoxes[i].Top:=FBoxes[i].Top+10;
end;
Amikor rákattintunk egy TBox objektumra, akkor végig kell mennünk az FBoxes tömbön. Ha ott ki volt nagyítva egy betű, akkor annak méretét vissza kell állítanunk normálra. Ilyenkor meg kell jegyeznünk azt a betűt, amely ki volt nagyítva. Amikor egy olyan betűt nagyítunk ki, amely a jobb szélső oszlopban vagy az alsó sorban helyezkedik el, módosítanunk kell a koordinátáit, hogy elférjenek a Panel területén.
if PrevSender<>(Sender as TBox) then begin
(Sender as TBox).LargeSize:=True;
(Sender as TBox).BringToFront;
if (Ord((Sender as TBox).FChar)=19) or ((Ord((Sender as TBox).FChar)-19) mod 20=0) then
(Sender as TBox).Left:=(Sender as TBox).Left-15;
if Ord((Sender as TBox).FChar) in [239..255] then
(Sender as TBox).Top:=(Sender as TBox).Top-10;
end;
if Assigned(FItemClick) then FItemClick(Self);
end;
A fenti kódnak akkor kell lefutnia, ha egy eddig még nem nagyított állapotban lévő betűre kattintottunk. Ennek a lekezeléséhez volt szükség az előző kódrészletnél arra, hogy a PrevSender változóba eltároljuk az előzőleg kinagyított betűt. Ugyanis ha annak értéke nem egyezik meg azzal az objektummal, amelyre rákattintottunk, akkor egy új betű kinagyításáról van szó.
Az éppen kijelölt karaktert a GetSelected függvénnyel kérdezhetjük le.
function TFontTable.GetSelected: Char;
var
i: Byte;
begin
Result:=' ';
for i:=1 to 255 do
if FBoxes[i].LargeSize then Result:=FBoxes[i].FChar;
end;
Lehetőség van arra is, hogy forráskódból jelöljünk ki egy karaktert. Ezt a SetSelected metóduson keresztül tehetjük meg.
procedure TFontTable.SetSelected(Index: Byte);
var
i : Byte;
begin
for i:=0 to 255 do
if FBoxes[i].LargeSize then begin
FBoxes[i].LargeSize:=False;
if (i=19) or ((i-19) mod 20=0) then FBoxes[i].Left:=FBoxes[i].Left+15;
if i in [239..255] then FBoxes[i].Top:=FBoxes[i].Top+10;
end;
FBoxes[Index].LargeSize:=True;
FBoxes[Index].BringToFront;
end;