PDA

Ver la Versión Completa : Abrir un ComboBoxEx automáticamente


afxe
10-02-2010, 18:44:02
Hola chicos (y chicas, que las hay).

A ver si me ayudan... tengo un TComboBoxEx y desearía que cuando el ratón pase por encima se abriera automáticamente. Algo tan fácil como poner la instrucción en el evento OnMouseEnter:

cbAccion.DroppedDown := True;


Pero éste componente no tiene dicho evento.

Gracias a todos.

Lord Delfos
10-02-2010, 20:38:36
Bueno, la manera más fácil es redefinir la clase TComboBoxEx para que intercepte el mensaje CMMouseEnter.

Algo así:


unit Unit1;

interface

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

type TComboBoxEx = class(ComCtrls.TComboBoxEx)
private
procedure CMMouseEnter(var msg: TMessage) ; message CM_MOUSEENTER;
end;

type
TForm1 = class(TForm)
cbb1: TComboBoxEx;
private

[...]

procedure TComboBoxEx.CMMouseEnter(var msg: TMessage);
begin
DroppedDown:= True;
end;


Al declarar una clase que se llama igual que una que ya existe, se "engaña" a Delphi para que instancie tu clase en vez de la original... Por eso hay que declararla antes de la declaración de la Form1.

Espero te sirva. Saludongos.

afxe
11-02-2010, 10:19:22
Perfecto Lord. Sencillo y elegante. Gracias.

LuisAlf::
03-03-2010, 18:36:53
Al leer el post se me hizo interesante el problema.....

Saben la solución que da Lord Delfos es excelente, me gusto mucho,pero antes de implementarla quise experimentar un poco y lo logre....muy a mi manera pero es una solucion......creo que es una forma salvaje de hacerlo pero bueno.....


if((x<(combo.left+combo.Width+5))and(x>combo.Left-6))
and((y<(combo.top+combo.height+5))and(y>combo.Top-5))then
combo.DroppedDown:=true;



Lo aplique a un combobox(no se cual seal sea el comboboxEx) y como claramente afxe dijo que este componente no tiene el evento onmousemove, pués se me ocurrio hacerlo pero con el onmousemove de la forma, es decir al estar el cursor cerca de la posición del combobox se activa la propiedad DroppedDown:=true, esto es lo que valida el if del codigo al conocer la posición del cursor por medio de los parametros del evento: x, y...

Lord Delfos
03-03-2010, 20:59:04
¡Pues funciona muy bien!

Lo bueno de tu solución es que no se necesita declarar una nueva clase en cada ventana en la que uno quiera usar el "truco".