如何通过按某个按钮在执行过程中停止重复循环?程序只将一个字母写入编辑框,然后等待一段时间,按指定顺序写另一个字母等,暂停使用sysutils.sleep
。
示例:
procedure TForm1.Button4Click(Sender: TObject);
var
j: integer;
begin
edit1.Text:='a';
edit1.Text:='a';
sysutils.Sleep(l*20);
edit1.Text:='b';
edit1.text:='3';
sysutils.sleep(l*20);
j:= 1 ;
repeat
edit1.Text:='1';
sysutils.sleep(l*2);
edit1.Text:='0';
edit1.text:='2';
sysutils.sleep(l*2);
edit1.Text:='3';
edit1.text:='4';
sysutils.sleep(l*2);
edit1.Text:='5';
sysutils.sleep(l*2);
j:= j + 1;
until j = 5;
end;
我需要的是:我按下一个按钮然后写下这些字母,然后每按一下其他按钮,它就会停止程序并跳转到其他按钮程序。
我知道这是可能的,因为很多应用程序可以循环,直到你按下按钮并按下按钮时停止循环,但我不知道如何做到这一点。目前,应用程序冻结,直到完成循环。
答案 0 :(得分:5)
正如大卫在评论中所说,你需要了解事件驱动的编程。很快就说,当你的程序启动时,它只是在等待事件发生。事件是例如按钮单击,用户在编辑框中键入内容,从通信端口等接收数据。作为程序员的工作是编写事件处理程序,即由这些事件触发的代码(并希望做一些有用的事情)。 / p>
您的代码中已经有一个事件处理程序Button4Click。根据您的描述,您还将拥有另一个OnClick处理程序,也许它是Button5Click。要完成任务,您还需要一个具有OnTimer事件的TTimer控件。事件处理程序应该尽可能少。
所以,在你的反应游戏中#39;你需要三个事件:
此外,您还需要一个存储空间来显示字符。由于您显示单个字符,因此可以将它们存储在字符串中。如果要在编辑框中显示字符串,则可以使用TStringList作为存储。要知道在下一个计时器事件中显示哪个字符,可以使用整数变量作为计数器。
Button4Click事件处理程序
Timer1Timer事件处理程序
Button5Click事件处理程序
希望这能让你前进。我没有为你编写任何示例代码,所以你可以自己考虑一下。但是,如果你碰壁,请询问有关你问题的具体问题。
答案 1 :(得分:3)
每个Windows应用程序都是消息驱动。单击该按钮实际上是在Windows上注册的某个位置单击鼠标,并将其转换为发送到应用程序的消息。应用程序必须处理该消息,以便在最终可以调用将处理该鼠标交互的过程之前确定其含义。你的TForm1.Button4Click
例程就是这样一个程序。 (此过程(或方法)称为事件处理程序。应用程序将Windows消息转换为事件:应用程序基于事件驱动 strong> architecture。)
当应用程序 1)正在执行代码时,它无法处理消息。 TForm1.Button4Click
中的代码(包括其所有循环)在一次传递中执行。只要它执行,它就不会改变应用程序处理另一个Windows消息。
来自Sleep
的{{3}}:
暂停执行当前线程,直到超时间隔结束。
正如您已经发现的那样,Sleep
使应用程序 1)无法响应且冻结。这只是它的特点。
通过停止执行代码:当前运行的例程必须结束。只有这样,应用程序才能处理并响应用户交互。
通过使用仍支持应用程序消息和事件处理的内容,例如一个documentation。 Timer是一个组件,一旦Timer,就会在每次传递Enabled
时执行其OnTimer
事件处理程序。
启用定时器。在每个时间间隔,您都可以执行要在较长时间内执行的所有代码的件。在您的情况下,该段代码正在设置Edit的Text属性。当传递多个间隔并执行所有代码时,您将禁用定时器。
由于您有不同的等待时间和不同的值要设置,因此您必须根据时间的推移更新“编辑”的值,或者更好:已经过了多少个间隔。将该计数保留在变量中,然后进行设置。
1)应用程序的主线程。
答案 2 :(得分:-1)
使用以下应用程序中的线程。即使将程序设置为无限运行,GUI仍然会解冻,您可以停止该过程。
http://www.delphibasics.info/home/delphibasicssnippets/threadswithparametersexample