Как добавить разделители пунктов меню, которые работают как положено в OSX? - PullRequest
8 голосов
/ 21 сентября 2011

На Windows платформе с VCL , когда мы хотим добавить разделитель в меню, мы добавляем TMenuItem с Caption := '-';

С помощью FireMonkey мы добавляем TMenuItem с Text := '-';

На платформе Windows работает, как и ожидалось, элемент с текстом = '-' отображается как разделитель.

Но когда я запускаю одно и то же приложение на OSX , у меня появляется знак минуса ...

Я не нашел ни одного свойства в TMenuItem, чтобы указать, что это разделитель ...

Я пробовал с TMainMenu и TMenuBar (UseOSMenu := True|False;), и у меня все еще есть эта проблема.

Есть идеи создать настоящий разделитель? (в противном случае я проверю ОС и удалю ее, если OSX ...)

Ответы [ 3 ]

4 голосов
/ 02 октября 2011

Это ошибка в 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}
0 голосов
/ 23 сентября 2011

У меня нет возможности проверить это, но стоит попробовать.

По умолчанию FireMonkey создает свои собственные полностью стилизованные меню, но для свойства TMenuBar.UseOSMenu устанавливается значение true, и для создания меню используются вызовы ОС.

Затем вы можете объединить это с советом по созданию меню какао, которое уже обсуждалось.

С http://docwiki.embarcadero.com/RADStudio/en/FireMonkey_Application_Design#Menus:

"Если для свойства TMenuBar.UseOSMenu установлено значение True, FireMonkey создает дерево меню с вызовами ОС, в результате чего получается собственное меню. В Windows это меню находится в верхней части родительской формы и отображается с использованием текущей темы оформления. . В Mac OS X меню отображается в строке глобального меню в верхней части главного экрана, когда приложение находится в фокусе. "

0 голосов
/ 22 сентября 2011

Я никогда не программировал для Mac, и у меня никогда не было Mac, но из любопытства я нашел некоторую документацию Apple об этом.

Элемент Разделитель меню - это отключенный пустой элемент меню, может быть, выможет подделать с этим:

separatorItem

Возвращает элемент меню, который используется для разделения логических групп команд меню.+ (NSMenuItem *) separatorItem Возвращаемое значение

Элемент меню, который используется для разделения логических групп команд меню.

Обсуждение

Этот элемент меню отключен.Разделителем по умолчанию является пустое пространство.

(От: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSMenuItem_Class/Reference/Reference.html#//apple_ref/doc/c_ref/NSMenuItem)

...