Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi taschenrechner (erweiterung) (https://www.delphipraxis.net/135012-taschenrechner-erweiterung.html)

safak67 3. Jun 2009 09:00


taschenrechner (erweiterung)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ich habe ein taschenrechner programmiert, ich habe einige fehler drin.. Die ganze Eingabe(sring) die ich mache soll im Label stehen, also erst wenn ich auf gleich klicke soll er berechnen.. Ich weiß aber nicht wie das ganz genau geht und was in der berechnung verändern muss..

also ich hab das soweit gemacht das das in der anzeige steht.. Wie soll ich das jetzt berechnen..?

Delphi-Quellcode:
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;
    SpErgebnis: 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 spErgebnisClick(Sender: TObject);
  private
    { Private-Deklarationen }
    zahl1,zahl2 : real;
    op : char;
    SpArray : ARRAY[0..9] OF 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.spErgebnisClick(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);
VAR Nr : INTEGER;
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
      //zahl1:=StrToFloat(LabelAnzeige.caption);
      //LabelAnzeige.caption:='0';
      op:='+'
    end;
  if sender = spMinus then
    begin
      //zahl1:=StrToFloat(LabelAnzeige.caption);
      //LabelAnzeige.caption:='0';
      op:='-'
    end;
  if sender = spMal then
    begin
      //zahl1:=StrToFloat(LabelAnzeige.caption);
      //LabelAnzeige.caption:='0';
      op:='x'
    end;
  if sender = spDurch then
    begin
      //zahl1:=StrToFloat(LabelAnzeige.caption);
      //LabelAnzeige.caption:='0';
      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.
edit: ich hab das so geändert das das mit der anzeige funktioniert, das problem ist jett nur noch die berechnung.. wie mache ich die berechnung

messie 3. Jun 2009 09:37

Re: taschenrechner (erweiterung)
 
Das ist schon ein wenig aufwändiger. Im Moment wertest Du das Event aus, was die Operatortasten schicken:
Delphi-Quellcode:
if sender = spPlus then
  begin
    zahl1:=StrToFloat(LabelAnzeige.caption);
    LabelAnzeige.caption:='0';
    op:='+'
  end;
Wenn Du die ausgeschriebene Aufgabe lösen willst, musst Du das so modifizieren, dass Du das op-Zeichen zum bisherigen Text im Feld zufügst. Beim Drücken der = Taste musst Du den String dann zerlegen, nach Rechenzeichen durchsuchen und nach Rechenregeln behandeln.

Grüße, Messie

Sharky 3. Jun 2009 10:03

Re: taschenrechner (erweiterung)
 
Zitat:

Zitat von safak67
Hi,

ich habe ein taschenrechner programmiert, ...

Hai safak67,

wenn ich diesen Beitrag lese muss ich mich fragen ob Du den taschenrechner programmiert hast oder ob Du nur irgendwelchen Code zusammen kopiert hast?

Verstehe das nicht falsch! Aber Du lernst nicht zu programmieren wenn Du fremden Code in dein Programm einbindest ohne zu verstehen was er macht.

safak67 3. Jun 2009 10:08

Re: taschenrechner (erweiterung)
 
ich hab das selber programmiert, danach wurde es nur von dem lehrer korrigiert, deswegen diese kommentarzeilen.. Ich weiß nur nicht wie ich das mit der berechnung machen soll

messie 3. Jun 2009 10:16

Re: taschenrechner (erweiterung)
 
Zitat:

Zitat von Sharky
Du lernst nicht zu programmieren wenn Du fremden Code in dein Programm einbindest ohne zu verstehen was er macht.

Ich denke schon: wenn sie/er versucht, anhand von Beispielen und fremdem Code die Funktionen zu verstehen und so damit zu spielen, dass sie hinterher selbst weiterentwickelt werden können.

Grüße, Messie

Edit: kein rotes Fenster gehabt

@safak67: den Hinweis habe ich oben schon gegeben

safak67 3. Jun 2009 10:22

Re: taschenrechner (erweiterung)
 
ich hab das ja programm aber geändert, wie erteile ich die strings und berechne es dann?

Highttower 3. Jun 2009 10:49

Re: taschenrechner (erweiterung)
 
Hallo,
das hier ist nur nen denk ansatz, runterprogrammieren musst du ihn selbst:

Delphi-Quellcode:
function rechne(s: string) : real;
var
    I : Integer;
    tmp : String;
begin
   result:=0;
    for I := 0 to Length(S) do
    begin
        if NOT ((S[I]='+') OR (S[I]='andres Rechenzeichen')OR (S[I]='andres Rechenzeichen')..... then begin
            tmp:= tmp +S[I];
      end
      else
      if(S[I]='+') then
      result := addiere(result,StrToFloat(tmp));
      if (S[I]='andres Rechenzeichen') then
      result := tuwas(StrToFloat(tmp));
      .....
    end;
end;

function addiere(k : real; j : real) : real;
begin
   result := k+j;
end;


....
Hoffe das hilft,

Highttower

messie 3. Jun 2009 10:52

Re: taschenrechner (erweiterung)
 
Zitat:

Zitat von safak67
ich hab das ja programm aber geändert, wie erteile ich die strings und berechne es dann?

Ergänzend: mach es wie mit dem Auge. Wenn Du eine Aufgabe hinschreibst, zerlegst Du sie ja auch beim Draufsehen.

Grüße, Messie

safak67 3. Jun 2009 10:59

Re: taschenrechner (erweiterung)
 
ja aber wie mache ich das genau..?

wenn ich z.B 2+4*5-3 habe muss er doch punkt vor strichrechnung machen, wie spreche jetzt die 4*5 an das er das zu erst berechnet.. allgemein weiß ich nicht wie man das mit der berechnung macht

Satty67 3. Jun 2009 11:17

Re: taschenrechner (erweiterung)
 
Na wie gesagt, wie mit dem Auge. Ich persönlich würde es so machen:

Operator suchen, der Vorrang hat und umschließende Ausdrücke auswerten

2+4*5-3 | * wird gefunden, mit Ausdrück davor/danach berechnen
2+20-3 | * / nicht gefunden, also geht es mit + - weiter
22-3
19 | kein operator übrig (Ausnahme Vorzeichen), ergo Ergebnis

Könnte man rekursiv lösen.

*****

bei 2+4*5-3 findest du "*", hast also eine Position im String, dort zerlegst Du den String und hast jetzt 2+4 und 5-3.

Im Ersten ermittelst Du die Zahl von rechts und im zweiten die Zahl von links.

Danach einfach die Zahlen mit dem Operator bearbeiten (den Du Dir irgendwo gemerkt hast).

safak67 3. Jun 2009 11:50

Re: taschenrechner (erweiterung)
 
ich hab mein Programm etwas erweitert.. ich weiß aber immer noch nicht wie das mit der berechnung geh, ich habe kein plan.. das ich das aufteilen muss ist mir klar, aber welche funktionen ich bei delphi benutzen muss weiß ich nicht

Delphi-Quellcode:
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..9] OF 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;
      index            : integer;
      Op               : string;
begin
  Formular := LabelAnzeige.Caption;
  for index := 0 to 3 do
  begin
    case index of
    0: Op := '*';
    1: Op := '/';
    2: Op := '+';
    3: Op := '-';
    end;
    if pos(Op,Formular) > 1 then
    begin
      Seg1 := copy(Formular,1,pos(Op,Formular) - 1);
      Seg2 := copy(Formular,pos(Op,Formular) + 1,length(Formular));
    end;

  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.

jaenicke 3. Jun 2009 12:34

Re: taschenrechner (erweiterung)
 
Crossposts solltest du angeben... :roll:
Dann kann man dort auch schauen, ob es schon Antworten gibt...
http://www.delphi-forum.de/viewtopic.php?t=92686

messie 3. Jun 2009 12:56

Re: taschenrechner (erweiterung)
 
Zitat:

Zitat von jaenicke
Crossposts solltest du angeben... :roll:
Dann kann man dort auch schauen, ob es schon Antworten gibt...
http://www.delphi-forum.de/viewtopic.php?t=92686

Pfui, sowas macht man nicht :warn:

:mrgreen:

Zur Berechnung: Du musst wie beim Zerlegen mit dem Auge Zwischensummen bilden und die weiterverarbeiten. Fertige Funktionen gibt es da nicht.

1+2*3+4:nach * oder / suchen, benachbarte Operanden berechnen, Strichrechnung mit Zwischensumme durchführen. Dazu musst Du noch Klammern beachten.
Ich sagte oben schon, dass das etwas Arbeit ist. Die musst Du Dir antun für diese Lösung. Rekursives Zerlegen war ja schon vorgeschlagen.

Grüße, Messie

safak67 3. Jun 2009 13:51

Re: taschenrechner (erweiterung)
 
wenn ich wüsste wie da ran gehen soll, dann würde ich zehn stunden daran sitzten.. ich weiß nicht wie ich mit der berechnung anfangen soll

jaenicke 3. Jun 2009 13:57

Re: taschenrechner (erweiterung)
 
Kurz vor deinem letzten Post hier hab ich drüben ja die eine Zeile gepostet, die dafür nötig ist, dass erstmal was geht...

safak67 3. Jun 2009 14:16

Re: taschenrechner (erweiterung)
 
also einiges habe ich ja auch gefunden.. um alle operanden zu integrieren muss ich das ja parsen.. wie mache ich das aber in delphi?

jaenicke 3. Jun 2009 14:32

Re: taschenrechner (erweiterung)
 
Wenn es nur im die zwei Operanden geht, musst du da nichts parsen für die Operatoren, denn da hast du op bereits als Variable. Da reicht eine Unterscheidung mit case.

Und wenn du mehr willst, musst du sowieso ein wenig am Konzept basteln.

safak67 3. Jun 2009 14:49

Re: taschenrechner (erweiterung)
 
das mit den zwei operanden habe ich schon verstanden, aber das problem ist ja wenn ich da z.B 4+3*2-6 stehen habe.. Ich muss das so programmieren das das geht, aber ich habe keine ahnung von parsen.. habe mir auch über die suchfunktion was angeschaut aber leider keine ahnung

Blup 3. Jun 2009 14:57

Re: taschenrechner (erweiterung)
 
Du solltest dir erst einmal um das Prinzip gedanken machen, wie man eine solche Aufgabe löst.
Danach kommt die Umsetzung in eine Programmiersprache.

Du hast ja bereits als ersten Schritt den Term in zwei Teile zerlegt.
Allerdings muss dabei mit dem Operator der geringsten Priorität begonnen werden.
1 + 2 * 3 => (1) + (2 * 3)

Wie berechnet man nun aber jeden dieser Teilterme?
Solange ein Term einen Operator enthält, kann man diesen erneut in Teilterme zerlegen.
2 * 3 => (2) * (3)
Enthält ein Term aber nur noch eine Zahlenfolge, kann dieser direkt in eine Zahl umgewandelt werden.

Das lässt sich sehr schön mit einer rekursiven Funktion darstellen:
Delphi-Quellcode:
function BerechneTerm(ATerm: string): Double;
var
  Op: string;
  iPos: Integer;
  Value1, Value2: 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
      Value1 := BerechneTerm(Copy(ATerm, 1, iPos - 1));
      Value2 := BerechneTerm(Copy(ATerm, iPos + 1, Length(ATerm)));
      case i of
        0: Result := Value1 + Value2;
        1: Result := Value1 - Value2;
        2: Result := Value1 * Value2;
        3: Result := Value1 / Value2;
      end;
      Exit;
    end;
  end;
  Result := StrToFloat(ATerm);
end;
Diese Funktion berücksichtigt noch nicht, dass Operatoren gleicher Priorität von links nach rechts ausgewertet werden.

safak67 3. Jun 2009 18:06

Re: taschenrechner (erweiterung)
 
wenn ich eine funktion in delphi schreieb, wie binde ich das da ein, weil wenn ich das programm starte gibt er mir ne fehlermeldung an..

[Warnung] Calculator_Main.PAS(77): Rückgabewert der Funktion 'spResult' könnte undefiniert sein
[Fehler] Calculator_Main.PAS(32): Ungenügende Forward- oder External-Deklaration: 'TFormTR.spResultClick'

messie 3. Jun 2009 18:14

Re: taschenrechner (erweiterung)
 
Zitat:

Zitat von safak67
wenn ich eine funktion in delphi schreieb, wie binde ich das da ein, weil wenn ich das programm starte gibt er mir ne fehlermeldung an..

[Fehler] Calculator_Main.PAS(32): Ungenügende Forward- oder External-Deklaration: 'TFormTR.spResultClick'

Du hast für den SpeedButton "spResult" ein Onclick-Ereignis angelegt, die dazugehörige Routine aber gelöscht. Das findest Du im Objektinspektor (meist linke untere Seite). Lass Dir das Formular anzeigen, markiere den Speedbutton mit der Maus und wähle im Objektinspektor die Ereignisse an. Dann den Eintrag im OnClick einfach löschen.

Dieser Eintrag steht übrigens in der dfm-Datei.

Grüße, Messie


[Edit]
Nochmal :warn:

Beiträge mit vernünftiger Groß/Kleinschreibung und ohne Tippfehler lassen sich besser lesen und werden deshalb auch eher beantwortet. Lies' ruhig nochmal vor dem Absenden durch. Fehler lassen sich danach noch mit der Benutzung des Edit-Buttons beheben. Hilft wirklich.
[/Edit]

safak67 3. Jun 2009 20:57

Re: taschenrechner (erweiterung)
 
ok sorry, ich werde mehr auf meine rechtschreibung achten..

also ich hab das so gemacht wie oben beschrieben aber hab jetzt ein anderen fehler..

[Fehler] Calculator_Main.PAS(33): Bezeichner redefiniert: 'spResult'

Delphi-Quellcode:
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 SpZahlClick(Sender: TObject);
    procedure SpZeichenClick(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    function spResult(ATerm: string): Double;
  private
    { Private-Deklarationen }
    op : char;
  public
    { Public-Deklarationen }
  end;

var
  FormTR: TFormTR;

implementation

{$R *.DFM}

procedure TFormTR.SpeedButton1Click(Sender: TObject);
begin
LabelAnzeige.Caption := '0';
end;

function spResult(ATerm: string): Double;
var
  Op: string;
  iPos, i: Integer;
  Value1, Value2: 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
      Value1 := spResult(Copy(ATerm, 1, iPos - 1));
      Value2 := spResult(Copy(ATerm, iPos + 1, Length(ATerm)));
      case i of
        0: spResult := Value1 + Value2;
        1: spResult := Value1 - Value2;
        2: spResult := Value1 * Value2;
        3: spResult := Value1 / Value2;
      end;
      Exit;
    end;
  end;
  spResult := StrToFloat(ATerm);
end;

jaenicke 3. Jun 2009 20:58

Re: taschenrechner (erweiterung)
 
Deine Prozedur heißt genauso wie der SpeedButton...
Bezeichner müssen eindeutig sein, egal ob Namen von Prozeduren oder von Komponenten.

safak67 3. Jun 2009 21:03

Re: taschenrechner (erweiterung)
 
wie jetzt?
wo ist jetzt der Fehler bei mir?

jaenicke 3. Jun 2009 21:04

Re: taschenrechner (erweiterung)
 
Du hast eine Funktion mit dem Namen spResult erstellt, dein SpeedButton heißt aber genauso... Eins von beidem musst du umbenennen.
Delphi-Quellcode:
function spResult(ATerm: string): Double;

safak67 3. Jun 2009 21:12

Re: taschenrechner (erweiterung)
 
ich krieg die krise.. jetzt habe ich ein anderen fehler..

[Fehler] Calculator_Main.PAS(69): Operator oder Semikolon fehlt
[Fehler] Calculator_Main.PAS(70): Operator oder Semikolon fehlt
[Fehler] Calculator_Main.PAS(32): Ungenügende Forward- oder External-Deklaration: 'TFormTR.Result'

Delphi-Quellcode:

    function Result(ATerm: string): Double;
  private
    { Private-Deklarationen }
    op : char;
  public
    { Public-Deklarationen }
  end;

var
  FormTR: TFormTR;

implementation

{$R *.DFM}

procedure TFormTR.SpeedButton1Click(Sender: TObject);
begin
LabelAnzeige.Caption := '0';
end;

function Result(ATerm: string): Double;
var
  Op: string;
  iPos, i: Integer;
  Value1, Value2: 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
      Value1 := Result(Copy(ATerm, 1, iPos - 1));
      Value2 := Result(Copy(ATerm, iPos + 1, Length(ATerm)));
      case i of
        0: Result := Value1 + Value2;
        1: Result := Value1 - Value2;
        2: Result := Value1 * Value2;
        3: Result := Value1 / Value2;
      end;
      Exit;
    end;
  end;
  Result := StrToFloat(ATerm);
end;

jaenicke 3. Jun 2009 21:14

Re: taschenrechner (erweiterung)
 
Du hast unten in der Implementierung das TFormTR. vor dem Namen der Funktion vergessen. ;-)
Zitat:

Zitat von safak67
Delphi-Quellcode:
function TFormTR.Result(ATerm: string): Double;
var
  ...

// EDIT:
Zudem ist Result auch keine gute Idee, weil so der Rückgabewert einer Funktion heißt...
Warum nicht ein richtiger Name wie EvaluateTerm oder so...

safak67 3. Jun 2009 21:18

Re: taschenrechner (erweiterung)
 
was bedeutet
'=' erwartet aber '('
gefunden..

jetzt habe ich diese fehlermeldung

jaenicke 3. Jun 2009 21:20

Re: taschenrechner (erweiterung)
 
Ja, und in welcher Zeile? :glaskugel:

safak67 3. Jun 2009 21:40

Re: taschenrechner (erweiterung)
 
also es kommt ein message, aber danach springt die zwischen ....Result und (Aterm:....

Delphi-Quellcode:
function TFormTR.Result(ATerm: string): Double;

jaenicke 3. Jun 2009 21:41

Re: taschenrechner (erweiterung)
 
Ich würde mal vermuten das liegt genau dadran:
Zitat:

Zitat von jaenicke
// EDIT:
Zudem ist Result auch keine gute Idee, weil so der Rückgabewert einer Funktion heißt...
Warum nicht ein richtiger Name wie EvaluateTerm oder so...


safak67 3. Jun 2009 21:46

Re: taschenrechner (erweiterung)
 
also soll ich alle result ein anderen namen geben

jaenicke 3. Jun 2009 21:53

Re: taschenrechner (erweiterung)
 
Das wäre sinnvoll die Funktion umzubenennen, und wenn dann immer noch ein Fehler kommt, musst du den eben noch einmal posten.

Aber das "Result := " darfst du natürlich nicht ändern...

safak67 3. Jun 2009 21:58

Re: taschenrechner (erweiterung)
 
Liste der Anhänge anzeigen (Anzahl: 1)
also ich habe immer noch die gleiche fehlermeldung, ich poste mal alles rein..

edit: also ich hab die funktion umbenannt danach auch result hat beides nicht funktioniert,, immer noch die gleiche fehlermeldung

Delphi-Quellcode:
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 SpZahlClick(Sender: TObject);
    procedure SpZeichenClick(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    function TFormTR.BerechneTerm(ATerm: string): Double;
  private
    { Private-Deklarationen }
    op : char;
  public
    { Public-Deklarationen }
  end;

var
  FormTR: TFormTR;

implementation

{$R *.DFM}

procedure TFormTR.SpeedButton1Click(Sender: TObject);
begin
LabelAnzeige.Caption := '0';
end;

function TFormTR.BerechneTerm(ATerm: string): Double;
var
  Op: string;
  iPos, i: Integer;
  Value1, Value2: 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
      Value1 := BerechneTerm(Copy(ATerm, 1, iPos - 1));
      Value2 := BerechneTerm(Copy(ATerm, iPos + 1, Length(ATerm)));
      case i of
        0: EvaluateTerm := Value1 + Value2;
        1: EvaluateTerm := Value1 - Value2;
        2: EvaluateTerm := Value1 * Value2;
        3: EvaluateTerm := Value1 / Value2;
      end;
      Exit;
    end;
  end;
  EvaluateTerm := 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.

jaenicke 3. Jun 2009 22:01

Re: taschenrechner (erweiterung)
 
:wall: :wall: :wall:
Zitat:

Zitat von jaenicke
Du hast unten in der Implementierung das TFormTR. vor dem Namen der Funktion vergessen. ;-)

Das hatte ich geschrieben...
Du hast es aber oben bei der Deklaration auch dazu geschrieben und nicht nur unten... :roll:

Oben in der Zeile vor private muss das TFormTR. weg.

Und außerdem darfst du das Result unten nicht auch da ersetzen, wo gar nicht der Funktionsaufruf gemeint ist...
Delphi-Quellcode:
      Value1 := BerechneTerm(Copy(ATerm, 1, iPos - 1));
      Value2 := BerechneTerm(Copy(ATerm, iPos + 1, Length(ATerm)));
      case i of
        0: Result := Value1 + Value2;
        1: Result := Value1 - Value2;
        2: Result := Value1 * Value2;
        3: Result := Value1 / Value2;
      end;
Ach ja: Und Zeile 80 muss weg...
Den ganzen Term kannst du nicht in eine Zahl umwandeln.

safak67 3. Jun 2009 22:10

Re: taschenrechner (erweiterung)
 
wie mache ich das dann mit der Ausgabe?

jaenicke 3. Jun 2009 22:16

Re: taschenrechner (erweiterung)
 
Naja, ein Beispiel zur Ausgabe als ShowMessage habe ich ja schon geschrieben...
Da wo du BerechneTerm aufrufst musst du halt auch die Ausgabe des Rückgabewerts machen...

Blup 4. Jun 2009 07:20

Re: taschenrechner (erweiterung)
 
Zitat:

Zitat von jaenicke
Ach ja: Und Zeile 80 muss weg...
Den ganzen Term kannst du nicht in eine Zahl umwandeln.

Doch kann er, falls die Funktion tatsächlich Zeile 80 ereicht, enthält der Term nur eine Zahl.

safak67 4. Jun 2009 07:25

Re: taschenrechner (erweiterung)
 
also ich habe paar sachen versucht, aber das mit der ausgabe kriege ich immer noch nicht hin.. hat einer ne idee..?

bin am verzweifeln, hääte nicht gedacht das parsen so schwer sein kann.

safak67 4. Jun 2009 09:22

Re: taschenrechner (erweiterung)
 
hat denn keiner ne idee wie ich das mit der ausgabe mache


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz