Просто сделайте
procedure TForm1.Button1Click(Sender: TObject);
var
pnt: TPoint;
begin
if GetCursorPos(pnt) then
PopupMenu1.Popup(pnt.X, pnt.Y);
end;
Еще немного обсуждения
Если вам по какой-то причине нужно , чтобы использовать OnMosuseUp
, вы можете сделать
procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
pnt: TPoint;
begin
if (Button = mbLeft) and GetCursorPos(pnt) then
PopupMenu1.Popup(pnt.X, pnt.Y);
end;
Ваш код не работает, потому что
ClientToScreen
- это функция Windows API с подписью
function ClientToScreen(hWnd: HWND; var lpPoint: TPoint): BOOL;
Но есть и TControl.ClientToScreen
с подписью
function TControl.ClientToScreen(const Point: TPoint): TPoint;
Следовательно, если вы находитесь в методе класса, класс, являющийся потомком TControl
, ClientToScreen
будет ссылаться на последний.Если нет, это будет относиться к прежнему.И этому, конечно, нужно знать, из какого окна мы должны преобразовывать координаты!
Кроме того, если вы объявите
var mb1: TMouseButton
в качестве параметра, тобудет принята только переменная типа TMouseButton
.Но я не вижу никакой причины, почему вы хотели бы эту подпись вашей функции ShowPopupMenuEx
.На самом деле, я не вижу никакой необходимости в такой функции вообще ...
Альтернатива
Мой код выше выскочит меню в позиции курсора поз.Если вам нужно зафиксировать точку относительно одного угла кнопки, вместо этого вы можете сделать
// Popup at the top-left pixel of the button
procedure TForm1.Button1Click(Sender: TObject);
begin
with Button1.ClientToScreen(point(0, 0)) do
PopupMenu1.Popup(X, Y);
end;
// Popup at the bottom-right pixel of the button
procedure TForm1.Button1Click(Sender: TObject);
begin
with Button1.ClientToScreen(point(Button1.Width, Button1.Height)) do
PopupMenu1.Popup(X, Y);
end;
// Popup at the bottom-left pixel of the button
procedure TForm1.Button1Click(Sender: TObject);
begin
with Button1.ClientToScreen(point(0, Button1.Height)) do
PopupMenu1.Popup(X, Y);
end;