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,但是通常需要调用它来表明您做错了事。

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

07-26 09:37