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.
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 dwaTComboBox
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.
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.
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]);
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
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.