按下按钮时德尔福停止程序

时间:2014-11-27 17:58:32

标签: delphi delphi-7

如何通过按某个按钮在执行过程中停止重复循环?程序只将一个字母写入编辑框,然后等待一段时间,按指定顺序写另一个字母等,暂停使用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;

我需要的是:我按下一个按钮然后写下这些字母,然后每按一下其他按钮,它就会停止程序并跳转到其他按钮程序。

我知道这是可能的,因为很多应用程序可以循环,直到你按下按钮并按下按钮时停止循环,但我不知道如何做到这一点。目前,应用程序冻结,直到完成循环。

3 个答案:

答案 0 :(得分:5)

正如大卫在评论中所说,你需要了解事件驱动的编程。很快就说,当你的程序启动时,它只是在等待事件发生。事件是例如按钮单击,用户在编辑框中键入内容,从通信端口等接收数据。作为程序员的工作是编写事件处理程序,即由这些事件触发的代码(并希望做一些有用的事情)。 / p>

您的代码中已经有一个事件处理程序Button4Click。根据您的描述,您还将拥有另一个OnClick处理程序,也许它是Button5Click。要完成任务,您还需要一个具有OnTimer事件的TTimer控件。事件处理程序应该尽可能少。

所以,在你的反应游戏中#39;你需要三个事件:

  • 按钮4点击开始你的游戏'
  • 更改编辑框中字符的Timer1Timer事件
  • 按钮5点击停止游戏'。

此外,您还需要一个存储空间来显示字符。由于您显示单个字符,因此可以将它们存储在字符串中。如果要在编辑框中显示字符串,则可以使用TStringList作为存储。要知道在下一个计时器事件中显示哪个字符,可以使用整数变量作为计数器。

Button4Click事件处理程序

  • 初始化字符存储,让我们调用它,以及计数器变量,让它称之为i。
  • 显示编辑框中的第一个字符
  • 设置计时器间隔
  • 启动计时器(在设计时设置Timer1.Enabled:= false)

Timer1Timer事件处理程序

  • 停止计时器
  • 递增计数器i,
  • 显示角色s [i]
  • 根据需要设置新的间隔
  • 重启计时器

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仍然会解冻,您可以停止该过程。

enter image description here

http://www.delphibasics.info/home/delphibasicssnippets/threadswithparametersexample