Tedit.onkeyup+message()或用回车键确认的输入框再次无限调用Tedit.onkeyup



有点尴尬,但我想不出解决这个问题的正确方法。我的表单上只有一个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;

最新更新