Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Caption eines Edit Feld bei einem Taschenrechner ändern etc.


Moerv - Sa 11.10.08 00:23
Titel: Caption eines Edit Feld bei einem Taschenrechner ändern etc.
Abend ersma. :)

also wir haben in der schule grade mit delphi angefangen, finds eig. ganz interessant, nur unser lehrer vermittelt das ziemlich schlecht.
naja folgendes problem:
wir sollen einen taschenrechner mit einem edit feld programmieren was soweit eig. au ganz gut läuft, würd aber gern wissen wie man zB das "edit1" im edit feld von anfang an löscht bzw. ändert sonst erscheint immer ne fehlermeldung wenn mans nicht von hand macht.

am liebsten würd ichs ähnlich wie beim windows rechner habn dh das von anfang ne 0 angezeigt wird & diese dann bei eingabe einer zahl überschriebn bzw bei nem komma erhaltn bleibt

würd mich freuen wenn ihr mir en paar denkansätze liefern könntet oder ähnliches.

danke schonmal :)


jaenicke - Sa 11.10.08 00:42

:welcome: und hallo ;-)

Das Löschen am Anfang kannst du ja einfach schon im Objektinspektor machen, wenn du in Delphi das Edit anklickst. Da steht unter Text das ja drin und du kannst es entfernen oder durch eine 0 ersetzen.
Alternativ kannst du auf das Formular doppelklicken und dann dort in FormCreate hineinschreiben:

Delphi-Quelltext
1:
  Edit1.Text := '0';                    


Auf die Eingabe reagieren kannst du zum Beispiel in OnKeyPress und dort ggf. den Inhalt löschen, wenn nur die aktuelle Eingabe drin stehen soll dann, etc.


Moerv - Sa 11.10.08 02:04

danke soweit schonmal :)
wusste doch das das erste sowas einfach war^^

letzteres versteh ich dann aber leider nicht mehr, hab ein bisschen mit dem onkeypress ereignis rumprobiert tut sich aber nie was

hab den rechner au mit speedbuttons geschriebn also das man die zahlen anklickt
also mein ansatz wäre etwas wie zb

Delphi-Quelltext
1:
2:
3:
4:
if speedbutton1click,speedbutton2click etc. then
 edit1.text := '';
 x := 0
 edit1.text := speedbutton1.caption,speedbutton2.caption usw

bleibt noch die frage wo sowas dann hinmüsste

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - Sa 11.10.08 02:09

Ach so hast du das gemacht. Das heißt eine direkte Eingabe ist nicht möglich?
Dann geht OnKeyPress natürlich nicht, aber dann ist das ganze ja noch einfacher. Du hast ja dann vermutlich eine Prozedur für die ganzen Buttonklicks der Zahlen und eine für die Operationen und so, und da kannst du ja je nachdem was angeklickt wurde den Inhalt des Edits ersetzen oder die neue Eingabe anhängen.

Ohne aber genauer zu sehen wie du das programmiert hast, ist es nicht so einfach da genaueres dazu zu sagen.


Moerv - Sa 11.10.08 02:42

also der quell text sieht bis jetzt so aus


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:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
unit uRechner;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TForm1 = class(TForm)
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    SpeedButton4: TSpeedButton;
    SpeedButton5: TSpeedButton;
    SpeedButton6: TSpeedButton;
    SpeedButton7: TSpeedButton;
    SpeedButton8: TSpeedButton;
    SpeedButton9: TSpeedButton;
    SpeedButton0: TSpeedButton;
    SpeedButtonPlus: TSpeedButton;
    SpeedButton12: TSpeedButton;
    SpeedButton13: TSpeedButton;
    SpeedButton14: TSpeedButton;
    SpeedButton16: TSpeedButton;
    SpeedButton17: TSpeedButton;
    SpeedButton18: TSpeedButton;
    SpeedButton19: TSpeedButton;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    edit1: TEdit;
    SpeedButton15: TSpeedButton;
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
    procedure SpeedButton4Click(Sender: TObject);
    procedure SpeedButton5Click(Sender: TObject);
    procedure SpeedButton6Click(Sender: TObject);
    procedure SpeedButton7Click(Sender: TObject);
    procedure SpeedButton8Click(Sender: TObject);
    procedure SpeedButton9Click(Sender: TObject);
    procedure SpeedButton0Click(Sender: TObject);
    procedure SpeedButton16Click(Sender: TObject);
    procedure SpeedButtonPlusClick(Sender: TObject);
    procedure SpeedButton15Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
   var Zahl: string;
       x, Zwischenergebnis : real;
       Operation: Integer;
{$R *.dfm}

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  edit1.Text := edit1.Text + speedbutton1.caption;
  Zahl := edit1.Text;
  x := StrToFloat (Zahl);
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
  edit1.Text := edit1.Text + speedbutton2.caption;
  Zahl := edit1.Text;
  x := StrToFloat (Zahl);
end;

procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
  edit1.Text := edit1.Text + speedbutton3.caption;
  Zahl := edit1.Text;
  x := StrToFloat (Zahl);
end;

procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
  edit1.Text := edit1.Text + speedbutton4.caption;
  Zahl := edit1.Text;
  x := StrToFloat (Zahl);
end;

procedure TForm1.SpeedButton5Click(Sender: TObject);
begin
  edit1.Text := edit1.Text + speedbutton5.caption;
  Zahl := edit1.Text;
  x := StrToFloat (Zahl);
end;

procedure TForm1.SpeedButton6Click(Sender: TObject);
begin
  edit1.Text := edit1.Text + speedbutton6.caption;
  Zahl := edit1.Text;
  x := StrToFloat (Zahl);
end;

procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
  edit1.Text := edit1.Text + speedbutton7.caption;
  Zahl := edit1.Text;
  x := StrToFloat (Zahl);
end;

procedure TForm1.SpeedButton8Click(Sender: TObject);
begin
  edit1.Text := edit1.Text + speedbutton8.caption;
  Zahl := edit1.Text;
  x := StrToFloat (Zahl);
end;

procedure TForm1.SpeedButton9Click(Sender: TObject);
begin
  edit1.Text := edit1.Text + speedbutton9.caption;
  Zahl := edit1.Text;
  x := StrToFloat (Zahl);
end;

procedure TForm1.SpeedButton0Click(Sender: TObject);
begin
  edit1.Text := edit1.Text + speedbutton0.caption;
  Zahl := edit1.Text;
  x := StrToFloat (Zahl);
end;

procedure TForm1.SpeedButton16Click(Sender: TObject);
begin
     if Pos (',', edit1.Text) = 0 then
     begin
       edit1.Text := edit1.Text + Speedbutton16.caption;
       zahl := edit1.Text;
       x := StrToFloat (Zahl);
     end;
end;

procedure TForm1.SpeedButtonPlusClick(Sender: TObject);
begin
     if Operation = 0 then Zwischenergebnis := x;
     if Operation = 1 then Zwischenergebnis := Zwischenergebnis + x;
     if Operation = 2 then Zwischenergebnis := Zwischenergebnis - x;
     if Operation = 3 then Zwischenergebnis := Zwischenergebnis * x;
     if Operation = 4 then
                          begin
                            if x <> 0
                            then Zwischenergebnis := Zwischenergebnis / x
                            else ShowMessage ('Bitte keine Division durch Null!');
                          end;
     Edit1.Text := '';
     x := 0;
     Operation := 1;
end;

procedure TForm1.SpeedButton15Click(Sender: TObject);
begin
  if Operation = 0 then Zwischenergebnis := x;
  if Operation = 1 then Zwischenergebnis := Zwischenergebnis + x;
  if Operation = 2 then Zwischenergebnis := Zwischenergebnis - x;
  if Operation = 3 then Zwischenergebnis := Zwischenergebnis * x;
  if Operation = 4 then
                       begin
                         if x <> 0
                         then Zwischenergebnis := Zwischenergebnis / x
                         else ShowMessage ('Bitte keine Division durch Null!');
                       end;
  Operation := 0;
  x := Zwischenergebnis;
  edit1.Text := FloatToStr(Zwischenergebnis);
end;

end.



habs jetzt mal mit if anweisungen in den einzelnen speedbutton prozeduren versucht


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if edit1.Text := 0; 
  then edit1.Text := '';
       edit1.Text := edit1.Text + speedbutton1.caption; 
       Zahl := edit1.Text;
       x := StrToFloat (Zahl);
  else edit1.Text := edit1.Text + speedbutton1.caption;
       Zahl := edit1.Text;
       x := StrToFloat (Zahl);

end;


aba so läufts auch nicht :oops:


bin noch ziemlich unbewandert mit delphi :?


jaenicke - Sa 11.10.08 03:00

Erstens kannst du die ganzen ButtonClicks auch in einem zusammenfassen, das heißt einfach überall im Objektinspektor unter Ereignisse in OnClick die selbe Prozedur eintragen. Außerdem brauchst du die Variable Zahl gar nicht soweit ich das sehe. Deine Prozedur kann dann so ausssehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.SpeedButtonXClick(Sender: TObject);
begin
  Edit1.Text := Edit1.Text + (Sender as TSpeedButton).Caption;
  x := StrToFloat(Edit1.Text);
end;

user profile iconMoerv hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if edit1.Text := 0; 
  then edit1.Text := '';
       edit1.Text := edit1.Text + speedbutton1.caption; 
       Zahl := edit1.Text;
       x := StrToFloat (Zahl);
  else edit1.Text := edit1.Text + speedbutton1.caption;
       Zahl := edit1.Text;
       x := StrToFloat (Zahl);

end;
Da müsste eigentlich ein Fehler kommen, dass der Typ des Ausdrucks Boolean sein muss oder so ähnlich, denn ein Vergleich geht mit = und nicht mit :=, denn := ist eine Zuweisung. Die andere Sache ist, dass du einen String nicht mit einer Zahl vergleichen kannst. Also muss es heißen:

Delphi-Quelltext
1:
if Edit1.Text = '0' then                    
Nun zu deinem if..else, ich gehe einmal davon aus, dass die Anweisungen alle in if bzw. else sollten, oder? Dann musst du das aber auch so hinschreiben, nämlich mit begin..end:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  if Edit1.Text = '0' then
  begin
    Edit1.Text := '';
    Edit1.Text := Edit1.Text + SpeedButton1.Caption;
    ...
  end
  else
  begin
    ...
Dann zu dem was du machst: Du setzt den Inhalt des Edits auf leer und fügst den danach trotzdem wieder mit in den neuen Wert ein. Da da aber nix drin stehst, fügst du doch ohnehin nur die Buttonüberschrift ein. ;-) Also geht das selbe auch so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if Edit1.Text = '0' then
    Edit1.Text := SpeedButton1.Caption
  else
    Edit1.Text := Edit1.Text + SpeedButton1.Caption;
  x := StrToFloat(Edit1.Text);
end;
bzw. wenn es der selbe ButtonClick für alle Buttons mit Zahlen ist:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.SpeedButtonXClick(Sender: TObject);
begin
  if Edit1.Text = '0' then
    Edit1.Text := (Sender as TSpeedButton).Caption
  else
    Edit1.Text := Edit1.Text + (Sender as TSpeedButton).Caption;
  x := StrToFloat(Edit1.Text);
end;


Moerv - Sa 11.10.08 14:34

da muss ich mich jetzt ersma durcharbeiten, aber denke so werd ichs hinkriegen :)

vielen dank schonma, ich berichte dann mal obs funktioniert :D


Moerv - Mo 13.10.08 22:19

alles kla taschenrechner läuft jetzt genauso wie ichs mir vorgestellt hab :D

vielen dank nochmal für die hilfe!