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

Yan*_*iel 3 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;
Run Code Online (Sandbox Code Playgroud)

我希望Button4在进入由"for"循环表示的繁忙操作之前变灰.尽管如此,它没有.

在OnClick处理程序执行结束时,该按钮"似乎没有响应"Button4.Enabled:= false.为什么?

我该如何解决它?

这在VCL中运行得很好.

谢谢.

Rob*_*edy 6

它没有反应,因为反应只有在按钮自我修复时才能看到.这仅在处理下一个wm_Paint消息时发生,但是您的代码不处理消息,因此按钮以及整个表单在该循环的持续时间内保持不变.

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

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

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

  • 调用ProcessMessages通常是出错的标志 (6认同)