在WHILE LOOP中忽略CLOSE按钮

时间:2014-03-21 08:56:43

标签: delphi delphi-7

我的程序中有一些简单的while循环,例如Countdown程序。我也有一个关闭的位图按钮(不需要任何代码吗?)。当倒计时正在进行时(while),在loop符合要求之前,所有内容(所有按钮和编辑)都会被忽略/无法使用。

有没有办法在满足要求之前停止循环?

这是我的代码:

while iCountDown > 0 do
    begin
      application.ProcessMessages;
      dec(iCountDown)
      lblOutput.Caption := IntToStr(iCountDown);
      sleep(1000);
    end;
    ShowMessage ('Countdown has finished!');

感谢。

2 个答案:

答案 0 :(得分:4)

声明表单的私有字段,如下所示:

FCancelLoop: Boolean;

在开始循环之前将变量设置为False。在关闭按钮的OnClick事件处理程序中,将FCancelLoop设置为True。检查循环内FCancelLoop的值,如果发现它是True,则跳出循环。

FCancelLoop := False;
while iCountDown > 0 do
begin
  Application.ProcessMessages;
  if FCancelLoop then
    exit; // or perhaps break, but you get the idea
  dec(iCountDown);
  lblOutput.Caption := IntToStr(iCountDown);
  Sleep(1000);
end;

但是,此代码还有其他问题。它使用臭名昭着的Application.ProcessMessages,它有使你的生活比你想要的更复杂的倾向。您的事件处理程序是否可以防止重新入侵?在主线程上调用Sleep会阻塞该线程并使其无响应。你真的不想要那个。

更好的解决方案是使用计时器运行倒计时循环。

答案 1 :(得分:1)

不同的解决方案可能是一个线程。它的优点:

  • 在调用Sleep
  • 时不会阻止主线程
  • Application.ProcessMessages不需要
  • 它不会干扰关闭按钮

synchronize一起使用时,它还可以更新标签标题和其他UI元素。

倒计时消息的代码('倒计时已完成!')可以在OnTerminate事件处理程序中执行 - 没有synchronize,因为它将在主线程中执行< / em> context。