如何在Delphi XE2上添加对HTML帮助文件(.chm)的支持?

时间:2013-03-07 16:56:21

标签: delphi delphi-xe2 html-help

如何在Delphi XE2上添加对HTML帮助文件(.chm)的支持?我们需要在每个控件的HelpContext属性上使用A-links(A-keywords)来查找帮助页面。 Delphi XE2对单元HTMLHelpViewer的HTML帮助文件提供原生支持。但是如何使用呢?

3 个答案:

答案 0 :(得分:2)

F1跳转到上下文并不难。

选择Edit1并按F1。将打开帮助并显示Overview.htm。

enter image description here

前提条件。

enter image description here

Edit1帮助设置:

enter image description here

sample.chm来源设置。

sample.ali

IDH_Overview=Overview.htm
IDH_welcom=FirstTopic.htm
IDH_UsingtheMenus=Overview.htm

sample.h

#define IDH_Creating_Projects_and_Topics 1005
#define IDH_Overview 1003
#define IDH_UsingtheMenus 1009

Unit1.pas

unit Unit1;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, HTMLHelpViewer, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    HHALINKLOOKUP: TButton;
    JumpAnchor: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure HHALINKLOOKUPClick(Sender: TObject);
    procedure JumpAnchorClick(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
var
hpPath : string;
link : HH_AKLINK;

procedure TForm1.FormCreate(Sender: TObject);
begin
  hpPath := ExtractFilePath(Application.ExeName) +
    'HelpFile\sample.chm';
  Application.HelpFile := hpPath;
end;

procedure TForm1.HHALINKLOOKUPClick(Sender: TObject);
var
link : HH_AKLINK;
szUrl,szKey,szMsgText,szMsgTitle,szWindow : AnsiString;
begin
   szKey      := Edit1.Text; // 'UsingtheMenus';
   szUrl      :='Overview.htm';
   szMsgText  :='Error: Can''t find "'+Edit1.Text+'"!';
   szMsgTitle :='Error: HH_ALINK_LOOKUP';
   szWindow   :='main';

   with link do begin
   cbStruct    := sizeof(HH_AKLINK) ;
   fReserved   := False;
   pszKeywords := PChar(szKey);
   pszUrl      := nil;
   pszMsgText  := PChar(szMsgText);
   pszMsgTitle := PChar(szMsgTitle);
   pszWindow   := PChar(szWindow);
   fIndexOnFail:= False;
   end;
   HtmlHelpW(0, hpPath+'>main', HH_DISPLAY_TOPIC, DWORD_PTR(nil));
   HtmlHelpW(0, hpPath, HH_ALINK_LOOKUP, DWORD_PTR(@link));
end;

procedure TForm1.JumpAnchorClick(Sender: TObject);
begin
  HtmlHelpW(0, hpPath+'::/Overview.htm#'+Edit1.Text+'>main', HH_DISPLAY_TOPIC, DWORD(nil));
end;
end.

这是一个随时可用的sample.chm和源Download

有一个技巧,如何轻松地跳转,不仅仅跳转到.htm文件,而是直接跳转到锚点。

更改sample.ali

IDH_Overview=Overview.htm
IDH_welcom=FirstTopic.htm
IDH_UsingtheMenus=Overview.htm#UsingtheMenus

在该地方插入一个锚点,您想跳转到 Overview.htm

[...]
<A NAME="UsingtheMenus" </A>
<P><STRONG>Using the Menus and Toolbars</STRONG>
<P>The menus and toolbars provide a complete set of tools 
[...]

现在可以使用F1直接跳转到overview.htm中的所需点。

enter image description here

答案 1 :(得分:1)

我怀疑要使用A-links,您需要执行以下操作:

  1. 分配Application.OnHelp处理程序,如下所述。
  2. 在程序启动期间分配Application.HelpFile
  3. 如果您希望使用A-link调用帮助系统,请致电Application.HelpKeyword
  4. 为您希望响应上下文敏感的 F1 按键的任何GUI控件设置HelpKeyword属性。
  5. OnHelp处理程序如下所示:

    function TMainForm.ApplicationHelp(Command: Word; 
      Data: THelpEventData; var CallHelp: Boolean): Boolean;
    var
      Link: THH_AKLink;
      ALink: string;
    begin
      CallHelp := False;
      Result := True;
      //argh, WinHelp commands
      case Command of
      HELP_COMMAND:
        begin
          ZeroMemory(@Link, SizeOf(Link));
          Link.cbStruct := SizeOf(Link);
          ALink := PChar(Data); // we are going to re-purpose the keyword as an A-link
          Link.pszKeywords := PChar(AnsiString(ALink)); // seems we have to pass a PAnsiChar ..
          Link.fIndexOnFail := True;
          HtmlHelp(GetDesktopWindow, Application.HelpFile, HH_ALINK_LOOKUP, 
            DWORD_PTR(@Link));
        end;
      end;
    end;
    

    HtmlHelpViewer单元包含名为LookupALink的方法,它们执行相同的操作。但我不明白他们怎么会被召唤。

    上面的方法有点hacky,因为它将关键字解释为A-Links。如果你想要上下文敏感的帮助,我看不出你还能做什么。

答案 2 :(得分:0)

不确定Xe2查看器是如何工作的(我在2007年),但我只使用Microsoft HTML帮助API的Eric Granges端口,毫不奇怪,它被称为HTMLhelpAPI.pas。

您可以使用

功能调用Alink

ChmShowTopic(const filename,atopic:string):HWND;