2017-09-14 1 views
2

En exécutant mon application Firemonkey dans OSX, une zone de recherche apparaît automatiquement sur mon dernier élément de menu, que j'ai appelé «Aide». Jusqu'ici tout va bien, car un menu d'aide avec une boîte de recherche est standard pour OSX.TMainMenu - Gestion des éléments de menu Aide et Recherche

Ensuite, j'avais besoin d'ajouter un fichier d'aide. J'ai acheté un utilitaire impressionnant Help Crafter avec lequel j'ai très rapidement et facilement fait un Apple HelpBook. J'ai placé le bundle HelpBook dans le dossier Ressources de mon application principale. J'ai ensuite utilisé Project | Options | Version Info dans l'EDI pour éditer le fichier Info.plist. J'ai ajouté deux clés CFBundleHelpBookFolder et CFBundleHelpBookName à Info.plist pour pointer vers mon HelpBook.

En cours d'exécution de mon application, j'ai maintenant trouvé deux éléments du menu Aide: l'élément que j'avais programmé et un autre apparemment créé automatiquement par Mac OS, avec un sous-menu qui affiche mon HelpBook. À ma grande surprise, j'avais maintenant de l'aide au travail sans aucune codification.

Ensuite, je voulais supprimer l'élément de menu Aide que j'avais créé afin d'éliminer la duplication. Mais la boîte de recherche était toujours située sous mon élément de menu Aide, pas sur l'élément de menu Aide créé par le système d'exploitation. Et quand j'ai supprimé mon élément de menu Aide, la boîte de recherche a été déplacée vers ce qui était maintenant le dernier élément de menu créé par moi.

  1. Comment puis-je préciser que la zone de recherche doit se trouver sur le système d'exploitation créé Aide élément de menu?

  2. Sinon, puis-je spécifier que le système d'exploitation ne doit pas créer automatiquement un élément de menu Aide (pour que je puisse le créer moi-même)? Dans ce cas, j'aurais aussi besoin de savoir comment programmer le chargement du HelpBook.

  3. Si je m'en tiens à l'élément de menu Aide créé par le système d'exploitation, comment puis-je ajouter éléments de sous-menu supplémentaires?

Il apparaît à partir de Apple documentation que les fonctions d'aide et de recherche sont fournies par le système d'exploitation lorsqu'un fichier d'aide a été enregistré. Mais les deux fonctions sont supposées être sur le même élément de menu. Je me demande si cela peut être un bug Firemonkey qu'ils sont en train de se séparer.

Répondre

0

Il y avait trois parties à ma question ci-dessus. Je n'ai pas eu de chance avec 1 et 3, mais j'ai une solution partielle à 2.

Pour éviter que le système d'exploitation crée automatiquement un menu d'aide, il était seulement nécessaire de supprimer les clés CFBundleHelpBookFolder et CFBundleHelpBookName dans Info.plist. L'enregistrement de l'didacte a ensuite été accompli en FormCreate avec:

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} 

Pour ouvrir le didacte, j'ai placé le code suivant dans l'événement OnClick de l'élément de sous-menu approprié (c.-à-Aide | MyApp Aide):

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

Cette approche a entraîné l'ajout automatique du champ Spotlight for Help au menu Aide. Malheureusement, Spotlight for Help n'indexe plus mon HelpBook. Avec l'approche que j'avais d'abord essayée (en utilisant Info.plist comme décrit dans mon article original), Spotlight for Help a indexé mon HelpBook mais, comme je l'ai signalé, le champ Spotlight a été créé sur dernier élément de menu et l'aide était sur un nouveau élément de menu créé automatiquement par le système d'exploitation, qui, bien que fonctionnel, n'est pas standard.