如何显示等待对话框?(100分)

  • 主题发起人 主题发起人 linmang
  • 开始时间 开始时间
L

linmang

Unregistered / Unconfirmed
GUEST, unregistred user!
有个长时间数据库交互动作,进行计算,同时向数据库中插入一些数据,这个过程大概需要几分,想同时显示一个请等待在最前端,怎么做?用线程可以吗?怎么结束这个显示呢?
 
不用线程也可以
在开始查询前showmodal一个显示窗口
查询结束时关闭
 
一般这样:显示对话框,创建一个线程进行耗时的操作,线程结束时关闭对话框
 
是可以showmodal一个窗口,那我的查询和操作就只能在新窗口里做了吗?因为执行了showmodal以后,程序等待这个个窗口关闭以后才进行下面的工作的。
对于线程:我需要根据数据操作的时间来决定这个等待窗口的显示时间
 
唉!
最后定义一个TPanel,里面填上'请等待...',Visible属性为False;
等到提交记录时:
with panel1do
begin
left:=(form1.width-width) div 2;
top:=(form1.height-height) div 2;
visible:=true;
end;
try
[提交数据的程序代码]
finally
panel1.visible:=false;
end;
 
这是我程序中的一段代码,看看对你有无用处。
等待窗体ddfrm上放lable1、Animate
另一个窗体调用
procedure TbxjFrm.drClick(Sender: TObject);
var
str,m:string;
i:integer;
begin
m:=copy(datetimetostr(dlfrm.datetime.datetime),6,2);
if messagedlg('提示:数据导入每月末进行一次,确定要数据导入吗?',mtWarning,[mbyes,mbno],0)=mryes then
else
exit;
if ddfrm=nil then
//注意从这开始,有//标记的就是调用
application.createform(tddfrm,ddfrm);
//
ddfrm.show;
//
ddfrm.Animate1.CommonAVI := aviFindFile;//
with dm.query1do
begin
close;
ddfrm.label1.Caption:='正在从工资库导入数据(n1...n12),请等待......';
//
ddfrm.label1.update;           //
ddfrm.update;
//
ddfrm.Animate1.Active := true;
//
Application.ProcessMessages;
//注意这几行格式不能变
for i:=0 to 1000000000do
//
;
//
sql.clear;
sql.add('insert into bxk (工作证号,原工作证号,姓名)');
sql.add(' (select 工作证号,原工作证号,姓名 from gzk minus');
sql.add(' select 工作证号,原工作证号,姓名 from bxk)');
execsql;
end;
with dm.Query1do
begin
close;
sql.Clear;
sql.add('delete from lsbxj');
execsql;
end;
with dm.Query1do
begin
close;
sql.Clear;
sql.add('insert into lsbxj (工作证号,原工作证号,姓名,b01,b02,b03,b04,b05,b06,b07,b08,b09,b10,ab)');
sql.add(' select 工作证号,原工作证号,姓名,b01,b02,b03,b04,b05,b06,b07,b08,b09,b10,ab from gzk');
execsql;
close;
sql.Clear;
sql.Add('update lsbxj set n=ab+b03+b04+b05+b06+b07+b08+b09+b10');
execsql;
end;
with dm.Query1do
begin
close;
sql.Clear;
m:=copy(datetimetostr(dlfrm.datetime.datetime),6,2);
str:='n'+m;
sql.Add('update bxk set '+str+'=(select n from lsbxj where bxk.原工作证号=lsbxj.原工作证号)');
execsql;
end;
with dm.Query1do
begin
close;
sql.Clear;
sql.Add('update bxk set 参加工作时间=(select 参加工作时间 from zhk where bxk.原工作证号=zhk.原工作证号)');
execsql;
end;
dm.bxktb.Close;
dm.bxktb.Open;
ddfrm.Animate1.Active := false;
//调用结束
ddfrm.hide;            //
application.messagebox('数据导入完毕!','提示',
mb_ok+mb_iconinformation);
count;
end;
 
可以把事务提交部分的代码写在那个Modal对话框内
 
就动态创建并显示一个窗口出来,用show就中了,在等待窗体中用下述方法保证总是显示在最前面,然后就可在原来的窗体中继续做你的事,用完后释放等待窗体
private
{ Private declarations }
public
{ Public declarations }
procedure Createparams(var Params: TCreateParams);
override;
//在最前面
end;

procedure TForm1.Createparams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Paramsdo
begin
EXStyle := ExStyle or WS_EX_TOPMOST or WS_EX_ACCEPTFILES ;
//or WS_DLGFRAME
wndParent := GetDesktopWindow;
//关键一行,用SetParent都不行!!
end;
end;
 
thx all.用panel.visable panel.update 简单解决问题
 
后退
顶部