2017-09-14 21 views
2

在OSX中運行我的Firemonkey應用程序時,搜索框自動出現在我最後一個菜單項上,我標記爲「幫助」。到目前爲止,這很好,因爲帶有搜索框的「幫助」菜單是OSX的標準配置。TMainMenu - 管理幫助和搜索菜單項

接下來,我需要添加一個幫助文件。我購買了令人印象深刻的實用程序Help Crafter,我可以非常快速,輕鬆地製作Apple HelpBook。我將HelpBook軟件包放入我的主應用程序的Resources文件夾中。然後,我使用IDE中的Project | Options | Version Info來編輯Info.plist文件。我在Info.plist中添加了兩個鍵CFBundleHelpBookFolder和CFBundleHelpBookName指向我的幫助手冊。

運行我的應用程序,我現在發現我有兩個幫助菜單項 - 我已編程的項目,另一個顯然是由Mac OS自動創建的,並帶有一個子菜單項,可以顯示我的幫助手冊。令我驚訝的是,我現在有工作上的幫助,沒有任何編碼。

接下來,我想刪除我創建的幫助菜單項以消除重複。但搜索框仍然位於我的幫助菜單項下,而不是由操作系統創建的幫助菜單項。當我刪除我的幫助菜單項時,搜索框重新定位到現在是我創建的最後一個菜單項。

  1. 我怎麼可以指定搜索框應位於OS創建 幫助菜單項?

  2. 或者,我可以指定操作系統不應該自動創建一個幫助菜單項(以便我可以自己創建它)嗎?在那 的情況下,我還需要知道如何編程加載 幫助手冊。

  3. 如果我堅持使用操作系統創建的幫助菜單項,如何將 附加子菜單項添加到它?

Apple documentation看來,幫助和搜索功能是由操作系統在註冊幫助手冊時提供的。但是這兩個功能應該在同一個菜單項上。我想知道如果這可能是一個Firemonkey錯誤,他們正在分裂。

回答

0

上面我的問題有三個部分。我有1和3沒有運氣,但我有一個部分解決方案2.

爲了防止操作系統自動創建一個幫助菜單,只需要刪除Info.plist中的CFBundleHelpBookFolder和CFBundleHelpBookName鍵。該HelpBook的登記,然後在FORMCREATE完成與:

var 
{$IFDEF MACOS} 
    HelpBundle: NSBundle; 
    AppBundle: NSBundle; 
    Path: string; 
    HelpReg: Boolean; 
{$ENDIF} 
begin 
{$IFDEF MACOS} 
    HelpMgr := TNSHelpManager.Create; // HelpMgr declared as a global variable 
    AppBundle := TNSBundle.Wrap(TNSBundle.OCClass.mainBundle); 
    Path := AppBundle.bundlePath.UTF8String + 
    '/Contents/Resources/MyAppHelp.help'; 
    HelpBundle := TNSBundle.Wrap(TNSBundle.OCClass.bundleWithPath(StrToNSSTR(Path))); 
    HelpReg := HelpMgr.registerBooksInBundle(HelpBundle); 
    if not(HelpReg) then 
    ShowMessage('Failed to register Help Book'); 
{$ENDIF} 

要打開HelpBook,我把下面的代碼在適當的子菜單項的OnClick事件(即幫助| MyApp的幫助):

HelpMgr.openHelpAnchor(StrToNSSTR('Page0'), 
     StrToNSSTR('com.mycompany.myapp.help')); 

此方法導致Spotlight for Help字段自動添加到幫助菜單。不幸的是,Spotlight for Help不再索引我的幫助手冊。使用我第一次嘗試的方法(使用Info.plist,如我的原始文章中所述),Spotlight for Help確實索引了我的幫助手冊,但據我所知,Spotlight字段是在我的最後一個菜單項上創建的,幫助是在新的操作系統自動創建的菜單項,雖然功能是非標準的。