Как добавить разделители пунктов меню, которые работают должным образом в OSX?

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

В FireMonkey мы добавляем TMenuItem к Text := '-';

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

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

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

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

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


person Whiler    schedule 21.09.2011    source источник
comment
Я предполагаю, что вы должны сообщить об этом в QualityCentral. Помните, что firemonkey 1.0 — это первый выпуск, поэтому есть такие вещи, которые, вероятно, еще не реализованы на FMX-Mac.   -  person Warren P    schedule 22.09.2011
comment
Я тоже так думаю... Поскольку это v1, я не просил ускоритель, потому что я думаю, что он вообще не реализован...   -  person Whiler    schedule 22.09.2011
comment
@Warren P: Ну вот... сообщено об ошибке   -  person Whiler    schedule 22.09.2011
comment
О, да ладно, наверняка они внедрили разделители и ускорители.   -  person David Heffernan    schedule 22.09.2011
comment
@David: Если найдешь ускорители, дай мне знать ;о)   -  person Whiler    schedule 22.09.2011
comment
Если их там нет, я пересмотрю свой вердикт с предварительного выпуска на альфа-версию.   -  person David Heffernan    schedule 22.09.2011
comment
@David Heffernan: Насколько мне известно, в OSX (Carbon) не существует концепции ускорителей, в ней есть только сочетания клавиш (комбо). Для меня это звучит как кроссплатформенный подход, а затем оптимизация для каждой платформы.   -  person Paul-Jan    schedule 22.09.2011


Ответы (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}
person mehmed.ali    schedule 02.10.2011
comment
Он работает отлично! Спасибо! Знаете ли вы, как добавлять элементы в меню приложений под Mac... тот, что с кнопкой "Выход"... (при необходимости могу создать еще один вопрос...) - person Whiler; 03.10.2011
comment
Да Вилер. Вы можете создать вопрос о пунктах меню в Firemonkey. Но сообщите мне, когда вы опубликуете это. - person mehmed.ali; 03.10.2011
comment
Готово; o) - person Whiler; 03.10.2011
comment
Это было исправлено в Delphi XE2 Update 2. - person Marcus Adams; 06.11.2011

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

Элемент «Разделитель меню» — это отключенный пустой элемент меню, возможно, вы можете сымитировать его:

разделительЭлемент

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

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

Обсуждение

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

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

person Daniel Luyo    schedule 21.09.2011
comment
Вы говорите о какао. Вопрос про FireMonkey. - person David Heffernan; 22.09.2011
comment
Да, я знаю, я говорю о том, как это реализовано в Cocoa. Чтение этой документации кажется безопасным для добавления пустого отключенного элемента в Firemonkey. - person Daniel Luyo; 22.09.2011
comment
FireMonkey не использует Cocoa. Они не связаны. - person David Heffernan; 22.09.2011
comment
На всякий случай... Я попробую... но, как и ожидалось, он просто генерирует пустой элемент... не разделитель... - person Whiler; 22.09.2011
comment
Однако FireMonkey использует собственные меню ОС, @David. - person David; 22.09.2011

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

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

Затем вы можете объединить это с уже обсуждавшимся советом по созданию меню Cocoa.

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

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

person Mike Sutton    schedule 22.09.2011
comment
Как я уже сказал, я уже тестировал его с различными объектами, а также пробовал со спецификацией Cocoa (я пробовал с TMainMenu и TMenuBar UseOSMenu := True|False;), и у меня все еще есть эта проблема.) Он просто генерирует пустой элемент... не разделитель... Подтверждаю, он отображается в глобальном меню (для TMainMenu и 'TMenuBar with UseOSMenu=true' - person Whiler; 23.09.2011