Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Message-Problem


GuaAck - Mo 17.11.14 23:37
Titel: Message-Problem
Hallo Experten,

ich habe einen Prozess mit einem Hauptthread und einem "Weiterer-Thread", der Daten erzeugt, die im Haupthread ausgewertet werden müssen. Wenn ein Block Daten erzeugt ist, dann schickt der "Weiterer-Thread" dem Hauptthread eine Message, worauf der die Auswertung macht.

Nun mein Problem:

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:
37:
38:
39:
40:
41:
42:
{ Folgendes geht: }
{ =============== }
TYPE
  TMyForm = CLASS(TForm)
  PRIVATE
   PROCEDURE PWM_WasZuMachen(VAR msg: TMsg);
   PROCEDURE AppMessage(VAR msg: TMsg; VAR Handled: boolean);
  END;

PROCEDURE TMyForm.AppMessage(VAR msg: TMsg; VAR Handled: boolean);
BEGIN
  IF (msg.message = WM_WasZuMachen) THEN
    BEGIN
    PWM_WasZuMachen(msg);
    Handled := true;
    END
END;

PROCEDURE TMyForm.PWM_WasZuMachen;
BEGIN
...
END;

PROCEDURE TMyForm.FormCreate(Sender: TObject);
BEGIN
  Application.OnMessage := AppMessage;
END;


{ Folgendes geht NICHT: }
{ ===================== }
TYPE
  TMyForm = CLASS(TForm)
  PRIVATE
   PROCEDURE PWM_WasZuMachen(VAR msg: TMsg); MESSAGE WM_WasZuMachen;
  END;


PROCEDURE TMyForm.PWM_WasZuMachen;
BEGIN
...
END;



Muss man für den Meassage-Handler von Delphi noch was konfigurieren?

Bin gespannt,
Gruß GuaAck


baumina - Di 18.11.14 08:20

Da ich nicht ganz verstehe was du unter "das geht nicht" verstehst, hier ein kleiner Vorschlag:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
{ Folgendes geht NICHT: }
{ ===================== }
TYPE
  TMyForm = CLASS(TForm)
  PRIVATE
   PROCEDURE PWM_WasZuMachen(VAR msg: TMsg); MESSAGE WM_WasZuMachen;
  END;


//PROCEDURE TMyForm.PWM_WasZuMachen; // hier fehlt der Übergabe-Parameter
PROCEDURE TMyForm.PWM_WasZuMachen(VAR msg: TMsg);
BEGIN
...
END;


jaenicke - Di 18.11.14 08:21

Du schickst die Message vermutlich an das falsche Fensterhandle. Wie sieht denn der Quelltext zum Senden aus?

Für die Threadkommunikation macht eine von TForm abgeleitete Klasse aber ohnehin keinerlei Sinn. Schau dir am besten einmal den Quelltext von TTimer an. Der ist sehr kompakt und zeigt sehr gut wie du dir selbst ein Fensterhandle registrierst und damit arbeitest.

user profile iconbaumina hat folgendes geschrieben Zum zitierten Posting springen:
Da ich nicht ganz verstehe was du unter "das geht nicht" verstehst, hier ein kleiner Vorschlag:
Den Parameter unten unter implementation wegzulassen ist zwar äußerst schlechter Programmierstil, funktioniert aber problemlos. Das macht also von der Funktionalität her keinen Unterschied.


GuaAck - Di 18.11.14 20:23

Danke Jaenicke,

richtig vermutet: Ich schickte die Message an Application.handle. Ich muss sie an das Handle des Forms schicken, jetzt geht es auch.

Gruß
Guaack


GuaAck - Mi 19.11.14 00:47

Nachtrag:
TMsg ist falsch, man muss TMessage nehmen.
Gruß GuaAck