PDA

Ver la Versión Completa : Hacer que aparezca el PopUpMenu encima del elemento seleccionado


Toni-2006
26-11-2013, 17:26:52
Hola a todos.

Tengo un PopUpMenu dentro de un FileListBox que se activa siempre y cuando haya seleccionado un elemento del FileListBox (sin MultiSelect). El problema es que no se hacer que aparezca el PopUpMenu encima del elemento seleccionado y no en la posición donde esté el cursor.

Muchas gracias y un saludo.

ecfisa
26-11-2013, 20:49:33
Hola Toni-2006.

Se me ocurre que podrías hacer:

// Desactivar selección múltiple y desasociar popupmenu
procedure TForm1.FormCreate(Sender: TObject);
begin
with FileListBox1 do
begin
MultiSelect:= False;
PopupMenu := nil;
end;
end;;

// Obtener el ítem seleccionado
function SelectedItemIndex(FLB: TFileListBox): Integer;
var
i: Integer;
begin
Result:= -1;
for i:= 0 to FLB.Items.Count-1 do
if FLB.Selected[i] then
begin
Result:= i;
Exit;
end;
end;

procedure TForm1.FileListBox1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
P : TPoint;
SI: Integer;
begin
SI := SelectedItemIndex(FileListBox1);
if (ssRight in Shift) and (SI <> -1) then
begin
P.X:= FileListBox1.Left + X;
P.Y:= FileListBox1.Top + SI * FileListBox1.ItemHeight + FileListBox1.ItemHeight;
P := ClientToScreen(P);
PopupMenu1.Popup(P.X, P.Y);
end;
end;


Otra opción es usar el evento OnMouseMove para que el ítem quede seleccionado cuando el mouse pasa por encima:

procedure TForm1.FileListBox1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
with Sender as TFileListBox do
ItemIndex := ItemAtPos(Point(x,y), True);
end;

Pero de este modo no se seleccióna el ítem mediante el clíck del mouse...

Saludos :)

nlsgarcia
27-11-2013, 01:58:46
Toni-2006,


...no se hacer que aparezca el PopUpMenu encima del elemento seleccionado y no en la posición donde esté el cursor...


Esta es una variante del código sugerido en el Msg #2:

procedure TForm1.FileListBox1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
P : TPoint;
SI: Integer;
begin
SI := SelectedItemIndex(FileListBox1);
if (ssRight in Shift) and (SI <> -1) then
begin
P.X:= FileListBox1.Width - FileListBox1.Left + 40;
// Popup Menu Sobre el Item Seleccionado
P.Y:= FileListBox1.Top + SI * FileListBox1.ItemHeight - 50;
P := ClientToScreen(P);
PopupMenu1.Popup(P.X, P.Y);
end;
end;

El código anterior muestra un TPopupMenu sobre un Item seleccionado en un TFileListBox como se muestra en la siguiente imagen:

http://img29.imageshack.us/img29/3843/ekw8.jpg

Espero sea útil :)

Nelson.

Toni-2006
27-11-2013, 16:12:07
Mucha gracias, me quedo con la opción del OnMouseMove. Es la ideal para mi.