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; FComboOpen: Boolean; FItemIndex: Integer; procedure MouseEvent(var Msg: TMsg; var Handled: Boolean);
public
end;
var
Form1: TForm1;
implementation {$R *.dfm}
procedure TForm1.MouseEvent(var Msg: TMsg; var Handled: Boolean);
var
P: TPoint;
begin
FComboOpen:= False; if Msg.message = WM_RBUTTONDOWN then
begin
P:= Mouse.CursorPos; if (P.X >= FRect.Left)and(P.Y >= FRect.Top)and
(p.X <= FRect.Right)and(P.Y <= FRect.Bottom) then
begin
FComboOpen:= True; with ComboBox1 do
begin
FItemIndex:= ItemIndex; Text:= Items[ItemIndex]; end;
PopupMenu1.Popup(FRect.Right, FRect.Bottom);
end
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage:= MouseEvent; end;
procedure TForm1.ComboBox1DropDown(Sender: TObject);
var
P: TPoint;
begin
P:= ClientToScreen(ComboBox1.ClientOrigin);
with ComboBox1 do
begin
FRect.Left:= ClientOrigin.X;
FRect.Top:= ClientOrigin.Y + Height;
FRect.Right:= ClientOrigin.X + Width;
FRect.Bottom:= ClientOrigin.Y + Height*(DropDownCount-2);
end;
end;
procedure TForm1.ComboBox1CloseUp(Sender: TObject);
begin
SendMessage(ComboBox1.handle,CB_SHOWDROPDOWN,Integer(FComboOpen), 0);
end;
procedure TForm1.UNO1Click(Sender: TObject);
begin
with ComboBox1 do
Edit1.Text:= Items[FItemIndex];
end;
procedure TForm1.DOS1Click(Sender: TObject);
begin
with ComboBox1 do
Memo1.Lines.Add(Items[FItemIndex]);
end;
...
Espero que te sirva.
Saludos.