关于QuickRep 使用 OnNeedData添加数据后的打印问题(100分)

星月

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用自己定义的打印预览来打印数据。如果不在OnNeedData事件中添加数据,则打印预览
中的打印和直接打印都没问题。可以正常打印
但是,如果我在OnNeedData里手动添加数据后,打印预览没问题。所要添加的数据都显示了
但是打印却打印不出来。打印机一点反应都没有。根本没收到数据。而不使用打印预览。直接
使用QuickRep1.Print就可以打印出来。但是只要程序执行过一次打印预览。直接打印也打印
不出来了。小弟百思不得其解。求给位富翁帮忙。
下边把我自定义的打印预览代码附上。
主窗体是一个按钮
procedure TMainForm.Button1Click(Sender: TObject);
begin
PageCount:=0;//根据PageCount在OnNeedData上添加数据
RptForm1.QuickRep1.Preview;
end;

RptForm1上只有一个QuickRep1
procedure TRptForm1.QuickRep1Preview(Sender: TObject);
begin
with TMyPreview.Create(Application)do
begin
QRPreview1.QRPrinter := TQRPrinter(Sender);
CurRep := QuickRep1;
Show;
end;
end;
procedure TRptForm1.QuickRep1NeedData(Sender: TObject;
var MoreData: Boolean);
begin
if PageCount < 3 then
MoreData:=True
else
MoreData:=False;
QRLabel1.Caption :='这是第 '+IntToStr(PageCount)+' 笔数据';
PageCount:=PageCount +1;
end;

procedure TRptForm1.FormCreate(Sender: TObject);
begin
PageCount:=0;
end;

procedure TRptForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
ACtion:=caFree;
end;

MyPreview是我自己定义的打印预览窗口
private
{ Private declarations }
FPageCount : integer;//保存总共的页数
public
{ Public declarations }
CurRep : TQuickRep;//保存当前的QuickRep
end;
//下边是关键的过程
procedure TMyPreview.QRPreview1PageAvailable(Sender: TObject;
PageNum: Integer);
begin
FPageCount:=PageNum;//获得打印页数
end;
procedure TMyPreview.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
CurRep:=nil;
ACtion:=caFree;
end;
//这是打印预览里的打印语句
procedure TMyPreview.Button10Click(Sender: TObject);
begin
// QRPreview1.QRPrinter.Print ;
CurRep.Print;
//使用以上两句中的任何一句都可以在没有OnNeedData里添加数据的情况下打印
end;

 
各位富翁帮帮忙呀。我自己把帖子提前了。
 
恩?大家都没有看法吗?是不是我问的太简单了?帮忙呀。
 
OnNeedData一共要跑两次,一次是预览时,一次是打印时.你设个断点看看它到底跑了几次?
你说是自己写的预览,说不定它一次都没跑.另外,看你的源码不是很清楚,你要不要自己再
调试一下,若还有问题,能不能多贴得代码上来,再继续讨论?55,好气,刚才点到重写了,害得
我又打了一次.
 
谢谢 zhangkan
我的打印预览数据没问题。能显示我要显示的数据。说明我的 OnNeedData 没问题。但是
就是打印不了。
代码都贴上了。没别的了。帮帮忙。
 
我不知道你的OnNeedData事件中是不是只有那么一点代码,若是这样子,那么我问你,你怎么
将内容给了QuickRep中的QRLabel,QRText等控件呢?若没有,又怎么能打出来呢?OnNeedData
就是要你自己将数据给那些控件.
procedure TFrmQrt.QuickRep1NeedData(Sender: TObject;
var MoreData: Boolean);
begin
if not QPrn.Eof then
MoreData:=True
else
if QPrn.Eof then
MoreData:=False;
if MoreData then
begin
GetStyleData;
QPrn.Next;
end
else
begin
QuickRep1.QRPrinter.Progress := 100;
QPrn.First;
end;
end;
procedure TFrmQrt.GetStyleData;
begin
...
if QPrn.FieldByName('times').AsInteger>0 then
QRTimes.Caption:='重印:'+IntToStr(QPrn.FieldByName('times').AsInteger)
else
QRTimes.Caption:='新單';
...
end;

若你的OnNeedData中有上述过程,那么看看下面参考.
我看了一下你的代码,看不出别的什么出来.请问你有没有设断点,看OnNeedData那儿使用了
几次?我想你的问题可能还是要设断点一步一步的看来解决才行.你上面的代码也看不出哪儿
有问题.你的QuickRep中还有没有其他的事件,若有,你能不能先将其他事件先去掉,一步一步
来.你在OnNeedData事件中的下列代码会不会有问题.因为要页数小于3才打,否则就不打.你
先去掉看看?你的OnNeedData与Preview中的代码是否一致?
if PageCount < 3 then
MoreData:=True
else
MoreData:=False;
最后,我看你的代码:
procedure TMyPreview.QRPreview1PageAvailable(Sender: TObject;
PageNum: Integer);
begin
FPageCount:=PageNum;//获得打印页数
end;
这儿,我想我找到原因了,你这儿给了它一个值,它预览完后值并没有被清0,所以你将其在
AfterPreview中清为0,我想就可以了.
 
谢谢 zhangkan ,看了你最后一句话,忽然提示了我。我现在手头没DELPHI。等我回去
看看。好使了一定给你加分。谢谢了。
 
接受答案了.
 
顶部