2

DelphiXE2およびDelphi6の使用

ヘルプファイルをヘルプコンテキストに開くために押すF1と、ヘルプファイルが適切なコンテキストに開かれませんF1が、ショートカットであるメニュー項目を使用すると、ヘルプファイルが適切なコンテキストに開かれることがわかりました。メニュー項目コードを呼び出すボタンもあります。

F1メニュー項目とボタンの両方がまったく同じコード行を呼び出していることを確認しました。これらは次のとおりです。

procedure TForm1.Help1Click(Sender: TObject);
begin
  Application.HelpContext(Self.HelpContext);
end;

Self.HelpContext値はユーザーがフォームのどこにいるかによって変更され、その行が実行されたときに正しい値であり、メニュー項目またはボタンSelf.HelpContextを介して呼び出されたときに同じ値であることを確認しました。F1

この問題は、Delphi6で記述された以前のすべてのバージョンのアプリにも存在することを確認しました。

私がここで見逃している単純な何かがあるに違いありません。何か案は?

4

1 に答える 1

2

何が起こっているのかというと、それF1はシステムによって特別な扱いを受けます。はい、メニュー項目のハンドラーに起動のショートカットがあるのは事実ですF1。しかし、そのハンドラーが起動した後、アプリはWM_HELPメッセージを受信します。

このWM_HELPメッセージは、最初はによって処理されTCustomForm.WMHelpます。これにより、アクティブコントロールに関連付けられているヘルプコンテキストIDが検索されます。そして、Application.HelpContextそのヘルプコンテキストを使用して呼び出されます。また、おそらくアクティブコントロールのヘルプコンテキストIDはフォームのヘルプコンテキストIDとは異なります。

したがって、メニュー項目は好みのトピックでヘルプファイルを開きますが、それ以降WM_HELPはメニュー項目を上書きします。

F1常にフォームのヘルプコンテキストIDにルーティングする必要があるようです。その場合、私のアドバイスは次のようになります。

  • フォームのを設定しHelpContextます。
  • HelpContextフォーム上の他のすべてのコントロールのすべてのプロパティを削除します。つまり、デフォルト値の。に戻します0

次に、WM_HELPメッセージが処理されると、アクティブコントロールから開始され、のヘルプコンテキストが検索されます0。次に、親を介してゼロ以外のフォームに上昇します。

F1メニュー項目/アクションからもショートカットを削除すると思います。そして、WM_HELPメッセージをヘルプを呼び出すためのメカニズムとします。

于 2013-02-27T21:22:39.163 に答える