为什么生成的程序,Edit中的数值会一直不停的变化,而不是向循环中所示从0到100000,显示数字完后继续执行Timer1.Enabled:=False;的代码?如果不加Application.ProcessMessages;的话就没问题,但是Edit无法实时更新数值.procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled :=True;
end;procedure TForm1.Timer1Timer(Sender: TObject);
var
  i:Integer;
begin
  for I := 0 to 100000 do begin
    Edit1.Text :=IntToStr(i);
    Application.ProcessMessages;
  end;
  Timer1.Enabled :=False;
end;

解决方案 »

  1.   

    因为Application.ProcessMessages或接收到timer的消息,从而又执行到了Timer1Timer这个事件的代码,比如当你第一个timer事件触发,并显示5的时候,去ProcessMessages了一下,正好收到timer消息,于是又执行该事件的代码,又从0开始循环显示。。
      

  2.   

    因为Timer在系统进程中优先级是最低的了,加了ProcessMessages;有其它事件的话会优先执行
    可能是Interval太小了,循环可能要3秒才计算完,但Interval是1秒
    所以循环还没有结束,第2次Timer已经开始了,就这样不停的执行下去咯用一个全局变量就看和出来了,把Interval设置1000,2000,3000,4000...试试
    var
     j:integer;procedure TForm1.Button1Click(Sender: TObject);
    begin
      j:=0 ;
      Timer1.Enabled :=True;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    var
      i:Integer;
    begin
      inc(j);
      edit2.Text:=inttostr(j);
      for I := 0 to 100000 do begin
        Edit1.Text :=IntToStr(i);
        Application.ProcessMessages;
      end;
      Timer1.Enabled :=False;
    end;
      

  3.   

    记住,timer不是线程,他一样会阻塞主线程的
      

  4.   


    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      i:Integer;
    begin
      Timer1.Enabled :=False;   //移动到这里试一下
      for I := 0 to 100000 do begin
        Edit1.Text :=IntToStr(i);
        Application.ProcessMessages;
      end;
    end;
      

  5.   

    简单一句,Timer事件中不能有application.ProcessMessages