编辑框Tedit如何延迟执行OnChange事件

super_caibi 2020-11-14 08:32:10
在编辑框输入字符时实时执行事件,但快速输入时能否暂缓执行,等输入稍微停顿下后再执行?
...全文
270 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
“不甚理想”是你的事件处理代码部分写得不完善,不是方法问题。可能你也听说过斯坦梅茨给福特工厂修发电机的故事(先不管是真是假),画一道只值1美元,知道在哪里画9999~~~
  • 打赏
  • 举报
回复
Sleep释放当前线程时间片,岂不是更卡了
可以在窗体上放一个TApplicationEvents,点击Events中的OnIdle生成一个空闲事件处理:
procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
if Edit1.Focused then
begin
// 你的事件代码
Done := not Edit1.Focused;
end;
end;
tanqth 2020-11-15
  • 打赏
  • 举报
回复
你在OnChange里加上sleep(100),就延迟0.1秒了。
super_caibi 2020-11-15
  • 打赏
  • 举报
回复
感谢楼上两位大神,特别tangth大神,很详细,较完美,也感谢2楼的大神给出了思路,虽然不甚理想,还是谢谢。
tanqth 2020-11-15
  • 打赏
  • 举报
回复

  private
    { Private declarations }
    FEditChange:Boolean;  //增加的变量,标记是否有触发OnChange事件
    t1:int64;
  public
    { Public declarations }
  end;

var
  Form8: TForm8;

implementation

{$R *.dfm}

procedure TForm8.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
  //如果是焦点,并已触发OnChange事件
  if Edit1.Focused and FEditChange then
  begin
    //如果停止了输入400毫秒  (最后一次触发OnChange事件后)
    if GetTickCount-t1>400 then
    begin
      Label1.Caption:=Edit1.Text; //模拟了你需要处理的代码,这里显示输入的内容 可修改为你的业务处理函数
      FEditChange:=False; //还原未触发OnChange事件标记
    end;
    Done := False;//连续调用
  end;
end;

procedure TForm8.Edit1Change(Sender: TObject);
begin
  //已触发
  t1:=GetTickCount; //标记最后触发时间
  FEditChange:=True;  //标记事件已触发
end;

procedure TForm8.FormCreate(Sender: TObject);
begin
  FEditChange:=False;//初始化OnChange事件没有触发过
end;

5,939

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧