FastReport 打印模版页(TFrxReportpage)复制
遇到一个奇葩的需求。一般情况下我们打印单据,用FastReport设置打印格式,也就是就设一个模版页而己,就是一种单据格式。如果打印的单据数据多了就自动打印多页了,他们的格式是一样的。也就是读同一个模版页。
现的需求是,如果打印N页内容。每一页的格式除了表体外是一样的(也可能部份不同)。而表体取自不同的数据集(也就是读取不同的FDQuery),需要设置不同的表体格式(表体列的数量,列的名称)。
在各大论坛中找不到现成解决方案。经网友提示,FastReport的打印模版设置好了其实就是一个XML文件。所以我们只需要读取这个XML,然后取出Page部份,复制成N份,根据需求修改不同部份的内容,然后再写入这个打印模版就可以了。开发中发现Delphi里读取XML文件的控件是不少,但是都有或多或少的问题,导制不适用于这个方案,最终我选择了FastReport里自带的FrxXML。功能虽少,但是够用了。
以下分享的是Page页的复制的实现代码,修改内容部份根据实际需求自行编写。至于如何修改,可以参照以下代码。
与网友的交流中,有网友不明白我的需求,最终说我语文小学没毕业,表达不清楚。其实我虽然语文小学有毕业,但也是离毕业的不远
unit frxHelp; interface uses frxClass,frxXML,System.SysUtils,Vcl.Dialogs;
type
TChangeProp=reference to procedure (aXML:TfrxXMLItem); ///*******************根据FastReport设置好的打印模版(ReportPage)生成多页
///
//procedure TForm1.FormCreate(Sender: TObject);
//
//const
// frxFile='G:\delphi\delphi\企业通ERP\DOERP\BIN\fr3\销售明细打印.fr3';
//var
// cStream:TStream;
// I:integer;
// frXML:TfrxXMLDocument;
// frXItem:TfrxXMLItem;
// fdoprop:TChangeProp;
//begin
// I:=0;
// fdoprop:= procedure (aXML:TfrxXMLItem)
// begin
// if aXML.PropExists('DataSet') then
// ShowMessage(aXML.Prop['DataSet']);
// end;
// IF GetFrxpageTemple(frxFile,frXML,frXItem) then
// IF CopyfrxPage(frXML,frXItem,I,'Page3',fdoProp) then
// begin
// cStream:=TMemoryStream.Create;
// frXML.SaveToStream(cStream);
// cStream.Position:=0;
// frxReport1.LoadFromStream(cStream);
// frxReport1.DesignReport();
// end;
//end;
procedure changeProp(aXML:TfrxXMLItem;iXML:Integer;Prop:TChangeProp=nil);
procedure CopyXML(S,D:TfrxXMLItem);
function CopyfrxPage(fXMLDoc:TfrxXMLDocument;sPageItem:TfrxXMLItem;ID:integer;cPname:String;Prop:TChangeProp=nil):Boolean;
function GetFrxpageTemple(cFile:String;out fXMLDoc:TfrxXMLDocument;out PageItem:TfrxXMLItem):Boolean;
implementation
procedure CopyXML(S,D:TfrxXMLItem);
var
I:Integer;
a,b:TfrxXMLItem;
begin
for I := to S.Count- do
begin
a:=s.Items[i];
b:=d.Add;
b.Name:=a.Name;
b.Text:=a.Text;
if a.Count> then
CopyXML(a,b); end;
end;
procedure changeProp(aXML:TfrxXMLItem;iXML:Integer;Prop:TChangeProp);
var
I:Integer;
fXML:TfrxXMLItem;
begin
for I := to aXML.Count- do
begin
fXML:=aXML.Items[I];
//Name属性是必须改的,为避免没有传入属性修改 方法(Prop:TChange)默认强制修改Name
if fXML.PropExists('Name') then
fXML.Prop['Name']:=fXML.Prop['Name']+'N'+iXML.toString;
if Assigned(Prop) then
Prop(aXML);
if fXML.Count> then
changeProp(fxML,iXML,Prop);
Inc(iXml);
end;
end;
function GetFrxpageTemple(cFile:String;out fXMLDoc:TfrxXMLDocument;out PageItem:TfrxXMLItem):Boolean;
begin
if Not FileExists(cFile) then
begin
ShowMessagefmt('打印模版[%s]不存在!!',[cFile]);
Exit(False);
end;
try
fXMLDoc:=TfrxXMLDocument.Create;
fXMLDoc.LoadFromFile(cFile);
PageItem:=TfrxXMLItem.Create;
PageItem:=fXMLDoc.Root.FindItem('TfrxReportPage');
except
on E:Exception do
begin
ShowMessage(E.Message);
Exit(false);
end;
end;
Result:=True;
end;
function CopyfrxPage(fXMLDoc:TfrxXMLDocument;sPageItem:TfrxXMLItem;ID:integer;cPname:String;Prop:TChangeProp):Boolean;
var
fFrxItem:TfrxXMLItem;
begin
try
fFrXItem:=fXMLDoc.Root.Add;
fFrxItem.Name:='TfrxReportPage';
fFrxItem.Text:=sPageItem.Text;
fFrxItem.Prop['Name']:=cPname;
CopyXML(spageItem,fFrxItem);
ChangeProp(fFrxItem,ID,Prop);
except
on E:Exception do
begin
ShowMessage(E.Message);
Exit(false);
end;
end;
result:=True;
end; end.
FastReport 打印模版页(TFrxReportpage)复制的更多相关文章
- LODOP批量打印多页模版进行维护
批量打印的时候,可以循环多任务,也可以循环多页,很多的时候也可以分页分任务,分组打印.如果是一个任务里的多页相同的模版,一个任务中会有很多打印项,这些打印项在每页中的位置是相同的,如果要调整,调整结果 ...
- SharePoint 创建模版页
[1]需要安装SharePoint Designer 最新版编辑工具 [2]我用的是SharePoint Server 2013 如果是Office 请匹配寻找 1.创建母版页面 打开右上角-网站设 ...
- 关于JavaScript打印去掉页眉页脚
因为这个问题,Google和百度都查了个遍,网上主要解决方案都是这一个代码: <script language="JavaScript"> var hkey_root, ...
- C# 打印多页tif
注意点: 1.计算image对象总页数 image.GetFrameCount(FrameDimension.Page); 2.初始化当前页,并获取指定页内容 image.SelectActiveFr ...
- IE浏览器打印的页眉页脚设置解决方法
首先说明问题: 默认情况下,通过IE的打印对话框,打印出来的内容都有页眉和页脚的. 查看ie的页面设置发现如右图中,页眉页脚 下面先说明&w&bPage&p of &P ...
- Excel设置excel打印每页都有表头标题
Excel设置excel打印每页都有表头标题
- 【转】C#使用PrintDocument打印 多页 打印预览
PrintDocument实例所有的订阅事件如下: 创建一个PrintDocument的实例.如下: System.Drawing.Printing.PrintDocument docToPrint ...
- C#使用PrintDocument打印 多页 打印预览
PrintDocument实例所有的订阅事件如下: 创建一个PrintDocument的实例.如下: System.Drawing.Printing.PrintDocument docToPrint ...
- [办公应用]如何打印较小边距的PPT讲义(或者每页打印16页)
关键词:打印 PPT 讲义 4张 边距 今天同事问我如何打印PowerPoint的讲义.她自己使用PowerPoint打印讲义,设置每页4张,但是页边距太大:觉得浪费很大. 经过网上查阅后,现将方 ...
随机推荐
- 检查mysql是否运行
netstat -tunple|grep mysql
- Python之路番外(第二篇):PYTHON基本数据类型和小知识点
一.基础小知识点 1.如果一行代码过长,可以用续行符 \换行书写 例子 if (signal == "red") and \ (car == "moving") ...
- IO之4种字节流拷贝文件方式对比
public class CopyMp4Demo { public static void main(String[] args) throws IOException { long start = ...
- import this
import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than ...
- PID控制算法的C语音实现
http://wenku.baidu.com/link?url=_u7LmA1-gzG5H8DzFYsrbttaLdvhlHVn5L54pgxgUiyyJK_eWtX0LbS7d0SEbHtHzAoK ...
- tensorflow下识别手写数字基于MLP网络
# coding: utf-8 # In[1]: import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_da ...
- Python sys.argv[] 的用法
sys.argv变量是一个list, 执行 python abc.py a b c 时, sys.argv[0]为 abc.py sys.argv[1]为 a sys.argv[2]为 b sys.a ...
- 2019.01.22 poj2926 Requirements(状态压缩)
传送门 题意:给一堆五维的点,求最远点对. 思路:跟CF1093G差不多 考虑把正负号状压成一个323232以内的数,然后对于每一类分别求最大最小值再做差更新答案即可. 代码: #include< ...
- 2018.11.08 UVA11021 Tribles(概率dp)
传送门 概率dpdpdp简单题. 设f[i]f[i]f[i]表示第iii天的答案. 然后枚举ppp数组从fi−1f_{i-1}fi−1转移过来就行了. 显然有fi=∑j=0npj∗(fi−1)jf_ ...
- top k问题
1.top k问题 在海量数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最高的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题.例如,在搜索引擎中,统计搜索最 ...