如何刷新界面(20分)

  • 主题发起人 主题发起人 ohcyj
  • 开始时间 开始时间
O

ohcyj

Unregistered / Unconfirmed
GUEST, unregistred user!
有个数据库查询程序,需要大量时间查询数据
查询的时候界面需要刷新,不然白白的很难看
请问该如何做到?我用了多线程,可invalidate没用:(
 
先调用另一个等待的FROM,等查完后,再打开查询FROM!
 
这样实际操作起来,不太可行
最好是直接可以刷新界面!!!
 
如果用ADO的话,可以用异步方式执行查询,或者尽量不要写大的查询程序。
 
"尽量不要写大的查询程序" ?? 不会吧?!!!
那干脆不用干活了:(
 
在适当的位置添加一句
Application.ProcessMessages;
 
创建一个等待的窗口(Wait_from)
然后执行查询语句(select、、、、)
等查完后,关闭等待的窗口(Wait_from)
显示结果窗体
 
to ohcyj:尽量不要写大的查询程序的意思是:
1、不要写结果集太大的查询。因为太大的结果集对用户查阅来说意义不大,超过1000行的纪录集用户在阅读、理解上会产生困难。
2、不要写查询执行过程耗时巨大的查询程序。因为你做的查询应该是个数据库事务,耗时太大的查询会占用过多的数据库资源,使其他并发的操作难以进行。

当然,一定会有无法避免的大查询,一种解决方法就是用ADO的异步查询方式;另一方法是分解查询程序,把大的查询转化为若干小的查询,以便前台交互,这样即使用户等待也不觉得难受了。
前台无法及时响应数据库端的结果,在WIN9X上还会造成操作系统认为程序无响应的问题,因此即使把TIMEOUT设得很大也没用。
这些都是写查询程序应充分考虑的因素。
 
1。“在适当的位置添加一句 Application.ProcessMessages;”此方法无效!
2。“创建一个等待的窗口(Wait_from)”,以什么方式显示呢?
以showmodal,那么窗体不关闭,执行不了下面的查询
以show,那么点击正在查询的窗体,那么还是不能刷新,因为wait_form跑到后面了
3。MikeZ说的话,还是没有解决什么问题

以我个人的看法是,最好创建多线程,通过子线程来刷新,但是目前我还不清楚怎么刷新:(
 
用show,但使窗體一直在前面不就可以了么
在查詢前先調用waitform.update
可以去試試!

使窗體一直在前面:
Public
procedure Createparams(Var Params:TCreateParams);override;
...

procedure TFormDrop.Createparams(var Params:TCreateParams);
begin
Inherited CreateParams(Params);
With Params do
begin
EXStyle:=ExStyle or WS_EX_TOPMOST OR WS_EX_ACCEPTFILES or WS_DLGFRAME
wndParnet:=GetDesktopWindow;
end;
end;
 
我又一个比较弱的方法,不过用后效果还可以,而且很简单。
那就是在界面中加入一个animate控件,制定一个动画,开始查询时active,结束时
active:= false,呵呵,加上看看吧
 
上面的方法好象也不太行哎,因该在任务栏切换中写事件,那位专家提提意见
 
新建个窗体的方法好像不是很好啊,最好是能直接刷新界面!!
 
procedure TFormDrop.Createparams(var Params:TCreateParams);
begin
Inherited CreateParams(Params);
With Params do
begin
EXStyle:=ExStyle or WS_EX_TOPMOST OR WS_EX_ACCEPTFILES or WS_DLGFRAME
wndParnet:=GetDesktopWindow; //这句不要,为什么要在任务栏显示
Parent := {你查询的窗口};
TForm(Parent).enabled := false;
end;
end
然后在窗体关闭的时候把Enabled设为True;
 
你试试看:
查询的时候,创建一个线程用来定时重画窗口。
 
>> 以我个人的看法是,最好创建多线程,通过子线程来刷新....

试试在子线程里查询!
 
关键是子线程里怎么刷新!!!
我在前面已经说过,我完全明白要在子线程中刷新,问题是怎么刷新
不知道 hfbsn 没有看到吗??!
 
后退
顶部