Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - taschenrechner
safak67 - Mi 03.06.09 12:11
Titel: taschenrechner
hi,
ich hab ein taschenrechner programmiert aber weiß nicht wie ich das mit der berrechnung mache.. ich hoffe ihr könnt mir helfen.
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:
| unit Calculator_Main;
interface
uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls;
type TFormTR = class(TForm) Sp7: TSpeedButton; Sp8: TSpeedButton; Sp9: TSpeedButton; Sp4: TSpeedButton; Sp5: TSpeedButton; Sp6: TSpeedButton; Sp1: TSpeedButton; Sp2: TSpeedButton; Sp3: TSpeedButton; Sp0: TSpeedButton; DecimalSep: TSpeedButton; spResult: TSpeedButton; SpPlus: TSpeedButton; SpMinus: TSpeedButton; SpMal: TSpeedButton; SpDurch: TSpeedButton; LabelAnzeige: TLabel; SpeedButton1: TSpeedButton; procedure FormCreate(Sender: TObject); procedure SpZahlClick(Sender: TObject); procedure SpZeichenClick(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); procedure spResultClick(Sender: TObject); private op : char; SpArray : ARRAY[0..9] OF TSpeedButton; public end;
var FormTR: TFormTR;
implementation
{$R *.DFM}
procedure TFormTR.FormCreate(Sender: TObject); begin SpArray [0] := Sp0; SpArray [1] := Sp1; SpArray [2] := Sp2; SpArray [3] := Sp3; SpArray [4] := Sp4; SpArray [5] := Sp5; SpArray [6] := Sp6; SpArray [7] := Sp7; SpArray [8] := Sp8; SpArray [9] := Sp9; end;
procedure TFormTR.SpeedButton1Click(Sender: TObject); begin LabelAnzeige.Caption := '0'; end;
procedure TFormTR.spResultClick(Sender: TObject); var Formular,Seg1,Seg2: string; begin Formular := LabelAnzeige.Caption; if pos('+',Formular) > 1 then begin Seg1 := copy(Formular,1,pos('+',Formular) - 1); Seg2 := copy(Formular,pos('+',Formular) + 1,length(Formular)); end; ShowMessage(Seg1+'+'+Seg2);
end;
procedure TFormTR.SpZahlClick(Sender: TObject); begin if LabelAnzeige.caption='0' then LabelAnzeige.caption:=''; if LabelAnzeige.caption='Error' then LabelAnzeige.caption:='';
LabelAnzeige.caption := LabelAnzeige.caption + TSpeedButton(Sender).Caption;
end;
procedure TFormTR.SPZeichenClick(Sender: TObject); begin
if LabelAnzeige.caption='Error' then LabelAnzeige.caption:='0'; if sender = spPlus then begin op:='+' end; if sender = spMinus then begin op:='-' end; if sender = spMal then begin op:='x' end; if sender = spDurch then begin
op:='/' end;
LabelAnzeige.caption := LabelAnzeige.caption + op; end;
end. |
Moderiert von
Narses: Quote- durch Delphi-Tags ersetzt
thepaine91 - Mi 03.06.09 12:19
Sag doch mal genau was deine Frage ist. Erklär es mal in ein paar Sätzen aber so ist das ziemlich undurchschaubar.
jaenicke - Mi 03.06.09 13:02
Wofür erstellst du das Array mit den Buttons? Das verwendest du doch gar nicht.
Kann es sein, dass du da Code von irgendwo kopiert hast? Denn einerseits hast du im (auskommentierten) Quelltexte Ansätze eines direkten Abarbeitens drin, andererseits versuchst du bei einem Klick auf den Ergebnisbutton die vorherigen Eingaben zu parsen. :gruebel:
Grundsätzlich musst du dir erst einmal darüber klar werden was du eigentlich machen willst. Entweder du speicherst beim Klick auf einen Operator die aktuelle Zahl, dann den Operator und hast direkt die einzelnen Teile der Rechnung (so sieht es in dem auskommentierten Quelltext aus), oder du schreibst alles inkl. Operator in die Anzeige und wertest das hinterher aus.
Im Moment musst du doch nur das
ShowMessage(Seg1+'+'+Seg2); durch die tatsächliche Berechnung ersetzen und das für alle Operatoren machen. Damit ist dann nur eine Berechnung mit zwei Operanden möglich.
Vielleicht fehlt dir an der Stelle StrToFloat / FloatToStr. Damit kannst du den String in Seg1 und Seg2 in eine /Zahl umwandeln und nach der Rechnung zurück.
Dann noch der Hinweis:
Zum Thema Taschenrechner gibts schon relativ viele Fragen im Forum, da findest du vermutlich auch noch einiges interessantes. ;-)
// EDIT:
Crosspost: :roll:
http://www.delphipraxis.net/post1044070.html
safak67 - Mi 03.06.09 13:55
ersten wusste ich nicht das ich crosspos gemacht habe sorry..
das programm habe ich jetzt umgeändert, wie gesagt nur die berechnung fehlt.. ich weiß aber nicht wie ich auf die einzelnen abschnitte zugreife bei der berechnung.. wenn ich z.B jetzt 24+13*5-4 mache dann habe ich ja 24 als seg1 und der rest ist seg2.. wie teile ich die und wie mache ich die rechnung
jaenicke - Mi 03.06.09 14:05
Da bist du dann schon bei einem Parser, das ist relativ kompliziert...
Vielleicht solltest du es erst einmal bei zwei Operatoren belassen und das hinbekommen. ;-)
safak67 - Mi 03.06.09 14:42
wie geht das mit den wei operatoren..? kannst du mir ein beispiel zeigen bitte
jaenicke - Mi 03.06.09 14:49
Kann es sein, dass du irgendwie gar nicht weißt was du da machst? :?
jaenicke hat folgendes geschrieben : |
| Im Moment musst du doch nur das ShowMessage(Seg1+'+'+Seg2); durch die tatsächliche Berechnung ersetzen und das für alle Operatoren machen. |
Also statt dem ShowMessage vorher:
Delphi-Quelltext
1:
| ShowMessage(FloatToStr(StrToFloat(Sep1) + StrToFloat(Sep2))); |
Die Befehle für die Umwandlung in und aus einer Zahl hatte ich ja genannt...
safak67 - Mi 03.06.09 14:57
Und jetzt mit einer schleife auf alle operanden machen, oder wie?
jaenicke - Mi 03.06.09 15:03
else mit weiteren if-Abfragen reicht ja. Wenn kein + vorkommt, musst du es eben mit anderen versuchen.
Oder du benutzt einfach die Variable op und machst die Unterscheidung via case wie es im auskommentierten Teil auch schon da stand.
safak67 - Do 04.06.09 08:55
also ich habe probleme mit der berrechnung des taschenrechners und der ausgabe.. vllt könnt ihr mir helfen.
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:
| unit Calculator_Main;
interface
uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, Buttons, StdCtrls;
type TFormTR = class(TForm) Sp7: TSpeedButton; Sp8: TSpeedButton; Sp9: TSpeedButton; Sp4: TSpeedButton; Sp5: TSpeedButton; Sp6: TSpeedButton; Sp1: TSpeedButton; Sp2: TSpeedButton; Sp3: TSpeedButton; Sp0: TSpeedButton; DecimalSep: TSpeedButton; spResult: TSpeedButton; SpPlus: TSpeedButton; SpMinus: TSpeedButton; SpMal: TSpeedButton; SpDurch: TSpeedButton; LabelAnzeige: TLabel; Clear: TSpeedButton; procedure SpZahlClick(Sender: TObject); procedure SpZeichenClick(Sender: TObject); procedure ClearClick(Sender: TObject); function BerechneTerm(ATerm: string): Double; private op : char; public end;
var FormTR: TFormTR;
implementation
{$R *.DFM}
procedure TFormTR.ClearClick(Sender: TObject); begin LabelAnzeige.Caption := '0'; end;
function TFormTR.BerechneTerm(ATerm: string): Double; var Op: string; iPos, i: Integer; Seg1, Seg2: Double; begin for i := 0 to 3 do begin case i of 0: Op := '+'; 1: Op := '-'; 2: Op := '*'; 3: Op := '/'; end; iPos := Pos(Op, ATerm); if iPos > 0 then begin Seg1 := BerechneTerm(Copy(ATerm, 1, iPos - 1)); Seg2 := BerechneTerm(Copy(ATerm, iPos + 1, Length(ATerm))); case i of 0: Result := Seg1 + Seg2; 1: Result := Seg1 - Seg2; 2: Result := Seg1 * Seg2; 3: Result := Seg1 / Seg2; end; Exit; end; end;
Result := StrToFloat(ATerm); end;
procedure TFormTR.SpZahlClick(Sender: TObject); begin if LabelAnzeige.caption='0' then LabelAnzeige.caption:=''; if LabelAnzeige.caption='Error' then LabelAnzeige.caption:='';
LabelAnzeige.caption := LabelAnzeige.caption + TSpeedButton(Sender).Caption;
end;
procedure TFormTR.SPZeichenClick(Sender: TObject); begin
if LabelAnzeige.caption='Error' then LabelAnzeige.caption:='0'; if sender = spPlus then begin op:='+' end; if sender = spMinus then begin op:='-' end; if sender = spMal then begin op:='x' end; if sender = spDurch then begin op:='/' end;
LabelAnzeige.caption := LabelAnzeige.caption + op;
end;
end. |
---
Moderiert von
Narses: Beiträge zusammengefasst---
keiner ne idee oder ein vorschlag?
jaenicke - Do 04.06.09 13:18
Das habe ich weiter oben schon geschrieben. ;-)
Besser wäre das natürlich immer im ersten Beitrag, dann kann man es nicht so leicht übersehen...
Delete - Do 04.06.09 13:19
Hab ich glatt übersehen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!