Delphi - SI-n kívüli mértékegységeket SI egységekre konvertáló komponens

forráskód letöltése
A Nemzetközi Mértékegység-rendszer, az SI meghatároz hét alap-mértékegységet, valamint két kiegészítő-egységet, melyekből minden más mértékegység valamilyen módon származtatható. Ebben a cikkben készítünk egy olyan komponenst, amely képes jó néhány SI-n kívüli mértékegységet átváltani az SI szabványnak megfelelő értékké.
A mellékelt példaprogram megnyitása előtt a ConvertPanel.pas-ban levő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
Komponensünket egy TCustomPanel osztályból származtatjuk, melyen három Edit és egy ComboBox fog elhelyezkedni. Mindezeket akkor hozzuk létre, amikor a komponensünk betöltődik.
procedure TConvertPanel.Loaded;
begin
  inherited;
A ValueEdit nevű EditBox-ban kérjük be az átváltandó értéket. Beállítjuk a Panel szélétől és tetejétől való távolságát, valamint a szélességét. Mivel nem szeretnénk, ha bármi is lenne benne induláskor, ezért a Text property-jét üresre állítjuk.
  ValueEdit:=TEdit.Create(Nil);
  ValueEdit.Parent:=Self;
  ValueEdit.Left:=20;
  ValueEdit.Top:=20;
  ValueEdit.Text:='';
  ValueEdit.Width:=100;
A Combo-ban fogjuk eltárolni az SI-n kívüli mértékegységeket. Először beállítjuk, hogy a ValueEdit mellett jelenjen meg a komponensen, azzal egy magasságban. Ezután feltöltjük a mértékegységek neveivel az Items property-n keresztül. Végül a Sorted tulajdonságát igazra állítjuk, így az adatok ABC sorrendbe rendezve jelennek meg a ComboBox-ban.
  Combo:=TComboBox.Create(Nil);
  Combo.Parent:=Self;
  Combo.Left:=ValueEdit.Left+ValueEdit.Width+10;
  Combo.Top:=ValueEdit.Top;
  Combo.Text:='';
  Combo.Width:=200;
  Combo.Items.Add('fok [°]');
  Combo.Items.Add('szögperc [´]');
  Combo.Items.Add('szögmásodperc [´´]');
...
  Combo.Sorted:=True;
A fentiekhez hasonló módon beállítjuk a ResultEdit és ResultUnit Edit dobozok megjelenésének paramétereit is. Mindkettő ReadOnly tulajdonságát igazra állítjuk, hogy ne lehessen megváltoztatni a tartalmukat.
  ResultEdit:=TEdit.Create(Nil);
  ResultEdit.Parent:=Self;
  ResultEdit.Left:=ValueEdit.Left;
  ResultEdit.Top:=ValueEdit.Top+30;
  ResultEdit.Text:='';
  ResultEdit.Width:=100;
  ResultEdit.ReadOnly:=True;
  ResultUnit:=TEdit.Create(Nil);
  ResultUnit.Parent:=Self;
  ResultUnit.Left:=ResultEdit.Left+ResultEdit.Width+10;
  ResultUnit.Top:=ValueEdit.Top+30;
  ResultUnit.Text:='';
  ResultUnit.Width:=200;
  ResultUnit.ReadOnly:=True;
A végén meghívjuk a Paint metódust, mely kirajzolja a Form-ra a Panel-t.
  Paint;
end;
A ConvertPanel Caption tulajdonságát, valamint magassági és szélességi értékeit beállítjuk, mielőtt kirajzolnánk azt a Form-ra.
procedure TConvertPanel.Paint;
begin
  Caption:='';
  Width:=350;
  Height:=90;
  inherited;
end;
Létrehozunk egy Convert nevű függvényt, melyet programból meghívhatunk. Ebben levizsgáljuk a ValueEdit és a Combo tartalmát, és azoknak megfelelően elvégezzük a konverziót.
procedure TConvertPanel.Convert;
begin
  if (ValueEdit.Text<>'') and (Combo.Text<>'') then
  begin
    if Combo.ItemIndex=0 then
      begin
        ResultEdit.Text:=FloatToStr(StrToFloat(ValueEdit.text)*101325);
        ResultUnit.Text:='Pascal [Pa]';
      end;
    if Combo.ItemIndex=1 then
      begin
        ResultEdit.Text:=FloatToStr(StrToFloat(ValueEdit.text)*100000);
        ResultUnit.Text:='Pascal [Pa]';
      end;
    if Combo.ItemIndex=2 then
      begin
        ResultEdit.Text:=FloatToStr(StrToFloat(ValueEdit.Text)*1.496)+' *10^11';
        ResultUnit.Text:='méter [m]';
      end;
...
A mellékelt példaprogramban nem kell mást tennünk, mint meghívni a fenti függvényt az alábbi módon.
ConvertPanel1.Convert;
Az eredmény közvetlenül a komponens ResultEdit illetve ResultUnit Edit dobozaiban fog megjelenni.