9

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

使用FireMonkey,我们添加 aTMenuItem和 a Text := '-';

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

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

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

我已经尝试使用 aTMainMenuTMenuBar( UseOSMenu := True|False;) ,但我仍然有这个问题。

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

4

3 回答 3

5

这是 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}
于 2011-10-02T19:58:40.323 回答
0

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

Menu Separator 项是一个禁用的空白菜单项,也许你可以用它来伪造:

分隔项

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

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

讨论

此菜单项已禁用。默认分隔符项是空格。

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

于 2011-09-21T22:51:17.047 回答
-1

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

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

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

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

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

于 2011-09-22T22:55:41.663 回答