怎么才能让我的button的onclick事件执行一次?一个有几年delphi编程经验的人的疑惑!
1.我在窗口上放了一个button
2. button的 onclick事件如下:
btn_1.enabled := false;
sleep(2000);
FormMain.caption :='1';
sleep(2000);
FormMain.caption :='2';
btn_1.enabled := true;
3.onclick 执行两次的情况如下:
当button在btn_1.enabled := false语句执行之后,button会变灰色,这以后 button不会响应鼠标事件,在这个变灰到 onclick事件执行完毕之前,如果你用鼠标再点一次变会的按钮,那么,onclick事件执行完毕之后它又会再执行onclick事件一次.
4. 你有什么办法,让onclick事件返回之后不会灾一次去执行吗?
问题点数:20、回复次数:28Top
1 楼njbudong(jinlingboy)回复于 2002-05-25 22:58:27 得分 0
可以加个变量判断啊!?
================================================================
一颗红心向前看,为了革命两茫然,不好意思才囊尽,只能说上一点点。
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
★ ★
★ ★
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
================================================================Top
2 楼zjj_horse(抽烟的鱼)回复于 2002-05-25 22:59:41 得分 0
对啊,可以加个全局变量啊!Top
3 楼artman(The Final.)回复于 2002-05-25 23:02:58 得分 1
if btn_1.enabled then
begin
btn_1.enabled := false;
sleep(2000);
FormMain.caption :='1';
sleep(2000);
FormMain.caption :='2';
btn_1.enabled := true;
end;
Top
4 楼CeleronII(抽烟的鱼)回复于 2002-05-25 23:02:58 得分 0
加个开关来控制不就得了吗Top
5 楼hardcoffe(君子以自强不息)回复于 2002-05-25 23:06:40 得分 0
加个全局变量?不会吧,那个鼠标的click消息应该是在堆栈里面,当onclick返回后,堆栈里的鼠标消息被处理,那么也就是说,我这个onclick事件执行的两次是顺序执行的 ?加全局变量能有用?我身边没有delphi, 不过,我认为楼上的解决办法是有问题的.当然,谢谢!Top
6 楼hardcoffe(君子以自强不息)回复于 2002-05-25 23:07:14 得分 0
开关?怎么加开关?能给出代码实现吗?Top
7 楼vcshcn(黑天的猩猩)回复于 2002-05-25 23:54:32 得分 1
var b:boolean;
b:=true;
func onclick()
begin
if not b then exit;
...
b:=false;
end;Top
8 楼arg(雨隼)回复于 2002-05-26 00:12:43 得分 1
为什么要加开关,只需要把 onclick事件赋空就可以了
btn_1.btn_1onclick(send:Tobject);
begin
btn_1.onclick := nil;
FormMain.caption :='1';
FormMain.caption :='2';
btn_1.onclick := btnonclick;
end;
Top
9 楼arg(雨隼)回复于 2002-05-26 00:14:35 得分 0
忘了加 procedure,哈哈
procedure btn_1.btn_1onclick(send:Tobject);
begin
btn_1.onclick := nil;
FormMain.caption :='1';
FormMain.caption :='2';
btn_1.onclick := btnonclick;
end;
Top
10 楼ihihonline(潇潇->戒烟)回复于 2002-05-26 00:16:13 得分 0
button.onclick;
begin
....
Button.Enabled := False;
end;Top
11 楼WuHeHai(风之影)回复于 2002-05-26 00:37:59 得分 1
我这样试一下,是可以的,不过总感觉太复杂了点。
procedure TFormMain.btn_1Click(Sender: TObject);
begin
if FiLock = 0 then begin
Inc(FiLock);
btn_1.Enabled := False;
try
btn_1.onclick := nil;
sleep(1000);
FormMain.caption :='1';
sleep(1000);
FormMain.caption :='2';
fianlly
Dec(FiLock);
end;
end;
end;
procedure TFormMain.FormCreate(Sender: TObject);
begin
FiLock := 0;
end;
Top
12 楼hardcoffe(君子以自强不息)回复于 2002-05-26 13:14:44 得分 0
感谢大家的关注,我觉得楼上的设置onclik := nil,真的不错,我明天去做一下,希望大家都是实践过的,不过感觉好象还是....
Top
13 楼hardcoffe(君子以自强不息)回复于 2002-05-28 13:39:12 得分 0
还是不行啊,我上面的办法都试过了,都不行,因为这不是一段代码重入的问题,实际上onclik在任何时候都只有一个执行。我的问题是在按钮变灰的时候在按钮上电击,这次点击会有效,我现在要求是在变灰时的点击无效!Top
14 楼fermium(列御寇)回复于 2002-05-28 21:25:23 得分 0
你如果要在变灰后不执行onclik事件里的代码功能,简单的就是onclik 代码一开始就判断enabled 的值嘛,如果是FALSE就跳过后面的代码,这样onclik 事件虽然回被响应,但不会重复执行真正的代码功能啊,看上去就象只响应了一次。也就是说实际是有效点饥,但看上去是点击无效。Top
15 楼zhptj(北狼)回复于 2002-05-28 21:49:20 得分 0
gzTop
16 楼lwk_hlj(阿凯(学习oralce中))回复于 2002-05-28 21:58:18 得分 0
这样是
///
if button1.tag=1 then exit;
button1.tag:=;
....
代的代码
end;Top
17 楼lwk_hlj(阿凯(学习oralce中))回复于 2002-05-28 22:05:16 得分 0
另外这种情况要求双击鼠标必须够快吧,你可以设置一下鼠标的双击时间间隔啊Top
18 楼ahuige(灰不遛秋(前半身学医后半身学统计))回复于 2002-05-28 22:10:07 得分 0
楼上说的不行,我试过,一开始就判断也不行,就是引发异常也不行。Top
19 楼hardcoffe(君子以自强不息)回复于 2002-05-29 09:37:03 得分 0
有一个办法解决是这样的,onclick结束的时候获得一个时间。onclick开始的时候获得一个时间,并判断和onclick结束的时间的间隔,如果间隔太短,那么exit.
当时,如果onclik事件执行的时间足够长,在button变灰的时间内鼠标单击的次数足够多,那么,这招也是不管用的,可能唯一的办法是退出onclick事件的时候,清空消息队列,可是这应该怎么做呢,欢迎大家继续讨论。Top
20 楼hardcoffe(君子以自强不息)回复于 2002-05-29 09:38:19 得分 0
fermium(列御寇) ,你把我上面的代码拿回去修改再试一下好吗?你会发现问题不是这么简单的。谢谢你的关注。Top
21 楼fermium(列御寇)回复于 2002-06-04 23:59:04 得分 0
真是不行,好怪,再好好想一下,谢谢你Top
22 楼fermium(列御寇)回复于 2002-06-06 11:33:25 得分 10
我现在在山东出差,手边没有DELPHI,下面是我在news.marcocantu.it上问别人的回答,你试一下下面的代码:btn_1.enabled := false;
Caption := Caption +' Dis-';
Caption := Caption +'1';
sleep(2000);
Application.ProcessMessage;
Caption := Caption +'2';
sleep(2000);
Application.ProcessMessage;
Caption := Caption +'3';
sleep(2000);
Application.ProcessMessage;
Caption := Caption +'-En ';
btn_1.enabled := true;
回答的人叫:
Humberto Jemma (Brazil巴西)
我回成都也会试一下
Top
23 楼fermium(列御寇)回复于 2002-06-07 23:33:53 得分 0
Humberto Jemma的方法我测试了,可行Top
24 楼WuHeHai(风之影)回复于 2002-06-08 00:05:56 得分 0
我哪种方式不行吗?我自己测试过的。
不过其中的FiLock是窗体的成员变量。Top
25 楼kmask(降龙十八顶)回复于 2002-06-08 00:27:39 得分 0
在你的语句里加上application.processmessage 就行了,不然,你点一下就会执行一次,不管是否灰化,队列里还是有啊???Top
26 楼nne998(☆☆☆☆☆☆☆伴月)回复于 2002-06-08 01:20:27 得分 6
这样简单,用BlockInput:
btn_1.enabled := false;
BlockInput(true); //<-------
sleep(2000);
FormMain.caption :='1';
sleep(2000);
FormMain.caption :='2';
btn_1.enabled := true;
BlockInput(false); //<-------
Top
27 楼hardcoffe(君子以自强不息)回复于 2002-06-12 12:52:51 得分 0
呵呵,果然还是有高手啊!谢谢大家关注,我终于明白了,以前我没有明白的是:
1、application.processmessage的用法(看来对delphi的消息处理机制没有去了解过)
2、至于blockinput(这可是带星好的大大给的)我也不知道用,等下去看帮助去。Top
28 楼hardcoffe(君子以自强不息)回复于 2002-06-12 16:39:54 得分 0
可是blockinput这个函数好象没有啊?有的话告诉我,我翻遍了 delphi的帮助!Top




