Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Taschenrechner : ' ' ist kein Gleitkommawert (https://www.delphipraxis.net/161889-taschenrechner-ist-kein-gleitkommawert.html)

Ric 26. Jul 2011 10:43

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.

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.

patti 26. Jul 2011 10:54

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Hi.

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

Delphi-Quellcode:
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ß

himitsu 26. Jul 2011 10:57

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.

Delphi-Referenz durchsuchenTryStrToFloat Delphi-Referenz durchsuchenStrToFloatDef

patti 26. Jul 2011 11:05

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Zitat:

Zitat von himitsu (Beitrag 1113571)
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 :gruebel: Gibts in Delphi eigentlich eine entpsrechende Möglichkeit?

Grüße

Medium 26. Jul 2011 11:09

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
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.

patti 26. Jul 2011 11:21

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Zitat:

Zitat von Medium (Beitrag 1113575)
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

Medium 26. Jul 2011 11:24

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 =)

himitsu 26. Jul 2011 12:19

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
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 :oops:

Ric 26. Jul 2011 13:58

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Danke für eure antworten,

hab jetzt rausbekommen woran es lag

Delphi-Quellcode:
 if  edit1.Text = '' then exit;
Diese umwandlung war richtig, aber falsch positioniert.

himitsu 26. Jul 2011 14:07

AW: Taschenrechner : ' ' ist kein Gleitkommawert
 
Zitat:

Zitat von Ric (Beitrag 1113634)
Delphi-Quellcode:
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:10 Uhr.
Seite 1 von 3  1 23      

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