有点尴尬,但我想不出解决这个问题的正确方法。我的表单上只有一个Tedit类组件,用户可以在其中输入一些命令或参数。当出现错误或需要额外输入时,会显示一个消息框或输入框。当用户使用返回键-vkreturn确认消息框时,除非用户使用鼠标确认消息,否则会无限调用tedit onkeyup。
为了解决这个问题,我通常会在显示消息之前暂时将焦点更改为另一个组件。
有人能解释一下为什么会这样吗
我该如何避免这种行为?
procedure Tform1.Edit_INPUTKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if ord(Key) = VK_RETURN then // ENTER
begin
if Edit_INPUT.text = '' then
begin
showmessage('edit box is empty!');
end;
end;
end;
已编辑。。。。
基于@sddk指出我问题的原因,想出了这个:
private
Edit1_lastkeyevent_keyup: boolean;
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Edit1_lastkeyevent_keyup := false;
end;
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if ord(Key) = vk_return then
begin
if Edit1_lastkeyevent_keyup = false then
begin
if Edit1.Text = '' then
begin
showmessage('edit box is empty!');
end;
end;
end;
Edit1_lastkeyevent_keyup := true;
end;
使用编辑的KeyDown事件而不是KeyUp。
当用户用回车键确认消息框时,Keydown事件关闭消息框,keyUp事件由edit处理。
使现代化
为防止按下回车键时代码重复运行100次,可使用以下代码。
private // class private
valueChanged:Boolean;
procedure TForm1.Edit1Change(Sender: TObject);
begin
valueChanged := True;
end;
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Ord(Key) = VK_RETURN then
if Edit1.Text = '' then
begin
if valueChanged then
begin
valueChanged := False;
ShowMessage('edit box is empty!');
end;
end
else
begin
// code your job here
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
valueChanged := True;
end;