CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

怎么才能让我的button的onclick事件执行一次?一个有几年delphi编程经验的人的疑惑!

楼主hardcoffe(君子以自强不息)2002-05-25 22:51:54 在 Delphi / VCL组件开发及应用 提问

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

相关问题

  • delphi编程!
  • delphi编程!
  • delphi编程!
  • delphi编程!
  • delphi编程!(急!)
  • 编程和应用时的Sybase——疑惑
  • 初学网络编程的疑惑
  • delphi的word编程
  • Delphi 网络编程?
  • 初学DELPHI的疑惑

关键词

  • 执行
  • 代码
  • 鼠标
  • sleep
  • 间隔
  • delphi
  • 消息
  • btn
  • onclik
  • caption

得分解答快速导航

  • 帖主:hardcoffe
  • artman
  • vcshcn
  • arg
  • WuHeHai
  • fermium
  • nne998

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo