У меня есть программа 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;
@SilverWarrior спасибо за ответ; Я отредактировал свой вопрос, чтобы предоставить запрошенную дополнительную информацию.
Пытался воссоздать этот сценарий в Delphi 10.3, и у меня он отлично работает.
Но потом, немного повозившись, мне удалось воссоздать ваш "конечный результат". И для этого мне пришлось передать пустые строки для mnItem.Name
и mnItem.caption
.
Поэтому я считаю, что проблема, с которой вы столкнулись, заключается не в использовании стилей VCL, а в том, что ваши методы HelpLinks[idx].Key
и HelpLinks[idx].Text
возвращают пустые строки. Таким образом, вы получаете пункты меню без имени и без заголовка, поэтому они отображаются неправильно.
Если я правильно отключу стили VCL, все равно будет тот же результат.
@SilverWarrior, это полезная информация, спасибо. Идея пустых строк была проверена, и, как я упоминал в вопросе, без стиля vcl новые элементы отображаются правильно. Кстати, я не отрицал ваш ответ, и я не знаю, почему кто-то это сделал; на этом форуме иногда бывает тяжело...
Если отключение стилей VCL приводит к правильному отображению элементов меню, то я предполагаю, что в коде стилей VCL может быть какая-то ошибка, которая присутствует в Delphi 10.4, а не в Delphi 10.3. Поскольку в Delphi 10.4 появилась возможность выбирать определенный стиль для каждого компонента в отдельности, я предполагаю, что в вашем сценарии информация о стиле может загружаться слишком поздно, и поэтому графика стилей отображается над заголовком меню. Возможно, вам следует сначала попробовать добавить пункт меню в главное меню, а затем установить его свойства. Это может заставить стили VSL правильно отображать указанные элементы.
Теперь я почти уверен, что в новейших стилях VCL есть ошибка. Почему? Еще один вопрос о проблемах с использованием стилей VCL в Delphi 10.4 был только что опубликован здесь, в Stack Overflow. Судя по тому, что происходит, я предполагаю, что у новейших стилей VCL могут быть проблемы с порядком рендеринга определенных стилизованных объектов.
Наконец решил отключить стили vcl для меню. Я последовал совету RRUZ по другому вопросу и добавил в исходник dpr строчку, чтобы стало:
Application.Initialize;
TStyleManager.TrySetStyle('Iceberg Classico');
with TStyleManager do SystemHooks := SystemHooks - [shMenus];
Application.Title := 'blah, blah, etc'
Пункты меню снова появились, и они выглядят нормально:
Спасибо SilverWarior за их вклад и предложения.
Используя Delphi11, у меня была аналогичная проблема пустых пунктов меню с использованием списка виртуальных изображений. Отключение [shMenus] восстановило текст, но оставило меню неправильного цвета. Как ни странно, я могу заполнить всплывающее меню виртуальным списком изображений, цветным текстом и растровыми изображениями, и все в порядке.
Пункты в меню
File
отображаются правильно после добавления новых пунктов? Также было бы неплохо, если бы вы показали пример кода того, как вы добавляете эти новые элементы в свое главное меню.