【www.5929.com】法斯特Report难题整治

转自:

【转】FastReport经验,fastreport经验

转自:

1.FastReport中一经访谈报表中的对象?
能够动用FindObject方法。
TfrxMemoView(frxReport1.FindObject(’memo1′)).Text:=’FastReport’;

2.法斯特Report中什么运用上下标?
安装frxmemoview.AllowHTMLTags := True;在Text输入如下
上标:mm<sup>2</sup>
下表:k<sub>6</sub>
就这样类推,你还足以运用别的HTML标志。

3.法斯特Report中怎样打字与印刷总页数?
安装一回报表后参预引号Nene容 “第[Page#]页 共[TotalPages#]页”

4.法斯特Report中如何动态插手变量及变量组?
创建变量组名
frxreport1.Variables.Add.Name:=’ ‘+变量组名;
创建变量名
frxreport1.Variables.AddVariable(’组名,如若为不存的组或空,则为默许组,这里没有要求

空格’,变量名,变量开头值);
举个例子说要树立变量组Yuan,贰个变量Yuan1,Yuan2,则为
frxreport1.Variables.Add.Name:=’ Yuan’注意眼下是空格
frxreport1.Variables.AddVariable(’Yuan’,Yuan1,初始值)
frxreport1.Variables.AddVariable(’Yuan’,Yuan2,初始值)

5.法斯特Report中怎么样走入自定义函数?
法斯特report能够本身步入须求的函数,来落到实处特定的效用。进程就是:
1)增加函数到报表中。
frxreport1.AddFunction(’完整的函数注解’);
如有八个自定义函数,为GetName(Old:String):String;这些函数通过数据集的三个字段,获得另

贰个重回值。
则语句为:frxreport1.AddFunction(’Function
GetName(Old:String):String;’);
2)脚本中采纳函数。
在本子中或报表中使用自定义函数,就好像使用别的法斯特report内置函数同样。
3)程序中管理函数。
利用函数是因而frxreport1的OnUserFunction函数来达成的。
OnUserFunction的证明如下:Function(const MethodName: String;var Params:
Variant):

Variant;
举个例子上面的函数,首先要有贰个函数,那么些函数是GetName的兑现部分。如有一个在程序中贯彻的

函数。
function
RealGetName(Old:String):String;那几个函数名是冷淡的,也得以是GetName。
在OnUserFunction的事件管理中有如下代码就可以造成自定义函数在表格中的使用。
if CompareText(MethodName,’GetName’)=0 then
Result:=RealGetName(VarToStr(Params[0]));
自家一般都以利用CompareText来相比较函数名,因为自己发掘三个本子的法斯特report,二个是

MethodName全体自行产生了小写,三个是漫天自动形成了大写,所以索性用CompareText来相比较,

自然不会出错。

假如有八个参数,则相继传递Params[0],Params[1]就能够,要保持顺序一致。
这里要留意一点,假使参数为指针,则不可能间接动用Pointer(Integer(Params[0]))。因为其实传

递过来的是指针的大背头值,能够使用Pointer(StrToInt(VarToStr(Params[【www.5929.com】法斯特Report难题整治。0])))。

6.法斯特Report中怎样共用TFrxreport及TfrxDBDataSet?
三个前后相继中,不管多么大的次第,只要打字与印刷或预览时是方式的,则完全能够共用一个TFrxreport

变量及多少个TfrxDBDataSet。只不过,要小心做到四个报表程序的步子,首借使上边几步
1)清除报表,获得三个簇新的表格内容。
Frxreport1.clear。
2)设置要使用的TfrxDBDataSet的别称,纵然无需能够大致这一步,但一般最佳分歧的表格用不

同的别称。
专一这一步要在加载报表文件在此之前,因为相似设计报表文件时曾经包罗了外号音信。
frxDBDataSet1.UserName:=别名;
3)加载报表或动态创建多个TfrxReportPage。
Frxreport1.LoadFromFile(报表文件的欧洲经济共同体文件名);
4)关联TfrxDBDataSet与TDataset,并设置要利用什么TfrxDBDataSet。
Frxreport1.DataSets.Clear;//先清除原本的数据集
frxDBDataSet1.DataSet:=dataset1;//关联法斯特report的零部件与TDataset数据集。
Frxreport1.DataSets.Add(frxDBDataSet1);//加载关联好的TfrxDBDataSet到报表中。
因而这几步后,就可以像单独使用八个Tfrxreport同样接纳共用的表格组件了

7.FastReport中如何利用脚本,脚本中采用变量?
洋洋时候,我们盼望把对报表的操纵放到报表的本子中,常常自个儿那样做有一个原因:
1)能够依照字段内容的浮动而采用差异的安装,因为假若想在前后相继中贯彻那样效果,就只能用

自定义函数,函数的实现要放到程序中,函数或许要求传递比比较多参数,效用低下。
2)把不一样报表的决定放到脚本中,能够达成报表的模块化,程序只是轻便的设置数据集的关联,

并加载硬盘上的表格文件,区别报表的两样完毕格局,显示情势,均放置报表文件中,程序简洁

,易维护,易升级。
本来,这样的欠缺就是程序中加载报表时的多少集外号必需与规划报表时的别称一致。
剧本的施用与平常程序的运用并未太多的分别,正是像正规的主次那样援引控件的名称就能够。
但只顾对变量的行使,须求把变量名或表明式用<>括起来。

落实打字与印刷分组的页数。基本的规律就是:
1)必需采用三回报表,因为FS算总页数就是索要壹次报表的。
2)在率先遍报表中,在GroupBand打印前,动态的树立整数型数组变量,用以保存上三个分组的

总页数。
3)在最后贰回报表时,须要出示分组页数的Tfrxmemoview取得数组中的数据,但末了八个分组

不会有总量,能够由此总页数减去GroupBand事件中保存的页数来赢得。
4)代码中拍卖了一页多组,及一组多页打印分组头的事态。能够看看那几个新鲜管理的代码表明


5)作者特目的在于分组尾及页脚都用了Tfrxmemoview来彰显那一个多少,表明在分裂情况下的突显。

8.法斯特Report中哪些在剧本中依照字段名转移Tfrxmemoview的内容?
假若有数据表“顾客”,字段ID为客商标志,Name为客户名,打字与印刷时讲求,借使客商名称为空,则

打字与印刷“无客户名”,不然打字与印刷出“客户名:实际的客户”,则足以在ID的Tfrxmemoview控件的

OnAfterData事件中写如下脚本。
if <frxDBDataSet1.”Name”>=” then
Memo2.Text:=’无客户名’
else
Memo2.Text:=’用户名:[frxDBDataSet1.”Name”]‘
Memo2是停放客户名称数据的Tfrxmemoview控件。
这里注意,要在剧本中做客变量供给把变量用<>满含起来。

9.法斯特Report中什么动态调解中度?
自作者时常使用下边包车型地铁多少个函数来促成Band及Tfrxmemoview中度的动态调度,供给小心的是:下边包车型客车

函数只可以调治二个Band中多行的最后一行,如若独有一行(许多情况下应当是那样)就无所谓了

,而且那是在拉长率已经定位的前提下。在想要调度中度的Band的OnBeforePrint事件中写

SetMemo(Sender);,代码如下,粘贴到代码页中就足以使用。

上边包车型地铁代码也足以衍生和变化一些,实现动态宽度等。小编多处都认清了Tag是或不是为7635,因为本人时时索要

单独调用个中的某些函数。

//7635为保留数字,表示不作任何调解,通常用在多行的顶上部分
function Biger(Old:Extended):Integer;
begin
Result:=Trunc(Old);
if Frac(Old)>0 then
Result:=Result+1;
end;

procedure JustHeight(Sender:TfrxComponent);
var
RealHeight:Integer;
begin
RealHeight:=Biger(TFrxMemoView(Sender).CalcHeight+TFrxMemoView(Sender).Top);
if Biger(TfrxBand(Sender.Parent).Height)<RealHeight then
begin
//若MEMO的惊人小于BAND但计算高度当先BAND,则在调动BAND的函数中就能被调度
TfrxBand(Sender.Parent).Height:=Biger(RealHeight);
JustBandHeight(Sender.Parent);
end
else
TfrxMemoView(Sender).Height:=TfrxBand(Sender.Parent).Height
-TfrxMemoView(Sender).Top;
end;

procedure JustBandHeight(Sender:TfrxComponent);
var
I:Integer;
begin
for I:=0 to Sender.Objects.Count-1 do
if TObject(Sender.Objects.Items[I]) is TFrxMemoView then
if TFrxMemoView(Sender.Objects.Items[I]).Tag=7635 then Continue
else
//如果小才转移,假使大则无法改换
if Biger(TfrxMemoView(Sender.Objects.Items[I]).Height+
TfrxMemoView(Sender.Objects.Items[I]).Top)<>Biger(TfrxBand(Sender).Height)
then
TfrxMemoView(Sender.Objects.Items[I]).Height:=
Biger(TfrxBand(Sender).Height-TfrxMemoView(Sender.Objects.Items[I]).Top);
end;

procedure JustMemo(Sender:TfrxComponent);
begin
if not Engine.FinalPass then Exit;
if Sender.Tag<>7635 then
JustHeight(Sender);
end;

procedure SetMemo(Sender:TfrxComponent);
var
I:Integer;
begin
for I:=0 to Sender.Objects.Count-1 do
if TObject(Sender.Objects.Items[I]) is TFrxMemoView then
if TfrxMemoView(Sender.Objects.Items[I]).Tag<>7635 then
TfrxMemoView(Sender.Objects.Items[I]).OnAfterData:=’JustMemo’;
end;

10.法斯特Report中如何完结套打?
纸张是接连的带锯齿的早就印刷好的,类似于通讯公司小票这里设计的是顾客出卖记录。
客商有四个必要:
1、因为打字与印刷纸张是印刷的,明细记录只有8行,所以,假若条分缕析记录要是不到8行,就将商号名称

、出卖记录打字与印刷在上头,下一个商厦的消息打字与印刷在下一页,而不可能接在该页上(呵呵,是啊,如

果接在协同,那印刷单就错失意义了)
2、假若出售记录超过8行,则从第9行最先的行销记录打印在下一页(所谓下一页,其实正是锯齿

划分的下一*,称呼“下一份”比较妥切?),况兼抬头(也便是信用合作社名称)也要打上(假设不打

印抬头,撕下了后,或许弄混淆了,不明白这一页是哪个集团的)
难点陈诉规范说法是还是不是相应叫“打字与印刷固定行”、“强制换页”?

回答:每页打字与印刷抬头的标题,正是把带有公司名称的Band每页重复打字与印刷就可以。属性中有二个的。

勾选就行了。
关于固定行,实际上设计套打时,页面大小都以牢固的,每一行的高度也都是原则性的,页眉与页

脚也是稳固的,那样设计出来的报表可打字与印刷的行数自然就是你须求的
8行了。根本无需如何强

制换页。因为依照纸张会自动换页的。你要做的正是统一筹算好纸张尽寸、页面布局,就得了,套打

是一种最简便的打字与印刷,不用想的太复杂。

11.法斯特Report中怎么着落到实处三番五次打字与印刷?
多四人感觉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就能够。

12.怎么样在程序中内定打印机名称?
frxReport1.Report.PrintOptions.Printer := ‘打字与印刷机名称’;

13.怎样行使打印机直接打字与印刷?
implementation
uses Printers;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Printer.PrinterIndex :=
0;{互连网打印机也是要设置在您本地的操作系统中的,直接使用各类

试试吧}
Printers.Printer.SetPrinter(’HP1020′,’HP1020′,’LPT1′,0);{打字与印刷机名字,驱动,端口等,

自己检查,小编是用编造打字与印刷机测验的}

Printers.Printer.BeginDoc;
Printers.Printer.Canvas.TextOut(10,10,’打字与印刷这一行字’);
Printers.Printer.EndDoc;
end;

14.怎么样打字与印刷空白处?
在打字与印刷表格的Band处的OnBeforePrint事件中增多代码:
while FreeSpace > 20 do
ShowBand(Child1)

15.什么样打字与印刷钦点行数后换页?
在master band中OnBeforePrint事件中写代码:
var
vLineCount: integer;
begin
vLineCount := vLineCount + 1;
if vLineCount = 10 then
begin
vLineCount := 0;
NewPage;
end;
end;

16.fastreport中哪些把多少展现为百分比
DisplayFormat属性,当中的Kind你设置成fkNumeric,FormatStr
[<frxDBDataset1.”sjl”>*100 #n%2.2f]%”。

17.法斯特Report什么打字与印刷表格式的空行?
var
PageLine: integer;       //在現在頁列印到第幾行
Page马克斯Row: integer=15;  //設定每頁列數
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
PageLine := <Line> mod PageMaxRow;
if (PageLine = 1) and (<line> > 1) then
Engine.newpage;
child1.visible := False;
end;

//Footer1中度設為0
procedure Footer1OnBeforePrint(Sender: TfrxComponent);

var
i: integer;
begin
i := iif(PageLine=0, PageMaxRow, PageLine);
child1.visible := True;
while i < PageMaxRow do
begin
i := i + 1;
Engine.ShowBand(Child1);  //印空白表格
end;
child1.visible := False;
end;
begin
end.

========================================================================
中期版本

—————- 使用自定义函数 —————————————-

Q: 小编如何增多笔者的自定义函数?
A: 使用 TfrReport.OnUserFunction 事件. 这里有一个简短的例证:

procedure TForm1.frReport1UserFunction(const Name: String;
p1, p2, p3: Variant; var val: Variant);
begin
if AnsiCompareText(’SUMTOSTR’, Name) = 0 then
val := My_Convertion_Routine(frParser.Calc(p1));
end;

下一场,你就能够在表格(任何表明式或脚本)的其他地点使用 SumToStr 函数了。

Q:
不过它可是能职业在三个TfrReport组件中。可自己想在别的省方(在享有的TfrReport组件中)

选择的自家的自定义函数?
A: 使 OnUserFunction event
句柄作为全部组件的公用句柄。就算你不可能做到那或多或少,你要求创

建函数库:

type
TMyFunctionLibrary = class(TfrFunctionLibrary)
public
constructor Create; override;
procedure DoFunction(Fno: Integer; p1, p2, p3: Variant;
var val: Variant); override;
end;

constructor TMyFunctionLibrary.Create;
begin
inherited Create;
with List do
begin
Add(’DATETOSTR’);
Add(’SUMTOSTR’);
end;
end;

procedure TMyFunctionLibrary.DoFunction(Fno: Integer; p1, p2, p3:
Variant;
var val: Variant);
begin
val := 0;
case Fno of
0: val := My_DateConvertion_Routine(frParser.Calc(p1));
1: val := My_SumConvertion_Routine(frParser.Calc(p1));
end;
end;

要注册函数库,调用
frRegisterFunctionLibrary(TMyFunctionLibrary);
要卸载函数库,调用
frUnRegisterFunctionLibrary(TMyFunctionLibrary);

Q: 作者什么将本身的函数增添到函数列表中 (用表明式生成器)?
A: 使用 frAddFunctionDesc 过程 (在FR_Class 单元中):

frAddFunctionDesc(FuncLib, ‘SUMTOSTR’, ‘My functions’,
‘SUMTOSTR(<Number>)/Converts number to its verbal presentation.’);

留意: “/” 符号是必需的! 它从它的叙说中分隔函数语法。
FuncLib 被声称为您自个儿的函数库 (固然你不应用函数库能够将其安装为nil).
当函数库未注册

时,全数它的函数将机关从函数列表中除去。

—————- 使用变量 ————————————-

Q: 笔者怎么着编制程序达成填充变量列表(在数额词典中)?

A: 数据词典中的全数变量及分类都被积攒在 TfrReport.Dictionary.Variables
中.

with frReport1.Dictionary do
begin
// 创设分类(名称用空白)
Variables[‘ New category’] := ‘ ‘;
// 创立变量
Variables[‘New Variable’] := ‘CustomerData.Customers.”CustNo”‘;
Variables[‘Another Variable’] := ‘Page#’;
end;

Q: 小编定义了字符串变量:

with frReport1.Dictionary do
Variables[‘Month’] := ‘March’;

唯独当本人运转报表是,出现了不当,为啥?

A:
因为 法斯特Report 假定数据词典中的字符串变量值是叁个表达式,它需求解析、总计它。
能够行使别的的法子:

with frReport1.Dictionary do
Variables[‘Month’] := ”” +’March’ + ””;

依旧, 使用 frVariables 来传输固定数据到报表。

Q: 小编不想在多少词典中显得有个别数据集?

A: 使用 TfrReport.Dictionary.DisabledDatasets:

with frReport1.Dictionary do
begin
// 关闭该数据集
DisabledDatasets.Add(’CustomerData.Bio’);
// 或许, 关闭全数数据模块/窗体
DisabledDatasets.Add(’CustomerData*’);
end;

Q: 小编怎么样将数据传送到报表?

A: 有几个章程可以兑现它. 第一是使用全局对象 frVariables (在 F奥德赛_Class
单元中被定义):

frVariables[‘My variable’] := 10;

这段代码创造了八个称谓为“My variable”,值为 10
的变量。这是最棒的传输固定数据的表格

的方法。

第三种格局是行使 TfrReport.OnGetValue 事件.
那能够使用那些法子来传送动态数据、记录等

procedure TForm1.frReport1GetValue(ParName: String; var ParValue:
Variant);
begin
if ParName = ‘MyField’ then
ParValue := Table1MyField.Value;
end;

说起底, 第二种格局是因此编制程序在数码词典中定义变量(能够参照他事他说加以考察以前的主题材料):

with frReport1.Dictionary do
begin
Variables[‘MyVariable’] := ‘CustomerData.Customers.”CustNo”‘;
Variables[‘Another Variable’] := ’10’;
end;

Q: 笔者能在报表和顺序间传送数据吗?
A: 使用 frVariables 对象. 若是您在报表的其余对象的脚本中写入以下代码:

MyVariable := 10

那么,在你的次第中,你能够动用以下代码来获得 MyVariable 的值:
v := frVariables[‘MyVariable’];

—————- 脚本 (FastReport Pascal) ———————————

Q: Band 中是否足以选拔脚本?

A: 当然. 选择 band ,然后按 Ctrl+Enter 或在目的浏览器中挑选
“OnBeforePrint” 属性。

Q: 报表页中是或不是足以接纳脚本?

A: 当然. 选取页 (在空白处单击) ,然后在对象浏览器中选用 “OnBeforePrint”
属性。假如该

页是多少个对话框窗体,那么这一个天性正是 “OnActivate”.

Q: 小编有四个对象: Memo1 和 Memo2. 笔者是不是在 Memo1 的脚本中调用 Memo2
的质量和办法?

A: 当然, 举个例子,你能够这么做: 对象名.属性名.

Q: 在剧本中,我得以接纳对象的什么属性?

A: 大致全部你能在对象浏览器中来看的质量。举个例子,能够运用 Font.Name,
Font.Size等来存取

字体属性。

—————- 其余难题 ——————————————–

Q: 怎么着改动多页报表中某一页的次第?

A: 拖动页标签到指标地方。

Q: 笔者想查看全部的字段及变量,笔者想在表格中运用列表来完毕它?

A: 设置 TfrReport.MixVariablesAndDBFields :=
True.以往,全部的数码字段及变量可在“插

入数据字段”对话框中可存取了。

Q: 小编不想显示导入选项对话框?

A:
在导入组件(比如,TfrTextExport)中安装有着要求的选项,然后经过设置ShowDialog属性为

False来关闭此对话框。

Q: 为何 TotalPages 变量不起成效? 它连接回到 0.

A: 在您的表格中设置 Two-pass 选项.
要设置它,你须要在表格设计器的“文件”菜单中,展开

“报表选项”对话框。

Q:
作者用BLOB字段来储存小编的报表。当本人运维报表设计器时,它显得小编的表格未命名?

A: 在运行报表设计器前,那样做:

frReport1.FileName := ‘Name of my report’;

Q: 笔者想在重新定义报表设计器中的“张开”及“保存”开关的效力?

A: 查看 TfrDesigner 组件. 它有几个供给的事件: OnLoadReport 和
OnSaveReport. 这里有一小段代码例子:

procedure TForm1.frDesigner1LoadReport(Report: TfrReport;
var ReportName: String; var Opened: Boolean);
begin
with MyOpenDialog do
begin
Opened := ShowModal = mrOk;
if Opened then
begin
Report.LoadFromBlobField(…);
ReportName := …;
end;
end;
end;

procedure TForm1.frDesigner1SaveReport(Report: TfrReport;
var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
begin
if SaveAs then
with MySaveDialog do
begin
Saved := ShowModal = mrOk;
if Saved then
begin
Report.SaveToBlobField(…);
ReportName := …;
end;
end
else
Report.SaveToBlobField(…);
end;

Q: 在 QCRUISER 中, 笔者得以写这么的代码: QLX570Label1.Caption := ’Some text’.
小编得以用F法拉利488那样做

吗?

A: FCR-V 对象实际不是一个零部件 (那并不像 QENVISION, RB). 但运用 TfrReport.FindObject
方法能够通过

对象名称找到该目的。

var
t: TfrMemoView;
begin
t := TfrMemoView(frReport1.FindObject(’Memo1’));
if t <> nil then
t.Memo.Text := ’FastReport’;
end;

Q: 我想在顾客预览(TfrPreview组件)中自定义热键?

A: 那一个组件有个窗口: Tform 属性. 将自定义句柄内定到 Window.OnKeyDown
属性.

Q: Fast Report 2.4 不可能装载 FreeReport 2.21 文件?

A:
那仅必要利用16进制数改造报表文件的首先字节,然后在源代码中期维修改上边包车型大巴有的。在那一个修

改之后, 装载报表并保存它. 最终,再次回到到源代码处.

FR_Class:

function ReadString(Stream: Tstream): String;
begin
{ if frVersion >= 23 then}
Result := frReadString(Stream) {else
Result := frReadString22(Stream);}
end;

procedure ReadMemo(Stream: Tstream; Memo: Tstrings);
begin
{ if frVersion >= 23 then}
frReadMemo(Stream, Memo){ else
frReadMemo22(Stream, Memo);}
end;

FR_Utils:

procedure frReadMemo(Stream: Tstream; l: Tstrings);
var
s: String;
b: Byte;
n: Word;
begin
l.Clear;
l.Text := frReadString(Stream); exit;
Stream.Read(n, 2);
if n > 0 then
repeat
Stream.Read(n, 2);
SetLength(s, n);
Stream.Read(s[1], n);
l.Add(s);
Stream.Read(b, 1);
until b = 0
else
Stream.Read(b, 1);
end;

function frReadString(Stream: Tstream): String;
var
s: String;
n: Integer;
b: Byte;
begin
Stream.Read(n, 4);
SetLength(s, n);
Stream.Read(s[1], n);
if (n > 0) and (s[n] = #$0A) then
SetLength(s, n – 2);
// Stream.Read(b, 1);
Result := s;
end;

Q: 怎么样不在打字与印刷预览中打字与印刷表格?
A: 这里有一段代码:

frReport1.PrepareReport;
frReport1.PrintPreparedReport(”, 1, True, frAll);

frReport1.PrintPreparedReportDlg;

Q:
笔者想在报表中旋转图片。难点是那张图纸是由自个儿的应用程序生成的。是不是有方法能够在打字与印刷前

将那幅图片装载到报表中?

A: 使用 TfrReport.OnBeforePrint 事件:

if View.Name = ‘Picture1′ then
TfrPictureView(View).Picture.LoadFromFile(…) 或
.Assign 或
.你所想要做的其他事情

法斯特Report 套打全计谋
//以规划套打行为6行为例进行表达
一、定义变量
TaoDa   0 是套打 1 不套打
cPage   系统变量  页#
caPage  系统变量  总页数

二、TfrPage.OnBeforePrint事件中写
{
if TaoDa = ‘0′ then
begin
title.visible:=false;   //不用打字与印刷的设置Visible为False;
danweiv.frametyp := 0;  //只打印数据的不必要打字与印刷边框的安装 frametyp 为
0;

end;
i := 0 ;   //定义三个变量并拓宽伊始化。
}
二、主项数据.OnBeforePrint事件中写
{
if TaoDa = ‘0′ then
begin
i := i + 1;
bm.memo := i;
if (i > 5 ) then
if ((i-1) mod 6 ) = 0 then newpage;
end;
}

三、主项脚.OnBeforePrint事件中写
{
j := i mod 6;
if j <> 0 then
begin
for k := j to 5 do
begin
ShowBand(Child1);   //Child1是子的名称 彰显空白行
end;
end;
}
四、栏目脚.OnBeforePrint事件中写
{
if cpage <> capage then
begin
shi.memo := ”;  //十
bai.memo := ”;  //百
qian.memo := ”; //千
wan.memeo := ”; //万
end
else begin
shi.memo := v1;
bai.memo := v2;
qian.memo := v3;
wan.memo := v4;
end;
}

这段代码是用来决定在有多页景况下,在终极一页上呈现总金额。
在那之中:v1,v2,v3,v4 是自定义变量。

报表结构构成:
栏目头           //画报表的标头
主项数据         //显示的数量,会与数据源举办绑定
主项脚      //什么也不用放,只用来决定  visible := false;
子               //画出空白行展现的组件
栏目脚           //呈现总的金额、数量
页脚             //显示页数

调用方法:
frReportA.LoadFromFile(s);   s 是文件
frReportA.Dictionary.Variables[‘taoda’]:=’1′;
张开询问

打印:
frReportA.PrepareReport;
frreportA.PrintPreparedReport(”,1,true,frall);

预览:
frReportA.ShowReport;

转自:

1.法斯特Report中假使访谈报表中的对象?
能够应用FindObject方法。
TfrxMemoView(frxReport1.FindObject(’memo1′)).Text:=’FastReport’;

FastReport打印CxGrid数据

用惯了法斯特Report,就不愿意再利用其余的Print Component。用法斯特Report打印CxGrid
Filter后的数据,网络直接尚未很好的措施和例程。看到有将CxGrid的Fileter
Text收取后再赋给DataSet的证实,未有具体去考试,太难为。如此资深的Component料定有化解此难题的办法。于是明日到Dev
Express俄语站点去浏览了一番,在该站上搜求了一晃,居然出来N多此难点的提问者,看了多少个那类的主题素材后,终于消除了。
消除此主题素材能够选择以下格局:
1、将View的datacontroller.filter.autodatasetfilter属性设为True。
此格局须求DataSet帮助才具安装。
2、是在FastReport的frDBDataSet的CheckEof 伊夫nt里写如下代码:
EOF := frUserDataset1.RecNo >= Grid.ViewData.RecordCount;
在frReport的GetValue Event里写代码:
if ParName=’Field1′ then
ParValue := Grid.ViewData.Records[frDataset1.RecNo]【www.5929.com】法斯特Report难题整治。.Values[2]);
此代码也可这么写:
ParValue
:=Grid.ViewData.Records[frDataset1.RecNo].Values[View.GetColumnByFieldName(ParName).Index]);

ReportMachine
1.什么利用代码钦命打字与印刷机?
RMReport1.LoadFromFile(’Untitled.rmf’);
rmreport1.PrinterName:=’\192.168.10.1HP LaserJet 1022′;

frxReport1.Clear; 
frxReport1.LoadFromFile(ExtractFilePath(Paramstr(0))+'report\条码.fr3');
frxReport1.PrepareReport;
frxReport1.PrintOptions.ShowDialog := False; //不显示打印机选择框
frxReport1.PrintOptions.Printer := 'SC-5870 POS Printer';  //选择打印机名称
frxReport1.Print; //打印

 

转自:
1.法斯特Report中若是访谈报表中的对象? 能够选用…

1.FastReport中要是访谈报表中的对象?
能够采取FindObject方法。
TfrxMemoView(frxReport1.FindObject(’memo1′)).Text:=’FastReport’;

2.法斯特Report中哪些选择上下标?
设置frxmemoview.AllowHTMLTags := True;在Text输入如下
上标:mm<sup>2</sup>
下表:k<sub>6</sub>
以此类推,你仍是能够使用别的HTML标识。

2.FastReport中什么运用上下标?
安装frxmemoview.AllowHTMLTags := True;在Text输入如下
上标:mm<sup>2</sup>
下表:k<sub>6</sub>
就那样类推,你还足以行使别的HTML标志。

3.法斯特Report中怎么着打字与印刷总页数?
安装五次报表后加入引号Nene容 “第[Page#]页 共[TotalPages#]页”

3.FastReport中如何打字与印刷总页数?
设置一遍报表后插足引号内内容 “第[Page#]页 共[TotalPages#]页”

4.法斯特Report中哪些动态参加变量及变量组?
建设构造变量组名
frxreport1.Variables.Add.Name:=’ ‘+变量组名;
确立变量名
frxreport1.Variables.AddVariable(’组名,假诺为不存的组或空,则为暗中同意组,这里没有需求

4.FastReport中怎么着动态参加变量及变量组?
树立变量组名
frxreport1.Variables.Add.Name:=’ ‘+变量组名;
创制变量名
frxreport1.Variables.AddVariable(’组名,如若为不存的组或空,则为暗许组,这里无需

空格’,变量名,变量初叶值);
举例要树立变量组Yuan,一个变量Yuan1,Yuan2,则为
frxreport1.Variables.Add.Name:=’ Yuan’注意日前是空格
frxreport1.Variables.AddVariable(’Yuan’,Yuan1,初始值)
frxreport1.Variables.AddVariable(’Yuan’,Yuan2,初始值)

空格’,变量名,变量初步值);
诸如要成立变量组Yuan,二个变量Yuan1,Yuan2,则为
frxreport1.Variables.Add.Name:=’ Yuan’注意眼下是空格
frxreport1.Variables.AddVariable(’Yuan’,Yuan1,初始值)
frxreport1.Variables.AddVariable(’Yuan’,Yuan2,初始值)

5.法斯特Report中怎么样步向自定义函数?
法斯特report能够和煦插足要求的函数,来贯彻特定的作用。进程便是:
1)增多函数到报表中。
frxreport1.AddFunction(’完整的函数申明’);
如有叁个自定义函数,为GetName(Old:String):String;那些函数通过数据集的八个字段,获得另

5.FastReport中如何步向自定义函数?
Fastreport能够协调加盟须要的函数,来达成特定的机能。进度正是:
1)增加函数到报表中。
frxreport1.AddFunction(’完整的函数申明’);
如有八个自定义函数,为GetName(Old:String):String;那几个函数通过数据集的三个字段,获得另

三个重临值。
则语句为:frxreport1.AddFunction(’Function
GetName(Old:String):String;’);
2)脚本中运用函数。
在剧本中或报表中应用自定义函数,就好像使用另外法斯特report内置函数同样。
3)程序中管理函数。
选取函数是由此frxreport1的OnUserFunction函数来兑现的。
OnUserFunction的评释如下:Function(const MethodName: String;var Params:
Variant):

一个再次回到值。
则语句为:frxreport1.AddFunction(’Function
GetName(Old:String):String;’);
2)脚本中采纳函数。
在本子中或报表中选取自定义函数,就像是使用另外Fastreport置于函数同样。
3)程序中管理函数。
采用函数是通过frxreport1的OnUserFunction函数来贯彻的。
OnUserFunction的宣示如下:Function(const MethodName: String;var Params:
Variant):

Variant;
诸如上边的函数,首先要有贰个函数,这几个函数是GetName的贯彻部分。如有二个在先后中贯彻的

Variant;
比如上边的函数,首先要有三个函数,这些函数是GetName的落到实处部分。如有三个在程序中贯彻的

函数。
function
RealGetName(Old:String):String;这几个函数名是无所谓的,也足以是GetName。
在OnUserFunction的事件管理中有如下代码就能够成功自定义函数在表格中的使用。
if CompareText(MethodName,’GetName’)=0 then
Result:=RealGetName(VarToStr(Params[0]));
自己一般都以行使CompareText来相比函数名,因为本身意识贰个版本的Fastreport,叁个是

函数。
function
RealGetName(Old:String):String;那么些函数名是冷淡的,也得以是GetName。
在OnUserFunction的事件管理中有如下代码就能够造成自定义函数在表格中的使用。
if CompareText(MethodName,’GetName’)=0 then
Result:=RealGetName(VarToStr(Params[0]));
自身一般都以接纳CompareText来比较函数名,因为自个儿发觉一个版本的Fastreport,一个是

MethodName全部自动成为了小写,七个是全部电动成为了大写,所以干脆用CompareText来相比,

MethodName全部机关成为了小写,贰个是任何自行形成了大写,所以索性用CompareText来比较,

不容争辩不会出错。

一定不会出错。

假若有几个参数,则相继传递Params[0],Params[1]就可以,要保持顺序一致。
这里要留神一点,纵然参数为指针,则不能够直接利用Pointer(Integer(Params[0]))。因为实际传

一旦有七个参数,则相继传递Params[0],Params[1]就能够,要保持顺序一致。
这里要留神一点,若是参数为指针,则不可能直接运用Pointer(Integer(Params[0]))。因为实在传

递过来的是指针的平头值,能够运用Pointer(StrToInt(VarToStr(Params[0])))。

递过来的是指针的大背头值,能够利用Pointer(StrToInt(VarToStr(Params[0])))。

6.法斯特Report中什么共用TFrxreport及TfrxDBDataSet?
贰个程序中,不管多么大的主次,只要打字与印刷或预览时是方式的,则统统能够共用一个TFrxreport

6.FastReport中如何共用TFrxreport及TfrxDBDataSet?
二个顺序中,不管多么大的次第,只要打字与印刷或预览时是形式的,则一心能够共用叁个TFrxreport

变量及多少个TfrxDBDataSet。只然则,要小心变成一个表格程序的步调,重若是底下几步
1)清除报表,获得贰个全新的报表内容。
Frxreport1.clear。
2)设置要选择的TfrxDBDataSet的别名,倘使不需求能够归纳这一步,但貌似但是不相同的报表用不

变量及多少个TfrxDBDataSet。只然而,要注意做到五个表格程序的步骤,首若是底下几步
1)清除报表,获得贰个斩新的报表内容。
Frxreport1.clear。
2)设置要动用的TfrxDBDataSet的别称,假如不供给能够轻便这一步,但一般最棒分裂的表格用不

同的小名。
稳重这一步要在加载报表文件在此以前,因为相似设计报表文件时一度包罗了别称消息。
frxDBDataSet1.UserName:=别名;
3)加载报表或动态创建二个TfrxReportPage。
Frxreport1.LoadFromFile(报表文件的完整文件名);
4)关联TfrxDBDataSet与TDataset,并设置要使用什么TfrxDBDataSet。
Frxreport1.DataSets.Clear;//先清除原本的数据集
frxDBDataSet1.DataSet:=dataset1;//关联法斯特report的组件与TDataset数据集。
Frxreport1.DataSets.Add(frxDBDataSet1);//加载关联好的TfrxDBDataSet到报表中。
经过这几步后,就可以像单独选用两个Tfrxreport一样使用共用的表格组件了

同的小名。
留神这一步要在加载报表文件以前,因为相似设计报表文件时一度包涵了小名音讯。
frxDBDataSet1.UserName:=别名;
3)加载报表或动态创建三个TfrxReportPage。
Frxreport1.LoadFromFile(报表文件的全体文件名);
4)关联TfrxDBDataSet与TDataset,并设置要动用什么TfrxDBDataSet。
Frxreport1.DataSets.Clear;//先清除原本的数据集
frxDBDataSet1.DataSet:=dataset1;//关联Fastreport的机件与TDataset数据集。
Frxreport1.DataSets.Add(frxDBDataSet1);//加载关联好的TfrxDBDataSet到报表中。
因此这几步后,就能够像单独使用三个Tfrxreport同样选择共用的表格组件了

7.法斯特Report中怎样行使脚本,脚本中采用变量?
有的是时候,大家盼望把对报表的决定放到报表的本子中,日常本人这么做有二个原因:
1)能够依据字段内容的转变而选拔分化的安装,因为借使想在前后相继中贯彻那样效果,就只能用

7.FastReport中如何行使脚本,脚本中使用变量?
众多时候,大家期望把对报表的支配放到报表的本子中,日常自个儿这么做有一个原因:
1)能够基于字段内容的成形而使用区别的安装,因为假如想在前后相继中落实那样效果,就只可以用

自定义函数,函数的兑现要放到程序中,函数只怕必要传递相当多参数,功能低下。
2)把分化报表的主宰放到脚本中,能够完结报表的模块化,程序只是简单的设置数据集的关联,

自定义函数,函数的贯彻要放权程序中,函数恐怕必要传递比比较多参数,功用低下。
2)把差别报表的支配放到脚本中,能够完结报表的模块化,程序只是简短的设置数据集的关系,

并加载硬盘上的表格文件,分歧报表的分歧达成方式,突显格局,均放置报表文件中,程序简洁

并加载硬盘上的报表文件,不相同报表的例外达成方式,彰显格局,均放置报表文件中,程序简洁

,易维护,易升级。
自然,那样的后天不足就是程序中加载报表时的数量集小名必须与布置报表时的外号一致。
剧本的选拔与一般程序的选用并未有太多的分歧,就是像正规的程序那样援引控件的称号就可以。
但注意对变量的应用,要求把变量名或表达式用<>括起来。

,易维护,易升级。
道理当然是那样的,那样的弱项正是程序中加载报表时的多寡集外号必得与统一图谋报表时的别称一致。
剧本的使用与日常程序的应用并从未太多的分别,正是像正规的顺序那样引用控件的称呼就可以。
但只顾对变量的利用,需求把变量名或表明式用<>括起来。

兑现打字与印刷分组的页数。基本的原理便是:
1)必需采纳三遍报表,因为FS算总页数就是内需三次报表的。
2)在第二回报表中,在GroupBand打字与印刷前,动态的确立整数型数组变量,用以保存上八个分组的

贯彻打字与印刷分组的页数。基本的原理就是:
1)必需选择三次报表,因为FS算总页数正是必要壹次报表的。
2)在第三回报表中,在GroupBand打字与印刷前,动态的创设整数型数组变量,用以保存上三个分组的

总页数。
3)在终极贰回报表时,必要展示分组页数的Tfrxmemoview猎取数组中的数据,但最后三个分组

总页数。
3)在终极一回报表时,供给体现分组页数的Tfrxmemoview猎取数组中的数据,但最后多个分组

不会有总的数量,可以通过总页数减去GroupBand事件中保留的页数来博取。
4)代码中管理了一页多组,及一组多页打字与印刷分组头的图景。能够观望这么些新鲜管理的代码表明

不会有总的数量,能够经过总页数减去GroupBand事件中保存的页数来获得。
4)代码中拍卖了一页多组,及一组多页打字与印刷分组头的情形。能够看到那几个特种管理的代码表达


5)小编特地在分组尾及页脚都用了Tfrxmemoview来显示那么些数量,表达在区别情状下的显得。


5)作者非常在分组尾及页脚都用了Tfrxmemoview来呈现那一个数量,表达在不一致情形下的显得。

8.法斯特Report中怎么着在剧本中依照字段名改成Tfrxmemoview的剧情?
一经有数据表“客户”,字段ID为客商标志,Name为客商名,打字与印刷时讲求,假如客户名叫空,则

8.FastReport中怎么样在剧本中依据字段名改成Tfrxmemoview的剧情?
万一有数据表“客商”,字段ID为客户标志,Name为顾客名,打字与印刷时讲求,借使客户名称叫空,则

打字与印刷“无客户名”,不然打字与印刷出“客商名:实际的客商”,则能够在ID的Tfrxmemoview控件的

打字与印刷“无客户名”,不然打字与印刷出“客商名:实际的顾客”,则能够在ID的Tfrxmemoview控件的

OnAfterData事件中写如下脚本。
if <frxDBDataSet1.”Name”>=” then
Memo2.Text:=’无客商名’
else
Memo2.Text:=’用户名:[frxDBDataSet1.”Name”]‘
Memo2是停放客户名称数据的Tfrxmemoview控件。
此处注意,要在剧本中拜谒变量供给把变量用<>包蕴起来。

OnAfterData事件中写如下脚本。
if <frxDBDataSet1.”Name”>=” then
Memo2.Text:=’无顾客名’
else
Memo2.Text:=’用户名:[frxDBDataSet1.”Name”]‘
Memo2是停放客商名称数据的Tfrxmemoview控件。
此处注意,要在剧本中访问变量需求把变量用<>包蕴起来。

9.法斯特Report中如何动态调节中度?
本人通常使用下边包车型客车多少个函数来落到实处Band及Tfrxmemoview中度的动态调度,必要潜心的是:上边包车型客车

9.FastReport中哪些动态调节高度?
自己平常应用下面包车型大巴多少个函数来兑现Band及Tfrxmemoview中度的动态调治,须求静心的是:上面包车型大巴

函数只可以调度四个Band中多行的末段一行,假若只有一行(相当多状态下应当是这么)就无所谓了

函数只好调解二个Band中多行的末梢一行,借使独有一行(非常多情景下相应是那般)就无所谓了

,何况那是在小幅度已经固化的前提下。在想要调治中度的Band的OnBeforePrint事件中写

,何况那是在增加率已经固化的前提下。在想要调度中度的Band的OnBeforePrint事件中写

SetMemo;,代码如下,粘贴到代码页中就能够利用。

SetMemo(Sender);,代码如下,粘贴到代码页中就足以应用。

上面的代码也得以衍变一些,完毕动态宽度等。作者多处都认清了Tag是不是为7635,因为小编日常需求

上面的代码也足以衍生和变化一些,完成动态宽度等。小编多处都认清了Tag是或不是为7635,因为本身常常供给

独自调用个中的某部函数。

单独调用在那之中的某些函数。

//7635为保存数字,表示不作任何调解,平时用在多行的最上部
function Biger(Old:Extended):Integer;
begin
Result:=Trunc;
if Frac>0 then
Result:=Result+1;
end;

//7635为保留数字,表示不作任何调节,日常用在多行的最上面
function Biger(Old:Extended):Integer;
begin
Result:=Trunc(Old);
if Frac(Old)>0 then
Result:=Result+1;
end;

procedure JustHeight(Sender:TfrxComponent);
var
RealHeight:Integer;
begin
RealHeight:=Biger(TFrxMemoView.CalcHeight+TFrxMemoView.Top);
if Biger(TfrxBand(Sender.Parent).Height)<RealHeight then
begin
//若MEMO的冲天小于BAND但计算中度超过BAND,则在调动BAND的函数中就会被调动
TfrxBand(Sender.Parent).Height:=Biger(RealHeight);
JustBandHeight(Sender.Parent);
end
else
TfrxMemoView.Height:=TfrxBand(Sender.Parent).Height
-TfrxMemoView.Top;
end;

procedure JustHeight(Sender:TfrxComponent);
var
RealHeight:Integer;
begin
RealHeight:=Biger(TFrxMemoView(Sender).CalcHeight+TFrxMemoView(Sender).Top);
if Biger(TfrxBand(Sender.Parent).Height)<RealHeight then
begin
//若MEMO的莫斯中国科学技术大学学小于BAND但总计中度超越BAND,则在调动BAND的函数中就能够被调动
TfrxBand(Sender.Parent).Height:=Biger(RealHeight);
JustBandHeight(Sender.Parent);
end
else
TfrxMemoView(Sender).Height:=TfrxBand(Sender.Parent).Height
-TfrxMemoView(Sender).Top;
end;

procedure JustBandHeight(Sender:TfrxComponent);
var
I:Integer;
begin
for I:=0 to Sender.Objects.Count-1 do
if TObject(Sender.Objects.Items[I]) is TFrxMemoView then
if TFrxMemoView(Sender.Objects.Items[I]).Tag=7635 then Continue
else
//假诺小才退换,借使大则不可能改换
if Biger(TfrxMemoView(Sender.Objects.Items[I]).Height+
TfrxMemoView(Sender.Objects.Items[I]).Top)<>Biger(TfrxBand.Height)
then
TfrxMemoView(Sender.Objects.Items[I]).Height:=
Biger(TfrxBand.Height-TfrxMemoView(Sender.Objects.Items[I]).Top);
end;

procedure JustBandHeight(Sender:TfrxComponent);
var
I:Integer;
begin
for I:=0 to Sender.Objects.Count-1 do
if TObject(Sender.Objects.Items[I]) is TFrxMemoView then
if TFrxMemoView(Sender.Objects.Items[I]).Tag=7635 then Continue
else
//假使小才改换,假使大则不能够改动
if Biger(TfrxMemoView(Sender.Objects.Items[I]).Height+
TfrxMemoView(Sender.Objects.Items[I]).Top)<>Biger(TfrxBand(Sender).Height)
then
TfrxMemoView(Sender.Objects.Items[I]).Height:=
Biger(TfrxBand(Sender).Height-TfrxMemoView(Sender.Objects.Items[I]).Top);
end;

procedure JustMemo(Sender:TfrxComponent);
begin
if not Engine.FinalPass then Exit;
if Sender.Tag<>7635 then
JustHeight;
end;

procedure JustMemo(Sender:TfrxComponent);
begin
if not Engine.FinalPass then Exit;
if Sender.Tag<>7635 then
JustHeight(Sender);
end;

procedure SetMemo(Sender:TfrxComponent);
var
I:Integer;
begin
for I:=0 to Sender.Objects.Count-1 do
if TObject(Sender.Objects.Items[I]) is TFrxMemoView then
if TfrxMemoView(Sender.Objects.Items[I]).Tag<>7635 then
TfrxMemoView(Sender.Objects.Items[I]).OnAfterData:=’JustMemo’;
end;

procedure SetMemo(Sender:TfrxComponent);
var
I:Integer;
begin
for I:=0 to Sender.Objects.Count-1 do
if TObject(Sender.Objects.Items[I]) is TFrxMemoView then
if TfrxMemoView(Sender.Objects.Items[I]).Tag<>7635 then
TfrxMemoView(Sender.Objects.Items[I]).OnAfterData:=’JustMemo’;
end;

10.法斯特Report中如何贯彻套打?
纸张是连连的带锯齿的早就印刷好的,类似于通讯公司发票这里设计的是顾客出卖记录。
顾客有三个须求:
1、因为打字与印刷纸张是印刷的,明细记录唯有8行,所以,如若条分缕析记录假诺不到8行,就将集团名称

10.FastReport中什么贯彻套打?
纸张是连接的带锯齿的已经印刷好的,类似于通讯公司小票这里设计的是顾客发售记录。
顾客有五个需要:
1、因为打字与印刷纸张是印刷的,明细记录只有8行,所以,假设留意记录假如不到8行,就将公司名称

、发卖记录打字与印刷在上边,下三个市廛的音讯打字与印刷在下一页,而不能够接在该页上(呵呵,是呀,如

、发卖记录打字与印刷在上头,下贰个商家的音信打字与印刷在下一页,而不能接在该页上(呵呵,是呀,如

果接在一道,那印刷单就错过意义了)
2、假设发售记录超越8行,则从第9行开头的销售记录打字与印刷在下一页(所谓下一页,其实正是锯齿

果接在同步,那印刷单就失去意义了)
2、即使发卖记录超过8行,则从第9行初始的贩卖记录打字与印刷在下一页(所谓下一页,其实正是锯齿

分开的下一*,称呼“下一份”相比妥切?),並且抬头也要打上(若是不打

分割的下一*,称呼“下一份”相比妥切?),何况抬头(约等于公司名称)也要打上(假若不打

印抬头,撕下了后,恐怕弄混淆了,不掌握这一页是哪些公司的)
标题陈说标准说法是否应有叫“打印固定行”、“强制换页”?

印抬头,撕下了后,恐怕弄混淆了,不明了这一页是哪位公司的)
主题材料陈述标准说法是否应有叫“打印固定行”、“强制换页”?

答应:每页打印抬头的主题材料,就是把带有公司名称的Band每页重复打字与印刷就能够。属性中有一个的。

答应:每页打字与印刷抬头的主题材料,正是把带有公司名称的Band每页重复打字与印刷就能够。属性中有贰个的。

勾选就行了。
至于固定行,实际上设计套打时,页面大小都以一向的,每一行的万丈也都以原则性的,页眉与页

勾选就行了。
至于固定行,实际上设计套打时,页面大小都是固定的,每一行的万丈也都以永世的,页眉与页

脚也是固定的,那样设计出来的报表可打字与印刷的行数自然正是您要求的
8行了。根本无需如何强

脚也是一定的,这样设计出来的报表可打字与印刷的行数自然正是您须要的
8行了。根本无需怎么着强

制换页。因为根据纸张会自动换页的。你要做的就是布置好纸张尽寸、页面布局,就得了,套打

制换页。因为依据纸张会自动换页的。你要做的就是安排性好纸张尽寸、页面布局,就得了,套打

是一种最简便的打字与印刷,不用想的太复杂。

是一种最轻松易行的打字与印刷,不用想的太复杂。

11.FastReport中如何兑现连接打字与印刷?
广大人感觉Fr不能够落到实处连接打字与印刷,感到只可以通过和谐写函数调用打字与印刷函数来促成一而再打字与印刷,实际

11.FastReport中哪些促成连接打字与印刷?
许几人感到Fr无法促成三番五次打印,以为只可以通过投机写函数调用打字与印刷函数来贯彻连接打字与印刷,实际

上,Fr能够随意的实现接二连三打字与印刷,相同的时候,完成时又是特别轻巧,你居然足以在您的次第的打字与印刷设

上,Fr能够随意的贯彻连接打字与印刷,同时,达成时又是特别简单,你以至能够在您的主次的打字与印刷设

置中简易的让顾客选拔是或不是三番两次打字与印刷,别的都能够维持不改变。

置中回顾的让顾客选拔是或不是延续打字与印刷,另外都足以保证不改变。

function PelsTomm(Pels:Extended):Extended;
begin
Result:=Pels/Screen.PixelsPerInch*25.4;
end;

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;
{必需用地方的循环代码来获取正确的空白区域
不能够用通过估测计算总页数减去各页的页边距的点子来获取空白区域
www.5929.com,因为假若境遇一条记下过宽的情事导致换页,就不标准了。}
R:=Pelstomm(Frx.Engine.TotalPages*Frx.Engine.PageHeight-
Frx.Engine.FreeSpace)+R1;
P:=TfrxReportPage(Frx.Pages[SequencePage]);
P.PaperHeight:=R;
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就可以。

在预览或打字与印刷前先调用PrintSerial就可以。

12.什么在前后相继中钦赐打字与印刷机名称?
frxReport1.Report.PrintOptions.Printer := ‘打字与印刷机名称’;

12.什么样在程序中钦命打字与印刷机名称?
frxReport1.Report.PrintOptions.Printer := ‘打字与印刷机名称’;

13.怎么行使打字与印刷机直接打字与印刷?
implementation
uses Printers;
{$R *.dfm}

13.哪些运用打字与印刷机直接打印?
implementation
uses Printers;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Printer.PrinterIndex :=
0;{互连网打字与印刷机也是要设置在您本地的操作系统中的,直接利用各种

procedure TForm1.Button1Click(Sender: TObject);
begin
Printer.PrinterIndex :=
0;{网络打字与印刷机也是要设置在您本地的操作系统中的,直接选取各类

试试吧}
Printers.Printer.SetPrinter(’HP1020′,’HP1020′,’LPT1′,0);{打字与印刷机名字,驱动,端口等,

试试吧}
Printers.Printer.SetPrinter(’HP1020′,’HP1020′,’LPT1′,0);{打字与印刷机名字,驱动,端口等,

自己检查,笔者是用编造打字与印刷机测量试验的}

自己检查,我是用编造打字与印刷机测量试验的}

Printers.Printer.BeginDoc;
Printers.Printer.Canvas.TextOut(10,10,’打印这一行字’);
Printers.Printer.EndDoc;
end;

Printers.Printer.BeginDoc;
Printers.Printer.Canvas.TextOut(10,10,’打字与印刷这一行字’);
Printers.Printer.EndDoc;
end;

14.怎样打字与印刷空白处?
在打字与印刷表格的Band处的OnBeforePrint事件中加多代码:
while FreeSpace > 20 do
ShowBand

14.什么样打字与印刷空白处?
在打字与印刷表格的Band处的OnBeforePrint事件中增多代码:
while FreeSpace > 20 do
ShowBand(Child1)

15.怎么打字与印刷钦点行数后换页?
在master band中OnBeforePrint事件中写代码:
var
vLineCount: integer;
begin
vLineCount := vLineCount + 1;
if vLineCount = 10 then
begin
vLineCount := 0;
NewPage;
end;
end;

15.怎样打字与印刷内定行数后换页?
在master band中OnBeforePrint事件中写代码:
var
vLineCount: integer;
begin
vLineCount := vLineCount + 1;
if vLineCount = 10 then
begin
vLineCount := 0;
NewPage;
end;
end;

16.fastreport中怎么着把数据展现为百分比
DisplayFormat属性,个中的Kind你设置成fkNumeric,FormatStr
[<frxDBDataset1.”sjl”>*100 #n%2.2f]%”。

16.fastreport中怎么着把数据展示为百分比
DisplayFormat属性,个中的Kind你设置成fkNumeric,FormatStr
[<frxDBDataset1.”sjl”>*100 #n%2.2f]%”。

17.法斯特Report怎么打字与印刷表格式的空行?
var
PageLine: integer; //在現在頁列印到第幾行
PageMaxRow: integer=15; //設定每頁列數
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
PageLine := <Line> mod PageMaxRow;
if (PageLine = 1) and (<line> > 1) then
Engine.newpage;
child1.visible := False;
end;

17.FastReport什么样打字与印刷表格式的空行?
var
PageLine: integer;       //在現在頁列印到第幾行
Page马克斯Row: integer=15;  //設定每頁列數
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
PageLine := <Line> mod PageMaxRow;
if (PageLine = 1) and (<line> > 1) then
Engine.newpage;
child1.visible := False;
end;

//Footer第11中学度設為0
procedure Footer1OnBeforePrint(Sender: TfrxComponent);

//Footer1中度設為0
procedure Footer1OnBeforePrint(Sender: TfrxComponent);

var
i: integer;
begin
i := iif(PageLine=0, PageMaxRow, PageLine);
child1.visible := True;
while i < PageMaxRow do
begin
i := i + 1;
Engine.ShowBand; //印空白表格
end;
child1.visible := False;
end;
begin
end.

var
i: integer;
begin
i := iif(PageLine=0, PageMaxRow, PageLine);
child1.visible := True;
while i < PageMaxRow do
begin
i := i + 1;
Engine.ShowBand(Child1);  //印空白表格
end;
child1.visible := False;
end;
begin
end.

========================================================================
中期版本

========================================================================
前期版本

—————- 使用自定义函数 —————————————-

—————- 使用自定义函数 —————————————-

Q: 笔者怎样加多作者的自定义函数?
A: 使用 TfrReport.OnUserFunction 事件. 这里有贰个简易的例子:

Q: 小编怎么增加小编的自定义函数?
A: 使用 TfrReport.OnUserFunction 事件. 这里有贰个简便的例证:

procedure TForm1.frReport1UserFunction(const Name: String;
p1, p2, p3: Variant; var val: Variant);
begin
if AnsiCompareText(’SUMTOSTR’, Name) = 0 then
val := My_Convertion_Routine(frParser.Calc;
end;

procedure TForm1.frReport1UserFunction(const Name: String;
p1, p2, p3: Variant; var val: Variant);
begin
if AnsiCompareText(’SUMTOSTR’, Name) = 0 then
val := My_Convertion_Routine(frParser.Calc(p1));
end;

下一场,你就足以在报表的其他地点使用 SumToStr 函数了。

接下来,你就能够在表格(任何表明式或脚本)的别样地方使用 SumToStr 函数了。

Q:
不过它只是能职业在三个TfrReport组件中。可笔者想在其余地方(在有着的TfrReport组件中)

Q:
可是它独自能做事在二个TfrReport组件中。可小编想在任何地方(在有着的TfrReport组件中)

采纳的自家的自定义函数?
A: 使 OnUserFunction event
句柄作为全部组件的公用句柄。假诺你无法实现这或多或少,你须求创

使用的笔者的自定义函数?
A: 使 OnUserFunction event
句柄作为具备组件的公用句柄。假若您不可能一鼓作气这一点,你须要创

建函数库:

建函数库:

type
TMyFunctionLibrary = class(TfrFunctionLibrary)
public
constructor Create; override;
procedure DoFunction(Fno: Integer; p1, p2, p3: Variant;
var val: Variant); override;
end;

type
TMyFunctionLibrary = class(TfrFunctionLibrary)
public
constructor Create; override;
procedure DoFunction(Fno: Integer; p1, p2, p3: Variant;
var val: Variant); override;
end;

constructor TMyFunctionLibrary.Create;
begin
inherited Create;
with List do
begin
Add(’DATETOSTR’);
Add(’SUMTOSTR’);
end;
end;

constructor TMyFunctionLibrary.Create;
begin
inherited Create;
with List do
begin
Add(’DATETOSTR’);
Add(’SUMTOSTR’);
end;
end;

procedure TMyFunctionLibrary.DoFunction(Fno: Integer; p1, p2, p3:
Variant;
var val: Variant);
begin
val := 0;
case Fno of
0: val := My_DateConvertion_Routine(frParser.Calc;
1: val := My_SumConvertion_Routine(frParser.Calc;
end;
end;

procedure TMyFunctionLibrary.DoFunction(Fno: Integer; p1, p2, p3:
Variant;
var val: Variant);
begin
val := 0;
case Fno of
0: val := My_DateConvertion_Routine(frParser.Calc(p1));
1: val := My_SumConvertion_Routine(frParser.Calc(p1));
end;
end;

要注册函数库,调用
frRegisterFunctionLibrary(TMyFunctionLibrary);
要卸载函数库,调用
frUnRegisterFunctionLibrary(TMyFunctionLibrary);

要注册函数库,调用
frRegisterFunctionLibrary(TMyFunctionLibrary);
要卸载函数库,调用
frUnRegisterFunctionLibrary(TMyFunctionLibrary);

Q: 小编什么将本身的函数增添到函数列表中 ?
A: 使用 frAddFunctionDesc 过程 (在FR_Class 单元中):

Q: 笔者怎样将自身的函数增多到函数列表中 (用表达式生成器)?
A: 使用 frAddFunctionDesc 过程 (在FR_Class 单元中):

frAddFunctionDesc(FuncLib, ‘SUMTOSTR’, ‘My functions’,
‘SUMTOSTR(<Number>)/Converts number to its verbal presentation.’);

frAddFunctionDesc(FuncLib, ‘SUMTOSTR’, ‘My functions’,
‘SUMTOSTR(<Number>)/Converts number to its verbal presentation.’);

留意: “/” 符号是必需的! 它从它的叙说中分隔函数语法。
FuncLib 被声称为您本人的函数库 (倘令你不采纳函数库能够将其设置为nil).
当函数库未注册

潜心: “/” 符号是必需的! 它从它的描述中分隔函数语法。
FuncLib 被声称为您本身的函数库 (假设您不选拔函数库能够将其安装为nil).
当函数库未注册

时,全体它的函数将自行从函数列表中删除。

时,全部它的函数将自动从函数列表中剔除。

—————- 使用变量 ————————————-

—————- 使用变量 ————————————-

Q: 我怎么编制程序完结填充变量列表?

Q: 小编哪些编制程序完成填充变量列表(在多少词典中)?

A: 数据词典中的全数变量及分类都被存放在 TfrReport.Dictionary.Variables
中.

A: 数据词典中的全部变量及分类都被存放在 TfrReport.Dictionary.Variables
中.

with frReport1.Dictionary do
begin
// 创造分类
Variables[‘ New category’] := ‘ ‘;
// 创设变量
Variables[‘New Variable’] := ‘CustomerData.Customers.”CustNo”‘;
Variables[‘Another Variable’] := ‘Page#’;
end;

with frReport1.Dictionary do
begin
// 创制分类(名称用空白)
Variables[‘ New category’] := ‘ ‘;
// 创设变量
Variables[‘New Variable’] := ‘CustomerData.Customers.”CustNo”‘;
Variables[‘Another Variable’] := ‘Page#’;
end;

Q: 笔者定义了字符串变量:

Q: 小编定义了字符串变量:

with frReport1.Dictionary do
Variables[‘Month’] := ‘March’;

with frReport1.Dictionary do
Variables[‘Month’] := ‘March’;

但是当自家运营报表是,出现了错误,为啥?

不过当作者运营报表是,出现了错误,为何?

A:
因为法斯特Report假定数据词典中的字符串变量值是三个表明式,它供给深入分析、计算它。
能够运用其余的法子:

A:
因为 FastReport 假定数据词典中的字符串变量值是贰个表明式,它须求解析、总计它。
能够动用别的的法子:

with frReport1.Dictionary do
Variables[‘Month’] := ”” +’March’ + ””;

with frReport1.Dictionary do
Variables[‘Month’] := ”” +’March’ + ””;

依旧, 使用 frVariables 来传输固定数据到报表。

只怕, 使用 frVariables 来传输固定数据到报表。

Q: 笔者不想在数额词典中显得某个数据集?

Q: 作者不想在多少词典中显得有些数据集?

A: 使用 TfrReport.Dictionary.DisabledDatasets:

A: 使用 TfrReport.Dictionary.DisabledDatasets:

with frReport1.Dictionary do
begin
// 关闭该数据集
DisabledDatasets.Add(’CustomerData.Bio’);
// 或许, 关闭全数数据模块/窗体
DisabledDatasets.Add(’CustomerData*’);
end;

with frReport1.Dictionary do
begin
// 关闭该数据集
DisabledDatasets.Add(’CustomerData.Bio’);
// 或许, 关闭全体数据模块/窗体
DisabledDatasets.Add(’CustomerData*’);
end;

Q: 作者哪些将数据传送到报表?

Q: 小编怎么样将数据传送到报表?

A: 有多少个艺术能够完毕它. 第一是运用全局对象 frVariables (在 FPRADO_Class
单元中被定义):

A: 有多少个法子能够兑现它. 第一是应用全局对象 frVariables (在 F昂Cora_Class
单元中被定义):

frVariables[‘My variable’] := 10;

frVariables[‘My variable’] := 10;

这段代码成立了一个称呼为“My variable”,值为 10
的变量。那是最棒的传输固定数据的表格

这段代码成立了三个称号为“My variable”,值为 10
的变量。那是最佳的传导固定数据的表格

的方法。

的方法。

其次种情势是应用 TfrReport.OnGetValue 事件.
那能够运用那么些措施来传送动态数据、记录等

第三种格局是应用 TfrReport.OnGetValue 事件.
那能够运用那几个措施来传送动态数据、记录等

procedure TForm1.frReport1GetValue(ParName: String; var ParValue:
Variant);
begin
if ParName = ‘MyField’ then
ParValue := Table1MyField.Value;
end;

procedure TForm1.frReport1GetValue(ParName: String; var ParValue:
Variant);
begin
if ParName = ‘MyField’ then
ParValue := Table1MyField.Value;
end;

最后, 第两种格局是因而编程在数码词典中定义变量(能够参谋在此以前的主题材料):

最后, 第二种格局是通过编制程序在数据词典中定义变量(能够参照他事他说加以考察从前的难点):

with frReport1.Dictionary do
begin
Variables[‘MyVariable’] := ‘CustomerData.Customers.”CustNo”‘;
Variables[‘Another Variable’] := ’10’;
end;

with frReport1.Dictionary do
begin
Variables[‘MyVariable’] := ‘CustomerData.Customers.”CustNo”‘;
Variables[‘Another Variable’] := ’10’;
end;

Q: 笔者能在表格和顺序间传送数据吗?
A: 使用 frVariables 对象. 假设您在表格的别的对象的本子中写入以下代码:

Q: 笔者能在表格和次序间传送数据吗?
A: 使用 frVariables 对象. 倘诺你在报表的别样对象的剧本中写入以下代码:

MyVariable := 10

MyVariable := 10

那就是说,在您的前后相继中,你能够采用以下代码来博取 MyVariable 的值:
v := frVariables[‘MyVariable’];

这正是说,在您的主次中,你能够动用以下代码来博取 MyVariable 的值:
v := frVariables[‘MyVariable’];

—————- 脚本 (FastReportPascal) ———————————

—————- 脚本
(FastReport Pascal)
———————————

Q: Band 中是还是不是能够运用脚本?

Q: Band 中是或不是能够应用脚本?

A: 当然. 选用 band ,然后按 Ctrl+Enter 或在目的浏览器中选用“OnBeforePrint” 属性。

A: 当然. 采纳 band ,然后按 Ctrl+Enter 或在对象浏览器中精选
“OnBeforePrint” 属性。

Q: 报表页中是否能够运用脚本?

Q: 报表页中是或不是足以应用脚本?

A: 当然. 接纳页 ,然后在指标浏览器中甄选 “OnBeforePrint” 属性。要是该

A: 当然. 选用页 (在空白处单击) ,然后在指标浏览器中挑选 “OnBeforePrint”
属性。假设该

页是三个对话框窗体,那么那么些天性就是 “OnActivate”.

页是三个对话框窗体,那么那么些脾性正是 “OnActivate”.

Q: 小编有四个指标: Memo1 和 Memo2. 笔者能还是不可能在 Memo1 的剧本中调用 Memo2
的天性和方法?

Q: 小编有多个对象: Memo1 和 Memo2. 小编是或不是在 Memo1 的脚本中调用 Memo2
的特性和措施?

A: 当然, 举个例子,你能够那样做: 对象名.属性名.

A: 当然, 举个例子,你能够那样做: 对象名.属性名.

Q: 在剧本中,作者得以应用对象的哪些属性?

Q: 在剧本中,作者得以接纳对象的哪些属性?

A: 大致全数你能在对象浏览器中看看的质量。比方,能够使用 Font.Name,
Font.Size等来存取

A: 大概具备你能在指标浏览器中见到的属性。比如,能够应用 Font.Name,
Font.Size等来存取

字体属性。

字体属性。

—————- 别的难题 ——————————————–

—————- 其余难题 ——————————————–

Q: 如何变越多页报表中某一页的逐个?

Q: 如何改换多页报表中某一页的顺序?

A: 拖动页标签到指标地点。

A: 拖动页标签到指标地方。

Q: 小编想查看全部的字段及变量,作者想在报表中应用列表来实现它?

Q: 作者想查看全体的字段及变量,作者想在报表中应用列表来落实它?

A: 设置 TfrReport.MixVariablesAndDBFields :=
True.今后,全数的数量字段及变量可在“插

A: 设置 TfrReport.MixVariablesAndDBFields :=
True.未来,全部的数据字段及变量可在“插

入数据字段”对话框中可存取了。

入数据字段”对话框中可存取了。

Q: 作者不想展现导入选项对话框?

Q: 笔者不想呈现导入选项对话框?

A:
在导入组件(比方,TfrTextExport)中安装有着须要的选项,然后通过安装ShowDialog属性为

A:
在导入组件(举例,TfrTextExport)中安装有着要求的选项,然后通过安装ShowDialog属性为

False来关闭此对话框。

False来关闭此对话框。

Q: 为啥 TotalPages 变量不起效用? 它总是回到 0.

Q: 为啥 TotalPages 变量不起成效? 它连接回到 0.

A: 在您的表格中装置 Two-pass 选项.
要设置它,你须要在表格设计器的“文件”菜单中,展开

A: 在你的报表中装置 Two-pass 选项.
要安装它,你需求在报表设计器的“文件”菜单中,展开

“报表选项”对话框。

“报表选项”对话框。

Q:
作者用BLOB字段来积累作者的表格。当本人运转报表设计器时,它呈现作者的表格未命名?

Q:
小编用BLOB字段来累积小编的报表。当自个儿运维报表设计器时,它显得作者的表格未命名?

A: 在运维报表设计器前,那样做:

A: 在运转报表设计器前,那样做:

frReport1.FileName := ‘Name of my report’;

frReport1.FileName := ‘Name of my report’;

Q: 小编想在重复定义报表设计器中的“张开”及“保存”开关的功能?

Q: 小编想在再一次定义报表设计器中的“展开”及“保存”开关的机能?

A: 查看 TfrDesigner 组件. 它有几个必备的风浪: OnLoadReport 和
OnSaveReport. 这里有一小段代码例子:

A: 查看 TfrDesigner 组件. 它有多少个必备的事件: OnLoadReport 和
OnSaveReport. 这里有一小段代码例子:

procedure TForm1.frDesigner1LoadReport(Report: TfrReport;
var ReportName: String; var Opened: Boolean);
begin
with MyOpenDialog do
begin
Opened := ShowModal = mrOk;
if Opened then
begin
Report.LoadFromBlobField;
ReportName := …;
end;
end;
end;

procedure TForm1.frDesigner1LoadReport(Report: TfrReport;
var ReportName: String; var Opened: Boolean);
begin
with MyOpenDialog do
begin
Opened := ShowModal = mrOk;
if Opened then
begin
Report.LoadFromBlobField(…);
ReportName := …;
end;
end;
end;

procedure TForm1.frDesigner1SaveReport(Report: TfrReport;
var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
begin
if SaveAs then
with MySaveDialog do
begin
Saved := ShowModal = mrOk;
if Saved then
begin
Report.SaveToBlobField;
ReportName := …;
end;
end
else
Report.SaveToBlobField;
end;

procedure TForm1.frDesigner1SaveReport(Report: TfrReport;
var ReportName: String; SaveAs: Boolean; var Saved: Boolean);
begin
if SaveAs then
with MySaveDialog do
begin
Saved := ShowModal = mrOk;
if Saved then
begin
Report.SaveToBlobField(…);
ReportName := …;
end;
end
else
Report.SaveToBlobField(…);
end;

Q: 在 QWrangler 中, 笔者得以写这么的代码: Q昂CoraLabel1.Caption := ’Some text’.
小编得以用F景逸SUV那样做

Q: 在 QGL450 中, 作者能够写那样的代码: Q路虎极光Label1.Caption := ’Some text’.
作者可以用FEnclave那样做

吗?

吗?

A: F奥德赛 对象并不是一个零部件 (那并不像 Q揽胜, RB). 但采纳 TfrReport.FindObject
方法能够由此

A: FEvoque 对象并非多个零部件 (那并不像 Q卡宴, RB). 但运用 TfrReport.FindObject
方法能够通过

对象名称找到该目的。

对象名称找到该目的。

var
t: TfrMemoView;
begin
t := TfrMemoView(frReport1.FindObject(’Memo1’));
if t <> nil then
t.Memo.Text := ’FastReport’;
end;

var
t: TfrMemoView;
begin
t := TfrMemoView(frReport1.FindObject(’Memo1’));
if t <> nil then
t.Memo.Text := ’FastReport’;
end;

Q: 小编想在客户预览(TfrPreview组件)中自定义热键?

Q: 笔者想在客商预览(TfrPreview组件)中自定义热键?

A: 这么些组件有个窗口: Tform 属性. 将自定义句柄钦点到 Window.OnKeyDown
属性.

A: 那几个组件有个窗口: Tform 属性. 将自定义句柄钦定到 Window.OnKeyDown
属性.

Q: 法斯特 Report 2.4 不可能装载 FreeReport 2.21 文件?

Q: 法斯特 Report 2.4 不可能装载 FreeReport 2.21 文件?

A:
这仅需求使用16进制数退换报表文件的第一字节,然后在源代码中期维修改上边包车型地铁一对。在这个修

A:
那仅必要选取16进制数改造报表文件的首先字节,然后在源代码中期维修改下边包车型地铁部分。在这么些修

改之后, 装载报表并保存它. 最终,重返到源代码处.

改之后, 装载报表并保存它. 最后,重返到源代码处.

FR_Class:

FR_Class:

function ReadString(Stream: Tstream): String;
begin
{ if frVersion >= 23 then}
Result := frReadString {else
Result := frReadString22;}
end;

function ReadString(Stream: Tstream): String;
begin
{ if frVersion >= 23 then}
Result := frReadString(Stream) {else
Result := frReadString22(Stream);}
end;

procedure ReadMemo(Stream: Tstream; Memo: Tstrings);
begin
{ if frVersion >= 23 then}
frReadMemo(Stream, Memo){ else
frReadMemo22(Stream, Memo);}
end;

procedure ReadMemo(Stream: Tstream; Memo: Tstrings);
begin
{ if frVersion >= 23 then}
frReadMemo(Stream, Memo){ else
frReadMemo22(Stream, Memo);}
end;

FR_Utils:

FR_Utils:

procedure frReadMemo(Stream: Tstream; l: Tstrings);
var
s: String;
b: Byte;
n: Word;
begin
l.Clear;
l.Text := frReadString; exit;
Stream.Read;
if n > 0 then
repeat
Stream.Read;
SetLength;
Stream.Read;
l.Add;
Stream.Read;
until b = 0
else
Stream.Read;
end;

procedure frReadMemo(Stream: Tstream; l: Tstrings);
var
s: String;
b: Byte;
n: Word;
begin
l.Clear;
l.Text := frReadString(Stream); exit;
Stream.Read(n, 2);
if n > 0 then
repeat
Stream.Read(n, 2);
SetLength(s, n);
Stream.Read(s[1], n);
l.Add(s);
Stream.Read(b, 1);
until b = 0
else
Stream.Read(b, 1);
end;

function frReadString(Stream: Tstream): String;
var
s: String;
n: Integer;
b: Byte;
begin
Stream.Read;
SetLength;
Stream.Read;
if and (s[n] = #$0A) then
SetLength;
// Stream.Read;
Result := s;
end;

function frReadString(Stream: Tstream): String;
var
s: String;
n: Integer;
b: Byte;
begin
Stream.Read(n, 4);
SetLength(s, n);
Stream.Read(s[1], n);
if (n > 0) and (s[n] = #$0A) then
SetLength(s, n – 2);
// Stream.Read(b, 1);
Result := s;
end;

Q: 如何不在打字与印刷预览中打字与印刷表格?
A: 这里有一段代码:

Q: 怎样不在打字与印刷预览中打字与印刷表格?
A: 这里有一段代码:

frReport1.PrepareReport;
frReport1.PrintPreparedReport(”, 1, True, frAll);

frReport1.PrintPreparedReportDlg;

frReport1.PrepareReport;
frReport1.PrintPreparedReport(”, 1, True, frAll);

frReport1.PrintPreparedReportDlg;

Q:
作者想在报表中旋转图片。难题是这张图纸是由作者的应用程序生成的。是还是不是有办法可以在打字与印刷前

Q:
作者想在表格中旋转图片。难点是那张图纸是由本人的应用程序生成的。是还是不是有艺术能够在打字与印刷前

将那幅图片装载到报表中?

将这幅图片装载到报表中?

A: 使用 TfrReport.OnBeforePrint 事件:

A: 使用 TfrReport.OnBeforePrint 事件:

if View.Name = ‘Picture1′ then
TfrPictureView.Picture.LoadFromFile 或
.Assign 或
.你所想要做的另外业务

if View.Name = ‘Picture1′ then
TfrPictureView(View).Picture.LoadFromFile(…) 或
.Assign 或
.你所想要做的任何事情

FastReport套打全战术
//以统一计划套打行为6行为例举办认证
一、定义变量
TaoDa 0 是套打 1 不套打
cPage 系统变量 页#
caPage 系统变量 总页数

FastReport 套打全战略
//以规划套打行为6行为例举办认证
一、定义变量
TaoDa   0 是套打 1 不套打
cPage   系统变量  页#
caPage  系统变量  总页数

二、TfrPage.OnBeforePrint事件中写
{
if TaoDa = ‘0′ then
begin
title.visible:=false; //不用打字与印刷的安装Visible为False;
danweiv.frametyp := 0; //只打印数据的不必要打字与印刷边框的安装 frametyp 为
0;

end;
i := 0 ; //定义八个变量并展开伊始化。
}
二、主项数据.OnBeforePrint事件中写
{
if TaoDa = ‘0′ then
begin
i := i + 1;
bm.memo := i;
if (i > 5 ) then
if mod 6 ) = 0 then newpage;
end;
}

二、TfrPage.OnBeforePrint事件中写
{
if TaoDa = ‘0′ then
begin
title.visible:=false;   //不用打字与印刷的装置Visible为False;
danweiv.frametyp := 0;  //只打字与印刷数据的无需打印边框的装置 frametyp 为
0;

end;
i := 0 ;   //定义四个变量并拓宽初阶化。
}
二、主项数据.OnBeforePrint事件中写
{
if TaoDa = ‘0′ then
begin
i := i + 1;
bm.memo := i;
if (i > 5 ) then
if ((i-1) mod 6 ) = 0 then newpage;
end;
}

三、主项脚.OnBeforePrint事件中写
{
j := i mod 6;
if j <> 0 then
begin
for k := j to 5 do
begin
ShowBand; //Child1是子的名号展现空白行
end;
end;
}
四、栏目脚.OnBeforePrint事件中写
{
if cpage <> capage then
begin
shi.memo := ”; //十
bai.memo := ”; //百
qian.memo := ”; //千
wan.memeo := ”; //万
end
else begin
shi.memo := v1;
bai.memo := v2;
qian.memo := v3;
wan.memo := v4;
end;
}

三、主项脚.OnBeforePrint事件中写
{
j := i mod 6;
if j <> 0 then
begin
for k := j to 5 do
begin
ShowBand(Child1);   //Child1是子的称呼 显示空白行
end;
end;
}
四、栏目脚.OnBeforePrint事件中写
{
if cpage <> capage then
begin
shi.memo := ”;  //十
bai.memo := ”;  //百
qian.memo := ”; //千
wan.memeo := ”; //万
end
else begin
shi.memo := v1;
bai.memo := v2;
qian.memo := v3;
wan.memo := v4;
end;
}

这段代码是用来调节在有多页情状下,在最后一页上海展览中心示总金额。
个中:v1,v2,v3,v4 是自定义变量。

这段代码是用来决定在有多页意况下,在终极一页上展现总金额。
其中:v1,v2,v3,v4 是自定义变量。

报表结构组成:
栏目头 //画报表的标头
主项数据 //彰显的多寡,会与数据源进行绑定
主项脚 //什么也不用放,只用来支配 visible := false;
子 //画出空白行展现的机件
栏目脚 //突显总的金额、数量
页脚 //呈现页数

报表结构构成:
栏目头           //画报表的标头
主项数据         //显示的数目,会与数据源举行绑定
主项脚      //什么也不用放,只用来决定  visible := false;
子               //画出空白行展现的机件
栏目脚           //突显总的金额、数量
页脚             //显示页数

调用方法:
frReportA.LoadFromFile; s 是文件
frReportA.Dictionary.Variables[‘taoda’]:=’1′;
展开查询

调用方法:
frReportA.LoadFromFile(s);   s 是文件
frReportA.Dictionary.Variables[‘taoda’]:=’1′;
扩充询问

打印:
frReportA.PrepareReport;
frreportA.PrintPreparedReport(”,1,true,frall);

打印:
frReportA.PrepareReport;
frreportA.PrintPreparedReport(”,1,true,frall);

预览:
frReportA.ShowReport;

预览:
frReportA.ShowReport;

FastReport打印CxGrid数据

用惯了FastReport,就不愿意再选取其它的Print Component。用法斯特Report打印CxGrid
Filter后的多寡,网络一直尚未很好的措施和例程。看到有将CxGrid的Fileter
Text收取后再赋给DataSet的验证,未有切实可行去考试,太费事。如此资深的Component鲜明有减轻此主题材料的办法。于是后天到Dev
Express斯洛伐克语站点去浏览了一番,在该站上搜索了弹指间,居然出来N多此主题材料的提问者,看了多少个这类的问题后,终于解决了。
减轻此主题材料能够运用以下办法:
1、将View的datacontroller.filter.autodatasetfilter属性设为True。
此办法必要DataSet帮助技能安装。
2、是在法斯特Report的frDBDataSet的CheckEof Event里写如下代码:
EOF := frUserDataset1.RecNo >= Grid.ViewData.RecordCount;
在frReport的GetValue 伊夫nt里写代码:
if ParName=’Field1′ then
ParValue := Grid.ViewData.Records[frDataset1.RecNo].Values[2]);
此代码也可那般写:
ParValue
:=Grid.ViewData.Records[frDataset1.RecNo].Values[View.GetColumnByFieldName.Index]);

ReportMachine
1.哪些利用代码钦赐打字与印刷机?
RMReport1.LoadFromFile(’Untitled.rmf’);
rmreport1.PrinterName:=’\192.168.10.1HP LaserJet 1022′;

frxReport1.Clear; 
frxReport1.LoadFromFile(ExtractFilePath(Paramstr+'report\条码.fr3');
frxReport1.PrepareReport;
frxReport1.PrintOptions.ShowDialog := False; //不显示打印机选择框
frxReport1.PrintOptions.Printer := 'SC-5870 POS Printer';  //选择打印机名称
frxReport1.Print; //打印

FastReport打印CxGrid数据

用惯了FastReport,就不愿意再利用其余的Print
Component。用FastReport打字与印刷CxGrid
Filter后的数据,英特网一向尚未很好的秘技和例程。看到有将CxGrid的Fileter
Text收取后再赋给DataSet的验证,未有切实可行去考试,太难为。如此资深的Component确定有化解此主题素材的方法。于是今天到Dev
Express立陶宛(Lithuania)语站点去浏览了一番,在该站上找寻了须臾间,居然出来N多此主题素材的提问者,看了几个那类的主题材料后,终于化解了。
解决此难题得以接纳以下方法:
1、将View的datacontroller.filter.autodatasetfilter属性设为True。
此方法供给DataSet帮助本事设置。
2、是在FastReport的frDBDataSet的CheckEof
Event里写如下代码:
EOF := frUserDataset1.RecNo >= Grid.ViewData.RecordCount;
在frReport的GetValue Event里写代码:
if ParName=’Field1′ then
ParValue := Grid.ViewData.Records[frDataset1.RecNo].Values[2]);
此代码也可这么写:
ParValue
:=Grid.ViewData.Records[frDataset1.RecNo].Values[View.GetColumnByFieldName(ParName).Index]);

ReportMachine
1.怎么样选用代码钦命打字与印刷机?
RMReport1.LoadFromFile(’Untitled.rmf’);
rmreport1.PrinterName:=’/192.168.10.1HP LaserJet 1022′;

Leave a Comment.