メインフォームが別の非モーダル形式でTMEMOでキーストロークをキャプチャするのを防ぐにはどうすればよいですか?
質問
メインフォームから非モーダルフォームを開くアプリがあります。非モーダルフォームにはTMEMOがあります。メインフォームメニューは、「スペース」をアクセラレータ文字の1つとして使用します。
非モーダルフォームが開いていて、メモが焦点を合わせているとき、私が非モーダルフォームのメモにスペースを入力しようとするたびに、「スペース」ショートカット火災のメインフォームイベント!
mainform.keypreview:= falseを回してみましたが、他のフォームは開いていますが、サイコロはありません。
何か案は?
解決
メモが焦点を合わせている間にメインフォームのメニュー項目を無効にし、メモがそれを失ったときにそれを再度有効にします。これを行うことができます TMemo.OnEnter
と TMemo.OnExit
イベント。
procedure TOtherForm.Memo1Enter(Sender: TObject);
begin
if Application.MainForm is TYourMainForm then
TYourMainForm(Application.MainForm).MenuItemWithSpace. Enabled := False;
end;
procedure TOtherForm.Memo1Exit(Sender: TObject);
begin
if Application.MainForm is TYourMainForm then
TYourMainForm(Application.MainForm).MenuItemWithSpace. Enabled := True;
end;
の用法 Application.MainForm
タイプキャストは、子形式のフォーム変数名でハードコーディングを防ぐことです。
他のヒント
これは古いトピックかもしれませんが、私は一瞬前に同じ問題を抱えていて、適切な解決策を検索しました。あなたのトピックは現れましたが、私が使いたい解決策はありませんでした。
私の問題は、多くのショートカット(バックスペース、削除など)を備えたメインフォームと編集ボックス付きの2番目のフォームがあることでした。編集ボックスは、メインフォームショートカットによって処理される重要なアクションを取得しませんでした。
私の解決策:子供のフォームをオンショートカットに設定します。
procedure ChildForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
Handled := True;
Self.DefaultHandler(Msg);
end;
それは私にとってトリックでした、子供のフォームはショートカットをキャッチし、それらを一般的なキーメッセージとして処理します。編集ボックスは、意図したとおりに使用できます。