Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Summe einer Serie von Zahlen mit Hilfe von 2 Edit-boxen (https://www.delphipraxis.net/169995-summe-einer-serie-von-zahlen-mit-hilfe-von-2-edit-boxen.html)

diavy 24. Aug 2012 14:51

Summe einer Serie von Zahlen mit Hilfe von 2 Edit-boxen
 
Hallo zusammen.

Meine Aufgabestellung ist folgendermaßen:
Schreibe ein Programm das die Summe einer Serie von eingegebenen Zahlen rechnet, benutze dafür 2 Edit-Boxen und einen Button zum "nullen" der Summe.

Zunächst hab ich es damit probiert:
...Edit1Change... (prozedur)
if Edit1.Text <> '' then Label1.Caption:=IntToStr(StrToInt(Label1.Caption)+ StrToInt(Edit1.Text))

und das gleiche mir Edit2.

Problem: Mehrstellige Zahlen.

Da hab' ich mir gleich gedacht, dass es doch optimal wäre, wenn ich statt der Change-Prozedur eine Prozedur haben würde, die bei einem "Enter"-Drücken in der Edit-Box auslösen würde. Darauf folgend habe ich mir die Events mal angeschaut, und von Namen her hat "OnEnter" gleich danach ausgeschaut, als wäre es exakt das, was ich wollte. Ich hab also de Prozedur beim Event TForm1.Edit1Enter eingetragen, es ist jedoch schlichtwe nichts passiert als ich nach dem Eingeben der Zahlen "Enter" in der Edit-Box gedrückt habe.

Aufgrund des Mangels an Ideeen, wie ich es mit "Enter" umsetzen könnte, habe ich also versucht das Problem zu umgehen, was wiederum keine Lösung zum Problem ist:

Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text <> '' then
        begin
        if (StrToInt(Edit1.Text)/10) >=1 then
                Label1.Caption:=FloatToStr(StrToInt(Label1.Caption)+StrToInt(edit2.Text)- StrToInt(edit2.text)/10)
        else Label1.Caption:=IntToStr(StrToInt(Label1.Caption)+StrToInt(Edit1.Text));
        end;
end;
Hierbei ist natürlich das Problem dass man den Fall von mehr als 2-stelligen Zahlen nicht integriert hat. Hinzüglich hat man ein Problem, wenn man eine 2-stellige Zahl entfernt.
Beispiel: man möchte 12 durch 7 eretzen:
12 "<-" 1 "<-" 7
Hierbei wird 1 nochmal zur Summe hinzugefügt.

Meine Frage ist nun ob es doch eine Möglichkeit gibt, um meine Idee mit Enter umzusetzen, oder ob ich mein bestehendes Programm weiterführen, und für all solche Fälle vorbereiten muss?

Grüße

Klaus01 24. Aug 2012 14:59

AW: Summe einer Serie von Zahlen mit Hilfe von 2 Edit-boxen
 
onEnter wird ausgelöst wenn das Edit den Focus erhält.
onExit wird ausgelöst wenn das Edit den Focus verliert. (ob das Dein Problem löst?=

Einen zusätzlichen Button der die Berechnung startet dürft ihr nicht verwenden?

Grüße
Klaus

DeddyH 24. Aug 2012 15:09

AW: Summe einer Serie von Zahlen mit Hilfe von 2 Edit-boxen
 
Man könnte aber auch im OnKeyPress des Edits die ENTER-Taste abfragen (#13).

shmia 24. Aug 2012 16:01

AW: Summe einer Serie von Zahlen mit Hilfe von 2 Edit-boxen
 
Ich hätte da noch einen ganz heissen Tipp für Dich:
Benütze Zwischenvariablen!
Mit Zwischenvariablen wird der Code besser lesbar und besser zu debuggen.
Ausserdem wird es schneller.
Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
var
  akt_zahl: integer;
begin
  if Edit1.Text <> '' then
  begin
    akt_zahl := StrToInt(Edit1.Text);
    // und ab jetzt wird nur noch mit akt_zahl weitergerechnet

    if (akt_zahl/10) >=1 then
       ....
end;

Amateurprofi 24. Aug 2012 17:58

AW: Summe einer Serie von Zahlen mit Hilfe von 2 Edit-boxen
 
Hallo diavy,

wenn ich die von dir gepostete Aufgabenstellung richtig interpretiere, dann sollen auf der Form 2 Edits und ein Button sein.
Zahlen, die in Edit1 eingegeben werden, sollen summiert und die Summe in Edit2 ausgegeben werden.

Das könnte man so lösen:

In TForm ein Feld fSum:double deklarieren.

Dann :
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
   Button1.Click;
end;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var n:double;
begin
   if (key=VK_Return) and (Edit1.Text<>'') then
      if TryStrToFloat(Edit1.Text,n) then begin
         fSum:=fSum+n;
         Edit2.Text:=FloatToStr(fSum);
         Edit1.Text:='';
      end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   fSum:=0;
   Edit1.Text:='';
   Edit2.Text:='';
end;

diavy 25. Aug 2012 18:16

AW: Summe einer Serie von Zahlen mit Hilfe von 2 Edit-boxen
 
Zitat:

Zitat von Klaus01 (Beitrag 1179747)
onEnter wird ausgelöst wenn das Edit den Focus erhält.
onExit wird ausgelöst wenn das Edit den Focus verliert. (ob das Dein Problem löst?=

Einen zusätzlichen Button der die Berechnung startet dürft ihr nicht verwenden?

Grüße
Klaus

Wenn man sich zum addieren mit den Edits abwechselt und ein Label frs Resultat benutzt klappt's, wenn jedoch alles in 1 Edit eingegeben werden soll nicht. Ein kleines Manko der Methode ist, dass die letzte Zahl (nach der man den Fokus der Edit-Box normalerweise nicht mehr verliert) dann nicht mehr addiert wird, ist aber halt ne Kleinigkeit :D. Trotzdem guter Tip, danke dir! :)

Nein, das sollen wir umgehen.


Zitat:

Man könnte aber auch im OnKeyPress des Edits die ENTER-Taste abfragen (#13).
Das klingt nach einer Lösung. :D
Ich schau mal ob ich was zu dieser Methode finde.

Das mit den Zwischenvariablen werde ich mir merken!

Amateurprofi:
Ja, entweder so, oder dass man sich mit dem Eingeben der Zahlen bei den Edits abwechselt, und dann ein Label für's Resultat verwendet.
Danke für die Anregung mit deiner Methode, leider reicht mein Kenntnisstand (noch) nicht aus um sie nachvollziehen zu könne.

Amateurprofi 25. Aug 2012 20:42

AW: Summe einer Serie von Zahlen mit Hilfe von 2 Edit-boxen
 
Zitat:

Ja, entweder so, oder dass man sich mit dem Eingeben der Zahlen bei den Edits abwechselt, und dann ein Label für's Resultat verwendet.
Das entspräche aber nicht der Aufgabe in der von 2 Edits und einem Button, nicht aber von einem Label die Rede ist.

Zitat:

Danke für die Anregung mit deiner Methode, leider reicht mein Kenntnisstand (noch) nicht aus um sie nachvollziehen zu könne.
Kurze Erklärung

Im Button1.Click werden die Inhalte der beiden Edits gelöscht und die Summe der Zahlen (fSum) auf 0 gesetzt.

Im Edit1KeyUp passiert folgendes
Prüfung ob die gerade gelöste Taste die Return-Taste ist UND ob Edit1 einen Text enthält.
Wenn Nein, dann wird die Prozedur verlassen.
Wenn Ja, dann wird versucht den Text aus Edit1 in einen Double umzuwandeln.
(Double, weil im Aufgabentext "Zahlen" steht und nicht "Ganzzahlen".)
Wenn das TryStrToFloat(Edit1.Text, n) False zurückgibt, dann konnte der Text nicht in eine Zahl umgewandelt werden und die Prozedur wird verlassen.
Wenn das TryStrToFloat(Edit1.Text, n) True zurückgibt, dann ist die Umwandlung gelungen und n enthält den Wert.
Dann wird
1) dieser Wert zur bisherigen Summe (fSum) addiert
2) Die neue Summe in einen String umgewandelt und in Edit2.Text gestellt
3) Edit1 gelöscht, damit die nächste Zahl eingegeben werden kann

Im FormCreate wird ein OnClick des "Lösch-Buttons" ausgelöst, um sicherzustellen dass die Edits leer und fSum = 0 ist.

diavy 26. Aug 2012 09:07

AW: Summe einer Serie von Zahlen mit Hilfe von 2 Edit-boxen
 
Vielen Dank, hat super geklappt. :)

Ein paar Fragen bleiben mir nichtsdestotrotz:

1. Bei Button1.Click schreibst du "fsum:=0", ohne Edit2.Text:=FloatToStr(fsum), wie funktionniert das?

2. "Sender: TObject; var Key: Word; Shift: TShiftState"
--> Ist der Inhalt dieser Zeile pauschal gleich und "einfach hinzunehmen", oder sollte ich verstehen weshalb was wo steht? (das tu ich nämlich nicht)

3. kann man ein Event wie KeyUp auch "einfach" in den Code bekommen wie mit Click oder Edit bei Buttons oder Edits? Sprich dass man eine Aktion auf der Form durchführt, und dies dazu führt dass man es gleich im Code hat?

4. wieso benutzt man als var-typ double und nicht real?

5. DeddyH meinte die Enter-Taste sei #13, wieso heißt sie dennoch hier VK_Return?

6.

DeddyH 26. Aug 2012 12:03

AW: Summe einer Serie von Zahlen mit Hilfe von 2 Edit-boxen
 
Markier doch einfach einmal Dein Edit und schaue nach, was der Objektinspektor auf dem "Ereignisse"-Reiter so anbietet, damit beantworten sich die meisten Deiner Fragen schon von selbst.

Amateurprofi 26. Aug 2012 12:50

AW: Summe einer Serie von Zahlen mit Hilfe von 2 Edit-boxen
 
Zitat:

Zitat von diavy
1. Bei Button1.Click schreibst du "fsum:=0", ohne Edit2.Text:=FloatToStr(fsum), wie funktionniert das?.

In der Prozedur Button1Click steht nicht nur fSum:=0 sondern zwei Zeilen weiter Edit2.Text:=''. Alternativ könntest du auch schreiben Edit2.Text:='0' oder, wenn es dir besser gefällt Edit2.Text:=FloatToStr(fSum).
Ich halte es für besser ein leeres Textfeld zu zeigen, denn genau genommen existiert nach dem Zurücksetzen noch keine Summe, und genau das drücke ich durch ein leeres Textfeld aus. Eine Summe=0 könnte auch durch das Summieren von zum Beispiel 5, 3, -8 entstanden sein.


Zitat:

Zitat von diavy
2. "Sender: TObject; var Key: Word; Shift: TShiftState"
--> Ist der Inhalt dieser Zeile pauschal gleich und "einfach hinzunehmen", oder sollte ich verstehen weshalb was wo steht? (das tu ich nämlich nicht)

Das sind nun mal die Parameter, die bei einem KeyUp-Event an die jeweilige Prozedur übergeben werden.
Sender ist das Objekt, das das Event ausgelöst hat.
Key ist die Taste, die "Up ging".
Shiftstate enthält Informationen darüber ob Shift-, Ctrl-, Alt-Taste gedrückt ist oder nicht.

Zitat:

Zitat von diavy
3. kann man ein Event wie KeyUp auch "einfach" in den Code bekommen wie mit Click oder Edit bei Buttons oder Edits? Sprich dass man eine Aktion auf der Form durchführt, und dies dazu führt dass man es gleich im Code hat

Im Design-Modus klicke auf der Form das Edit1. Dann Doppelklicke im Objektinspektor unter Ereignisse das Feld "OnKeyUp" (nicht den Text "OnKeyUp" sondern das rechts davon liegende Textfeld). Dann wird die Prozedur "Edit1KeyUp" mit ihren Parametern in den Code eingefügt.


Zitat:

Zitat von diavy
4. wieso benutzt man als var-typ double und nicht real?

Aus der Delphi-Hilfe:
Repräsentiert einen Gleitkommawert mit doppelter Genauigkeit.
Der Typ Real entspricht in seiner aktuellen Implementierung dem Typ Double.
Die Größe in Byte eines Real-Wertes beträgt 8.

Beachte Zeile 2 obiger Erklärung "in seiner aktuellen Implementierung".
In einer anderen Implementierung mag das anders sein.
Es gibt sicherlich gute Gründe warum es Typen gibt, die je nach Implementierung unterschiedliche Bedeutungen haben können, aber ich bevorzuge eine klare und eindeutige Definition.


Zitat:

Zitat von diavy
5. DeddyH meinte die Enter-Taste sei #13, wieso heißt sie dennoch hier VK_Return?

Aus System.UITypes
const
{ Virtual Keys, Standard Set }

vkReturn = 13;

Aus Winapi.Windows
const
{ Virtual Keys, Standard Set }

VK_RETURN = vkReturn; {13}


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