while (i<=10) and (selectsign=1) do
  begin
    labelarray[i].Caption:=inttostr(random(600));
    if i<>10 then
      i:=i+1
    else
      i:=1;
这个labelarray是个标签数组,selectsign是个标志位,当触发该事件后,该标签数组十个标签的caption显示跳动的随机数,就象抽奖一样,但这时整个程序就进入了死循环,无论什么控件都无法操作,我所写的selectsign就是为了跳出这个循环,但无法点击其他的控件(比如按钮)使selectsign为零,从而跳出这个循环,各位大哥帮帮忙看看怎么解决这个问题阿

解决方案 »

  1.   

    在你的程序里 i 永远都 <= 10(i=时的时候就变成1了)
    因此你的代码实际相当于
    while selectsign=1 do
      begin
        labelarray[i].Caption:=inttostr(random(600));
        if i<>10 then
          i:=i+1
        else
          i:=1;
    你这样的问题:
    1.刷新太快了,CPU一直被占用
    2.只有selectsign<>1时才退出,而此时没有其它代码能够使得selectsign<>1,因此退不了
    用定时器是最好的办法,只要定时器一生效后,每隔一定时间(可设置)
    i 从1到10,分别 labelarray[i].Caption := inttostr(random(600));
    在按钮事件函数中将定时器停下来就实现选定
      

  2.   

    while (i<=10) and (selectsign=1) do
    begin
      application.ProcessMessages; //让主程序处理消息,这样主程序就有可能处理控件的事件.
      labelarray[i].Caption:=inttostr(random(600));
      if i<>10 then i:=i+1
      else i:=1;
    end;
      

  3.   

    上面说的不错
    1、用TIMER控件
    2、在循环或线程中加入application.ProcessMessages; 响应其它事件
      

  4.   

    加入application.ProcessMessages后
    程序运行时,就会响应你的按键或者鼠标点击,
    在响应这些操作的程序代码中,就可以填写
    selectsign:=0,等代码,使循环条件为假
      

  5.   

    那也可以给出一个showmessage的查看你当前的值为多少呢..
      

  6.   

    哈。这样的题
    楼上各位已经解决你的问题,你的控制可以如下:
    var
     i:integer;
    while (selectsign==1) do 
    begin
      Application.ProcessMessage();
      for i:=1 to 10 do 
      begin
        // 赋值
      end; 
    end;结构是不是清晰多了?
      

  7.   

    楼上的是不是搞C出身的?Delphi中判断两个数是否相等不是用 == 而是用 =号。