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;