一个假进度条的问题!(30)

  • 主题发起人 新来的菜鸟
  • 开始时间

新来的菜鸟

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在查询的时候做一个假进度条,目的是在查询的时候弹出一个加的进度条在跑,等查询的数据出来后就关闭这个进度条!我现在新建一个线程把查询放进这个线程里,当数据出来后就把进度条窗口关闭,但我运行后好像没反应,那位大哥能帮小弟看看,小弟谢谢了!unit frmMain;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uSafeThread, StdCtrls, Grids, DBGridEh, DB, ADODB, ComCtrls, ExtCtrls,ACTIVEX;type TMyThread = class(TThread) private protected procedure Execute; override; public constructor Create; virtual; end;type TForm1 = class(TForm) Button1: TButton; DBGridEh1: TDBGridEh; ADOQuery1: TADOQuery; DataSource1: TDataSource; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; HSem : THandle = 0 ;implementationuses Unit2;{$R *.dfm}var tick: Integer = 0; constructor TMyThread.Create;begin inherited Create(true); FreeOnTerminate := True;end;procedure TMyThread.Execute;var go:boolean ;begin go:=true; repeat coInitialize(nil); Form1.ADOQuery1.Close; Form1.ADOQuery1.SQL.Clear; Form1.ADOQuery1.SQL.Add('exec p_mzd_yb'); Form1.ADOQuery1.Open; Form2.close; until go=false;end;procedure TForm1.FormCreate(Sender: TObject);beginHSem:=CreateSemaphore(Nil,1,1,Nil) ;end;procedure TForm1.FormDestroy(Sender: TObject);beginCloseHandle(HSem) ;end;procedure TForm1.Button1Click(Sender: TObject);begin form2.Show; TMyThread.Create;end;end.
 
没人会吗?小弟急呀!在线等待...
 
这个问题我已经回答过N个人了,呵呵进度条只能放在另一个程序,而不是线程中,因为查询是整个进程(程序)都在等待,呵呵!
 
同意楼上,要想异步查询 只能把 AdoQuery 也单独放到线程里边去。你这个东西我没有看到有用线程的必要,一般不需要在用户在查询的时候执行其他的操作你直接放一个 panel 上边放个 avi 动画表示正在查询。。 平时这个是隐藏的, 执行查询的时候显示就可以了。 pnlProgress.visible:=true; adoquery.close; adoquery.sql.clear; adoquery.sql.add(..); adoquery.open; pnlProgress.visible:=false ;
 
思路就是错误的
 
to abin30你的方法我刚才试过了,不行呀!我特地用了一个数据量比较大的表来测试发现pnlProgress.visible:=true;的时候根本不会马上显示,而是等这个事件的所有程序都执行完后才显示的,所以说我才考虑用线程实现的!因为在一个事件没有执行完之前pnlProgress.visible:=true是无响应的!
 
pnlProgress.visible:=true;//加上下面的试一下refresh;
 
to 3868474不行,因为在整个事件没有执行完之前,任何语句是不能响应的,我目前只能想要用多线程来解决,有谁还有别的方法吗?我只是想在执行查询的时候show一个假的进度条而已!
 
我需要帮助,那位大哥能给个例子,最好是弹出个框带进度条的,小弟谢谢了
 
新建一个wait窗体,里面放上 正在查询数据,请稍后...的label 然后把鼠标的状态改为忙。 然后在查询前show下,在结束后close下就可以! 我都是这样在处理的! openwait; //打开等待窗口 ekey.Text:=trim(ekey.Text); s:='select *,rs_yuangong.id as ygid from rs_yuangong left join rs_bumen on rs_bumen.id=bm '; dm.dosql(q_show,s); showlv; closewait;//close
 
你自己也知道不行了,所以要用另外的程序显示假进度!
 
to zkktom我试了一下,你在show等待窗体的时候上面的字体是无法显示的呀,因为在查询这个事件没有结束之前任何窗体都是无响应的,除非用到多线程!to wql能不能给个简单完整的例子呢?小弟谢谢了!yangzongling18@163.com 万分感谢!
 
使用线程查询,主线程控制进度条,在线程未返回前一直循环就是了。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
692
SUNSTONE的Delphi笔记
S
I
回复
0
查看
614
import
I
I
回复
0
查看
705
import
I
I
回复
0
查看
511
import
I
顶部