TOPページへ戻る  PCページへ戻る  一覧へ戻る

検索/置換ダイアログへのペーストにCtrl+V(ショートカットキー)を使う方法

DelphiのDialogsにある検索/置換ダイアログは、Windows標準の検索/置換ダイアログを 呼び出すクラスです。しかし、ちょっと問題があります。 それは、検索/置換ダイアログを使ってエディタを作成した場合、検索/置換ダイアログの エディットボックスにCtrl+Vでペーストしようとすると、エディタにペーストされてしまいます。 これを回避する方法がDelphi-ML載っています。 しかし、この方法だけでは、VCLのバグ(Delphi 7.0以下、8.0以上は不明)のため メモリリークを起こします。これは、メッセージをHookしたらアプリケーション終了時に WM_EndSessionメッセージを送ってHookを解放する必要があるのですが、VCLではそれが 抜けているようです。そのため、フォームをDestroyする際に、UnHookする一文を追加すると メモリリークを防ぐことができます。

具体的には次のコードになります。



 procedure TForm1.FormCreate(Sender: TObject);
 begin
 Application.HookMainWindow(Hook);
 end;

 procedure TForm1.FormDestroy(Sender: TObject);
 begin
 Application.UnHookMainWindow(Hook);	//これでHookが解放される
 end;

 function TForm1.Hook(var Message: TMessage): Boolean;
 begin
 Result := False;
 if Message.Msg = CM_APPKEYDOWN then
 	Result := True;
 end;

Delphi Tipsの 「サブフォームがアクティブな時は メインフォームのアクセラレータキー・ショートカットキーを無効にしたい 」によると、 ショートカットキーだけでなくアクセラレータキーもHookできるようです。この場合は上と同様に Destroyに一文を追加してください。

TOPページへ戻る  PCページへ戻る  一覧へ戻る