Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Устранение бага отрисовки элементов меню в TActionMainMenuBar Delphi XE2 на 32-битной Windows 7

Delphi , Компоненты и Классы , Меню

Вопрос, поднятый пользователями, заключается в том, что при использовании компонента TActionMainMenuBar в Delphi XE2 на 32-битной системе Windows 7, наблюдается ошибка в отрисовке корневых элементов меню без дочерних пунктов. При клике по элементам меню, например, "Options" или "Help", и последующем клике по форме, элементы меню остаются выделенными, что является нежелательным поведением.

Репродукция бага

Чтобы воспроизвести данный баг, необходимо:

  1. Создать меню с использованием TActionMainMenuBar.
  2. Добавить несколько действий, например: ``` File | Options | Help
  3. New
  4. Open
  5. Save
  6. Exit ```
  7. Присвоить всем действиям пустую метод ActionExecute.

pascal procedure TfrmMain.ActionExecute(Sender: TObject); begin // Здесь должен быть некоторый код, но он не выполняется, так как метод пустой end;

  1. Запустить приложение и попытаться кликнуть по элементам "Options" или "Help".
  2. Кликнуть по форме, и несмотря на это, элементы меню останутся выделенными.

Подтвержденный ответ

В качестве решения проблемы предложен следующий подход:

  • Создание кастомного класса TFastThemedButton, который наследуется от TThemedMenuButton и переопределяет метод DrawBackground.

```pascal type TFastThemedButton = class(TThemedMenuButton) protected procedure DrawBackground(var PaintRect: TRect); override; end;

// Остальная часть класса и метода DrawBackground... ```

  • В методе DrawBackground необходимо установить правильные состояния для отрисовки элементов меню.

  • Добавление в обработчик события OnGetControlClass TActionMainMenuBar следующего кода, который установит созданный кастомный класс для элементов меню с тегом -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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Меню ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 16:04:26/0.0037918090820312/0