AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Trennung von GUI und Logik, wie geht ihr vor?
Thema durchsuchen
Ansicht
Themen-Optionen

Trennung von GUI und Logik, wie geht ihr vor?

Ein Thema von divBy0 · begonnen am 19. Aug 2011 · letzter Beitrag vom 30. Jan 2018
Antwort Antwort
Seite 2 von 2     12   
jus

Registriert seit: 22. Jan 2005
350 Beiträge
 
Delphi 2007 Professional
 
#1

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

  Alt 28. Nov 2017, 01:14
Hallo zusammen,

in diversen Themen hier taucht ja immer wieder die Trennung von GUI und Logik auf. Mich würde es mal interessieren wie ihr dabei vor geht.

Beispiel:

Ein Formular mit zwei Edits, einem Button und einem Label.

Delphi-Quellcode:
unit uMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, uAddition, StdCtrls;

type
  TForm1 = class(TForm)
    EditZahl1: TEdit;
    EditZahl2: TEdit;
    ButtonAddition: TButton;
    LabelErgebnis: TLabel;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.
Eine Klasse mit einer "extrem schwierigen" Berechnung:

Delphi-Quellcode:
unit uAddition;

interface

type
  TAddition = class
    private
      FErgebnis: Integer;
    public
      function Addition(Zahl1, Zahl2: Integer): Integer;
      property Ergebnis: Integer read FErgebnis;
  end;

implementation

{ TAddition }

function TAddition.Addition(Zahl1, Zahl2: Integer): Integer;
begin
  FErgebnis := Zahl1 + Zahl2;
  Result := FErgebnis;
end;

end.
Vielen Dank schon mal für euer Mitmachen!
Sorry, dass ich den alten Thread aufwärme, aber ich versuche mich in MVC einzuarbeiten und würde paar ein konkrete Beispiele in Delphi benötigen. Bei diesem einfachen Beispiel würde mich interessieren wie man sowas unter Delphi 2007 löst. Stevie hat zwar ein komplettes Beispiel gepostet, aber man benötigt DSharp, damit es läuft. Wie könnte man dieses Beispiel als MVC ohne zusätzliche Bibliothek umgestaltet werden?

lg,
jus
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
350 Beiträge
 
Delphi 2007 Professional
 
#2

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

  Alt 28. Nov 2017, 19:23
anders gefragt, gibt es empfehlenswerte Seiten, wo wann MVC oder MVVM für Pascal nachlesen kann?

lg,
jus
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

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

  Alt 28. Nov 2017, 20:31
Bei diesem einfachen Beispiel würde mich interessieren wie man sowas unter Delphi 2007 löst.
Mit einer Klasse (TRechner).
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 28. Nov 2017, 21:55
Hallo,

vielleicht hilft Dir das Video zu weiteren Erkenntnissen.

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

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

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

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.
Angehängte Grafiken
Dateityp: png MVC.png (82,9 KB, 49x aufgerufen)
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
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
685 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 29. Nov 2017, 08:26
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.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.513 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 29. Nov 2017, 08:42
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
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
350 Beiträge
 
Delphi 2007 Professional
 
#8

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

  Alt 29. Nov 2017, 13:44
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.

Moin...
Ein Minimalbeispiel entsprechend der Grafik...
...
Vielen Dank für das Beispiel, das werde ich mir heute am Abend genauer anschauen.

lg,
jus
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.052 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

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

  Alt 29. Nov 2017, 14:01
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?

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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz