| Autor |
Beitrag |
yogo
      
Beiträge: 121
Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
|
Verfasst: Fr 19.08.11 20:27
Hallo
Ich habe eine Form, auf der dynamisch erzeugte Komponenten aus einer DLL angezeigt werden.
Dem OnMouseMove-Event dieser Komponenten kann ich nicht nur sehr schwer etwas zuweisen, will ich auch vermeiden.
Nun soll meine Form aber ein anderes AlphaBlendValue haben, während die Maus drauf ist, als wenn nicht.
Bisher habe ich dafür mit OnMouseMove gearbeitet und per for Component in Form1.Components do in allen Komponenten OnMouseMove zugewiesen.
Das geht jetzt nicht mehr, in meiner Form ist ein Panel auf dem Komponenten ihre eigenen TNotifyEvents benutzen sollen.
WM_MOUSEMOVE wird leider nicht ausgelöst, WM_NCMOUSEMOVE auch nicht, hat jemand von euch vlt eine kreative Idee?
liebe Grüße, yogo Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Sa 20.08.2011 um 12:06
|
|
jaenicke
      
Beiträge: 19338
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 20.08.11 10:46
OnMouseEnter + OnMouseLeave...
yogo hat folgendes geschrieben : | | Das geht jetzt nicht mehr, in meiner Form ist ein Panel auf dem Komponenten ihre eigenen TNotifyEvents benutzen sollen. |
Die Komponente selbst soll ihr eigenes Event benutzen?
Das ist absolut keine gute Idee. Es gibt für die meisten Events auch Methoden, die du einfach direkt überschreiben kannst...
|
|
yogo 
      
Beiträge: 121
Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
|
Verfasst: Sa 20.08.11 12:05
Ich habe den Events diese beiden Prozeduren zugewiesen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TPluginForm.FormMouseEnter(Sender: TObject); begin ShowMessage('rein'); end;
procedure TPluginForm.FormMouseLeave(Sender: TObject); begin ShowMessage('raus'); end; |
Leider erscheinen die Meldungen nur, wenn ich sie den Komponenten in der Form zuweise.
BorderStyle der Form ist bsSizeToolWin oder bsNone.
Die oberste Komponente in der Form ist ein Panel, das auch den ganzen Platz einnimmt(also keine "tote Zone").
Auch wenn es eine "tote Zone" gibt, wird das Event nicht ausgelöst, sobald ich diese durchsichtig mache, .
Kann es sein, dass, weil keine Fläche der Form sichtbar ist(abgesehen von der Titelleiste im SizeToolWin Modus), das Event einfach nicht ausgelöst wird?
Lohnt es sich einen globalen Hook zu machen?
|
|
haentschman
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: Sa 20.08.11 12:17
| Zitat: | | Ich habe den Events diese beiden Prozeduren zugewiesen: |
... zeig mal diesen Teil.
|
|
yogo 
      
Beiträge: 121
Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
|
Verfasst: Sa 20.08.11 12:56
Das passiert in der dfm von Delphi:
Delphi-Quelltext 1: 2: 3:
| object PlugForm: TPlugForm OnMouseEnter = FormMouseEnter OnMouseLeave = FormMouseLeave |
ich hab die dateien in den anhang gepackt, vlt springt es euch ja sofort an, ich seh sowas nicht wirklich immer..
Einloggen, um Attachments anzusehen!
|
|
yogo 
      
Beiträge: 121
Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
|
Verfasst: So 21.08.11 11:11
OK, offensichtlich gibt es noch eine zweite WndProc, bei der Form kommen die Messages jedenfalls nicht an.
Ich probiere gerade mit Thread-spezifischen Hooks herum, ob sich das irgendwie umgehen lässt.
Die Lösung kommt natürlich hierhin
|
|
haentschman
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: So 21.08.11 13:06
| Zitat: | Nun soll meine Form aber ein anderes AlphaBlendValue haben, während die Maus drauf ist, als wenn nicht.
Bisher habe ich dafür mit OnMouseMove gearbeitet |
bitte beschreibe noch einmal Step by Step was wann wo wie passieren soll...
Wo soll das AlphaBlend passieren wenn die Maus wo drauf ist ? Ich versteh auch noch nicht, warum das ins MouseMove rein soll
Danke...
|
|
yogo 
      
Beiträge: 121
Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
|
Verfasst: Mo 22.08.11 17:27
Also: Meine Form soll, wenn kein Cursor drauf ist, nicht so sehr sichtbar sein, wie wenn einer drauf ist.
Dafür hab ich beim Testen dem OnMouseMove-Event der Form eine Prozedur zugewiesen, in der ich AlphaBlendValue geändert und einen Timer angeschmissen habe, um zu überprüfen, ob er Cursor nachher immer noch da ist.
Was ich nicht wusste:
In der Praxis befinden sich auf der Form Komponenten, die das Event kriegen, die Form ist unbeteiligt.
Die Application verarbeitet das Event in der ProcessMessage-Methode, löst, wenn möglich, FOnMessage aus, wenn es zugewiesen ist, wenn dies die Nachricht nicht verarbeitet, schickt es sie per DispatchMessage weiter.
Daraufhin landet es imStdWndProc, und von dort an die WndProc der Zielkomponente.
Meine Lösung ist, das OnMessage-Event der Application zu benutzen
Delphi-Quelltext 1:
| Application.OnMessage := MouseMoveProc; |
Delphi-Quelltext 1:
| procedure TMainForm.MouseMoveProc(var Msg: TMsg; var Handled: Boolean); |
|
|
|