Autor Beitrag
cvoelkel
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 03.08.05 15:33 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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:

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
cvoelkel Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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

_________________
"people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
cvoelkel Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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:

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:
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.