Einzelnen Beitrag anzeigen

Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.298 Beiträge
 
Delphi 12 Athens
 
#123

AW: Trennung von GUI und Logik, wie geht ihr vor?

  Alt 29. Nov 2017, 08:09
Moin...
Ein Minimalbeispiel entsprechend der Grafik...

VIEW:

Delphi-Quellcode:
unit View;

interface

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

  Controller; // die View kennt eigentlich nur den Controller

type
  TfoView = class(TForm)
    edtNumber1: TEdit;
    edtNumber2: TEdit;
    btnAddition: TButton;
    edtResult: TEdit;
    procedure btnAdditionClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FController: TController;
    procedure DoCalculateResult(Sender: TObject; CalculateResult: Single);
  public

  end;

var
  foView: TfoView;

implementation

{$R *.dfm}

{ TfoView }

procedure TfoView.FormCreate(Sender: TObject);
begin
  FController := TController.Create;
  FController.OnCalculate := DoCalculateResult;
end;

procedure TfoView.FormDestroy(Sender: TObject);
begin
  FController.Free;
end;

procedure TfoView.btnAdditionClick(Sender: TObject); // Command
begin
  FController.Addition(StrToFloat(edtNumber1.Text),
                       StrToFloat(edtNumber2.Text));
end;

procedure TfoView.DoCalculateResult(Sender: TObject; CalculateResult: Single);
begin
  edtResult.Text := FloatToStr(CalculateResult);
end;

end.

CONTROLLER:

Delphi-Quellcode:
unit Controller;

interface

uses
  Model; // der Controller kennt eigentlich nur das Model

type
  TOnCalculate = procedure(Sender: TObject; CalculateResult: Single) of object;

  TController = class
  strict private
    FModel: TAddition; // oder die Klasse die alle Berechnungen implementiert (TCalculator)
    FOnCalculate: TOnCalculate;
    procedure DoCalculateResult(Sender: TObject; CalculateResult: Single);
  public
    constructor Create;
    destructor Destroy; override;
    property OnCalculate: TOnCalculate read FOnCalculate write FOnCalculate;
    procedure Addition(Number1, Number2: Single);
  end;

implementation

{ TController }


constructor TController.Create;
begin
  FModel := TAddition.Create;
  FModel.OnResult := DoCalculateResult; // Event einhängen
end;

destructor TController.Destroy;
begin
  FModel.Free;
  inherited;
end;

procedure TController.DoCalculateResult(Sender: TObject; CalculateResult: Single);
begin
  // dem Controller das Ergebnis mitteilen...wenn benötigt

  if Assigned(FOnCalculate) then // Refresh / Notify updates
  begin
    FOnCalculate(Self, CalculateResult);
  end;
end;

procedure TController.Addition(Number1, Number2: Single); // Command -> Use
begin
  // Prüfungen auf Gültigkeit nicht vergessen! :-)
  FModel.Calculate(Number1, Number2);
end;

end.
MODEL:
Delphi-Quellcode:
unit Model;

interface

type
  TOnResult = procedure(Sender: TObject; CalculateResult: Single) of object;

  TAddition = class
  strict private
    FOnResult: TOnResult;
    FCalculateResult: Single;
  public
    property OnResult: TOnResult read FOnResult write FOnResult;
    procedure Calculate(Number1, Number2: Single);
  end;

implementation

{ TAddition }

procedure TAddition.Calculate(Number1, Number2: Single); // Use
begin
  FCalculateResult := Number1 + Number2;
  if Assigned(FOnResult) then // Notify updates
  begin
    FOnResult(Self, FCalculateResult);
  end;
end;

end.
Miniaturansicht angehängter Grafiken
mvc.png  
Angehängte Dateien
Dateityp: zip MVC.zip (2,4 KB, 12x aufgerufen)

Geändert von haentschman (29. Nov 2017 um 08:56 Uhr)
  Mit Zitat antworten Zitat