Delphi 如何添加在OSX上正常工作的菜单项分隔符?

Delphi 如何添加在OSX上正常工作的菜单项分隔符?,delphi,menuitem,separator,delphi-xe2,firemonkey,Delphi,Menuitem,Separator,Delphi Xe2,Firemonkey,在Windows平台上,使用VCL,当我们想在菜单中添加一个分隔符时,我们添加一个TMenuItem,标题为:='-' 使用FireMonkey,我们添加了一个TMenuItem,其中包含文本:='-' 它在Windows平台上正常工作,文本为“-”的项显示为分隔符 但是,当我在OSX上运行相同的应用程序时,我看到了负号 我没有在TMenuItem上找到任何属性来指定它是一个分隔符 我试过使用TMainMenu和TMenuBar(UseOSMenu:=True | False;)但仍然存在此问题

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

使用FireMonkey,我们添加了一个
TMenuItem
,其中包含
文本:='-'

它在Windows平台上正常工作,文本为“-”的项显示为分隔符

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

我没有在
TMenuItem
上找到任何属性来指定它是一个分隔符

我试过使用
TMainMenu
TMenuBar
UseOSMenu:=True | False;
)但仍然存在此问题


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

我从来没有为Mac编程过,我也没有Mac电脑,但出于好奇,我找到了一些关于它的苹果文档

菜单分隔符项是一个已禁用的空白菜单项,您可以使用该项进行伪装:

分离机

返回用于分隔菜单逻辑组的菜单项 命令。 +(NSMenuItem*)分隔项返回值

用于分隔菜单命令逻辑组的菜单项

讨论

此菜单项已禁用。默认分隔符项为空白


(发件人:)

我没有测试此功能的设备,但值得一试

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

然后,您可以将其与前面讨论的创建可可菜单的建议结合起来

发件人:


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

这是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}
使用
...
{$IFDEF MACOS}
ObjectiveC,MACAPI,AppKit,MACAPI,基金会,FMX.Platform.Mac
{$ENDIF}
{$IFDEF MACOS}
程序FIXSeparatorItemsFormenItem(MenuItem:NSMenuItem);
varⅠ:整数;
分项:NSMenuItem;
开始
如果(MenuItem.hasSubmenu=false),则退出;
对于i:=0到MenuItem.submenu.itemArray.count-1 do
开始
子项:=菜单项子菜单项索引(i);
如果(subItem.title.isEqualToString(NSSTR('-'))=true),则
开始
菜单项子菜单删除菜单项(i);
MenuItem.submenu.insertItem(TNSMenuItem.Wrap(TNSMenuItem.OCClass.separatorItem),i);
结束,否则开始
固定分离机项目固定分离机项目(子项);
结束;
结束;
结束;
程序FixSeparatorItemsForMac;
var-NSApp:NSApplication;
主菜单:NSMenu;
应用项目:NSMenuItem;
i:整数;
开始
NSApp:=TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication);
MainMenu:=NSApp.MainMenu;
如果(主菜单无),则
开始
对于i:=0到MainMenu.itemArray.count-1 do
开始
AppItem:=主菜单项索引(i);
固定分离机项目固定分离机项目(AppItem);
结束;
结束;
结束;
{$ENDIF}

我想你应该在QualityCentral中报告这一点。记住firemonkey 1.0是第一个版本,所以有些类似的东西可能还没有在FMX-Mac上实现。这也是我的想法……因为这是一个v1,这就是为什么我没有要求加速器,因为我认为这根本没有实现…@Warren P:这里我们继续…哦,来吧,他们肯定已经实现了分离器和加速器。如果他们不在那里,我会将我的结论从预览版修改为alpha版。你在谈论Cocoa。问题是关于FireMonkey。是的,我知道,我在谈论Cocoa是如何在本地实现的。阅读这些文档似乎可以安全地添加FiremonkeyFireMonkey中的空白禁用项不使用Cocoa。它们是不相关的。以防万一……我会尝试一下……但是,正如预期的那样,它只生成一个空项……而不是分隔符……FireMonkey使用本机操作系统菜单,@David。正如我所说,我已经用不同的对象对其进行了测试,而且我也尝试了Cocoa规范(我尝试使用TMainMenu和TMenuBar UseOSMenu:=True | False;)但仍然存在此问题。)它只生成一个空项…不是分隔符…我确认,它显示在全局菜单上(对于TMainMenu和'TMenuBar with UseOSMenu=true'来说,它工作得非常好!谢谢!你知道如何在Mac下的应用程序菜单中添加项吗?…带有Quit…(如果需要,我可以创建另一个问题…)是的。你可以在Firemonkey中创建一个关于菜单项的问题。但是发布时不要告诉我。这在Delphi XE2 Update 2中得到了修复。