Entwickler-Ecke

Windows API - PostMessage an eigene Klasse


cvoelkel - Mi 03.08.05 15:33
Titel: PostMessage an eigene Klasse
Hallo,

wahrscheinlich stehe ich auf dem Schlauch aber vielleicht kann mir jemand einen Tipp geben:

Ein eigene Klasse (nicht TForm, nichts visuelles) verwaltet eine Liste von Einträgen.
Über eine Checkroutine werden diese Einträge über Threads geprüft. Wenn ein Thread
fertig ist, soll er über PostMessage meiner Klasse sagen, daß er fertig ist. Da PostMessage
allerdings ein Handle erwartet, stehe ich etwas auf dem Schlauch, da meine Klasse einfach
nur von TObject abgeleitet wird.

Any Idea :?:

Danke
Christian


MrSaint - Mi 03.08.05 15:35

ncith von TObject ableiten, sondern von TWinControl sollte da glaube ich helfen :) dann bekommst du glaub auch ein Handle :)


EDIT: :welcome:


cvoelkel - Mi 03.08.05 16:08

user profile iconMrSaint hat folgendes geschrieben:
ncith von TObject ableiten, sondern von TWinControl sollte da glaube ich helfen :) dann bekommst du glaub auch ein Handle :)


Danke für die schnelle Antwort - hat aber leider nicht viel gebracht. Wenn ich von TWinControl ableite hagelt es zunächst Fehlermeldungen (schon der Constructor ist anders). Gibt es keine einfachere Methode um einer eigenen (nichtvisuellen) Klasse eine Nachricht zukommen zu lassen?

Grüße
Christian


MrSaint - Mi 03.08.05 16:18

Hmm, ich hab grad in die TWinControl reingeschaut. Die holt das Handle irgendiwe über Suche im MSDN CREATEWINDOWEX. Vielleicht kommst du da irgendwie weiter, wenn du dir einfach per Hand dann n Handle holst. Wie du dann aber die Message "abfangen" sollst, die dann an diene Klasse (bzw. an die Instanz der Klasse) geschickt wird, weiß ich net genau... Evtl. gehts auch gar nicht, weil der "Main-Message_loop" (implementiert in TApplication.Run) kann vielleicht auch nur mit TWinControls umgehen.. k.A., schau einfach mal n bisschen im RTL-Source rum :) Aber am Einfahcsten wäre es wahrshceinlich einfahc von TWinControl abzuleiten, dann könntest du dir sicher sien, dass alles so funktioniert wie es das üblicherweise auch tut.. Dann musst du deine Klasse halt entsprechend anpassen... Und ein paar Parameter zum Konstruktor hinzufügen is ja nich die Welt ;)


MrSaint


cvoelkel - Mi 03.08.05 23:20

Hallo nochmal,

Danke für Deine Antwort, ich hab jetzt doch eine elegante Lösung ohne den Umweg über TWinControl
gefunden. Sind nur ein paar Zeilen und es funktioniert wunderbar. :D


Wen es interessiert:


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:
 
const TH_Message = WM_USER +1;

type TMyClass = class(TObject)
                // blabla
                private
                   // ... in meiner Hauptklasse zusätzlich eingefügt:
                   F_Handle : HWnd;
                   procedure WndProc(var msg:TMessage);
                // blabla
                end;

constructor TMyClass.Create;
begin
  inherited;
  // blabla

  //im Constructor meiner Hauptklasse zusätzlich eingefügt
  F_Handle := Classes.AllocateHWnd(WNDProc);
end;

procedure TMyClass.WndProc(var msg:TMessage);
begin
  // Nur die gewünschte Nachricht des Thread-Endes abfangen:
  if (msg.Msg=TH_Message) then
    begin
      // DoSomething
    end;
end;

destructor MyClass.Destroy;
begin
  // blabla
  //im Destructor meiner Hauptklasse zusätzlich eingefügt
  Classes.DeallocateHWnd(F_Handle);
  inherited;
end;

// Die Threadklasse hat eine zusätzliche private Variable ParentHandle bekommen
// die bei Erstellung des Threads übergeben wird. Ab dann kann aus dem Thread über
// PostMessage(Self.F_ParentHandle ,TH_MESSAGE,0,0) die Message übermittelt
// werden.



Grüße
Christian

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.