Tedit.onkeyup + message() 或用 return 键确认的输入框再次无限调用 Tedit.onkeyup
Tedit.onkeyup + message() or inputbox confirmed with return key infinitely calls Tedit.onkeyup again
有点尴尬,但我想不出解决这个问题的正确方法。
我的表单上有一个 Tedit class 组件,用户可以在其中输入一些命令或参数。当出现错误或需要额外输入时,会显示消息框或输入框。
当用户使用 return 键 - vk_return 确认消息框时,再次调用 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。
当用户使用 return 键确认消息框时,Keydown 事件关闭消息框,keyUp 事件由编辑处理。
...更新...
为了防止在按下 return 键时代码 运行 重复 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;
有点尴尬,但我想不出解决这个问题的正确方法。 我的表单上有一个 Tedit class 组件,用户可以在其中输入一些命令或参数。当出现错误或需要额外输入时,会显示消息框或输入框。 当用户使用 return 键 - vk_return 确认消息框时,再次调用 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。
当用户使用 return 键确认消息框时,Keydown 事件关闭消息框,keyUp 事件由编辑处理。
...更新...
为了防止在按下 return 键时代码 运行 重复 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;