1

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

4

3 回答 3

2

F1跳转到上下文并不难。

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

在此处输入图像描述

先决条件。

在此处输入图像描述

Edit1 帮助设置:

在此处输入图像描述

sample.chm 源设置。

示例.ali

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

样本.h

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

单元1.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 和源下载

有一个技巧如何轻松地跳转,不仅可以跳转到 .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 中的所需点。

在此处输入图像描述

于 2013-03-29T14:04:59.643 回答
1

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

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

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。如果您需要上下文相关的帮助,我看不出您还能做什么。

于 2013-03-07T17:02:00.410 回答
0

不确定 Xe2 查看器的工作原理(我在 2007 年),但我只使用 Microsoft HTML 帮助 API 的 Eric Granges 端口,不出所料,它被称为 HTMLhelpAPI.pas。

您可以使用该函数调用 Alink

ChmShowTopic(常量文件名,主题:字符串):HWND;

于 2013-03-08T10:54:54.063 回答