我的程序从SQL里查询数据显示是汇总后的,记录数少,但花的时间大约30秒左右(视不同的查询),我想在这个过程中加上ProgressBar进度条显示查询过程,最好有百分比显示,中途可以取消查询.
我要网上找了半天也没有找到答案!?

解决方案 »

  1.   

    这种问题通常是两个方法1.先select Count(*) from 汇总表
    然后在OnFetchProgress中处理显示进度2,做一个线程窗体专用显示进度条,查询是打开    if Pbar1.Position>=Pbar1.Max then
          Pbar1.Position:=0;
        Pbar1.Position:=Pbar1.Position+1;查完关了
      

  2.   

    我是新建了一个窗体,加上这段代码:
    if Pbar1.Position>=Pbar1.Max then 
          Pbar1.Position:=0; 
        Pbar1.Position:=Pbar1.Position+1; 
    查询时进度条并没有动作,而且窗体中的文字或Button按钮都不显示了,当查询完之后进度条只显示了一块,是怎么回事?
      

  3.   

    这样试试
    procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet;
      Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
    begin
      ProgressBar1.Position := Progress;
      ProgressBar1.Max := MaxProgress;
    end;procedure TForm1.ADOQuery1FetchComplete(DataSet: TCustomADODataSet;
      const Error: Error; var EventStatus: TEventStatus);
    begin
      ProgressBar1.Position := ProgressBar1.Max;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      with adoquery1 do
      begin
        close;
        sql.Text := 'select * from ft_ab_stock';
        open;
      end;
    end;
      

  4.   

    我整个代码就是这样的,进度条确实没有动作,不知道为什么?
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls, ExtCtrls, Grids, DBGrids, DB, ADODB;type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        Panel1: TPanel;
        Button1: TButton;
        ProgressBar1: TProgressBar;
        procedure Button1Click(Sender: TObject);
        procedure ADOQuery1FetchComplete(DataSet: TCustomADODataSet;
          const Error: Error; var EventStatus: TEventStatus);
        procedure ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress,
          MaxProgress: Integer; var EventStatus: TEventStatus);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet;
      Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
    begin
      ProgressBar1.Position := Progress; 
      ProgressBar1.Max := MaxProgress;
    end;procedure TForm1.ADOQuery1FetchComplete(DataSet: TCustomADODataSet;
      const Error: Error; var EventStatus: TEventStatus);
    begin
      ProgressBar1.Position := ProgressBar1.Max;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      with adoquery1 do
      begin
        close;
        sql.Text := 'select * from YCSINVBF';
        open;
      end;
    end;end.
      

  5.   

    procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet; 
      Progress, MaxProgress: Integer; var EventStatus: TEventStatus); 
    begin 
      ProgressBar1.Position := Progress; 
      ProgressBar1.Max := MaxProgress;
      Application.ProcessMessage;
    end; 
      

  6.   

    运行时提示:Application.ProcessMessage;段有误,是怎么回事?
      

  7.   

    要设置一下:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
       ADOQuery2.ExecuteOptions := [eoAsyncFetch] //异步方式
    end;
      

  8.   

    不行,不可能,
    前面没有反应,是来不及显示出来,里面没有加Application.ProcessMessages;
    加上显示不出来。
    ADOQuery2.ExecuteOptions := [eoAsyncFetch] //异步方式 这个设置了没有。应该没有道理的。仔细检查一下的
      

  9.   

    我的全部代码就是这样,不知道是什么问题,着急!
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, DBGrids, DB, ADODB, ExtCtrls, StdCtrls, ComCtrls;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        Button1: TButton;
        Button2: TButton;
        ProgressBar1: TProgressBar;
        ADOQuery2: TADOQuery;
        procedure Button2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure ADOQuery1FetchComplete(DataSet: TCustomADODataSet;
          const Error: Error; var EventStatus: TEventStatus);
        procedure ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress,
          MaxProgress: Integer; var EventStatus: TEventStatus);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet;
      Progress, MaxProgress: Integer; var EventStatus: TEventStatus); 
    begin 
      ProgressBar1.Position := Progress;
      ProgressBar1.Max := MaxProgress;
      Application.ProcessMessages;
    end; procedure TForm1.ADOQuery1FetchComplete(DataSet: TCustomADODataSet; 
      const Error: Error; var EventStatus: TEventStatus); 
    begin 
      ProgressBar1.Position := ProgressBar1.Max;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      close;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
       Adoquery1.Open;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ADOQuery2.ExecuteOptions := [eoAsyncFetch] ;
    end;end.
      

  10.   

    显示进度其实没有多大意义,就像ISQLW,它也没有显示进度啊,只是显示一行字“正在执行查询”。
    这个过程无法是想告诉用户,你的程序没有死掉,所以,只需要显示一个窗口就行了。查询完成之后Hide这个窗口。