Выровняйте TPopupMenu в правой части формы?

Как TPopupMenu можно выровнять с правой стороны формы? Проблема заключается в том, что не существует способа получить ширину всплывающего меню до вызова Popup(X, Y: Integer).

Я пытаюсь получить такое же поведение, как в системном меню в Chrome.

enter image description here

Ответ 1

Вы также можете просто установить Alignment на paRight и вызвать

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

Ответ 2

Самое простое решение - запустить всплывающее меню самостоятельно:

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;

См. документацию TrackPopupMenu или TrackPopupMenuEx для обозначения различных флагов.