Delphi-PRAXiS
Seite 13 von 19   « Erste     3111213 1415     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Trennung von GUI und Logik, wie geht ihr vor? (https://www.delphipraxis.net/162373-trennung-von-gui-und-logik-wie-geht-ihr-vor.html)

Luckie 28. Nov 2017 20:31

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

Zitat von jus (Beitrag 1387307)
Bei diesem einfachen Beispiel würde mich interessieren wie man sowas unter Delphi 2007 löst.

Mit einer Klasse (TRechner).

Chemiker 28. Nov 2017 21:55

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

vielleicht hilft Dir das Video zu weiteren Erkenntnissen.

https://www.bing.com/videos/search?q...2F&FORM=VRDGAR

Bis bald Chemiker

haentschman 29. Nov 2017 08:09

AW: Trennung von GUI und Logik, wie geht ihr vor?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Moin...:P
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.

joachimd 29. Nov 2017 08:26

AW: Trennung von GUI und Logik, wie geht ihr vor?
 
Hallo haentschman,
ich würde hier aber der View den Controller und dem Controller das Model nicht fest verdrahten, sondern jeweils per Konstruktor als Interface mitgeben. Damit bleiben die Klassen voneinander unabhängig.

haentschman 29. Nov 2017 08:32

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

Ich würde hier aber der View den Controller und dem Controller das Model nicht fest verdrahten
...viele Wege führen nach Rom. :P Mir ging es nur um das Prinzip entsprechend der kleinen Grafik...

freimatz 29. Nov 2017 08:42

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

Zitat von Chemiker (Beitrag 1387433)
Hallo,
vielleicht hilft Dir das Video zu weiteren Erkenntnissen.
https://www.bing.com/videos/search?q...2F&FORM=VRDGAR
Bis bald Chemiker

Da geht es um MVVM und nicht um MVC (was ja nicht schlecht sein muss.)
Die Erklärung warum man so was macht ist sicher gut.
Allerdings ein Datenmodul als Basis zu nehmen halte ich für ... ... unschön

jus 29. Nov 2017 13:44

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

Zitat von Chemiker (Beitrag 1387433)
Hallo,

vielleicht hilft Dir das Video zu weiteren Erkenntnissen.

https://www.bing.com/videos/search?q...2F&FORM=VRDGAR

Bis bald Chemiker

Vielen Dank! MVVM interessiert mich genauso. Das Video hat mir auch sehr geholfen.

Zitat:

Zitat von haentschman (Beitrag 1387443)
Moin...:P
Ein Minimalbeispiel entsprechend der Grafik...
...

Vielen Dank für das Beispiel, das werde ich mir heute am Abend genauer anschauen.

lg,
jus

Stevie 29. Nov 2017 14:01

AW: Trennung von GUI und Logik, wie geht ihr vor?
 
Bei 11:35 musst ich mir schon ein bisschen an den Kopf fassen - dass M-V-VM der gleichen Reihenfolge der Komponenten folgt wie sie auch M-V-C und M-V-P nutzen, darauf ist er nicht gekommen, oder? :wall:

Generell muss ich sagen, dass man das meiste Material zu MVVM aus der Delphiwelt in die Tonne kloppen kann, weil die meisten nicht verstehen, was der Kern von MVVM ist. Nur weil man UI von Businesslogik trennt macht man noch lange kein MVVM - in dieser Hinsicht ist das Video von Olaf schon eins der besten - dass ich seiner Implementierung und dem Argument, Delphi muss RAD sein, nicht ganz zustimme, steht auf einem anderen Blatt.

Ob man nun MVC, MVP, MVVM oder LMAA macht ist am Ende fast wurscht und hängt auch von den eigenen Bedürfnissen und Vorlieben ab. Ich bin inzwischen der Meinung, dass MVVM in Delphi mehr Schmerzen als Freude macht - zumindest solange bis man sich ein mehr oder minder mächtiges Framework gebaut hat (etwas, was ich mal gestartet aber aufgrund verschiedener Gründe abgebrochen habe).

Hier gibts einen kurzen aber guten Vergleich der gängisten Ansätze: https://stackoverflow.com/a/5124291/587106

freimatz 29. Nov 2017 16:14

AW: Trennung von GUI und Logik, wie geht ihr vor?
 
Wir verwenden schon seit Jahren MVVM mit einem selbstgebastelten FrameWork.
Ich stimme Stevie in fast allem zu. Fast - es macht auch mit FrameWork noch Schmerzen.

Rollo62 29. Nov 2017 17:24

AW: Trennung von GUI und Logik, wie geht ihr vor?
 
Setzt den jemand Daniel Teti's DMVC ein, was ist davon zu halten ?

Womöglich gibt es da auch Ansätze als View statt auf einem WebModul auf eine Form zu gehen ?
Ich habe da was von Messaging, etc. gesehen, was vielleicht auch ein gangbarer Weg wäre M V und C elegant zu entkoppeln und doch zu verbinden ...


Rollo


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:44 Uhr.
Seite 13 von 19   « Erste     3111213 1415     Letzte »    

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