Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Testen, ob Maus Form verlassen hat (https://www.delphipraxis.net/68156-testen-ob-maus-form-verlassen-hat.html)

Joe_the_Junkie 25. Apr 2006 14:38


Testen, ob Maus Form verlassen hat
 
Hallo,

Ich hab mal eben ne Frage. Wie kann ich testen, ob die Maus die Form verlassen hat?
Vielen Dank im Vorraus. :-D

Catbytes 25. Apr 2006 15:03

Re: Testen, ob Maus Form verlassen hat
 
Hallo,

in einem etwas älteren Projekt habe ich das mal so gelöst:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;
  if (Mouse.CursorPos.X > (Form1.Left + Form1.Width)) or (Mouse.CursorPos.X <
    Form1.Left) or
    (Mouse.CursorPos.Y > (Form1.Top + Form1.Height)) or (Mouse.CursorPos.Y <
      Form1.Top) then
    MessageDlg('Erwischt', mtInformation, [mbOk], 0);
  Timer1.Enabled := true;
end;
Also per TTimer. Den Interval hatte ich auf 50 stehen.

Geht aber bestimmt eleganter per Mouse-Hook.

s-off 25. Apr 2006 15:04

Re: Testen, ob Maus Form verlassen hat
 
Hallo,

probiere es einmal mit

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure WndProc(var Msg: TMessage); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WndProc(var Msg: TMessage);
begin
   inherited;
   if Msg.Msg = CM_MOUSELEAVE then begin
      //DO SOMETHING
   end;
end;

end.

MaBuSE 25. Apr 2006 15:16

Re: Testen, ob Maus Form verlassen hat
 
Zitat:

Zitat von s-off
probiere es einmal mit ...

oder mit:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
    procedure MouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure MouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.MouseEnter(var Msg: TMessage);
begin
  Color := clGreen;
end;

procedure TForm1.MouseLeave(var Msg: TMessage);
begin
  Color := clRed;
end;

end.
Anmerkung: CM_MOUSELEAVE wird nicht immer erzeugt, wenn Du sehr schnell mit der Maus aus dem Fenster gehst. :-(

s-off 25. Apr 2006 15:27

Re: Testen, ob Maus Form verlassen hat
 
Zitat:

Zitat von MaBuSE
Anmerkung: CM_MOUSELEAVE wird nicht immer erzeugt, wenn Du sehr schnell mit der Maus aus dem Fenster gehst. :-(

ok, akzeptiert ;)

HuxXx 25. Apr 2006 16:15

Re: Testen, ob Maus Form verlassen hat
 
Zitat:

Zitat von Catbytes
Hallo,

in einem etwas älteren Projekt habe ich das mal so gelöst:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;
  if (Mouse.CursorPos.X > (Form1.Left + Form1.Width)) or (Mouse.CursorPos.X <
    Form1.Left) or
    (Mouse.CursorPos.Y > (Form1.Top + Form1.Height)) or (Mouse.CursorPos.Y <
      Form1.Top) then
    MessageDlg('Erwischt', mtInformation, [mbOk], 0);
  Timer1.Enabled := true;
end;
Also per TTimer. Den Interval hatte ich auf 50 stehen.

Geht aber bestimmt eleganter per Mouse-Hook.

Das wird nicht funken, wenn man die Maus schnell aus der Form bewegt...

DGL-luke 25. Apr 2006 17:45

Re: Testen, ob Maus Form verlassen hat
 
Delphi-Quellcode:
function MouseIn(rect: TRect): Boolean; overload;
function MouseIn(Ctrl: TControl): Boolean;

function MouseIn(rect: TRect): Boolean;
begin
  Result := (Mouse.CursorPos.X >= rect.left) and (Mouse.CursorPos.X <= rect.right ) and
            (Mouse.CursorPos.Y >= rect.top) and (Mouse.CursorPos.Y <= rect.bottom );
end;

function MouseIn(Ctrl: TControl): Boolean;
begin
Result := MouseIn(rect(Ctrl.ClientToScreen(0),Ctrl.ClientToScreen(0),Ctrl.ClientToScreen(Ctrl.Width),Ctrl.ClientToScreen(Ctrl.Height)));
end;
Sollte das nicht reichen? (ungetestet)

Catbytes 26. Apr 2006 07:17

Re: Testen, ob Maus Form verlassen hat
 
Zitat:

Zitat von HuxXx
Zitat:

Zitat von Catbytes
Hallo,

in einem etwas älteren Projekt habe ich das mal so gelöst:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;
  if (Mouse.CursorPos.X > (Form1.Left + Form1.Width)) or (Mouse.CursorPos.X <
    Form1.Left) or
    (Mouse.CursorPos.Y > (Form1.Top + Form1.Height)) or (Mouse.CursorPos.Y <
      Form1.Top) then
    MessageDlg('Erwischt', mtInformation, [mbOk], 0);
  Timer1.Enabled := true;
end;
Also per TTimer. Den Interval hatte ich auf 50 stehen.

Geht aber bestimmt eleganter per Mouse-Hook.

Das wird nicht funken, wenn man die Maus schnell aus der Form bewegt...

Warum?

Sharky 26. Apr 2006 07:24

Re: Testen, ob Maus Form verlassen hat
 
Zitat:

Zitat von Catbytes
... Warum?

Hai Catbytes,

wenn die Maus genau dann über die Form "rennt" während das Timerergniss nicht arbeitet bzw. in dem moment wo die IF-Abfrage läuft würde nicht erkannt werden das die Maus über der Form gewesen ist.

Catbytes 26. Apr 2006 07:31

Re: Testen, ob Maus Form verlassen hat
 
Zitat:

Zitat von Sharky
Zitat:

Zitat von Catbytes
... Warum?

Hai Catbytes,

wenn die Maus genau dann über die Form "rennt" während das Timerergniss nicht arbeitet bzw. in dem moment wo die IF-Abfrage läuft würde nicht erkannt werden das die Maus über der Form gewesen ist.

Bei 50ms? Den User bzw. die Maus möchte ich sehen, der das schafft :mrgreen:

Immerhin: Zumindest wird bei mir (falls es wirklich einer schaffen sollte) nach spätestens 50ms das Überschreiten der Grenzen erkannt. Wenn das mit "zu schnell" bei CM_MOUSELEAVE passiert, wird IMHO gar nix ausgelöst...

Gibt es für dieses Problem wirklich keine saubere und 100% Lösung? :gruebel:

Hawkeye219 26. Apr 2006 07:55

Re: Testen, ob Maus Form verlassen hat
 
Hallo,

das Abfangen von CM_MouseEnter und CM_MouseLeave ist doch eine gute Basis. Vielleicht könnte man es so machen:

Delphi-Quellcode:
type
  TForm1 = class (TForm)
  private
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  end;

procedure TForm1.CMMouseEnter(var Message: TMessage);
begin
  if PtInRect(BoundsRect, Mouse.CursorPos) then
    Color := clBtnFace;
end;

procedure TForm1.CMMouseLeave(var Message: TMessage);
begin
  if not PtInRect(BoundsRect, Mouse.CursorPos) then
    Color := clLime;
end;
Gruß Hawkeye

Joe_the_Junkie 26. Apr 2006 10:55

Re: Testen, ob Maus Form verlassen hat
 
Danke für eure ganzen vielen Antworten. Ich werde diese noch testen und gucken, was am besten ist.
Tut mir leid, wenn ich mich jetzt erst bedanke, aber ich hatte nicht ganz so viel Zeit. :pale:

Ich melde mich dann, wenn ich die ganzen Vorschläge beantwortet hate.

Mfg Joe the Junkie


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 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-2025 by Thomas Breitkreuz