【问题标题】:I can't repaint my form in Delphi我无法在 Delphi 中重新绘制表单
【发布时间】:2012-01-16 14:31:05
【问题描述】:

我正在创建一个 Delphi 程序,我的程序中有这段代码:

begin
  if edit1.Text='salam' then
  begin
    for i := 1 to 10 do
    begin
      progressbar1.Value := progressbar1.Value+1;
      sleep(100);
    end;
  end;
end;

我想让进度条平稳移动。但这段代码不是那样的。
我该怎么办?我想在睡觉后重新绘制表格。

【问题讨论】:

  • 您在 GUI 线程中执行 sleep(其他所有操作都已完成)并阻止 UI 重新绘制。您必须在另一个线程中执行此操作,或者在表单上使用 TIdAntiFreeze 组件。
  • 您的真实代码肯定没有休眠。你想达到什么目的。
  • 我想你在做之后忘记了begin,在睡眠之后忘记了end。您肯定不想只循环设置progressbar1.value 的行吗?
  • @WarrenP 阅读 cmets 到 Cesar 的答案。
  • 我想知道 Sleep(x) 在 iOS 上是否更糟糕。应该是吧。

标签: ios delphi delphi-xe2 firemonkey


【解决方案1】:

你应该这样做......

begin
  if edit1.Text='salam' then
  begin
    progressbar1.Step:=1;
    for i := 1 to 10 do
    begin
      progressbar1.StepIt;
      Application.ProcessMessages;
      Sleep(100);
    end
  end;
end;

Windows 需要处理要重绘的消息并知道您的应用没有冻结,Application.ProcessMessages 可以做到这一点。

【讨论】:

  • 我还没有进入我的进度条。我正在创建一个 iOS HD 应用程序。重要吗?
  • 我还没有为 iOS 开发过任何东西,所以我不确定 Application.ProcessMessages 是否存在,但如果不存在,则必须有一个等价物。
  • 这在很多方面仍然是错误的。您的代码适合愚蠢的演示,但永远不要在生产中编写这样的代码。你几乎不应该在主线程中睡觉,当然也永远不要在循环中睡觉。添加 Application.ProcessMessages 可以解决冻结主窗口消息循环的明显问题,但它可能会在大型生产应用程序中引起其他有趣的副作用。
  • @WarrenP 是对的,但由于它只是一个简单的进度条,因此无需编写更复杂的代码来完成此操作。
  • 重入可以让各种事情发生。例如,进度条可能会被破坏。
猜你喜欢
  • 1970-01-01
  • 2021-07-29
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-27
  • 2014-05-03
  • 1970-01-01
相关资源
最近更新 更多