Как добавить разделители пунктов меню, которые работают так, как ожидалось на OSX?
On Windows С VCL, когда мы хотим добавить разделитель в меню, мы добавляем TMenuItem
с Caption := '-'
;
С FireMonkey добавляем TMenuItem
с Text := '-'
;
это работает, как ожидалось на платформе Windows, элемент с текстом='-' отображается в качестве разделителя.
но, когда я запускаю то же приложение на OSX, у меня минус видимый...
Я не нашел никакой собственности на TMenuItem
указать это разделитель...
Я пробовал с TMainMenu
и TMenuBar
(UseOSMenu := True|False;
) и у меня все еще есть эта проблема.
есть идея создать настоящий разделитель? (в противном случае я проверю ОС и удалю ее, если OSX...)
3 ответов
это ошибка в FireMonkey. Я уверен, что они решат эту проблему. Но между тем вы можете использовать приведенный ниже код. Вызовите процедуру FixSeparatorItemsForMac в событии OnActivate основной формы.
Не забудьте mac конкретных файлов в списке использует.
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}
Я никогда не программировал для Mac, и у меня нет Mac, но из любопытства я нашел документацию Apple об этом.
разделитель меню-это отключенный пустой пункт меню, возможно, вы можете подделать это:
separatorItem
возвращает пункт меню, используемый для разделения логических групп меню команды. + (NSMenuItem *)separatorItem возвращаемое значение
пункт меню, используемый для разделения логических групп команд меню.
Обсуждение
этот пункт меню отключен. Элемент разделителя по умолчанию-пустое пространство.
У меня нет возможности проверить это, но стоит попробовать.
по умолчанию FireMonkey создает собственные полностью стилизованные меню, но устанавливает TMenuBar.UseOSMenu свойство true и использует вызовы ОС для создания меню.
затем вы можете объединить это с Советом по созданию меню какао, уже обсужденных.
от http://docwiki.embarcadero.com/RADStudio/en/FireMonkey_Application_Design#Menus:
"настройка TMenuBar.Свойство UseOSMenu к True заставляет FireMonkey создавать дерево меню с вызовами ОС, в результате чего создается собственное меню. В Windows это меню находится в верхней части родительской формы и отображается с помощью текущей темы внешнего вида. На Mac OS X, меню отображается в глобальной строке меню в верхней части главного экрана всякий раз, когда приложение имеет фокус."