进度条(100)

  • 主题发起人 主题发起人 hmcheery
  • 开始时间 开始时间
H

hmcheery

Unregistered / Unconfirmed
GUEST, unregistred user!
我在做查询时,希望当点击按钮后,进度条慢慢开始,等到ADODATASET打开后,quickreport 已经显示出来了,进度条关闭,如何达到这个效果?代码为:procedure TForm1.Button1Click(Sender: TObject);begin // progressbar1 adodataset1.close; adodataset1.commandtext:='select * from aa'; adodataset1.open; quickrep1.preview;end;请高手指教
 
你什么意思? 你要的是 连接数据库的进度? 还是 Select 数据到客户端的速度?如果是 Select 数据到客户端的速度, 可用异步执行..procedure TForm1.ds1FetchComplete(DataSet: TCustomADODataSet; const Error: Error; var EventStatus: TEventStatus);begin // 下载完成end;procedure TForm1.ds1FetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus);begin // 进度加 1end;procedure TForm1.btn1Click(Sender: TObject);begin // cmd1.ExecuteOptions := [eoAsyncExecute]; // 用 ADOCommand 取得总记录条数 select Sum(*) from ... // 把总记录条数 赋给进度条最大值 // ds1.ExecuteOptions := [eoAsyncExecute]; // [eoAsyncFetchNonBlocking];end;
 
我是在click 中ds.opends.open 需要很长时间(不确定),在这个过程里进度条,慢慢前移
 
那就是连接到数据库的进度了~?, 没有 ADODataSet 没有连到 ADOConnection?这个好象只有定时去修改进度条了, 而且不能在主线程中修改, TTimer 也不行. 应该只有用线程了.给你个思路:TADOConnectThread = class(TThread)Private FADOConnection: TADOConnection;Protected Procedure Execute; override;Public Constructor Create(Suspended: Boolean; const ADOConnection: TADOConnection); reintroduce;End;ImplementationConstructor TADOConnectThread.Create(Suspended: Boolean; const ADOConnection: TADOConnection);Begin Inherited Create(Suspended); FADOConnection := ADOConnection; FreeOnTerminate := True;End;Procedure TADOConnectThread.Execute;Begin FADOConnection.Connected := True;End;// 在线程执行之后去等待 while not conn1.Connected do begin Sleep(1000); pb1.Position := pb1.Position + 1;end; 也还没明白你到底是哪一个进度? 反正两个进度都给你了~~, 自己选吧~~~
 
我是用adodataset 作为数据源
 
还是看不懂哇,procedure TForm1.Button1Click(Sender: TObject);begin // progressbar1 adodataset1.close; adodataset1.commandtext:='select * from aa'; adodataset1.open; quickrep1.preview;end;在这个过程中,需要等待,我想在FORM中加入进度条,当报表预览后进度条就满了.
 
你所说的是假进度,如果能得到当前返回的记录条数就简单多了,如果实在得不到当前返回的记录条数,就记录处理当前操作所需要的时间,然后存入一个文件中。下次再进行次项操作时先从文件中读取所需的时间,然后用定时器或线程在当前时间内填满进度条。假如在进度条进行到 98% 或 99%时还没有处理完当前操作就进行等待。这时的等待估计时间不会太长。操作完成后再记录一次所需的时间,以便下次使用。
 
我的目的是在ADODATASET1.OPEN 的这段时间内进度条动作://点击报表预览事件procedure TForm1.Button1Click(Sender: TObject);begin adodataset1.Close; adodataset1.CommandText:='select * FROM AAA'; adodataset1.Open; quickrep1.Preview;end;procedure TForm1.Timer1Timer(Sender: TObject);begin progressbar1.StepBy(1);end;procedure TForm1.ADODataSet1BeforeOpen(DataSet: TDataSet);begintimer1.Enabled:=true;end;procedure TForm1.ADODataSet1AfterOpen(DataSet: TDataSet);begin timer1.Enabled:=false;end;这样 timer的ontime 事件怎么不执行?
 
最近看了一些帖子,对这方面的需求还真是多呀。可惜没有什么好的解决办法,只听说DB2支持这样的用法。剩下的Oracle、SQLServer都不支持。祝君好运。
 
大伙能不能帮忙想想办法呀只要在这段时间内进度条有变化,就可以了,不一定要精确到进度条同打开数据源同步
 
大的查询时进度条一般读不动了,我的方法是调用另外一个京城(程序)来模拟显示,用了多年了!
 
LZ 啊, 有空多来逛逛. 不回帖, 也可以多看看帖啊!ADO 连接数据库, 已经占用了主线程. TTimer 是通过 主线程 消息来执行的. 主线程被占用了, TTimer 就没法收到消息, 自然就不执行了~~~~.所以我前面提到用线程去连接数据库, 然后在主线程中等待. 以连接超时的时间为进度最大值. 如果到连接超时时间了还没连上, 就停止连接!!!!
 
后退
顶部