VCL アプリケーションにおける F1 ヘルプのカスタマイズ
アプリケーションからの HTML ヘルプの呼び出し への移動
Application オブジェクトや特定のフォームの OnHelp イベント ハンドラを明示的にプログラミングすることができます。
フォームの OnHelp イベント ハンドラを変更するには、フォーム デザイナでフォームを開きます。
その後、[オブジェクト インスペクタ]で[イベント]タブを選択し、OnHelp イベントを探して右の列をダブルクリックします。コード エディタでフォーム処理コードのファイルが開き、OnHelp イベント ハンドラ用に生成された枠組みのコードの begin … end ブロックにカーソルが置かれます。生成されたコードは次のようになっています。
function TForm1.FormHelp(Command: Word; Data: Integer; var CallHelp: Boolean): Boolean; begin ... end;
ここにヘルプ処理コードを入力します。TForm1.FormHelp
イベント ハンドラは TForm1 クラスの Form1 オブジェクトのメソッドなので、Form1 オブジェクトおよび Application オブジェクトのどのヘルプ機能も使用することができます。たとえば、次のようにコードを記述できます。
function TForm1.FormHelp(Command: Word; Data: Integer; var CallHelp: Boolean): Boolean; begin HelpFile := ExtractFilePath(Application.ExeName) + HelpFile; Application.HelpShowTableOfContents(); CallHelp := False; // True; - to execute the default OnHelp event handler end;
最初の行の HelpFile
を再定義している場所では、元の HelpFile
に、Form1 フォームのローカルにあるヘルプ ファイルのパスが、アプリケーションの実行可能ファイルからの相対パスとして含まれていることを前提としています。このように再定義することで、実行中のアプリケーションからこのヘルプ ファイルを常に正しく見つけられるようになります。
Application.HelpShowTableOfContents
では、Form1 フォーム用に TForm1.HelpFile
で定義した CHM ヘルプ ファイルの目次を表示します。
CallHelp
を False
に設定することで、デフォルトの OnHelp イベント ハンドラを実行しないよう指示しています。手動でプログラミングしたイベント ハンドラの後でデフォルトの OnHelp イベント ハンドラも実行する必要がある場合には、次のように定義します。
CallHelp := True;
- メモ: 自分で作成する OnHelp イベント ハンドラのコードでは、次のように Application.HelpCommand を使用することはできません。
Application.HelpCommand(NativeCommand, Data)
- つまり、ネイティブの HTMLHelp API 関数(またはその他のネイティブ API)に NativeCommand オプションを渡してはなりません。Application.HelpCommand 関数ではアクティブなフォームの OnHelp イベントを発生させます。その結果、OnHelp イベント ハンドラの中で HelpCommand 関数を呼び出すと、OnHelp イベントの中で無限ループが発生してしまいます。
- そのため、HTMLHelp API 関数に NativeCommand オプションを渡す場合には、次のように呼び出します。
IHelpSystem.GetHelpSystem(HelpSystem)
- その後、次の呼び出しを行います。
HelpSystem.Hook(Handle, HelpFile, NativeCommand, Data);