HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Magyar és európai városok távolságát kiszámító komponens készítése


Példaprogram letöltése

13534 bájt

Különböző naptárakban, autós térképeken találkozhattunk már olyan táblázattal, melyből két város távolságát lehet megtudni km-ben. Mai cikkünkben ugyanezt valósítjuk meg, így készítünk két komponenst, melyek segítségével 34 magyar és ugyanennyi európai város távolságát tudhatjuk meg. A komponensek külön-külön is használhatók.

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.

Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2003 évkönyv 524. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |