在这里我重现了我遇到过的几次情况。我有两个表格。Form1和Form2。Form1有一个编辑字段和连接的OnKeyup事件。Form2只有一个按钮,而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.这是第二单元。
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,而底层控件使用键,我必须做一些变通方法来清除buffer键,就像下面这样
PeekMessage(Mgs, 0, WM_CHAR, WM_CHAR, PM_REMOVE);这对我来说并不完全令人满意。有没有人能解决这种情况?
发布于 2012-12-09 01:51:05
只需处理初始编辑框的OnKeyDown事件而不是OnKeyUp:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_RETURN) then
Form2.Show;
end;https://stackoverflow.com/questions/13780093
复制相似问题