怎么样使执行过程的时候显示进度条?我做了一个存储过程,这个数据表中有八万多条数据,在处理数据的同时怎么样显示进度条?有没有例子?

解决方案 »

  1.   

    //OnFetchProgress事件处理过程
    procedure TForm1.ADOStoredProc1FetchProgress(DataSet: TCustomADODataSet;
      Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
    begin
    //在这里写你控制进度条进度的代码。
    end;
      

  2.   

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if progressbar1.Position >= 100 then
      begin
        timer1.Enabled := false;
        showmessage('执行完毕!');
        Application.terminate;
      end
      else
      begin
        progressbar1.Position := progressbar1.Position + 1;
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      serverfile: textfile;
      serverstr, server: string;
      servername, database, username, password, serverport: string;
    begin
      label1.Visible := true;
      progressbar1.Visible := true;
      progressbar1.Enabled := true;
      timer1.Enabled := true;
      if fileexists(ExtractFilepath(Application.ExeName) + 't1.txt') = false then //t1.txt文件是否存在
      begin
        exit;
      end;
      assignfile(serverfile, 't1.txt');
      reset(serverfile);
      readln(serverfile, serverstr); //将文件第一行的内容符给 serverstr
      servername := serverstr;
      readln(serverfile, serverstr);
      database := serverstr;
      readln(serverfile, serverstr);
      username := serverstr;
      readln(serverfile, serverstr);
      password := serverstr;
      try readln(serverfile, serverport); except serverport := ''; end;
      if trim(serverport) = '' then serverport := '1433';
      closefile(serverfile); //关闭文件
      try
        datamodule2.ADOConnection1.Close;
        datamodule2.ADOConnection1.ConnectionString := '';
        datamodule2.ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=' + password + ';Persist Security Info=False;User ID=' + username + ';Initial Catalog=' + database + ';Data Source=' + servername; //+';Network Address='+servername+','+serverport;
        datamodule2.ADOConnection1.Connected := true;
      except end;
      with A_xs do
      begin
        close; sql.clear;
        sql.add('exec marc_yljgpc');
        execsql;
      end;
    end;
    就是这个小程序!我现在这样做只能把SQL执行完了之后再执行进度条?有什么办法让什么同时进行的?
      

  3.   

    //OnFetchProgress事件处理过程
    procedure TForm1.ADOStoredProc1FetchProgress(DataSet: TCustomADODataSet;
      Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
    begin
      //在这里写你控制进度条进度的代码。
      ProgressBar1.Position:= Round(Progress / MaxProgress * 100);
      ProgressBar1.Repaint;  if ProgressBar1.Position >= 100 then
      begin
        ShowMessage('执行完毕!');
        Application.Terminate;
      end;
    end;
      

  4.   

    Progressbar属性设置如下:.Min:= 0;
    .Max:= 100;
    .Step:= 1;
    .Position(表示完成的百分比)
      

  5.   

    yuvotesyg518(小不点) 大侠能不能帮小妹结合上面的代码处理一下?我是初学者不会做!非常感谢!
      

  6.   

    close; sql.clear;
    sql.add('exec marc_yljgpc');
    execsql;execsql后程序就一直等待结果,并不知道你的存储过程进行状态,这样没有办法显示进度的。
    你可以考虑将存储过程用代码实现,这样可能效率会低些,但是可以使用progressbar控制操作的进度。
    比如:
    q1.sql.text:=select id from 表
    q1.open;for i:=1 to q1.recordcount do
        begin
          progressbar1.Position:= trunc((i/q1.recordcount)*100);
          //存储过程代码
          q1.next;
        end;
      

  7.   

    (1)Timer控件可以不要了,也就是说下面这段代码完全可以删掉!!
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      if progressbar1.Position >= 100 then
      begin
        timer1.Enabled := false;
        showmessage('执行完毕!');
        Application.terminate;
      end
      else
      begin
        progressbar1.Position := progressbar1.Position + 1;
      end;
    end;
    (2)选中你的存储过程控件,调出属性对话框。
    (3)定位到Events页,找到OnFetchProgress项,双击到代码编辑页。
    (4)填入上面的代码。
    //OnFetchProgress事件处理过程
    procedure TForm1.ADOStoredProc1FetchProgress(DataSet: TCustomADODataSet;
      Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
    begin
      //在这里写你控制进度条进度的代码。
      ProgressBar1.Position:= Round(Progress / MaxProgress * 100);
      ProgressBar1.Repaint;  if ProgressBar1.Position >= 100 then
      begin
        ShowMessage('执行完毕!');
        Application.Terminate;
      end;
    end;
    (5)设置ProgressBar控件的相关属性,如下:
    Progressbar属性设置如下:.Min:= 0;
    .Max:= 100;
    .Step:= 1;
    .Position(表示完成的百分比)
    (6)确定你的程序没有什么语法错误之后,运行程序不就OK了?
      

  8.   

    没办法!一条记录需要连接三个表,经过比较处理,其实有个表中有三十几个字段,有三四十个字段需要处理,把处理后的数据放到一个@n变量中,这个变量处理好后大概有4000-5000个字符的长度,再把这个变量写到marc字段中,这些就是存储过程要处理的一条记录的动作
      

  9.   

    呵呵,这个看来只有我会了,ado用服务器端游标,相应的存储过程中返回处理进度等等........
    我们一直在用的.
    不过实现起来有点技术难度的.
    呵呵
      

  10.   

    晕,做了一个测试
    用异步方式
    用的Adoquery
    SQL SERVER 2000 
    SQL 语句:Select * FORM sysobjects
    procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet;
      Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
    begin
        with ProgressBar1 do
        begin
            Memo1.Lines.Add(VarToStr(Progress)+Char(#9)+VarToStr(MaxProgress));
        end;
    end;
    得到的数据如下:
    Progress  MaxProgress
    65 80
    80 95
    95 110
    110 125
    125 140
    140 155
    155 170
    170 185
    185 200
    200 215
    215 230
    230 245
    245 260
    260 275
    275 290
    290 305
    305 320
    320 335
    335 350
    350 365
    365 380
    380 395
    395 410
    410 425
    425 440
    440 455
    455 470
    470 485
    485 500
    500 515
    515 530
    530 545
    545 560
    560 575
    575 590
    590 605
    605 620
    620 635
    635 650
    650 665
    665 680
    680 695
    695 710
    710 725
    725 740
    740 755
    755 770
    770 785
    785 800
    800 815
    815 830
    830 845
    845 860
    860 875
    875 890
    890 905
    905 920
    920 935
    935 950
    950 965
    965 980
    980 995
    995 1010
    1010 1025
    1025 1040
    1040 1055
    1055 1070
    1070 1085
    1085 1100
    1100 1115
    1115 1130
    1130 1145
    1145 1160
    1160 1175
    1175 1190
    1190 1205
    1205 1220
    1220 1235
    1235 1250
    1250 1265
    1265 1280
    1280 1295
    1295 1310
    1305 1305
    搞不清楚为什么MaxProgress一直在变
    而且好象记录数是以15递增,而不是1呢