2

ここでは、何度か遭遇した状況を再現しました。私には2つの形式があります。Form1とForm2。Form1には1つの編集フィールドがあり、OnKeyupイベントが接続されています。Form2にはボタンが1つだけあり、OnClickが接続されています。Form1ユーザーがTEditタイプのフィールドでVK_Retrunを押すと、Form2.Showが実行されます。Form2は、ボタンにフォーカスを置いて表示されます。イベントOnClickは、内部のコード「Close」に接続されています。ユーザーがキーボードのVK_RETURNキーを押すと、Form2は期待どおりに閉じます。しかし、ここで問題が発生し、Form2が再び真っ直ぐに起動しました。Form1がフォーカスを取得したとき、キーはまだ「キュー」にあり、編集フィールドはVK_RETURNに進むようです。

この状況の完全なリストは次のとおりです。

    unit UTestButton;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;

    type
      TForm1 = class(TForm)
        Edit1: TEdit;
        procedure Edit1KeyUp(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    uses UTestButton2;

    {$R *.dfm}

    procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      if (Key = VK_Return) THEN
        Form2.Show;
    end;

    end.

これは2番目のユニットです。

    unit UTestButton2;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;

    type
      TForm2 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form2: TForm2;

    implementation

    {$R *.dfm}

    procedure TForm2.Button1Click(Sender: TObject);
    begin
      Close;
    end;

    end.

praxesでは、ラベルや情報を含む単純なフォームを使用することがありますが、1つまたは2つのボタンを使用し、ボタンに焦点を合わせます。ユーザーは期待どおりにキーボードのキーを押すことができます。彼がvk_returnを使用し、基になるコントロールがキーを使用する場合、次のようにバッファーのキーをクリアするためにいくつかの回避策を実行する必要があります。

    PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE);

それは私にとって完全に満足のいくものではありません。この状況の解決策はありますか?

4

1 に答える 1

3

最初の編集ボックスではなく、単にOnKeyDownイベントを処理しOnKeyUpます。

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_RETURN) then
    Form2.Show;
end;
于 2012-12-08T17:51:04.540 に答える