AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

String und Extended, Econvert Error

Ein Thema von Delphi-Narr · begonnen am 5. Sep 2009 · letzter Beitrag vom 5. Sep 2009
Antwort Antwort
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#1

String und Extended, Econvert Error

  Alt 5. Sep 2009, 09:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#2

Re: String und Extended, Econvert Error

  Alt 5. Sep 2009, 09:59
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
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.415 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: String und Extended, Econvert Error

  Alt 5. Sep 2009, 10:01
Ein leeres except bei einem try-Block?
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#4

Re: String und Extended, Econvert Error

  Alt 5. Sep 2009, 10:08
Also den Exceptblock hab ich jetzt gefüllt...
Wenn man auf + Klickt, dann wird doch in eine Zahl umgerechnet...
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#5

Re: String und Extended, Econvert Error

  Alt 5. Sep 2009, 10:09
Beispiele zu StrToFloat und FloatToStr findest du
hier

Gruß

Wolfgang
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#6

Re: String und Extended, Econvert Error

  Alt 5. Sep 2009, 10:11
Ja, steht doch da... Ich hab eine Zahlenkette: 123
Die will ich umwandeln. Mit StrToFloat - warum kommt dann ein Fehler?
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#7

Re: String und Extended, Econvert Error

  Alt 5. Sep 2009, 10:44
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
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.415 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: String und Extended, Econvert Error

  Alt 5. Sep 2009, 11:07
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 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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#9

Re: String und Extended, Econvert Error

  Alt 5. Sep 2009, 12:16
Hab jetzt mit normalen Rechenschritten gemacht, also wenn man auf 2 klickt *10 +2 und so...
Klappt auch.
Danke!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 05:25 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