当BCB 中按钮提交一个耗时操作的时候,多次点击按钮会提交多次,会导致提交动作多次被执行,可能会发生程序卡死或程序错误。为了防止多次点击提交,不能只是将按钮控件的Enabled 置为 false,这样点击鼠标的事件还是会进入消息队列中,这次执行完后还是会一条一条的响应所有点击事件。
在这里我处理思路有两种:要么在响应之前清除消息队列的点击事件消息,要么就在执行完后直接弹框提示已执行完成。主要的实现代码如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Enabled = false;
Memo1->Lines->Add("----------");
for(int i=0;i<1000000000;i++);// Sleep(1000);
Memo1->Lines->Add("+++++");
//两种清除消息队列的方法用其一都可以清除多次点击的消息队列,但是注意一定要放在耗时操作之后
//这个一定要放在 Button1->Enabled = true 之前
Application->ProcessMessages();
//这个放在 Button1->Enabled = true 之前或之后都可以
//MSG msg;
//while(PeekMessage(&msg, Handle, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE) != NULL);
Button1->Enabled = true;
//弹框也可以自动清除多次点击的消息队列
//ShowMessage("已完成,其余点击并不会被响应");
}