C++Builder 2010 でHTMLヘルプを使用する

既に情報は出ているけど、個人的なニーズがあってまとめてみた。

1. アプリケーションがHTML Helpを表示するようにする。

適当なソースコード(WinMainがあるコードかメインフォームのコードが一番無難かも)に以下の2行を追加。
#include <HtmlHelpViewer.hpp>
#pragma link "HTMLHelpViewer"
これがないとWinHelpが呼び出されてしまうので注意。

2. メインフォームのOnCreateでヘルプファイルを指定する。

void __fastcall TfrmMain::FormCreate(TObject *Sender)
{
  Application->HelpFile = ChangeFileExt(Application->ExeName, _T(".chm")); // ヘルプファイルの指定
  Application->OnHelp = FormHelp;  // ヘルプを表示するイベントハンドラ(状況依存ヘルプの場合は不要)
}
ヘルプファイルは[プロジェクト|オプション|アプリケーション|ヘルプファイル]で指定してもいいけど、フルパス指定になってしまうのでアプリ側で動的に指定するのがおすすめ。 状況依存ヘルプを使用しないで常に目次のみを表示する場合や、ヘルプとしてHTMLファイルなどを使用する場合はApplication->OnHelpにヘルプの目次のみを表示するイベントハンドラを設定する。

3. ヘルプを表示するイベントハンドラを記述する

状況依存ヘルプを使用しない場合は、メインフォームにOnHelpイベントを定義してヘルプファイルを表示する処理を記述。
bool __fastcall TfrmMain::FormHelp(WORD Command, int Data, bool &CallHelp)
{
  Application->HelpShowTableOfContents(); // HTMLヘルプの目次を表示
  CallHelp = false; // システム側で何もする必要が無いのでfalseにする。
  return true; // 普通に成功するはずだからtrueを返す。
}
また、各フォームのHelpContextの値を0以外にし、HelpTypeの値をhtContextにする。
HTMLヘルプ以外でも、Application->HelpFileを設定すれば、Application->HelpShowTableOfContentsでよろしくやってくれる。(HTMLファイルで確認。)

4.状況依存ヘルプの場合

状況依存ファイルの場合はApplication->OnHelpを設定せずに、各コントロールのHelpContext、HelpKeyword、HelpTypeを適切に設定し、それに合わせてHTMLヘルプを作成すれば、適切に表示してくれる。 各フォームのHelpKeywordとHTMLヘルプのインデックスの値を同じにするのが一番楽な方法かも。