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.