0

メイン フォームから非モーダル フォームを開くアプリがあります。非モーダル フォームには TMemo があります。メイン フォーム メニューは、アクセラレータ文字の 1 つとして「スペース」を使用します。

非モーダル フォームが開いていて、メモにフォーカスがある場合、非モーダル フォームのメモにスペースを入力しようとするたびに、「スペース」ショートカットのメイン フォーム イベントが発生します。

MainForm.KeyPreview := false を回してみましたが、他のフォームは開いていますが、サイコロはありません。

何か案は?

4

3 に答える 3

2

メモにフォーカスがある間はメインフォームのメニュー項目を無効にし、メモが失われたときに再度有効にします。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、子フォームのフォーム変数名にハードコーディングされないようにするためのものです。

于 2010-04-21T12:48:46.050 に答える
2

これは古いトピックかもしれませんが、少し前に同じ問題が発生し、適切な解決策を探しました。あなたのトピックが出てきましたが、私が使いたい解決策はありませんでした。

私の問題は次のとおりです。多くのショートカット (Backspace、Delete など) を含むメイン フォームと、編集ボックスを含む 2 つ目のフォームがあります。編集ボックスは、メイン フォームのショートカットによって処理されるキー アクションを取得しませんでした。

私の解決策:子フォームOnShortCutを設定すると、メインフォームによって解釈される前にショートカットがキャッチされます:

procedure ChildForm.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  Handled := True;
  Self.DefaultHandler(Msg);
end;

子フォームはショートカットをキャッチし、それらを共通のキーメッセージとして処理します。編集ボックスは意図したとおりに使用できます。

于 2014-05-06T15:57:18.323 に答える