如何添加在OSX上按预期工作的菜单项分隔符?

Windows平台上,使用VCL ,当我们想在菜单中添加分隔符时,我们添加一个带有Caption := '-'TMenuItem Caption := '-' ;

使用FireMonkey ,我们添加一个带有Text := '-'TMenuItem ;

它在Windows平台上按预期工作,具有Text =' - '的项目显示为分隔符。

但是,当我在OSX上运行相同的应用程序时,我可以看到减号...

我没有发现任何属性在TMenuItem指定它是一个分隔符 ...

我曾尝试使用TMainMenuTMenuBarUseOSMenu := True|False; ),但我仍然遇到此问题。

任何想法创建一个真正的分隔符? (否则,我将检查操作系统并将其删除,如果OSX ...)


这是FireMonkey中的一个错误。 我相信他们会解决它。 但同时你可以使用下面的代码。 在主窗体的OnActivate事件中调用过程FixSeparatorItemsForMac。

不要忘记使用列表中的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返回值

一个菜单项,用于分隔菜单命令的逻辑组。

讨论

该菜单项被禁用。 默认分隔符项目是空格。

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


我没有这方面的测试设备,但值得一试。

默认情况下,FireMonkey创建它自己的完全样式菜单,但将TMenuBar.UseOSMenu属性设置为true,并使用OS调用来创建菜单。

然后,您可以将其与创建已经讨论过的Cocoa菜单的建议结合起来。

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

“将TMenuBar.UseOSMenu属性设置为True将导致FireMonkey创建带有OS调用的菜单树,从而生成本机菜单。在Windows上,此菜单位于父窗体的顶部,并使用当前的外观主题显示。 OS X,只要应用程序拥有焦点,菜单将显示在主屏幕顶部的全局菜单栏中。“

链接地址: http://www.djcxy.com/p/91069.html

上一篇: How to add menu items separators which work as expected on OSX?

下一篇: Delphi Dynamic Menu Items