Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Popupmenu en un combobox no me funciona (https://www.clubdelphi.com/foros/showthread.php?t=70624)

cocute 01-11-2010 15:21:56

Popupmenu en un combobox no me funciona
 
pues eso, tengo asociado un popupmenu a un combobox,
y al hacer click derecho sobre el componente combobox funciona, pero si hago click derecho sobre un item de la lista del combobox no me aparece el popupmenu.
¿sabéis como se resuelve esto?

gracias

ecfisa 02-11-2010 07:09:38

Hola cocute.

La lista que se despliega en un Combo/List Box es una ventana diferente que la que maneja windows para el Combo/List Box.
Según entiendo, la lista deriva de TCustomListControl, clase base que aprovechan TComboBox, TListBox, etc. y no implementa
eventos. Desde el ComboBox, al menos yo, no veo manera de acceder.

Despues de muchas pruebas logré que la maldita lista del PopupMenu apareciera y se quedara quieta hasta que se elija algo del
Menu. No probé el código exaustivamente, así que te recomiendo que lo hagas hasta que te salte el primer error... :D.

Bueno, quizá te dé alguna idea o te sirva de base para mejorarlo:
Código Delphi [-]
...
type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    PopupMenu1: TPopupMenu;
    UNO1: TMenuItem;
    DOS1: TMenuItem;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1DropDown(Sender: TObject);
    procedure ComboBox1CloseUp(Sender: TObject);
    procedure UNO1Click(Sender: TObject);
    procedure DOS1Click(Sender: TObject);
  private
    FRect: TRect;        // Area de lista desplegada
    FComboOpen: Boolean; // CloseUp On/Off
    FItemIndex: Integer; // ItemIndex del ComboBox
    procedure MouseEvent(var Msg: TMsg; var Handled: Boolean);
  public
  end;

var
  Form1: TForm1;

implementation {$R *.dfm}

(* Evento Mouse *)
procedure TForm1.MouseEvent(var Msg: TMsg; var Handled: Boolean);
var
  P: TPoint;
begin
  FComboOpen:= False;  // Activar CloseUp
  if Msg.message = WM_RBUTTONDOWN  then
  begin
     P:= Mouse.CursorPos;   // Obtener posición del mouse
     if (P.X >= FRect.Left)and(P.Y >= FRect.Top)and
        (p.X <= FRect.Right)and(P.Y <= FRect.Bottom) then
        begin
          FComboOpen:= True;  // Cancelar CloseUp
          with ComboBox1 do
          begin
            FItemIndex:= ItemIndex;  // Obtener índice
            Text:= Items[ItemIndex]; // Copiar seleccionado
          end;
          PopupMenu1.Popup(FRect.Right, FRect.Bottom);
        end
  end;
end;

(* FormCreate *)
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage:= MouseEvent; // Asignar evento
end;

(* Obtener Area de la lista *)
procedure TForm1.ComboBox1DropDown(Sender: TObject);
var
  P: TPoint;
begin
  P:= ClientToScreen(ComboBox1.ClientOrigin);
  with ComboBox1 do
  begin
    // Obtener Esquina sup. izquierda
    FRect.Left:= ClientOrigin.X;
    FRect.Top:=  ClientOrigin.Y + Height;
    // Obtener Esquina inf. derecha;
    FRect.Right:= ClientOrigin.X + Width;
    FRect.Bottom:= ClientOrigin.Y + Height*(DropDownCount-2); 
  end;
end;

(* Habilitar/deshabilitar CloseUp *)
procedure TForm1.ComboBox1CloseUp(Sender: TObject);
begin
  SendMessage(ComboBox1.handle,CB_SHOWDROPDOWN,Integer(FComboOpen), 0);
end;

(* MenuItem 'UNO' OnClick *)
procedure TForm1.UNO1Click(Sender: TObject);
begin
   with ComboBox1 do
    Edit1.Text:= Items[FItemIndex];
end;

(* MenuItem 'DOS' OnClick *)
procedure TForm1.DOS1Click(Sender: TObject);
begin
  with ComboBox1 do
    Memo1.Lines.Add(Items[FItemIndex]);
end;
...

Espero que te sirva.

Saludos. :)

cocute 06-11-2010 23:11:19

gracias por el tiempo que has perdido en responder, funciona pero me hace un efecto muy raro al hacer click derecho se esconde la lista y se vuelve a mostrar.
Estoy haciendo pruebas intentando perfeccionar lo que me has enviado.
Pero estoy seguro que tiene que haber algún modo más simple de hacerlo.

Se me ocurre usar un listbox emergente en vez de la lista del combobox, en fin seguiré probando

ecfisa 07-11-2010 00:22:44

Hola cocute.

En el equipo que utilizo no me ocurre ese efecto, pero estoy seguro que el código que lo produce es este:
Código Delphi [-]
procedure TForm1.ComboBox1CloseUp(Sender: TObject);
begin
  SendMessage(ComboBox1.handle,CB_SHOWDROPDOWN,Integer(FComboOpen), 0);
end;

Esa línea, es la que manda el mensaje de desplegar la lista cuando se realiza PopupMenu1.Popup, por que la misma se repliega al abrirse este último.
No encontré otro modo impedir que se contraiga ya que no hay eventos para prevenir este comportamiento.
Creo que ahí está el nudo de la cuestión.

Si encuentro otra forma más adecuada te aviso.


Saludos. :)

ecfisa 08-11-2010 01:44:11

Hola de nuevo.

Buscando, encontré algo que no es puntualmente el ejemplo, pero te puede servir como base para implementar lo que querés realizar.
Y como lo prometido es deuda... aca te pongo el LINK .

La página pertenece al compañero roman, y realmente está muy buena. Vale la pena visitarla.


Saludos. :)


La franja horaria es GMT +2. Ahora son las 21:31:10.

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