Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   String und Extended, Econvert Error (https://www.delphipraxis.net/139787-string-und-extended-econvert-error.html)

Delphi-Narr 5. Sep 2009 09:47


String und Extended, Econvert Error
 
Hallo,
ich soll für die Schule einen Taschenrechner mit Delphi 5 erstellen.
Ich hab ihn jetzt so angeordnet, dass es die Buttons gibt:

Name: Caption:
Button1 1
Button2 2
...
Button0 0
Plus +
...
Gleich =
Komma ,
CE CE

___________
Darüber ist ein Editfeld: Rechenfeld.text
Es ist für ReadOnly eingestellt, sodass man die Zahlen über die Software "Tastatur" eingeben muss.

Variablen:

rRechnen1,
rRechnen2 : string;
RZeichen : real;

Beim Start werden rRechnen1 und rRechnen2 auf := ('') gesetzt.


procedure TForm1.Button1Click(Sender: TObject);
begin
rRechnen1:=rRechnen1 + '1';
Rechenfeld.Text:=rRechnen1;
end;

Das geht dann bis 9 bzw. 0 so weiter und auch das Komma funktioniert:

procedure TForm1.KommaClick(Sender: TObject);
begin
rRechnen1:=rRechnen1 + ',';
Rechenfeld.Text:=rRechnen1;
end;


So bekomme ich dann eine schöne Zeichenkette, also einen String.
Jetzt möchte ich, dass beim Klicken auf "+" erst überprüft wird, ob die Variable rZeichen auf 1/2/3 oder 4 ist (Sie wird beim Start auf 0 gesetzt)
Eins heißt + Rechnen
Zwei heißt - Rechnen usw.


procedure TForm1.PlusClick(Sender: TObject);
begin
if rZeichen = 1 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1)) +round(StrToFloat(rRechnen2)));
________
Einschub: So sollen die Zeichenketten umgerechnet werden und verarbeitet werden.
________

if rZeichen = 2 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))-round(StrToFloat(rRechnen2)));
if rZeichen = 3 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1)) *round(StrToFloat(rRechnen2)));
if rZeichen = 4 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))/round(StrToFloat(rRechnen2)));
rRechnen2:=rRechnen1;
rRechnen1:=('');
________
Einschub: Für die nächste Eingabe wird die RechenZahl wieder auf ('') gesetzt.
________
rZeichen:=1;
________
Einschub: Da die Zahl jetzt auf 1 gesetzt wird, wird beim Klick auf die nächste Rechenschaltfläche rRechnen1+rRechnen2 gerechnet.
________
Rechenfeld.Text:=rRechnen1;
Zwischenergebnis.Caption:=rRechnen2;
end;


So ist das auch mit - , * und /

Wenn ich jetzt also starte, dann kommt der Rechner und ich kann durchs Klicken eine Zahl eingeben, bsp. 123
Dann klicke ich auf "+"
Dann kommt die Meldung: Im Projekt Taschenrechner ist eine Exception der Klasse EConvertError aufgetreten.Meldung: ''' ist kein gültiger Gleitkommawert'. Prozess wurde angehalten.

Wenn ich dann auf OK klicke, wird die letzte Zeile vom PlusButton Blau:

Zwischenergebnis.Caption:=rRechnen2;

Ich weiß nicht, was ich hier falsch mache...

Zum Schluss noch mein gesamter Quelltext:


Delphi-Quellcode:
unit Rechner;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Rechenfeld: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Gleich: TButton;
    Button0: TButton;
    Komma: TButton;
    Plus: TButton;
    Minus: TButton;
    Mal: TButton;
    Geteilt: TButton;
    Button10: TButton;
    Zwischenergebnis: TLabel;
    Label1: TLabel;
    procedure Button10Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button0Click(Sender: TObject);
    procedure KommaClick(Sender: TObject);
    procedure PlusClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure RechenfeldChange(Sender: TObject);
    procedure MinusClick(Sender: TObject);
    procedure MalClick(Sender: TObject);
    procedure GeteiltClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  rRechnen1 : String;
  rRechnen2 : String;
  rZeichen : real;

implementation

{$R *.DFM}

procedure TForm1.Button10Click(Sender: TObject);
begin
     rRechnen1:= ('');
     rRechnen2:= ('');
     Zwischenergebnis.Caption:=('0');
     Rechenfeld.text:=RrECHNEN1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
     rRechnen1:=rRechnen1 + '1';
     Rechenfeld.Text:=rRechnen1;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     rRechnen1:=rRechnen1 + '2';
     Rechenfeld.Text:=rRechnen1;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
     rRechnen1:=rRechnen1 + '3';
     Rechenfeld.Text:=rRechnen1;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
     rRechnen1:=rRechnen1 + '4';
     Rechenfeld.Text:=rRechnen1;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
     rRechnen1:=rRechnen1 + '5';
     Rechenfeld.Text:=rRechnen1;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
     rRechnen1:=rRechnen1 + '6';
     Rechenfeld.Text:=rRechnen1;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
     rRechnen1:=rRechnen1 + '7';
     Rechenfeld.Text:=rRechnen1;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
     rRechnen1:=rRechnen1 + '8';
     Rechenfeld.Text:=rRechnen1;
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
     rRechnen1:=rRechnen1 + '9';
     Rechenfeld.Text:=rRechnen1;
end;

procedure TForm1.Button0Click(Sender: TObject);
begin
     rRechnen1:=rRechnen1 + '0';
     Rechenfeld.Text:=rRechnen1;
end;

procedure TForm1.KommaClick(Sender: TObject);
begin
     rRechnen1:=rRechnen1 + ',';
     Rechenfeld.Text:=rRechnen1;
end;

procedure TForm1.PlusClick(Sender: TObject);
begin
     if rZeichen = 1 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))+round(StrToFloat(rRechnen2)));
     if rZeichen = 2 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))-round(StrToFloat(rRechnen2)));
     if rZeichen = 3 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))*round(StrToFloat(rRechnen2)));
     if rZeichen = 4 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))/round(StrToFloat(rRechnen2)));
     rRechnen2:=rRechnen1;
     rRechnen1:=('');
     rZeichen:=1;
     Rechenfeld.Text:=rRechnen1;
     Zwischenergebnis.Caption:=(rRechnen2);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     rZeichen:=1;
     rRechnen2:=('2');
end;

procedure TForm1.RechenfeldChange(Sender: TObject);
begin
     try
        rRechnen1:=FloatToStr(round(StrToFloat(Rechenfeld.text)));
     except
         ;
     end;
end;

procedure TForm1.MinusClick(Sender: TObject);
begin
if rZeichen = 1 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))+round(StrToFloat(rRechnen2)));
     if rZeichen = 2 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))-round(StrToFloat(rRechnen2)));
     if rZeichen = 3 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))*round(StrToFloat(rRechnen2)));
     if rZeichen = 4 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))/round(StrToFloat(rRechnen2)));
     rRechnen2:=rRechnen1;
     rRechnen1:=('');
     rZeichen:=2;
     Rechenfeld.Text:=rRechnen1;
     Zwischenergebnis.Caption:=(rRechnen2);
end;

procedure TForm1.MalClick(Sender: TObject);
begin
if rZeichen = 1 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))+round(StrToFloat(rRechnen2)));
     if rZeichen = 2 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))-round(StrToFloat(rRechnen2)));
     if rZeichen = 3 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))*round(StrToFloat(rRechnen2)));
     if rZeichen = 4 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))/round(StrToFloat(rRechnen2)));
     rRechnen2:=rRechnen1;
     rRechnen1:=('');
     rZeichen:=3;
     Rechenfeld.Text:=rRechnen1;
     Zwischenergebnis.Caption:=(rRechnen2);
end;

procedure TForm1.GeteiltClick(Sender: TObject);
begin
     if rZeichen = 1 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))+round(StrToFloat(rRechnen2)));
     if rZeichen = 2 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))-round(StrToFloat(rRechnen2)));
     if rZeichen = 3 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))*round(StrToFloat(rRechnen2)));
     if rZeichen = 4 then rRechnen2:=FloatToStr(round(StrToFloat(rRechnen1))/round(StrToFloat(rRechnen2)));
     rRechnen2:=rRechnen1;
     rRechnen1:=('');
     rZeichen:=4;
     Rechenfeld.Text:=rRechnen1;
     Zwischenergebnis.Caption:=(rRechnen2);
end;

end.

Wolfgang Mix 5. Sep 2009 09:59

Re: String und Extended, Econvert Error
 
Grundsätzlich kannst du mit Stringvariablen nicht rechnen. Strings musst du erst in Zahlenwerte umwandeln. Schau dir mal die Funktionen val und str an.

Gruß

Wolfgang

jaenicke 5. Sep 2009 10:01

Re: String und Extended, Econvert Error
 
Ein leeres except bei einem try-Block? :kotz:
Daran sieht man schon, dass dort ein Programmierfehler vorliegt.

Schau dir einmal TryStrToFloat an, damit tritt kein Fehler auf, wenn die Umwandlung nicht möglich ist, sondern das wird dir nur zurückgegeben.

Und dann hast du viel doppelten Code. Das macht es nicht gerade übersichtlicher.

Delphi-Narr 5. Sep 2009 10:08

Re: String und Extended, Econvert Error
 
Also den Exceptblock hab ich jetzt gefüllt...
Wenn man auf + Klickt, dann wird doch in eine Zahl umgerechnet...

Wolfgang Mix 5. Sep 2009 10:09

Re: String und Extended, Econvert Error
 
Beispiele zu StrToFloat und FloatToStr findest du
hier

Gruß

Wolfgang

Delphi-Narr 5. Sep 2009 10:11

Re: String und Extended, Econvert Error
 
Ja, steht doch da... Ich hab eine Zahlenkette: 123
Die will ich umwandeln. Mit StrToFloat - warum kommt dann ein Fehler?

Wolfgang Mix 5. Sep 2009 10:44

Re: String und Extended, Econvert Error
 
Mach erst einmal kleinere Schritte, sonst hast zu viele Fehler auszumerzen.
Spiel 'mal ein bisschen mit diesem einfachen Code, damit die Grundlagen sitzen

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var zahl1,zahl2,ergebnis:real;
begin
   zahl1:=StrToFloat(Edit1.Text);
   zahl2:=StrToFloat(Edit2.Text);
   Edit3.Text:=FloatToStr(zahl1+zahl2);
end;
Gruß

Wolfgang

jaenicke 5. Sep 2009 11:07

Re: String und Extended, Econvert Error
 
Zitat:

Zitat von Delphi-Narr
Ja, steht doch da... Ich hab eine Zahlenkette: 123
Die will ich umwandeln. Mit StrToFloat - warum kommt dann ein Fehler?

Nein, bei dir ist es nicht 123 oder so etwas sondern ein leerer String, das siehst du ja an der Fehlermeldung...
Zitat:

Zitat von Delphi-Narr
Dann kommt die Meldung: Im Projekt Taschenrechner ist eine Exception der Klasse EConvertError aufgetreten.Meldung: ''' ist kein gültiger Gleitkommawert'. Prozess wurde angehalten.

Wo das genau passiert, musst du mit dem Debugger feststellen. Also einen Haltepunkt in die erste Zeile deines Buttonklicks setzen, Programm ausführen und dann nach dem Klick auf den Button schrittweise mit F8 schauen was passiert.

Delphi-Narr 5. Sep 2009 12:16

Re: String und Extended, Econvert Error
 
Hab jetzt mit normalen Rechenschritten gemacht, also wenn man auf 2 klickt *10 +2 und so...
Klappt auch.
Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:45 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