開発ブログ - ダイアログ表示中にメインフォームのキーボードショートカットが有効になってしまう
Delphi VCL
メインフォームの TActionList にキーボードショートカットを設定しているときにダイアログを表示すると、
ダイアログ処理中でもメインフォームのショートカットキーが有効になっています。
これを回避するためには、ダイアログ表示前にメインフォームの Enabled を False にすればOKです。
d := TDialogForm.Create(Self);
try
Self.Enabled := False;
d.ShowModal;
finally
Self.Enabled := True;
d.Free;
end;
とはいえ、たくさんダイアログがあってダイアログ表示前に Enabled を False にするのが面倒くさいということもあるかもしれません。
そんな時はメインフォームに以下のような記述を追加すると、回避できます。
interface の宣言部
type
TMainForm = class(TForm)
...
public
function IsShortCut(var Message: TWMKey): Boolean; override;
implementation 実装部
function TMainForm.IsShortCut(var Message: TWMKey): Boolean;
begin
if not Self.Active then Exit(False);
Result := inherited;
end;
ショートカットキーの処理は、アクティブなフォームの IsShortCut で処理されるようで、処理をしたら True を返せば良いみたいです。
False にするとMainForm に遡って処理が行われるようです。
(MainForm が Enable の場合)
このため、メインフォームでキーボードショートカットが実行されてしまうんですね。