Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi onMouseMove abfragen? (https://www.delphipraxis.net/92908-onmousemove-abfragen.html)

smart 28. Mai 2007 18:47


onMouseMove abfragen?
 
Hallo Alle!

Wie kann ich abfragen ob ich z.b. über ein Panel mit der Maus bin, ohne zu klicken?

Gruß
Heike

Blackheart 28. Mai 2007 18:53

Re: onMouseMove abfragen?
 
Du hast Dir doch schon mit deinem Titel die Anwort selbst gegeben.

smart 28. Mai 2007 19:01

Re: onMouseMove abfragen?
 
Zitat:

Zitat von Blackheart
Du hast Dir doch schon mit deinem Titel die Anwort selbst gegeben.

Nicht ganz. Ich brauche soetwas wie

Delphi-Quellcode:
if onMouseMove = True Then ....
Gruß
Heike

DGL-luke 28. Mai 2007 19:34

Re: onMouseMove abfragen?
 
Hallo,

da brauchst du HitTesting:

Delphi-Quellcode:
if PtInRect
  (rect(Panel1.ClientToScreen(point(0,0)),
        Panel1.ClientToScreen(point(Panel1.Width-1,Panel1.Height-1))),
   Mouse.CursorPos) then
   begin

   end;
Sorry für das Monster... jetzt kommen bestimmt gleich 5 leute die dir sagen, wies viel schöner, kürzer und eleganter geht :)

SirThornberry 28. Mai 2007 20:22

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.

bitsetter 28. Mai 2007 20:38

Re: onMouseMove abfragen?
 
Zitat:

Zitat von DGL-luke
Sorry für das Monster... jetzt kommen bestimmt gleich 5 leute die dir sagen, wies viel schöner, kürzer und eleganter geht :)

Hi,

davon noch eine andere Version:
Delphi-Quellcode:
 if form1.ControlAtPos(form1.ScreenToClient(mouse.CursorPos), true, true)= Panel1  then
...

cruiser 28. Mai 2007 20:43

Re: onMouseMove abfragen?
 
form1 ist eine spezielle Instanz. lieber die aktuelle Instanz mit Self ansprechen:
Delphi-Quellcode:
if self.ControlAtPos(self.ScreenToClient(mouse.CursorPos), true, true) = Panel1  then
...
oder halt ganz drauf verzichten:
Delphi-Quellcode:
if ControlAtPos(ScreenToClient(mouse.CursorPos), true, true) = Panel1  then
...

Blackheart 28. Mai 2007 20:46

Re: onMouseMove abfragen?
 
Oder so
Delphi-Quellcode:
if FindDragTarget(Mouse.CursorPos, True)= Panel1 then...

smart 29. Mai 2007 09:26

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:
if FindDragTarget(Mouse.CursorPos, True)= Panel1 then Panel1.Color := cl Green else Panel1.Color := clBlack;
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?

Gruß
Heike

TeronG 29. Mai 2007 09:30

Re: onMouseMove abfragen?
 
Wann bzw. wo frägst du denn ab!?

smart 29. Mai 2007 09:31

Re: onMouseMove abfragen?
 
Zitat:

Zitat von TeronG
Wann bzw. wo frägst du denn ab!?

Morgen!

in onMouseMove.

Gruß
Heike

TeronG 29. Mai 2007 09:33

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:

Gausi 29. Mai 2007 09:37

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.

smart 29. Mai 2007 09:47

Re: onMouseMove abfragen?
 
Zitat:

Zitat von TeronG
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:

Hast Recht, dass war mein Denkfehler. Wenn ich z. B. in einem Timer abfrage klappt es.

Gruß
Heike

TeronG 29. Mai 2007 10:14

Re: onMouseMove abfragen?
 
Zitat:

Zitat von smart
Hast Recht, dass war mein Denkfehler. Wenn ich z. B. in einem Timer abfrage klappt es.

Gruß
Heike

Hab's bei mir auch auf die schnelle mit nem Timer getestet :mrgreen:

Mfg
Ich


EDIT: @Gausi: Ja Leave & Enter währen schon gut nur hat das D7-Panel sowas leider nicht :(

Gausi 29. Mai 2007 10:39

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.

smart 29. Mai 2007 10:52

Re: onMouseMove abfragen?
 
Zitat:

Zitat von Gausi
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.

Ja, gern. Ich lerne immer gern was dazu.

Gruß
Heike

bitsetter 29. Mai 2007 11:46

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;

Gausi 29. Mai 2007 15:22

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.

smart 29. Mai 2007 17:56

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

poterp 9. Jul 2007 13:11

Re: onMouseMove abfragen?
 
Hi,
ich habe Delphi7.

ich habe das hier im Forum gefunden und wurde es Probieren
Delphi-Quellcode:
if FindDragTarget(Mouse.CursorPos, True)= Panel1 then Panel1.Color := cl Green else Panel1.Color := clBlack;
ich freue mich auf Ihr Antwort.
Grüß
Poter

bitsetter 9. Jul 2007 20:04

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 16:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz