Autor Beitrag
Phobeus
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1280

Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
BeitragVerfasst: Mi 08.10.03 01:11 
Hi,
ne wenig verwirrend ist die Beschreibung der Forum ja schon ne wenig. Hoffe doch sehr, dass ich hier richtig bin, else move plz ;)

Folgende Situation: Ich schreibe gerade eine Komponente, die mir eine einfache Kapselung auf eine API-Funktion liefern soll. (TNotifyIconData). Nun versuche ich gerade meine non-visuelle Komponente entsprechend auf einige Ereignisse reagieren zu lassen und nutze dafür das dafür vorgesehen WinAPI-Callback:
uCallbackMessage := WM_TICOMSG;

WM_TICOMSG wurde als Konstante wie folgt vereinbart:
ausblenden Delphi-Quelltext
1:
2:
const
  WM_TICOSG  = WM_USER + 10;


nun habe ich mir eine Methode definiert und lasse diese auf das Signal warten:
procedure events(VAR msg:TMessage); message WM_TNAMSG;

Solange ich das ganze von einem Formular aus mache und per Knopf ein Icon in die Tray legen lasse, so kann ich nun in events alle Nachrichten abfangen, behandeln und entsprechend reagieren. Soweit die Theorie, die Praxis bei meiner Komponente sieht leider ganz anders aus. Praktisch der gleiche Code wurde in eine TComponent genommen. Das ganze momentan noch ohne Ereignise im OI realisiert, scheint bei der Komponente events nicht auf die entsprechende ID zu reagieren... das Callback scheint dort zu versagen. Ich bin ein wenig verwirrt, da ich mir eigentlich keinen Fehler bewußt bin. Mir hat nun ein Vogel ins Ohr gezwitschert, dass TComponent doch gar keine Ereignisse unterstützt... ich persönlich kann es mir nicht vorstellen und auch bisher nirgendswo eines besseren belehrt worden, allerdings in der VCL bisher nur visuelle Komponenten gesehen, die mit "message" arbeiten, alle anderen arbeiten mit Callbacks á la HwndProc.

Hoffe, dass jemand ne alten Pascaler helfen kann, der sich nun ne wenig verloren in der "neuen Welt" verloren kommt. Kann es wirklcih sein, dass TComponent aus mir nicht ersichtlichen Gründen die Messages unterdrückt und ich das Problem anders als bei einem TForm lösen muss?

Danke ;)

Moderiert von user profile iconKlabautermann: Delphi-Tags hinzugefügt.

_________________
"Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mi 08.10.03 11:09 
Das Problem ist, dass TComponent kein Fenster mit einem Fenster-Handle und einer WndProc ist, an das deine Trayicon-Message geschickt werden kann.

Mit welchen Werten füllst du eigentlich den TNotifyIconData-Record? Dort muss man doch das Fenster-Handle angeben an das nicht Message geschickt werden soll (wenn ich mich jetzt nicht irre..). Welches Handle hast du denn dort angegeben?

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Phobeus Threadstarter
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1280

Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
BeitragVerfasst: Mi 08.10.03 11:14 
Beim TForm entsprechend Form1.Handle; Bei der Komponente gibt es ne Methode "Show" die wiederrum ein Fensterhandle als Parameter erwartet und dieses in den TNotifyIconData-Record einträgt... Du versuchst mir also zu sagen, dass die Message bei der TComponent nicht verarbeitet wird, da es nicht wie beim Form den gleichen Handle hat? Wäre irgendwo eine Erklärung, welche Lösung würdest Du den stattdessen anstreben? Würde ich eben ne Event-Methode haben an der das Callback übergeben wird, liesse sich dort ja die ganzen Ereignisse hervorragend abarbeiten, selbst wenn die Komponente selbst kein Handle hat. Das TNotifyIconData hat ja durch die Übergabe zwangsläufig eines.

_________________
"Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Mi 08.10.03 11:46 
Gut, damit übergibst du also das Handle der Form, deine Message kommt also wieder nur bei der Form an..! Ein "Workaround" wäre ein verstecktes Fenster zu erstellen, das nur als "Message-Empfänger" für deine Kompo existiert, eine andere Möglichkeit wäre weiterhin das Handle der Form zu benutzen und nur wie WndProc der Parent-Form zu subclassen um so an die Message zu kommen.

Wenn ich eine der beiden Methoden umsetzen müsste würde ich auf jeden Fall die zweite nehmen, aber ich halte ehrlich gesagt von beiden nicht viel und finde Komponenten-Kapselungen für TrayIcons ehrlich gesagt auch nicht wirklich sinnvoll...

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
Phobeus Threadstarter
ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1280

Linux (FC6), WinXP Pro (Box)
D6 Pers, D7 Pro, FPC 2.x
BeitragVerfasst: Mi 08.10.03 14:57 
Etwas mehr als nur die Tray wird es ja auch noch, allerdings hiehlt ich es für ne gute Möglichkeit in der Thematik einzusteigen und bin nun ehrlich ne wenig gefrustet, dass es so nicht gehen soll. Denke es wird dabei auf eine Lösung mit einem versteckten Fenster hin laufen, da ich die andere nicht so... berauschend finde. Werde auch dann nochmal die PSDK dazu fragen, vielleicht gibts da ja doch noch die Möglichkeit ne Callback-Funktion zu definieren. Dachte nur bisher, dass die Nachricht nicht über das Windows-Fenster, sondern vielmehr über die Message-ID identifiziert wird und es dann aus dem System-Pool ge"fischt" wird. Scheint ja jedoch nicht der Fall zu sein.

_________________
"Menschen sterben nicht wenn man sie zu Grabe trägt, sondern wenn sie ihre Träume verlieren..."