Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#2

AW: TSpeedButton Sender Übergabe Problem

  Alt 20. Apr 2017, 14:49
Mal ein bisserl rumgewuselt und ungetestet:
Delphi-Quellcode:
unit Unit1;
{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  StdCtrls, Buttons;

type

  { TForm1 }

  TForm1 = class(TForm)
    Label1: TLabel;
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Tsb0: TSpeedButton;
    Tsb01: TSpeedButton;
    Tsb02: TSpeedButton;
    Tsb03: TSpeedButton;
    Tsb04: TSpeedButton;
    Tsb05: TSpeedButton;
    Tsb06: TSpeedButton;
    Tsb07: TSpeedButton;
    Tsb08: TSpeedButton;
    Tsb09: TSpeedButton;
    TsbClear: TSpeedButton;
    TsbDivision: TSpeedButton;
    TsbMultiplication: TSpeedButton;
    TsbSubtraction: TSpeedButton;
    TsbAddition: TSpeedButton;
    TsbEqual: TSpeedButton;

    procedure TsbClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure TsbOpClick(Sender: TObject);

  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  // Result ist eigentlich "reserviert" als Rückgabewert von Funktionen,
  // das kann ggfls. zu Verwirrung führen.
  // Result lieber in Ergebnis umbenennen.
  number,result: real;
  math_op : boolean;
  zeichen, op, current_op : char;
  zeichenkette : ansistring;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.TsbClick(Sender: TObject);
begin
  if Sender is TSpeedButton then begin
    // Wir nutzen für die Ziffer das Tag-Attribut der Buttons.
    // Button für die 1 erhält Tag := 1;
    // ...
    // Button für die 9 erhält Tag := 9;
    // Button für die 0 erhält Tag := 0;
    // Tag kann man im Objektinspektor entsprechend zuweisen.
    zeichen := Chr(TSpeedButton(Sender).Tag);
  end;
  if math_op then begin
    math_op:= false;
    zeichenkette := zeichen;
  end
  else zeichenkette := zeichenkette + zeichen;
  label1.Caption := zeichenkette;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 math_op := true;
 current_op := '0';
end;

procedure TForm1.TsbOpClick(Sender: TObject);
begin
  if Sender is TSpeedButton then begin
    // Auch hier könnte man mit Tag arbeiten:
    case TSpeedButton(Sender).Tag of
      1 : op := '1'; // if Sender = TsbAddition then op := '1';
      2 : op := '2'; // if Sender = TsbSubtraction then op := '2';
      3 : op := '3'; // if Sender = TsbMultiplication then op := '3';
      4 : op := '4'; // if Sender = TsbDivision then op := '4';
      5 : op := 'c'; // if Sender = TsbClear then op := 'c';
      6 : op := '='; // if Sender = TsbEqual then op := '=';
    end;
  end;

  math_op := true;
  number := strtofloat(label1.Caption);

  case current_op of
    '0' : result := number;
    '1' : result := result+number;
    '2' : result := result-number;
    '3' : result := result*number;
    '4' : result := result/number;
    'c' : result := 0;
    '=' : result := result;
  end;

  current_op := op;
  label1.Caption := floattostr(result);
end;

end.
  Mit Zitat antworten Zitat