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

时间:2011-09-21 19:34:02

标签: delphi menuitem separator delphi-xe2 firemonkey

Windows 平台上,使用 VCL ,当我们要在菜单中添加分隔符时,我们会添加{{1} } TMenuItem;

使用 FireMonkey ,我们添加Caption := '-' TMenuItem;

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

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

我在Text := '-'上找不到任何属性来指定它是分隔符 ...

我尝试使用TMenuItemTMainMenuTMenuBar),我仍然遇到此问题。

想创建一个真正的分隔符吗?(否则,我会检查操作系统并在OSX中删除它...)

3 个答案:

答案 0 :(得分:4)

这是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}

答案 1 :(得分:0)

我从来没有为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

答案 2 :(得分:-1)

我没有测试这个的设施,但值得一试。

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

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

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

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