Ich hab mal eine kleine Demo für dich gemacht. Da kannst du dir anschauen, wie ich es
auf die Schnelle machen würde.
Nicht perfekt, aber da kannst du dir was rausziehen, und es für dich dann perfekt machen.
Ich habe dir hier mal die entscheidenden Methoden aufgeführt. Die Aktuelle Zahl halte ich in der Variable Zahl als string (string deshalb, weil ich mir sonst nach dem Komma folgende Nullen merken müsste, bis der Benutzer wenigsten eine Ziffer <>0 eingibt. Daher der Einfachheit halber als string). Die Buttons für die Zahlen und Komma haben alle die btn1Click-Procedure. Ich entnehme jeweils ihrer Caption, um welche Zahl oder Komma es sich handelt. Die Procedure ZahlHinzufuegen übernimmt nun das tatsächliche Hinzufügen. Allerdings müssen hier eben die Sonderfälle berücksichtigt werden, damit immer gewährleistet ist, dass in Zahl ein gültiger Extended-Wert steht.
Das Anzeigen mache wieder über eine eigenen Procedure, da ich a) diesen Code an verschiedenen Stellen benötigen würde und b) ich die Methode so klein wie möglich halten will.
Also immer wenn sich ein Codefragment mindestens 1x wiederholt, lohnt sich eine eigene Methode dafür. Und übersichtlicher macht's auch.
Im KeyPrass filtere ich mir alle Key's und löse entsprechen den Button aus. Ich hätte auch z.B. ZahlHinzufuegen('1'); machen können.
Und dann noch eine Procedure für das Löschen von Zahlen. Auch hier muss man immer darauf achten, das in Zahl ein gültiger Extended-Wert verbleibt.
Statt Komma füge ich einen Punkt hinzu, weil das das Dezimalzeichen für Fließkommazahlen unter Delphi ist. Das in der Darstellung zu ändern, darum kannst du dir Gedanken machen.
Genauso wie über den Fehler, dass man in der Version das Komma mehrmals eingeben kann, was natürlich nicht sein darf.
Bitteschön.
(Liegt übrigens auch als komplettes Projekt im Anhang)
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
begin
ZahlHinzufuegen((Sender as TButton).Caption);
end;
procedure TForm1.btnDivisionClick(Sender: TObject);
begin
Uebertrag(raDivision);
end;
procedure TForm1.btnMinusClick(Sender: TObject);
begin
Uebertrag(raMinus);
end;
procedure TForm1.btnMultiplikationClick(Sender: TObject);
begin
Uebertrag(raMultiplikation);
end;
procedure TForm1.btnPlusClick(Sender: TObject);
begin
Uebertrag(raPlus);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Zahl:='0';
Ergebnis:=0;
RechenArt:=raPlus;
AddKomma:=False;
mmoAusgabe.Lines.Clear;
while mmoAusgabe.Lines.Count<3 do
mmoAusgabe.lines.Add('');
WertAufMemo;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift:
TShiftState);
begin
case Ord(Key) of
8: LoescheLetztStelle;
48, 96: btn0.Click;
49, 97: btn1.Click;
50, 98: btn2.Click;
51, 99: btn3.Click;
52, 100: btn4.Click;
53, 101: btn5.Click;
54, 102: btn6.Click;
55, 103: btn7.Click;
56, 104: btn8.Click;
57, 105: btn9.Click;
42, 106: btnMultiplikation.Click;
43, 107, 61, 12: btnPlus.Click;
45, 109: btnMinus.Click;
47, 111: btnDivision.Click;
44, 188, 190: btnKomma.Click;
else
Key:=0;
end;
end;
procedure TForm1.LoescheLetztStelle;
begin
if Length(Zahl)>1 then
Zahl:=Copy(Zahl, 1, Length(Zahl)-1) else
Zahl:='0';
WertAufMemo;
end;
procedure TForm1.Uebertrag(NeueRechenArt: TRechenart);
begin
case RechenArt of
raPlus: Ergebnis:=Ergebnis+StrToFloat(Zahl);
raMinus: Ergebnis:=Ergebnis-StrToFloat(Zahl);
raMultiplikation: Ergebnis:=Ergebnis*StrToFloat(Zahl);
raDivision:
begin
if Zahl<>'0' then
Ergebnis:=Ergebnis/StrToFloat(Zahl);
end;
end;
Zahl:='0';
RechenArt:=NeueRechenArt;
WertAufMemo;
end;
procedure TForm1.WertAufMemo;
begin
mmoAusgabe.Lines[0]:=FloatToStr(Ergebnis);
case RechenArt of
raPlus: mmoAusgabe.Lines[1]:='+';
raMinus: mmoAusgabe.Lines[1]:='-';
raMultiplikation: mmoAusgabe.Lines[1]:='*';
raDivision:mmoAusgabe.Lines[1]:='/' ;
end;
mmoAusgabe.Lines[2]:=Zahl;
end;
procedure TForm1.ZahlHinzufuegen(Eingabe: string);
begin
if Eingabe='0' then
begin
if Zahl<>'0' then Zahl:=Zahl+Eingabe else
Zahl:='0';
end else if Eingabe=',' then
begin
if Zahl='0' then Zahl:='0.' else
Zahl:=Zahl+'.';
end else begin
if Zahl<>'0' then
Zahl:=Zahl+Eingabe else
Zahl:=Eingabe;
end;
WertAufMemo;
end;