W
wsn
Unregistered / Unconfirmed
GUEST, unregistred user!
对不起,有个小问题麻烦一下大家,关于《Delphi 5.x ADO/MTS/COM+高级程序设计篇》里面ADO异步执行例子的问题(关于 ProgressBar 的"Canvas does not allow drawing")(100分)<br />
对不起,有个小问题麻烦一下大家,关于《Delphi 5.x ADO/MTS/COM+高级程序设计篇》
里面ADO异步执行例子的问题(关于 ProgressBar 的"Canvas does not allow drawing")
是第三章里的ADO异步执行的例子,完全按照书上的代码敲的,
“同步 eoAsyncFetch ”状态的一切正常(没用到ProgressBar)
但是 “异步 eoAsyncFetchNonBlocking”状态下执行时当
ProgressBar画到最后的时候就出现 "Canvas does not allow drawing" 的错误提示框
我觉得是ProgressBar 出了问题,或者是设置问题或者是程序方面的问题
ProgressBar 的设置
max:0
min:0
step:10
代码如下:
================================================
......
private
lStart : Longint;
lEnd : Longint;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//窗体OnActivate事件处理程序首先执行TADOCmmand的SQL命令,并且从它回传
//的暂时Recordset对象中取出ADOTestDatas数据表中所有数据的笔数,然后再指定
//给TProgressBar的Max值,最后指定给窗体的Caption属性值。
procedure TForm1.FormActivate(Sender: TObject);
var
sRecNo:string;
begin
ProgressBar1.Max :=ADOCommand1.Execute.Fields.Item[0].Value;
sRecNo:=IntToStr(ProgressBar1.Max);
self.caption:=self.caption+' 共有'+ sRecNo +'笔数据';
end;
//在上面的程序代码中先关闭 的TADODataSet,再设定它的ExecuteOptions
//属性值为使用异步方式来存取数据。最后再打开TADODataSet组件,从
//ADOTestDatas数据表中取得数据
procedure TForm1.Button_eoAsyncFetchNonBlocking_Click(Sender: TObject);
begin
try
ADODataSet1.Active :=False;
ADODataSet1.ExecuteOptions :=[eoAsyncFetchNonBlocking];
finally
lStart:=GetTickCount;
ADODataSet1.Active :=true;
end;
end;
//在异步方式中, ADO会以OnFetchProgress事件来通知应用程序A D O还在处理
//数据之中,并且以OnFetchComplete事件来通知应用程序A D O已经处理数据完毕了。
//程序员可以在这两个事件处理程序中撰写程序代码来处理这两种情形。下面是范
//例应用程序在这两个事件处理程序中实现的程序代码。
procedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
[green]ProgressBar1.Position :=Progress;[/green]
//例子程序中这句是注释掉了
end;
procedure TForm1.ADODataSet1FetchComplete(DataSet: TCustomADODataSet;
const Error: Error; var EventStatus: TEventStatus);
begin
lEnd:=GetTickCount;
ShowMessage('总共花费'+FloatToStr((lEnd-lStart)/1000)+' 秒');
end;
end.
================================================
我就是不明白怎么会超出画布呢?
对不起,有个小问题麻烦一下大家,关于《Delphi 5.x ADO/MTS/COM+高级程序设计篇》
里面ADO异步执行例子的问题(关于 ProgressBar 的"Canvas does not allow drawing")
是第三章里的ADO异步执行的例子,完全按照书上的代码敲的,
“同步 eoAsyncFetch ”状态的一切正常(没用到ProgressBar)
但是 “异步 eoAsyncFetchNonBlocking”状态下执行时当
ProgressBar画到最后的时候就出现 "Canvas does not allow drawing" 的错误提示框
我觉得是ProgressBar 出了问题,或者是设置问题或者是程序方面的问题
ProgressBar 的设置
max:0
min:0
step:10
代码如下:
================================================
......
private
lStart : Longint;
lEnd : Longint;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//窗体OnActivate事件处理程序首先执行TADOCmmand的SQL命令,并且从它回传
//的暂时Recordset对象中取出ADOTestDatas数据表中所有数据的笔数,然后再指定
//给TProgressBar的Max值,最后指定给窗体的Caption属性值。
procedure TForm1.FormActivate(Sender: TObject);
var
sRecNo:string;
begin
ProgressBar1.Max :=ADOCommand1.Execute.Fields.Item[0].Value;
sRecNo:=IntToStr(ProgressBar1.Max);
self.caption:=self.caption+' 共有'+ sRecNo +'笔数据';
end;
//在上面的程序代码中先关闭 的TADODataSet,再设定它的ExecuteOptions
//属性值为使用异步方式来存取数据。最后再打开TADODataSet组件,从
//ADOTestDatas数据表中取得数据
procedure TForm1.Button_eoAsyncFetchNonBlocking_Click(Sender: TObject);
begin
try
ADODataSet1.Active :=False;
ADODataSet1.ExecuteOptions :=[eoAsyncFetchNonBlocking];
finally
lStart:=GetTickCount;
ADODataSet1.Active :=true;
end;
end;
//在异步方式中, ADO会以OnFetchProgress事件来通知应用程序A D O还在处理
//数据之中,并且以OnFetchComplete事件来通知应用程序A D O已经处理数据完毕了。
//程序员可以在这两个事件处理程序中撰写程序代码来处理这两种情形。下面是范
//例应用程序在这两个事件处理程序中实现的程序代码。
procedure TForm1.ADODataSet1FetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
[green]ProgressBar1.Position :=Progress;[/green]
//例子程序中这句是注释掉了
end;
procedure TForm1.ADODataSet1FetchComplete(DataSet: TCustomADODataSet;
const Error: Error; var EventStatus: TEventStatus);
begin
lEnd:=GetTickCount;
ShowMessage('总共花费'+FloatToStr((lEnd-lStart)/1000)+' 秒');
end;
end.
================================================
我就是不明白怎么会超出画布呢?