点击“开始”按钮,进入循环生成随机数,点击“停止”按钮,跳出随机数生成循环。
生成的随机数显示在一个Lable上。我写了以下代码,但是运行的时候,按了“开始”按钮后,程序一个劲的显示随机数,其它按钮都无法响应,连关闭都无法关闭。
请问出现这种情况的原因是什么?要如何实现?先谢了。procedure TFrmLottery.BtnStartClick(Sender: TObject);  //点击开始按钮
begin
 Stop:=False;
 while not Stop do    //循环生成随机数
 begin
 Randomize;
 LblRndNum.Caption:=IntToStr(Random(5030)+1);  //生成随机数,显示在label中
 sleep(SLEEPTIME);     //睡眠下,免得变得太快,在label上看起来很闪
 end;
end;procedure TFrmLottery.BtnStopClick(Sender: TObject); //点击 停止按钮
begin
Stop:=True;

解决方案 »

  1.   

    用一个timer好了。
    按开始的时候,timer.Enabled := true;
    停止,timer.Enabled := false;在timer的OnTimer事件里:
    LblRndNum.Caption:=IntToStr(Random(5030)+1);
      

  2.   

    如果不想改成这样,可以在你原来的button1的代码里,sleep后面,加上一句:
    Application.ProcessMessages;因为sleep的时候,主线程阻塞在那里,不处理任何消息,相当于“死掉”一样。
    所以,你button2按下去的时候,他不会去处理。
    而加上这一句,就是让他去处理消息队列。
      

  3.   

    在按钮1中加一句:
    application.ProcessMessages;
      

  4.   

    procedure TFrmLottery.BtnStartClick(Sender: TObject);  //点击开始按钮 
    begin 
     Stop:=False; 
     while not Stop do    //循环生成随机数 
     begin 
     Randomize; 
     LblRndNum.Caption:=IntToStr(Random(5030)+1);  //生成随机数,显示在label中 
     
     sleep(SLEEPTIME);     //睡眠下,免得变得太快,在label上看起来很闪 
     application.ProcessMessages; 
     end; 
    end; 
      

  5.   

      Stop := False;
      Randomize;
      while not Stop do //循环生成随机数
      begin
        Application.ProcessMessages;
        if Application.Terminated then
          Break;
        LblRndNum.Caption := IntToStr(Random(5030) + 1); //生成随机数,显示在label中
        sleep(SLEEPTIME); //睡眠下,免得变得太快,在label上看起来很闪
      end;
      

  6.   


    procedure TForm1.Button1Click(Sender: TObject);
     var
       memo1: Tmemo;
    begin
      memo1:=tmemo.Create(self);
     if  button1.Caption='start' then
        button1.Caption :='stop'
     Else if    button1.Caption ='stop' then
        button1.Caption :='start'
     else
         button1.Caption :='stop';
     Randomize ;
     memo1.Text :=inttostr(random(20));
      Showmessage(memo1.Text );end;