[Delphi] Stringoperation Taschenrechner

Bexx

Verrückte Erfinderin bei Daniel Düsentrieb
Guten Morgen liebe Foris,

ich beschäftige mich mit Delphi für die Arbeit und wollte mir, um ein Gefühl für die Syntax zu entwickeln, einen relativ stupiden Taschenrechner erstellen. Der gesamte Rechenweg soll im Fenster mit arithm. Operand im Editfenster angezeigt werden.
Nun habe ich aber das Problem, das sowohl Leerstellen als auch der nicht numerische Operand in einem meiner beiden Strings stehen und ich möchte nun gerne den String dahingehend manipulieren, dass am Ende nur noch die Zahlen darin stehen bleiben.

ich habe folgenden Versuch gestartet und bin mit der Operation gescheitert (patient tot ;) ) :

Code:
 procedure TfMain.Btn_resClick(Sender: TObject);
begin
    if not bSecondIsActive then
      begin
        Edt_ergebnisfeld.Text := 'Error. Wrong Term';
      end
    else
      begin
        StringReplace(StringReplace(sTextContent_1, #32, ' ', [rfReplaceAll]), #43, ' ', [rfReplaceAll]);
        StringReplace(StringReplace(sTextContent_2, #32, ' ', [rfReplaceAll]), #43, ' ', [rfReplaceAll]);

        calculus(StrToInt(sTextContent_1), StrToInt(sTextContent_2), cArithOperator);
      end;
end;

Das war der Test für die Bereinung, vorläufig nur für das Plus bei der Addition und die Leerzeichen zu entfernen.
Beides ist nicht passiert. Nach diesem Vorgang steht in sTextContent_2 der gesamte Rechenweg [12 + 12 ] :confused:
Das verstehe ich nicht so ganz.. Kann jemand mal mit drüber schauen und mich bitte belehren?

Danke im Voraus und unten nochmal gesamter Quellcode.

Becci

Code:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Buttons, Vcl.StdCtrls;

type
  TfMain = class(TForm)
    Edt_ergebnisfeld: TEdit;
    Btn_Abbr: TBitBtn;
    Btn_1: TButton;
    Btn_7: TButton;
    Btn_4: TButton;
    Btn_5: TButton;
    Btn_9: TButton;
    Btn_6: TButton;
    Btn_3: TButton;
    Btn_2: TButton;
    Btn_8: TButton;
    Btn_plus: TButton;
    Btn_minus: TButton;
    Btn_mal: TButton;
    Btn_geteilt: TButton;
    Btn_res: TButton;
    Btn_0: TButton;
    procedure Btn_1Click(Sender: TObject);
    procedure Btn_2Click(Sender: TObject);
    procedure Btn_3Click(Sender: TObject);
    procedure Btn_4Click(Sender: TObject);
    procedure Btn_5Click(Sender: TObject);
    procedure Btn_6Click(Sender: TObject);
    procedure Btn_7Click(Sender: TObject);
    procedure Btn_8Click(Sender: TObject);
    procedure Btn_9Click(Sender: TObject);
    procedure Btn_0Click(Sender: TObject);
    procedure Btn_AbbrClick(Sender: TObject);
    procedure Btn_plusClick(Sender: TObject);
    procedure Btn_minusClick(Sender: TObject);
    procedure Btn_malClick(Sender: TObject);
    procedure Btn_geteiltClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Btn_resClick(Sender: TObject);

  private
    { Private-Deklarationen }
    cArithOperator : char;
    dResult : Double;
    sTextContent_1 : string;
    sTextContent_2 : string;
    bSecondIsActive : Boolean;
    procedure calculus(iInt1, iInt2 : integer; cChar : char);
  public
    { Public-Deklarationen }
  end;

var
  fMain: TfMain;

implementation

{$R *.dfm}

procedure TfMain.Btn_0Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '0';
       Edt_ergebnisfeld.Text := sTextContent_1 ;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '0';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_1Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '1';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '1';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_2Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '2';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '2';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_3Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '3';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '3';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_4Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '4';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '4';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_5Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '5';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '5';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_6Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '6';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '6';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_7Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '7';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '7';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_8Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '8';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '8';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_9Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '9';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '9';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_AbbrClick(Sender: TObject);
begin
  sTextContent_1 := '';
  sTextContent_2 := '';
  Edt_ergebnisfeld.Text := '';
end;

procedure TfMain.Btn_geteiltClick(Sender: TObject);
begin
  cArithOperator := '%';
  if not bSecondIsActive then
  begin
  sTextContent_1 := Edt_ergebnisfeld.Text + '   %   ';
  Edt_ergebnisfeld.Text := sTextContent_1;
  end;
  bSecondIsActive := true;
end;

procedure TfMain.Btn_malClick(Sender: TObject);
begin
  cArithOperator := '*';
  if not bSecondIsActive then
  begin
  sTextContent_1 := Edt_ergebnisfeld.Text + '   *   ';
  Edt_ergebnisfeld.Text := sTextContent_1;
  end;
    bSecondIsActive := true;
end;

procedure TfMain.Btn_minusClick(Sender: TObject);
begin
  cArithOperator := '-';
  if not bSecondIsActive then
  begin
  sTextContent_1 := Edt_ergebnisfeld.Text + '   -   ';
  Edt_ergebnisfeld.Text := sTextContent_1;
  end;
    bSecondIsActive := true;
end;

procedure TfMain.Btn_plusClick(Sender: TObject);
begin
  cArithOperator := '+';
  if not bSecondIsActive then
  begin
  sTextContent_1 := Edt_ergebnisfeld.Text + '   +   ';
  Edt_ergebnisfeld.Text := sTextContent_1;
  end;
    bSecondIsActive := true;
end;

procedure TfMain.Btn_resClick(Sender: TObject);
begin
    if not bSecondIsActive then
      begin
        Edt_ergebnisfeld.Text := 'Error. Wrong Term';
      end
    else
      begin
        StringReplace(StringReplace(sTextContent_1, #32, ' ', [rfReplaceAll]), #43, ' ', [rfReplaceAll]);
        StringReplace(StringReplace(sTextContent_2, #32, ' ', [rfReplaceAll]), #43, ' ', [rfReplaceAll]);

        calculus(StrToInt(sTextContent_1), StrToInt(sTextContent_2), cArithOperator);
      end;
end;

procedure TfMain.calculus(iInt1: Integer; iInt2: Integer; cChar: Char);
begin
  if cChar = '+' then
    begin
      dResult := iInt1 + iInt2;
    end;
  if cChar = '-' then
    begin
      dResult := iInt1 - iInt2;
    end;
  if cChar = '*' then
    begin
      dResult := iInt1 * iInt2;
    end;
  if cChar = '%' then
    begin
      if iInt1 = 0 then
        Edt_ergebnisfeld.Text := 'Error. Nulldivision!'
      else
        dResult := iInt1 / iInt2;
    end;
    Edt_ergebnisfeld.Text := FloatToStr(dResult);
end;

procedure TfMain.FormCreate(Sender: TObject);
begin
  bSecondIsActive := false;
end;



end.
 
Huhu, habe es inzwischen lösen können und habe mich für eine Nicht-String-Manipulations-Variante entschieden.

Hier mein Ergebnis zur Dokumentation:

die Result Prozedur sieht nun so aus:

Code:
procedure TfMain.Btn_resClick(Sender: TObject);
begin
    if not bSecondIsActive then
      begin
        Edt_ergebnisfeld.Text := 'Error. Wrong Term';
      end
    else
      begin
        calculus(StrToInt(sTextContent_1), StrToInt(sTextContent_2), cArithOperator);
      end;
end;

Im Wesentlichen verändert habe ich den Umgang mit dem arithm. Operand. Ich hänge ihn nun nicht mehr sTextContent_x an, sondern dem Edt_ergebnisfeld.Text.
Problem wurde somit aufgehoben, der Rechner funktioniert für alle 4 Rechenwege. (mathematische Regeln soweit nicht beachtet, außer Div durch 0)

Ganzer Code noch einmal hier:
Code:
 unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Buttons, Vcl.StdCtrls;

type
  TfMain = class(TForm)
    Edt_ergebnisfeld: TEdit;
    Btn_Abbr: TBitBtn;
    Btn_1: TButton;
    Btn_7: TButton;
    Btn_4: TButton;
    Btn_5: TButton;
    Btn_9: TButton;
    Btn_6: TButton;
    Btn_3: TButton;
    Btn_2: TButton;
    Btn_8: TButton;
    Btn_plus: TButton;
    Btn_minus: TButton;
    Btn_mal: TButton;
    Btn_geteilt: TButton;
    Btn_res: TButton;
    Btn_0: TButton;
    procedure Btn_1Click(Sender: TObject);
    procedure Btn_2Click(Sender: TObject);
    procedure Btn_3Click(Sender: TObject);
    procedure Btn_4Click(Sender: TObject);
    procedure Btn_5Click(Sender: TObject);
    procedure Btn_6Click(Sender: TObject);
    procedure Btn_7Click(Sender: TObject);
    procedure Btn_8Click(Sender: TObject);
    procedure Btn_9Click(Sender: TObject);
    procedure Btn_0Click(Sender: TObject);
    procedure Btn_AbbrClick(Sender: TObject);
    procedure Btn_plusClick(Sender: TObject);
    procedure Btn_minusClick(Sender: TObject);
    procedure Btn_malClick(Sender: TObject);
    procedure Btn_geteiltClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Btn_resClick(Sender: TObject);

  private
    { Private-Deklarationen }
    cArithOperator : char;
    dResult : Double;
    sTextContent_1 : string;
    sTextContent_2 : string;
    bSecondIsActive : Boolean;
    procedure calculus(iInt1, iInt2 : integer; cChar : char);
  public
    { Public-Deklarationen }
  end;

var
  fMain: TfMain;

implementation

{$R *.dfm}

procedure TfMain.Btn_0Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '0';
       Edt_ergebnisfeld.Text := sTextContent_1 ;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '0';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_1Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '1';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '1';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_2Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '2';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '2';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_3Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '3';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '3';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_4Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '4';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '4';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_5Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '5';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '5';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_6Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '6';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '6';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_7Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '7';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '7';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_8Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '8';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '8';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_9Click(Sender: TObject);
begin
  if not bSecondIsActive then
    begin
       sTextContent_1 := Edt_ergebnisfeld.Text + '9';
       Edt_ergebnisfeld.Text := sTextContent_1;
    end
    else
      begin
        sTextContent_2 := Edt_ergebnisfeld.Text + '9';
        Edt_ergebnisfeld.Text := sTextContent_2;
      end;
end;

procedure TfMain.Btn_AbbrClick(Sender: TObject);
begin
  sTextContent_1 := '';
  sTextContent_2 := '';
  Edt_ergebnisfeld.Text := '';
  bSecondIsActive := false;
end;

procedure TfMain.Btn_geteiltClick(Sender: TObject);
begin
  cArithOperator := '%';
  if not bSecondIsActive then
  begin
  sTextContent_1 := Edt_ergebnisfeld.Text;
  Edt_ergebnisfeld.Text := sTextContent_1 + cArithOperator;
  end;
  bSecondIsActive := true;
  Edt_ergebnisfeld.Text := '';
end;

procedure TfMain.Btn_malClick(Sender: TObject);
begin
  cArithOperator := '*';
  if not bSecondIsActive then
  begin
  sTextContent_1 := Edt_ergebnisfeld.Text;
  Edt_ergebnisfeld.Text := sTextContent_1 + cArithOperator;
  end;
    bSecondIsActive := true;
    Edt_ergebnisfeld.Text := '';
end;

procedure TfMain.Btn_minusClick(Sender: TObject);
begin
  cArithOperator := '-';
  if not bSecondIsActive then
  begin
  sTextContent_1 := Edt_ergebnisfeld.Text;
  Edt_ergebnisfeld.Text := sTextContent_1 + cArithOperator;
  end;
    bSecondIsActive := true;
    Edt_ergebnisfeld.Text := '';
end;

procedure TfMain.Btn_plusClick(Sender: TObject);
begin
  cArithOperator := '+';
  if not bSecondIsActive then
  begin
  sTextContent_1 := Edt_ergebnisfeld.Text ;
  Edt_ergebnisfeld.Text := sTextContent_1 + cArithOperator;
  end;
  bSecondIsActive := true;
  Edt_ergebnisfeld.Text := '';
end;

procedure TfMain.Btn_resClick(Sender: TObject);
var
  sDummy: string;
begin
    if not bSecondIsActive then
      begin
        Edt_ergebnisfeld.Text := 'Error. Wrong Term';
      end
    else
      begin
        {StringReplace(StringReplace(sTextContent_1, ' ', '', [rfReplaceAll]), '+', '', [rfReplaceAll]);
        StringReplace(StringReplace(sTextContent_2, #32, '', [rfReplaceAll]), #43, '', [rfReplaceAll]);
        //ersetzen der leerzeichen
        sDummy := StringReplace(sTextContent_2, #32, '', [rfReplaceAll]);
        //ersetzen von '+'
        sdummy := StringReplace(sdummy, #43, '', [rfReplaceAll]);     }
        calculus(StrToInt(sTextContent_1), StrToInt(sTextContent_2), cArithOperator);
      end;
end;

procedure TfMain.calculus(iInt1: Integer; iInt2: Integer; cChar: Char);
begin
  if cChar = '+' then
    begin
      dResult := iInt1 + iInt2;
    end;
  if cChar = '-' then
    begin
      dResult := iInt1 - iInt2;
    end;
  if cChar = '*' then
    begin
      dResult := iInt1 * iInt2;
    end;
  if cChar = '%' then
    begin
      if iInt1 = 0 then
        Edt_ergebnisfeld.Text := 'Error. Nulldivision!'
      else
        dResult := iInt1 / iInt2;
    end;
    Edt_ergebnisfeld.Text := FloatToStr(dResult);
end;

procedure TfMain.FormCreate(Sender: TObject);
begin
  bSecondIsActive := false;
end;

end.
 
Zuletzt bearbeitet:
Zurück