Autor |
Beitrag |
Adory
      
Beiträge: 16
Win XP
Delphi 7
|
Verfasst: So 16.01.11 16:56
Hallo Leute,
ich habe für einige Panels ein OnMouseEnter-Ereignis definiert; möchte jedoch, dass nur dann etwas ausgeführt wird, wenn dabei die Linke-Maustaste gedrückt gehalten wird. Hatte es schon so versucht:
Delphi-Quelltext 1: 2: 3: 4:
| procedure mouseenter(Sender: TObject); begin if (GetAsyncKeyState(VK_LBUTTON)) = 1 then begin |
aber irgendwie klappt es nicht :/ Hat jemand eine Idee?
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 16.01.11 17:55
Hi, warum verwendest Du nicht das original onMouseDown-Ereignis der Panels? Dann brauchst Du auch nicht den Umwegmachen. Und ein onMouseEnter  in das onEnter ereignis zu setzen, erwartet glaube ich auch ein Tastaturereignis!?
Gruss Alf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 16.01.11 18:14
Wenn die Maustaste in einem anderen Programm gedrückt wurde und dann gedrückt über dein Fenster gezogen wird, bin ich mir nicht sicher, ob überhaupt ein OnMouseEnter Ereignis ausgelöst wird.
Denn dann hat das andere Programm noch die Maus im Capture. Ich denke also, dass das Ereignis erst nach dem Loslassen der Maustaste überhaupt ausgelöst wird.
@ ALF: OnMouseDown wird ja nur ausgelöst, wenn das Ereignis über dem eigenen Programm bzw. dem entsprechenden Control passierte.
|
|
Adory 
      
Beiträge: 16
Win XP
Delphi 7
|
Verfasst: So 16.01.11 18:19
Danke erstmal
Die Panels werden zur Laufzeit erzeugt, dass hätte ich vllt. dazuschreiben sollen. OnMouseDown verwende ich aus dem Grund nicht, dass ich nicht jedesmal erst klicken möchte wenn ich mit der Maus über ein neues Panel fahre.. Das Ereignis soll ausgelöst werden sobald ich mit der Maus drüberfahre (aber eben unter der Bedingung, dass dabei auch die Linke Maustaste gehalten wird.). Es funktioniert auch soweit alles bestens, es hapert nur an der Unterscheidung zwischen Maustaste gedrückt und nicht :<
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure mouseenter(Sender: TObject); begin if (GetAsyncKeyState(VK_LBUTTON)) = 1 then begin
procedure Tform1.FormCreate(Sender: TObject); begin for y:=1 to 20 do begin for x:=1 to 20 do begin TPanel.Create(Self).Name := NamePrefix + IntToStr(x)+'_'+IntToStr(y); with TPanel(FindComponent(NamePrefix + IntToStr(x)+'_'+IntToStr(y))) do begin width :=10; height :=10; Left :=(x*10)+7; Top :=(y*10)+12; Color :=$00E6E6E6; Parent :=self; bevelouter :=bvnone; onmouseenter:=mouseenter; end; |
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 16.01.11 18:28
ansonsten kan man ja auch onMouseMove verwenden!
Gruss als
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
Adory 
      
Beiträge: 16
Win XP
Delphi 7
|
Verfasst: So 16.01.11 18:35
Wie gesagt, es funktioniert ja auch soweit. Das Ereignis wird entsprechend ausgelöst. OnMouseMove könnte ich auch verwenden, das käme vermutlich auf dasselbe heraus.
Es geht mir nur darum wie ich unterscheiden kann ob die linke Maustaste momentan gedrückt ist oder nicht.
|
|
ALF
      
Beiträge: 1085
Erhaltene Danke: 53
WinXP, Win7, Win10
Delphi 7 Enterprise, XE
|
Verfasst: So 16.01.11 18:40
Einfache Lösung, Du setzt, wenn irgendwo Deine Mousetaste gedrückt wurde(im eigenen Fenster), ne Variable auf thrue, und fragst sie in deiner Routine ab!?
Gruss ALf
_________________ Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 16.01.11 18:44
Adory hat folgendes geschrieben : | Es geht mir nur darum wie ich unterscheiden kann ob die linke Maustaste momentan gedrückt ist oder nicht. |
Das weißt du innerhalb deines Programmes ja, wenn du OnMouseDown und OnMouseUp entsprechend behandelst und den Zustand speicherst. Innerhalb des Programms hat ALF da schon Recht.
Ich habe es aber gerade ausprobiert. Ich hatte Recht. Wenn ich auf z.B. dem Formular die Maus drücke, wird OnMouseEnter der Panels erst ausgelöst, wenn ich die Maus wieder losgelassen habe...
Das gleiche gilt für OnMouseMove der Panels. Eben weil das Control, auf dem die Maus gedrückt wurde, noch den Capture hat und deshalb die Mausereignisse bekommt.
Deshalb wirst du so wie du es im Moment versuchst nicht weiterkommen...
// EDIT:
Sieht nach einem typischen Fall aus, in dem mehrere visuelle Komponenten zur Darstellung benutzt werden, obwohl das an der Stelle wenig sinnvoll ist. Willst du vielleicht etwas in der Art machen?
www.delphi-forum.de/viewtopic.php?p=557541
(Also mehrere Textpanels sozusagen?)
Da eignet sich das Vorgehen mit einer TPaintBox z.B. viel besser.
|
|
Adory 
      
Beiträge: 16
Win XP
Delphi 7
|
Verfasst: So 16.01.11 19:06
Zitat: | Sieht nach einem typischen Fall aus, in dem mehrere visuelle Komponenten zur Darstellung benutzt werden, obwohl das an der Stelle wenig sinnvoll ist. |
Da könntest du Recht haben. Danke 
|
|