2012-07-25 10 views
10

In che modo un TPopupMenu può essere allineato sul lato destro di un modulo? Il problema è che non sembra essere un modo per ottenere la larghezza del menu popup prima di chiamare Popup(X, Y: Integer).Allineare un TPopupMenu sul lato destro del modulo?

Sto cercando di ottenere un comportamento simile a quello del menu di sistema in Chrome.

enter image description here

+0

duplicati: [Windows. Cambia posizione del menu a discesa] (http://stackoverflow.com/q/4721989) –

+0

@Sertac - Non vedo come si tratti di una domanda duplicata. a) È etichettato con Delphi. b) Non si tratta semplicemente di spostare il popup. Richiede che la larghezza del menu sia nota, quindi la posizione può essere calcolata. – norgepaul

+0

Prima di spostare la finestra del menu, è possibile ottenere la sua dimensione/posizione. Il VCL non offre la funzionalità richiesta, quindi è necessario utilizzare le chiamate api. Penso che sia un duplicato, ma forse no .. –

risposta

12

Si potrebbe anche solo impostare Alignment-paRight e chiamare

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

Molto semplice! Eccellente! – Whiler

+0

+1 per pura soluzione VCL (come in "_consultare che l'API di Win è buona, ma sapere come non usarla è meglio_") –

+0

Perfetto. Ottima risposta :) – norgepaul

12

La soluzione più semplice sarebbe quella di lanciare il menu a comparsa da soli:

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; 

vedere la documentazione per TrackPopupMenu o TrackPopupMenuEx per quello che significano diverse bandiere.

+1

+1 Ottimo lavoro come sempre –

+0

+1, Sertac - quello che David ha detto. :-) –

+0

+1 - quello che Ken ha detto che David ha detto :) – Shambhala

Problemi correlati