| Autor |
Beitrag |
Stread
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: So 28.12.08 22:16
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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: 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; |
Zuletzt bearbeitet von Stread am Mo 29.12.08 01:02, insgesamt 2-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: 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 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: Mo 29.12.08 01:26
Ich glaube da ist was zuviel. Er rechnet zwar richtig es werden aber beide Fehler Nachrichten angezeigt.
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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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: 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 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: Mo 29.12.08 02:01
Super
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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 29.12.08 02:10
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Mo 29.12.08 11:56
Bei multiplikation geht doch auch
Delphi-Quelltext 1:
| stringtofloatdef (zahl1, 1); |
|
|
Stread 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: 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
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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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  :
Der Vergleich " = false" ist nicht so gut, nimm lieber " if not Try... then". 
|
|
Stread 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: Mo 29.12.08 17:53
Jetzt funktioniert alles
Da ich ein Streber bin will ich das auch noch wissen
Schlechter Programmierstil das false?
Warum ging denn mein and Quellcode nicht?
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 29.12.08 17:57
Weil da Klammern fehlten.
Delphi-Quelltext 1:
| if (bla = 'blubb') and (foo = 'bar') then |
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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? | www.delphi-treff.de/...olean-werten/page/4/ 
|
|
Stread 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: 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
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 29.12.08 18:33
|
|
Stread 
      
Beiträge: 188
Win 7
Delphi XE
|
Verfasst: Mo 29.12.08 18:54
Oder meinen Quelltext von oben nehmen und einfach die Zeichen tauschen 
|
|
jaenicke
      
Beiträge: 19341
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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. 
|
|
|