Zum Inhalt springen

Bugs in meinem Taschenrechner


pascal87

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen


    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. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 -.-

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

*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>

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...