为什么TButton.enable在这种情况下不会产生预期的结果?

时间:2013-07-04 04:26:54

标签: delphi firemonkey delphi-xe3

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中运行得很好。

感谢。

1 个答案:

答案 0 :(得分:6)

它没有反应,因为只有当按钮重新自我时才会看到反应。这只发生在处理下一个wm_Paint消息时,但是你的代码没有处理消息,因此按钮,甚至整个表单在该循环的持续时间内保持不变。

立即修复将调用Button4.Repaint,这将允许按钮更新其外观。但是,这并不会处理所有消息。

糟糕的解决方法是偶尔在你的循环中调用Application.ProcessMessages,但需要调用它通常表明你做错了。

最后,最好的解决方法是将长时间运行的任务移到另一个线程中。启动任务时禁用该按钮,并在任务完成时启用它。