Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-05-2008
vejerf vejerf is offline
Miembro
 
Registrado: ene 2007
Posts: 206
Poder: 18
vejerf Va por buen camino
Evento OnMouseLeave

Hola amigos,
Tengo el siguiente problema: Tengo en un form principal un componente GroupBox con diversos componentes (etiquetas, RadioButtons, ComboBox...). Necesito que cuando el cursor deje el espacio ocupado por este componente se active un evento para realizar unas acciones. Para ello uso el evento OnMouseLeave. El problema lo tengo cuando paso el cursor por encima de los componentes contenidos en el GroupBox también me activan este evento y esto no es lo que quiero. Alguna idea de como podría solucionar esto???
Muchas gracias.
Responder Con Cita
  #2  
Antiguo 21-05-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Tal vez tendrías que plantearte usar otro evento, o bien montar de otro modo el asunto. No es que se ejecute el evento "OnMouseLeave" en los componentes dentro del "GroupBox", sino que, cuando se sitúa el cursor encima de uno de ellos, se ha "salido" del "GroupBox", y por eso se dispara el evento de marras... vamos que en realidad es lo que se espera. Igual podría solucionarse averiguando qué componente está sobre qué control, comprobando que el "padre" de este no sea el propio "GroupBox", en fin... pero igual encuentras otra forma menos complicada y acaso problemática.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 21-05-2008
vejerf vejerf is offline
Miembro
 
Registrado: ene 2007
Posts: 206
Poder: 18
vejerf Va por buen camino
Hola dec,
Lo primero es darte gracias por tu respuesta. Lo segundo comentarte que soy el del panel con chinchetas del otro día jeje (no sé si lo recordarás que preguntaba por un panel que se pudiese ocultar o dejar fijo). Pues bien estoy usando el componente Jedi JvRollOut y lo que estoy intentando es darle funcionalidad al rollo ese (y nunca mejor dicho). Sobre este componente tengo mi GroupBox con sus componentes y estoy intentando expandir y comprimir el JvRollOut a mi antojo.
Bueno pues sigo haber que intento ahora...
Gracias...
Responder Con Cita
  #4  
Antiguo 21-05-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Pues es que ahora mismo no tengo instalada la Jedi VCL y no te puedo decir... se me ocurre que tal vez podrías usar el propio componente "JvRollOut" para albergar los componentes que ahora tienes en el "GroupBox", y lo mismo así puedes conseguir algo parecido a lo que quieres, puesto que vemos que con el "GroupBox" mismo no es posible. Yo he estado intentando algo intentando averiguar el padre del control "debajo del cursor", pero, chico, no he conseguido nada... no sé. A lo mejor otro compañero sabría decir algo más...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 21-05-2008
vejerf vejerf is offline
Miembro
 
Registrado: ene 2007
Posts: 206
Poder: 18
vejerf Va por buen camino
Primero lo intenté con los eventos del propio componente JvRollOut, pero este tiene muy pocos eventos para usar. Sólo tiene los eventos: OnExpand, OnCollapse, OnEnter y OnExit. Estos dos últimos eventos por más que miro la ayuda no logro entender cuando se activan, pero creo que tampoco es lo que necesito.
Bye...
Responder Con Cita
  #6  
Antiguo 21-05-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Pues como todas las cosas de la JVCL, tiene sus detalles.
- Pones el componente en tu forma (para que tenga los "valores de serie" en sus propiedades)
- pones TabStop a True
- Ejecutas

Si usas la tecla tabulador, verás que efectivamente el evento OnEnter y OnExit funcionan cuando se espera.

Cambias TabStop a False y ejecutas:
- Cambias la propiedad RolloverAnyWhere a false (por comodidad, no es que sea necesario).
- Tienes que dar un clic con el ratón, dentro el jvRollOut para que se produzca el OnEnter.
- Tienes que hacer clic con el ratón en el form o en otro control de la ventana para que se produzca el evento OnExit.

Bueno, así es como funciona el "rollo" este .

No habré entendido algo porque para esto:
Cita:
Empezado por vejerf
y estoy intentando expandir y comprimir el JvRollOut a mi antojo
... tiene una propiedad Expanded a true o false ¿no?. Supongo que se trata de otra cosa y me he confundido.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 21-05-2008
vejerf vejerf is offline
Miembro
 
Registrado: ene 2007
Posts: 206
Poder: 18
vejerf Va por buen camino
Gracias por tu estupenda explicación Lepe. Ahora lo pondré en práctica y veré si le puedo sacar algo de jugo a esos eventos. Por otra parte cuando digo "a mi antojo" me refería a cuando se den las condiciones que yo quiero para ello. Estas condiciones tienen que ver con donde estás situado, si estás sobre el RollOver o fuera de él básicamente y dar estas condiciones para expandir y contraer es lo q no consigo obtener con los eventos que estoy manejando... aunque ya voy consiguiendo más o menos el efecto deseado. El efecto que pretendía obtener es el que se produce con el Borland Developer Studio (al menos la versión 2006 que es la que tengo) con los paneles de ObjectInspector, ToolPalette & cia. Es decir, si lo tengo "anclado" pues no pasa nada. Pero si le quito el anclaje el panel se contrae y la pantalla de diseño se ensancha. Si paso el cursor por el panel contraido vuelve a aparecer, pero se superpone por encima de la pantalla y cuando salgo del panel vuelve a desaparecer. Si lo vuelvo a anclar la pantalla de diseño se contrae.
Más o menos es lo q quería. Ahora mismo estoy en un estado que he conseguido casi todo. Me faltaría que cuando el panel no está anclado se superponga a la pantalla cuando se pasa el ratón por encima. Ahora mismo lo que hago es contraer la pantalla y expandirla cuando dejo de pasar el ratón por encima.
Saludos... y perdón por el chorizo que he escrito jeje
Responder Con Cita
  #8  
Antiguo 21-05-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
A ver, tal como dice dec, cuando se mueve el cursor sobre un control dentro de un contenedor como un panel o un groupbox, la VCL determina que se ha salido del control (que no de control ).

Lo que comenta Lepe me parece que no aplica, porque estamos hablando -creo- del cursor del ratón, no del teclado. Los eventos OnEnter y OnExit aplican cuando se mueve el foco del teclado.

No conozco ni uso la JVCL, pero como pienso que esto es más una cuestión genérica de la VCL, creo que podemos resolverlo así (explicación al final):

Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Memo1: TMemo;
    ApplicationEvents1: TApplicationEvents;

    procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);

  private
    InPanel: Boolean;

  public
    procedure PanelEnter;
    procedure PanelLeave;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ApplicationEvents1Message(
  var Msg: tagMSG; var Handled: Boolean);
var
  Pt: TPoint;
  R: TRect;

begin
  if (Msg.message = WM_MOUSEMOVE) then
  begin
    Pt := Self.ScreenToClient(Mouse.CursorPos);
    R := Panel1.BoundsRect;

    if PtInRect(R, Pt) then
      if not InPanel then
      begin
        InPanel := true;
        PanelEnter;
      end
      else // gracias cHackAll 
    else
      if InPanel then
      begin
        InPanel := false;
        PanelLeave;
      end;
  end;
end;

procedure TForm1.PanelEnter;
begin
  Caption := 'Mouse Enter';
end;

procedure TForm1.PanelLeave;
begin
  Caption := 'Mouse Leave';
end;

end.

Usamos un componente ApplicationEvents para detectar el movimiento del ratón antes de que la VCL lo convierta en eventos OnMuseMove de los controles sobre los que pase el ratón.

Al detectar el mensaje WM_MOUSEMOVE, simplemente miramos si el ratón está dentro del contenedor (en el ejemplo, un panel) y lanzamos el "evento" PanelEnter o PanelLeave según sea el caso.

Usamos una variable booleana, InPanel, para controlar que los eventos no se lancen más de una vez.

Como observación final; para tomar la posición del cursor uso Mouse.CursorPos en lugar de Msg.lParam que es el que contiene la posición que envía el mensaje WM_MOUSEMOVE. Esto lo hago porque las coordenadas de WM_MOUSEMOVE son relativas al control interno (el Memo, en el ejemplo) y no al contenedor, así que tendríamos que averiguar qué control es y convertir las coordenadas. Mejor nos ahorramos eso.

pd: Si a lo que se refiere vejerf es al foco del teclado, entonces aplica los que comenta Lepe.

// Saludos

Última edición por roman fecha: 21-05-2008 a las 18:10:19.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Llamar evento desde otro evento nachito_tuc OOP 1 23-08-2006 21:37:43
Evento OnKeyPress papulo Varios 3 30-08-2005 13:37:04
OnMouseEnter/OnMouseLeave para una celda determinada de un DbGrid S.M.S. OOP 4 06-08-2005 00:13:48
¿Se puede añadir a un TPanel OnMouseLeave? Tonio OOP 4 20-06-2005 23:14:37
parar un evento empty Varios 7 29-04-2004 13:08:17


La franja horaria es GMT +2. Ahora son las 06:30:22.


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
Copyright 1996-2007 Club Delphi