close; sql.clear; sql.add('exec marc_yljgpc'); execsql;execsql后程序就一直等待结果,并不知道你的存储过程进行状态,这样没有办法显示进度的。 你可以考虑将存储过程用代码实现,这样可能效率会低些,但是可以使用progressbar控制操作的进度。 比如: q1.sql.text:=select id from 表 q1.open;for i:=1 to q1.recordcount do begin progressbar1.Position:= trunc((i/q1.recordcount)*100); //存储过程代码 q1.next; end;
(1)Timer控件可以不要了,也就是说下面这段代码完全可以删掉!! procedure TForm1.Timer1Timer(Sender: TObject); begin if progressbar1.Position >= 100 then begin timer1.Enabled := false; showmessage('执行完毕!'); Application.terminate; end else begin progressbar1.Position := progressbar1.Position + 1; end; end; (2)选中你的存储过程控件,调出属性对话框。 (3)定位到Events页,找到OnFetchProgress项,双击到代码编辑页。 (4)填入上面的代码。 //OnFetchProgress事件处理过程 procedure TForm1.ADOStoredProc1FetchProgress(DataSet: TCustomADODataSet; Progress, MaxProgress: Integer; var EventStatus: TEventStatus); begin //在这里写你控制进度条进度的代码。 ProgressBar1.Position:= Round(Progress / MaxProgress * 100); ProgressBar1.Repaint; if ProgressBar1.Position >= 100 then begin ShowMessage('执行完毕!'); Application.Terminate; end; end; (5)设置ProgressBar控件的相关属性,如下: Progressbar属性设置如下:.Min:= 0; .Max:= 100; .Step:= 1; .Position(表示完成的百分比) (6)确定你的程序没有什么语法错误之后,运行程序不就OK了?
procedure TForm1.ADOStoredProc1FetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
//在这里写你控制进度条进度的代码。
end;
begin
if progressbar1.Position >= 100 then
begin
timer1.Enabled := false;
showmessage('执行完毕!');
Application.terminate;
end
else
begin
progressbar1.Position := progressbar1.Position + 1;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var
serverfile: textfile;
serverstr, server: string;
servername, database, username, password, serverport: string;
begin
label1.Visible := true;
progressbar1.Visible := true;
progressbar1.Enabled := true;
timer1.Enabled := true;
if fileexists(ExtractFilepath(Application.ExeName) + 't1.txt') = false then //t1.txt文件是否存在
begin
exit;
end;
assignfile(serverfile, 't1.txt');
reset(serverfile);
readln(serverfile, serverstr); //将文件第一行的内容符给 serverstr
servername := serverstr;
readln(serverfile, serverstr);
database := serverstr;
readln(serverfile, serverstr);
username := serverstr;
readln(serverfile, serverstr);
password := serverstr;
try readln(serverfile, serverport); except serverport := ''; end;
if trim(serverport) = '' then serverport := '1433';
closefile(serverfile); //关闭文件
try
datamodule2.ADOConnection1.Close;
datamodule2.ADOConnection1.ConnectionString := '';
datamodule2.ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=' + password + ';Persist Security Info=False;User ID=' + username + ';Initial Catalog=' + database + ';Data Source=' + servername; //+';Network Address='+servername+','+serverport;
datamodule2.ADOConnection1.Connected := true;
except end;
with A_xs do
begin
close; sql.clear;
sql.add('exec marc_yljgpc');
execsql;
end;
end;
就是这个小程序!我现在这样做只能把SQL执行完了之后再执行进度条?有什么办法让什么同时进行的?
procedure TForm1.ADOStoredProc1FetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
//在这里写你控制进度条进度的代码。
ProgressBar1.Position:= Round(Progress / MaxProgress * 100);
ProgressBar1.Repaint; if ProgressBar1.Position >= 100 then
begin
ShowMessage('执行完毕!');
Application.Terminate;
end;
end;
.Max:= 100;
.Step:= 1;
.Position(表示完成的百分比)
sql.add('exec marc_yljgpc');
execsql;execsql后程序就一直等待结果,并不知道你的存储过程进行状态,这样没有办法显示进度的。
你可以考虑将存储过程用代码实现,这样可能效率会低些,但是可以使用progressbar控制操作的进度。
比如:
q1.sql.text:=select id from 表
q1.open;for i:=1 to q1.recordcount do
begin
progressbar1.Position:= trunc((i/q1.recordcount)*100);
//存储过程代码
q1.next;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if progressbar1.Position >= 100 then
begin
timer1.Enabled := false;
showmessage('执行完毕!');
Application.terminate;
end
else
begin
progressbar1.Position := progressbar1.Position + 1;
end;
end;
(2)选中你的存储过程控件,调出属性对话框。
(3)定位到Events页,找到OnFetchProgress项,双击到代码编辑页。
(4)填入上面的代码。
//OnFetchProgress事件处理过程
procedure TForm1.ADOStoredProc1FetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
//在这里写你控制进度条进度的代码。
ProgressBar1.Position:= Round(Progress / MaxProgress * 100);
ProgressBar1.Repaint; if ProgressBar1.Position >= 100 then
begin
ShowMessage('执行完毕!');
Application.Terminate;
end;
end;
(5)设置ProgressBar控件的相关属性,如下:
Progressbar属性设置如下:.Min:= 0;
.Max:= 100;
.Step:= 1;
.Position(表示完成的百分比)
(6)确定你的程序没有什么语法错误之后,运行程序不就OK了?
我们一直在用的.
不过实现起来有点技术难度的.
呵呵
用异步方式
用的Adoquery
SQL SERVER 2000
SQL 语句:Select * FORM sysobjects
procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
with ProgressBar1 do
begin
Memo1.Lines.Add(VarToStr(Progress)+Char(#9)+VarToStr(MaxProgress));
end;
end;
得到的数据如下:
Progress MaxProgress
65 80
80 95
95 110
110 125
125 140
140 155
155 170
170 185
185 200
200 215
215 230
230 245
245 260
260 275
275 290
290 305
305 320
320 335
335 350
350 365
365 380
380 395
395 410
410 425
425 440
440 455
455 470
470 485
485 500
500 515
515 530
530 545
545 560
560 575
575 590
590 605
605 620
620 635
635 650
650 665
665 680
680 695
695 710
710 725
725 740
740 755
755 770
770 785
785 800
800 815
815 830
830 845
845 860
860 875
875 890
890 905
905 920
920 935
935 950
950 965
965 980
980 995
995 1010
1010 1025
1025 1040
1040 1055
1055 1070
1070 1085
1085 1100
1100 1115
1115 1130
1130 1145
1145 1160
1160 1175
1175 1190
1190 1205
1205 1220
1220 1235
1235 1250
1250 1265
1265 1280
1280 1295
1295 1310
1305 1305
搞不清楚为什么MaxProgress一直在变
而且好象记录数是以15递增,而不是1呢