压下一个按钮,不断的触发一个动作,直至放开按钮,怎么做?

Libran 2002-10-07 04:42:32
.
...全文
87 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Libran 2002-10-12
  • 打赏
  • 举报
回复
多谢,不过应该修改一下:
{
if(Button==mbLeft)
{
UP = false;
int i = 0;
while (!UP)
{
Button1->Caption = AnsiString(i++);
Application->ProcessMessages();//防止进入死循环
}
}
}
网事随逢 2002-10-12
  • 打赏
  • 举报
回复
我回去试了一下,实现了这样一个结果不知道你是否满意?:
1、放一个Button1到窗体上。
2、定义全局变量 bool UP=false;
3、在OnMouseDown()事件里
{
if(Button==mbLeft)
{
UP=false;
if(!UP)
{
for(int i;i<=1000000;i++)
{
Button1->Caption=AnsiString(i);
Application->ProcessMessage;//防止进入死循环
if(UP) break;
}
}
}
}
4、在OnMouseUp事件里面:
{
UP=true;
}
5、从别人那里学来的,共享。如果有问题继续讨论。
注:Application->ProcessMessage实现系统资源的自动维护与配置,如果出现资源使用优先级问题或资源使用分配不足问题,该循环不会影响其他线程的进行,但是回减缓本身循环的速度。因此不一定使用线程去处理??!!
orcher 2002-10-09
  • 打赏
  • 举报
回复
智力题?设个全局变量+while循环就不错呀?
你还可以复杂一点,自定义消息,然后不停发送不停捕捉
更复杂一点可以用信号量和timer
最复杂的你可以把一个布尔量写到一个文件里,press和down的时候修改文件
mme 2002-10-08
  • 打赏
  • 举报
回复
timer控件好像不太好,占用太多cpu时间,而且不够准确
orcher 2002-10-08
  • 打赏
  • 举报
回复
用个回调函数怎么样?--乱说的,别骂我,呵呵
wzn0521 2002-10-08
  • 打赏
  • 举报
回复
是啊,用个Timer就可以了!
bequickly 2002-10-08
  • 打赏
  • 举报
回复
我觉得可以这样
在MOUSEDOWN的事件里
while(TRUE)
{
// do sth..
sleep(100); // <- 加一些延时
::PeekMessage(...)
::PumpMessage..
if (msg.. == MOUSEUP)
break
}

但是这样很无聊 效率肯定比其它方法高 但TIMER是最合适做这个工作的 如果要严格控制时间就去用THREAD
bcbsoft 2002-10-08
  • 打赏
  • 举报
回复
同意 cch7701(虾米) 的方法

liu76xt 考虑得更周全
风-君子 2002-10-08
  • 打赏
  • 举报
回复
楼上的程序有试过吗?这么做执行鼠标按下状态时就进入死循环了,根本执行不了MouseUp事件。
个人感觉用线程和用Timer控件就没意思了。
Click事件实在鼠标弹起后,OnMouseUp事件之前执行,我想这是难点吧。
keaiser 2002-10-08
  • 打赏
  • 举报
回复
用Timer应该可以
不过我觉得响应Button的MouseDown和MouseUp事件,
bool flag=true; //在头文件的private区

//一下在MouseDown中
if(Button==mbLeft)
{
while(flag)
{
.......
}
}

//一下在Button的MouseUp中
if(flag)
flag=false;


我觉得这样更好一些,各位看呢?
szbug 2002-10-07
  • 打赏
  • 举报
回复
用一个Timer就行了。。。有问题吗?
网事随逢 2002-10-07
  • 打赏
  • 举报
回复
如果这个需求是孤立的话,应该有很多方法,但是如果不是孤立的而是在一个整个的系统中可能用线程比较好,因为这样易于管理,可以设定优先级:
1、如果使用timer,那在触发onmouseup onmousedown 的时候如果有更高优先级的处理请求增么办?比如:在onmousedown 里我实现删除N条纪录,但是主进程同时在进行udp的收发,由于udp是不可靠的,应该尽量保持其足够的系统资源,这样的话是否会有问题。
2、如果使用线程,可以根据需要设置不同的处理优先级,可能会好一些。
3、我要回去试试。
  • 打赏
  • 举报
回复
Application->ProcessMessage()
大大怪老张 2002-10-07
  • 打赏
  • 举报
回复
弄个while循环

循环的开关在button的onmousedown里设为true,onmouseup里设成false

当然了,如果不是把循环放到单独的线程里,记得要加 Application->xxxMessage(); //具体函数名字忘了 :(
shadowstar 2002-10-07
  • 打赏
  • 举报
回复
也可以用线程来实现呀!~
南郁 2002-10-07
  • 打赏
  • 举报
回复
不要用到去 new 一个 TTimer控件,最好直接调用API的Timer,在按下时建立,抬起后立即Kill掉,这样代码虽然比使用TTimer多一些,但程序负荷相当显得以便。
zlc990405 2002-10-07
  • 打赏
  • 举报
回复
也可以启动一个进程,还需要一个信号量进行控制。
Libran 2002-10-07
  • 打赏
  • 举报
回复
多谢虾米,已经用Timer实现过了,只是觉得应该有更好的办法
suerain 2002-10-07
  • 打赏
  • 举报
回复
哈哈,还是timer
zlc990405 2002-10-07
  • 打赏
  • 举报
回复
我的意见也是使用timer控件。
加载更多回复(2)

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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