TMainMenu — управление пунктами меню «Справка» и «Поиск»

Запустив мое приложение Firemonkey в OSX, поле поиска автоматически появляется в моем последнем пункте меню, который я назвал «Справка». Пока все хорошо, потому что меню справки с полем поиска является стандартным для OSX.

Затем мне нужно было добавить файл справки. Я купил впечатляющую утилиту Help Crafter, с помощью которой я очень быстро и легко создал справочную книгу Apple. Я поместил пакет HelpBook в папку «Ресурсы» моего основного приложения. Затем я использовал Project|Options|Version Info в IDE для редактирования файла Info.plist. Я добавил два ключа CFBundleHelpBookFolder и CFBundleHelpBookName в Info.plist, чтобы они указывали на мою справочную книгу.

Запустив мое приложение, я обнаружил, что у меня есть два пункта меню «Справка» — пункт, который я запрограммировал, и другой, по-видимому, автоматически созданный Mac OS, дополненный пунктом подменю, который вызывает мою справочную книгу. К моему удивлению, теперь у меня была работающая помощь без какого-либо кодирования.

Затем я хотел удалить пункт меню «Справка», который я создал, чтобы устранить дублирование. Но поле поиска по-прежнему находилось в моем пункте меню «Справка», а не в пункте меню «Справка», созданном ОС. И когда я удалил свой пункт меню «Справка», поле поиска переместилось в то, что теперь было последним пунктом меню, созданным мной.

  1. Как я могу указать, что поле поиска должно быть расположено в пункте меню «Справка», созданном ОС?

  2. В качестве альтернативы можно ли указать, что ОС не должна автоматически создавать пункт меню «Справка» (чтобы я мог создать его сам)? В этом случае мне также нужно знать, как запрограммировать загрузку HelpBook.

  3. Если я придерживаюсь пункта меню «Справка», созданного ОС, как я могу добавить к нему дополнительные элементы подменю?

Он появляется из Документация Apple о том, что функции справки и поиска предоставляются операционной системой при регистрации справочной книги. Но две функции должны находиться в одном и том же пункте меню. Мне интересно, может ли это быть ошибкой Firemonkey, что они разделены.


person Duns    schedule 14.09.2017    source источник


Ответы (1)


Мой вопрос выше состоял из трех частей. Мне не повезло с 1 и 3, но у меня есть частичное решение 2.

Чтобы ОС автоматически не создавала меню справки, нужно было всего лишь удалить ключи CFBundleHelpBookFolder и CFBundleHelpBookName в Info.plist. Затем регистрация 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 соответствующего пункта подменю (например, Help | MyApp Help):

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

Этот подход привел к Spotlight for Help автоматически добавляется в меню "Справка". К сожалению, Spotlight for Help больше не индексирует мою справочную книгу. С подходом, который я впервые попробовал (используя Info.plist, как описано в моем исходном посте), Spotlight for Help проиндексировал мою справочную книгу, но, как я сообщил, поле Spotlight было создано в моем последнем пункте меню. а справка находилась в новом пункте меню, автоматически созданном операционной системой, который, несмотря на свою функциональность, не является стандартным.

person Duns    schedule 18.09.2017