聲明:西部E網(www.wsalc.com) 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;