3

以下发生在 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 中工作得很好。

谢谢。

4

1 回答 1

6

它没有反应,因为反应仅在按钮重新绘制自身时可见。这只发生在处理下一条 wm_Paint 消息时,但您的代码不处理消息,因此按钮,实际上是整个表单,在该循环期间保持不变。

直接的解决方法是调用Button4.Repaint,这将允许按钮更新其外观。但是,这并不能处理所有消息。

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

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

于 2013-07-04T04:41:59.127 回答