Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-11-2010
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 02-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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... .

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.

Última edición por ecfisa fecha: 02-11-2010 a las 07:20:58.
Responder Con Cita
  #3  
Antiguo 06-11-2010
cocute cocute is offline
Miembro
 
Registrado: nov 2008
Posts: 403
Poder: 16
cocute Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 07-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.

Última edición por ecfisa fecha: 07-11-2010 a las 00:32:46.
Responder Con Cita
  #5  
Antiguo 08-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
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
Genero comboBox en dbgrid y cuando hago dos veces click desaparece el comboBox. mcalmanovici Varios 1 29-02-2012 15:09:15
El PopupMenu skinnerpro OOP 4 16-10-2007 01:47:30
Delphi For PHP: popupmenu ¿funciona? maro PHP 1 04-10-2007 17:32:45
como mostrar la ventana de lenar inten de un combobox en tiempo de un combobox gulder Varios 3 19-05-2007 19:55:58
popupMenu jorodgar Varios 7 20-04-2005 17:16:22


La franja horaria es GMT +2. Ahora son las 18:06:21.


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