Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Memory Funktion Taschenrechner (https://www.delphipraxis.net/192827-memory-funktion-taschenrechner.html)

jdiephaus 22. Mai 2017 21:09

Delphi-Version: 5

Memory Funktion Taschenrechner
 
Hallo liebe Community,

ich hoffe ihr könnt mir etwas auf die Sprünge helfen, deswegen hier direkt mein Problem:

Programm ist ein Taschenrechner.
Das Problem dreht sich um die Memory Funktion. Falls jemand damit nichts anfangen kann:

MR Taste : Übergibt aktuellen Display Wert an Speicher
MC Taste : Setzt Speicher + Display Wert auf 0
M+ Taste : Addiert Speicher Wert zu aktuellem Display Wert
M- Taste : Subtrahiert Speicher Wert von aktuellem Display Wert

Mein Code:
Code:
procedure TForm1.MemoryFunction(Sender: TObject);
var mem: ansistring;
begin
 if Sender is TSpeedButton then
    case TSpeedButton(Sender).Name of
      'TsbMR': mem := label1.Caption;
      'TsbMC': begin
               mem := '0';
               label1.Caption := '0';
               end;
      'TsbMMinus': label1.Caption := FloatToStr(StrToFloat(label1.Caption) - StrToFloat(mem));
      'TsbMPlus': label1.Caption := FloatToStr(StrToFloat(label1.Caption) + StrToFloat(mem));
    end;
end;
Mein Problem besteht in der Übergabe des Display Wert an den Speicher Wert. Es wird kein String übergeben.

Beim Drücken von M+ und M- kommt Exception EConvertError: "" is an invalid float.

Wenn ich mem einen festen Wert z.B mem := '5' zuordne, funktioniert alles ohne Probleme (ausser natürlich die Taste MR zum Setzen des Speicher Werts).

(Zeichen werden übrigens auch als ansistring an label1.Caption übergeben, falls das irgendeine Rolle spielen könnte.)

Hat jemand von euch zufällig eine Idee bzw. kann mir sagen, wo ich dumm war? :stupid:

Vielen Dank für eure Aufmerksamkeit!

Olli73 22. Mai 2017 21:36

AW: Memory Funktion Taschenrechner
 
"mem" ist bei dir eine lokale Variable. Beim nächsten Aufruf (M+, M-) ist sie wieder ein leerer String.

himitsu 22. Mai 2017 21:51

AW: Memory Funktion Taschenrechner
 
Denk dir folgende zwei Zeilen hinzu und überleg dir nochmal, was dein Programm wirklich macht, mit so einer lokalen Variable.
Delphi-Quellcode:
procedure TForm1.MemoryFunction(Sender: TObject);
var mem: String;
begin
  mem := ''; // <<<<<<<<<< die LOKALE Variable ist zu Beginn leer
  if Sender is TSpeedButton then
    case TSpeedButton(Sender).Name of
      'TsbMR': mem := label1.Caption;
      'TsbMC': begin
               mem := '0';
               label1.Caption := '0';
               end;
      'TsbMMinus': label1.Caption := FloatToStr(StrToFloat(label1.Caption) - StrToFloat(mem));
      'TsbMPlus': label1.Caption := FloatToStr(StrToFloat(label1.Caption) + StrToFloat(mem));
    end;
  mem := ''; // <<<<<<<<<< die LOKALE Variable wird am Ende der Prozedur gelöscht
end;
[edit]
Ich glaube ich hätte zwischendurch mal F5 drücken sollen, wenn die DP schon keine RedBox anzeigt. :cry:

jdiephaus 22. Mai 2017 22:18

AW: Memory Funktion Taschenrechner
 
Oha bin ich dämlich. Vielen Dank! :oops:

himitsu 22. Mai 2017 22:26

AW: Memory Funktion Taschenrechner
 
Sei froh, dass es ein String war ... eine lokale Integer-Variable wird nicht automatisch initialisiert und hat somit zu Beginn potentiel einen "zufälligen" Wert drinnen.

Obwohl, der Compiler würde dich dann darauf hinweisen, dass diese Variable nicht initialisiert wurde,
aber wenn man das ignoriert, dann passieren in Programmen komische Dinge. :stupid:

Amateurprofi 23. Mai 2017 13:30

AW: Memory Funktion Taschenrechner
 
Zitat:

Zitat von jdiephaus (Beitrag 1372445)
Falls jemand damit nichts anfangen kann:

MR Taste : Übergibt aktuellen Display Wert an Speicher
MC Taste : Setzt Speicher + Display Wert auf 0
M+ Taste : Addiert Speicher Wert zu aktuellem Display Wert
M- Taste : Subtrahiert Speicher Wert von aktuellem Display Wert

Ich könnte damit tatsächlich nichts anfangen, denn bei einem normalen handelsüblichen Taschenrechner sind die Bedeutungen so:
MR Taste : Übergibt Speicher Wert an Display (MR steht für Memory Recall)
M+ Taste : Addiert aktuellen Display Wert zu Speicher Wert
M- Taste : Subtrahiert aktuellen Display Wert von Speicher Wert
Ist das Absicht, dass das bei dir alles genau anders herum ist?

himitsu 23. Mai 2017 13:50

AW: Memory Funktion Taschenrechner
 
die Bezeichnungen rumdehen ginge och :stupid:

MS Taste : Memory Set
MC Taste : Memory Clear
+M Taste : Add Memory to View
-M Taste : Substract Memory from View

BrightAngel 23. Mai 2017 17:45

AW: Memory Funktion Taschenrechner
 
Zitat:

Zitat von jdiephaus (Beitrag 1372445)
[...]
MC Taste : Setzt Speicher + Display Wert auf 0
[...]

:-D:-D Wenn wir schon am i-Tüpfeln und wünscheln sind: Ich würde dann nur den Speicher und nicht das Display löschen. Irgendwie wird das dann einfacher, wenn schon was im Speicher steht und man grade was überraschend "wertvolles" spontan im Display stehen hat. (Quasi so wie deine MS Taste :D)

Brighty


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 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