关于进度条在数据查询时显示进度 ( 积分: 10 )

  • 主题发起人 主题发起人 fuxin198311
  • 开始时间 开始时间
F

fuxin198311

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用了进度条 发现没起到作用 一点按钮进度条就是100%我想达到这样的目的
就是当dbgrideh中有很多条数据 那么就要从第一条开始 并且要记住当前的指针 这样就会很明显的是在那一行了 就一行一行的移动 当完毕后就关掉进度条 代码是这样的
但就是实现不了这样的功能
with adojxc do
begin
close;
sql.Clear ;
sql.Text:='select a.yaoid,a.MONTH,a.LAST_QTY,a.rk_mount,a.sy_mount,a.ck_mount,a.xs_mount,a.cl_mount,b.pm,b.tym,b.cj,b.gg,b.dw,b.jx,b.type1,'+
'(a.rk_mount+sy_mount)-(a.ck_mount+a.xs_mount+cl_mount) as ln_mount,b.type2,b.type3 from jxc_tmp a,yaoid b where a.yaoid=b.yaoid';
open;
prior;
ProgressBar1.min:=0;
ProgressBar1.Max:=adojxc.RecordCount ;
ProgressBar1.step:=1;
while not adojxc.Eof do
begin
ProgressBar1.Position:= ProgressBar1.Position+1;
with adoquery1 do
begin
close;
sql.Clear ;
sql.Text:='insert into jxc_over_cargo_cost(month,yaoid,qty)values(:month,:yaoid,:qty)' ;
Parameters.ParamByName('month').Value:=copy(datetimetostr(datetimepicker1.Date),1,7);
Parameters.ParamByName('yaoid').Value:=adojxc.fieldByName('yaoid').AsInteger;
Parameters.ParamByName('qty').Value:=adojxc.fieldByName('last_qty').AsFloat ;
ExecSQL ;
end;
ProgressBar1.stepit;
// ProgressBar1.
label13.Caption:='正在结转药品信息是'+adojxc.fieldByName('yaoid').AsString+'请稍候' ;
// Application.ProcessMessages;
adojxc.Next ;
end;
end;
if speedbutton5.Caption='结转库存' then
begin
with adoquery2 do
begin
close;
sql.Clear ;
sql.Text:='select flg from jxc_over where month='''+copy(datetimetostr(datetimepicker1.Date),1,7)+'''';
open;
end;
if adoquery2.RecordCount=0 then
begin
with adoquery2 do
begin
close;
sql.Clear ;
sql.Text:='insert into jxc_over(month,flg) values (:month,:flg)';
Parameters.ParamByName('month').Value:=copy(datetimetostr(datetimepicker1.Date),1,7);
Parameters.ParamByName('flg').Value:='Y';
ExecSQL ;
end;
end
else
begin
with adoquery2 do
begin
close;
sql.Clear ;
sql.Text:='update jxc_over set flg=:flg where month='''+copy(datetimetostr(datetimepicker1.Date),1,7)+'''';
Parameters.ParamByName('flg').Value:='Y';
ExecSQL ;
end;
end;
if ProgressBar1.Position=100 then panel1.Visible:=false;
speedbutton5.Caption:='反结库存';
application.MessageBox('恭喜您!库存结转完毕','系统提示',MB_OK);
exit;
end;
 
逻辑思维不正确
 
说说你现在的现象啊... ——始终停在0%?
试试 ProgressBar1.stepit; 之后 ProgressBar1.Repaint ?
 
不是这样的 我是想实现 一条一条的读,很清楚的显示读出的是那一行 进度条也在显示 当为100%就结束
 
进度条先赋初值,应该是数据库的数据条目数,
访问一条数据,就让进度条的值加一,然后更新表单(好像是这个Application.progress)
这样就行了应该
 
现在我这样写了不行 我的目的是在读出数据到edit中 这时label信息也在变 如
正在读出一条数据请稍候 当读到第二行时 label的值变成 正在读出第二条数据请稍候
当然进度条也在变化 当我最后一条时就结束了 edit里的值就是刚读出来的值了
我的代码是这样的还是达到这样的效果
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ProgressBar1.min:=0;
ProgressBar1.Max:=adoquery1.RecordCount ;
ProgressBar1.step:=1;
with adoquery1 do
begin
close;
sql.Clear ;
sql.Text:='select * from outhouse';
open;
end;
while not adoquery1.Eof do
begin
label1.Caption:='正在读出'+adoquery1.fieldByName('yaoid').AsString+'请稍候' ;
ProgressBar1.Position:= ProgressBar1.Position+1;
edit1.Text:=adoquery1.fieldByName('yaoid').AsString ;
adoquery1.Next ;
timer1.Enabled:=false;
end;
end;
 
代码放到timer1中,能保证在timer1的时钟时间内,运行完adoquery的代码吗,如果不能,那么又会重新执行代码啊
 
这是因为你的循环一直在处理数据,而进度控件没接收到刷新的消息引起的
你可以在循环中加入一句 Application.ProcessMessages;

while not adoquery1.Eof do
begin
label1.Caption:='正在读出'+adoquery1.fieldByName('yaoid').AsString+'请稍候' ;
ProgressBar1.Position:= ProgressBar1.Position+1;
edit1.Text:=adoquery1.fieldByName('yaoid').AsString ;
adoquery1.Next ;

Application.ProcessMessages;

end;
 
用异步查询就可以做到。
但要注意资料共享问题。异步查询有点向多线程一样。
 
同意楼上,进度控件没有得到刷新
 
ProgressBar1.Max:=adoquery1.RecordCount; 这句放到adoquery1.open后面
如下:
········
········
with adoquery1 do
begin
close;
sql.Clear ;
sql.Text:='select * from outhouse';
open;
end;
ProgressBar1.Max:=adoquery1.RecordCount ;
········
········
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ProgressBar1.min:=0;
ProgressBar1.step:=1;
with adoquery1 do
begin
close;
sql.Clear ;
sql.Text:='select * from outhouse';
open;
end;
ProgressBar1.Max:=adoquery1.RecordCount ;
while not adoquery1.Eof do
begin
label1.Caption:='正在读出'+adoquery1.fieldByName('yaoid').AsString+'请稍候' ;
ProgressBar1.Position:= ProgressBar1.Position+1;
edit1.Text:=adoquery1.fieldByName('yaoid').AsString ;
adoquery1.Next ;
Application.ProcessMessages;
timer1.Enabled:=false;
end;

end;
这样还是不行
 
在ONFetchProgress中写就成了,那里面的参数就是记录数
[:(]
 

Similar threads

I
回复
0
查看
653
import
I
S
回复
0
查看
751
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
后退
顶部