PDA

Ver la Versión Completa : Saber si el cursor esta fuera del form


LuisAlf::
21-04-2010, 18:15:57
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í:


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:


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/adptips2000/a/bltip0800_5.htm

LuisAlf::
21-04-2010, 18:41:35
Código Delphi [-] (http://www.clubdelphi.com/foros/#)
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:
...
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:
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:
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 :
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

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
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
Se que no es gran ayuda este codigo pero espero y te funcione :

Código Delphi [-] (http://www.clubdelphi.com/foros/#)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....