|
Alle WM_USER-Nachrichten, die an eine Anwendung gerichtet sind, treffen bei TApplication.Handle ein. Von dort aus muß die Anwendung selbst dafür sorgen, daß die Nachricht dorthin gelangt, wo sie benötigt wird.
Als Beispiel für eine Vorgehensweise zur Behandlung der Events wird nachfolgend die Komponente THookUserMessage implementiert, die als nicht-visuelle Komponente einem Formular hinzugefügt wird und damit ermöglicht, Nachrichten an Application.Handle zu senden und von dort zu empfangen. Der Schlüssel für diese Funktionalität ist die TApplication-Methode.
procedure HookMainWindow(Hook: TWindowHook);
Mit HookMainWindow wird es externen Dialogfeldern möglich, Botschaften zu empfangen, die an das Hauptfenster der Anwendung gesendet wurden, indem die Methode sicherstellt, daß sich das externe Dialogfeld korrekt als untergeordnetes Fenster der Anwendung verhält, und nicht als Standalone-Fenster. Wenn das durch die Eigenschaft Handle identifizierte Fenster Dialogbotschaften erhält, werden diese an die Dialogprozedur, die im Parameter Hook übergeben wurde, weitergeleitet.
Die Komponente THookUserMessage nutzt dies aus, indem sie sich via HookMainWindow bei TApplication anmeldet und für jede eintreffende Nachricht einen Event erzeugt.
Das Anmelden der Klasse bei TApplication erfolgt sinnvollerweise im Konstruktor der Klasse.
constructor THKMessageReceiver.Create(AOWner: TComponent);
begin
inherited create(AOwner);
if ComponentState=[]
then begin
Application.HookMainWindow(AppWindowHook);
FHooked:=true;
end
else FHooked:=false;
end;
Die Methode AppWindowHook ist wie folgt implementiert:
function THKMessageReceiver.AppWindowHook(
var Message: TMessage): boolean;
begin
result:=true;
with message do
begin
if (Msg >= WM_USER) and
(assigned(FOnReceiveMessage))
then FOnReceiveMessage(msg, WParam, LParam);
AppWindowHook := false;
end;
end;
Damit ist sichergestellt, daß die Komponente die Nachrichten von TApplication erhält. Über das Behandeln des Events OnReceiveMessage kann das besitzende Formular der Komponente auf die Nachricht reagieren. Untereinander können Fenster einander informieren, indem bei Bedarf eine global definierte Nachricht
const WIN_UPDATE = WM_USER + $100;
an Application.Handle verschickt und von interessierten Formularen behandelt wird.
|