1

子ウィンドウにフォーカスがある場合でも、Delphi (2007) MDI アプリケーションの親ウィンドウで KeyDown イベントを機能させるにはどうすればよいですか?

MDI アプリケーションでヘルプ画面を表示するショートカット キー (F1) を実装したいと考えています。KeyDown プロシージャを MDI 親ウィンドウに追加し、親ウィンドウと子ウィンドウの両方で KeyPreview を有効にしましたが、機能しません。期待される。

Parents KeyDown コードにブレーク ポイントを配置すると、子ウィンドウが開いていなくても実行されないことがわかります。しかし、同じコードを子ウィンドウに追加すると、正常に動作します。

コードを25以上のフォームに追加すると少し無駄になるため、子ウィンドウにフォーカスがある場合でも、親ウィンドウにキーの押下を受け取る方法はありますか?

4

4 に答える 4

5

今週、まったく同じ問題がありました!メインフォームの ActionManager にアクションを作成して修正しました。この操作により、ヘルプ ファイルが開き、F1 キーがショートカットとして設定されます。また、すべての MDI 子画面でも機能します。

于 2008-10-22T12:32:36.663 に答える
2

ローカル(グローバルは不要)のキーボードフックを使用できます。また、すべてのMDI子フォームをsignleフォームの基本クラスから派生させ、そこに一度実装することもできます。この設計は、他の問題にも役立つことがわかります。

編集

アプリケーション全体のホットキー/ショートカットは、TApplication.OnShortCutイベントを使用して実装することもできます。http://delphi.about.com/od/adptips2004/a/bltip0904_3.htmを参照してください

F1は、TApplication.OnHelpをトリガーする標準のヘルプショートカットです。では、OnHelpイベントを使用したいのではないでしょうか。また、HelpFile、HelpContext、HelpType、およびHelpKeywordプロパティを使用する場合は、おそらくコードを実装する必要はまったくありません。

于 2008-10-22T09:54:34.470 に答える
2

子ウィンドウにフォーカスがある場合でも、Delphi (2007) MDI アプリケーションの親ウィンドウで KeyDown イベントを動作させるにはどうすればよいですか?

より一般的な解決策 (F1 以外のアプリケーションの場合) として、メイン フォームでキーダウン イベントをトラップするために、これに似たコードを使用します。これにより、MDI 子がアクティブな場合でも、すべてのキーが取得されます。この例では、あなたがしようとしていることとは逆のことをしています (メッセージをメイン フォームではなく子フォームで処理したい) が、親でキーをキャッチするという概念は同じです)。

Application.OnMessage := AppMessage;

procedure TMainForm.Appmessage(var Msg: TMsg; var Handled: Boolean);
var
  message: TWMKey;
begin
  If (msg.message = WM_KEYDOWN) and
     ( LoWord(msg.wparam) = VK_TAB ) and
     (GetKeyState( VK_CONTROL ) < 0 ) and
     Assigned( ActiveMDIChild ) then
  Begin
    Move( msg.message, message.msg, 3*sizeof(Cardinal));
    message.result := 0;
    Handled := ActiveMDIChild.IsShortcut( message );
  End;
end;
于 2008-10-22T14:32:05.363 に答える
1

F1ヘルプ処理はDelphiに組み込まれているため、ヘルプメッセージを適切に処理するだけです。これは、アプリケーションのhelpfileプロパティを設定するのと同じくらい小さい場合があります。フォームのヘルプを使用して特定のページを設定できますか?プロパティ。

基本的には、付属のヘルプシステムを使用して、キーダウンを忘れてください。これはDelphiです-あなたは一生懸命働く必要はありません。

于 2008-10-22T10:45:27.880 に答える