Delphi XE2 で HTML ヘルプ ファイル (.chm) のサポートを追加するにはどうすればよいですか? HelpContext
ヘルプ ページを検索するには、すべてのコントロールのプロパティでA リンク (A キーワード) を使用する必要があります。Delphi XE2 では、ユニットごとに HTML ヘルプ ファイルをネイティブでサポートしていますHTMLHelpViewer
。しかし、それをどのように使用するのですか?
3 に答える
F1
コンテキストへのジャンプは難しくありません。
Edit1 を選択し、 を押しF1
ます。ヘルプが開き、Overview.htm が表示されます。
前提条件。
Edit1 ヘルプ設定:
sample.chm ソース設定。
sample.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
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 とソースのダウンロードは次のとおりです。
.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 の目的のポイントに直接ジャンプできるようになりました。
Aリンクを使用するには、次のことを行う必要があると思います。
Application.OnHelp
以下の説明に従ってハンドラーを割り当てます。Application.HelpFile
プログラムの起動時に割り当てます。Application.HelpKeyword
Aリンクを使用してヘルプシステムを呼び出す場合は、を呼び出します。- 状況依存のキー押下
HelpKeyword
に応答するGUIコントロールのプロパティを設定します。F1
ハンドラーは次の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
ています。しかし、どうやって彼らを呼ぶことができるのかわかりません。
上記のアプローチは、キーワードをAリンクとして解釈するため、少しハッキーです。状況依存のヘルプが必要な場合、他に何ができるかわかりません。
Xe2 ビューアーがどのように機能するかはわかりませんが (私は 2007 年です)、Microsoft HTML ヘルプ API の Eric Granges ポートを使用しているだけです。
関数を使用して Alink を呼び出すことができます
ChmShowTopic(const filename,atopic:string):HWND;