考虑在给定按钮的 OnClick 事件中执行的以下代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
button1.enabled := false; //Line 1
application.processmessages; //Line 2
Sleep(3000); //Line 3
button1.enabled := True; //Line 4
Release; //Line 5
end;
在 Delphi 2010 中,如果单击此按钮后您设法执行另一个
在第 3 行执行忙时点击它,随后点击
事件显然会存储在命令队列中,因此当
Release(Line 5) 过程被调用,应用程序将尝试处理
它。因此,点击事件将再次被触发。第二次
周围,按钮组件已被销毁,因此引发了“访问冲突”错误。
系统确认第二次点击的整个概念,当相应的
按钮被禁用似乎没有声音。对这种阴暗的行为有什么解释吗?
最佳答案
系统的行为与设计完全一致,但请注意您的代码违反了所有合理的设计原则。具体使用Sleep
和 ProcessMessages
在输入事件处理程序中都是不受欢迎的。
程序以这种方式运行的原因如下:
OnClick
处理程序返回并且应用程序的消息循环继续。 CM_RELEASE
消息之前),所以按钮 OnClick
处理程序再次运行。 OnClick
处理程序调用 ProcessMessages
然后处理 CM_RELEASE
并杀死表格。 The whole concept of acknowledging the second click by the system when the respective button is disabled does not seem to be sound.
关键是在处理输入消息时而不是在生成输入消息时检查按钮的启用状态。必须这样,因为输入消息是非常低级的东西,只有应用程序才能将它们解释为按钮点击之类的东西。
有很多方法可以修复您的代码,但我不愿意提出任何建议,因为这显然是用于说明的代码。但我会说,所有合理的解决方案都将涉及删除对
Sleep
的调用。和`ProcessMessages。
关于delphi - 在 Delphi 2010 中,尽管相应按钮被禁用,但仍处理 Click 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17587284/