Autor Beitrag
Sybok Factor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50
Erhaltene Danke: 5

Win XP, Win Vista
Delphi 2010 Professional
BeitragVerfasst: Mi 05.05.10 18:39 
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:
ausblenden Delphi-Quelltext
1:
PostMessage(Application.Handle, MYMESSAGE, 0,0);					


Eine andere Komponente soll darauf reagieren, also habe ich eine entsprechende Prozedur angelegt:
ausblenden 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); //<- also TNotifyEvent
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 user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 22.10.2010 um 12:42

_________________
Jetzte michse verstehen dein Problem.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: 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.
ausblenden volle Höhe 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

Für diesen Beitrag haben gedankt: Sybok Factor
Sybok Factor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50
Erhaltene Danke: 5

Win XP, Win Vista
Delphi 2010 Professional
BeitragVerfasst: 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.

_________________
Jetzte michse verstehen dein Problem.
Sybok Factor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50
Erhaltene Danke: 5

Win XP, Win Vista
Delphi 2010 Professional
BeitragVerfasst: 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

_________________
Jetzte michse verstehen dein Problem.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 22.10.10 11:07 
Warum Nachrichten? Du arbeitest doch schon objektorientiert mit deinen Komponenten, warum nutzt du dann keine Ereignisse?
Sybok Factor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50
Erhaltene Danke: 5

Win XP, Win Vista
Delphi 2010 Professional
BeitragVerfasst: 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

_________________
Jetzte michse verstehen dein Problem.