
A mellékelt példaprogram megnyitása előtt a HunTownsComboBox.pas-ban és az EUTownsComboBox.pas-ban levő komponenseket telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
Első lépésben létre kell hoznunk a komponensünket, melyet a TComboBox osztályból származtatunk.
THunTownsComboBox = class(TComboBox)
Saját ComboBox-unk annyiban fog eltérni a hagyományostól, hogy előre beállított értékeket fog tartalmazni, esetünkben a városok neveit. Ezen kívül tartalmazni fog egy Execute függvényt is, mely a paraméterként kapott értékek segítségével visszaadja a megfelelő távolságot. A városok közti távolságértékeket egy kétdimenziós tömbben tároljuk, melynek felépítése a következő:
type TMatrix = array[0..33, 0..33] of Integer;
const Distance: TMatrix =
( (0,3180,2940,1585,1785,690,325,200,2385,1440,880,455,945,440,1850,2750,800,2275,340,385,1750,1180,2520,855,1400,470,970,1780,2190,1425,670,1270,1190,875),
...
Az Execute függvény paraméterként kapott értékei alapján kiolvassuk a mátrix megfelelő oszlopát és sorát, majd az ott található távolságértéket visszaadjuk eredményként. A mátrix úgy épül fel, hogy annak egyik felében a magyar, míg a másikban az európai városok adatai vannak eltárolva, és a kettő átlósan van elválasztva egymástól. Éppen ezért figyelnünk kell arra, hogy a paraméterként kapott oszlop és sorszámok közül melyik a nagyobb. Amennyiben az oszlopérték a nagyobb, a mátrixban a pozícionálást vízszintesen, majd függőlegesen végezzük el. Amennyiben a sorszám bizonyul nagyobbnak, a pozícionálás függőleges, majd vízszintes irányú.
function THunTownsComboBox.Execute(Combo1,Combo2: integer): integer;
begin
if Combo1<Combo2 then
Result:=Distance[Combo2,Combo1];
if Combo1>=Combo2 then
Result:=Distance[Combo1,Combo2];
end;
A városok neveinek a feltöltését a ComboBox betöltődésekor végezzük el.
procedure THunTownsComboBox.Loaded;
begin
inherited Loaded;
if not (csDesigning in ComponentState) then
begin
Items.Add('Ártánd');
Items.Add('Barcs');
Items.Add('Békéscsaba');
Items.Add('Budapest');
...
A mellékelt példaprogramot úgy készítettük el, hogy abban egy StringGrid-be feltöltjük a mátrix értékeit, így könnyebben leellenőrizhetjük a komponensek működését. Amikor kiválasztunk két várost, akkor a Grid-ben arra a cellára pozícionálunk, amelyiket éppen kiolvassuk a mátrixból.
A program teszteléséhez a komponenseket párban kell használnunk. Egyikkel a kiindulási várost, míg a másikkal az érkezési várost választhatjuk ki. A ComboBox OnChange eseményéhez kötöttük az Execute függvény meghívását.
procedure TForm1.HunTownsComboBox1Change(Sender: TObject);
begin
Csak abban az esetben hívjuk meg a függvényt, ha mindkét ComboBox-ban ki van választva a város.
if (HunTownsComboBox1.Text<>'') and (HunTownsComboBox2.Text<>'') then
begin
Kiíratjuk a kapott távolságértéket. Figyeljük meg, hogy a függvénynek paraméterként a két ComboBox ItemIndex-ét adjuk át. Ezt azért tehetjük meg, mert a Combo-kban a városok nevei ugyanolyan sorrendben vannak eltárolva, mint azok adatai a távolságmátrixban.
Label1.Caption:='Távolság: '+IntToStr(HunTownsComboBox1.Execute(HunTownsComboBox1.ItemIndex,HunTownsComboBox2.ItemIndex))+' km';
A megfelelő cellára pozícionáljuk a StringGrid-et. Itt is ügyelnünk kell az átlós elrendezésre, akárcsak a komponensünkben. Ezért le kell vizsgálnunk az oszlop és sorértékeket.
if HunTownsComboBox1.ItemIndex<=HunTownsComboBox2.ItemIndex then
begin
StringGrid1.Row:=HunTownsComboBox1.ItemIndex+1;
StringGrid1.Col:=HunTownsComboBox2.ItemIndex+1;
end
else
begin
StringGrid1.Row:=HunTownsComboBox2.ItemIndex+1;
StringGrid1.Col:=HunTownsComboBox1.ItemIndex+1;
end;
end;
end;
A fentiek alapján elmondható, hogy a HunTownsComboBox1 a mátrix oszlopindexét, míg a HunTownsComboBox2 a sorindexét adja paraméterként az Execute függvénynek.
Az európai városokat tartalmazó EUTownsComboBox létrehozása hasonló módszerrel történik, ügyelve az átlós elrendezésre.