Autor Beitrag
yogo
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 121

Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
BeitragVerfasst: Fr 19.08.11 20:27 
Hallo :wave:

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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Sa 20.08.2011 um 12:06
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 20.08.11 10:46 
OnMouseEnter + OnMouseLeave...

user profile iconyogo hat folgendes geschrieben Zum zitierten Posting springen:
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? :shock:
Das ist absolut keine gute Idee. Es gibt für die meisten Events auch Methoden, die du einfach direkt überschreiben kannst...
yogo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 121

Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
BeitragVerfasst: Sa 20.08.11 12:05 
Ich habe den Events diese beiden Prozeduren zugewiesen:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Sa 20.08.11 12:17 
Zitat:
Ich habe den Events diese beiden Prozeduren zugewiesen:

... zeig mal diesen Teil.
yogo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 121

Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
BeitragVerfasst: Sa 20.08.11 12:56 
Das passiert in der dfm von Delphi:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 121

Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: 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 :gruebel:

Danke...
yogo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 121

Windowse, Linuxe
Delphi 3 Prof., D5 Enterprise, D6 Enterprise, Kylix, Delphi 2010
BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
Application.OnMessage := MouseMoveProc;					

ausblenden Delphi-Quelltext
1:
procedure TMainForm.MouseMoveProc(var Msg: TMsg; var Handled: Boolean);