由于服务器较远的原因,所以读取数据时较慢.我想把在等待的这段时间做成一进度条,且能真实的反映数据的读取进度.Help Me!

解决方案 »

  1.   

    //如果你使用的是ADO可以这样做~~procedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
    begin
      Caption := 'Percent complete: ' +
        IntToStr(Trunc(Progress / MaxProgress * 100)) + '%';
      Application.ProcessMessages;
    end;
      

  2.   

    那也不對也是假的不信,樓上的跟蹤一下看看Progress, MaxProgress的值的變化直的呢沒有,本來進度條就是假的包括微軟也不能說作出一個真實的進度條來不過給人一個在約數還是可以接受的
      

  3.   

    在查询之前如果不能确定返回值的个数,即不能确定进度条的MAX值,我觉得这个进度条是不可能做出来的.....姑妄言之
      

  4.   

    恩,同意(不死鸟)
    进度条建立时就必须指定最大长度
    再说精确的数据库进度条是很难做到的
    就是多线程也无济于事一般可以这样处理
    with adotable1 do
    begin
    progressbar1.max:=100;
    i:=recordcount div 100;
    j:=i;
    while not eof do
       begin
          dec(j);
          if j<=0 then
          begin
             j:=i;
             progressbar1.stepit(1);
          end;   
          next;
       end;
    end;
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Unit2, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        WorkThread: TWorkThread; //WorkThread defined in Unit2
        procedure OnWorkDone(Sender:TObject);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit3;{$R *.dfm}{ TForm1 }procedure TForm1.Button1Click(Sender: TObject);
    begin
      WorkThread:=TWorkThread.Create(false);
      WorkThread.OnTerminate:=OnWorkDone;
      form3:=TForm3.Create(Application);
      form3.Show;
    end;procedure TForm1.OnWorkDone(Sender: TObject);
    begin
      form3.Close;
    end;end.
      

  6.   

    unit Unit2;interfaceuses
      Classes;type
      TWorkThread = class(TThread)
      private
        pos: integer;
        procedure Update;
      protected
        procedure Execute; override;
      end;implementationuses Unit3;{ TWorkThread }procedure TWorkThread.Execute;
    var
      i:integer;
    begin
      For i:=0 to 10000 do
      begin
        //Do what u want...
        pos:=i div 100;
        Synchronize(Update);
      end;
    end;procedure TWorkThread.Update;
    begin
      Form3.SetProgressBarPosition(pos);
    end;end.
      

  7.   

    unit Unit3;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls;type
      TForm3 = class(TForm)
        ProgressBar1: TProgressBar;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        procedure SetProgressBarPosition(pos: Integer);
      end;var
      Form3: TForm3;implementation{$R *.dfm}{ TForm3 }procedure TForm3.SetProgressBarPosition(pos: Integer);
    begin
      ProgressBar1.Position:=pos;
    end;procedure TForm3.FormCreate(Sender: TObject);
    begin
      SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE);
    end;end.
      

  8.   

    //或许有用;拷贝文件时有进度显示
    procedure TForm1.mycopyfile(sourcef,targetf:string);
    var
      FromF, ToF: file;
      NumRead, NumWritten: Integer;
      Buf: array[1..2048] of Char;
      n:integer;
    begin
       AssignFile(FromF, sourcef);
       Reset(FromF, 1); { Record size = 1 }
       AssignFile(ToF,targetf); { Open output file }
       Rewrite(ToF, 1); { Record size = 1 }
       n:=0;
       repeat
            BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
            form1.label1.caption:=IntToStr(sizeof(buf)*n*100 div FileSize(FromF))+'100%';
            application.ProcessMessages;
            //显示进度
            BlockWrite(ToF, Buf, NumRead, NumWritten);
            inc(n);
        until (NumRead = 0) or (NumWritten <> NumRead);
        form1.Label1.Caption:='100%';
        CloseFile(FromF);
        CloseFile(ToF);
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      mycopyfile('e:\components\tv2k-w2k.zip','c:\a.zip');
    end;