如何实现自动多页打印?(100分)

  • 主题发起人 主题发起人 zgyingmu
  • 开始时间 开始时间
Z

zgyingmu

Unregistered / Unconfirmed
GUEST, unregistred user!
我要用QuickReport把ADOQuery1查询出来的所有记录(不止一条记录)自动都打印出来
(即报表格式是同一张,而内容随数据不同而不同,因此有几条记录就应有几张报表),
以上功能如何实现,请高手赐教!我用的是Delphi5。
(我是用QRLabel:=ADOQuery1.FieldByName('xm').AsString实现报表内容赋值的,
不知打印查询结果是否是用这种方法的,因为使用这种方法,QuickRep的DateSet属性就
没什么用处了。)
 
那些 QRDBXXXX 控件都有个 DataSet 和 DataField 属性的,可以指定数据集和字段,如:
对一个 QRDBText 指定它的 DataSet 为 ADOQuery1, DataField 为 xm ,则打印时效果就
相当于你上面那样对 QRLabel 手工进行赋值。当然要记得 QuickRep 的 DataSet 属性也要
设成 ADOQuery1 才行。
 
bbkxjy说的对了一部分,quickrep的dataset不应设置,如果设置的话,这多条记录就打印到
一页上了,用bbkxjy前面所讲的方法设置qr控件属性,然后用程序遍历所有查询到的记录,
就可以了,大概代码是这样的(我没有测试过)不妨参考一下:
with ADOQuery1do
begin
First;
while Not Eofdo
begin
with QuickRepdo
begin
Refresh;
Update;
Print;
end;
Next;
end;
end;
 
在detailband的afterprint 事件中加入
quickrep.newpage;
 
可以根据已经打印的行数来控制每页打印的行数
然后确定分页
 
同意楼上意见,事先规定好每页要打多少行数据。
 
最近修改了quickrpt.pas的源码,达到的功能是
如果我只有一行数据,但是我必须打5行(比如套打).
 
to : taogou
请教你是怎么做的,可以说一下吗?谢谢!
 
前面说的那些方法都是在打印的时候实现自动分页,那么预览的时候呢?Preview的时候
如何实现自动分页呢?
 
[green]同意bbkxjy说的一部分[/green],但要將report的rbDetail的高度調成整頁大小,
這樣就可以實現[blue]每記錄/每頁[/blue]
 
在Delphi中运用QuickReport实现多栏列印

---- 在所有有关Delphi的书籍中,都没有讲解如何实现一个打印项的多栏打印,而实现生活中往往有许多报表要求同一项目多栏打印,QuickReport提供了报表打印一整套完整的解决方案,完全可以实现同一项目的多栏打印,技术关键是如何控制表中记录提取个数,如果在Treport的DataSet属性中选定一个Table
那么QuickReport每次打印详细列表(BandType=rbDetail)属性的TQRBand时,系统会自动取出一个记录供打印,并将表中的记录指针移到下一位,这样程序无法控制表中记录指针的移动,就无法实现多栏打印,只要程序不在Treport的DataSet属性选定任何表
QuickReport便不会控制表记录的提取,QuickReport特为其它类型数据打印提供了一个OnNeedData事件,QuickReport 每次打印详细列表(BandType=rbDetail)属性的TQRBand时,会触发这个事件,要求提供打印数据,如果程序在OnNeedData事件中编写运用表中数据提供打印资料,便能实现多栏打印,现举例说明:

---- 现在要实现一个Table1中Name项两栏打印,在窗口上放TquickReport组件 quickReport1,并在上面放Tband组件band1,将其BandType属性改为Detail,在Tband 组件上并排放两个QRLabel组件QRLabel1和QRLabel2,在quickReport1的OnNeedData事件中写如下代码:

procedure TForm1.QuickRep1NeedData(Sender:
TObject;
var MoreData: Boolean);
var
I: integer;
begin

MoreData := True;
for I:= 1 to 2do

begin

if Table1.Eof then
Break;
case I of
1: QRLabel1.Caption :=
Table1.FieldByName('Name').AsString;
2: QRLabel2.Caption :=
Table1.FieldByName('Name').AsString;
end;

Table1.Next;
end;

if Table1.Eof then
MoreData := False;
end;

---- 为了保证打印或者打印预览开始时Table1指针在第一条记录,在quickReport1的 BeforePrint事件中写如下代码:
procedure TForm1.QuickRep1BeforePrint
(Sender: TCustomQuickRep;
var PrintReport: Boolean);
begin

Table1.First;
end;


---- 这样程序调用QuickRep1.Preview或者QuickRep1.Print便能预览或者打印到一个关于 Name的从左至右,从上到下的多栏报表。
 
printer.begin
doc;
printer.textout(100,100,'111111111111111');
printer.enddoc;
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2006219
 
后退
顶部