对不起,有个小问题麻烦一下大家,关于《Delphi 5.x ADO/MTS/COM+高级程序设计篇》里面ADO异步执行例子的问题(关于 ProgressBar

  • 主题发起人 主题发起人 wsn
  • 开始时间 开始时间
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.

================================================


我就是不明白怎么会超出画布呢?
 
全文检索现在不好用,直接找的都不合适
:(
 
有没有随书源码的,不然可以源码中是否正常.
 
是在
http://202.96.70.228/cakk/delphi/delphi.htm
下载的电子教程和代码

最想不通的就是样例代码竟然可以[:(]
 
运行第一遍的时候可以
以后就我遇到的情况一样了
 
你的机子有没有装打印机?这种情况我在做报表的时候遇到过
,我安装打印机之后就好了。不知道是不是同一种原因?
 
可是这个程序并没用到打印方面的东西呀
 
ADO异步查询我一直没试成功过。。。
你的代码中的数据存取部分如果放到线程中执行试过了么?
 
关于我的方法,你可以试试,我也不知道管不管用。
 
to :夏日的落叶
打印机安装的没问题
to :forss,
其实这在执行效果上和线程没什么区别,我的错误就是出在 ProgressBar 的显示上

可是我这里的原程序也一样出错的呀
 
黑黑,会不会是你自己机子的问题呀。。。
我这边系统出问题的时候打开FOXMAIL也会出现画布错误。。。。。:))
 
我买的李维的这本书,随书的代码盘源码也有这个问题。
不过现在ADO异步执行我已经搞定了。
 
ProgressBar1.Position :=Progress;
//例子程序中这句是注释掉了

这句是绝对不可以注释的。
 
to :forss
我这里的foxmail打开也是出错的,但是不影响使用,也是遇到内存地址错误,
现在换 4.1 版本的就没事了
to :zuidaeji,
我自己的程序中没有把它设为注释
我想问一下,你的progressbar 是怎么显示的进度的呀/
还有别的问题吗?
 
ADO异步执行我已经搞定了
~~~~~~~~~~~~~~~~~~~~~~~ 怎么搞定的啊。。我异步查询老是用不来。。
能不能告诉我?或者发个小DEMO给我看看。。。forscn@163.com
方便的话可以在QQ上告诉我。。:6582720 THANKS。。
 
今天下午我刚好在搞这个问题,已经通过了,方法就如上面所述,出现Canvas可能是你的系统
有问题。
只是因为我的程序的SQL语句是不定的,所以取得总数不太容易,没有办法显示确切的进度,
void __fastcall TWorkForm::ADOQueryFetchProgress(
TCustomADODataSet *DataSet, int Progress, int MaxProgress,
TEventStatus &amp;EventStatus)
这里面的MaxProgress没有什么用处。
 
还是没弄明白 [:(]
 
"Canvas does not allow drawing"
这东西我的foxmail4。0出现过 ^_^,知道为什么吗?
因为我开了powerdesigner(狂耗资源)和n个ie
所以。。。。。。你的系统资源是不是有问题?
你的程序是否有浪费的资源的地方?

弄明白了原因告诉我一声~
 
这是线程同步问题,ADO异步执行查询时所使用的线程与发出调用申请的线程不同。

解决方法是使用Windows消息,如下:

//设ADODataSet1.ExecuteOptions :=[eoAsyncFetchNonBlocking];
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, ComCtrls, StdCtrls;

const
WM_FETCHCOMPLETE=WM_USER+100;
WM_FETCHPROGRESS=WM_USER+101;
type
TForm1 = class(TForm)
ADOConnection: TADOConnection;
Button1: TButton;
ProgressBar1: TProgressBar;
ADOQuery1: TADOQuery;
procedure ADOQuery1FetchProgress(DataSet: TCustomADODataSet; Progress,
MaxProgress: Integer; var EventStatus: TEventStatus);
procedure ADOQuery1FetchComplete(DataSet: TCustomADODataSet;
const Error: Error; var EventStatus: TEventStatus);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
protected
procedure WMFETCHCOMPLETE(var Msg:TMessage);message WM_FETCHCOMPLETE;
procedure WMFETCHPROGRESS(var Msg:TMessage);message WM_FETCHPROGRESS;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ADOQuery1FetchProgress(DataSet: TCustomADODataSet;
Progress, MaxProgress: Integer; var EventStatus: TEventStatus);
begin
// if ProgressBar1.Max<>MaxProgress then
// ProgressBar1.Max:=MaxProgress;
//
// ProgressBar1.Position:=Progress;
PostMessage(Handle,WM_FETCHPROGRESS,Progress,MaxProgress);
end;

procedure TForm1.ADOQuery1FetchComplete(DataSet: TCustomADODataSet;
const Error: Error; var EventStatus: TEventStatus);
begin
//ShowMessage('OK!');
PostMessage(Handle,WM_FETCHCOMPLETE,0,0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1.Open;
end;

procedure TForm1.WMFETCHCOMPLETE(var Msg: TMessage);
begin
ShowMessage('OK!');
end;

procedure TForm1.WMFETCHPROGRESS(var Msg: TMessage);
begin
if ProgressBar1.Max<>Msg.WParam then
ProgressBar1.Max:=Msg.WParam;

ProgressBar1.Position:=Msg.LParam;
end;

end.
 

Similar threads

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