>>我已经按现在的思路写了好几个这样的打印程序
您的思路是错误的,照您的程序看,您把所有待打印的数据均生成了
一个QRLabel输出,正确的做法是在DetailBand中只生成8个QRLabel,
在OnNeedData事件中赋值,在BeforePrint中控制每页打印的行数。
也可以先生成一整页的表样,比如22行的表格,然后将DetailBand
的ForceNewPage设为True,即可控制分页,还能解决补充空行的问题。
下面将你的程序按照办法2修改了一下:
unit QRBRep;
interface
uses Windows, SysUtils, Messages, Classes, Graphics, Controls,
StdCtrls, ExtCtrls, Forms, Quickrpt, QRCtrls;
type
TQRBRep1 = class(TQuickRep)
QRBand1: TQRBand;
detailBand1: TQRBand;
QRLabel1: TQRLabel;
QRGroup1: TQRGroup;
QRMemo1: TQRMemo;
procedure QRBRepBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
procedure QRBRepNeedData(Sender: TObject;
var MoreData: Boolean);
private
public
end;
var
QRBRep1: TQRBRep1;
QRLabel: array of array of TQRLabel;
QRShape: array of array of TQRShape;
xzjlst: integer;
implementation
uses QRBank1, Unit1;
{$R *.DFM}
procedure TQRBRep1.QRBRepBeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
var
i,j: integer;
begin
{
SetLength(QRLabel,xzjlsn+2,8);
//xzjlsn为全局变量,为要打印的StringGrid行数
SetLength(QRShape,xzjlsn+2,8);
}
SetLength(QRLabel,22+1,8);
// xzjlsn为StringGrid的行数,而此处应该是生成每页打印的行数,
SetLength(QRShape,22+1,8);
// 从您的程序看,应该是22行,另加一个标题行
xzjlst:=1;
// xzjlst是StringGrid的当前打印行号
for j:=0 to 22do
// 见上
begin
for i:=0 to 7do
begin
QRShape[j,i]:=TQRShape.Create(QRBRep1);
with QRShape[j,i]do
begin
Parent:=DetailBand1;
Left:=i*92;
Top:=j*24;
Height:=25;
Width:=93;
Enabled:=True;
Visible:=True;
end;
QRLabel[j,i]:=TQRLabel.Create(QRBRep1);
with QRLabel[j,i]do
begin
Parent:=DetailBand1;
Left:=i*92+2;
Top:=j*24+6;
Height:=16;
Width:=90;
Alignment:=TaCenter;
AutoSize:=True;
Caption:='';
Enabled:=True;
Visible:=True;
end;
end;
{
******************
这里加入
if (j<>0) and ((j mod 22)=0) then
quickRep1.NewPage;
//运行时出现非法调用错误
****************************
}
end;
QRLabel[0,0].Caption:='序号';
QRLabel[0,1].Caption:='帐号';
QRLabel[0,2].Caption:='销帐日期';
QRLabel[0,3].Caption:='话费月份';
QRLabel[0,4].Caption:='话费';
QRLabel[0,5].Caption:='上次余额';
QRLabel[0,6].Caption:='本次余额';
QRLabel[0,7].Caption:='滞纳金';
xzjlst:=1;
end;
procedure TQRBRep1.QRBRepNeedData(Sender: TObject;
var MoreData: Boolean);
var
i,j: Integer;
begin
if xzjlst > xzjlsn then
// xzjlsn为全局变量,为要打印的StringGrid行数
MoreData:=False
else
begin
MoreData:=True;
for j:=1 to 22do
// 同上
begin
for i:=0 to 7do
begin
if xzjlst > xzjlsn then
QRLabel[j,i].Caption := ''
else
QRLabel[j,i].Caption:=QRBankForm.StringGrid1.Cells[i,xzjlst];
// 打印当前行对应的数据
end;
end;
Inc(xzjlst);
end;
end;
end;
end.
Good Luck !