AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Taschenrechner : ' ' ist kein Gleitkommawert
Thema durchsuchen
Ansicht
Themen-Optionen

Taschenrechner : ' ' ist kein Gleitkommawert

Ein Thema von Ric · begonnen am 26. Jul 2011 · letzter Beitrag vom 29. Jul 2011
Antwort Antwort
Seite 1 von 3  1 23      
Ric

Registriert seit: 10. Jul 2011
6 Beiträge
 
#1

Taschenrechner : ' ' ist kein Gleitkommawert

  Alt 26. Jul 2011, 11:43
Delphi-Version: 5
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.

http://s7.directupload.net/images/110726/q9rjswg3.jpg



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.
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Taschenrechner : ' ' ist kein Gleitkommawert

  Alt 26. Jul 2011, 11:54
Hi.

Ich geh mal stark davon aus, dass das Problem in der Zeile hier liegen dürfte:

zwischenergebnis := strtofloat(edit1.text); 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.

Gruß
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Taschenrechner : ' ' ist kein Gleitkommawert

  Alt 26. Jul 2011, 11:57
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.

Delphi-Referenz durchsuchenTryStrToFloat Delphi-Referenz durchsuchenStrToFloatDef
$2B or not $2B

Geändert von himitsu (26. Jul 2011 um 11:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Taschenrechner : ' ' ist kein Gleitkommawert

  Alt 26. Jul 2011, 12:05
Bring hierfür blos niemanden diesen Sch* mit den Try-Except bei.
Hm, hab gerade etwas drüber nachgedacht und in Delphi ist das vielleicht wirklich nicht so das wahre. Java kennt da ein etwas ausgefeilteres try-catch-Konstrukt, bei dem verschiedene Exceptions unterschiedlich behandelt werden können, da ists dann ein leichtes, z.B. eine NumberFormatException abzufangen und entsprechend zu behandeln:

Code:
try {
  int i = Integer.parseInt("a");
} catch (NumberFormatException ex) {
  // whatever
}
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 Gibts in Delphi eigentlich eine entpsrechende Möglichkeit?

Grüße
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: Taschenrechner : ' ' ist kein Gleitkommawert

  Alt 26. Jul 2011, 12:09
Delphi-Quellcode:
try
  //foo
except
  on e: SomeSpecialExceptionClass do ...
  on e: SomeLessSpecialExceptionClass do ...
  on e: SomeFairlyGeneralExceptionClass do ...
  ...
  on e: Exception do ...
end;
Dennoch ist es nicht sinnvoll diesen Fall mit Exceptions zu behandeln, da ja eine erwartete Fehleingabe vorliegt.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: Taschenrechner : ' ' ist kein Gleitkommawert

  Alt 26. Jul 2011, 12:21
Dennoch ist es nicht sinnvoll diesen Fall mit Exceptions zu behandeln, da ja eine erwartete Fehleingabe vorliegt.
Gut, darüber lässt sich diskutieren. Danke für das Beispiel!

Grüße
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Taschenrechner : ' ' ist kein Gleitkommawert

  Alt 26. Jul 2011, 12:24
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 =)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Taschenrechner : ' ' ist kein Gleitkommawert

  Alt 26. Jul 2011, 13:19
Kennt Delphi auch,
Delphi-Quellcode:
try

except
  on E: EIrgendwas do begin

  end;
  on E: Exception do begin

  end;
end;
Aber da der "Debugger" Exceptions standardmäßig erstmal anzeigt, wenn sie ausgelöst werden, auch wenn sie dann über Try-Except weggefangen werden.
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
$2B or not $2B

Geändert von himitsu (26. Jul 2011 um 13:22 Uhr)
  Mit Zitat antworten Zitat
Ric

Registriert seit: 10. Jul 2011
6 Beiträge
 
#9

AW: Taschenrechner : ' ' ist kein Gleitkommawert

  Alt 26. Jul 2011, 14:58
Danke für eure antworten,

hab jetzt rausbekommen woran es lag

 if edit1.Text = 'then exit; Diese umwandlung war richtig, aber falsch positioniert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: Taschenrechner : ' ' ist kein Gleitkommawert

  Alt 26. Jul 2011, 15:07
if edit1.Text = 'then ... Diese umwandlung war richtig,
Was für eine Umwandlung?

Tipp: Gib mal irgendwo ein Leerzeichen, einen Buchstaben oder einen zweiten Punkt in dein Edit ein.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz