TOPページへ戻る  PCページへ戻る  一覧へ戻る

HTMLHelpの呼び出し方

Windows3.1から使用されている軽いWinHelp(*.hlp)に対し、Windows95+IE4以上の環境で 使用可能なHTMLHelp(*.chm)があります。DelphiではWinHelpをApplication.HelpCommandで 呼び出すことができますが、HTMLHelpを呼び出すコードが実装されていません。 ここでは、HTMLHelpをDelphiで呼び出す方法に関して説明します。
(参考:[Delphi-ML:80941] Re: Ddlphi6 で、HTML HELPを呼び出す方法

Delphiでは、HTMLHelpを呼び出すWindowsAPIを使います。このAPIはhhctrl.ocxに HtmlHelpAという関数で実装されています。そのため、HTMLHelpを呼び出すには、 DLLを使用する場合と同じことを行います。
(Delphi2005以上では、DLLのロード/アンロードは不要で、HtmlHelpコマンドでHtmlHelpを起動できます。)

具体的には下のようになります。これは、Formにボタンが1つ配置されていて、 そのボタンを押すとヘルプファイル(help.chm)が表示されるアプリケーションです。 hhctrl.ocxを静的にリンクしています。


unit Unit1;

interface

uses
  Windows, SysUtils, Classes, Controls, Forms, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

// hhctrl.ocxからHtmlHelpAを静的にリンク
function HtmlHelpA(hwndCaller:Integer;		// アプリケーションのハンドル
                   pszFile:PChar;		// ヘルプファイルの文字列のポインタ
                   uCommand:Integer;		// アクション
                   dwData:Integer		// マップ番号、トピックのポインタなど
		   ):Integer;stdcall;external 'hhctrl.ocx';

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
HtmlHelpA(Application.Handle, PChar('help.chm'), 1, 0);	// uCommandの1はHH_DISPLAY_TOC(目次を表示)
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
HtmlHelpA(0, nil, 18, 0);		// uCommandの0はHH_CLOSE_ALL
end;					// この場合、他の引数に0,nilを渡す

end.

上の例では、HtmlHelpA APIを使うためにhhctrl.ocxを静的にリンクしています。 静的リンクでは、アプリケーション起動時にhhctrl.ocxをリンクすることになります。 無事にリンクされた後は、HtmlHelpA関数をDelphiで定義された関数 として使用することができます。

HtmlHelpA関数は、第一引数(hwndCaller)にアプリケーションのハンドルを、 第二引数(pszFile)にヘルプファイル文字列のポインタ(PChar)を渡します。 第三引数(uCommand)はヘルプのアクションを整数で指定します (アクションはこちらを参照)。 第四引数(dwData)にはマップファイルの整数や、キーワードをPCharとDWORDでキャストした整数が入ります。

※これまではHtmlHelp関数に渡すハンドルを単にHandleと記述していたため、アプリケーションのではなくウィンドウ(=フォーム)のハンドルを渡す可能性がありました。ウィンドウのハンドルを渡すと、ヘルプを表示した後にウィンドウをクリックしても最前面に出てこなくなります。

上の例では静的にリンクしました。万が一、アプリケーション起動時にhhctrl.ocxが 見つからない場合、起動できなくなります。それを避けるには動的にリンクします。 具体的なコードは下のようになります。


unit Unit1;

interface

uses
  Windows, SysUtils, Classes, Controls, Forms, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private 宣言 }
    HTMLDLL : THandle;	// DLLをロードする際のハンドル
  public
    { Public 宣言 }
  end;

type		// THtmlHelp型を定義
    THtmlHelp = function (hwndCaller:Integer;
			  pszFile:PChar;
                          uCommand:Integer;
			  dwData:Integer
                         ):Integer;stdcall;
var
  Form1: TForm1;
  HtmlHelp : THtmlHelp;		// HtmlHelpをグローバル変数で宣言

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
HTMLDLL := 0;		// ハンドルを初期化
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if HTMLDLL = 0 then
    begin
    HTMLDLL := LoadLibrary('hhctrl.ocx');	// hhctrl.ocxをロード
    HtmlHelp := THtmlHelp(GetProcAddress(HTMLDLL,'HtmlHelpA'));
    end;
if @HtmlHelp <> nil then
    HtmlHelp(Application.Handle, PChar('help.chm'), $0001, 0);	// 目次を表示してヘルプを起動
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if @HtmlHelp <> nil then
  begin
  HtmlHelp(0, nil, 18, 0);	// HTMLHelpファイルを閉じる
  FreeLibrary(HTMLDLL);		// ハンドルを解放
  end;
end;

end.

上の例では、Button1をクリックした際にhhctrl.ocxを動的にリンクするようにしています。 もし、Button1Click以外の関数でもHtmlHelp関数を使う場合は、OnCreateイベント中で hhctrl.ocxをリンクすると良いと思います。

TOPページへ戻る  PCページへ戻る  一覧へ戻る












トップへ戻る

”意味”に記述がない場合は、MSDN Libraryを 参考にしてください。(大本はてくにっく。さんのページから ヒントを得ています)

                           
アクション定数対応する整数意味
HH_DISPLAY_TOPIC0dwDataに、トピックをDWORD(PChar('TopicFileName'))で渡すとトピックを表示
HH_HELP_FINDER0上と一緒。WinHelpとの互換性のためにある
HH_DISPLAY_TOC1目次を表示
HH_DISPLAY_INDEX2Index.hhkファイルに指定したキーワードを表示してHLTM Helpを起動
HH_DISPLAY_SEARCH3検索タブを表示します。但し、先にHTML Helpを起動しておく必要があります。dwDataにはHH_FTS_QUERY構造体のポインタを渡します
HH_SET_WIN_TYPE4
HH_GET_WIN_TYPE5
HH_GET_WIN_HANDLE6
HH_ENUM_INFO_TYPE7
HH_SET_INFO_TYPE8
HH_SYNC9
HH_RESERVED110
HH_RESERVED211
HH_RESERVED312
HH_KEYWORD_LOOKUP13
HH_DISPLAY_TEXT_POPUP14
HH_HELP_CONTEXT15マッピングされたIDをdwDataに指定し、そのトピックを表示します
HH_TP_HELP_CONTEXTMENU16
HH_TP_HELP_WM_HELP17
HH_CLOSE_ALL18ヘルプを閉じます。このアクションでは、hwndCallerとdwDataに0を、pszFileにnilを代入します
HH_ALINK_LOOKUP19
HH_GET_LAST_ERROR20
HH_ENUM_CATEGORY21
HH_ENUM_CATEGORY_IT22
HH_RESET_IT_FILTER23
HH_SET_INCLUSIVE_FILTER24
HH_SET_EXCLUSIVE_FILTER25
HH_INITIALIZE28
HH_UNINITIALIZE29
HH_PRETRANSLATEMESSAGE253
HH_SET_GLOBAL_PROPERTY252

トップへ戻る