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


risa  2009-11-24 05:55:43  No: 36225

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

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

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

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


ぼるしち  2009-11-24 10:57:11  No: 36226

こんにちは。

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

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

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

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


tor  2009-11-24 19:33:21  No: 36227

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


risa  2009-11-25 04:58:31  No: 36228

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

// 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;

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加