Вопрос, поднятый пользователями, заключается в том, что при использовании компонента TActionMainMenuBar в Delphi XE2 на 32-битной системе Windows 7, наблюдается ошибка в отрисовке корневых элементов меню без дочерних пунктов. При клике по элементам меню, например, "Options" или "Help", и последующем клике по форме, элементы меню остаются выделенными, что является нежелательным поведением.
Репродукция бага
Чтобы воспроизвести данный баг, необходимо:
Создать меню с использованием TActionMainMenuBar.
Добавить несколько действий, например:
```
File | Options | Help
New
Open
Save
Exit
```
Присвоить всем действиям пустую метод ActionExecute.
pascal
procedure TfrmMain.ActionExecute(Sender: TObject);
begin
// Здесь должен быть некоторый код, но он не выполняется, так как метод пустой
end;
Запустить приложение и попытаться кликнуть по элементам "Options" или "Help".
Кликнуть по форме, и несмотря на это, элементы меню останутся выделенными.
Подтвержденный ответ
В качестве решения проблемы предложен следующий подход:
Создание кастомного класса TFastThemedButton, который наследуется от TThemedMenuButton и переопределяет метод DrawBackground.
// Остальная часть класса и метода DrawBackground...
```
В методе DrawBackground необходимо установить правильные состояния для отрисовки элементов меню.
Добавление в обработчик события OnGetControlClassTActionMainMenuBar следующего кода, который установит созданный кастомный класс для элементов меню с тегом -100.
pascal
procedure TfrmActions.ActionMainMenuBar1GetControlClass(Sender: TCustomActionBar; AnItem: TActionClient; var ControlClass: TCustomActionControlClass);
begin
if ControlClass.InheritsFrom(TCustomMenuButton) and then
begin
if (AnItem.Tag =-100) and (ControlClass = TThemedMenuButton) then
ControlClass := TFastThemedButton;
end;
end;
Установка тега -100 для тех элементов меню, для которых необходимо устранить баг.
Альтернативное решение, предложенное пользователем, заключается в использовании события MainMenuExitMenuLoop с последующим вызовом MainMenu.RecreateControls на всех формах с меню, что также помогает устранить зависшее выделение элементов меню.
Альтернативный ответ
Дополнительно было замечено, что определенные действия, такие как отображение сообщений или выполнение операций, влияющих на визуальные изменения, могут помочь в устранении проблемы. Однако, рекомендуется использовать предложенный выше кастомный класс для более надежного решения.
Заключение
Приведенные решения позволяют устранить баг отрисовки элементов меню в TActionMainMenuBar в Delphi XE2 на 32-битной Windows 7, обеспечивая корректное поведение элементов меню после клика.
Пользователи столкнулись с проблемой в Delphi XE2, где при использовании компонента TActionMainMenuBar на 32-битной Windows 7 наблюдается баг в отрисовке элементов меню, которые остаются выделенными после клика по ним и последующего к
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.