如何在 Delphi XE2 上添加对 HTML 帮助文件 (.chm) 的支持?我们需要在HelpContext
每个控件的属性上使用 A 链接(A 关键字)来查找帮助页面。Delphi XE2 按单元原生支持 HTML 帮助文件HTMLHelpViewer
。但是如何使用呢?
问问题
6013 次
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 链接,您需要执行以下操作:
Application.OnHelp
如下所述分配处理程序。Application.HelpFile
在程序启动期间分配。Application.HelpKeyword
如果您希望使用 A 链接调用帮助系统,请致电。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 回答