![]() |
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. |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Es hat alles prima geklappt, erscheint auch keine Fehlermeldung mehr :-D
So sieht das jetzt aus
Delphi-Quellcode:
procedure TForm1.btn_malClick(Sender: TObject);
begin if edit1.Text = '' then exit; 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; |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Zitat:
|
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Anscheinend nicht. Aber die erste Abfrage lässt sich ja beliebig erweitern.
Delphi-Quellcode:
:stupid:
if (Edit1.Text = '') or (Edit1.Text = ' ') or (Edit1.Text = 'A') or (Edit1.Text = 'a')
{...} or (Edit1.Text = 'Meine Fresse, was so alles in einem String stehen kann') then exit; |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
ich habs mit einer for schleife gemacht aber es geht irgendiwe trotzdem nicht
Delphi-Quellcode:
function TForm1.IsValidFloat(AValue1: String): Boolean;
var i: Integer; begin Result := false; { Gegeben: String, Gesucht: Boolean} if AValue1 <> '' then begin for i := 0 to Length(AValue1) do begin if AValue1[i] in ['0'..'9', ','] then begin Result := true; end; end; end else begin ShowMessage('String ist leer.'); end; end; |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Natürlich nicht, denn das Result wird ja auf true gesetzt, sobald auch nur ein einziges Zeichen gültig ist. Du musst es genau anders herum machen.
|
AW: Taschenrechner : ' ' ist kein Gleitkommawert
sonst ist es so richtig? weil wenn ich true und false vertausche klappts immer noch nicht
oder ich bin einfach zu blöd.. blond eben :) |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Delphi-Quellcode:
function TForm1.IsValidFloat(AValue1: String): Boolean;
var i: Integer; begin Result := true; { Gegeben: String, Gesucht: Boolean} if AValue1 <> '' then begin for i := 1 to Length(AValue1) do // Strings beginnen bei 1 !!! begin if not (AValue1[i] in ['0'..'9', ',']) then begin Result := false; Exit; // das Ergebnis steht fest, also kann man mit Exit oder Break die Bearbeitung auch abbrechen end; end; end else begin ShowMessage('String ist leer.'); Result := false; end; end; Aber wozu der Aufwand? Es gibt fertige Funktionen, um sowas zu prüfen. ![]() ![]() ![]() PS: Das Komma ist nicht immer das Dezimaltrennzeichen. (die Amis nutzen z.B. den Punkt dafür) ![]() Deine Funktion erlaubt auch noch mehrere Kommas oder das Weglassen des Vorkomma- und/oder Nachkommaanteils. Wenn man schon eine manuelle Syntakprüfung machen möchte, dann doch besser richtig prüfen, denn sonst bringt das Ganze ja nichts, da es später dennoch knallen kann. Zitat:
|
AW: Taschenrechner : ' ' ist kein Gleitkommawert
versuch es doch mal so:
Delphi-Quellcode:
Gruß
function TForm1.IsValidFloat(AValue1: String): Boolean;
var i: Integer; begin Result := false; { Gegeben: String, Gesucht: Boolean} if AValue1 <> '' then begin result := true; for i := 1 to Length(AValue1) do if AValue1[i] not in ['0'..'9', ','] then Result := false; end else begin ShowMessage('String ist leer.'); end; end; K-H Edith: Erst zu langsam, dann auch noch vertippt. |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
es kommt immer noch die meldung
Im Projekt Project1.exe ist eine Exception der Klasse EConvertError mit der Meldung ''' ist kein gültiger Gleitkommawert' aufgetreten. |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
da habt ihr mal den ganzen QT
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) txt_rechnung: TEdit; cmd_7: TButton; Label1: TLabel; cmd_clear: TButton; cmd_div: TButton; cmd_gleich: TButton; cmd_0: TButton; cmd_komma: TButton; cmd_1: TButton; cmd_2: TButton; cmd_3: TButton; cmd_mul: TButton; cmd_6: TButton; cmd_5: TButton; cmd_4: TButton; cmd_add: TButton; cmd_9: TButton; cmd_8: TButton; cmd_sub: TButton; procedure cmd_clearClick(Sender: TObject); procedure cmd_2Click(Sender: TObject); procedure cmd_3Click(Sender: TObject); procedure cmd_4Click(Sender: TObject); procedure cmd_5Click(Sender: TObject); procedure cmd_6Click(Sender: TObject); procedure cmd_7Click(Sender: TObject); procedure cmd_8Click(Sender: TObject); procedure cmd_9Click(Sender: TObject); procedure cmd_0Click(Sender: TObject); procedure cmd_divClick(Sender: TObject); procedure cmd_mulClick(Sender: TObject); procedure cmd_subClick(Sender: TObject); procedure cmd_addClick(Sender: TObject); procedure cmd_gleichClick(Sender: TObject); procedure cmd_kommaClick(Sender: TObject); Procedure Rechenarten; procedure cmd_1Click(Sender: TObject); private function IsValidFloat(AValue1: String): Boolean; public { Public-Deklarationen } end; var Form1: TForm1; Rechenart: Integer; Speicher: Real; GZahl: array[0..9] of Integer; const GZahl0 = 0; GZahl1 = 1; GZahl2 = 2; GZahl3 = 3; GZahl4 = 4; GZahl5 = 5; GZahl6 = 6; GZahl7 = 7; GZahl8 = 8; GZahl9 = 9; implementation {$R *.dfm} procedure TForm1.cmd_0Click(Sender: TObject); begin txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl0); end; procedure TForm1.cmd_1Click(Sender: TObject); begin txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl1); end; procedure TForm1.cmd_2Click(Sender: TObject); begin txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl2); end; procedure TForm1.cmd_3Click(Sender: TObject); begin txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl3); end; procedure TForm1.cmd_4Click(Sender: TObject); begin txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl4); end; procedure TForm1.cmd_5Click(Sender: TObject); begin txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl5); end; procedure TForm1.cmd_6Click(Sender: TObject); begin txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl6); end; procedure TForm1.cmd_7Click(Sender: TObject); begin txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl7); end; procedure TForm1.cmd_8Click(Sender: TObject); begin txt_rechnung.Text := txt_rechnung.Text + IntToStr(GZahl8); end; procedure TForm1.cmd_9Click(Sender: TObject); begin txt_rechnung.Text := txt_rechnung.Text + IntToStr (GZahl9); end; procedure TForm1.cmd_addClick(Sender: TObject); begin label1.Caption := '+'; Rechenarten; Rechenart := 1; Speicher := StrToFloat(txt_Rechnung.Text); txt_rechnung.text := ''; end; procedure TForm1.cmd_clearClick(Sender: TObject); begin txt_rechnung.Clear; label1.caption := ''; Speicher := 0; Rechenart := 0; end; procedure TForm1.cmd_divClick(Sender: TObject); begin label1.Caption := '/' ; Rechenarten; Rechenart := 4; Speicher := StrToFloat(txt_Rechnung.Text); txt_rechnung.text := ''; end; procedure TForm1.cmd_mulClick(Sender: TObject); begin label1.Caption := '*' ; Rechenarten; Rechenart := 3; Speicher := StrToFloat(txt_Rechnung.Text); txt_rechnung.text := ''; end; procedure TForm1.cmd_subClick(Sender: TObject); begin label1.Caption := '-' ; Rechenarten; Rechenart := 2; Speicher := StrToFloat(txt_Rechnung.Text); txt_rechnung.Text := ''; end; function TForm1.IsValidFloat(AValue1: String): Boolean; var i: Integer; begin Result := false; { Gegeben: String, Gesucht: Boolean} if AValue1 <> '' then begin for i := 0 to Length(AValue1) do begin if AValue1[i] in ['0'..'9', ','] then begin Result := true; end; end; end else begin ShowMessage('String ist leer.'); end; end; procedure TForm1.Rechenarten; begin IsValidFloat(txt_rechnung.text); case Rechenart of 0: begin Speicher := StrToFloat(txt_rechnung.Text); end; 1: begin Speicher := Speicher + StrToFloat(txt_rechnung.text); end; 2: begin Speicher := Speicher - StrToFloat(txt_rechnung.text); end; 3: begin Speicher := Speicher * StrToFloat(txt_rechnung.text); end; 4: begin Speicher := Speicher / StrToFloat(txt_rechnung.text); end; end; end; procedure TForm1.cmd_gleichClick(Sender: TObject); begin Rechenarten; txt_rechnung.text := FloatToStr(Speicher); Speicher := 0; Rechenart := 0; end; procedure TForm1.cmd_kommaClick(Sender: TObject); begin txt_rechnung.Text := txt_rechnung.Text + ','; end; end. |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
Du hast zwei Hinweise bekommen wie Du Deine Probleme in den Griff bekommen könntest.
Aber immer noch steht bei Dir:
Delphi-Quellcode:
Gruß
function TForm1.IsValidFloat(AValue1: String): Boolean;
var i: Integer; begin Result := false; { Gegeben: String, Gesucht: Boolean} if AValue1 <> '' then begin for i := 0 to Length(AValue1) do begin if AValue1[i] in ['0'..'9', ','] then begin Result := true; end; end; end else begin ShowMessage('String ist leer.'); end; end; K-H |
AW: Taschenrechner : ' ' ist kein Gleitkommawert
So, zu der Nummernprüfung wurde eigentlich schon alles gesagt...
Unnötige Konstanten besser vermeiden.
Delphi-Quellcode:
Aber du weißt ja eh schon, was IntToStr liefern wird.
procedure TForm1.cmd_0Click(Sender: TObject);
begin txt_rechnung.Text := txt_rechnung.Text + IntToStr(0); end;
Delphi-Quellcode:
Und dann gibt es eine "Regel" (OK, eigentlich mehr Hinweis/Tipp), daß man doppelten Code vermeiden sollte.
procedure TForm1.cmd_0Click(Sender: TObject);
begin txt_rechnung.Text := txt_rechnung.Text + '0'; end; In Sender steckt die Komponente, von welcher der Aufruf kommt, also welche den Befehl gesendet hat. In .Hint kann man nun das Zeichen "verstecken":
Delphi-Quellcode:
Außerdem hätte jede Komponente .Tag, welches man auch verwenden könnte.
procedure TForm1.cmd_NumClick(Sender: TObject);
begin txt_rechnung.Text := txt_rechnung.Text + TButton(Sender).Hint; end; (wird nicht von Delphi genutzt und kann von dir verwendet werden, wofür du auch willst)
Delphi-Quellcode:
Nun muß man nur noch diese Methoden allen Nummern-Buttons zuweisen und im OI, bei diesen Buttons, das .Hint oder .Tag entsprechend setzen.
procedure TForm1.cmd_NumClick(Sender: TObject);
begin txt_rechnung.Text := txt_rechnung.Text + IntToStr(TButton(Sender).Tag); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:06 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