Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Auf eigene Message reagieren
Sybok Factor - Mi 05.05.10 18:39
Titel: Auf eigene Message reagieren
Hallo an alle,
ich habe eine eigene Message Konstante angelegt als WM_USER + 300. Die Message wird von einer Komponente bei Veränderung eines Properties per PostMessage gesendet:
Delphi-Quelltext
1:
| PostMessage(Application.Handle, MYMESSAGE, 0,0); |
Eine andere Komponente soll darauf reagieren, also habe ich eine entsprechende Prozedur angelegt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type ... protected procedure DoMyMessage(var Message: TMessage); message MYMESSAGE; ...
procedure DoMyMessage(var Message: TMessage); begin if Assigned(FOnMyEvent) then FOnMyEvent(Self); end; |
Leider reagiert die Empfängerkomponente nicht auf die Nachricht. Nutze ich TApplicationEvents.OnMessage kann ich feststellen, dass die Nachricht ankommt. Hat jemand einen Vorschlag, was ich ändern könnte?
Falls an meiner Frage etwas unklar ist, bitte melden.
Danke und viele Grüße
Sybok
Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 22.10.2010 um 12:42
jaenicke - Mi 05.05.10 18:45
Du schickst es ja auch an Application und nicht an deine Komponente. Die Komponente bekommt natürlich nur Messages, die auch an sie gerichtet sind. Stell dir nur vor was sonst bei WM_PAINT Messages passieren würde, wenn die alle Komponenten bekämen obwohl nur eine neu gezeichnet werden muss. ;-)
Tryer - Mi 05.05.10 22:30
Vielleicht ist ein weiteres grundlegendes Problem auch das deine "Komponente" (deren Vorfahren wir nicht kennen) gar keine Fensterprozedur besitzt und somit garnicht in der Lage ist Nachrichten zu empfangen.
Dafür gäbe es dann "AllocateHWnd", um eine eigene (minimierte) Fensterprozedur zu registrieren welche die Nachricht nur via Dispatch verteilt. AllocateHWnd liefert das benötigte eigene Handle zurück, an welches dann Nachrichten geschickt werden können.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| const WM_TESTMSG = WM_USER + 1;
type TTestMsg = class public FHandle: HWnd; protected procedure WMTest(var Msg: TMessage); message WM_TESTMSG; procedure WndProc(var Msg: TMessage); public constructor Create; destructor Destroy; override; property Handle: HWnd read FHandle; end; .. constructor TTestMsg.Create; begin FHandle := AllocateHWnd(WndProc); end;
procedure TTestMsg.WndProc(var Msg: TMessage); begin Dispatch(Message); end;
destructor TTestMsg.Destroy; begin DeallocateHWnd(FHandle); inherited; end;
procedure TTestMsg.WMTest(var Msg: TMessage); begin Showmessage('funzt'); end; |
Es bestände dann natürlich auch die Möglichkeit die Nachricht direkt in WndProc auszuwerten.
Grüsse, Dirk
Sybok Factor - Do 06.05.10 00:55
Erst einmal danke für beide Antworten. Ich muss zugeben, dass ich das Konzept der Message Verarbeitung innerhalb der Applikation noch nicht so ganz verstanden habe... :oops:
Von daher habt ihr mich beide auf die Schwachstellen in meinen Überlegungen hingewiesen. Werd morgen mal ein bißchen probieren und mich dann wieder melden.
Viele nächtliche Grüße und Danke
Sybok.
Sybok Factor - Fr 22.10.10 00:42
Ich habe gerade entdeckt, dass ich hier noch gar keine Rückmeldung gegeben habe: Es hat auch mit Tryers Prozdur leider nicht funktioniert. Allerdings habe ich vor einiger Zeit gelesen, dass die Verarbeitung der Messages nicht klappt, wenn eine TApplicationEvents Komponente eingesetzt wird - und die hatte ich.
Vielen Dank noch mal an die Helfer
Sybok
Delete - Fr 22.10.10 11:07
Warum Nachrichten? Du arbeitest doch schon objektorientiert mit deinen Komponenten, warum nutzt du dann keine Ereignisse?
Sybok Factor - Fr 22.10.10 16:11
Hallo Luckie,
die Konstellation war ungefähr so: Ich habe auf einem Haupformular eine Komponente mit einem Property z.B. WorkLocal. Dieses Property soll zum Beispiel angeben, ob ein Netzwerkzugriff da ist oder nicht, bzw. ob der Benutzer auf lokalen oder auf Netzwerkdaten arbeiten will. Wird auf lokale Daten umgestellt, muss die Komponente auf dem Hauptformular die Änderung an alle geöffneten Clients weitergeben, weil sonst Fehler auftreten werden.
Der "Einfachheit" halber, weil ich ja nicht weiß welche Fenster offen sind und wo die Veränderung zu Problemen führen kann, wollte ich eine Nachricht senden, auf die die Clients dann reagieren.
Wie geschrieben, das ist nur ein Beispiel für die Geschichte, an der ich experimentiert hatte. Und ich wüsste auch jetzt nicht, wie man es ohne Messages hinbekommen sollte, dass eine beliebige Komponente auf einem beliebigen Formular auf eine Änderung reagiert.
Viele Grüße
Sybok Factor
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!