TButton + VK_Return

时间:2012-12-08 17:44:28

标签: delphi

这里我重现了我遇到过几次的情况。我有两种形式。 Form1和Form2。 Form1有一个编辑字段和OnKeyup事件连接起来。 Form2只有一个按钮,OnClick连接起来。当在Form1用户中按TEDit类型字段中的VK_Retrun时,将执行Form2.Show。 Form2显示焦点在按钮上。事件OnClick与内部代码“关闭”相连。如果用户按下键盘上的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.

这是第二个单位。

    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中,我有时使用带有标签或信息的简单形式,但只使用一个或两个按钮,并专注于按钮。用户可以按预期按键盘上的键。如果他使用vk_return并且底层控件使用密钥,我必须做一些解决方法来清除缓冲区的键,如

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

这对我来说并不完全令人满意。有没有解决这种情况的人?

1 个答案:

答案 0 :(得分:3)

只需处理OnKeyDown事件而不是OnKeyUp作为初始编辑框:

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_RETURN) then
    Form2.Show;
end;