Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Detectar cuando entra y sale el mouse (https://www.clubdelphi.com/foros/showthread.php?t=13187)

soul6301 10-08-2004 00:48:47

Detectar cuando entra y sale el mouse
 
Hola:

¿Cómo puedo hacer para que el componente detecte la entrada y salida del mouse? Así como ocurre con los botones de la barra de herramientas cuando está en "flat": cuando ingresa el cursor se crea un marco en el botón, cuando sale, desaparece el marco.

Gracias.

roman 10-08-2004 01:32:30

¿De cuál componente estamos hablando? En algunas componentes se tiene los eventos OnMouseEnter y OnMouseLeave.

De no ser una de éstas puedes implementar tú mismo manejadores para los mensajes CM_MOUSEENTER y CM_MOUSELEAVE aunque para ello tendrás que derivar una nueva componente a partir de la que te interese.

// Saludos

soul6301 14-08-2004 01:10:21

Vaya! ¿Estoy interesado, pero cómo hago esos manejadores? Es la primera vez que escucho esa palabra.

Gracias.

roman 14-08-2004 01:56:50

En Windows la comunicación con las ventanas se hace por medio de mensajes. Toda ventana tiene asociado un procedimiento de ventana que es llamado por el sistema cada vez que se envía un mensaje a la ventana y que debe implementar el código de aquellos mensajes que le interesen. Básicamente es un case grandote:

Código Delphi [-]
function WndProc(Message, WParam, LParam: Cardinal): boolean;
begin
  case Message of
    WM_CREATE: ;
    WM_CLOSE: ;
    WM_ACTIVATE: ;
    WM_DESTROY: ;
    
    etc.
  end;
end;

donde el etcétera puede abarcar una gran cantidad de mensajes.

La VCL de Delphi implementa las cosas de forma tal que este manejo de mensajes se traduce en llamadas a eventos y métodos. Por ejemplo, el mensaje WM_CREATE se traduce, luego de muchas cosas, en una llamada al evento OnCreate de un formulario. Los mensajes WM_LBUTTONDOWN, WM_RBUTTONUP, etc. se traducen en llamadas al método MouseDown.

Normalmente toda la traducción es transparente para el programador pero si se requiere pueden interceptarse determinados mensajes para tratarlos de forma distinta. Para ello se crea un manejador del mensaje:

Código Delphi [-]
procedure WMLButtonDown(var Msg: TWMLButtonDown); message WM_LBUTTONDOWN;
begin
  inherited;
  
  { tu código }
end;

donde la llamada a inherited permite que el código normalmente asociado al mensaje se ejecute.

Además de los mensajes que define el sistema, Delphi puede generar otros mensajes para determinadas tareas. Ejemplos de estos son CM_MOUSEENTER y CM_MOUSELEAVE (nota el prefijo CM en lugar de WM para distinguir los mensajes "custom"). El sistema no maneja la entrada y salida del cursor del ratón sobre los controles de manera que Delphi lleva un registro de por donde va pasando para poder generar estos mensajes.

Entonces, en tu caso específico debes crear estos manejadores para el control que estés diseñando, por ejemplo, un derivado de TEdit:

Código Delphi [-]
type
  TMyEdit = class(TEdit)
  private
    procedure CMMouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
  end;

Nota el uso de la palabra semi reservada message. El parámetro Msg es un registro que engloba el identificador del mensaje en sí (la constante CM_MOUSEENTER), los parámetros WParam y LParam que usa Windows y el resultado que normalmente devolvería WndProc. Para muchos mensajes Delphi define versiones epeciales de este registro para renombrar los parámetros según el mensaje de que se trate (como en TWMLButtonDown). No es el caso (me parece) para CM_MOUSEENTER y CM_MOUSELEAVE ya que, de hecho, estos mensajes no reciben parámetros.

// Saludos


La franja horaria es GMT +2. Ahora son las 03:15:05.

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