Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Prüfen ob im Edit Feld was steht
Stread - So 28.12.08 22:16
Titel: Prüfen ob im Edit Feld was steht
Hi
Mein Taschenrechner Projekt hat 3 Eingabe Felder. Nun kann man aus den ersten beiden oder aus allen dreien Felder eine addition ausführen. Wenn ich angegeben habe dass zahl1+zahl2=ergebnis dann beachtet er das dritte Feld nicht. Logisch
Wenn ich aber nun angegeben habe dass zahl1+zahl2+zahl3=ergebnis dann gibt er mir eine Fehlermeldung wenn ich ins dritte Feld nichts eintrage. Kann man das dynamisch ändern? Wenn nur in 2 Felder was eingetragen wurde soll er de ersten Schritt nehmen, wenn in alle drei Felder was eingetragen wurde soll er den anderen Schritt nehmen.
Danke Stread
jaenicke - So 28.12.08 22:25
Du kannst prüfen ob in dem Editfeld etwas drin steht:
Delphi-Quelltext
1:
| if EditX.Text <> '' then |
Und du solltest die Umwandlungen z.B. mit TryStrToFloat durchführen um sicherzustellen, dass bei einer ungültigen Eingabe der Fehler abgefangen wird.
Stread - Mo 29.12.08 00:50
Ich weiß nicht weiter.
Bei 3 Zahlen funktioniert es aber wenn ich nur 2 Zahlen eingebe kommt
'' Ist kein gültiger Gleitkommawert.
Und was genau soll ich mit TryStrToFloat machen?
Richtiger Code
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure THauptfenster.Button1Click(Sender: TObject); var zahl1, zahl2, zahl3, ergebnis: Double; begin zahl1 := StrToFloat(Edit1.Text); zahl2 := StrToFloat(Edit2.Text); if Edit3.Text <> '' then begin zahl3 := StrToFloat(Edit3.Text); ergebnis := zahl1+zahl2+zahl3; Label6.Caption := FloatToStr(ergebnis) end else begin ergebnis := zahl1+zahl2; Label6.Caption := FloatToStr(ergebnis) end; end; |
jaenicke - Mo 29.12.08 00:53
Du führst die Umwandlung mit StrToFloat immer durch, egal ob Edit3 leer ist oder nicht, das musst du ins if mit reinnehmen. ;-)
Der Fehler tritt bei dir bei StrToFloat(Edit3.Text) auf!
TryStrToFloat versucht einen String in einen Zahlenwert umzuwandeln und gibt dir zurück ob das möglich war. So gibt es keinen Fehler, wenn jemand einen Buchstaben statt einer Zahl eingibt, wenn du entsprechend reagierst.
Marc. - Mo 29.12.08 00:58
Beispiel für TryStrToInt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| if TryStrToInt(Edit1.Text,Zahl1) and TryStrToInt(Edit2.Text,Zahl2) and TryStrToInt(Edit3.Text,Zahl3) then begin end else |
Grüße,
Marc
Stread - Mo 29.12.08 01:26
Ich glaube da ist was zuviel. Er rechnet zwar richtig es werden aber beide Fehler Nachrichten angezeigt.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| procedure THauptfenster.Button1Click(Sender: TObject); var zahl1, zahl2, zahl3, ergebnis: Double; begin zahl1 := StrToFloat(Edit1.Text); zahl2 := StrToFloat(Edit2.Text); if TryStrToFloat(Edit1.Text,zahl1) and TryStrToFloat(Edit2.Text,zahl2) and TryStrToFloat(Edit3.Text,zahl3) then begin if Edit3.Text <> '' then begin zahl3 := StrToFloat(Edit3.Text); ergebnis := zahl1+zahl2+zahl3; Label6.Caption := FloatToStr(ergebnis) end; end else showmessage ('Falsche Zahl');
if TryStrToFloat(Edit1.Text,zahl1) and TryStrToFloat(Edit2.Text,zahl2) then begin if Edit3.Text = '' then begin ergebnis := zahl1+zahl2; Label6.Caption := FloatToStr(ergebnis) end; end;
begin showmessage ('Falsche Zahl2'); end end; |
Wenn wen man hier kann man nur zwei Zahlen eingibt kommt die Fehlernachricht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure THauptfenster.Button1Click(Sender: TObject); var zahl1, zahl2, zahl3, ergebnis: Double; begin zahl1 := StrToFloat(Edit1.Text); zahl2 := StrToFloat(Edit2.Text); if TryStrToFloat(Edit1.Text,zahl1) and TryStrToFloat(Edit2.Text,zahl2) and TryStrToFloat(Edit3.Text,zahl3) then begin if Edit3.Text <> '' then begin zahl3 := StrToFloat(Edit3.Text); ergebnis := zahl1+zahl2+zahl3; Label6.Caption := FloatToStr(ergebnis) end; if Edit3.Text = '' then begin ergebnis := zahl1+zahl2; Label6.Caption := FloatToStr(ergebnis) end; end else showmessage ('Falsche Zahl'); end; |
Vielleicht ist es zu spät und ich kann nicht mehr richtig denken :?
jaenicke - Mo 29.12.08 01:35
Stread hat folgendes geschrieben : |
| Ich glaube da ist was zuviel. Er rechnet zwar richtig es werden aber beide Fehler Nachrichten angezeigt. |
Rück doch mal deinen Quelltext ordentlich ein, dann siehst du auch was da läuft...
Jedenfalls wandelst du doppelt um, einmal mit StrToFloat und einmal richtig mit TryStrToFloat, die beiden StrToFloat Zeilen gehören weg.
Dann zur Einrückung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| procedure THauptfenster.Button1Click(Sender: TObject); var zahl1, zahl2, zahl3, ergebnis: Double; begin zahl1 := StrToFloat(Edit1.Text); zahl2 := StrToFloat(Edit2.Text); if TryStrToFloat(Edit1.Text,zahl1) and TryStrToFloat(Edit2.Text,zahl2) and TryStrToFloat(Edit3.Text,zahl3) then begin if Edit3.Text <> '' then begin zahl3 := StrToFloat(Edit3.Text); ergebnis := zahl1+zahl2+zahl3; Label6.Caption := FloatToStr(ergebnis) end; end else showmessage ('Falsche Zahl');
if TryStrToFloat(Edit1.Text,zahl1) and TryStrToFloat(Edit2.Text,zahl2) then begin if Edit3.Text = '' then begin ergebnis := zahl1+zahl2; Label6.Caption := FloatToStr(ergebnis) end; end;
begin showmessage ('Falsche Zahl2'); end end; |
Und ich denke jetzt siehst du auch was da falsch läuft. ;-) Das ShowMessage am Ende wird immer ausgegeben, egal was vorher war.
Wie wäre es so? ;-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure THauptfenster.Button1Click(Sender: TObject); var zahl1, zahl2, zahl3, ergebnis: Double; begin if TryStrToFloat(Edit1.Text, zahl1) and TryStrToFloat(Edit2.Text, zahl2) then begin ergebnis := zahl1 + zahl2; if TryStrToFloat(Edit3.Text, zahl3) then ergebnis := ergebnis + zahl3 else ShowMessage('In Edit3 steht keine gültige Zahl!'); Label6.Caption := FloatToStr(ergebnis); end else ShowMessage('In Edit1 oder Edit2 steht keine gültige Zahl!'); end; |
Stread - Mo 29.12.08 02:01
Super :zustimm:
Wenn ich nun nur in Edit1 und Edit2 eine Zahl eingebe zeigt er mir den Fehler dass in Edit 3 nichts eingetragen ist, rechnet aber trotzdem weiter. Aber ich wollte dort ja nichts eintragen. Kann man den Fehler nur dann anzeigen lassen wenn was in Edit3 steht?
Wenn ich nur in Edit3 einen Buchstaben eingebe sagt er zwar es gibt einen Fehler rechnet aber dann Edit1+Edit2 aus. Kann man da das ausrechnen verhindern genauso wie wenn bei Edit1 was falsches steht?
jaenicke - Mo 29.12.08 02:10
Stread hat folgendes geschrieben : |
| Wenn ich nun nur in Edit1 und Edit2 eine Zahl eingebe zeigt er mir den Fehler dass in Edit 3 nichts eingetragen ist, rechnet aber trotzdem weiter. Aber ich wollte dort ja nichts eintragen. Kann man den Fehler nur dann anzeigen lassen wenn was in Edit3 steht? |
Dann nimm die Anzeige des Fehlers halt raus. :nixweiss:
Stread hat folgendes geschrieben : |
| Wenn ich nur in Edit3 einen Buchstaben eingebe sagt er zwar es gibt einen Fehler rechnet aber dann Edit1+Edit2 aus. Kann man da das ausrechnen verhindern genauso wie wenn bei Edit1 was falsches steht? |
Eigentlich hast du ja die einzelnen Teile schon, du musst das ja nur zusammenbringen. Einerseits ob etwas drin steht (Edit3.Text <> '') und andererseits ob die Umwandlung erfolgreich war (TryStrToFloat). ;-)
Boldar - Mo 29.12.08 11:56
Bei multiplikation geht doch auch
Delphi-Quelltext
1:
| stringtofloatdef (zahl1, 1); |
Stread - Mo 29.12.08 17:21
Warum zeigt es mir hier einen fehler an?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| if TryStrToFloat(Edit3.Text, zahl3) = false and Edit3.Text <> '' then ShowMessage('In Zahl 3 steht keine gültige Zahl!'); end else ShowMessage('In Zahl 1 oder Zahl 2 steht keine gültige Zahl!'); end; |
Ich habe es nun so gemacht und es funktioniert.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure THauptfenster.Button1Click(Sender: TObject); var zahl1, zahl2, zahl3, ergebnis: Double; begin if TryStrToFloat(Edit1.Text, zahl1) and TryStrToFloat(Edit2.Text, zahl2) then begin ergebnis := zahl1 + zahl2; Label6.Caption := FloatToStr(ergebnis); if TryStrToFloat(Edit3.Text, zahl3)then begin ergebnis := ergebnis + zahl3; Label6.Caption := FloatToStr(ergebnis); end; if TryStrToFloat(Edit3.Text, zahl3) = false then if Edit3.Text <> '' then ShowMessage('In Zahl 3 steht keine gültige Zahl!'); end else ShowMessage('In Zahl 1 oder Zahl 2 steht keine gültige Zahl!'); end; |
Das nächste ist nicht so wichtig aber wenn wir schonmal dabei sind :wink:
Wenn in Edit1 oder Edit2 was falsches drinsteht rechnet er nicht mehr weiter und die Fehlermeldung erscheint was auch so sein soll. Wenn in Edit3 was falsches drinsteht kommt die Fehlermeldung aber er rechnet Edit1 + Edit2 aus.
jaenicke - Mo 29.12.08 17:24
Stread hat folgendes geschrieben : |
| Wenn in Edit1 oder Edit2 was falsches drinsteht rechnet er nicht mehr weiter und die Fehlermeldung erscheint was auch so sein soll. Wenn in Edit3 was falsches drinsteht kommt die Fehlermeldung aber er rechnet Edit1 + Edit2 aus. |
Weil du es in Zeile 9 sagst, dass es passieren soll.
Und wenn wir schon dabei sind :wink: :mrgreen: :
Der Vergleich "
= false" ist nicht so gut, nimm lieber "
if not Try... then". ;-)
Stread - Mo 29.12.08 17:53
Jetzt funktioniert alles :D
Da ich ein Streber bin will ich das auch noch wissen :wink:
Schlechter Programmierstil das false?
Warum ging denn mein and Quellcode nicht?
Delete - Mo 29.12.08 17:57
Weil da Klammern fehlten.
Delphi-Quelltext
1:
| if (bla = 'blubb') and (foo = 'bar') then |
jaenicke - Mo 29.12.08 17:58
Weil du die Klammern vergessen hattest:
Delphi-Quelltext
1: 2: 3:
| if (TryStrToFloat(Edit3.Text, zahl3) = false) and (Edit3.Text <> '') then ShowMessage('In Zahl 3 steht keine gültige Zahl!'); |
Der Compiler hat das ungefähr so interpretiert, jedenfalls vom Sinn her:
Delphi-Quelltext
1: 2: 3:
| if ((TryStrToFloat(Edit3.Text, zahl3) = false) and Edit3.Text) <> '' then ShowMessage('In Zahl 3 steht keine gültige Zahl!'); |
Der Compiler nimmt das <> nicht vor dem and als Operator.
Dann noch zwei Varianten, einmal mit Einzelausgabe ob 3 falsch ist:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure THauptfenster.Button1Click(Sender: TObject); var zahl1, zahl2, zahl3: Double; begin if (Edit3.Text <> '') and not TryStrToFloat(Edit3.Text, zahl3) then begin ShowMessage('In Zahl 3 steht keine gültige Zahl!'); Exit; end else if Edit3.Text = '' then zahl3 := 0; if TryStrToFloat(Edit1.Text, zahl1) and TryStrToFloat(Edit2.Text, zahl2) then Label6.Caption := FloatToStr(zahl1 + zahl2 + zahl3) else ShowMessage('In Zahl 1 oder Zahl 2 steht keine gültige Zahl!'); end; |
und einmal mit genereller Prüfung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure THauptfenster.Button1Click(Sender: TObject); var Error: Boolean; zahl1, zahl2, zahl3: Double; begin Error := (Edit3.Text <> '') and not TryStrToFloat(Edit3.Text, zahl3); if Edit3.Text = '' then zahl3 := 0; if not Error and TryStrToFloat(Edit1.Text, zahl1) and TryStrToFloat(Edit2.Text, zahl2) then Label6.Caption := FloatToStr(zahl1 + zahl2 + zahl3) else ShowMessage('In einer der Zahlen steht keine gültige Zahl!'); end; |
// EDIT:
Stread hat folgendes geschrieben : |
| Schlechter Programmierstil das false? |
http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/page/4/ ;-)
Stread - Mo 29.12.08 18:27
Bei + und - funktioniert der Code aber mal * nichtmehr.
Danke für die Mühe, so kann man sich verschiedene Arten ansehen.
jaenicke - Mo 29.12.08 18:33
Stread hat folgendes geschrieben : |
| Bei + und - funktioniert der Code aber mal * nichtmehr. |
Weil das neutrale Element da nicht die 0 ist. ;-)
Und da, wenn das dritte Feld leer ist, bei mir einfach zahl3 auf 0 gesetzt wird (das neutrale Element der Addition und Subtraktion), kommt natürlich insgesamt 0 heraus. Bei einer Multiplikation muss man aber die 1 nehmen, das neutrale Element der Multiplikation.
Quelltext
1: 2: 3: 4: 5: 6:
| zahl1 + zahl2 + 0 = zahl1 + zahl2 ABER zahl1 * zahl2 * 0 = 0 --> also nicht gleich zahl1 * zahl2 Deshalb die 1: zahl1 * zahl2 * 1 = zahl1 * zahl2 |
;-)
Stread - Mo 29.12.08 18:54
Oder meinen Quelltext von oben nehmen und einfach die Zeichen tauschen :wink:
jaenicke - Mo 29.12.08 18:58
Richtig, wobei der Quelltext zwar länger ist, dafür aber auch zuerst Fehler in den ersten beiden Edits anzeigt. ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!