FireMonkey(Delphi XE3)应用程序中会发生以下情况。查看以下代码(这只是一个虚拟示例,以说明问题):
procedure TForm1.Button4Click(Sender: TObject);
var
i: Integer;
begin
Button4.Enabled:= false; //This should gray-out the button
// get busy for some time
for I := 0 to 100000000000 do
begin
end;
Button4.Enabled:= true;
end;
我希望Button4在进入“ for”循环表示的繁忙操作之前会变灰。尽管如此,事实并非如此。
在OnClick处理程序执行结束时,该按钮不会对Button4.Enabled:= false产生“反应”。为什么?
我该如何解决?
这在VCL中效果很好。
谢谢。
最佳答案
它没有反应,因为反应仅在按钮重新绘制自身时可见。仅在处理下一个wm_Paint消息时发生这种情况,但是您的代码未在处理消息,因此在该循环期间,按钮以及整个表单实际上都保持不变。
立即修复是调用Button4.Repaint
,这将允许按钮更新其外观。但是,这不会处理所有消息。
较差的解决方法是偶尔在循环中调用Application.ProcessMessages
,但是通常需要调用它来表明您做错了事。
最后,最好的解决方法是将您长期运行的任务移到另一个线程中。启动任务时禁用该按钮,并在任务完成时将其启用。