进度窗口上放了1个Label,1个进度条,在Form1的Create事件中有时间稍长的查询语句,此时想显示信息窗口,但信息窗的边框、Label,进度条等都显示不出来,只显示此窗口的轮廓出来。
例如:
procedure TForm1.FormCreate(Sender: TObject);
begin
if frmWait=nil then frmWait:=TfrmWait.Create(Application);
frmWait.show; //显示进度信息 Screen.Cursor:=crHourGlass;
adoDataset1.commandtext:='select * ...';
adodataset1.open;
Screen.Cursor:=crDefault;
frmWait.Visible:=False;
end;运行时frmWait中的所有控件包括边框根本不能完整显示。请问有什么好方法?
例如:
procedure TForm1.FormCreate(Sender: TObject);
begin
if frmWait=nil then frmWait:=TfrmWait.Create(Application);
frmWait.show; //显示进度信息 Screen.Cursor:=crHourGlass;
adoDataset1.commandtext:='select * ...';
adodataset1.open;
Screen.Cursor:=crDefault;
frmWait.Visible:=False;
end;运行时frmWait中的所有控件包括边框根本不能完整显示。请问有什么好方法?
procedure TForm1.FormCreate(Sender: TObject);
begin
if frmWait=nil then frmWait:=TfrmWait.Create(Application);
frmWait.show; //显示进度信息
frmWait.Update;//强制显示 Screen.Cursor:=crHourGlass;
adoDataset1.commandtext:='select * ...';
adodataset1.open;
Screen.Cursor:=crDefault;
frmWait.Visible:=False;
end;
procedure TFrmWait.Timer1Timer(Sender: TObject);
begin
Screen.Cursor:=crHourGlass;
adoDataset1.commandtext:='select * ...';
adodataset1.open;
Screen.Cursor:=crDefault; Timer1.Enabled:=False;
end;在frmWait的FromShow事件里增加
procedure TFrmWait.FormShow(Sender: TObject);
begin
Timer1.Enabled:=True;
end;
在操作费时的地方加入Application.ProcessMessages,例如: while I < 64000 do
begin
Randomize;
while J < 64000 do
begin
Y := Random(J);
Inc(J);
Application.ProcessMessages;
end;
X := Random(I);
Inc(I);
end;
begin
if frmWait=nil then frmWait:=TfrmWait.Create(Application);
frmWait.show; //显示进度信息 Screen.Cursor:=crHourGlass;
adoDataset1.commandtext:='select * ...';
adodataset1.open;
Application.ProcessMessages
//加上这句看看,我想可能不会有效果
Screen.Cursor:=crDefault;
frmWait.Visible:=False;
end;
我感觉就你这个思路而言,可能就会出问题了吧,当你adodataset1.open时候
程序并不继续执行你下面的代码了,而是等程序返回了再继续执行
而且你可以分多次打开数据库记录,非要一次性打开的吗?试用有谁能够一次性看的了这么多的记录,就算是你要处理记录的话(如进行计算)也可以分多次打开的吧,这样有助于提高效率
begin
if frmWait=nil then frmWait:=TfrmWait.Create(Application);
frmWait.show; //显示进度信息 Screen.Cursor:=crHourGlass;
adoDataset1.commandtext:='select * ...';
adodataset1.open;
Application.ProcessMessages
//加上这句看看,我想可能不会有效果
Screen.Cursor:=crDefault;
frmWait.Visible:=False;
end;
我感觉就你这个思路而言,可能就会出问题了吧,当你adodataset1.open时候
程序并不继续执行你下面的代码了,而是等程序返回了再继续执行
而且你可以分多次打开数据库记录,非要一次性打开的吗?试用有谁能够一次性看的了这么多的记录,就算是你要处理记录的话(如进行计算)也可以分多次打开的吧,这样有助于提高效率
if frmWait=nil then frmWait:=TfrmWait.Create(Application);
frmWait.show; //显示进度信息
//经过测试,加上以下任一句都可及时显示出表单
Application.ProcessMessages;
frmWait.Update;
情况是这样:建立Form1时,得打开十来个数据表(IP连到远程SQL服务器上的数据库),网络不理想时速度比较慢。 每执行一个dataset.open时,无法更新进度条,只好在dataset的beforeopen或afteropen事件中来刷新一下。 效果不是太好,但目前找不到更好的办法。
procedure TForm1.FormCreate(Sender: TObject);
begin
if frmWait=nil then frmWait:=TfrmWait.Create(Application);
frmWait.show; //显示进度信息
frmwait.refresh;
...................
end;
Application.ProcessMessages
这样才不会给人一种死机的感觉。
frmWait.Refresh;