如何防止在事件处理已经运行时启动新的事件处理?德尔福并防止事件处理
我按下按钮1并启动事件处理程序。打印速度慢。 在窗体按钮,编辑,组合中有几个控件,我希望只有在完成运行处理程序后才允许新事件。
我已经使用fRunning变量来锁定共享事件处理程序中的处理程序。有更聪明的方法来处理这个问题吗?
procedure TFormFoo.Button_Click(Sender: TObject);
begin
if not fRunning then
try
fRunning := true;
if (Sender = Button1) then // Call something slow ...
if (Sender = Button2) then // Call something ...
if (Sender = Button3) then // Call something ...
finally
fRunning := false;
end;
end;
如果在窗体中只有一个Button1,这个很好的解决方案。 Button1的OnClick被禁用,但如果在Button1事件处理期间调用Application.ProcessMessages,则Button2可以触发新的OnClick事件。 – pKarelian 2010-03-08 07:47:02
谢谢dummzeuch。接口包装器是非常方便的方式来销毁临时事件对象。您不必拨打免费()。 – pKarelian 2010-03-08 07:53:16
+1但在*理论*中,有可能该事件在一段时间内不会重新连接。在实践中,我认为可以肯定的是,接口实例在调用完成时被破坏(并且事件处理程序被重新连接)。 – 2010-03-08 10:08:42