Entwickler-Ecke

Sonstiges (Delphi) - Anfängertaschenrechner


Vaio - Fr 16.09.05 13:57
Titel: Anfängertaschenrechner
Hallo Leute,
ich habe für die 11. Klasse Informatik gewählt und bin richtig zufrieden damit. Wir arbeiten derzeit mit Delphi 7 und programmieren die bekannten Programme Tag/Nacht-Programm und Ampelprogramm.
Ich habe mich jetzt aber zu Hause mal drangesetzt um so zum Lernen einen Taschenrechner zu programmieren. Ich habe es so weit geschafft, dass ich 2 Edit-Felder genommen habe (a und b). Dabei wird einfach Feld a plus Feld b gerechnet wenn man auf den Button klickt. Das Ergebnis wird dann im 3. Editfeld angezeigt. Ich habe das mit der Subtraktion, Division und Multiplikation ebenfalls gemacht. Aber ich möchte nun nur noch ein Feld benötigen, für die Eingaben und das Ergebnis. Und da komme ich nicht weiter. Ihr müsst wissen das ich erst seit 1er Woche mit Delphi arbeite.

Folgendes habe ich probiert:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);

  var a, c: Real;
begin
  a := 1;
  edit1.text := floattostr(a);
end;


Aber, das kann ja nicht klappen, denn wenn ich den Button anklicke, wird die 1 angezeigt, aber beim erneuten Klicken erscheint nicht die nächste 1 also 11 dann. Und wenn ich auf die 2 klicke, verschwindet die 1 aus dem Editfeld.

Meine Frage ist jetzt, wie kann ich es so programmieren, dass die Zahlen hintereinander gereiht werden und wie soll ich es dann, zuerst mit der Addition bewerkstelligen?

Ich danke euch schon mal für eure Hilfe!


JayK - Fr 16.09.05 14:06

Hintereinanderreihen:

Delphi-Quelltext
1:
edit1.Text := edit1.Text + FloatToStr(a);                    


F34r0fTh3D4rk - Fr 16.09.05 14:07
Titel: Re: Anfängertaschenrechner
user profile iconVaio hat folgendes geschrieben:
Hallo Leute,
ich habe für die 11. Klasse Informatik gewählt und bin richtig zufrieden damit. Wir arbeiten derzeit mit Delphi 7 und programmieren die bekannten Programme Tag/Nacht-Programm und Ampelprogramm.
Ich habe mich jetzt aber zu Hause mal drangesetzt um so zum Lernen einen Taschenrechner zu programmieren. Ich habe es so weit geschafft, dass ich 2 Edit-Felder genommen habe (a und b). Dabei wird einfach Feld a plus Feld b gerechnet wenn man auf den Button klickt. Das Ergebnis wird dann im 3. Editfeld angezeigt. Ich habe das mit der Subtraktion, Division und Multiplikation ebenfalls gemacht. Aber ich möchte nun nur noch ein Feld benötigen, für die Eingaben und das Ergebnis. Und da komme ich nicht weiter. Ihr müsst wissen das ich erst seit 1er Woche mit Delphi arbeite.

Folgendes habe ich probiert:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.Button1Click(Sender: TObject);

  var a, c: Real;
begin
  a := 1;
  edit1.text := floattostr(a);
end;


Aber, das kann ja nicht klappen, denn wenn ich den Button anklicke, wird die 1 angezeigt, aber beim erneuten Klicken erscheint nicht die nächste 1 also 11 dann. Und wenn ich auf die 2 klicke, verschwindet die 1 aus dem Editfeld.

Meine Frage ist jetzt, wie kann ich es so programmieren, dass die Zahlen hintereinander gereiht werden und wie soll ich es dann, zuerst mit der Addition bewerkstelligen?

Ich danke euch schon mal für eure Hilfe!


Delphi-Quelltext
1:
edit1.text := edit1.text + floattostr(a);                    


Vaio - Fr 16.09.05 14:36

Danke. Wie kann ich es jetzt denn mit der Addition machen? Die komplette Zahlenfolge muss ja plus genommen werden mit der Zahlenfolge die danach folgt und das Ergebnis muss im selben Editfeld angezeigt werden. Wie kann ich das bewerkstelligen?


gin2309 - Fr 16.09.05 14:44

Na beim drücken von Plus (wie hast du das? ein Button? Ansonsten bei OnKeyPressed abfangen) speicherst du den Inhalt des edits in einer Variablen

Delphi-Quelltext
1:
variable:= StrToFloat(edit1.text);                    

Dann lässt du die nächste Zahlenfolge eingeben und beim drücken von = oder + speicherst du die in einer zweiten Variable und dann:

Delphi-Quelltext
1:
edit1.text:=FloatToStr(variable1+variable2);                    


Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.


Vaio - Fr 16.09.05 14:52

Ups, jetzt blicke ich net durch. Ich habe einen Plus-Button erstellt. Was muss ich jetzt genau machen? Muss ich jetzt für "OnClick" etwas programmieren oder für "OnKeyPress"?


GTA-Place - Fr 16.09.05 14:54

In OnClick kommt jetzt (Pseudo-Code):

Plus
1:
Ergebnis = 1. Zahl + 2. Zahl;                    


Minus
1:
Ergebnis = 1. Zahl - 2. Zahl;                    


Mal
1:
Ergebnis = 1. Zahl * 2. Zahl;                    


Geteilt
1:
Ergebnis = 1. Zahl div 2. Zahl;                    

Je nachdem, welche Button gedrückt wird.


Vaio - Fr 16.09.05 15:13

GTA-Place so ist mir das natürlich klar, aber wie sieht es dann im Endeffekt in der Programmiersprache aus?


GTA-Place - Fr 16.09.05 15:15

Eigentlich genau gleich nur halt in Delphi-Form:

Plus
1:
2:
Ergebnis   := Zahl1 + Zahl2;
Edit1.Text := FloatToStr(Ergebnis);


Vaio - Fr 16.09.05 15:30

Also, ich weiß das ich was falsch mache, aber ich weiß nicht was genau!?

Wenn ich den Quellcode eingebe kommt der Fehler das Ergebnis ein Undefinierter Bezeichner ist, was auch klar ist, aber ihr müsst mich verstehen, dass ich mich nicht auskenne, aber was muss denn dort jetzt hin?
Benötige ich nur diesen Code um den Befehl auszüführen oder auch Teile von gin2309?


GTA-Place - Fr 16.09.05 15:55


Delphi-Quelltext
1:
2:
3:
var
  Ergebnis:     Real;
  Zahl1, Zahl2: Real;

Ich empfehle dir den Crash-Kurs von Christian.
Hab nur den Link gerade nicht.


Pdd - Fr 16.09.05 15:56

Also ich würd es so machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var zahl1,zahl2,ergebniss:real;
begin
zahl1:=strtofloat(edit1.text);
zahl2:=strtofloat(edit2.text);
case edit3.text of
'+': ergebniss:=zahl1+zahl2;
'-':ergebniss:=zah11-zahl2;
'*':ergebniss:=zah11-zahl2;
'/':ergebniss:=zah11/zahl2; // bzw. div aber beim ergebniss werden dann die ziffern nach dem komma abgeschnitten!
end;
messagedlg('Das Ergebniss lautet....Tadadada : '+floattostr(ergebniss)+' !',mtinformation,[mbok],0);
end;


probier es aus!


Vaio - Fr 16.09.05 16:05

@Pdd

Dein Code funktioniert leider nicht, da ich nur 1 Editfeld habe und nicht, wie bei deinem Code, 3 Editfelder. Und irgendwie funktioniert der Befehle Case Of nicht -> Ordinaltyp erforderlich


GTA-Place - Fr 16.09.05 16:08

Du hast wahrscheinlich 10 Button für die Zahlen und 5 für +, -, *, / und =, oder?
So könnte man es am einfachsten erklären dann.


Pdd - Fr 16.09.05 16:14

ja dazu musst du natürlich ein drittes editfeld anlegen oder wie soll man sonst das zeichen angeben?

und wegen dem case of...(geht nur bei integer)


Delphi-Quelltext
1:
if edit3.text='+' then ergebniss:=zahl1+zahl2;                    


und so weiter :D

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.


Vaio - Fr 16.09.05 16:14

Stimmt GTA-Place! Ist das denn falsch?


GTA-Place - Fr 16.09.05 16:44

Ne, das nicht falsch. Das ist sogar ganz gut.

Mh... Ich hab grad hier ne Möglichkeit geschrieben,
doch ich muss mir eine besser überlegen.
Ich werde nachher vielleicht eine hier posten.


gin2309 - Mo 19.09.05 11:28

Hab mal schnell ein kleines Programm geschrieben, was deine Grundfunktionen unterstützen sollte. Der Rechner kann natürlich noch nicht die 'Punkt-vor-Strichrechnung-regel',aber ansonsten glaub ich, dass du das so wolltest:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
var
  Form1: TForm1;
  zwischenspeicher:real;
  rechenart:char;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  zwischenspeicher:=0;
  rechenart:='+';
end;

procedure TForm1.ButtonPlusClick(Sender: TObject);
begin
  ButtonGleich.Click;
  rechenart:='+';
end;

procedure TForm1.ButtonMinusClick(Sender: TObject);
begin
  ButtonGleich.Click;
  rechenart:='-';
end;

procedure TForm1.ButtonMalClick(Sender: TObject);
begin
  ButtonGleich.Click;
  rechenart:='*';
end;

procedure TForm1.ButtonGeteiltClick(Sender: TObject);
begin
  ButtonGleich.Click;
  rechenart:='/';
end;

procedure TForm1.ButtonGleichClick(Sender: TObject);
begin
  case rechenart of
    '+':edit1.Text:=FloatToStr(zwischenspeicher+StrToFloat(edit1.text));
    '-':edit1.Text:=FloatToStr(zwischenspeicher-StrToFloat(edit1.text));
    '*':edit1.Text:=FloatToStr(zwischenspeicher*StrToFloat(edit1.text));
    '/':edit1.Text:=FloatToStr(zwischenspeicher/StrToFloat(edit1.text));
  end;
  zwischenspeicher:=StrToFloat(edit1.text);                          //Ergebnis in speicher
  edit1.SetFocus;
end;

end.


Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt


Vaio - So 25.09.05 15:27

Danke an alle und besonders an gin2309!