您的位置:首页 > 编程语言 > Delphi

delphi 简单的 fastreport 设计

2012-10-24 10:21 288 查看
加入控件TFrxreport、frxDesigner1,导出部分添加TfrxSimpleTextExport、TfrxXLSExport、TfrxPDFExport、TfrxHtmlExport等表示要导出的几种类型。



如果没有TFrxDesigner控件将不能进行报表设计。另外添加TfrxDBDataset 数据源(在Form或Data Module中加入都行)可以在设计时查看到的DataSet.







在MasterData的属性DataSet中选择相应的数据集。



这样简单的报表就设计完成了,可以在设计模式下预览查看下结果。

在Form中通过语句可以调用打印预览和报表设计。

frxReport1.ShowReport; //报表预览

frxReport1.DesignReport; //报表设计

frxReport1.Clear; //先清除报表

frxReport1.LoadFromFile('D:\Borland\Projects\TestFastReport\test1.fr3'); //打开指定报表

frxReport1.ShowReport; //显示报表

关于FastReport 的其他一些问题总结如下:

1.FastReport中如何共用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;//关联Fastreport的组件与TDataset数据集。

Frxreport1.DataSets.Add(frxDBDataSet1);//加载关联好的TfrxDBDataSet到报表中。

经过这几步后,就可以像单独使用一个Tfrxreport一样使用共用的报表组件了

写成函数是

procedure IniReport(var frReport:TfrxReport;var frDbBase:TfrxDBDataset;ReportName: string; qry: TADOQuery);

begin

frReport.clear;

frReport.LoadFromFile(ReportName);

frReport.DataSets.Clear;

frDbBase.DataSet := qry;

frReport.DataSets.Add(frDbBase);

end;

2.如何打印空白处?

在打印报表的Band处的OnBeforePrint事件中添加代码:

while FreeSpace > 20 do

ShowBand(Child1)

3.如何打印指定行数后换页?

在master band中OnBeforePrint事件中写代码:

var

vLineCount: integer;

begin

vLineCount := vLineCount + 1;

if vLineCount = 10 then

begin

vLineCount := 0;

NewPage;

end;

end;

4.fastreport中如何把数据显示为百分比

DisplayFormat属性,其中的Kind你设置成fkNumeric,FormatStr

[<frxDBDataset1."sjl">*100 #n%2.2f]%”

5.FastReport如何打印表格式的空行?

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;

//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.

6.在首页打印本页小计,最后一页打印本页小计和合计(如果只有一页,则打印本页小计和合计)

frxReport1.PrepareReport();

frxReport1.Variables['pageQ'] := pageQ;

frxReport1.Variables['hander'] := QuotedStr(hander);

frxReport1.Variables['doubleline'] := QuotedStr(StringOfChar('=', Length(hander) + 12));

whName :='设备资产';

frxReport1.Variables['p1'] := QuotedStr('仓库:' + whName);

frxReport1.Variables['p9'] := QuotedStr('领用科室:' + DepName);

frxReport1.Variables['p2'] := QuotedStr('日期:' + ywDate);

frxReport1.Variables['p3'] := QuotedStr('单据号:' + VoucherNo);

if warehouseno=3 then

begin

frxReport1.Variables['p8'] := QuotedStr('经手:');

frxReport1.Variables['p4'] := QuotedStr('保管:');

frxReport1.Variables['p5'] := QuotedStr('负责人:');

end

else

begin

frxReport1.Variables['p8'] := QuotedStr('采购:');

frxReport1.Variables['p4'] := QuotedStr('验收:');

frxReport1.Variables['p5'] := QuotedStr('科室签字:');

end;

frxReport1.Variables['p6'] := QuotedStr('操作员:'+Operator);

frxReport1.Variables['p7'] := QuotedStr('打印日期:' + prDate);

frxReport1.Variables['p10'] := QuotedStr('('+ShareGlobalVar.GlobalVar.GetUnitID+')');

if IsPreView then

begin

frxReport1.ShowReport;

end

else

begin

frxReport1.PrintOptions.ShowDialog := False;

frxReport1.PrepareReport();

frxReport1.Print;

end;

end;

在FastReport写入代码

procedure ColumnFooter1OnBeforePrint(Sender: TfrxComponent);

var

bVisible: boolean;

begin

bVisible := <Page> = <pageQ>;

Memo12.visible := bVisible;

Memo21.visible := bVisible;

Memo16.visible := bVisible;

Memo14.visible := bVisible;

if not bvisible then

begin

p8.Top := 27;

p7.Top := 27;

p4.Top := 27;

p5.Top := 27;

p6.Top := 27;

end

else

begin

p8.Top := 49.46;

p7.Top := 49.46;

p4.Top := 49.46;

p5.Top := 49.46;

p6.Top := 49.46;

end;

end;

procedure Page1OnBeforePrint(Sender: TfrxComponent);

var

bVisible: boolean;

begin

bVisible := <Page> = <pageQ>;

if not bvisible then

begin

ColumnFooter1.Height:=48;

end

else

begin

ColumnFooter1.Height:=69.35;

end;

end;

begin

end.

7.加入自定义函数

(1)在delphi程序中定义函数

frxReport1.AddFunction('function MoneyCn(mmje: Double): String;','Myfunction','小写金额转大写的函数');

frxReport1.OnUserFunction :=frxUserFunction;

(2)在frxUserFunction事件中加载函数

function TFunComm.frxUserFunction(const MethodName: string;

var Params: Variant): Variant;

begin

if UpperCase(MethodName) = UpperCase('MoneyCn') then

Result := MoneyCn(Params[0]);

end;

(3)实现函数(数字转大写)

function MoneyCn(mmje: Double): string;

const

s1: string = '零壹贰叁肆伍陆柒捌玖';

s2: string = '分角元拾佰仟万拾佰仟亿拾佰仟万';

function StrTran(const S, s1, s2: string): string;

begin

Result := StringReplace(S, s1, s2, [rfReplaceAll]);

end;

var

S, dx: string;

i, Len: Integer;

begin

if mmje < 0 then

begin

dx := '负';

mmje := -mmje;

end;

S := Format('%.0f', [mmje * 100]);

Len := Length(S);

for i := 1 to Len do

dx := dx + Copy(s1, (Ord(S[i]) - Ord('0')) * 2 + 1, 2) + Copy(s2, (Len - i)

* 2 + 1, 2);

dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零仟', '零'), '零佰',

'零'),

'零拾', '零'), '零角', '零'), '零分', '整');

dx := StrTran(StrTran(StrTran(StrTran(StrTran(dx, '零零', '零'), '零零',

'零'),

'零亿', '亿'), '零万', '万'), '零元', '元');

if dx = '整' then

Result := '零元整'

else

Result := StrTran(StrTran(dx, '亿万', '亿零'), '零整', '整');

end;

(4) FastReport中引用函数

如:[MoneyCn(<SUM(<frxDBDataset1."M3">,MasterData1,2)>)]

8.在FastReport中将两字段连接起来(用脚本实现)

[Trim(<frxDBDataset1."C2">)+' '+Trim(<frxDBDataset1."C3">)]

9.数据栏的动态调试设置

MasterData根据数据自动设置其高度

(1)首先设置MasterData栏的Stretch为True

(2) 再右键单击MasterData栏的各个字段,选中Stretch to Max Height

即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: