一个事件中处理的数据较多,处理完毕要40秒,这40秒内程序就好像死了一样,我想在这40秒内做一个进度条,但是事件比较复杂不知怎么才能让进度条随着事件的处理而走动 请大虾指点。

解决方案 »

  1.   

    ProgressBar1.max:=Qty;
    While 没有结束 do
    Begin
       application.ProcessMessages;
       …..
       …..
       ProgressBar1.position:= ProgressBar1.position +1;
    End;
    ProgressBar1.position:=0;
      

  2.   

    在适当的地方加上application.ProcessMessages;这句就可以了
    表示在某个地方循环时,其他组件可以接受消息
      

  3.   

    如果要简单一点也有办法就是使用TTimer这个东东
    把超时时间舍得短一点,这样把你要做的事情(就是进度条的走动)放在
    ontime事件里面由简单又实用
      

  4.   

    比如我在一个事件想要做数据库的恢复,因为数据库较大恢复要半分钟时间,所以我想加一个进度条,让数据库的恢复和进度的走动同时进行,等进度条到100%时,数据库也恢复完,不知这个多线程程序如何写?
    /////////////以下是实现这两个处理的单线程程序,请大虾帮我改成多线程的 谢谢!
        s:=filelistbox1.FileName;
        f_progress:=tf_progress.Create(application);   //f_progress为存放进度条的FORM
        f_progress.Label1.Caption:='数据库正在恢复中......';
        f_progress.ShowModal;
        datamodule1.ADOConnection1.Connected := False;
        ADOCommand1.CommandText := 'use master';
        ADOCommand1.Execute;
        ADOCommand1.CommandText := 'ALTER DATABASE design SET OFFLINE WITH ROLLBACK IMMEDIATE';
        ADOCommand1.Execute;
        ADOCommand1.CommandText := 'RESTORE DATABASE design FROM DISK = ' + #39 + s + #39;
        ADOCommand1.Execute;
        ADOCommand1.CommandText := 'ALTER DATABASE design SET ONLINE WITH ROLLBACK IMMEDIATE';
        ADOCommand1.Execute;
        ADOCommand1.CommandText := 'use design';
        ADOCommand1.Execute;//////////在f_progress中放了一个timer进行进度条progressbar的计时,timer的Ontimer事件如下:
    if progressbar1.Position<=progressbar1.Max-1 then
        progressbar1.StepIt
     else
        begin
          timer1.Enabled:=false;
          if backup_restore=0 then
            begin
              if (application.MessageBox('  数据库已备份成功!          ','提示信息',mb_ok+mb_iconinformation))=idok then
                f_progress.Close;
            end
          else
            begin
              if (application.MessageBox('  数据库已成功恢复!          ','提示信息',mb_ok+mb_iconinformation))=idok then
                f_progress.Close;
            end;
          exit;
        end;