1. 程式人生 > >FastReport套打 和連續打印

FastReport套打 和連續打印

一起 客戶 打印 銷售 呵呵 rtp *** class margin

FastReport套打,紙張是連續的帶鋸齒的已經印刷好的,類似於通信公司發票
這裏設計的是客戶銷售記錄。
客戶有兩個要求:
1、因為打印紙張是印刷的,明細記錄只有8行,所以,如果明細記錄如果不到8行,就將公司名稱、銷售記錄打印在上面,下一個公司的信息打印在下一頁,而不能接在該頁上(呵呵,是啊,如果接在一起,那印刷單就失去意義了)
2、如果銷售記錄超過8行,則從第9行開始的銷售記錄打印在下一頁(所謂下一頁,其實就是鋸齒分割的下一*,稱呼“下一份”比較妥切?),並且擡頭(也就是公司名稱)也要打上(如果不打印擡頭,撕下了後,可能弄混淆了,不知道這一頁是哪個公司的)
問題描述標準說法是不是應該叫“打印固定行”、“強制換頁”?
回答:每頁打印擡頭的問題,就是把包含公司名稱的Band每頁重復打印即可。屬性中有一個的。勾選就行了。
至於固定行,實際上設計套打時,頁面大小都是固定的,每一行的高度也都是固定的,頁眉與頁腳也是固定的,這樣設計出來的報表可打印的行數自然就是你要求的 8行了。根本不需要什麽強制換頁。因為根據紙張會自動換頁的。你要做的就是設計好紙張盡寸、頁面布局,就得了,套打是一種最簡單的打印,不用想的太復雜。
******實現連續打印
很多人認為Fr不能實現連續打印,以為只能通過自己寫函數調用打印函數來實現連續打印,實際上,Fr可以輕易的實現連續打印,同時,實現時又是非常簡單,你甚至可以在你的程序的打印設置中簡單的讓客戶選擇是否連續打印,其它都可以保持不變。
function PelsTomm(Pels:Extended):Extended;
begin
Result:=Pels/Screen.PixelsPerInch*25.4;
end;
procedure PrintSerial(Frx:TFrxReport;SequencePage:Byte=0);
var
P:TfrxReportPage;
R,R1:Extended;
begin
{必須是二遍報表,否則無法計算總頁數。
下面的方法只適用於沒有頁腳的情況,因為如果有頁腳的話
FreeSpace就始終為0了。可以用報表腳來代替。
因為是連續打印,也可以看作只有一頁,報表腳也就相當於頁腳了}
if not Frx.Engine.DoublePass then Exit;
//SequencePage指要連續打印的頁面,普通報表就是0
P:=TfrxReportPage(Frx.Pages[SequencePage]);
R1:=P.TopMargin P.BottomMargin;
while Frx.PrepareReport do
begin
if (Frx.Engine.TotalPages<=1) then Break;
R:=Pelstomm(Frx.Engine.TotalPages*Frx.Engine.PageHeight-
Frx.Engine.FreeSpace) R1;
P:=TfrxReportPage(Frx.Pages[SequencePage]);
P.PaperHeight:=R;
end;
{必須用上面的循環代碼來得到準確的空白區域
不能用通過計算總頁數減去各頁的頁邊距的方法來獲得空白區域
因為如果碰到一條記錄過寬的情況導致換頁,就不準確了。}
R:=Pelstomm(Frx.Engine.TotalPages*Frx.Engine.PageHeight-
Frx.Engine.FreeSpace) R1;
P:=TfrxReportPage(Frx.Pages[SequencePage]);
P.PaperHeight:=R;
end;
在預覽或打印前先調用PrintSerial即可。

FastReport套打 和連續打印