У меня есть проблема с правильным вызовом контекстного меню в
координатах курсора мыши.
Это будет работать:
procedure TForm1.Form1MouseDown(Sender: TObject; Button:
TMouseButton; Shift: TShiftState; X, Y: Integer);
beginif Button = mbRight thenwith ( Sender as TControl ).ClientToScreen( Point( X, Y )) do
PopupMenu1.Popup( X, Y );
end;
Here's the translation of the text into Russian:
Классическая проблема контекстного меню!
Ваш код почти готов, но имеет несколько проблем:
1. Метод PopupMenu1.Popup ожидает координаты в пространстве экрана, а не клиентском.
2. Вы используете Point(X, Y) для создания объекта точки, что является правильным, но должны передавать этот объект в ClientToScreen, а не координаты отдельно.
Вот исправленный код:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbRight then
PopupMenu1.Popup(ScreenToClient(Point(X, Y)));
end;
В этом коде используется ScreenToClient, чтобы преобразовать точку из координат экрана в клиентские координаты. Это обеспечивает, что контекстное меню будет отображаться на правильной позиции относительно формы.
Также обратите внимание, что ScreenToClient возвращает объект типа TPoint, поэтому мы можем передавать его напрямую в PopupMenu1.Popup. Нет необходимости создавать еще один объект точки!
В статье автор Ed Jordan описывает решение проблемы вызова контекстного меню в координатах курсора мыши с помощью процедуры TForm1.Form1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer).
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS