Вопрос пользователя связан с проблемой создания разделителей в меню приложений, написанных на Delphi, при использовании кросс-платформенной библиотеки FireMonkey. Разделители меню на Windows и macOS реализуются по-разному, и при запуске одного и того же приложения на обеих платформах возникают различия в отображении. На Windows платформе с использованием VCL для добавления разделителя в меню достаточно создать элемент TMenuItem с Caption '-', что корректно отображается как разделитель. В FireMonkey для этого используется свойство Text с тем же значением. Однако на macOS вместо разделителя отображается минус, что является нежелательным поведением.
Пользователь пытался решить проблему, изменяя свойства TMainMenu и TMenuBar, используя параметр UseOSMenu, но проблема оставалась. В качестве альтернативного решения рассматривалась возможность использования документации Cocoa для создания разделителя, но это не привело к решению, поскольку FireMonkey не использует Cocoa.
Подтвержденное решение проблемы заключается в использовании специальной процедуры FixSeparatorItemsForMac, которая должна быть вызвана в событии OnActivate главного формы. Эта процедура исправляет разделители в меню, используя Objective-C классы. Для корректной работы необходимо добавить в список использованных модулей соответствующие макросы для macOS.
Ниже приведен пример кода на Object Pascal (Delphi), который демонстрирует, как можно исправить разделители меню для macOS:
uses
...
{$IFDEF MACOS}
,Macapi.ObjectiveC,MacApi.AppKit,MacApi.Foundation,FMX.Platform.Mac
{$ENDIF}
{$IFDEF MACOS}
procedure FixSeparatorItemsForMenuItem(MenuItem: NSMenuItem);
var
i: Integer;
subItem: NSMenuItem;
begin
if (MenuItem.hasSubmenu = false) then
exit;
for i := 0 to MenuItem.submenu.itemArray.count - 1 do
begin
subItem := MenuItem.submenu.itemAtIndex(i);
if (subItem.title.isEqualToString(NSSTR('-')) = true) then
begin
MenuItem.submenu.removeItemAtIndex(i);
MenuItem.submenu.insertItem(TNSMenuItem.Wrap(TNSMenuItem.OCClass.separatorItem), i);
end
else
begin
FixSeparatorItemsForMenuItem(subItem);
end;
end;
end;
procedure FixSeparatorItemsForMac;
var
NSApp: NSApplication;
MainMenu: NSMenu;
AppItem: NSMenuItem;
i: Integer;
begin
NSApp := TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication);
MainMenu := NSApp.mainMenu;
if (MainMenu <> nil) then
begin
for i := 0 to MainMenu.itemArray.count - 1 do
begin
AppItem := MainMenu.itemAtIndex(i);
FixSeparatorItemsForMenuItem(AppItem);
end;
end;
end;
{$ENDIF}
Этот код должен быть размещен в соответствующем месте вашего проекта, и его необходимо вызвать в событии OnActivate главного окна вашего приложения, чтобы исправить отображение разделителей меню на macOS. Обратите внимание, что данное решение предназначено для временного использования до исправления ошибки разработчиками FireMonkey.
Пользователь столкнулся с проблемой отображения разделителей в меню приложения, написанного на Delphi с использованием кросс-платформенной библиотеки FireMonkey, при запуске на Windows и macOS, и нашел решение, используя специальную процедуру для исправл
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.