![]() |
Fensternachrichten Unterscheidung
Moin zusammen,
wenn ihr eine neue Komponente entwickelt und diese Komponente soll auf Fensternachrichten reagieren, geht man so vor das man WM_USER als Grundlage nimmt und einen entsprechenden Wert für die neue selbst definierte Nachricht zu WM_USER addiert.
Code:
const WM_SelfDefined = WM_USER + 10;
Wenn man jetzt viele verschiedene Komponenten benutzt, kann es ja durchaus passieren, daß in einer anderen fremden Komponente die selbe Nachricht definiert worden ist. Soweit ich weiss gibt es ja keinen Referenzzähler der mir die letzte definierte Fensternachricht wiedergibt, so daß ich neue Fensternachrichten höher als diese definieren könnte. Im Moment kann es aber dazu kommen, daß Komponenten zu falschen Zeiten reagieren, da sie eine Nachricht erhalten haben, diese aber nicht wirklich für sie bestimmt war. Wie geht ihr vor? Gibt es da Möglichkeiten aus diesem Dilemma rauszukommen? Lieben Gruß Tyrael |
Re: Fensternachrichten Unterscheidung
Hallo Tyrael,
nur private message codes - solche die deine Anwendung nicht verlassen - definierst du dir anwendungsbezogen über WM_USER. Besteht die Gefahr der Mehrfachverwendung des message codes, dann schau dir mal Windows.RegisterWindowMessage() an. Damit kannst du dir systemweite message codes besorgen. Grüße vom marabu |
Re: Fensternachrichten Unterscheidung
Das die Nachrichten nur innerhalb meiner Applikation gültig sidn ist mir klar.
Mir geht es darum, daß ich z.B. mehrere Komponenten innerhalb meiner Applikation haben könnte, die alle sehr viel mit Fensternachrichten arbeiten. Wenn jetzt z.B. 2 mal die Nachricht WM_USER +1 in verschiedenen Komponenten definiert ist, könnte eine Komponente zu einem ungünstigen Zeitpunkt auf die nicht für ihn bestimmte Nachricht reagieren...dies könnte zu Seiteneffekten führen, die dann wiederum schwer nachzuvollziehen sind, bis man halt erkennt, daß eine andere Komponente dieselbe Nachricht feuert. Ich hoffe meine Bedenken sind jetzt bissel klarer geworden. Lieben Gruß Tyrael |
Re: Fensternachrichten Unterscheidung
die komponenten die nachrichten erhalten haben ja in der Regel unterschiedliche "Adressen" (Handles) also brauchst dir da kein kopp zu machen :)
|
Re: Fensternachrichten Unterscheidung
Zitat:
|
Re: Fensternachrichten Unterscheidung
Wirklich nicht?
Und was ist wenn da folgendes steht ?
Code:
..und es zwei Komponenten gibt die auf WM_USER + 1 reagieren?
Sendmessage(0, WM_USER +1, nil, nil);
Edit: ..von mir aus auch
Code:
Sendmessage(HandleZumHauptfenster, WM_USER + 1, nil, nil);
|
Re: Fensternachrichten Unterscheidung
Zitat:
marabu |
Re: Fensternachrichten Unterscheidung
Es geht jetzt gar nicht um eine Komponente die ich grad entwickle, sondern eher darum, was ist wenn ich zwei oder mehr Fremdkomponenten habe, die auf die selbe Nachricht reagieren.
Ich bin grad nämlich am Debuggen und habe die starke Vermutung zwei Komponenten reagieren auf die selbe Nachricht, was einen Fehler erklären würde. ..und habe mich grad in dem Zusammenhang gefragt, wie ich solche Fehler bei zukünftig selbst entwickelten Komponenten von vornherein verhindern könnte...irgendwie fehlt mir eine Referenz zu einer Variablen, die die höchste definierte Fensternachricht innerhalb meiner Applikation zurückgibt. |
Re: Fensternachrichten Unterscheidung
Für deine eigenen custom messages kannst du dir ja den gleichen Mechanismus entwickeln, der auch von Windows verwendet wird. Bei Fremdkomponenten mit Quelltext bist du auch fein raus. Zwei Fremdkomponenten, die sich die messages stehlen - da hätte ich gerne mein Geld zurück...
marabu |
Re: Fensternachrichten Unterscheidung
Kleiner Tip: Du wirst ja eine Vorstellung haben, wieviele Nachrichten du pro Kompo brauchst. Unterteile dir einfach deinen Bereich danach.
Beispiel:
Delphi-Quellcode:
MS macht's ähnlich.
const
KOMPO1_BASE = 100; KOMPO2_BASE = 200; KOMPO3_BASE = 300; WM_KOMPO1_BLA1 = WM_USER + KOMPO1_BASE + 1; WM_KOMPO1_BLA2 = WM_USER + KOMPO1_BASE + 2; WM_KOMPO2_BLA1 = WM_USER + KOMPO2_BASE + 1; WM_KOMPO3_BLA1 = WM_USER + KOMPO3_BASE + 1; WM_KOMPO3_BLA2 = WM_USER + KOMPO3_BASE + 2; Übrigens gehört das Thema eher unter Win32 als unter Sonstiges. |
Re: Fensternachrichten Unterscheidung
..ok...
sagen wir mal ich habe meine eigenen Komponenten so definiert.
Code:
..damit kann ich aber doch noch immer nicht sicher sein, daß zum Beispiel auf die Nachricht WM_KOMPO1_BLA1 ein andere Fremdkomponente auch reagiert...
const
KOMPO1_BASE = 100; KOMPO2_BASE = 200; KOMPO3_BASE = 300; WM_KOMPO1_BLA1 = WM_USER + KOMPO1_BASE + 1; WM_KOMPO1_BLA2 = WM_USER + KOMPO1_BASE + 2; WM_KOMPO2_BLA1 = WM_USER + KOMPO2_BASE + 1; WM_KOMPO3_BLA1 = WM_USER + KOMPO3_BASE + 1; WM_KOMPO3_BLA2 = WM_USER + KOMPO3_BASE + 2; ..sprich es passiert nicht das was ich wollte, sondern die Fremdkomponente reagiert...irgendwie fehlt mir in dem Zusammenhang etwas applikationsweit globales das halt eine Abgrenzung der Nachrichten garantiert...Fremd- oder Eigenkomponenten sollten dabei nicht die Rolle spielen...bei Eigenkomponenten ist das ja nur eine Sache der Pflege...aber bei Fremdkomponenten bin ich in dem Zusammenhang immer noch bissel skeptisch |
Re: Fensternachrichten Unterscheidung
Dazu gibt es dann eine Plausibilitätsüberprüfung. Außerdem: wer sendet denn die Nachrichten? Das System jedenfalls nicht. Also tun es die Komponenten oder deren Benutzer selber. Du hast es also durchaus in der Hand. Jede Kompo sollte ja ein eigenes Fenster haben. Damit ist auch ein Adressat eindeutig definiert. Ich verstehe also dein Problem nicht? Normalerweise sollte eine andere Kompo deine Nachricht garnicht bekommen, es sei denn du broadcastest alle deine Nachrichten (was natürlich schlechter Stil ist).
|
Re: Fensternachrichten Unterscheidung
Ich habe hier zwei Fremdkomponenten, eine davon ist für die Netzwerkkommunikation.
Beide Komponenten arbeiten viel mit Fensternachrichten. Die Netzwerkkommunikation wird manchmal, scheinbar grundlos abgebrochen, so wie es aussieht, feuert die 2. Komponente eine Nachricht, die die Netwerkkomponente verarbeitet und zwar "denkt" die Komponente, die Daten wären erfolgreich und vollständig verschickt worden und schliesst den Kommunikationskanal. Aus diesem Fehler heraus kam ich zu der anfänglichen Überlegung. |
Re: Fensternachrichten Unterscheidung
Normalerweise sind doch aber Fensternachrichten gerichtet. Will heißen der Adressat ist bekannt und vordefiniert. Ich kann mir das also alles noch nicht so ganz vorstellen, es sei denn die eine Kompo verwendet ohne RegisterWindowMessage() einen Broadcast. Was vermieden werden sollte!
Ansonsten brauchst du dir ja nur mal vorstellen welches Chaos unter normalen Umständen auf deinem Rechner existieren würde. Ach ja: natürlich ist relevant, ob deine Nachrichten in der Schleife des Elternfensters oder vom Fenster selbst bearbeitet werden. Bei erstem Fall kann es naturgemäß eher zu einer Kollision kommen. |
Re: Fensternachrichten Unterscheidung
Danke euch für die Denkanstösse :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 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 by Thomas Breitkreuz