Ver Mensaje Individual
  #2  
Antiguo 02-11-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 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