2

デルファイ 2010

メインフォームで OnFormKeyDown イベントを使用していますが、基本的にはダイアログでも同じイベントを使用しています

//メインフォーム

procedure TfrmMain.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   case Key of
      VK_DOWN: btnLast.OnClick(Self);
      VK_Up:  btnFirst.OnClick(Self);
      VK_Left:  btnPrev.OnClick(Self);
      VK_Right:  btnNext.OnClick(Self);
    end;
end;

procedure TfrmMain.mniShowOwnedClick(Sender: TObject);
var
 I: Integer;
begin
 frmMain.KeyPreview:= False;
 frmOwned.KeyPreview:= True;
 frmOwned.Owned2.Clear;
 for I := 0 to Tags.Count - 1 do
  if Owned.IndexOf(Tags.Names[I]) <> -1 then
     frmOwned.Owned2.Add(Tags[I]);
 if frmOwned.ShowModal = mrOK then
 begin
  frmMain.KeyPreview:= True;
  frmOwned.KeyPreview:= False;
 end;
end;

//ダイアログ

procedure TfrmOwned.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   case Key of
      VK_DOWN: btnLast.OnClick(Self);
      VK_Up:  btnFirst.OnClick(Self);
      VK_Left:  btnPrev.OnClick(Self);
      VK_Right:  btnNext.OnClick(Self);
    end;
end;

フォームの OnKeyDown は正常に動作しますが、ダイアログを動作させることができないようです

4

1 に答える 1

6

問題は、これらのキーがダイアログ ナビゲーション キーとして使用されていることです。そのため、彼らはOnKeyDownイベントに参加することはありません。

正直なところ、なぜメイン フォームのOnKeyDownイベントが発生するのか理解に苦しみました。私のテスト環境ではそれを実現できませんでした。これは、フォームにボタンを追加したためです。これは、矢印キーがナビゲーション キーとして扱われることを意味するのに十分です。フォームが 1 つだけのアプリを作成し、いくつかのボタンを追加してみてください。次に、アプリを実行し、矢印キーを使用してフォーカスをボタン間で移動します。矢印キーがナビゲーション キーとして扱われると言うのは、そういう意味です。

あなたの 2 つのフォームの違いは、メイン フォームには矢印キーでナビゲートできるものが何もないことですが、モーダル フォームにはあります。

これで、矢印キーがナビゲーション キーとして扱われるのを止めることができます。このような:

type
  TMyForm = class(TForm)
  ....
  protected
    procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
  ....
  end;
....
procedure TMyForm.CMDialogKey(var Message: TCMDialogKey);
begin
  case Message.CharCode of
  VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN:
    Message.Result := 0;
  else
    inherited;
  end;
end;

ただし、私の見解では、より良い解決策は、OnKeyDownイベントを使用してショートカットを実装しようとするのをやめることです。それは間違った解決策のようです。正しい解決策は、アクションを使用することです。アクション リストを作成します。最初、最後、前、次のアクションのアクションを追加します。ShortCutそれらに適切なプロパティを与えます。これらのアクションをボタンに割り当てます。そして、仕事は終わりました。

これの利点の 1 つは、ボタン クリック イベントを偽造しようとするのをやめられることです。それだけの価値はありますが、電話をかけるOnClickのは間違った方法です。Click本当に必要な場合は、ボタンのメソッドを呼び出します。ただし、アクションを使用すると、すべて処理されます。

もう 1 つの利点は、 をいじる必要がなくなることですKeyPreview。簡単に言えば、ショートカットを実装したい場合は、 を使用しますTAction.ShortCut

于 2013-03-03T19:15:41.820 に答える