Entwickler-Ecke

Sonstiges (Delphi) - Delphi Taschenrechner Problem (Phänomen)


boboy162 - Mo 12.10.09 16:40
Titel: Delphi Taschenrechner Problem (Phänomen)
Hallo zusammen, bin neu hier und das ist mein erster Eintrag hier ^^

Also ich steh hier vor einem Problem das irgendwie für mich einfach nicht Nachvollziehbar ist, und das mir schon alle Nerven geraubt hat.

Problem: Ich gebe eine Zahl ein klicke dann auf Plus, und wenn ich jetzt den Zweiten Summanden sozusagen eintippen will, dann müsste er wenn ich die erste Ziffer eingebe sofort das edit1 Fenster löschen und dies durch die Ziffer ersetzen.

Gruß

und vielen Dank


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:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    BPlus: TButton;
    BMinus: TButton;
    BMal: TButton;
    BTeilen: TButton;
    BGleich: TButton;
    B7: TButton;
    B8: TButton;
    B6: TButton;
    B3: TButton;
    B4: TButton;
    B5: TButton;
    B1: TButton;
    BPunkt: TButton;
    B2: TButton;
    B9: TButton;
    BClear: TButton;
    Edit1: TEdit;
    B0: TButton;


    procedure B1Click(Sender: TObject);
    procedure B2Click(Sender: TObject);
    procedure B3Click(Sender: TObject);
    procedure B4Click(Sender: TObject);
    procedure B5Click(Sender: TObject);
    procedure B6Click(Sender: TObject);
    procedure B7Click(Sender: TObject);
    procedure B8Click(Sender: TObject);
    procedure B9Click(Sender: TObject);
    procedure B0Click(Sender: TObject);
    procedure BGleichClick(Sender: TObject);
    procedure BPlusClick(Sender: TObject);

    procedure richtigAnzeigen(text: string);
    procedure Zusammenrechnen();
    procedure ProzessAntwortschonangezeigt();

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Ergebnis: double = 0;
  Operator: string = '';
  Antwortschonangezeigt : integer = 0;

implementation

{$R *.dfm}

procedure TForm1.Zusammenrechnen();
Begin
    if Operator = '' then begin
      Ergebnis := strtofloat(edit1.Text);
    end;
    if Operator = '+' then begin
      Ergebnis := Ergebnis + strtofloat(edit1.Text);
    end;
    if Operator = 'x' then begin
      Ergebnis := Ergebnis * strtofloat(edit1.Text);
    end;
    if Operator = '/' then begin
      Ergebnis := Ergebnis / strtofloat(edit1.Text);
    end;
    if Operator = '-' then begin
      Ergebnis := Ergebnis - strtofloat(edit1.Text);
    end;
end;

procedure TForm1.ProzessAntwortschonangezeigt();
  begin
    Antwortschonangezeigt := 1;
    edit1.Text := floattostr(Ergebnis);
  end;


procedure TForm1.richtigAnzeigen(text: string);
begin

    //Falls Antwort schon angezeigt, muss das Fenster gelöscht werden, damit einen neuen Eingabe gemacht werden kann.
    if Antwortschonangezeigt = 1 then begin
      Antwortschonangezeigt := 0;
      edit1.text := '' ;
    end;

    //Zahlen wie 076 verhindern
    if edit1.Text = '0' then begin
      edit1.Text := '';
    end;
    edit1.Text := edit1.Text + text;

  end;








procedure TForm1.BPlusClick(Sender: TObject);
  begin

    //Prozess Zusammenrechnen und speichert Eingabe in Ergebnis.
    Zusammenrechnen();

    //Operator setzen
    Operator := '+';

    //Antwort schon angezeigt
    ProzessAntwortschonangezeigt();

  end;




procedure TForm1.BGleichClick(Sender: TObject);
begin
    //Prozess Zusammenrechnen und speichert Eingabe in Ergebnis.
    Zusammenrechnen();

    //Operator setzen
    Operator := '';

    //Antwort schon angezeigt
    ProzessAntwortschonangezeigt();

end;


procedure TForm1.B1Click(Sender: TObject);
begin
      richtigAnzeigen ('1');


end;

procedure TForm1.B2Click(Sender: TObject);
begin
richtigAnzeigen ('2');


end;

procedure TForm1.B3Click(Sender: TObject);
begin
richtigAnzeigen ('3');

end;

procedure TForm1.B4Click(Sender: TObject);
begin
richtigAnzeigen ('4');

end;

procedure TForm1.B5Click(Sender: TObject);
begin
richtigAnzeigen ('5');

end;

procedure TForm1.B6Click(Sender: TObject);
begin
richtigAnzeigen ('6');

end;

procedure TForm1.B7Click(Sender: TObject);
begin
richtigAnzeigen ('7');


end;

procedure TForm1.B8Click(Sender: TObject);
begin
richtigAnzeigen ('8');

end;

procedure TForm1.B9Click(Sender: TObject);
begin
richtigAnzeigen ('9');

end;


procedure TForm1.B0Click(Sender: TObject);
begin
richtigAnzeigen ('0');

end;

end.


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


martin300 - Mo 12.10.09 17:10

Hallo,
eine Möglichkeit wäre folgendes:
Deine Methode Zusammenrechnen wird immer ausgeführt sobald ein Rechenoperation durchgeführt wird. Dort könnte auch noch eine Variable zb. "LoescheDisplay" gesetzt werden. Der nächste Schritt ist eine Eingabe der Buttons, die Methode richtigAnzeigen wird aufgerufen. Wenn du dort abfragen würdest ob "LoescheDisplay" gesetzt wurde, dann lösche die Anzeige und setzte "LoescheDisplay" auf false zurück;
Somit würde das gleiche Verhalten wie bei einem Taschenrechner erzeugt werden;


boboy162 - Mo 12.10.09 17:17

Ist das nicht das selbe wie Antwortschonangezeigt?

Gruß

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Also ich muss mich nochmal melden, aber das Problem hat sich wohl gelöst!!!^^
Einfach SOOOOOOOOOOO!!! ICH VERSTEH EINFACH NICHT WARUM SO GANZ PLÖtzlich, obwohl ich mich jetzt so recht erinnere und ich eigentlich nichts verändert habe.

Egal, zumindest trotzdem Danke für die Hilfe!


Gruß

Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.


martin300 - Mo 12.10.09 17:34

ok.


boboy162 - Mo 12.10.09 17:57

Ach neues Problem...

Wie kann ich die Hochzahlen ausrechnen?

Hab Zwei Zahlen. LetztesErgebnis und die Zahl die im Edit1 steht. .

Delphi-Quelltext
1:
edit1.text := Power(letztesErgebnis, (strtofloat (edit1.Text)));                    

Funktuniert aber irgendwie nicht.

Hmmmmmmmm


Edit: Ich glaub ich hab dieses Math Unit nicht.


Danke

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


martin300 - Mo 12.10.09 18:09


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  x : Double;
begin
  x := power(2,2);
  lbl1.Caption := FloatToStr(x);
end;


Typumwandlung bzw. in Uses Math anhängen;


boboy162 - Mo 12.10.09 18:22

Also ich hab gemerkt dass ich diese Math Bibliothek oder wie es auch heisst nicht habe, zumindest erkennt Delphi diese bei der Deklaration unter USES mit "MATH" nicht.
Hab dann das Problem gelöst in dem ich geschaut hab wie so eine Funktion die so eine Rechnung mit Hochzahlen löst aussieht.
Hier dann der ganze Code, für die Leute die vor einem ähnlichem Problem stehen oder stehen werden.


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:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    BPlus: TButton;
    BMinus: TButton;
    BMal: TButton;
    BTeilen: TButton;
    BGleich: TButton;
    B7: TButton;
    B8: TButton;
    B6: TButton;
    B3: TButton;
    B4: TButton;
    B5: TButton;
    B1: TButton;
    BPunkt: TButton;
    B2: TButton;
    B9: TButton;
    BClear: TButton;
    Edit1: TEdit;
    B0: TButton;
    BPlusMinus: TButton;
    BHochzahl: TButton;
    BWurzel: TButton;
    BCos: TButton;


    procedure B1Click(Sender: TObject);
    procedure B2Click(Sender: TObject);
    procedure B3Click(Sender: TObject);
    procedure B4Click(Sender: TObject);
    procedure B5Click(Sender: TObject);
    procedure B6Click(Sender: TObject);
    procedure B7Click(Sender: TObject);
    procedure B8Click(Sender: TObject);
    procedure B9Click(Sender: TObject);
    procedure B0Click(Sender: TObject);
    procedure BGleichClick(Sender: TObject);
    procedure BPlusClick(Sender: TObject);

    procedure richtigAnzeigen(text: string);
    procedure Zusammenrechnen();
    procedure ProzessAntwortschonangezeigt();
    procedure BMinusClick(Sender: TObject);
    procedure BMalClick(Sender: TObject);
    procedure BTeilenClick(Sender: TObject);
    procedure BClearClick(Sender: TObject);
    procedure BPunktClick(Sender: TObject);
    procedure BPlusMinusClick(Sender: TObject);
    procedure BHochzahlClick(Sender: TObject);
    procedure BWurzelClick(Sender: TObject);
    procedure BCosClick(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Ergebnis: double = 0;
  Operator: string = '';
  Antwortschonangezeigt : integer = 0;

implementation

{$R *.dfm}


function Potenz(Base, Exponent: Extended): Extended;
begin
  if Exponent = 0.0 then
    Result := 1.0
  else if (Base = 0.0and (Exponent > 0.0then
    Result := 0.0
  else if Exponent = 2 then
    result := Sqr(Base)
  else
    Result := Exp(Ln(Base) * Exponent );
end;

function degcos(x: Extended): Extended;   //Cosinus Berechnen
begin
degcos := cos(x * 2 * pi / 360);
end;


procedure TForm1.Zusammenrechnen();
Begin
    if Operator = '' then begin
      Ergebnis := strtofloat(edit1.Text);
    end;
    if Operator = '+' then begin
      Ergebnis := Ergebnis + strtofloat(edit1.Text);
    end;
    if Operator = 'x' then begin
      Ergebnis := Ergebnis * strtofloat(edit1.Text);
    end;
    if Operator = '/' then begin
      Ergebnis := Ergebnis / strtofloat(edit1.Text);
    end;
    if Operator = '-' then begin
      Ergebnis := Ergebnis - strtofloat(edit1.Text);
    end;
    if Operator = 'xx' then begin
      Ergebnis := Potenz(Ergebnis, (strtofloat (edit1.Text)));
    end;
    if Operator = 'Wurzel' then begin
      Ergebnis := Potenz(Ergebnis, 0.5);
    end;
    if Operator = 'Cos' then begin
      Ergebnis := degCos (strtofloat (edit1.Text));
    end;


end;

procedure TForm1.ProzessAntwortschonangezeigt();
  begin
    Antwortschonangezeigt := 1;
    edit1.Text := floattostr(Ergebnis);
  end;


procedure TForm1.richtigAnzeigen(text: string);
begin

    //Falls Antwort schon angezeigt, muss das Fenster gelöscht werden, damit einen neuen Eingabe gemacht werden kann.
    if Antwortschonangezeigt = 1 then begin
      Antwortschonangezeigt := 0;
      edit1.text := '' ;
    end;

    //Zahlen wie 076 verhindern
    if edit1.Text = '0' then begin
      edit1.Text := '';
    end;
    edit1.Text := edit1.Text + text;

  end;


procedure TForm1.BTeilenClick(Sender: TObject);
begin
    //Prozess Zusammenrechnen und speichert Eingabe in Ergebnis.
    Zusammenrechnen();

    //Operator setzen
    Operator := '/';

    //Antwort schon angezeigt
    ProzessAntwortschonangezeigt();
end;

procedure TForm1.BMinusClick(Sender: TObject);
  begin
    //Prozess Zusammenrechnen und speichert Eingabe in Ergebnis.
    Zusammenrechnen();

    //Operator setzen
    Operator := '-';

    //Antwort schon angezeigt
    ProzessAntwortschonangezeigt();
  end;

procedure TForm1.BPlusClick(Sender: TObject);
  begin

    //Prozess Zusammenrechnen und speichert Eingabe in Ergebnis.
    Zusammenrechnen();

    //Operator setzen
    Operator := '+';

    //Antwort schon angezeigt
    ProzessAntwortschonangezeigt();

  end;

procedure TForm1.BHochzahlClick(Sender: TObject);
begin
//Prozess Zusammenrechnen und speichert Eingabe in Ergebnis.
    Zusammenrechnen();

    //Operator setzen
    Operator := 'xx';

    //Antwort schon angezeigt
    ProzessAntwortschonangezeigt();
end;

procedure TForm1.BWurzelClick(Sender: TObject);
begin
    //Prozess Zusammenrechnen und speichert Eingabe in Ergebnis.
    Zusammenrechnen();

    //Operator setzen
    Operator := 'Wurzel';

    //Antwort schon angezeigt
    ProzessAntwortschonangezeigt();

end;

procedure TForm1.BCosClick(Sender: TObject);
begin
    //Prozess Zusammenrechnen und speichert Eingabe in Ergebnis.
    Zusammenrechnen();

    //Operator setzen
    Operator := 'Cos';

    //Antwort schon angezeigt
    ProzessAntwortschonangezeigt();

end;



procedure TForm1.BGleichClick(Sender: TObject);
begin
    //Prozess Zusammenrechnen und speichert Eingabe in Ergebnis.
    Zusammenrechnen();

    //Operator setzen
    Operator := '';

    //Antwort schon angezeigt
    ProzessAntwortschonangezeigt();

end;

procedure TForm1.BMalClick(Sender: TObject);
begin
//Prozess Zusammenrechnen und speichert Eingabe in Ergebnis.
    Zusammenrechnen();

    //Operator setzen
    Operator := 'x';

    //Antwort schon angezeigt
    ProzessAntwortschonangezeigt();
end;


procedure TForm1.B1Click(Sender: TObject);
begin
      richtigAnzeigen ('1');


end;

procedure TForm1.B2Click(Sender: TObject);
begin
richtigAnzeigen ('2');


end;

procedure TForm1.B3Click(Sender: TObject);
begin
richtigAnzeigen ('3');

end;

procedure TForm1.B4Click(Sender: TObject);
begin
richtigAnzeigen ('4');

end;

procedure TForm1.B5Click(Sender: TObject);
begin
richtigAnzeigen ('5');

end;

procedure TForm1.B6Click(Sender: TObject);
begin
richtigAnzeigen ('6');

end;

procedure TForm1.B7Click(Sender: TObject);
begin
richtigAnzeigen ('7');


end;

procedure TForm1.B8Click(Sender: TObject);
begin
richtigAnzeigen ('8');

end;

procedure TForm1.B9Click(Sender: TObject);
begin
richtigAnzeigen ('9');

end;


procedure TForm1.B0Click(Sender: TObject);
begin
richtigAnzeigen ('0');

end;

procedure TForm1.BPunktClick(Sender: TObject);
begin
richtigAnzeigen ('.');

end;
procedure TForm1.BPlusMinusClick(Sender: TObject);
begin
richtigAnzeigen ('-');

end;







procedure TForm1.BClearClick(Sender: TObject);
begin
Ergebnis := 0 ;
Operator := '';
Antwortschonangezeigt := 0;
edit1.Text := '';
end;



end.



Nur noch eine Frage, wie schaff ich es gewisse Teile in meinem Code zusammen zufassen. Also z.B so dass dann bei den Buttons im Editor ein Plus Zeichen davor steht damit man sich das anzeigen kann oder ausblenden kann.
Weil der ist jetzt ziemlich lang geworden mit der Zeit.

Und noch eine Frage...^^ Wie kann ich diese Math Bibiothek noch dazu installieren. Besitze die Schüler Version von Delphi 6.


Gruß

Danke

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


martin300 - Di 13.10.09 10:18

Sobald du auf der Form auf einen Button klickst wird dem Ereignis eine Methode zugewiesen. Bei dir ist das B0Click bis B9Click und noch die ganzen Operatoren. Der Inhalt ist immer

Delphi-Quelltext
1:
richtigAnzeigen ('entsprechende Nummer');                    

Da bei einem Taschenrechner die Buttons eine Beschriftung haben könntest du diese Abfangen und den ganzen Button klicks eine einzige Methode zuweisen. Diese Methode liest die Beschriftung ein und sendet sie weiter.
Das könnte so aussehen:


Delphi-Quelltext
1:
procedure ButtonClick (Sender : TObject);                    



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TFormXX.ButtonClick(Sender: TObject);
var
  btnCaption : String;
begin
  if Sender is TButton then
  begin
    btnCaption := TButton(Sender).Caption;
    richtigAnzeigen(btnCaption);
  end;
end;


Diese Methode kann im Objektinspektor bei jedem Button in der Registerkarte Ereignisse unter Eingabe und dann OnClick (dort stehen schon deine ganzen Methoden) ersetzt werden.

Wie es mit der Potenz in deiner Delphi Version aussieht kann ich nicht sagen. Du hast aber schon selbst eine Funktion geschrieben, die das auch kann.


boboy162 - Di 13.10.09 17:08

Gibt es keine möglich keit im Delphi Editor gewisse Teile des Quelltextes auszublenden, zusammen zufassen oder um irgendwie die ÜBersichtbarkeit zu steigern?


Gruß


Hugo343 - Di 13.10.09 17:23

Soweit ich weiß ist die einfachste Möglichkeit dazu auf das + links neben "procedure ..." klicken. Oder du lagerst Funktionen und Prozeduren in einer anderen Unit aus.


martin300 - Di 13.10.09 18:08

Du könntest auf eine neue Delphi Version umsteigen. Nähere Infos gibt hier:

http://www.delphi-library.de/viewtopic.php?p=539975


jaenicke - Mi 14.10.09 01:24

user profile iconmartin300 hat folgendes geschrieben Zum zitierten Posting springen:
Du könntest auf eine neue Delphi Version umsteigen. Nähere Infos gibt hier:

http://www.delphi-library.de/viewtopic.php?p=539975
Nein, leider ist das nicht mehr möglich wie ich auch vor einigen Tagen in die Anleitung hineineditiert habe. Seit einigen Tagen ist Turbo Delphi nämlich nicht mehr verfügbar.

Und wenn die Version von Delphi um die es hier geht noch nicht einmal die Unit Math kennt, dann sind dort sicher auch noch keine Funktionen wie Codefolding oder ähnliches drin, weil es sich noch um Delphi 3 oder so handelt. Leider kommt die Frage dann 3 Wochen zu spät oder so, denn derzeit gibt es eben leider keine neuere Delphiversion mehr kostengünstig.


boboy162 - Sa 17.10.09 16:57

Hallo zusammen

ICh möchte jetzt meinem Taschenrechner das Rechnen mit Logarithmus zeigen, da ich die Math Unit nicht einbinden kann, wollte ich fragen ob jemand eine Funktion kennt, die einen Logarithmus berechnet.

Hab bei google schon nachgefragt...^^


Gruß


jaenicke - So 18.10.09 00:18

user profile iconboboy162 hat folgendes geschrieben Zum zitierten Posting springen:
da ich die Math Unit nicht einbinden kann
Also selbst bei Delphi 3 ist die eigentlich dabei.