Autor Beitrag
Stread
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 28.12.08 22:25 
Du kannst prüfen ob in dem Editfeld etwas drin steht:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Mo 29.12.08 00:58 
Beispiel für TryStrToInt:
ausblenden 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
    // Berechnung
 end
 else
   // Fehler melden

Grüße,
Marc
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mo 29.12.08 01:26 
Ich glaube da ist was zuviel. Er rechnet zwar richtig es werden aber beide Fehler Nachrichten angezeigt.

ausblenden volle Höhe 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 29.12.08 01:35 
user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden volle Höhe 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? ;-)
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 29.12.08 02:10 
user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
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:

user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Mo 29.12.08 11:56 
Bei multiplikation geht doch auch
ausblenden Delphi-Quelltext
1:
stringtofloatdef (zahl1, 1);					
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mo 29.12.08 17:21 
Warum zeigt es mir hier einen fehler an?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
if TryStrToFloat(Edit3.Text, zahl3) = false
    and Edit3.Text <> (* Fehler *)'' then 
        ShowMessage('In Zahl 3 steht keine gültige Zahl!');
    end
  else //Fehler
   ShowMessage('In Zahl 1 oder Zahl 2 steht keine gültige Zahl!');
end;


Ich habe es nun so gemacht und es funktioniert.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 29.12.08 17:24 
user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: 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?
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 29.12.08 17:57 
Weil da Klammern fehlten.
ausblenden Delphi-Quelltext
1:
 if (bla = 'blubb'and (foo = 'bar'then //ohne Klammern geht das nicht					
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 29.12.08 17:58 
Weil du die Klammern vergessen hattest:
ausblenden 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:
ausblenden 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:
ausblenden 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:
ausblenden 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:
user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
Schlechter Programmierstil das false?
www.delphi-treff.de/...olean-werten/page/4/ ;-)
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 29.12.08 18:33 
user profile iconStread hat folgendes geschrieben Zum zitierten Posting springen:
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.

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mo 29.12.08 18:54 
Oder meinen Quelltext von oben nehmen und einfach die Zeichen tauschen :wink:
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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. ;-)