Konwerter jednostek.

0

Witam. Ostatnio napisalem taki prosty konwerter jednostek w Pascalu. Chcialem go napisac w Delphi ale nie wiem jakich uzyc do tego komponentow. Czy ktos moglby mi doradzic jak to zrobic, nie chce kodu tylko rady jak to ulozyc bo tego nie moge pojac. Z gory dziekuje za odpowiedz, dodaje zalacznik z kodem konwertera w Pascalu.

2

Najpierw przyglądnij się gotowym konwerterom, następnie przeglądnij pasek komponentów w swoim IDE i poznaj je bliżej - potem możesz się zastanawiać której wybrać;

Masz trzy grupy:

  • długości,
  • masy,
  • prędkości;
    Możesz wybrać komponent z zakładkami (np. TPageControl) i na każdej z nich postawić po dwa TComboBox do wybrania jednostek - z jakiej jednostki na jaką odbędzie się przeliczanie; Na każdej zakładce tworzysz także pola do wpisania wartości, przycisk do konwertowania oraz pole do przedstawienia wyniku (albo wyświetlasz wynik w polach, w których wpisuje się dane); Możesz też dodać przycisk do odwrócenia jednostek - jeśli masz ustawione z metrów na kilometry to po wciśnięciu tego przycisku zamienia wartości w ComboBoxach i wychodzi z kilometrów na metry;

Możliwości jest wiele, więc sam musisz wybrać te, które uznasz za stosowne.

1

Kod który napisałeś jest STRASZNY.
1.Miliard procedur od konwersji - w jakim celu osobna do każdej formy konwersji?
2.Drabinki if-ów zamiast np.instrukcji case (ja bym się pokusił o tablicę wskaźników na kolejne funkcje, ale to jest rozwiązanie bardziej zaawansowane).
3.SysUtils oraz Windows chyba są niepotrzebne w tym programie.
4.Ogólne łamanie zasad DRY oraz KISS.

0

Ot cała filozofia:

const WTable:array[0..4] of record Name:String; Mul:Double; end=
(
  (Name:'mg';Mul:0.000001),
  (Name:'g';Mul:0.001),
  (Name:'dg';Mul:0.1),
  (Name:'kg';Mul:1),
  (Name:'t';Mul:1000)
);

for I:=Low(WTable) to High(WTable) do ComboBox1.Add(WTable[I].Name);
for I:=Low(WTable) to High(WTable) do ComboBox2.Add(WTable[I].Name);

Edit2.Text:=FloatToStr(StrToFloat(Edit1.Text)/WTable[ComboBox1.ItemIndex]*WTable[ComboBox2.ItemIndex]);
0

Przemyslalem wasze rady i napisalem sobie taki kod ale znowu mam problem bo wyswietla sie blad
" Record, object or class type required "

var
  wartosci : record
    wartosc1 : real;
    wartosc2 : real;
  end;
procedure TForm1.Button1Click(Sender: TObject);
var
  wartosc1, wartosc2, wynik : real;
  ile : integer;
begin
  case ComboBox1.ItemIndex of

  0 : wartosc1 := 0.01;
  1 : wartosc1 := 0.1;
  2 : wartosc1 := 1;
  3 : wartosc1 := 1000;
end;
  begin

  case ComboBox2.ItemIndex of

  0 : wartosc2 := 0.01;
  1 : wartosc2 := 0.1;
  2 : wartosc2 := 1;
  3 : wartosc2 := 1000;
  end;
    begin
      Ile := StrToInt(Edit1.Text);
      wynik := ile*Wartosci.wartosc1*wartosci.wartosc2;
      Edit2.Text := FloatToStr(wynik);
    end;
end.

zmienna wartosci dodalem jak zobaczylem ten komunikat o bledzie, bo na poczatku sprobowalem tak jak napisal _13th_Dragon

0

Masz namieszane w tych blokach case .. of:

  case ComboBox1.ItemIndex of
 
  0 : wartosc1 := 0.01;
  1 : wartosc1 := 0.1;
  2 : wartosc1 := 1;
  3 : wartosc1 := 1000;
end;
  begin
 
  case ComboBox2.ItemIndex of
 
  0 : wartosc2 := 0.01;
  1 : wartosc2 := 0.1;
  2 : wartosc2 := 1;
  3 : wartosc2 := 1000;
  end;
    begin
      Ile := StrToInt(Edit1.Text);
      wynik := ile*Wartosci.wartosc1*wartosci.wartosc2;
      Edit2.Text := FloatToStr(wynik);
    end;

brakuje jednego end (niepotrzebny begin po pierwszym bloku case .. of);

EDIT: Poza tym wariant z tablicami podanymi przez @_13th_Dragon jest lepszy, bo likwiduje dwa bloki case .. of.

1 użytkowników online, w tym zalogowanych: 0, gości: 1