Autor Beitrag
suga2001
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mi 12.11.08 17:55 
hallo leute... also, ich soll einen taschenrechner programmieren, das aber nur mit einem editfeld, mein problem ist nun,dass ich zwar die ersten zahlen eingeben kann,aber sobald ich ein operationszeichen klicke, durch mein clear alles abstürzt....


mein quellcode:
ausblenden volle Höhe 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:
var
  Form1: TForm1;
  a,b,c:integer;
  eingabe:string;

implementation

{$R *.dfm}

//Zahleneingabe im editfeld


procedure TForm1.Button10Click(Sender: TObject);
begin
edit1.text:=edit1.Text + button10.Caption;
eingabe:=edit1.Text;
a:=strtoint(eingabe);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Text:=edit1.Text + button1.caption;
eingabe:=edit1.Text;
a:=strtoint(eingabe);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
edit1.Text:=edit1.Text + button2.caption;
eingabe:=edit1.Text;
a:=strtoint(eingabe);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
edit1.Text:=edit1.Text + button3.caption;
eingabe:=edit1.Text;
a:=strtoint(eingabe);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
edit1.Text:=edit1.Text + button4.caption;
eingabe:=edit1.Text;
a:=strtoint(eingabe);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
edit1.Text:=edit1.Text + button5.caption;
eingabe:=edit1.Text;
a:=strtoint(eingabe);
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
edit1.Text:=edit1.Text + button6.caption;
eingabe:=edit1.Text;
a:=strtoint(eingabe);
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
edit1.Text:=edit1.Text + button7.caption;
eingabe:=edit1.Text;
a:=strtoint(eingabe);
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
edit1.Text:=edit1.Text + button8.caption;
eingabe:=edit1.Text;
a:=strtoint(eingabe);
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
edit1.Text:=edit1.Text + button9.caption;
eingabe:=edit1.Text;
a:=strtoint(eingabe);
end;

procedure TForm1.Button17Click(Sender: TObject);
begin
edit1.Text:=edit1.Text + button17.caption;
eingabe:=edit1.Text;
a:=strtoint(eingabe);
end;
//Zahleneingabe zahl 1 beendet





procedure TForm1.Button11Click(Sender: TObject);
begin
a:=strtoint(Edit1.Text);
Edit1.Clear;
b:=strtoint(Edit1.Text);
c:=a+b;
Edit1.Text:=inttostr(c);


end;

procedure TForm1.Button18Click(Sender: TObject);
begin
edit1.clear;
end;



wie kann ich anfangen,nach dem operationzeichen neue werte einzugeben,den andern aber nicht zu überschreiben?????



danke im voraus...

Moderiert von user profile iconAXMD: Delphi-Tags hinzugefügt
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.11.08 18:07 
Sry, ich kann den Source nicht lesen, ich bin Brillenträger und über 40 :mrgreen:.
Aber allgemein kann ich Dir nur raten: trenne die Logik von der Darstellung. Ein Editfeld stellt einen Stringwert dar und dient nicht zur Speicherung desselben, dafür verwendet man Variablen. Ich hoffe, dieser Ansatz hilft Dir schon auf die Sprünge.
suga2001 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mi 12.11.08 18:09 
oh, das tut mir leid, problem ist, ich darf nur ein editfeld benutzen und wenn ich plus clicke stürzt delphi ab,weil ich ein clear drin hab. das hab ich erst mal ausgeklammern, denn gibts aber nur den doppelten wert der eingegebenen zahl, weil ich ja noch keinen zweiten wert eingegeben habe.

frage ist, wie kann ich das editfeld leeren und danach die 2te zahl eingeben????
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.11.08 18:37 
Im Prinzip hast Du ja den richtigen Ansatz. Du merkst Dir die Eingabe und leerst anschließend das Edit-Feld. Allerdings musst Du dann natürlich warten, bis eine weitere Eingabe erfolgt ist.
suga2001 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mi 12.11.08 18:43 
also, ich glaube das prinzip habe ich verstanden,aber nun ergibt sich gleich ein neues problem. nun möchte ich das in einer schleife ausdrücken,dann schimpft der compiler aber...habe mir gedacht :

procedure TForm1.Button11Click(Sender: TObject); // für addition
begin
a:=strtoint(Edit1.Text);
Edit1.Text:='';

if button15.Click // ist bei mir = button...
then
b:=strtoint(Edit1.Text);
c:=a+b;
Edit1.Text:=inttostr(c);


nun bekomm ich die schleife nicht hin,weil ausdruck boolean sein muss, also true o. false....... aber wie?
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.11.08 18:54 
Mir scheint, Du denkst nicht ereignisorientiert, habt Ihr vorher in TurboPascal geproggt? Anbei mal ein minimales Beispiel mit einem Edit (edtEingabe) und 2 Buttons (btnPlus und btnErgebnis):
ausblenden volle Höhe 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:
unit uMiniCalc;

interface

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

type
  TfrmMiniCalc = class(TForm)
    edtEingabe: TEdit;
    btnPlus: TButton;
    btnErgebnis: TButton;
    procedure btnPlusClick(Sender: TObject);
    procedure btnErgebnisClick(Sender: TObject);
  private
    { Private-Deklarationen }
    a,b,c: integer;
  public
    { Public-Deklarationen }
  end;

var
  frmMiniCalc: TfrmMiniCalc;

implementation

{$R *.dfm}

procedure TfrmMiniCalc.btnErgebnisClick(Sender: TObject);
begin
  b := StrToInt(edtEingabe.Text);
  c := a + b;
  edtEingabe.Text := IntToStr(c);
end;

procedure TfrmMiniCalc.btnPlusClick(Sender: TObject);
begin
  a := a + StrToInt(edtEingabe.Text);
  edtEingabe.Clear;
  edtEingabe.SetFocus;
end;

end.
suga2001 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mi 12.11.08 18:58 
ne, kenne kein turbopascal....
ich muss doch irgendwie mit einer schleife abfragen können, ob mein istgleich-button gedrückt wurde. gibts da keine if-schleife zu???
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.11.08 19:00 
Wenn der Button geklickt wird, löst er ein Ereignis aus, da ist nix mit Schleife (OK, windowsintern schon, aber das steht auf einem anderen Blatt).
suga2001 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Mi 12.11.08 19:03 
also a habe ich eingelesen, nun will ich B einlesen,aber erst,nachdem = geklickt wurde. will also eine schleife machen mit:

wenn istgleichzeichen geklickt denn lese b auf edit1 ein. a habe ich doch schon eingelesen. lese ich das nicht separat ein,dann hab ich 2*a....das ist ja nicht der sinn....
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.11.08 19:05 
Hast Du Dir mein Beispiel mal angesehen?

[edit]if-Schleife[/edit]


Zuletzt bearbeitet von DeddyH am Mi 12.11.08 19:30, insgesamt 1-mal bearbeitet
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Mi 12.11.08 19:29 
user profile iconsuga2001 hat folgendes geschrieben Zum zitierten Posting springen:
gibts da keine if-schleife zu???

[OT] By the way: Es gibt keine If-Schleifen, sondern nur If-Abfragen! [/OT]
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 12.11.08 19:32 
[OT]@Marc.: 2 Doofe, ein Gedanke :lol: [/OT]
Lexo80
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 13.11.08 12:59 
Titel: Taschenrechner
Hi Leute,

bin ganz neu hier, das ist mein erster Beitrag :)
Ich bin Programmieranfänger (wir machen das grade in der Abendschule)


@ suga2001

du kannst das schon mit if abfragen.
Aber du musst dann das Ereignis allgemein halten

also anstatt

TForm1.Button10Click schreibst du TForm1.ButtonZahlClick (als Beispiel)

Natürlich musst du die Deklaration anpassen.

dann kannst du unter einer Großen Routine Programmieren

also If sender button.xy (dein = Button eben)then
begin
...
end;



Ich an deiner Stelle würde wenn du immer die Anzeige im Rechner haben willst mit unterschiedlichen Routinen Rechnen.

Also die Zahlen unter einer buttonZahl routine
die operatoren unter einer buttonOperator Routine

dann kannst du nämlich auch gut die Anzeige im Editfeld halten.

z.b.
ausblenden volle Höhe 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:
unit Rechner1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    procedure ButtonZahlClick(Sender: TObject);
    procedure ButtonOperatorClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
var
   Stringbuff1,Stringbuff2:String;
   zustand,ergebnis:Integer;
   operator:Char;

{$R *.dfm}

procedure TForm1.ButtonZahlClick(Sender: TObject);
begin

if zustand = 0 then
begin

  if sender = button1 then       // Zahl1
     begin
        Edit1.Text := Edit1.Text + '1';
        Stringbuff1 := Edit1.Text;
     end;

  if sender = button2 then       // Zahl2
     begin
        Edit1.Text := Edit1.Text + '2';
        Stringbuff1 := Edit1.Text;
     end;

  if sender = button3 then       // Zahl3
     begin
        Edit1.Text := Edit1.Text + '3';
        Stringbuff1 := Edit1.Text;
     end;
end;

If zustand =1 then
begin
  if sender = button1 then       // Zahl1
     begin
        Stringbuff2 := Stringbuff2 + '1';
        Edit1.Text := Stringbuff1 + operator + Stringbuff2;

     end;
  if sender = button2 then       // Zahl2
     begin
        Stringbuff2 := Stringbuff2 + '2';
        Edit1.Text := Stringbuff1 + operator + Stringbuff2;
     end;
  if sender = button3 then       // Zahl3
     begin
        Stringbuff2 := Stringbuff2 + '3';
        Edit1.Text := Stringbuff1 + operator + Stringbuff2;
     end;
end;

end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text := '';
zustand :=0;
end;


procedure Tform1.ButtonOperatorClick(Sender: TObject);
begin
zustand :=1;
if sender = Button4 then operator :='+';   //button4 = +
if sender = button6 then operator := '-';  // buton6 = -
if Sender = button7 then operator := '*' ;  // button 7 = *
if Sender = button8 then Operator := '/';   // button 8 = /

end;

procedure TForm1.Button5Click(Sender: TObject);    // C ... alles löschen neue eingaben.
begin
Edit1.Text := '';
Stringbuff1:='';
Stringbuff2 :='';
Zustand := 0;
end;

procedure TForm1.Button9Click(Sender: TObject);     //  = (ausrechnen)
begin

case operator of

    '+'begin
           ergebnis:= StrToInt(Stringbuff1)+ StrToInt(Stringbuff2);
         end;
    '-'begin
           ergebnis:= StrToInt(Stringbuff1)- StrToInt(Stringbuff2);
         end;
     end;

  Edit1.Text := IntToStr(ergebnis);
  Stringbuff1 :=Edit1.text;
  Stringbuff2:='';
  zustand := 0;

end;
end.


und so weiter eben :-)
ich hab den Quellcode jetzt nicht probiert.
Nur eben hier eingetippt.
wenn da noch Fehler drin sind dann sorry, ich bin grad bei der Arbeit und schau kurz nebenbei hier rein.


Ich hoff du hast mein Denkansatz verstanden und das hilft dir auch n bisschen.


Zuletzt bearbeitet von Lexo80 am Do 13.11.08 14:20, insgesamt 1-mal bearbeitet
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 13.11.08 13:16 
Jetzt muss ich doch nochmal nachfragen: im Edit soll dann also sowas stehen?
ausblenden Quelltext
1:
10+23					

Ich hatte das nämlich anders verstanden (angelehnt an den Windows-Taschenrechner).
Lexo80
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 13.11.08 13:55 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt muss ich doch nochmal nachfragen: im Edit soll dann also sowas stehen?
ausblenden Quelltext
1:
10+23					

Ich hatte das nämlich anders verstanden (angelehnt an den Windows-Taschenrechner).



ja mhhh da hab ich mir jetzt gar keine Gedanken gemacht, ob das so sein soll.
Aber wäre im Grunde ja auch nicht das Problem.


ich hab mal auf die schnelle was getippt (als Anhang dabei)
allerdings nur ums Prinzip zu verdeutlichen nur mt den zahlen 1-3 und operator + und -

der rest wäre ja identisch.
Das man, sobald ein operator gedrückt wurde nur noch die nächste eingegebene Zahl sieht wäre mit dem Prinzip auch ohne weiteres möglich.

Edit1.text := Stringbuff2;

aber schauts euch mal an.
Wäre um Feedback auch dankbar :-)

wie gesagt, ich bin noch Anfänger.
Einloggen, um Attachments anzusehen!
wazup
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 101

Windows XP
Delphi 2009
BeitragVerfasst: Do 13.11.08 14:07 
Hi

Ich hab damals auch mal einen Rechner gebaut mit einem Edit Feld ("1+1+1*2/2" usw...) und einem Button (Berechnen) ^^.
Mein Code dazu:

ausblenden volle Höhe 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:
procedure TForm2.Button1Click(Sender: TObject);
var
  Result: Extended;
  TermList: TStrings;
  Term: string;
  I: Integer;
begin
  Term := Edit1.Text;

  Term := StringReplace(Term, '-'#13 + '-' + #13, [rfReplaceAll]);
  Term := StringReplace(Term, '+'#13 + '+' + #13, [rfReplaceAll]);
  Term := StringReplace(Term, '/'#13 + '/' + #13, [rfReplaceAll]);
  Term := StringReplace(Term, '*'#13 + '*' + #13, [rfReplaceAll]);

  TermList := TStringList.Create;
  try
    TermList.Text := Term;

    Result := StrToFloat(TermList[0]);
    TermList.Delete(0);

    for I := 0 to TermList.Count - 1 do
    begin
      if TermList.Count = 0 then
        Break
      else begin

        case TermList[0][1of
          '-': Result := Result - StrToFloat(TermList[1]);
          '+': Result := Result + StrToFloat(TermList[1]);
          '/': Result := Result / StrToFloat(TermList[1]);
          '*': Result := Result * StrToFloat(TermList[1]);
        end;

        TermList.Delete(0);
      end;
    end;

    Label1.Caption := FloatToStr(Result);
  finally
    TermList.Free;
  end;
end;
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 13.11.08 17:10 
user profile iconwazup hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab damals auch mal einen Rechner gebaut mit einem Edit Feld ("1+1+1*2/2" usw...) und einem Button (Berechnen) ^^.

Aber was nutzt mir ein Rechner, der kein Punkt vor Strich kennt? :P
Man müsste daher erst alle Punktoperationen durchführen und erst danach, kann man in diesem einfachen Fall den Term von links nach rechts zusammenfassen.
Übrigens, da das Stichwort noch nicht gefallen ist, es handelt sich hierbei um einen Suche in der Entwickler-Ecke PARSER.
wazup
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 101

Windows XP
Delphi 2009
BeitragVerfasst: Do 13.11.08 19:06 
user profile iconMarc. hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconwazup hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab damals auch mal einen Rechner gebaut mit einem Edit Feld ("1+1+1*2/2" usw...) und einem Button (Berechnen) ^^.

Aber was nutzt mir ein Rechner, der kein Punkt vor Strich kennt? :P
Man müsste daher erst alle Punktoperationen durchführen und erst danach, kann man in diesem einfachen Fall den Term von links nach rechts zusammenfassen.
Übrigens, da das Stichwort noch nicht gefallen ist, es handelt sich hierbei um einen Suche in der Entwickler-Ecke PARSER.
Muss man halt selber einbauen :-D