Eventuell weil das zu stark mit der Plattform verbunden ist?
Weil man sich dafür einen MessageManager schreibt, den man dann für alles benutzen kann und vor allem verständliche und einfach zu handhabende Messages durch das System leiten kann.
Auf den Trichter ist auch Emba gekommen
System.Messaging.
Den Nachrichtentypen definieren:
Delphi-Quellcode:
unit MyCustomMessages;
uses
System.Messaging;
type
TProgressMessage =
class( TMessage )
public
constructor Create( Position, Max : Integer );
property Position : Integer
read FProgress;
property Max : Integer
read FMax;
end;
Die Form damit verbinden
Delphi-Quellcode:
uses
System.Messaging;
TFoo = class( TForm )
Progressbar1 : TProgressBar;
private
procedure HandleProgressMessage( const Sender : TObject; const M : TMessage );
public
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
end;
implementation
uses
MyCustomMessages;
procedure TFoo.AfterConstruction;
begin
inherited;
TMessageManager.DefaultManager.SubscribeToMessage( TProgressMessage, HandleProgressMessage );
end;
procedure TFoo.BeforeDestruction;
begin
TMessageManager.DefaultManager.Unsubscribe( TProgressMessage, HandleProgressMessge );
inherited;
end;
procedure TFoo.HandleProgressMessage( const Sender : TObject; const M : TMessage );
var
LMsg : TProgressMessage absolute M;
begin
ProgressBar1.Position := LMsg.Position;
ProgressBar1.Max := LMsg.Max;
end;
Der Thread schmeisst die Nachricht
Delphi-Quellcode:
uses
System.Messaging, MyCustomMessages;
procedure TFooThread.Execute;
var
LPosition, LMax : Integer;
begin
while WorkInProgress do
begin
// Fortschritts-Nachricht verschicken
Queue(
procedure
begin
TMessageManager.DefaultManager.SendMessage( Self, TProgressMessage.Create( LPosition, LMax ) );
end );
...
end;
end;
Und schon klappt das auf
jeder Plattform, auch
ohne irgendwelche Fenster (
Handle) offen zu haben,
egal wer das empfangen möchte, kann sich einfach an den MessageManager hängen und alles ist gut.
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)