2012-04-02 5 views
6

私たちのソフトウェアでヘルプファイルの設定を取得しようとしています。私は多くの特定のフォーム/フレーム/コントロールのためのHelpContext番号を追加して、それらはすべて正常に動作します。問題は、メインフォームが何の助けももたらさないということです。このすべてについて、私はF1を使用してヘルプを起動しようとしています。ヘルプファイルをDelphi XE2アプリケーションにリンクする - すべてがメインフォーム以外で動作します

私はDelphiやヘルプファイルの専門家ではありませんが、私がやったことや見たところを投稿します。

編集:私は現在、主なフォームがMDIの親であることが原因で問題が発生しています。これはまだ問題を解決しません..それはほとんど私のバグのように思えますが、何らかの理由でそれが意図的である可能性があると思います。 EndEdit

私はこのユニットを含んでいます:ビューア用のHtmlHelpViewer。メインフォームのCreateコンストラクタで、Application.Helpfile:= 'asdf.chm'を追加しました。他のすべてのフォームについては、コンテキスト番号を追加しました。すぐに機能します。私はそれをメインフォームで試したが、何も起こらない。だから私はApplication.OnHelpイベントを追加しようとしましたが、これはメインフォームで呼び出されることはありません(そして、ヘルプが動作している他のすべてのフォームに対しても同様です)。

私が考えることができる最後の手段は、コードの深いところまでトレースし、何が起こっていたかを見ることでした。私はTCustomForm.WMHelpにVcl.Formsの分割が起こっていた場所に持ってきました。

if iContextType = HELPINFO_WINDOW then 
begin 
    Control := FindControl(hItemHandle); 
    while (Control <> nil) and (not ControlHasHelp(Control)) do 
    Control := Control.Parent; 
    if Control = nil then Exit; 
    GetHelpInfo(Control, HType, ContextID, Keyword); 
    Pt := Control.ClientToScreen(Point(0, 0)); 
end 

がメインフォームヘルプコントロールがnilになり呼んでいたし、それが終了します:関数はこのループを有することを特徴とします。それ以外はうまくいくでしょう。

私は明らかになぜこれが起こっているのかわかりません。答えは何か非常に基本的なものかもしれません。任意のアイデアをいただければ幸いです!

+0

メインフォーム自体に 'HelpContext'を設定しましたか? –

+0

@DavidHeffernan:そうでした。私はこれを言及すべきだったが、それはちょうどその主要な形であり、その子供ではない。私はフォームに(コンテキストヘルプなしで)ボタンを置いて、フォーカスがあるときにF1キーを押すとメインフォームのヘルプコンテキストが読み込まれます。目に見えるフォーカスがない場合、ヘルプは読み込まれません。 – Sentient

+0

私は、デバッガの下でWMHelpハンドラを見て、FindControlから返されるものを確認します。 –

答えて

6

ご意見によると、WM_HELPメッセージはMDIクライアントウィンドウでターゲットに設定されています。これはVCLコントロールではないため、WM_HELPメッセージには応答しません。あなたがメッセージを傍受し、それを処理するために、メインフォームを尋ねることによって問題に対処することができます

type 
    TMainForm = class(TForm) 
    protected 
    procedure WMHelp(var Message: TWMHelp); message WM_HELP; 
    end; 
.... 
procedure TMainForm.WMHelp(var Message: TWMHelp); 
begin 
    if (Message.HelpInfo.iContextType=HELPINFO_WINDOW) 
    and (Message.HelpInfo.hItemHandle=ClientHandle) then 
    Message.HelpInfo.hItemHandle := Handle; 
    inherited; 
end; 

あなたはもっと防御的になりたい場合は、このようにそれを書くことができます:

if (Message.HelpInfo.iContextType=HELPINFO_WINDOW) 
    and (FindControl(Message.HelpInfo.hItemHandle)=nil) then 
    Message.HelpInfo.hItemHandle := Handle; 

私は」私自身のMDIアプリケーションを見てみましたが、私はこの正確な問題に対処するための同様のコードを持っていることがわかります。もし10年以上前に書かれていなかったら、私はもっと早く思い出したかもしれません!

+0

素晴らしいです、ありがとうございました! コンパイラがiContextTypeを気に入らなかったので、 'Message.HelpInfo {$ IFNDEF CLR}^{$ ENDIF} do 'というコードを少し変更しました。 .FormsにはWMHelpが含まれていました。 (そして、andの2番目の部分からMessage.HelpInfoを取り出しました。) – Sentient

+0

良いです。喜んで助けてくれた。 –

関連する問題