Решение проблемы получения имени элемента меню VCL в праворучном клике
В статье будет рассмотрена проблема, с которой сталкиваются разработчики при работе с VCL-приложениями в Delphi 11 под Windows 10. Особое внимание уделится получению имени элемента меню при праворучном клике. Для начала, разберемся с тем, как устроен стандартный механизм обработки кликов по элементам меню и что нужно изменить для решения поставленной задачи.
Оригинальная проблема
При разработке 32-битного приложения Delphi 11 на базе VCL под Windows 10, разработчики столкнулись с необходимостью получить имя элемента меню при праворучном клике. Для уведомления о клике по элементам меню используется компонент TApplicationEvents, и приведенный ниже код:
procedure TFormMain.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
case Msg.message of
Winapi.Messages.WM_COMMAND:
begin
// Код обработки сообщения
end;
end;
end;
Однако, возникли следующие вопросы:
Как настроить уведомление об обработке только праворучных кликов по элементам меню?
Как получить имя элемента меню, по которому был совершен клик?
Поиск решения
Для решения проблемы необходимо использовать функцию TrackPopupMenuEx() с флагами TPM_RIGHTBUTTON для отображения контекстного меню с возможностью праворучного клика и TPM_RECURSE для рекурсивного отображения меню. Затем следует обработать сообщение WM_MENURBUTTONUP для владельца окна меню.
Каждый объект TMenu (например, TMainMenu или TPopupMenu) предоставляет метод FindItem, который позволяет найти элемент меню по различным критериям. Для получения элемента меню по идентификатору, переданному в Msg.wParam, следует использовать следующий код:
Однако, для получения самого объекта TMenu (например, TMainMenu или TPopupMenu) необходимо использовать свойства формы, поскольку Menu является свойством TForm. В случае, если в приложении несколько форм и несколько (поп-ап) меню на каждой из них, можно использовать следующий подход:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
case Msg.message of
Winapi.Messages.WM_COMMAND:
begin
var ThisMenuItem := GetMenuItem(Msg.wParam);
if Assigned(ThisMenuItem) then
begin
// Получение и вывод имени элемента меню
end;
end;
end;
end;
function TForm1.GetMenuItem(const aWParam: NativeUInt): TMenuItem;
begin
Result := nil;
var ThisForm := Screen.ActiveForm;
for var i := 0 to ThisForm.ComponentCount - 1 do
begin
if ThisForm.Components[i] is TMenu then
begin
ThisMenuItem := TMenu(ThisForm.Components[i]).FindItem(aWParam, fkCommand);
if Assigned(ThisMenuItem) then
begin
Result := ThisMenuItem;
EXIT;
end;
end;
end;
end;
Этот код позволяет получить элемент меню, по которому был совершен клик, в контексте любой формы приложения.
Заключение
В данной статье была рассмотрена проблема получения имени элемента меню в праворучном клике для приложений Delphi 11. Предоставлены рекомендации по настройке обработчика событий для уведомления о праворучных кликах и примеры кода для получения имени элемента меню. Используя предложенные решения, разработчики смогут улучшить взаимодействие с пользователем и расширить функциональность своих приложений.
Разработчики столкнулись с задачей получения имени элемента меню при праворучном клике в приложении Delphi 11 под Windows 10 и ищут решение, используя компоненты VCL и обработку сообщений.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS