在 form1 上点击一个 button 后,执行一个过程 ADOStoreProc,在过程执行期间,显示一个 form2 , form2 上 只有一个 ProgressBar,过程执行后再关闭 form2。
请问如何实现?
请问如何实现?
解决方案 »
- 谁能说下DataSet打开后赋值给DBEdit的原理或过程?
- Delphi7.0晕晕中~
- delphi如何不通过ODBC\ADO连上PB 数据库?
- 如何在DBGrid中响应OnMouseDown事件?
- 如何比较Edit控件和数据库中的数字大小,并输出差额??
- 简单的查询记录语句,不太明白
- Ttable 为什么会出现can't perform edit because anthor user change the record
- 有关多层应用系统数据库访问的问题,如果答复精彩的话,一定加分!
- DELPHI写ASP组件怎样?
- 请问如何屏蔽掉[开始]按钮
- 如何将Image1中的aa.jpg图像旋转90度?
- 请教可否用重载的方法实现如下的要求!
TForm2 *Form2=new TForm2(this);
Form2.Show();
Form2上自己放上ProgressBar就可以了。
执行完毕后Form2.Close();
在Form2的Close()事件里添加Action=caFree;
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;
刚才调试了一下你的程序,不知道在哪里给 aPos 赋值,因为我调用过程就一条语句,过程具体执行就在后台的 oracle执行。
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过程,一个进度条和一个按钮,按钮按下的时候创建一个线程和执行过程,就是在执行过程时进度条不动。不知道为什么?
程序在后台运行 特别是无法知道什么时候作完的 StoreProcedure !
我看是没有办法了。
在线程中执行过程
但是你也可以在过程中show出form2,将 form2的设置成alwaysonTop当执行完成后关闭。
在执行过程中更新form2.progressbarform1的button1click中:
1.显示form2
2.开始线程