![]() |
Delphi-Version: 5
Taschenrechner : ' ' ist kein Gleitkommawert
Hallo liebe Community,
Ich versuche seit ner Woche einen Taschenrechner in Delphi zu erstellen. Dank den anderen Threads kam ich auch relativ weit. Ich habe ein Fehler bei den Rechenzeichen festgestellt. Bsp. Wenn ich 2 mal auf '+' Klicke kommt die Fehlermeldung '' ist kein Gleitkommawert. ![]()
Delphi-Quellcode:
procedure TForm1.btn_plusClick(Sender: TObject);
begin opperator := '+'; if zwischenergebnis = 0 then begin try zwischenergebnis := strtofloat(edit1.text); except zwischenergebnis := 0; end; edit1.Text := '';// Hier habe ich auch versucht die Zeile in: if edit1.Text = '' then exit; umzuwandeln. Was mache ich falsch? Hier der QT
Delphi-Quellcode:
unit taschenrechner;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; btn_1: TButton; BTN_2: TButton; BTN_3: TButton; BTN_4: TButton; BTN_5: TButton; BTN_6: TButton; BTN_7: TButton; BTN_8: TButton; BTN_9: TButton; BTN_0: TButton; btn_div: TButton; btn_mal: TButton; btn_minus: TButton; btn_plus: TButton; btn_gleich: TButton; btn_clear: TButton; BTN_komma: TButton; procedure btn_clearClick(Sender: TObject); procedure btn_plusClick(Sender: TObject); procedure btn_malClick(Sender: TObject); procedure btn_gleichClick(Sender: TObject); procedure btn_1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure btn_divClick(Sender: TObject); procedure btn_minusClick(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); procedure Edit1KeyPress(Sender: TObject; var Key: Char); private { Private-Deklarationen } zwischenergebnis : real; opperator : String; oppbool : bool; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} var ausgabe : real; procedure TForm1.btn_divClick(Sender: TObject); begin opperator := '/'; if zwischenergebnis = 0 then begin try zwischenergebnis := strtofloat(edit1.text); except zwischenergebnis := 0; end; edit1.Text := ''; end else begin edit1.Text := FloatToStr(zwischenergebnis / strtofloat(edit1.text)); zwischenergebnis := StrToFloat(edit1.text); oppbool := true; end; end; procedure TForm1.btn_malClick(Sender: TObject); begin opperator := '*'; if zwischenergebnis = 0 then begin try zwischenergebnis := strtofloat(edit1.text); except zwischenergebnis := 0; end; edit1.Text := ''; end else begin edit1.Text := FloatToStr(zwischenergebnis * strtofloat(edit1.text)); zwischenergebnis := StrToFloat(edit1.text); oppbool := true; end; end; procedure TForm1.btn_minusClick(Sender: TObject); begin opperator := '-'; if zwischenergebnis = 0 then begin try zwischenergebnis := strtofloat(edit1.text); except zwischenergebnis := 0; end; edit1.Text := ''; end else begin edit1.Text := FloatToStr(zwischenergebnis - strtofloat(edit1.text)); zwischenergebnis := StrToFloat(edit1.text); oppbool := true; end; end; procedure TForm1.btn_plusClick(Sender: TObject); begin opperator := '+'; if zwischenergebnis = 0 then begin try zwischenergebnis := strtofloat(edit1.text); except zwischenergebnis := 0; end; edit1.Text := ''; end else begin edit1.Text := FloatToStr(zwischenergebnis + strtofloat(edit1.text)); zwischenergebnis := StrToFloat(edit1.text); oppbool := true; end; end; procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin Key:= #0; end; procedure TForm1.btn_gleichClick(Sender: TObject); begin if edit1.text = '' then begin edit1.Text := FloatToStr(zwischenergebnis); exit; end; if (opperator = '+') and (zwischenergebnis <> 0 ) then begin edit1.Text := FloatToStr(zwischenergebnis + strtofloat(edit1.text)); zwischenergebnis := 0; end else if (opperator = '*') and (zwischenergebnis <> 0) then begin edit1.Text := FloatToStr (zwischenergebnis * strtofloat(edit1.Text)); zwischenergebnis := 0; end else if (opperator = '/') and (zwischenergebnis <> 0) then begin edit1.Text := FloatToStr (zwischenergebnis / strtofloat(edit1.Text)); zwischenergebnis := 0; end else if (opperator = '-') and (zwischenergebnis <> 0) then begin edit1.Text := FloatToStr (zwischenergebnis - strtofloat(edit1.Text)); zwischenergebnis := 0; end; end; procedure TForm1.btn_clearClick(Sender: TObject); begin Edit1.Text := ''; zwischenergebnis := 0; end; procedure TForm1.btn_1Click(Sender: TObject); begin if oppbool = true then begin Edit1.Text := ''; oppbool := false; end; Edit1.Text :=Edit1.Text + tbutton(sender).Caption; end; procedure TForm1.FormCreate(Sender: TObject); begin zwischenergebnis := 0; opperator := ''; end; procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if not (key in [#48..#57,#8,#27, #44, #43, #13, #47, #45, #42]) then Key:= #0; //#48 = 0, #57 = 9, #8 = Backspace, #44 = , //Damit sind im Edit1 Feld nur Zahlen, Kommas und die Rücktaste erlaubt. btn_1click(FindComponent('BTN_'+key)); if key = #27 then btn_clearclick(self); if key = #43 then btn_plusclick(self); //if not (key in [#13]) then btn_gleichclick(self); if key = #13 then btn_gleichclick(self); if key = #47 then btn_divclick(self); if key = #45 then btn_minusclick(self); if key = #42 then btn_malclick(self); end; end. |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Hi.
Ich geh mal stark davon aus, dass das Problem in der Zeile hier liegen dürfte:
Delphi-Quellcode:
Hier versuchst du den Inhalt von edit1 in einen Float zu wandeln, wenn aber nichts im Edit steht, dann knallts. Das passiert, weil deine Variable "zwischenergebnis" nach zweimaligem Drücken von "+" wohl 0 ist und die obige Zeile daher erreicht wird. Entweder du benutzt Methoden wie TryStrToFloat, oder du baust einen try-except-Block außenrum, oder du fragst vorher ab, ob sich der Inhalt vom Edit-Feld in einen Float wandeln lässt.
zwischenergebnis := strtofloat(edit1.text);
Gruß |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Bring hierfür blos niemanden diesen Sch* mit den Try-Except bei.
Beim Debuggen wird sich sowas später sehr übel rächen, da hier der Debuger natürlich auf die Exception anspringt. (Exception = "Ausnahmesituation" und nicht "normale Fehlerbehandlung") Es gibt nicht umsonst die TryStrToXyz- und StrToXyzDef-Funktionen. ![]() ![]() |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Zitat:
Code:
Vorteil ist m.M.n., dass ich hier alle Möglichkeiten habe, auf eine Fehl-Eingabe zu reagieren, da bin ich bei den TryStrTo*-Methoden schon etwas eingeschränkter. Dann seh ich eigentlich auch kein Problem mehr beim Debuggen :gruebel: Gibts in Delphi eigentlich eine entpsrechende Möglichkeit?
try {
int i = Integer.parseInt("a"); } catch (NumberFormatException ex) { // whatever } Grüße |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Delphi-Quellcode:
Dennoch ist es nicht sinnvoll diesen Fall mit Exceptions zu behandeln, da ja eine erwartete Fehleingabe vorliegt.
try
//foo except on e: SomeSpecialExceptionClass do ... on e: SomeLessSpecialExceptionClass do ... on e: SomeFairlyGeneralExceptionClass do ... ... on e: Exception do ... end; |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Zitat:
Grüße |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Naja, er setzt mit "edit1.Text := '';" den Inhalt ja selbst, programmseitig, auf einen nicht wandelbaren Wert, somit muss das als definierter Zustand angesehen werden, der alles andere als eine Ausnahme ist. Find ich. Wo wir schon mal dabei sind =)
|
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Kennt Delphi auch,
Delphi-Quellcode:
Aber da der "Debugger" Exceptions standardmäßig erstmal anzeigt, wenn sie ausgelöst werden, auch wenn sie dann über Try-Except weggefangen werden.
try
except on E: EIrgendwas do begin end; on E: Exception do begin end; end; Wie gesagt, im laufenden Betrieb mag es "funktionieren", aber vorallem im Debugger isses blöd. Klar könnte man bestimmte Excepionklassen im Debugger ausschließen, aber dann isses blöd, wenn man soeine Exception von wo anders nicht mehr so schön mitbekommt. [edit] ups, da hab ich wohl 2 Beiträge mittendrin übersehn :oops: |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Danke für eure antworten,
hab jetzt rausbekommen woran es lag
Delphi-Quellcode:
Diese umwandlung war richtig, aber falsch positioniert.
if edit1.Text = '' then exit;
|
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Zitat:
Tipp: Gib mal irgendwo ein Leerzeichen, einen Buchstaben oder einen zweiten Punkt in dein Edit ein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz