Fichier CHM et HHCTRL.OCX

Fichier CHM et HHCTRL.OCX - Delphi/Pascal - Programmation

Marsh Posté le 25-11-2005 à 18:50:24    

Bonjour à tous...
 
Je suis en train de développer un logiciel dans lequel j'ai besoin d'ouvrir des fichiers d'aide CHM. J'ai presque atteinds mon but en utilisant l'ocx HHCTRL de la façon suivante :
 

Code :
  1. //szPath : le fichier CHM à ouvrir
  2. //szParams : le mot recherché dans l'index
  3. iHdle := LoadLibrary('HHCTRL.OCX');
  4. @HtmlHelp := GetProcAddress(iHdle,'HtmlHelpA');
  5. iHelpHdle := HtmlHelp(0, PChar(szPath), HH_DISPLAY_INDEX, Cardinal(PChar(szParams)));


 
Ceci à bien pour effet d'ouvrir le fichier CHM et de mettre le mot (szParams) dans la zone de saisie de l'onglet Index, mais je souhaite maintenant que la section correspondante au mot recherché soit directement affichée (en gros faire comme si l'utilisateur avait cliqué sur le bouton afficher).
 
Voilà...j'attends vos pistes et solutions...
 
Par avance merci.

Reply

Marsh Posté le 25-11-2005 à 18:50:24   

Reply

Marsh Posté le 25-11-2005 à 20:54:20    

Il suffit de lancer hh.exe avec certains paramètres il me semble :??:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-11-2005 à 00:49:38    

Je pense pas qu'on puisse appeler directement l'exe avec des paramètres, en tout cas j'ai rien trouvé sur le net dans ce sens. J'ai quand même fini par trouver quelque chose.
 
Voici la solution (en tout cas une solution) :
 
1. Utiliser la fonction HtmlHelpA de l'ocx HHCTRL. Dans les exemples trouvés sur Internet la fonction est généralement liée en statique.
 

Code :
  1. function HtmlHelp(hwndCaller: HWND; pszFile: PChar; uCommand: UINT; dwData: DWORD): HWND; stdcall; external 'HHCTRL.OCX' name 'HtmlHelpA';


 
Mais il est également possible de lier dynamiquement la fonction.
 
2. Définir les variables d'appels aux commandes de HtmlHelp.
 

Code :
  1. HH_DISPLAY_TOPIC        = $0000;
  2. HH_HELP_FINDER          = $0000;
  3. HH_DISPLAY_TOC          = $0001;
  4. HH_DISPLAY_INDEX        = $0002;
  5. HH_DISPLAY_SEARCH       = $0003;
  6. HH_SET_WIN_TYPE         = $0004;
  7. HH_GET_WIN_TYPE         = $0005;
  8. HH_GET_WIN_HANDLE       = $0006;
  9. HH_ENUM_INFO_TYPE       = $0007;
  10. HH_SET_INFO_TYPE        = $0008;
  11. HH_SYNC                 = $0009;
  12. HH_KEYWORD_LOOKUP       = $000D;
  13. HH_DISPLAY_TEXT_POPUP   = $000E;
  14. HH_HELP_CONTEXT         = $000F;
  15. HH_TP_HELP_CONTEXTMENU  = $0010;
  16. HH_TP_HELP_WM_HELP      = $0011;
  17. HH_CLOSE_ALL            = $0012;
  18. HH_ALINK_LOOKUP         = $0013;
  19. HH_GET_LAST_ERROR       = $0014;
  20. HH_ENUM_CATEGORY        = $0015;
  21. HH_ENUM_CATEGORY_IT     = $0016;
  22. HH_RESET_IT_FILTER      = $0017;
  23. HH_SET_INCLUSIVE_FILTER = $0018;
  24. HH_SET_EXCLUSIVE_FILTER = $0019;
  25. HH_INITIALIZE           = $001C;
  26. HH_UNINITIALIZE         = $001D;
  27. HH_PRETRANSLATEMESSAGE  = $00FD;
  28. HH_SET_GLOBAL_PROPERTY  = $00FC;


 
Toutes ces commandes sont disponibles mais HH_DISPLAY_TOC et HH_KEYWORD_LOOKUP suffisent.
 
3. Définir la structure qui va être passé en paramètre de l'appel HH_KEYWORD_LOOKUP
 

Code :
  1. tagHH_AKLINK = record
  2.     cbStruct : Integer;
  3.     fReserved : Boolean;
  4.     pszKeywords : Cardinal;
  5.     pszUrl : Cardinal;
  6.     pszMsgText : Cardinal;
  7.     pszMsgTitle : Cardinal;
  8.     pszWindow : Cardinal;
  9.     fIndexOnFail : Boolean;
  10.   end;
  11.   HH_AKLINK = tagHH_AKLINK;
  12.   PHH_AKLINK = ^HH_AKLINK;


 
4. Remplir la structure HH_AKLINK
 

Code :
  1. iLink : PHH_AKLINK;
  2.       ...
  3.       new(iLink);
  4.       iLink.cbStruct := SizeOf(HH_AKLINK);
  5.       iLink.fReserved := False;
  6.       iLink.pszKeywords := Cardinal(PChar(szParams));
  7.       iLink.pszUrl := 0;
  8.       iLink.pszMsgText := 0;
  9.       iLink.pszMsgTitle := 0;
  10.       iLink.pszWindow := Cardinal(PChar('main'));
  11.       iLink.fIndexOnFail := True;


 
5. Ouvrir l'aide grâce à ces deux appels :
 

Code :
  1. HtmlHelp(0, PChar(szPath), HH_DISPLAY_TOC, 0);
  2. HtmlHelp(0, PChar(szPath), HH_KEYWORD_LOOKUP, Cardinal(iLink));


 
Avec szParams le mot recherché et szPath le chemin vers le fichier CHM.
 
HtmlHelp renvoie le handle de l'aide. Il est donc possible de tester si l'aide a pu être ouverte en regardant si le handle n'est pas nul.
 
Voilà vous savez tout, de l'aide est dispo aux adresses suivantes :
 
http://www.paranoia.clara.net/arti [...] _help.html
http://msdn.microsoft.com/library/ [...] lookup.asp
http://msdn.microsoft.com/library/ [...] aklink.asp (explique comment remplir la structure)
http://bdn.borland.com/article/0,1410,27842,00.html

Message cité 1 fois
Message édité par Tetranos le 26-11-2005 à 00:53:42
Reply

Marsh Posté le 26-11-2005 à 10:29:05    

Tetranos a écrit :

Je pense pas qu'on puisse appeler directement l'exe avec des paramètres, en tout cas j'ai rien trouvé sur le net dans ce sens.


 
Il y a des paramètres, c'est sûr.  
Pour lancer l'aide sur une rubrique précise il y a ceci que j'ai utilisé :
  Format('hh.exe -mapid %d %s', [HelpContext, strHelpFile])
Je ne suis plus sûr par contre qu'on peut passer un mot clé.  
Mais il y a ça sinon :
http://www.keyworks.net/keyhh.htm
Enfin, ta solution est probablement meilleure, merci de l'avoir postée ;)


Message édité par antp le 26-11-2005 à 10:29:38

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 04-01-2006 à 18:42:47    

Désolé de remonter ce message mais la solution que j'ai donnée n'est pas totalement juste alors voici une précision.
 
En fait j'avais mal défini la structure ce qui provoque une erreur aléatoire. Voici comment la structure doit réellement être définie
 

Code :
  1. tagHH_AKLINK = record
  2.     cbStruct : Integer;
  3.     fReserved : BOOL;
  4.     pszKeywords : LPCTSTR;
  5.     pszUrl : LPCTSTR;
  6.     pszMsgText : LPCTSTR;
  7.     pszMsgTitle : LPCTSTR;
  8.     pszWindow : LPCTSTR;
  9.     fIndexOnFail : BOOL;
  10.   end;

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed