Hättest du den Komponenten aussagekräftige Namen gegeben, man könnte leichter nachvollziehen was wofür ist.
Ich hab auch mal paar Taschenrechner am Anfang geprogt und hab sogar einen der Punkt vor Strichrechnung beachtet, finde den aber im Archiv nicht. Vielleicht ist es auf einer der anderen CDs.
Was ich aber gefunden habe ist mein alter Ein-Prozedur-Taschenrechner für ein Editfeld. Allerdings keine Punkt vor Strichrechnung. Ich glaube sonst hat er funktioniert.
Aber vielleicht ist es gut für paar Anregungen.
Delphi-Quellcode:
{ --== Ein-Prozedur Taschenrechner ==-- }
{ Hinweis: befolgt nicht die Punkt vor Strich Regel }
var
Mem1, Mem2: Extended;
LastOpKey: Char;
{Mögliche Tasten: "0123456789" und ",", dann "+-*/", "c", "=", alternativ Enter}
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
Edit: TEdit;
begin
{Dies und das}
Edit := Edit1;
if Key = #13 then Key := '=';
{Clear}
if Key = 'c' then
begin
Edit.Text := FloatToStr(0);
Edit.SelStart := Length(Edit.Text); //setzt Cursor an Editfeld Ende
Mem2 := 0;
LastOpKey := #0;
Key := #0;
Exit;
end;
{Rechnen}
if Key in ['+', '-', '*', '/', '='] then
begin
{Änderung des Operators (Operatorkorrektur)}
if not Edit.Modified then
begin
LastOpKey := Key;
Key := #0;
Exit;
end;
{bedeutet, daß Opperator eigegeben wurde und vor der nächsten Zahleeingabe
Edit-Feld gelöscht werden muß. Wird auch für Operatorkorrektur genutzt}
Edit.Modified := False;
{altuelle Zahl aus Editfeld holen}
Mem1 := StrToFloat(Edit.Text);
case LastOpKey of
'+': Mem1 := Mem2 + Mem1;
'-': Mem1 := Mem2 - Mem1;
'*': Mem1 := Mem2 * Mem1;
'/': Mem1 := Mem2 / Mem1;
else
Mem2 := Mem1;
LastOpKey := Key;
Key := #0;
Exit;
end;
{Ergebnis und Zwischenergebns in Editfeld zurückschreiben}
Edit.Text := FloatToStr(Mem1);
Edit.SelStart := Length(Edit.Text);
{auf nächste Zahlen-Eingabe verbreiten}
Mem2 := Mem1;
if Key <> '=' then LastOpKey := Key else LastOpKey := #0;
Key := #0;
Exit;
end;
{Zahlen Filtern}
if not (Key in [#8, '0'..'9', ',']) then Key := #0;
{Löscht Editinhalt nach Operatoreingabe, bei neuen Zahleingabe}
if not Edit.Modified then Edit.Text := '';
end; {Popov}