【问题标题】:How to add menu items separators which work as expected on OSX?如何添加在 OSX 上按预期工作的菜单项分隔符?
【发布时间】:2011-09-21 19:34:02
【问题描述】:

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

使用 FireMonkey,我们添加了 TMenuItemText := '-'

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

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

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

我已尝试使用 TMainMenuTMenuBar (UseOSMenu := True|False;),但仍然遇到此问题。

有什么想法可以创建一个真正的分隔符吗?(否则,我会检查操作系统并在 OSX 时将其删除...)

【问题讨论】:

  • 我猜你应该在 QualityCentral 中报告这个。请记住,firemonkey 1.0 是第一个版本,因此可能还没有在 FMX-Mac 上实现类似的功能。
  • 这也是我的想法...因为这是v1,这就是我没有要求加速器的原因,因为我认为这根本没有实现...
  • @Warren P:我们开始...bug reported
  • 哦,来吧,他们肯定已经实现了分隔符和加速器。
  • 如果他们不在那里,我会将我的判断从预览版修改为 alpha 版。

标签: delphi menuitem separator delphi-xe2 firemonkey


【解决方案1】:

这是 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 下的应用程序菜单中添加项目吗...带有 Quit 的那个...(如果需要,我可以创建另一个问题...)
  • 是的。您可以在 Firemonkey 中创建有关菜单项的问题。但是当你发布它时通知我。
  • 这已在 Delphi XE2 Update 2 中修复。
【解决方案2】:

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

【讨论】:

  • 你在谈论可可。问题是关于 FireMonkey。
  • 是的,我知道,我说的是它是如何由 Cocoa 本地实现的。阅读该文档似乎可以安全地在 Firemonkey 中添加一个空白的禁用项目
  • FireMonkey 不使用 Cocoa。它们是无关的。
  • 以防万一...我试一试...但是,正如预期的那样,它只会生成一个空项目...而不是分隔符...
  • FireMonkey 使用本机操作系统菜单,不过,@David。
【解决方案3】:

我没有能力对此进行测试,但值得一试。

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

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

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

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

【讨论】:

  • 就像我说的,我已经用不同的对象对其进行了测试,并且我还尝试了 Cocoa 规范(我尝试过使用 TMainMenu 和 TMenuBar UseOSMenu := True|False;)和我仍然有这个问题。)它只是生成一个空项目......不是分隔符......我确认,它显示在全局菜单上(对于 TMainMenu 'TMenuBar UseOSMenu=true'
猜你喜欢
  • 1970-01-01
  • 2016-04-04
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多