Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (â‹®) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Bugs in meinem Taschenrechner

Empfohlene Antworten

Veröffentlicht

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.

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.

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

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.

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


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

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

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

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

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

Dann wĂĽrde mich mal interessieren, warumd as bei mir nicht klappt(e)...

(Ich werde deswegen NICHT Delphi irgendeiner Version installieren)

Delphi = Bug

[/OffTopic]

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.