ActionListのショートカットキーを別フォームでは無効にしたい


risa  2009-11-23 20:55:43  No: 36225  IP: 192.*.*.*

先日はインタプリタコンポーネントの件でお世話になりました。
まだ完全に解決してるわけではないのですが、別件で質問がでましたので、
再度質問させていただきます。

メインフォーム(Form1)で、ActionListを使っており、アクションの1つに、
「Control + G」のショートカットを設定しています。

このショートカットは、Form1で利くのはよいのですが、Form1から
Showした別のフォーム(Form2)がアクティブのときにも利いてしまうのです。
Form1がアクティブでないときは無効にしたいのですが、どうすればよいでしょうか?

※案件がこれ1つだけなら、当該Action内で条件分岐するのですが、
  ショートカットキー付きのActionが他にもいっぱいあります。
  個別に書くのもメンテナンスが大変ですし、設定漏れ、今後の保守作業を
  見据えて、より簡単な方法を探しています。

編集 削除
ぼるしち  2009-11-24 01:57:11  No: 36226  IP: 192.*.*.*

こんにちは。

当該アクションのOnUpdateイベントでForm1がアクティブの時だけ
アクションのEnabledをTrueに設定するのが楽だと思います。

例えば、アクション名がAction1だった場合は

procedure TForm1.Action1Update(Sender: TObject);
begin
  Action1.Enabled := Form1.Active;
end;

となります。
これでForm1がアクティブの時だけAction1を実行できます。
Form2がアクティブの時はショートカットキーが反応しないはずです。

編集 削除
tor  2009-11-24 10:33:21  No: 36227  IP: 192.*.*.*

Actionごとに処理を書くのを避けたいということなら、OnShortCutでまとめて捨ててしまうとか。

編集 削除
risa  2009-11-24 19:58:31  No: 36228  IP: 192.*.*.*

ご回答、ありがとうございます。
今、いろいろ操作してみましたが、以下のコードで動きそうです。

// Form1.OnCreate部分
var
  i: Integer;
begin
  for i := 0 to ActionList1.ActionCount - 1 do begin
    ActionList1.Actions[i].OnUpdate := Action1Update;
  end;
end;

// Action1.OnUpdate部分
procedure TForm1.Action1Update(Sender: TObject);
begin
  TAction(Sender).Enabled := Form1.Active;
end;

もう少し動きを見て、問題がないようでしたら改めて報告いたします。
お二人とも、大きなヒントをいただき、ありがとうございました。

編集 削除