fastreport 连续打印问题

chenwenwen1 2009-09-15 11:14:35
我希望实现的效果类似Pos机那样,打到哪里就停到哪里。连续打印中间也没有间隔。打印机使用的是连续针式打印机。

我使用的是fastreport4.0 尝试在报表内写代码(Report.Page1.PaperHeight:=100)但没有起作用。想使用ChangePaper函数提示没有定义。

网上找到部分相关代码:

很多人认为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即可。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/SmallHand/archive/2009/01/07/3727669.aspx

这部分代码非常不稳定,经常报错。另外这部分代码好像只能放到程序中,而不能放置报表内部。我想能在报表中填写代码实现这个功能。

望高手指导!!
...全文
601 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiu_pro 2012-02-05
  • 打赏
  • 举报
回复
看看啦怎么样
DQHYATOU 2011-07-03
  • 打赏
  • 举报
回复
我在我电脑上测试过各版本的都有这问题,我就把他的DEO改城循环无预览打印循环下多点几次打印就报错了
DQHYATOU 2011-07-03
  • 打赏
  • 举报
回复
FASTREPORT 连续打印的话经验意外报错,就是同一个打印按钮反复按,无预览的那种或者有预览的那中开关开关如此反复...搞几十次肯定报错,一报错循环打印的话就会重新开始计算循环,有时候是那哥小提示框 正在生成、打印第几页的那个 提示框不消失点上面的取消也没用一定要退出程序才行。
不知道大家有没碰到过。
如下用TRY捕捉到的错误:
System.NullReferenceException: 未将对象引用设置到对象的实例。
在 FastReport.ReportSettings.4NZl7krdB(Report )
在 FastReport.Engine.ReportEngine.bYEbNkE43(Boolean , Boolean , ReportPage )
在 FastReport.Engine.ReportEngine.kZyL8aggu(Boolean , Boolean )
在 FastReport.Report.Prepare(Boolean append)
在 FastReport.Report.Prepare()
在 FastReport.Report.Print()
peacehuang 2011-06-23
  • 打赏
  • 举报
回复
我也有此问题!
火龙岛主 2009-09-15
  • 打赏
  • 举报
回复
抱歉,这段代码是我摘录的,准备以后用,没有经过测试。
你说,报错,都报什么错误?
chenwenwen1 2009-09-15
  • 打赏
  • 举报
回复
这个正是我需要的。
问题已解决。

还以为很复杂呢,亏了!
rcaicc 2009-09-15
  • 打赏
  • 举报
回复
页面设置中有EndlessHeight属性,设置为TRUE后就用链式纸,也就是支持即打即停。 !!!
chenwenwen1 2009-09-15
  • 打赏
  • 举报
回复
procedure PrintSerial(Frx:TFrxReport;SequencePage:Byte=0);
这个函数第二个参数如果是0
跟踪:R1:=P.TopMargin+P.BottomMargin;词句时P.TopMargin值为:3.6854775808e-528另一个值也类似这样的数字。即便偶尔这句可以通过后面的P.PaperHeight:=R; 也会报错。跟踪显示P.PaperHeight这个值也类似前面的值。
如果函数第二个参数为1时
R:=Pelstomm(Frx.Engine.TotalPages*Frx.Engine.PageHeight-
Frx.Engine.FreeSpace)+R1;这里的FreeSpace跟踪不到数据,最终得到R值夜类似前面显示的内容,最终计算高度经常为负数。并且很多地方都会偶尔报错

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧