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

Создание разделителей в меню приложений Delphi для Windows и macOS

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

Вопрос пользователя связан с проблемой создания разделителей в меню приложений, написанных на 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




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


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


реклама


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

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