Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Hacer que aparezca el PopUpMenu encima del elemento seleccionado (https://www.clubdelphi.com/foros/showthread.php?t=84710)

Toni-2006 26-11-2013 17:26:52

Hacer que aparezca el PopUpMenu encima del elemento seleccionado
 
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:
Código Delphi [-]
// 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:
Código Delphi [-]
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,

Cita:

Empezado por 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:
Código Delphi [-]
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:



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.


La franja horaria es GMT +2. Ahora son las 01:26:19.

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