2012-07-25 13 views
10

¿Cómo se puede alinear un TPopupMenu con el lado derecho de un formulario? El problema es que no parece haber una manera de obtener el ancho del menú emergente antes de llamar al Popup(X, Y: Integer).Alinea un TPopupMenu a la derecha del formulario?

Estoy tratando de obtener un comportamiento similar al del menú del sistema en Chrome.

enter image description here

+0

duplicado: [Windows. Cambiar la posición del menú desplegable] (http://stackoverflow.com/q/4721989) –

+0

@Sertac - No veo cómo esta es una pregunta duplicada. a) Está etiquetado con Delphi. b) No se trata simplemente de mover la ventana emergente. Requiere que se conozca el ancho del menú para que se pueda calcular la posición. – norgepaul

+0

Antes de mover la ventana del menú, puede obtener su tamaño/posición. El VCL no ofrece la funcionalidad que usted solicita, por lo tanto, debe usar las llamadas de API. Creo que eso lo convierte en un duplicado, pero tal vez no ... –

Respuesta

12

También puedes, simplemente establecer Alignment-paRight y llame

with ClientToScreen(Point(ClientWidth - 1, 0)) do 
    Popup(X, Y); 
+1

¡Muy simple! ¡Excelente! – Whiler

+0

+1 para la solución VCL pura (como en "_ saber que la API de Win es buena, pero saber cómo no usarla es mejor_") –

+0

Perfecto. Gran respuesta :) – norgepaul

12

La solución más fácil sería para iniciar el menú emergente mismo:

procedure TForm1.Panel1ContextPopup(Sender: TObject; MousePos: TPoint; 
    var Handled: Boolean); 
var 
    PopupPt: TPoint; 
begin 
    PopupPt := ClientToScreen(Point(ClientWidth, 0)); 
    TrackPopupMenu(PopupMenu1.Handle, TPM_RIGHTALIGN or TPM_TOPALIGN, 
     PopupPt.X, PopupPt.Y, 0, PopupList.Window, nil); 
end; 

Véase la documentación para TrackPopupMenu o TrackPopupMenuEx por lo que significan varias banderas.

+1

+1 Excelente trabajo como siempre –

+0

+1, Sertac - lo que dijo David. :-) –

+0

+1 - lo que Ken dijo que David dijo :) – Shambhala

Cuestiones relacionadas