| Autor |
Beitrag |
suga2001
      
Beiträge: 38
|
Verfasst: 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:
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}
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;
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 AXMD: Delphi-Tags hinzugefügt
|
|
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 12.11.08 18:07
Sry, ich kann den Source nicht lesen, ich bin Brillenträger und über 40  .
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 
      
Beiträge: 38
|
Verfasst: 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
|
Verfasst: 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 
      
Beiträge: 38
|
Verfasst: 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
|
Verfasst: 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):
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 a,b,c: integer; public 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 
      
Beiträge: 38
|
Verfasst: 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
|
Verfasst: 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 
      
Beiträge: 38
|
Verfasst: 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
|
Verfasst: 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.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Mi 12.11.08 19:29
suga2001 hat folgendes geschrieben : | | 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
|
Verfasst: Mi 12.11.08 19:32
[OT]@Marc.: 2 Doofe, ein Gedanke  [/OT]
|
|
Lexo80
Hält's aus hier
Beiträge: 2
|
Verfasst: 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.
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 public 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 begin Edit1.Text := Edit1.Text + '1'; Stringbuff1 := Edit1.Text; end;
if sender = button2 then begin Edit1.Text := Edit1.Text + '2'; Stringbuff1 := Edit1.Text; end;
if sender = button3 then begin Edit1.Text := Edit1.Text + '3'; Stringbuff1 := Edit1.Text; end; end;
If zustand =1 then begin if sender = button1 then begin Stringbuff2 := Stringbuff2 + '1'; Edit1.Text := Stringbuff1 + operator + Stringbuff2;
end; if sender = button2 then begin Stringbuff2 := Stringbuff2 + '2'; Edit1.Text := Stringbuff1 + operator + Stringbuff2; end; if sender = button3 then 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 :='+'; if sender = button6 then operator := '-'; if Sender = button7 then operator := '*' ; if Sender = button8 then Operator := '/'; end;
procedure TForm1.Button5Click(Sender: TObject); begin Edit1.Text := ''; Stringbuff1:=''; Stringbuff2 :=''; Zustand := 0; end;
procedure TForm1.Button9Click(Sender: TObject); 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
|
Verfasst: Do 13.11.08 13:16
Jetzt muss ich doch nochmal nachfragen: im Edit soll dann also sowas stehen?
Quelltext
Ich hatte das nämlich anders verstanden (angelehnt an den Windows-Taschenrechner).
|
|
Lexo80
Hält's aus hier
Beiträge: 2
|
Verfasst: Do 13.11.08 13:55
DeddyH hat folgendes geschrieben : | Jetzt muss ich doch nochmal nachfragen: im Edit soll dann also sowas stehen?
Quelltext
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
      
Beiträge: 101
Windows XP
Delphi 2009
|
Verfasst: 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:
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][1] of '-': 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.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Do 13.11.08 17:10
wazup hat folgendes geschrieben : | | 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?
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 PARSER.
|
|
wazup
      
Beiträge: 101
Windows XP
Delphi 2009
|
Verfasst: Do 13.11.08 19:06
|
|