Проблема со стилями Vcl для пунктов меню, добавленных во время загрузки программы

У меня есть программа Delphi 10.4.2 (32-разрядная), в которой элементы меню добавляются во время загрузки программы (событие Application.OnActivate, закодированное для запуска только один раз). Без стиля vcl новые элементы отображаются правильно, однако при применении стиля (например, очень красивого Iceberg Classico на скриншоте) отображение отображается некорректно. Опции меню есть, и на них можно щелкнуть; но текст и иконка не рисуются.

Любые обходные пути? Я предполагаю, что это потому, что эти конкретные параметры меню добавляются после применения стиля. Есть ли способ обновить стиль? Или мне не хватает свойства настройки при создании пунктов меню?

Спасибо.

Редактировать: Да, меню «Файл» и элементы подменю отображаются правильно. Код, который создает новое меню и элементы (упрощенно):

procedure TDbHelper.CreateHelpMenu;
// Called by OnApplicationActivated event, and run just once 
var
   aMenu: TMainMenu;
   mnHelp, mnItem: TMenuItem;
   idx: Integer;
begin
   aMenu := Application.MainForm.Menu;
   // create new menu
   mnHelp         := aMenu.CreateMenuItem;
   mnHelp.Name    := 'WISHelp1';               
   mnHelp.Caption := 'WIS Help';
   aMenu.Items.Add(mnHelp);
   // now the submenu items
   for idx := 0 to HelpLinks.Count - 1 do
   begin
      mnItem := TMenuItem.Create(mnHelp);
      mnItem.Name := HelpLinks[idx].Key;
      mnItem.Caption := HelpLinks[idx].Text;
      mnItem.ImageIndex := HelpLinks[idx].ImageIndex;                            
      mnItem.OnClick := WISHelpItemClick;
      mnHelp.Add(mnItem);
   end;
end;

Пункты в меню File отображаются правильно после добавления новых пунктов? Также было бы неплохо, если бы вы показали пример кода того, как вы добавляете эти новые элементы в свое главное меню.

SilverWarior 21.12.2020 12:24

@SilverWarrior спасибо за ответ; Я отредактировал свой вопрос, чтобы предоставить запрошенную дополнительную информацию.

PhilW 21.12.2020 17:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
2
577
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Пытался воссоздать этот сценарий в Delphi 10.3, и у меня он отлично работает.

Но потом, немного повозившись, мне удалось воссоздать ваш "конечный результат". И для этого мне пришлось передать пустые строки для mnItem.Name и mnItem.caption.

Поэтому я считаю, что проблема, с которой вы столкнулись, заключается не в использовании стилей VCL, а в том, что ваши методы HelpLinks[idx].Key и HelpLinks[idx].Text возвращают пустые строки. Таким образом, вы получаете пункты меню без имени и без заголовка, поэтому они отображаются неправильно.

Если я правильно отключу стили VCL, все равно будет тот же результат.

@SilverWarrior, это полезная информация, спасибо. Идея пустых строк была проверена, и, как я упоминал в вопросе, без стиля vcl новые элементы отображаются правильно. Кстати, я не отрицал ваш ответ, и я не знаю, почему кто-то это сделал; на этом форуме иногда бывает тяжело...

PhilW 22.12.2020 11:57

Если отключение стилей VCL приводит к правильному отображению элементов меню, то я предполагаю, что в коде стилей VCL может быть какая-то ошибка, которая присутствует в Delphi 10.4, а не в Delphi 10.3. Поскольку в Delphi 10.4 появилась возможность выбирать определенный стиль для каждого компонента в отдельности, я предполагаю, что в вашем сценарии информация о стиле может загружаться слишком поздно, и поэтому графика стилей отображается над заголовком меню. Возможно, вам следует сначала попробовать добавить пункт меню в главное меню, а затем установить его свойства. Это может заставить стили VSL правильно отображать указанные элементы.

SilverWarior 22.12.2020 13:40

Теперь я почти уверен, что в новейших стилях VCL есть ошибка. Почему? Еще один вопрос о проблемах с использованием стилей VCL в Delphi 10.4 был только что опубликован здесь, в Stack Overflow. Судя по тому, что происходит, я предполагаю, что у новейших стилей VCL могут быть проблемы с порядком рендеринга определенных стилизованных объектов.

SilverWarior 22.12.2020 13:51
Ответ принят как подходящий

Наконец решил отключить стили vcl для меню. Я последовал совету RRUZ по другому вопросу и добавил в исходник dpr строчку, чтобы стало:

  Application.Initialize;
  TStyleManager.TrySetStyle('Iceberg Classico');
  with TStyleManager do SystemHooks := SystemHooks - [shMenus];
  Application.Title :=  'blah, blah, etc'

Пункты меню снова появились, и они выглядят нормально:

Спасибо SilverWarior за их вклад и предложения.

Используя Delphi11, у меня была аналогичная проблема пустых пунктов меню с использованием списка виртуальных изображений. Отключение [shMenus] восстановило текст, но оставило меню неправильного цвета. Как ни странно, я могу заполнить всплывающее меню виртуальным списком изображений, цветным текстом и растровыми изображениями, и все в порядке.

Mike Scott 20.02.2022 12:28

Другие вопросы по теме