2012-07-25 3 views
10

Wie kann ein TPopupMenu an der rechten Seite eines Formulars ausgerichtet werden? Das Problem ist, dass es keine Möglichkeit gibt, die Breite des Popup-Menüs zu erhalten, bevor Sie Popup(X, Y: Integer) aufrufen.Richten Sie ein TPopupMenu auf der rechten Seite des Formulars aus?

Ich versuche, ein Verhalten ähnlich dem des Systemmenüs in Chrome zu bekommen.

enter image description here

+0

Duplizieren: [Sie Windows. Ändern Sie die Drop-down-Menüposition] (http://stackoverflow.com/q/4721989) –

+0

@Sertac - Ich sehe nicht, dass dies eine doppelte Frage ist. a) Es ist mit Delphi markiert. b) Es geht nicht nur darum, das Popup zu verschieben. Es erfordert, dass die Breite des Menüs bekannt ist, damit die Position berechnet werden kann. – norgepaul

+0

Bevor Sie das Menüfenster bewegen, können Sie seine Größe/Position ermitteln. Die VCL bietet nicht die Funktionalität, die Sie fragen, daher müssen Sie API-Aufrufe verwenden. Ich denke, das macht es zu einem Duplikat, aber vielleicht nicht .. –

Antwort

12

könnten Sie auch festlegen nur Alignment-paRight und rufen

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

Sehr einfach! Ausgezeichnet! – Whiler

+0

+1 für die reine VCL-Lösung (wie in "_Wiz Win kennt die API ist gut, aber zu wissen, wie man es nicht verwendet ist besser_") –

+0

Perfekt. Tolle Antwort :) – norgepaul

12

Die einfachste Lösung wäre, um das Popup-Menü selbst zu starten:

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; 

Siehe Dokumentation für TrackPopupMenu oder TrackPopupMenuEx für das, was bedeuten verschiedene Flaggen.

+1

+1 Ausgezeichnete Arbeit wie immer –

+0

+1, Sertac - was David sagte. :-) –

+0

+1 - was Ken sagte, sagte David :) – Shambhala

Verwandte Themen