声明:西部E网(www.weste.net) wuaihua 原创,如转载请注明出处
作者:wuaihua email:River2003@126.com QQ:18408685
说明:本人使用的是Delphi6
由于本人在制作打印报表时遇到以下问题:在设计时从数据库中取出的某一字段类型为Text型,经过用户在界面添加新的内容后不存入数据库 直接打印输出,大家都知道Text的长度较长[text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。],而且在制作 报表时要求单独输出,所以就有可能存在分成多页输出的问题。而Delphi中通常对分页输出的处理是使用QReport控件组中的TQRDBRichText控 件放在报表的TQRSubDetail子表控件上,要求是TQRDBRichText要与数据源连接!但是例中的Text数据类型的值是选赋值到TRichEdit控件中,经 过用户对内容的再次添加后直接打印输出,由于要考虚程序执行效率,不重新写入数据库,所以无法通上面提到的赋值给TQRDBRichText控件的 办法去实现。所以一切分页打印工作必须通过程序手动分页打印处理。
首先对上面提到的实际情况特性进行分析:
1.所有Text字段的内容以及新增的内空都在TRichEdit控件中,TRichEdit是界面上的Win32组的控件。
2.输出报表是要把录入时的格式也能够完全的展示出来,因为TRichEdit控件中可以输入控制符,例如:"回车符",所以也只有选用能够把 TRichEdit.Text的所以字符都能够接收的TQRRichText控件。
3.按2中的控件已经可以确定,所以下一步就要考虚把TRichEdit.Text的值赋给TQRRichText控件。通过TQRRichText.Lines.Add()方法逐行加入。
4.用户界面上的TRichEdit(取名为RichEditUser)与报表界面上的TQRRichText(取名为QRRichTextQRp)的宽度可能有所不同,所以再要添加一 个TQRRichText的控件(取名为QRRichText1),将QRRichText1.Width与最终报表控件上的QRRichTextQRp.Width相同字体字号也要相同,目的 是将界面上的RichEditUser.text内容赋到QRRichText1中能够得到最终输出报表上QRRichTextQRp真实总行数,然后将总行数进行分页处理。
具体算程序及算法如下:
procedure TFrmWorkBill.Print;
var
FrmGroupPrint: TFrm_A_AF_GroupInfoPrint;
PageCount,k,LinesCount,PageRow: Integer; //PageCount页数循环中间变量,LinesCount总行数,k新一页在取的QRRichText1.Lines的起点数
begin
PageRow := 58; //每页中QRRichTextQRp中容纳的行数,此值根据字体大小经过实际测算得出
QRRichText1.Lines.Clera;
QRRichText1.Lines.Add(RichEditUser.Text); //将用户介面的RichEditUser.Text内容赋值到QRRichText1.Lines.Add中
LinesCount := QRRichText1.Lines.Count;
for PageCount := 1 to LinesCount div PageRow + 1 do begin
WorkTallyPrint := TFrm_Work_Tally_Print.create(self); //WorkTallyPrint是报表所在的窗体
WorkTallyPrint.ClareQRRich;
WorkTallyPrint.AssignRep(PageCount); //PageCount将当前所在页传给报表,作为页号标记,相关过程在WorkTallyPrint中
if PageCount = LinesCount div PageRow + 1 then //判断如果是末页
for k := (PageCount - 1) * PageRow + 1 to LinesCount do begin
WorkTallyPrint.QRRichTextQRp.Lines.Add(QRRichText1.Lines[k - 1]);
end
else //判断非末页
for k := (PageCount - 1) * PageRow + 1 to PageCount * PageRow do begin
WorkTallyPrint.QRRichTextQRp.Lines.Add(QRRichText1.Lines[k - 1]);
end;
WorkTallyPrint.QuickRep1.Print;
WorkTallyPrint.Free;
end;
end;