Delphi-PRAXiS
Seite 1 von 2  1 2      

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:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:03 Uhr.
Seite 1 von 2  1 2      

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