在 form1 上点击一个 button 后,执行一个过程 ADOStoreProc,在过程执行期间,显示一个 form2 , form2 上 只有一个 ProgressBar,过程执行后再关闭 form2。
请问如何实现?

解决方案 »

  1.   

    创建一个form2,把他设为动态创建
    TForm2 *Form2=new TForm2(this);
    Form2.Show();
    Form2上自己放上ProgressBar就可以了。
    执行完毕后Form2.Close();
    在Form2的Close()事件里添加Action=caFree;
      

  2.   

    只要在form1里给form2的ProgressBar赋值即可,待结束将form2关闭即可.
      

  3.   

    要什么时候给 ProgressBar 赋值? 过程执行前、执行后 ... ?
      

  4.   

    unit ProgressForm;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, ExtCtrls, StdCtrls;type
      TProgressFrm = class(TForm)
        ProgressBar1: TProgressBar;
        lblPrompt: TLabel;
        procedure FormActivate(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private    { Private declarations }
      public    { Public declarations }
      end;procedure ProgressShow(aHint: string = '正在运行请等待');
    procedure SetPos(aPos: extended; isOver: boolean=False);
    procedure ProgressHide;var
      ProgressFrm: TProgressFrm;
      FFormTop:    integer;implementation{$R *.dfm}{ TProgressFrm }procedure ProgressShow(aHint: string = '正在运行请等待');
    begin
      if not Assigned(ProgressFrm) then
      begin
        ProgressFrm := TProgressFrm.Create(Application);
      end;
      setPos(1);
      ProgressFrm.lblPrompt.Caption := aHint + '......';
      progressFrm.Show;
      ProgressFrm.Update;
      Screen.Cursor := crHourGlass;
      SetWindowPos(ProgressFrm.handle, HWND_TOPMOST,
        ProgressFrm.Left, ProgressFrm.Top, ProgressFrm.Width, ProgressFrm.Height, 0);
    end;procedure ProgressHide;
    begin
      SetPos(100, True);
    end;procedure SetPos(aPos: extended; isOver: boolean);
    begin
      progressFrm.ProgressBar1.Position := trunc(aPos);
      ProgressFrm.ProgressBar1.Update;
      //Application.ProcessMessages;
      if IsOver then
      begin
        Screen.Cursor := crDefault;
        ProgressFrm.Hide;
      end;
    end;procedure TProgressFrm.FormActivate(Sender: TObject);
    begin
      SetWindowPos(ProgressFrm.handle, HWND_TOPMOST,
        ProgressFrm.Left, ProgressFrm.Top, ProgressFrm.Width, ProgressFrm.Height, 0);
    end;procedure TProgressFrm.FormCreate(Sender: TObject);
    begin
      Top  := trunc(Screen.Height / 3);
      left := trunc((Screen.Width - Width) / 2);
    end;end.先
    procedure ProgressShow(aHint: string = '正在运行请等待');
    然后显示进度
    procedure SetPos(aPos: extended; isOver: boolean=False);
    最后
    procedure ProgressHide;
      

  5.   

    to crazyz(乘风) :
    刚才调试了一下你的程序,不知道在哪里给 aPos 赋值,因为我调用过程就一条语句,过程具体执行就在后台的 oracle执行。
      

  6.   

    我用多线程写了一个,创建一个线程来刷新进度条,但运行时会等到过程先执行完了进度条才开始刷新,代码如下:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, DB, ADODB, StdCtrls;type
      TForm1 = class(TForm)
        ProgressBar1: TProgressBar;
        Button1: TButton;
        ADOConnection1: TADOConnection;
        ado: TADOStoredProc;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    type
      Tmythread = class(TThread)
      private
        pb: tprogressbar;
        procedure updateprogressbar;
      protected
        procedure Execute; override;
      published
        constructor createit(progbar: tprogressbar);
        destructor destroy; override;
      end;
    var
      Form1: TForm1;implementation{$R *.dfm}
     constructor Tmythread.createit(progbar: tprogressbar);
    begin
      inherited create(true);
      freeonterminate := false;
      pb := progbar;
      pb.min := 1;
      pb.max := 100000;
      pb.step := 1;
      pb.position := 1;
      suspended := false;
    end;destructor Tmythread.destroy;
    begin
      inherited destroy;
    end;procedure Tmythread.Execute;
    begin
      while Terminated = false do
      begin
        updateprogressbar;
      end;
      pb.position := 100000;
    end;procedure Tmythread.updateprogressbar;
    begin
      pb.stepit;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var t:Tmythread;
    begin
      t:=Tmythread.createit(progressbar1);
      ado.Parameters.ParamByName('FXRQ').Value :=NOW;
      ADO.Parameters.ParamByName('shrq').Value :=now;
      ado.ExecProc ;
      t.Terminate ;
    end;end.form1上就一个 ado 连接,一个ado过程,一个进度条和一个按钮,按钮按下的时候创建一个线程和执行过程,就是在执行过程时进度条不动。不知道为什么?
      

  7.   

    好像根本搞不定了问题,
    程序在后台运行 特别是无法知道什么时候作完的 StoreProcedure !
    我看是没有办法了。
      

  8.   

    你可以用大致估计一个时间,用GetTickCount来获取程序执行的时间,设置一定的进度长度,
      

  9.   

    用线程解决比较好。
      在线程中执行过程
    但是你也可以在过程中show出form2,将 form2的设置成alwaysonTop当执行完成后关闭。
      

  10.   

    执行过程写成一个线程单元,线程单元uses form2
    在执行过程中更新form2.progressbarform1的button1click中:
    1.显示form2
    2.开始线程