Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Saber si el cursor esta fuera del form (https://www.clubdelphi.com/foros/showthread.php?t=67528)

LuisAlf:: 21-04-2010 18:15:57

Saber si el cursor esta fuera del form
 
Hola a todos por aqui....

Hace mucho que queria saber como hacer esto.....y aun no he encontrado una solucion....

Si alguien sabe como obtener esto pues se los agradeceria, ya que si lo he requerido algunas veces y pues lo he resuelto de formas que no me quedan bien...

Sin otra cosa que decir....

Gracias por su atención...

roman 21-04-2010 18:24:52

Podría ser algo así:

Código Delphi [-]
if PtInRect(Self.BoundsRect, Mouse.CursorPos) then
  Edit1.Text := 'Dentro'
else
  Edit1.Text := 'Fuera';

// Saludos

ioco 21-04-2010 18:28:10

Quizá te sirva este código un poco modificado a lo que necesites hacer en tu programa:

Código Delphi [-]
procedure TForm1.FormDeactivate(Sender: TObject) ;
begin
   ReleaseCapture;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  If GetCapture = 0 then
    SetCapture(Form1.Handle) ;
  If PtInRect(Rect(Form1.Left,Form1.Top,Form1.Left + Form1.Width,Form1.Top + Form1.Height),
    ClientToScreen(Point(x, y))) then
    Begin
      { Cosas a hacer si el puntero del mouse está dentro del formulario } 
    end
  else
     Begin
       { Cosas a hacer si el puntero del mouse está fuera del formulario }
     end;
end;

Fuente: http://delphi.about.com/cs/adptips20...ltip0800_5.htm

LuisAlf:: 21-04-2010 18:41:35

Cita:

Empezado por roman (Mensaje 361409)

Código Delphi [-]
if PtInRect(Self.BoundsRect, Mouse.CursorPos) then...


bueno...primeramente gracias por sus respuestas...pero Roman...podrias decirme que hace la funcion PtInRect para devolver true?, y la propiedad boundsRect que indica de la forma(si es que es propiedad)?....

roman 21-04-2010 18:47:21

PtInRect indica si un punto está dentro de un rectángulo. En este caso, el punto es la posición del curosr del ratón y el rectángulo es el área que abarca el formulario, que es BoundsRect.

// Saludos

LuisAlf:: 21-04-2010 18:52:11

Ahora si...

OK

Gracias...

PD. Y aparte de un hilo o timer en donde se puede poner este if-else??

rgstuamigo 21-04-2010 23:57:48

Bueno...otra forma de hacerlo es capturar los mensajes CM_MOUSEENTER y CM_MOUSELEAVE del formulario y utilizar el Procedimiento asociado del formulario(WindowProc).
Mas o menos asi:
Código Delphi [-]
...
type
  TForm1 = class(TForm)
  ...
  ...
 private
    { Private declarations }
    AuxWndProc: TWndMethod;//Es un auxiliar para ejecutar los demas mensajes
  procedure MyWndProc(var Message: TMessage);{Procedimiento que captura 
todos los mensajes de la Ventana o formulario}
 ...
 ...
end;
La imprementación sería:
Código Delphi [-]
procedure TForm1.MyWndProc(var Message: TMessage);
begin
   case Message.Msg of
    CM_MOUSEENTER:ShowMessage('Entro el raton en el formulario');
    CM_MOUSELEAVE:ShowMessage('Salió el raton del formulario') ;
   else AuxWndProc(Message);//Hago que se ejecute los demas mensajes
  end;
end;
Por supuesto que tenemos que poner lo siguiente en el evento OnCreate del formulario:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
AuxWndProc:=Form1.WindowProc;
Form1.WindowProc:=MyWndProc;
end;
Claro está que se puede capturar directamente los mensaje CM_MOUSEENTER y CM_MOUSELEAVE sin utilizar el procedimiento asociado a la ventana o formulario, pero lo malo que le veo al hacerlo así es que no solamante se captura los mensajes que van al formualrio sino tambien los mensajes que van tambien a los controles que se encuentran en el formulario.;).
Saludos...:)

adeszeus 22-04-2010 01:46:41

Se que no es gran ayuda este codigo pero espero y te funcione :
Código Delphi [-]
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if (X<>0) and (y<>0) then
Edit1.Text := 'Dentro'
else
Edit1.Text := 'Fuera';
end;

adeszeus 22-04-2010 01:58:30

me acabo de dar cuenta que me falta cuando sale hacia la derecha e izquierda asi que solo implemente este codigo

Código Delphi [-]
if (x>(form1.Width-18)) or (y>(form1.Height-42)) then
//Edit1.Text := 'Fuera'
else if (X<>0) and (y<>0) then
Edit1.Text := 'Dentro'
else
Edit1.Text := 'Fuera';

donde los valores de 18 y 42 corresponden a los bordes y a la cabecera del formulario

LuisAlf:: 22-04-2010 18:40:02

Cita:

Empezado por rgstuamigo (Mensaje 361472)
Bueno...otra forma de hacerlo es capturar los mensajes CM_MOUSEENTER y CM_MOUSELEAVE del formulario y utilizar el Procedimiento asociado del formulario(WindowProc).
...

Gracias por tu solucion.....
Pero este metodo como que tarda un poco en cambiar de estado al capturar los mensajes...

LuisAlf:: 22-04-2010 18:42:49

Cita:

Empezado por adeszeus (Mensaje 361487)
Se que no es gran ayuda este codigo pero espero y te funcione :

Código Delphi [-]procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if (X<>0) and (y<>0) then
Edit1.Text := 'Dentro'
else
Edit1.Text := 'Fuera';
end;


HOLA.. algo parecido hacia yo asi para obtener este resultado....pero cuando pasas muy rapido el cursor hacia afuera no cambia de estado...por eso yo quise saber como obtener una solucion más optima....

GRACIAS A TODOS POR SU TIEMPO Y CONOCIMIENTOS....


La franja horaria es GMT +2. Ahora son las 18:45:55.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi