我的程序中有一些简单的while循环,例如Countdown程序。我也有一个关闭的位图按钮(不需要任何代码吗?)。当倒计时正在进行时(while
),在loop
符合要求之前,所有内容(所有按钮和编辑)都会被忽略/无法使用。
有没有办法在满足要求之前停止循环?
这是我的代码:
while iCountDown > 0 do
begin
application.ProcessMessages;
dec(iCountDown)
lblOutput.Caption := IntToStr(iCountDown);
sleep(1000);
end;
ShowMessage ('Countdown has finished!');
感谢。
答案 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。