簡體   English   中英

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

[英]How to add support of HTML help files (.chm) on Delphi XE2?

如何在Delphi XE2上添加對HTML幫助文件(.chm)的支持? 我們需要在每個控件的HelpContext屬性上使用A-links(A-keywords)來查找幫助頁面。 Delphi XE2由HTMLHelpViewer單元支持HTML幫助文件。 但是怎么用呢?

F1跳到上下文並不難。

選擇Edit1並按F1 將打開幫助並顯示Overview.htm。

在此輸入圖像描述

前提條件。

在此輸入圖像描述

Edit1幫助設置:

在此輸入圖像描述

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和源代碼下載

有一個技巧如何輕松跳轉,不僅僅跳轉到.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直接跳到o​​verview.htm中的所需點。

在此輸入圖像描述

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

  1. 分配Application.OnHelp處理程序,如下所述。
  2. 在程序啟動期間分配Application.HelpFile
  3. 如果要使用A-link調用幫助系統,請調用Application.HelpKeyword
  4. 為要響應上下文相關的F1鍵按下的任何GUI控件設置HelpKeyword屬性。

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。 如果你想要上下文敏感的幫助,我看不出你還能做些什么。

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

您可以使用該功能調用Alink

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM