zoukankan      html  css  js  c++  java
  • ReportMachine

    RM(Report Machine)是一个功能强大的Delphi报表控件包。使用它可以制作出非常复杂的报表。下面讲述最简单的用法:

    在Form上放上两个数据库控件:ADOConnection和ADOQuery
    设置好ADOConnection的ConnectionString。LoginPrompt=False。
    ADOQuery的Connection指向ADOConnection。
    ADOQuery的SQL设置好数据查询语句。

    在Form上放上两个RM报表控件:RMDBDataSet和RMReport。
    RMDBDataSet的DataSet指向ADOQuery。
    RMReport的DataSet指向RMDBDataSet。

    (如果想使最终生成的应用程序具备报表设计能力,还需要放上RMDesigner控件,不需要设置任何属性)

    双击RMReport控件,开始设计报表模板。

    对于一般比较规则的报表,只需向模板中加入四个Band对象,分别是:
    1)、页标头:通常用来显示报表名称,时间等
    2)、主项标头:通常用来显示栏目名称。
    3)、主项数据:用来显示数据。
    4)、页注脚:用来显示页号,日期等。

    设计好的模板可以保存在DFM中,也可以保存到独立的模板文件中,扩展名为RMF,运行时调入。下面给出几个代码片断:

    procedure TBrowseForm.Button5Click(Sender: TObject);
    var
    RMReport:TRMReport;
    begin
    if ADOQuery1.IsEmpty then
    Exit;
    try
    RMReport := TRMReport.Create(Self);
    RMReport.LoadFromFile('Match.rmf');
    RMReport.PrepareReport;
    RMReport.ShowReport;
    finally
    RMReport.Free;
    end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    RMReport1.ShowReport;
    end;

    // 设计报表模板
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    RMReport1.LoadFromFile('TTT.rmf');
    RMReport1.DesignReport;
    end;

    对于大多数规则的报表,以上知识就足够了。但这只是RM最简单的用法,远远没体现出RM功能的强大。

    RM有两个吸引人的功能是我目前最需要的:

    1)、数据可以来自数据库,也可以来自其它任何地方,如文件中、内存中等。
    2)、不一定需要预先制作好模板,可以在运行时刻通过代码生成模板,这对于数据中字段个数不定的情况非常有用。

    RM虽然功能强大,但用起来并不觉的很复杂,它是我见过的为数不多的报表控件中最好的一个。

    1.对于一张纸要两面打的报表你有什么好办法?
    打印时可以选择打奇数页还是打偶数页。
    2.怎么能在一个页面中打印固定的条数,另外最后一页记录不够时怎么打出空白的格子出来啊.
    固定条数:设置LinesPerPage
    空白格子:设置AutoAppendBlank=True
    3.怎样屏蔽双击报表进入设计报表的界面?
    RMReport1.ModifyPrepared := False
    4.怎样在报表中增加表合计???
    可以放在标题栏,页面设置中选"两遍报表"
    汇总框的TotalCalc=True即可
    5.我想用代码把参数传递给报表中的某一个TRMMemoView该怎么做?
    RMReport1.FindObject(‘Memo1‘).Memo.Text := ‘ddddd‘
    或者
    RMVariables[‘a1‘] := ‘ddddd‘; //这样就可以在报表中使用变量‘a1‘了。
    6.如何能够不打印重复内容?
    Suppres=True
    7.如何让打印预览时双击不能进入报表编辑器!
    设置RMReport.ModifyPreview=False
    8.如何在报表程序中控制MEMO的边框是否显示
    在delphi中:
    memo1.LeftFrame.Visible := False
    memo1.TopFrame.Visible := False;
    memo1.RightFrame.Visible := False;
    memo1.BottomFrame.Visible := False
    在报表的script中
    memo1.FrameTyp := 15; //这个参数多试几次就知道如何设置了
    FrameTyp := 0; //不显示
    9.怎样改变page的名称和控制它显示但不打印
    可以,在Page1的OnBeforePrint中
    begin
    Page1.Visible := True;
    Page1.Visible := False; //不显示
    end;
    10.Report Machine中,如何强制每3行一个表格
    设置主项数据栏:LinesPerPage=3
    如果三人一行有办法:设置主项数据栏的Columns=3
    用分组打印,分组条件: NowLine > 3
    在分组标头的OnBeforePrint:
    begin
    NowLine := 1;
    end;
    在主项数据的OnBeforePrint:
    begin
    NowLine := NowLine + 1;
    end;
    11.能否只显示分组统计值而不显示分组数据?
    可以,设置主项数据栏:Visible=False
    统计框:CalcNoVisible=True
    12.能否只对超过长度的单条记录进行折行?
    可以,设置文本框:Stretched=True; wordwrap=True
    设置文本框所在的栏:Stretched=True; Breaked=True
    13.如何实现打印预览的问题
    RMReport1.LoadFromFile(‘c:1.rmf‘); //读入报表
    RMReport1.ShowReport; //预览
    RMReport1.PrintReport; //打印
    RMReport1.DesignReport; //设计
    14.请问如何在程序中控制:1、纵向打印还是横向打印。2、分组标头是否每组换页。
    1.RMReport1.Pages[0].ChangePaper()
    2.RMReport1.Pages[0].FindObject(分组标头栏名).Prop[‘NewPage‘] := False;
    15.直接打印的方法是什么?
    RMReport1.ShowPrintDialog := False;
    RMReport1.PrintReport;
    16.页边距改变以后,所有控件应该相应的改变位置。
    需要在页面设置中不选"缩放到可打印区域"页面居中或
    RMReport1.Pages[0].pgMargins := ; //这样试试
    17.如何从导入一个rtf文件作为TRMFormReport的PageHeader
    var
    TempStream : TMemoryStream;
    begin
    TempStream := TMemoryStream.Create;
    RichEdit1.Lines.SaveToStream(TempStream);
    TempStream.Position := 0;
    RMFormReport1.PageHeader.Caption.LoadFromStream( TempStream);
    TempStream.Free;
    end;
    18.怎样确定报表模版目录?
    设置TRMDesigner的TemplateDir
    19.我想动态设"虚拟数据集"该怎么设!
    (RMReport1.FindObject(‘Band1‘) as TRMBandView).DataSet :=‘RMDBDataSet1‘;
    20.在程序中
    RMVariables[‘aaa‘] := form1.Caption;
    在报表中就可以使用变量‘aaa‘
    21.左边距:
    CurReport.Pages[0].pgMargins.Left := Round(RMConvertToPixels(毫米 * 10, rmsuMM))
    22.RMVariables[‘品牌‘] :=True;
    RMVariables[‘品名‘] :=‘计算机‘;
    在Page1的OnBeforPrint事件中的代码如下:
    If 品牌 Then
    MessageBox(品名);
    23.每页只打10条记录怎么处理啊?主项数据栏LinePerPage=10
    24.怎么实现主项数据的统计啊???
    最好用栏目注脚栏,在上面放统计框,然后设置CalcType即可
    25.动态生成报表时,RM的页边距如何设定?
    TRMPage.pgMargins := Rect(30, 30, 40, 40);
    26.如何在程序运行时,在一个预览或者打印窗口中,一次打开多个报表文件
    用TRMCompositeReport,
    RMCompositeReport1.Reports.Clear;
    RMCompositeReport1.Reports.Add(RMReport1);
    RMCompositeReport1.Reports.Add(RMReport2);
    RMCompositeReport1.ShowReport;
    27.rm如何进行套打
    Page1不是有个BackGroundPic属性吗,这个就是专门做套打的
    28.GridView1 能象Microsoft Excel
    实现 a3=a1+a2吗?
    可以,a3内容
    [memo1.CalcValue + memo2.CalcValue]
    29.
    使用总页数,将CalcMemoView放在页头,组头,栏目头时需要选择"两遍报表",对打印没影响,只打印一遍.
    30.如何打印中括号如: [2002]
    在memoview的OnBeforePrint中
    begin
    memo := ‘[2002]‘;
    end;
    或者把‘[‘,‘]‘定义成变量:
    RMVariables[‘a1‘] := ‘[‘;

    RMVariables[‘a2‘

    report machine开发使用手册-创建报表2010-02-10 13:08

    创建报表:

    创建一个报表由下面几步组成:

    1、选择数据:选择报表中用到的数据源

    2、设计报表模板:利用区域(称为Band)将报表分布不同的部分,决定报表样式。

    3、处理:用报表内置脚本语言或在delphi中对报表中用的的数据,报表模板等进行处理

    4、生成报表:根据报表模板+数据源,生成最终的报表。

    选择数据源:

    大多数报表需要的数据都是来自数据库。TTable和TQuery组件可以作为报表的数据源。总的来说它可以使用任何一个从TDataSet组件继承的子类。每个报表中用到的TDataSet都要有一个与之对应的TRMDBDataSet。

    除了TDataSet,ReportMachine页可以使用任何数据源(数组,文件,字符网格等等)。在这种情况下,程序必须自己控制非数据库源的存取。你可以用TRMUserDataSet方便地把数据传送到报表中。

    设计报表模板:

    报表模板本身就是描述怎样可以看到正确的报表。每个报表模板由多个区域组成,ReportMachine把这些区域称为"Band"。有两种类型的Band:固定区域Band(比如报表标题,页标头,页注脚等等)和用于显示数据集中所有记录的Band(比如主项数据栏)。数据Band需要联接到数据源,内容是数据源中的记录。

    在ReportMachine中提供了报表开发的可视化环境(报表设计器,这个设计器也可以提供给你的End User,以方便你的End User自己修改报表模板)用于创建报表。报表设计器功能强劲,简单又易于使用。报表设计器的界面由带有浮动的工具栏,可以自由地改变它们的位置,使用对象观察器(Objects Inspector)可以控制对象的属性,类似于Delphi IDE中的那个。

    处理:

    在生成报表的时候,需要对输入的数据进行某种处理(比如格式化),报表模板需要某些修改(比如报表模板中某个文本框需要改变字体)。

    实现这个处理可以在Delphi中的TRMReport的事件处理中编写代码,这个方法并不通用,因为它不允许在Delphi外创建报表而无需重新编译。这就是为什么在ReportMachinet中内置脚本语言,ReportMachine的内置脚本语言非常类似于Object Pascal,功能强大。用这个脚本语言编写事件处理代码,这就可以让你创建复杂的处理而无需在Delphi中编写代码,配合报表设计器,不需要修改某个报表而重新编译项目。可以实现报表于你的项目分离。

    报表脚本例子:

    unit Report;

    interface

    procedure Memo1OnBeforePrint(Sender: TObject);
    implementation

    procedure Memo1OnBeforePrint(Sender: TObject);
    begin
    Memo1.Text := 'test';
    end;

    procedure Main;
    begin

    end;

    end.

    生成报表:

    生成报表是ReportMachine根据报表模板,对数据源进行加工处理生成最终的报表并能在点击“预览”按钮后进行预览的过程。在ReportMachine中准备好的报表是一组对象的集合,描述报表处理后各页面所包含的内容。这允许你可以修改生成的报表页面,通过在设计器中调用所需的页面。除此之外,还可以描述在预览窗口中鼠标点击对象的反应。这将让你更容易地组织你的工作(在一个报表对象点击可以产生一个更详细的新报表)。

    在ReportMachine的预览窗口类似于Microsoft Word:在一个窗口中可以看到多个页面,并且可用用鼠标拖动,需要的话,可以通过双击调出编辑器修改当前页。

    转载自:http://blog.sina.com.cn/s/blog_48fb29010100yvj9.html

  • 相关阅读:
    Docker容器启动时初始化Mysql数据库
    使用Buildpacks高效构建Docker镜像
    Mybatis 强大的结果集映射器resultMap
    Java 集合排序策略接口 Comparator
    Spring MVC 函数式编程进阶
    换一种方式编写 Spring MVC 接口
    【asp.net core 系列】6 实战之 一个项目的完整结构
    【asp.net core 系列】5 布局页和静态资源
    【asp.net core 系列】4. 更高更强的路由
    【Java Spring Cloud 实战之路】- 使用Nacos和网关中心的创建
  • 原文地址:https://www.cnblogs.com/lzjlv/p/3799540.html
Copyright © 2011-2022 走看看