button 的执行问题

Wozhiyonglangqi 2008-10-23 02:06:55
当我在极快的时候点击2下 btutton的执行情况 如下

button_onclick(){


do1,
do2,
do3,
do4,
}
当点击第一下的时候 代码开始执行到do2,这时事件还没处理完 。
后第2次的点击事件也开始了 这怎么避免
...全文
128 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
luntanwujianhua 2008-10-24
  • 打赏
  • 举报
回复
幫頂
progigy 2008-10-23
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
begin
Self.OnClick := nil;
do1;
do2;
do3;
do4;
Self.OnClick := Button1Click;
end;
天鸽 2008-10-23
  • 打赏
  • 举报
回复
写线程,让电脑自己慢慢执行,反正不会出现卡在那里的现象!!
zhaoxiaohao 2008-10-23
  • 打赏
  • 举报
回复
可以再把光標的形狀修改一下,讓用戶相信已點完,執行后再恢復光標形狀
screen.cursor:=crhourglass;
screen.cursor:=crdefault;
gzmhero 2008-10-23
  • 打赏
  • 举报
回复
头尾各加一句不就好用了么?

其他办法也一样,无论怎样,都要改代码,至少要加这么类似的2句话。
Wozhiyonglangqi 2008-10-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gzmhero 的回复:]
引用 14 楼 Wozhiyonglangqi 的回复:
确实有重入的问题 如何是好


enabled:=false;
....
enabled:=true;

这样不行么?
[/Quote]改死人了 =。=
哎 苦命的娃
gzmhero 2008-10-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 Wozhiyonglangqi 的回复:]
确实有重入的问题 如何是好
[/Quote]

enabled:=false;
....
enabled:=true;

这样不行么?
Wozhiyonglangqi 2008-10-23
  • 打赏
  • 举报
回复
确实有重入的问题 如何是好
gzmhero 2008-10-23
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lake_cx 的回复:]
引用楼主 Wozhiyonglangqi 的帖子:
当我在极快的时候点击2下 btutton的执行情况 如下

button_onclick(){


do1,
do2,
do3,
do4,
}
当点击第一下的时候 代码开始执行到do2,这时事件还没处理完 。
后第2次的点击事件也开始了 这怎么避免

只要button_onclick()中没有处理消息循环的代码,它会一直等到do4完成的时候才会再次响应的,所以一般你不用担心重入的问题。但是给用户的感觉不友好,如果处理的时…
[/Quote]

谁说会等到do4完成才会再次响应?
如果do1,do2,do3,do4里面的操作有能够响应系统消息的代码,那就会重入。

并且,按照楼主的代码,do1,do2,do3,do4似乎执行时间比较长,否则也不会考虑重入问题,那么执行时间长的代码,一定要加入响应系统事件的代码,
否则界面停顿,程序很不友好。所以,这里一定会重入的问题。
scutLiu 2008-10-23
  • 打赏
  • 举报
回复
button.enabled := false;
try
do1;
do2;
do3;
do4;
except
button.enabled := true;
end;
button.enabled := true;


lake_cx 2008-10-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 Wozhiyonglangqi 的帖子:]
当我在极快的时候点击2下 btutton的执行情况 如下

button_onclick(){


do1,
do2,
do3,
do4,
}
当点击第一下的时候 代码开始执行到do2,这时事件还没处理完 。
后第2次的点击事件也开始了 这怎么避免
[/Quote]
只要button_onclick()中没有处理消息循环的代码,它会一直等到do4完成的时候才会再次响应的,所以一般你不用担心重入的问题。但是给用户的感觉不友好,如果处理的时间较长就会出现用户点了按钮之后看起来没什么反应,然后他以为没点中,再次点,结果就执行了两遍。所以建议在前面把Enabled置False,在后面把Enabled置True。当然你可以继承TButton,重写Click方法,在其中加上那两句,然后你都使用你重写过的Button
fangsp 2008-10-23
  • 打赏
  • 举报
回复
这是最好的办法 也是最有效的办法
在做B/S的时候 为了防止重复提交
也是这么实现的
utton.enabled := false;
try
do1;
do2;
do3;
do4;
finally
button.enabled := true;
end;
Corn1 2008-10-23
  • 打赏
  • 举报
回复
因为你这个button始终是enable的啊,所以任何时候都能去点。
所以,在点了以后,应该让它先disable掉,然后等执行结束了再enable
Wozhiyonglangqi 2008-10-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Corn1 的回复:]
不管用哪种方法,都是要改代码的
[/Quote]是的 代码是要改的 ^_^
大侠有没相关这方面的经验 为什么一个事件还没完成他还能在触发下次的事件呢
zhouyu5241 2008-10-23
  • 打赏
  • 举报
回复
帮顶!
zhouyu5241 2008-10-23
  • 打赏
  • 举报
回复
帮顶!
Corn1 2008-10-23
  • 打赏
  • 举报
回复
不管用哪种方法,都是要改代码的
Wozhiyonglangqi 2008-10-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Corn1 的回复:]
button.enabled := false;
try
do1;
do2;
do3;
do4;
finally
button.enabled := true;
end;
[/Quote]同上
Wozhiyonglangqi 2008-10-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gzmhero 的回复:]
button_onclick(){
button.enabled:=false;

do1,
do2,
do3,
do4,
button.enabled:=true;

}
[/Quote]这虽然可行 但是修改量太大了 。大家是否在开发中有遇到同样的问题
Corn1 2008-10-23
  • 打赏
  • 举报
回复
button.enabled := false;
try
do1;
do2;
do3;
do4;
finally
button.enabled := true;
end;
加载更多回复(1)

5,388

社区成员

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

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