![]() |
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. |
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 |
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. |
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... |
Re: String und Extended, Econvert Error
|
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? |
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:
Gruß
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; Wolfgang |
Re: String und Extended, Econvert Error
Zitat:
Zitat:
![]() |
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 01:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz