pascal87 Geschrieben 9. August 2006 Geschrieben 9. August 2006 Hallo!! Da ich in der BS mit Turbo Pascal arbeite bin gerade dabei mir pivat Delphi anzueignen, als erstes habe ich mir mal so ne Standardsache, wie einen Taschenrechener ausgesucht und, soweit ich kam gebaut. Nun haben sich einige Probleme, deren Herkunft mir nicht ganz klar ist ergeben: - wie kann ich die Fehlermeldung abfangen, die kommt, wenn ich nach dem Start des Programmes einfach einen Operator (+,-,/ oder *) betätige und damit den Absturz verhindern? - wie schaffe ich es mit Nachkommasellen zu rechnen, Deklarierung der Variablen val1 und val2 als real hat nicht geklappt, gab ständig Meckermeldungen, gibt es für Rechnungen noch einen anderen Typen in Delphi, als in Pascal?? Habe mich mit den "neuen" Typen noch nciht viel befasst, lediglich beim googeln auf "extended" gestoßen. Mir wäre sehr geholfen, wenn mir jemand mit Delphi-Erfahrung ein paar Tipps geben könnte, mein Programm auch ansonsten mal beurteilen würde, wie gesagt sind erste Schritte in Delphi. Vielen Dank!! Code: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; Button6: TButton; Button7: TButton; Button8: TButton; Button9: TButton; Button10: TButton; Edit1: TEdit; Button11: TButton; Button12: TButton; Button13: TButton; Button14: TButton; Button15: TButton; Edit2: TEdit; Button16: TButton; Button17: TButton; 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 Button10Click(Sender: TObject); procedure Button11Click(Sender: TObject); procedure Button12Click(Sender: TObject); procedure Button13Click(Sender: TObject); procedure Button14Click(Sender: TObject); procedure Button15Click(Sender: TObject); procedure Button16Click(Sender: TObject); procedure Button17Click(Sender: TObject); procedure VorzeichenClick(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; val1:extended; val2:extended; result:extended; erg:extended; o:char; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin edit1.Text:=edit1.Text+'1'; end; procedure TForm1.Button2Click(Sender: TObject); begin edit1.Text:=edit1.Text+'2'; end; procedure TForm1.Button3Click(Sender: TObject); begin edit1.Text:=edit1.Text+'3'; end; procedure TForm1.Button4Click(Sender: TObject); begin edit1.Text:=edit1.Text+'4'; end; procedure TForm1.Button5Click(Sender: TObject); begin edit1.Text:=edit1.Text+'5'; end; procedure TForm1.Button6Click(Sender: TObject); begin edit1.Text:=edit1.Text+'6'; end; procedure TForm1.Button7Click(Sender: TObject); begin edit1.Text:=edit1.Text+'7'; end; procedure TForm1.Button8Click(Sender: TObject); begin edit1.Text:=edit1.Text+'8'; end; procedure TForm1.Button9Click(Sender: TObject); begin edit1.Text:=edit1.Text+'9'; end; procedure TForm1.Button10Click(Sender: TObject); begin edit1.Text:=edit1.Text+'0'; end; procedure TForm1.Button11Click(Sender: TObject); begin if (edit1.Text='') then edit1.Text:='0,' else edit1.Text:=edit1.text+'.'; end; procedure TForm1.Button12Click(Sender: TObject); begin val1:=StrToFLoat(edit1.Text); o:='+'; edit1.Text:=''; end; procedure TForm1.Button13Click(Sender: TObject); begin val1:=StrToFLoat(edit1.Text); o:='-'; edit1.Text:=''; end; procedure TForm1.Button14Click(Sender: TObject); begin val1:=StrToFloat(edit1.Text); o:='*'; edit1.Text:=''; end; procedure TForm1.Button15Click(Sender: TObject); begin val1:=StrToFloat(edit1.Text); o:='/'; edit1.Text:=''; end; procedure TForm1.Button16Click(Sender: TObject); begin val2:=StrToFloat(edit1.Text); erg:=0.0 ; case o of '+': erg:=val1+val2; '-': erg:=val1-val2; '*': erg:=val1*val2; '/': if val2=0 then begin edit2.Text:='Division durch NUll'; edit1.Text:=''; val1:=0.0; val2:=0.0; end else erg:=val1/val2; end; edit1.Text:=FloatToStr(erg); end; procedure TForm1.Button17Click(Sender: TObject); begin edit1.Text:=''; edit2.Text:=''; val1:=0; val2:=0; end; procedure TForm1.vorzeichenClick(Sender: TObject); begin val1:=StrToFloat(edit1.Text); edit1.Text:=FloatToStr(-1*val1); end; procedure TForm1.FormCreate(Sender: TObject); begin end; end. Zitieren
grueni Geschrieben 9. August 2006 Geschrieben 9. August 2006 1. Die Fehlermeldung, die ausgespuckt wird, wäre interessant. Ich vermute mal, es ist ne EConvertError Exception. Die kriegst du bei StrToFloat, wenn in einem deiner Edit-Felder nix drinsteht. So kannst du das abfangen: try val1=StrToFloat(edit1.Text); except on EConvertError do val1=0; else raise; end; Sollte jetzt in edit1 nix Vernünftiges drin stehen, wird val1 auf 0 gesetzt. Schöner wäre es allerdings, wenn Button16 nur enabled ist, wenn der User auch was eingeben hat. (Geht über Actions) 2. Auch hier wären die "Meckermeldungen" interessant. StrToFloat gibt das Ergebnis als Extended zurück, vermutlich ist Real zu klein. Mit Double sollte es auch klappen, hab ich jetzt aber nicht ausprobiert. Welche reellen Typen es in Delphi gibt, kann man schön in der Hilfe nachlesen. 3. Einfach die Standardnamen für die Komponenten zu verwenden, ist ausgesprochen unschön. Vor allem, wenn es gleich 16 Buttons gibt. 4. Die Variablen val1, val2, result, erg und o würde ich im private Bereich deklarieren. Der Name "result" ist ausgesprochen unglücklich, normalerweise ist das der Rückgabewert einer Funktion. Mehr fällt mir im Moment nicht ein, nur mit der .pas Datei kann man in dem Fall auch nicht sooo viel anfangen. Zitieren
pascal87 Geschrieben 12. August 2006 Autor Geschrieben 12. August 2006 1. Die Fehlermeldung " is not a floating point value, sie kommt, wenn ich einfach nach dem Programmstart einen Operator betätige. 2. Die gleiche Meldung '0.5' is not a floating point value, wenn ich mir Nachkommastellen rechnen möchte. 3. Ist mir klar, ändere ich 4. result ist auch rausgenommen Zitieren
grueni Geschrieben 12. August 2006 Geschrieben 12. August 2006 1. Ein leerer String ist nunmal keine gültige Gleitkommazahl. Hast du es mal mit dem try...except Block probiert? 2. Kriegst du den Fehler auch, wenn du "," statt "." in Button11Click einsetzt? Ist eh merkwürdig, daß du einmal mit "," und einmal mit "." arbeitest. Ich nehm an, das ist ein Tippfehler. Zitieren
geloescht_JesterDay Geschrieben 21. August 2006 Geschrieben 21. August 2006 2. Die gleiche Meldung '0.5' is not a floating point value, wenn ich mir Nachkommastellen rechnen möchte. Das liegt ganz einfach an deinen Einstellungen in Windows. Für Deutschland ist als Trennzeichen ein Komma eingestellt und dieses Komma erwartet StrToFloat dann auch (bzw das was da eingestellt ist). Zu deinem Text: Deklarier deine Variablen nicht global, sondern da wo sie hingehören: im Formular. Da sie nur innerhalb dieses Formulars verwendet werden, können die alle als privat deklariert werden, also so z.B.: TForm1 = class(TForm) ... private { Private declarations } val1:extended; val2:extended; result:extended; erg:extended; o:char; public { Public declarations } end; var Form1: TForm1; Weitere Erläuterungen zu Privat/Public/Protected/Published oder OOP sind hier glaub ich fehl am Platz, weil der Platz dafür nicht so ganz reicht. Außerdem solltest du deine Komponenten sinnvoll benamen. Den Button für den Vorzeichenwechsel hast du ja scheinbar schon umbenannt, die anderen solltest du aber auch benennen. Zum Namen eine kurze Bezeichnung was es ist und als Name eben einen sinnvollen Namen. Dein Button zum Vorzeichenwechsel heißt: Vorzeichen. Das ist schonmal nicht schlecht, aber icht würde da ein btnVorzeichen daraus machen, um zu sehen, dass es ein Button ist. Wenn du im Quelltext dann btnVorzeichenClick siehst, dann weißt du gleich was damit gemeint ist, bei button14Click stehst du erstmal da und musst Button 14 suchen. Gute Namen sehen nicht nur besser aus, sie helfen dir auch, wenn du dir den Quelltext ne Weile später wieder ansiehst (oder jemand anderem der sich den ansieht). EDIT: Ach ja, ich mach es zwar auch immer so , aber ich wollte es trotzdem mal erwähnen: val1:extended; val2:extended; result:extended; erg:extended; wäre so val1, val2, result, erg:extended; (oder eben in einer Zeile) für den Compiler wohl besser. Den genauen Wortlaut kann ich dir gar nicht mehr sagen, aber irgendwo (in der DelphiHilfe glaub ich sogar) hab ich das mal gelesen. Zitieren
PieDie Geschrieben 21. August 2006 Geschrieben 21. August 2006 val1, val2, result, erg:extended; (oder eben in einer Zeile) für den Compiler wohl besser. Den genauen Wortlaut kann ich dir gar nicht mehr sagen, aber irgendwo (in der DelphiHilfe glaub ich sogar) hab ich das mal gelesen. Soweit ich mich entsinne geht das aber auch nur bei Delphi 7 und Nachfolgern. Delphi6 spuckte mir bei sowas eine Fehlermeldung aus, mit 7 und 2005 klappte es anstandslos. EDIT: Um Buchstabeneingaben abzufangen kannst du auch Spinedits nehmen. Die nehmen nur Zahlen entegegen, keine Buchstaben. Wie das mit Kommazahlen läuft, weiß ich nicht. Hab kein installiertes Delphi zur Hand. Zitieren
geloescht_JesterDay Geschrieben 21. August 2006 Geschrieben 21. August 2006 Delphi6 spuckte mir bei sowas eine Fehlermeldung aus... So eine Konstruktion geht/ging schon bei TurboPascal. Ich schätze da liegt eher ein PBMK vor EDIT: PMBK? Öm... Naja, meinte einen Tippfehler Zitieren
PieDie Geschrieben 22. August 2006 Geschrieben 22. August 2006 So eine Konstruktion geht/ging schon bei TurboPascal. Ich schätze da liegt eher ein PBMK vor EDIT: PMBK? Öm... Naja, meinte einen Tippfehler ääähm NEIN? Der Quellcode ließ sich sowohl mit 7 als auch 2005 ohne Probleme kompilieren. 6 scheiterte an scheinbar fehlerhafter Syntax (":" erwartet, "," gefunden). Mag sein, dass eine Bibliothek in 6 nicht verfügbar war, die diese Funktion nachgerüstet hätte (waren alles Standardinstallationen) aber ein "Tippfehler" oder eine dauigkeit lag definitiv nicht vor -.- Zitieren
geloescht_JesterDay Geschrieben 22. August 2006 Geschrieben 22. August 2006 Mag sein, dass eine Bibliothek in 6 nicht verfügbar war, die diese Funktion nachgerüstet hätte ... Das ist keine besondere Funktion. Auch bei der Funktions- oder Proceduredeklaration wird das ja so gemacht: function Add(Zahl1, Zahl2: Integer): Integer begin Result:= Zahl1 + Zahl2; end; Wird ja auch selten als function Add(Zahl1: Integer; Zahl2: Integer): Integer begin Result:= Zahl1 + Zahl2; end; geschrieben (was ja theoretisch möglich wäre). Zitieren
grueni Geschrieben 22. August 2006 Geschrieben 22. August 2006 *hüstel* Jungs, ihr schweift ein bißchen arg vom Ausgangsthema ab. Auf Wunsch schieb ich eure Diskussion in nen eigenen Thread. Ich probier die Deklaration aber heute Abend noch mit Delphi3 und Delphi6 aus und berichte von meinen Erfahrungen. Daß was mit Delphi6 nicht geht, was mit allen anderen Versionen funktioniert, ist ja nix Neues. *g* <edit> Tja PieDie, JesterDay hat recht. Sowohl unter Delphi6 als auch unter Delphi3 kann ich die Variablen so deklarieren. </edit> Zitieren
PieDie Geschrieben 23. August 2006 Geschrieben 23. August 2006 Dann würde mich mal interessieren, warumd as bei mir nicht klappt(e)... (Ich werde deswegen NICHT Delphi irgendeiner Version installieren) Delphi = Bug [/OffTopic] Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.