![]() |
onMouseMove abfragen?
Hallo Alle!
Wie kann ich abfragen ob ich z.b. über ein Panel mit der Maus bin, ohne zu klicken? Gruß Heike |
Re: onMouseMove abfragen?
Du hast Dir doch schon mit deinem Titel die Anwort selbst gegeben.
|
Re: onMouseMove abfragen?
Zitat:
Delphi-Quellcode:
Gruß
if onMouseMove = True Then ....
Heike |
Re: onMouseMove abfragen?
Hallo,
da brauchst du HitTesting:
Delphi-Quellcode:
Sorry für das Monster... jetzt kommen bestimmt gleich 5 leute die dir sagen, wies viel schöner, kürzer und eleganter geht :)
if PtInRect
(rect(Panel1.ClientToScreen(point(0,0)), Panel1.ClientToScreen(point(Panel1.Width-1,Panel1.Height-1))), Mouse.CursorPos) then begin end; |
Re: onMouseMove abfragen?
du hast doch bei dem Panel das OnMouseMove?! Ich versteh nicht warum du da nicht erkennen kannst das die Mouse bewegt wird, schließlich wird das Ereignis ausgelöst sobald sich die Maus über dem Panel bewegt.
|
Re: onMouseMove abfragen?
Zitat:
davon noch eine andere Version:
Delphi-Quellcode:
if form1.ControlAtPos(form1.ScreenToClient(mouse.CursorPos), true, true)= Panel1 then
... |
Re: onMouseMove abfragen?
form1 ist eine spezielle Instanz. lieber die aktuelle Instanz mit Self ansprechen:
Delphi-Quellcode:
oder halt ganz drauf verzichten:
if self.ControlAtPos(self.ScreenToClient(mouse.CursorPos), true, true) = Panel1 then
...
Delphi-Quellcode:
if ControlAtPos(ScreenToClient(mouse.CursorPos), true, true) = Panel1 then
... |
Re: onMouseMove abfragen?
Oder so
Delphi-Quellcode:
if FindDragTarget(Mouse.CursorPos, True)= Panel1 then...
|
Re: onMouseMove abfragen?
Vielen Dank für die Antworten!
Ich möchte, wenn ich über ein Panel mit der Maus gehe, was auslösen. Aber nur wenn ich über das Panel gehe. Das Panel ist so groß wie meine Form. Ich habe es versucht. Das auslösen klappt gut, aber das Gegenteil nicht. Versucht habe ich es u.A. so:
Delphi-Quellcode:
Hier wird das Panel zwar grün gefärbt, aber wenn ich von dem Panel wegziehe wird es nicht schwarz. Was mache ich da falsch?
if FindDragTarget(Mouse.CursorPos, True)= Panel1 then Panel1.Color := cl Green else Panel1.Color := clBlack;
Gruß Heike |
Re: onMouseMove abfragen?
Wann bzw. wo frägst du denn ab!?
|
Re: onMouseMove abfragen?
Zitat:
in onMouseMove. Gruß Heike |
Re: onMouseMove abfragen?
Im MouseMove des Panels kann er ja nur True werden weil ja nur ausgelöst wird, wenn Maus drüber ist :zwinker:. Du müsstest also auch neben deinem Panel abfragen.
:gruebel: Timer, onIdle, onMouseMove der restlichen Anwendung, ... EDIT: auch Morgeeen :hi: |
Re: onMouseMove abfragen?
Eine sauberere Lösung dürfte aber sein, wenn man die Nachrichten MouseLeave/MouseEnter abfängt. Dürfte es einiges zu im Forum geben.
|
Re: onMouseMove abfragen?
Zitat:
Gruß Heike |
Re: onMouseMove abfragen?
Zitat:
Mfg Ich EDIT: @Gausi: Ja Leave & Enter währen schon gut nur hat das D7-Panel sowas leider nicht :( |
Re: onMouseMove abfragen?
Dass das D7-Panel das nicht hat, ist schon klar, aber von Panel ne Komponente abzuleiten, die das hat, ist nicht wirklich schwierig. Hab ich vor kurzem mit TImage gemacht, und ich habe von Komponentenentwicklung keinen Plan ;-) - Wenn ich wieder zu hause bin, kann ich den Code mal rauskramen, falls Bedarf besteht.
|
Re: onMouseMove abfragen?
Zitat:
Gruß Heike |
Re: onMouseMove abfragen?
Hi,
Subclassing wäre noch eine andere Möglichkeit.
Delphi-Quellcode:
private
OldWindowProc: TWndMethod; procedure PanSubClassWndProc(var Message: TMessage); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.PanSubClassWndProc(var Message: TMessage); begin case Message.Msg of CM_MOUSELEAVE: Panel1.Color := clBlack; CM_MOUSEENTER: Panel1.Color := clGreen; end; OldWindowProc(Message); end; procedure TForm1.FormCreate(Sender: TObject); begin OldWindowProc:= Panel1.WindowProc; Panel1.WindowProc:= PanSubClassWndProc; end; procedure TForm1.FormDestroy(Sender: TObject); begin Panel1.WindowProc:= OldWindowProc; end; |
Re: onMouseMove abfragen?
Ich meinte hlat sowas in der Art:
Delphi-Quellcode:
unit Mousepanel;
interface uses Messages, SysUtils, Classes, Controls, ExtCtrls; type tMousepanel = class(TPanel) private { Private-Deklarationen } FOnMouseEnter: TNotifyEvent; FOnMouseLeave: TNotifyEvent; procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; protected { Protected-Deklarationen } public { Public-Deklarationen } published { Published-Deklarationen } property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter; property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave; end; procedure Register; implementation procedure Register; begin RegisterComponents('Beispiele', [tMousepanel]); end; procedure tMousepanel.CMMouseEnter(var Message: TMessage); begin if assigned(FOnMouseEnter) then FOnMouseEnter(Self); end; procedure tMousepanel.CMMouseLeave(var Message: TMessage); begin if assigned(FOnMouseLeave) then FOnMouseLeave(Self); end; end. |
Re: onMouseMove abfragen?
Vielen Dank, an Euch Beiden. Habe jetzt einiges lernen können. Ich habe beides getestet. Klappt sehr gut. Hier in meinem Fall habe ich es mit Subclassing gemacht. Das kannt ich noch garnicht. Toll was damit alles anfangen kann. Die Sache mit dem Panel ableiten ist auch nit schlecht und vorallen sehr gut zu gebrauchen wenn man es in mehreren Anwendungen einbauen möchte.
Nochmals, vielen Dank Gruß Heike |
Re: onMouseMove abfragen?
Hi,
ich habe Delphi7. ich habe das hier im Forum gefunden und wurde es Probieren
Delphi-Quellcode:
ich freue mich auf Ihr Antwort.
if FindDragTarget(Mouse.CursorPos, True)= Panel1 then Panel1.Color := cl Green else Panel1.Color := clBlack;
Grüß Poter |
Re: onMouseMove abfragen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
der Code ist aus diesem Thread und es wurde festgestellt, dass mann dafür einen Timer bei Delphi 7 braucht, was nicht gerade elegant ist. Weitere Möglichkeiten wurden doch weiter oben aufgezeigt, also eine Komponente wie die aus Beitrag #19 oder mit Hilfe von Subclassing siehe Anhang. Bei neueren Delphiversionen ist onMouseEnter und onMouseLeave für das TPanel schon vorhanden, da kann man sich den Code sparen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz