我使用ADO连接本地ACCESS数据库,用ADOQUERY提取数据送入DBGRID中,由于数据量大,出现了长时间的等待状态,我希望能在此时用进度条表示提取的进度,该如何处理,谢谢!

解决方案 »

  1.   

    将ADOQuery的ExecuteOptions属性中的eoAsyncFetch(异步提取)设为TRUE
    然后在FetchProgress事件中可以知道现在的进度:
    procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet;
      Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
    beginend;
    //Fadoqry.ExecuteOptions := [eoAsyncFetchNonBlocking];
    data.adoqry.OnFetchProgress := ADODataSet1FetchProgress;
    procedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet;
      Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
    begin
      ProgressBar1.Position := Progress;
      progressbar1.Max := maxprogress;
      label1.caption := inttostr(progress)+'/'+inttostr(maxprogress);
      Application.ProcessMessages;
    end; 
      

  2.   

    My_first(小@_@小) ,非常感谢你的帮助,我照你的方法做了,但提示错误信息“当前提供者不支持异步执行”,该如何是好?
      

  3.   

    参考李维的《Delphi5.x高级程序设计篇》第110页:使用ADo的异步执行能力。
      

  4.   

    将Fadoqry.ExecuteOptions := [eoAsyncFetchNonBlocking];我记得它有四个值可选,你选择第三个为True;
      

  5.   

    My_first(小@_@小)说的对呀,这有几个重要的地方呀, 1。你的这个进度条的最小和最大值是多少。
     2。这个进度条的当前值是多少,(用来反映你取数据时的进度值  Progress )
    将ADOQuery的ExecuteOptions属性中的eoAsyncFetch(异步提取)设为TRUE
    然后在FetchProgress事件中可以知道现在的进度:
    procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet;
      Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
    beginend;
      

  6.   

    我试了一下,如改为adoquery1.ExecuteOptions := [eoAsyncFetchNonBlocking];
    ,不报错,但也看不到进度条ProgressBar1有任何动作。目前我使用的是Access数据库,各项配置如下:form1.adoquery1.connection=adoconnection;
    form1.datasource1.dataset=adoquery1;
    form1.dbgrid.datasource=datasource1;
    未使用Tadodataset
    adoquery1.ExecuteOptions := [eoAsyncFetchNonBlocking];
    adoquery.OnFetchProgress := ADOQuery1FetchProgress;
    procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet;
      Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
    begin
      ProgressBar1.Position := Progress;
      progressbar1.Max := maxprogress;
      label1.caption := inttostr(progress)+'/'+inttostr(maxprogress);
      Application.ProcessMessages;
    end; 还请各位心人继续关心指教,谢谢!
      

  7.   


    取得你的循环次数MaxValue;
    然后
    progressbar1.positon:=0;
    progressbar1.min:=0;
    progressbar1.max:=MaxValue;
    progressbar1.step:=1;
    progressbar1.stepit;
      

  8.   

    for i:=0 to maxvalue 
    progressbar1.stepit;
    application.processmessage;//防止白班