在这里,我复制了我遇到过几次的情况。我有两种形式。表格 1 和表格 2。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.
在实践中,我有时会使用带有标签或信息的简单表单,但只有一两个按钮并专注于按钮。用户可以按预期按键盘上的键。如果他使用 vk_return 并且底层控件使用密钥,我必须做一些解决方法来清除缓冲区的密钥
PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
这对我来说并不完全令人满意。有没有人解决这种情况?