button 的执行问题 当我在极快的时候点击2下 btutton的执行情况 如下 button_onclick(){do1,do2,do3,do4,}当点击第一下的时候 代码开始执行到do2,这时事件还没处理完 。后第2次的点击事件也开始了 这怎么避免 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 button_onclick(){ button.enabled:=false;do1, do2, do3, do4, button.enabled:=true;} button.enabled := false;try do1; do2; do3; do4;finally button.enabled := true;end; 因为你这个button始终是enable的啊,所以任何时候都能去点。所以,在点了以后,应该让它先disable掉,然后等执行结束了再enable 这是最好的办法 也是最有效的办法在做B/S的时候 为了防止重复提交也是这么实现的utton.enabled := false; try do1; do2; do3; do4; finally button.enabled := true; end; 只要button_onclick()中没有处理消息循环的代码,它会一直等到do4完成的时候才会再次响应的,所以一般你不用担心重入的问题。但是给用户的感觉不友好,如果处理的时间较长就会出现用户点了按钮之后看起来没什么反应,然后他以为没点中,再次点,结果就执行了两遍。所以建议在前面把Enabled置False,在后面把Enabled置True。当然你可以继承TButton,重写Click方法,在其中加上那两句,然后你都使用你重写过的Button button.enabled := false; try do1; do2; do3; do4; except button.enabled := true; end; button.enabled := true; 谁说会等到do4完成才会再次响应?如果do1,do2,do3,do4里面的操作有能够响应系统消息的代码,那就会重入。并且,按照楼主的代码,do1,do2,do3,do4似乎执行时间比较长,否则也不会考虑重入问题,那么执行时间长的代码,一定要加入响应系统事件的代码,否则界面停顿,程序很不友好。所以,这里一定会重入的问题。 enabled:=false;....enabled:=true;这样不行么? 可以再把光標的形狀修改一下,讓用戶相信已點完,執行后再恢復光標形狀screen.cursor:=crhourglass;screen.cursor:=crdefault; procedure TForm1.Button1Click(Sender: TObject);begin Self.OnClick := nil; do1; do2; do3; do4; Self.OnClick := Button1Click;end; 你说出的意见就是对我的最大帮助:) Delphi有没有悾件数组的概念,象VB那样。若有,怎么用?若您第一个回答正确,奉送50分 如何制作一个倒计时的进度条, 在线等待, 立即给分! 心情不爽,散分 如何注冊Delphi7.0? FieldByName("price"+IntToStr(pricetype)). 关于 microsoft help workshop的问题 XE5怎么这么大啊,天啊,神啊 怎样设置installshield使安装后的程序出现在开始菜单? 一个简单的问题:关于Real向Str转换. 500分急求类似netmeeting的软件的开发方法 什么是窗口句柄
button.enabled:=false;do1,
do2,
do3,
do4,
button.enabled:=true;}
try
do1;
do2;
do3;
do4;
finally
button.enabled := true;
end;
所以,在点了以后,应该让它先disable掉,然后等执行结束了再enable
在做B/S的时候 为了防止重复提交
也是这么实现的
utton.enabled := false;
try
do1;
do2;
do3;
do4;
finally
button.enabled := true;
end;
try
do1;
do2;
do3;
do4;
except
button.enabled := true;
end;
button.enabled := true;
谁说会等到do4完成才会再次响应?
如果do1,do2,do3,do4里面的操作有能够响应系统消息的代码,那就会重入。并且,按照楼主的代码,do1,do2,do3,do4似乎执行时间比较长,否则也不会考虑重入问题,那么执行时间长的代码,一定要加入响应系统事件的代码,
否则界面停顿,程序很不友好。所以,这里一定会重入的问题。
enabled:=false;
....
enabled:=true;这样不行么?
screen.cursor:=crhourglass;
screen.cursor:=crdefault;
begin
Self.OnClick := nil;
do1;
do2;
do3;
do4;
Self.OnClick := Button1Click;
end;