Autor Beitrag
safak67
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 03.06.09 12:11 
hi,
ich hab ein taschenrechner programmiert aber weiß nicht wie ich das mit der berrechnung mache.. ich hoffe ihr könnt mir helfen.
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:
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
    { Private-Deklarationen }
    op : char;
    SpArray : ARRAY[0..9OF TSpeedButton;
  public
    { Public-Deklarationen }
  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;
  {
  if sender = spErgebnis then
  begin
    zahl2:=StrToFloat(LabelAnzeige.Caption);
    case op of
    '+':LabelAnzeige.caption:=FloatToStr(zahl1+zahl2);
    '-':LabelAnzeige.caption:=FloatToStr(zahl1-zahl2);
    'x':LabelAnzeige.caption:=FloatToStr(zahl1*zahl2);
    '/':if zahl2 <> 0 then
           LabelAnzeige.caption:=FloatToStr(zahl1/zahl2)
        else
           LabelAnzeige.caption:='Division durch Null nicht moeglich'
    end
  end
  }

end;

end.


Moderiert von user profile iconNarses: Quote- durch Delphi-Tags ersetzt
Einloggen, um Attachments anzusehen!
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
www.delphipraxis.net/post1044070.html
safak67 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 03.06.09 14:42 
wie geht das mit den wei operatoren..? kannst du mir ein beispiel zeigen bitte
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 03.06.09 14:49 
Kann es sein, dass du irgendwie gar nicht weißt was du da machst? :?
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 03.06.09 14:57 
Und jetzt mit einer schleife auf alle operanden machen, oder wie?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Do 04.06.09 08:55 
also ich habe probleme mit der berrechnung des taschenrechners und der ausgabe.. vllt könnt ihr mir helfen.
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:
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
    { Private-Deklarationen }
    op : char;
  public
    { Public-Deklarationen }
  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 user profile iconNarses: Beiträge zusammengefasst---

keiner ne idee oder ein vorschlag?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 04.06.09 12:42 
Erstens ist pushen hier erst nach 24 Stunden erlaubt... :roll:
Zweitens musst du BerechneTerm auch irgendwo benutzen, es nur hinzuschreiben nutzt eben nichts. Und den Rückgabewert kannst du z.B. mit FloatToStr in einen String umwandeln und in ein Label oder in eine ShowMessage packen.

Und ansonsten kann ich nur noch sagen:
Einen sehr guten Crashkurs findest du hier:
crashkurs.christian-stelzmann.de
und die neue Version speziell ab Turbo Delphi:
www.christian-stelzm...shkurs_reloaded.html

Ein weiteres gutes Online-Buch:
de.wikibooks.org/wik...grammierkurs:_Delphi
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 04.06.09 13:16 
Und Du solltest auf den Crosspost hinweisen, damit man nicht in beiden Foren antworten muss.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19276
Erhaltene Danke: 1741

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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...
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 04.06.09 13:19 
Hab ich glatt übersehen.