AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MVC -- Kommunikation unter Controllern?!

Ein Thema von s.h.a.r.k · begonnen am 15. Okt 2011 · letzter Beitrag vom 17. Okt 2011
Antwort Antwort
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#1

AW: MVC -- Kommunikation unter Controllern?!

  Alt 15. Okt 2011, 15:22
Was du suchst, nennt sich Mediator-Pattern. Ich arbeite damit recht häufig privat, allerdings in Csharp: Jeder Controller hat eine Basisklasse, die wiederum einen statischen Mediator besitzt. So ist gewährleistet, dass jeder Controller dieselbe Instanz nutzt.

Kommuniziert wird klassisch, über String-Messages. Könnte man vielleicht auch mal ändern, muss man aber nicht. Jeder Controller muss sich dabei mit den Messages beim Mediator registrieren, für die er Nachrichten empfangen möchte.

Falls du ein bisschen C# kannst, kannst du dir ja mal dieses Beispiel ansehen und versuchen, dort etwas für dich abzuleiten. Mit Delphi kann ich leider nicht dienen.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#2

AW: MVC -- Kommunikation unter Controllern?!

  Alt 15. Okt 2011, 22:52
Du solltest Dir auch mal TObject.Dispatch anschauen...
hier ist auch noch ein link dazu: The-quest-for-the-perfect-publish-subscribe-mechanism-in-Delphi
Ich arbeite an einem MVP framework und stehe vor demselben Problem
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog

Geändert von webcss (15. Okt 2011 um 23:45 Uhr) Grund: Ergänzung
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: MVC -- Kommunikation unter Controllern?!

  Alt 16. Okt 2011, 08:44
Hallo,

wer sagt, dass ein Controller nur Nutzer-Eingaben verwaltet.
Warum baust du dir keinen "System"-Controller, den du mit Anweisungen fütterst.
Dieser Controller führt die Anweisungen aus, so als wenn ein User selber geklickt hätte.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#4

AW: MVC -- Kommunikation unter Controllern?!

  Alt 17. Okt 2011, 15:06
Danke schon mal für die Gedanken und Hinweise! Vor allem bzgl. der Kommunikation der Controller untereinander bin ich nun sehr viel schlauer und werde dahingehend wohl einiges umbauen

Seltsam finde ich auf die Dauer nur, dass mir sowas nicht viel früher über den Weg gelaufen ist und ich hier einfach zu wenig über genau sowas finde. Dachte schon ich habe sehr komische Probleme, die keinem anderen über den Weg laufen...
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#5

AW: MVC -- Kommunikation unter Controllern?!

  Alt 17. Okt 2011, 15:23
An Deinen Erkenntnissen würde ich gerne teilhaben

Ich z.B. möchte die Kommunikation via Messages lösen, habe allerdings das Problem das ich alle möglichen Messages empfange, nur meine eigenen nicht...

Hast Du konkret eine Ahnung, wie ich die verschicken kann, damit ich sie auch empfange?
Meine Controller sind von TComponent abgeleitet, haben ein Handle und ein Wnd_Proc, aber sind für meine messages taub.

Gruß,
Clemens
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: MVC -- Kommunikation unter Controllern?!

  Alt 17. Okt 2011, 17:01
An Deinen Erkenntnissen würde ich gerne teilhaben

Ich z.B. möchte die Kommunikation via Messages lösen, habe allerdings das Problem das ich alle möglichen Messages empfange, nur meine eigenen nicht...

Hast Du konkret eine Ahnung, wie ich die verschicken kann, damit ich sie auch empfange?
Meine Controller sind von TComponent abgeleitet, haben ein Handle und ein Wnd_Proc, aber sind für meine messages taub.

Gruß,
Clemens
Von Component ableiten ist ja schon gut, aber wozu haben die ein Handle?
Ich habe mal die Idee von dem FinalBuilder umgesetzt.

Da sieht das dann wie folgt aus:

Message-Typ definieren:
Delphi-Quellcode:
unit Msg.Foo;

const
  MSG_FOO = $1000; // kann beliebig gewählt werden (muss aber ein Cardinal sein

  MSG_FOO_AKTION1 = MSG_FOO + $1;

type
  TMsgFooAktion1 = packed record
    MsgID : Cardinal;
    Unused : array [1 .. 12] of Byte;
    Info : string;
    constructor Create( const AInfo : string );
  end;

implementation

{ TMsgFooAktion1 }

constructor TMsgFooAktion1.Create(const AInfo: string);
begin
  MsgID := MSG_FOO_AKTION1;
  Info := AInfo;
end;

end.
Jetzt mal den Controller
Delphi-Quellcode:
unit Ctrl.Foo;

uses
  Msg.Foo,
  MVC.ViewController;

type
  TCtrlFoo = class( TMVCCustomViewController )
  protected
    procedure DoMsgFooAktion1( var Message : TMsgFooAktion1 ); message MSG_FOO_AKTION1;
  end;

implementation

uses
  Dialogs;

procedure TCtrlFoo.DoMsgFooAktion1( var Message : TMsgFooAktion1 );
begin
  ShowMessage( Message.Info );
end;

end;
DIe Message wird nun wie folgt gesendet:
Delphi-Quellcode:
...
uses
  AppMsg,
  Msg.Foo;

...
var
  lMsg : TMsgFooAktion1;
begin
  lMsg.Create( 'Hello World!' );
  Publisher.SendMessage( lMsg );
end;
Die Unit AppMsg ermöglicht den Zugriff auf den Publisher (als Interface), an dem sich die Controller anmelden Subscribe oder abmelden UnSubscribe .
Dieses An- und Abmelden erfolgt schon automatisch durch die Controller-Basis-Klasse.

Sehr nett ist das vor allem im Hinblick darauf, dass man hierbei einfach diese Controller in die Luft erzeugen kann, und diese trotzdem
a) mit den Messages erreicht
und
b) am Ende der Anwendung automatisch aufgeräumt werden
TCtrlFoo.Create( nil ); und der Controller ist einsatzbereit (bis auf die Tatsache, dass dieser ViewController keine View bekommen hat )

Ich schicke nachher mal die Units hier hoch.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#7

AW: MVC -- Kommunikation unter Controllern?!

  Alt 17. Okt 2011, 19:54
Von Component ableiten ist ja schon gut, aber wozu haben die ein Handle?
Damit sie als Empfänger von Nachrichten erkannt werden bzw. adressiert werden können.
Ich habe mal die Idee von dem FinalBuilder umgesetzt.
Das hab ich auch schon gemacht und das funktioniert wunderbar, allerdings hat der Gedanke eines globalen Messengers sein "G'schmäckle". Ich wollte ihn zumindest als class var in die Controller Klasse einbauen, aber irgendwie hält der nicht die Subscriber, obwohl als klassisches object ohne RefCount eingebaut.

Außerdem wäre es schön, aus den Views heraus einfach messages auf dem bestehenden Weg zu schicken, eben ohne globalen Messenger (neben TApplication).
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:47 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