2011-10-22 15 views
3

Delphi 2009アプリケーションで状況依存ヘルプを実装しています。 1つのケースを除いて正常に動作します。私はメインメニューにあり、どのメニュー項目が開いているのか分かりません。ユーザーは、[ファイル]メニューを開いているし、そのオープンプレスF1ながら、その後、私は、[ファイル]メニューの[私の助けを持っていきます場合、私は何をしたいのかどのメニューアイテムがDelphiで開いているかをどのように教えていますか?

です。彼らは、[編集]メニューを開いてF1キーを押す場合は、その後、私は、[編集]メニューの[私の助けを持っていき、など

次のように私は、ユーザーのF1キーを押すのを処理するためにApplicationEventsHelpを使用しています:

function MainForm.ApplicationEvents1Help(Command: Word; Data: Integer; 
    var CallHelp: Boolean): Boolean; 
begin 
    if Command = HELP_COMMAND then begin 
    Application.HelpSystem.ShowTopicHelp(PChar(Data), Application.CurrentHelpFile); 
    CallHelp := false; 
    end; 
    Result := true; 
end; 

を私が言及したように、これはメインメニューを除くすべてのために働く。私は、彼らがメニューを同定するかどうかを確認するために、アクティブ制御を識別

FindVCLWindow(Mouse.CursorPos) 

および他のそのような方法を使用して試してみたが、彼らはしていないようです。

F1キーを押したときに開いているメニュー項目(ある場合)を知る方法はありますか?


ご協力いただきありがとうございました。

私の最終的な解決策を文書化するだけで、システムはそれがどのコントロールであるかを判断することに特に優れていないことが判明し、不適切なデータをApplicationEventsHelpに渡して不適切なヘルプページを表示します。

受け入れられた回答のメニューを処理するためのソリューションを試して使用した後、正しいヘルプ項目を表示するためにどのコントロールを使用したのかを特定するのが最善であることがわかりました。私はHelpKeywordプロパティを使用せず、ハードコーディングしました。コードは明確で、動作します。また、私のRVEditウィンドウのヘルプを持って、あなたがいるドキュメントのセクションに応じて別のヘルプページを表示します(私のCurCursorIDはそれを教えてくれます)。私は正しいように私の7つのメインメニューでのMenuItemのHelpContextプロパティに17を介して11を入れなければならなかったの

function TLogoAppForm.ApplicationEvents1Help(Command: Word; Data: Integer; 
    var CallHelp: Boolean): Boolean; 
var 
    HelpKeyword: string; 
    SType: string; 

begin 
    if Command = HELP_COMMAND then begin 
    if PtInRect(RVEdit.ClientRect, RVEdit.ScreenToClient(Mouse.CursorPos)) then begin 
     if CurCursorID = 'H' then HelpKeyword := 'RefTopReport' 
     else if CurCursorID = 'T' then HelpKeyword := 'RefTableContents' 
     else if CurCursorID = '~HNAME' then HelpKeyword := 'RefIndexNames' 
     else if copy(CurCursorID, 1, 2) = 'N+' then HelpKeyword := 'RefIndexNames' 
     else if CurCursorID = 'B' then HelpKeyword := 'RefBottomReport' 
     else if CurCursorID <> '' then HelpKeyword := 'RefInformationArea' 
     else HelpKeyword := 'RefEverythingReport'; 
     Application.HelpSystem.ShowTopicHelp(HelpKeyword, Application.CurrentHelpFile); 
    end 
    else if PtInRect(ElTree.ClientRect, ElTree.ScreenToClient(Mouse.CursorPos)) then 
     Application.HelpSystem.ShowTopicHelp('RefTreeView', Application.CurrentHelpFile) 
    else if PtInRect(TopToolbar.ClientRect, TopToolbar.ScreenToClient(Mouse.CursorPos)) then 
     Application.HelpSystem.ShowTopicHelp('RefTopToolbar', Application.CurrentHelpFile) 
    else if PtInRect(BottomToolbar.ClientRect, BottomToolbar.ScreenToClient(Mouse.CursorPos)) then 
     Application.HelpSystem.ShowTopicHelp('RefBottomToolbar', Application.CurrentHelpFile) 
    else 
     Application.HelpSystem.ShowTopicHelp('RefMainWindow', Application.CurrentHelpFile); 
    CallHelp := false; 
    end 
    else if Command = HELP_CONTEXTPOPUP then begin 
    case Data of 
     0: HelpKeyword := 'RefMenuBar'; 
     11: HelpKeyword := 'RefFileMenu'; 
     12: HelpKeyword := 'RefEditMenu'; 
     13: HelpKeyword := 'RefSearchMenu'; 
     14: HelpKeyword := 'RefNavigateMenu'; 
     15: HelpKeyword := 'RefViewMenu'; 
     16: HelpKeyword := 'RefOrganizeMenu'; 
     17: HelpKeyword := 'RefHelpMenu'; 
     else HelpKeyword := ''; 
    end; 
    if HelpKeyword <> '' then begin 
     Application.HelpSystem.ShowTopicHelp(HelpKeyword, Application.CurrentHelpFile); 
     CallHelp := false; 
    end; 
    end; 
    Result := true; 
end; 

:私はここに、行ったようにこれをしたい人のため

はどのようにありますあなたがいたメニューに応じてヘルプが表示されます。メニュー項目の検出は、この質問への回答が私に提供された助けとなります。

このコードは、(HelpContext番号の代わりにHelpKeywordsを使用して)簡単に実行でき、Delphi XEおよびFireMonkeyに変換した後でも機能しているというのがうれしいことです。

+4

:あなたはHelpContextプロパティを使用するためにバインドされているので、

(ここではデルファイ7で)メニュー項目は、HelpTypeHelpKeyword特性を有していません。 FindVCLControlは使用しないでください。コントロールとアクションのためのHelpContextを設定します。それだけです。 –

+0

@David - FindVCLControlは私がkludgeとして働くと思った1つのアイデアでした。私はそのアプローチに満足していなかったし、それはとにかく動作しませんでした - それが私がこの質問をした理由です。答えは – lkessler

答えて

3

DataPCharのキャストを見ると、コンテキスト識別子(HelpType = htKeyword)ではなくキーワードに基づいてヘルプシステムを使用しているようです。あなたの全体的なアプローチが間違っている

function TForm1.ApplicationEvents1Help(Command: Word; Data: Integer; 
    var CallHelp: Boolean): Boolean; 
begin 
    if Command = HELP_COMMAND then 
    begin 
    //Application.HelpSystem.ShowTopicHelp(PChar(Data), Application.CurrentHelpFile); 
    //Doesn't this do the same? 
    Application.HelpKeyword(PChar(Data)); 
    CallHelp := False; 
    end 
    else if Command = HELP_CONTEXT then 
    begin 
    // Convert the context identifier to your keyword, or: 
    Application.HelpContext(Data); 
    CallHelp := False; 
    end; 
    Result := True; 
end; 
+1

+1、D2009では、 'TMenuItem'は' HelpType'や 'HelpKeyword'をまだ持っていないので、' HelpContext'が正しいアプローチです。 – TLama

+3

私はこのイベントハンドラがとにかく必要であるかどうかもわかりません。 CallHelpはデフォルトでTrueですので、ヘルプトピックがポップアップするはずです。このイベントハンドラは特別な介入のためのものです。 – NGLN

+0

@NGLN - はい、私は特別な処理を行いますが、私は私の例を基本に単純化しました。 – lkessler

2

ウィンドウメッセージ 'WM_MUSUSELECT'をトラップすることによって、選択したメニュー項目を追跡することができます。

詳細については、menuitemhintsを参照してください。

例:F1ボタンが押されたとき

type 
    TForm1 = class(TForm) 
    ... 
    private 
     fMyCurrentSelectedMenuItem : TMenuItem; 
     procedure WMMenuSelect(var Msg: TWMMenuSelect) ; message WM_MENUSELECT; 
    end 

procedure TForm1.WMMenuSelect(var Msg: TWMMenuSelect) ; 
var 
    menuItem : TMenuItem; 
    hSubMenu : HMENU; 
begin 
    inherited; // from TCustomForm (so that Application.Hint is assigned) 

    menuItem := nil; 
    if (Msg.MenuFlag <> $FFFF) or (Msg.IDItem <> 0) then 
    begin 
     if Msg.MenuFlag and MF_POPUP = MF_POPUP then 
     begin 
     hSubMenu := GetSubMenu(Msg.Menu, Msg.IDItem) ; 
     menuItem := Self.Menu.FindItem(hSubMenu, fkHandle) ; 
     end 
     else 
     begin 
     menuItem := Self.Menu.FindItem(Msg.IDItem, fkCommand) ; 
     end; 
    end; 

    //miHint.DoActivateHint(menuItem) ; 
    fMyCurrentSelectedMenuItem := menuItem; 
end; (*WMMenuSelect*) 

ですから、正しいヘルプをアクティブにするためにfMyCurrentSelectedMenuItemを使用することができます。

+0

ありがとう。私はこのようなソリューションを検討していましたが、NLGNのやり方は、コードをすべて一箇所に保存するので、より洗練されています。 – lkessler

1

GetMenuItemRect関数を使用できます。
1。メインメニューのすべての項目を調べ、GetMenuItemRectを呼び出してアイテムの位置を取得します。機能は項目が表示されている場合にのみ機能します。
2. GetCursorPosとPtInRectを使用して、マウスがメニュー項目の上にあるかどうかを確認し、適切なヘルプトピックを呼び出します。

+0

ありがとうございます。これは私が知らなかった、知っていると便利なもう一つの可能​​性です。 – lkessler

関連する問題