6

メインフォームを持つアプリケーションがあります。アプリケーションは基本的に 3 つの異なるモードで実行されるため、このフォームでは 3 つの TActionMainMenuBars を配置しました。

メニュー バーはすべて、メイン フォームの TActionManager に保存された(プロキシされた)アクションから構築されます。ActionManager は、実際には他のさまざまなフォームのアクションリストを参照します。

メニュー バーは、一度に 1 つだけが表示されるように、表示 + 有効化および非表示 + 無効化されます。これはうまく機能し、クリックするか、ALT を使用して移動し、矢印キーまたはキャプションの下線付きの文字を使用すると、アクションが動作します。

ただし、問題は、アクションがショートカット キーを押しても反応しないように見えることです。

アクションが起動しない原因を知っている人はいますか?

私は WinXP SP3 の C++Builder 2007 RAD Studio でプログラミングしています。

これを読んだ人、またはこれを読んで解決策を思いついた人に感謝します!

ピーターMJ

更新:異なるメニューのショートカットは、同じショートカットが異なるメニューで異なるアクションに使用されているという点で重複しているとは言いませんでしたが、すべてのショートカットは独自のメニューで一意です。

また、2 つの TActionMainMenuBars を使用してテスト アプリケーションの問題を単純化し、すべてのアクションが 1 つのアクション マネージャを共有しました。この場合、同じショートカットを持つ 2 つのアクションがあります。それらは別のメニューに配置されます。その後、一度に 1 つのメニューが有効になります。この場合、ショートカットは機能しますが、共通のショートカットを使用すると、保持メニューが無効になっている場合でも、最初のメニューのアクションのみが起動されます。

これは、いくつかのアクションが起動するという点で実際の問題よりもわずかに優れていますが、アクションが正しくトリガーされていないことが強調されています。誰も解決策を持っていませんか?

4

2 に答える 2

4

ActioneMenuBar の有効化/無効化または表示/非表示は、メニュー バーのアクションに影響を与えません。特定のコンテキスト/状況で一部のアクションを使用できないようにする場合は、アクション自体、またはその一部であるアクション リストまたはアクション マネージャーの「OnUpdate」イベントを実装する必要があります。

たとえば、アクション マネージャの次の OnUpdate イベントを使用すると、TCheckBox を使用して、2 つのアクションのどちらが現在アクティブになっているかを判断できます。

  if CheckBox1.Checked then
  begin
    Action1.Enabled:= False;
    Action2.Enabled:= True;
  end
  else
  begin
    Action1.Enabled:= True;
    Action2.Enabled:= False;
  end;

両方のアクションにショートカット「Ctrl+A」が割り当てられていると想像してください。これは、Ctrl+A を押すと、CheckBox1 がチェックされていない場合にのみ Action1 がアクティブになることを意味します。

ただし、まだ問題があります。VCL は、現在のフォームのアクション マネージャーまたはアクション リストでショートカットを含むアクションを見つけると、見つかったアクションが有効になっていない場合でも、特定のショートカットを含むアクションの検索を停止します。

この問題を解決するには、OnUpdate イベントを使用して、次のようにアクションの ShortCut プロパティを動的に設定およびリセットします。

  if CheckBox1.Checked then
  begin
    Action1.Enabled:= False;
    Action1.ShortCut:= scNone;

    Action2.Enabled:= True;
    Action2.ShortCut:= ShortCut(ord('A'), [ssCtrl]);
  end
  else
  begin
    Action2.Enabled:= False;
    Action2.ShortCut:= scNone;

    Action1.Enabled:= True;
    Action1.ShortCut:= ShortCut(ord('A'), [ssCtrl]);
  end;

このコードを使用して、Ctrl+A を押すと、CheckBox1 がチェックされている場合は Action2 がアクティブになり、CheckBox1 がチェックされていない場合は Action1 がアクティブになります。アクション リストまたはアクション マネージャーの OnUpdate イベントを明示的に呼び出す必要はありません。このイベントは、アプリケーションがアイドル状態でユーザー入力を待機しているときに定期的に発生します。

于 2009-05-04T20:13:14.790 に答える
0

使用するアクションが実際に有効になっていることを確認してください。
バーを無効にするときに ActionMainMenuBar 内のすべてのアクションを無効にすると、問題が発生します。
また、Windows のグローバル ショートカットと競合しないように、利用可能なショートカットを必ず使用してください。
それ以外は、なぜそれが機能しないのかわかりません。Delphi で 2 つの ActionMainMenuBars を試したところ、ショートカットが機能しました。

于 2008-11-06T22:20:03.917 に答える