报表设计基础
# 报表设计基础
FastReport设计器将报表(报告)表示为原理图页面的集合。 对象放置在报表(报告)页面上的任何位置,用于定义报表(报告)的外观并显示各种信息,例如文本和图形。 标准软件包中包含的FastReport对象有:
图标 | 名称 | 说明 |
---|---|---|
插入数据段 | 设计页面上根据其类型表现的区域(例如标题数据段,数据数据段) | |
文本对象 | 在矩形区域内显示一行或多行文本 | |
图片对象 | 以BMP ,JPEG ,ICO ,WMF 或EMF 格式显示图形文件 | |
系统文本 | 显示系统信息(日期,时间,页码等)或合计值等 | |
子报表对象 | 允许在宿主页面中插入另一个报表设计页面 | |
绘制 | 显示各种几何形状(对角线,矩形,圆角矩形,椭圆形,三角形和菱形) | |
图表对象 | 以各种图表格式(饼图,直方图等)显示数据 | |
富文本对象 | 以RTF(富文本)格式显示文本 | |
复选框对象 | 显示带有打勾或叉号的复选框 | |
条形码对象 | 根据数值显示条形码或者二维码的组件 | |
交叉表对象 | 显示交叉数据表的对象,数据通过手工或者脚本引入 | |
DB交叉表对象 | 显示交叉数据表的对象,数据来源于数据库的字段 | |
图表对象 | 显示图表数据的信息 | |
渐变色对象 | 作为背景使用,显示渐变的颜色 | |
条形码对象 | 用作显示条形码或者二维码的对象 |
Flying中包含的扩展对象如下:
图标 | 名称 | 说明 |
---|---|---|
邮政编码对象 | 用于展示邮政编码类型的对象 | |
网格文本对象 | 金融应用中使用较多,使用方式与文本对象类似 | |
地图对象 | 用于展示地图等相关信息的对象 | |
仪表对象 | 用于展示仪表等相关的功能 | |
间距标尺仪表对象 | 用于展示包含间距测量功能的仪表 | |
最常用的基本对象是数据段和文本对象。 您将在本节详细了解它们的功能。
# 1. HelloWorld报表示例
示例报表(报告)仅包含一条信息:“ Hello,World!”。 打开报表设计器,然后单击对象工具栏中的“文本对象”按钮。 将鼠标光标移到页面上,然后再次单击。 该对象将插入到鼠标位置。
文本编辑器窗口将立即打开; 如果它没有自动出现,则双击该对象。 可以在设计器设置中配置文本编辑器的打开。 输入“ Hello,World!”,然后单击[确定]
按钮。
报表(报告)设计完成。 要预览报表(报告),请选择[文件]
-[预览]
菜单项,或单击工具栏中的相应按钮。 将出现预览窗口,其中包含带有“ Hello,World!”文本的报表(报告)页面。 该报表(报告)可以打印出来,可保存到文件(* .fr3)或导出为支持的导出格式。
# 2. 文本对象
# 2.1. 基本使用方式
文本对象具有许多功能。 它可以在框架中显示文本并用一种颜色填充。 可以使用任何大小和样式的任何字体显示文本。 可以在工具栏上直观地设置所有属性。以下是一些文本设计示例:
现在,让我们看一下该基本对象的其他功能。 例如,让我们创建一个新的文本对象以显示两行文本:
This is a very, very, very long text line.
And this is another line, the shorter one.
从工具栏启用对象边框,然后使用鼠标将对象调整为最大9x3cm的大小。 我们看到对象不仅可以显示一行,而且可以显示多行文本。 现在将对象宽度减小到5厘米。 显然,长文本不适合边框内容,因此被换行了。 这是由WordWrap
对象属性控制。 如果禁用该功能(在对象查看器中或通过对象上下文菜单),任何长行都将被裁切。
现在,让我们看看对象内部的文本对齐方式是如何工作的。 对齐按钮位于文本格式工具栏中,用于控制水平或垂直文本对齐。 注意两端对齐按钮,该按钮可让您将段落对齐到对象的两个边缘。为此,必须启用WordWrap
。
对象中的所有文本都可以旋转到0..360°范围内的任何角度。 文本格式工具栏中的[文本方向]
按钮可让您快速将文本旋转到0、45、90、180或270°的预设值。 对于任何其他值,请在对象查看器的Rotation
属性中设置所需的角度。 如下图所示,将文本旋转到90、180或270°以外的角度时,文本可能会被对象的边框切断。 要解决此问题,请稍微增加对象高度,以使所有文本都适合对象。
让我们简要地看一下影响其外观的其他文本对象属性。 这些属性大多数仅在对象查看器中可用:
- BrushStyle: 对象填充的类型
- CharSpacing: 在字符之间进行存储(以像素为单位)
- GapX,GapY: 左右边缘的文本缩进,以像素为单位
- LineSpacing: 行间距,以像素为单位
- ParagraphGap: 段落的第一行缩进,以像素为单位
# 2.2. 在文本对象中使用HTML标签
文本对象可识别一些简单的HTML标签。 标签可以位于对象的文本内。 默认情况下,标签是禁用的,要启用它们,请在对象的右键菜单中选择[允许HTML标记]
,或者在对象检查器中启用AllowHTMLTags
属性。 以下是受支持标签的列表:
<b>:粗体
<i>:斜体文本
<u>:带下划线的文字
<sub>:下标
<sup>:上标
<font color>:字体颜色
<nowrap>:启用WordWrap时未拆分的文本,整个文本移至下一行
2
3
4
5
6
7
请注意,文本对象仅支持少量标签,但这对于大多数应用程序来说已经足够。 无法通过HTML标记修改字体大小或名称。
以下示例将展示如何使用这些标签。
text <b>bold text</b> <i>text in italic</i> <b><i>bold and in italic</b></i>
E = mc<sup>2</sup>
A<sub>1</sub> = B<sup>2</sup>
this is a usual text, <font color=red>and this is a red one</font>
this is a usual text, <font color="#FF8030">and this is an orange one</font>
2
3
4
5
# 2.3. 在文本对象中显示表达式
文本对象的最重要特征之一是它不仅可以显示静态文本,还可以显示表达式。 表达式可以位于与普通文本混合在一起的对象中。 让我们看一个简单的例子。 在对象中键入以下内容:
Hello, World! Today is [DATE].
运行报表时,我们可以得到类似如下信息:
Hello, World! Today is 01.01.2018.
当报表引擎创建报表(报告)并遇到方括号中的表达式时,报表引擎将计算该表达式的值,并将该值插入文本中以代替该表达式。 文本对象可以包含任意数量的与普通文本混合的表达式。 复杂表达式可以包含方括号(例如[1 + 2 *(3 + 4)])。 常量,变量,函数和数据表字段都可以在表达式中使用。 我们将在后面详细了解这些内容。
报表引擎可以自动识别文本中方括号内的表达式。 但是,如果我们的普通文本包含不希望被视为表达式的方括号,会发生什么? 例如,如果我们需要显示以下内容:
a[1] := 10
报表引擎会将[1]
视为表达式并将文本显示为:
a1 := 10
当然,这不是我们想要的。 避免这种情况发生的其中一种方法是禁用表达式识别。 禁用AllowExpressions
属性(或右键菜单中的[允许表达式]
),文本中的所有表达式将被忽略。 在我们的示例中,报表引擎将准确显示我们需要的内容:
a[1] := 10
但是有时文本需要同时包含表达式和带方括号的普通文本,例如:
a[1] := [myVar]
禁用AllowExpressions
可以使我们在所需的位置显示方括号,但同时也禁用对表达式的处理。 在这种情况下,报表引擎允许您使用另一组符号来指定表达式。 默认情况下, ExpressionDelimiters
属性值为[,]
。 在我们的示例中,我们可以使用尖括号代替表达式:
a[1] := <myVar>
必须在 ExpressionDelimiters
属性中设置<,>
,在此属性中需要使用逗号分隔开头和结尾符号。 另一个要求是,开始和结束符号不能相同,因此%,%
将不起作用。 可以使用复数符号,例如<%,%>
。 因此我们的示例可能如下所示:
a[1] := <%myVar%>
# 3. 数据段(显示区域)
数据段用于将它们包含的对象放置在输出页面上的特定位置。 将对象放在PageHeader(页首)
区域中时,我们告诉报表引擎,给定的对象必须显示在完成的报表中每个页面的顶部。 同样, PageFooter(页尾)
区域中的对象显示在每个页面的底部。 让我们用一个例子来证明这一点。 我们将在页面顶部创建一个包含“ Hello!”的报表(报告),其右侧为当前日期,在页面底部的右侧为页码。
打开报表设计器后 您将看到一个报表(报告)模板,首先使用报表设计器插入三个区域:“ ReportTitle”(报表抬头),“ MasterData”(主数据)和“ PageFooter”(页尾)。 让我们先暂时删除“ MasterData”区域(单击该区域内部或其标题上的任何可用空间,然后使用右键菜单中的[删除]
或按下Delete按键将其删除)。 现在,我们添加一个新的数据段(“ PageHeader(页首)”)。 单击对象工具栏上的[插入数据段]
按钮,然后从下拉列表中选择[页首]
”。 我们看到一个新的数据段被添加到页面。 同时将现有数据段下移。 报表设计器自动在页面上放置区域(标题区域在顶部,数据区域在中间,页脚在底部)。
现在,我们添加一些对象。 在“ PageHeader”区域中添加一个系统文本对象,然后在其编辑器中,从[变量]-[系统变量]
的列表中选择、DATE
(当前日期也可以通过文本对象显示) 在其编辑器中会键入[DATE]
。 接下来,将一个包含“ Hello!”的文本对象添加到“ ReportTitle”区域。 将显示页码的文本第[<Page>]页 共[<TotalPages>]页
对象添加到“ PageFooter”区域。注意在报表-选项
中要勾选两遍过程
,否则文本的总页数不显示。
运行报表(报告)时,您将看到完成的报表(报告)中的对象被打印在页面上的适当位置。
数据段负责在页面上定位对象。 根据数据段的类型,我们可以在页面顶部或底部以及第一页或最后一页上打印对象。 大多数报表(报告)中需要的基本范围如下:
- PageHeader(页首): 显示在每页的顶部
- PageFooter(页尾): 显示在每页的最底部
- ReportTitle(报表抬头): 显示在第一页的顶部-可以在“ PageHeader”区域之前或之后,具体取决于页面的
TitleBeforeHeader
属性(在单击页面上的任何可用空间后在对象检查器中找到 ) - ReportSummary(报表合计): 显示在报表(报告)末尾的空白处
# 3.1. 数据数据段
现在,我们将学习如何从数据库表中打印数据。数据库表由组织成行(记录或行)的数据组成,其中包含一个或多个列(字段)。 为了打印这些数据,FastReport使用一种特殊的数据段,将各种数据段命名为... Data
。 要打印整个表格或其中的某些行和字段,必须将一个或多个这些数据段添加到报表中,将它们连接到表格并将字段对象放在其中。 当FastReport生成报表(报告)时,数据段区将被打印在输出页面上,表中的每个记录都会输出一次。 如果数据段的输出页面上没有剩余空间,则报表引擎将创建一个新的输出页面以继续接上页进行输出。
# 3.2. 导入数据集
为了使数据集(及其连接的数据)可用于报表,必须启用报表中使用的所有数据集。 通过FastReport设计器中的[报表]
-[数据...]
菜单项执行此操作,在打开的对话框中选择所需的数据集。
# 3.3. 在文本对象中显示数据库字段
如您所见,文本对象除可以显示数据库中的数据以及静态文本和表达式外,还可以通过两种方式完成此操作:通过将指向数据库字段的链接放在对象文本中,或者通过对象的 DataSet
和 DataField
属性将对象连接到所需字段。 第一种方法适用于在同一对象中同时显示字段内容和限定文本。 例如:
物料代码:[dts1."FItemCode"]
指向数据库字段的链接需要特殊的语法:[datasetname.“fieldname”]
。 字段名称(以及数据集名称)可以包含空格,但点和引号符号之间不能有任何空格。
此外,我们还可以将计算操作应用于表达式中的字段,如下所示:
物料代码: [<dts1."FInterID"> * 1]
请注意必须使用方括号和尖括号。 请记住,默认情况下使用方括号来分隔对象文本中的表达式。 如有需要,方括号可以替换为其他任何打开/关闭字符对(请参考在文本对象中显示表达式)。 表达式内部使用尖括号来描述FastReport变量或数据库字段。 逻辑上我们应该写:
物料代码:[<dts1."FItemCode">]
而不是
物料代码:[dts1."FItemCode"]
但是,这两种表示法都是正确的,因为FastReport不需要尖括号,其中表达式仅包含变量或仅包含数据库字段。 在所有其他情况下,都需要使用尖括号。
# 4. 变量
在上述示例中,数据集名称和字段名称均为数据表中指定的内容,对于制作报表来说可能会难以理解,在SQL中可以使用别名的方式使数据集中的字段名称便于理解,这种方式也可以用在FastReport的数据集构建过程中,除此之外,FastReport还有另一种方法可以帮助报表设计者为数据库字段和其他信息元素设置更易理解的名称。数据库字段名称或任何表达式都可以与变量关联。要在FastReport中创建和使用变量,请选择[报表(报告)]
-[变量...]
菜单项。
FastReport中的变量列表具有两级结构。第一级仅包含类别,第二级包含变量本身。当变量列表很长时,此变量分类很方便。变量列表必须至少包含一个类别,这意味着变量不能位于顶层。此外,类别名称不能包含在报表中,因此列表中的每个名称都必须是唯一的。
让我们通过以下示例来说明变量的用法。假设我们有两个数据源:第一个是带有FItemCode
和FItemName
字段的dts1
,来源于FastERP
数据库中的Basic_Item
表,第二个是带有FCompanyCode
和FCompanyName
字段的Basic_Company
表。我们可以将以下变量列表与字段相关联:
公司
公司编号
公司名称
物料
物料编号
物料名称
2
3
4
5
6
其中“公司”和“物料”是两个类别。打开变量编辑器,并使用[类别]
,[变量]
和[编辑]
按钮创建此结构。

工具栏中分别为类别、变量、编辑、删除、列表、导入、导出、取消、确定按钮。
也可点击工具栏中的第五个按钮[列表]
,在出现的字串清单界面快速设计类别与变量目录。
要将变量链接到数据库字段,请选择一个变量,然后在右侧窗格中双击所需的字段。数据库字段的链接将显示在底部窗格中。此时变量已与此表达式关联,因此变量的值成为表达式的值。如有必要,可以手动编辑或修改表达式,并且可以在其中使用任何FastReport函数或其他变量。请记住,类别不得与任何表达式关联。
创建变量列表后,关闭变量编辑器。现在我们可以将变量插入报表中。与数据库字段相比,插入方法较少。我们可以通过键入[物料名称]
将变量手动插入对象文本中,也可以将变量从数据树窗格拖到报表页面上,在这种情况下,请切换到变量选项卡窗格。
让我们回顾一下到目前为止所学到的知识点:
- 报表(报告)设计由设计页面组成
- 页面可能包含报表对象,可以放置在页面上或在数据段内
- 数据段是设计页上的占位符,并根据数据段类型控制它们包含的对象在输出页上的显示位置
- 文本对象包含我们要在给定位置输出的文本,它们可以多行显示,并且可以包含静态文本,数据字段,变量,表达式或所有这些的组合
- 数据类型数据段(主数据、明细数据、子明细数据),当连接到数据集时,会控制这些数据段出现(行)的次数,并与报表引擎一起确定报表输出的完成页面数。注意:即使这些数据波段可能具有诸如“主数据”,“明细数据”之类的类型,但这仅是数据段在输出页面上的分层位置的位置关系。实际的数据关系取决于所连接的数据集中的表/查询关系。每个数据数据段都需要一个单独的或等效的数据集来关联。
# 5. 图片对象
使用此对象,您可以插入图表,照片或任何其他图片信息。 该对象可以显示“ BMP”,“ JPEG”,“ ICO”,“ WMF”或“ EMF”格式的图形。
让我们看一下该对象的功能。 在报表页面上放置一个图片对象。 如果图片编辑器没有自动打开,则双击“图片”对象。 您可以从图形文件中加载任何图片,也可以清除现有图片并通过单击绿色的勾来关闭编辑器。

对象的某些属性在右键菜单以及对象查看器中可用:
- AutoSize: 自动大小
- Stretch: 伸缩,默认启用
- Center: 中间
- KeepAspectRatio: 保持纵横比率,默认启用
仅在对象查看器中可用的一个属性是FileLink
,输入文件名(例如c: picture.bmp)或包含文件名的变量(例如[picture_file]),将在运行报表时从命名文件中加载图片。
像FastReport中的许多对象一样,图片对象可以显示来自数据库的数据。通过在对象检查器中设置DataSet
和DataField
属性,可以将该对象连接到数据库字段。与文本对象相反,这是将对象连接到其数据的唯一方法。
# 6. 多行文字显示优化
在实际的报表操作中,有时可能会遇到需要打印备注的情况,如果需要打印备注,需要在报表中添加该字段来更新报表(报告)。
乍一看,这似乎很容易-在现有对象之间的数据数据段中添加一个文本对象,将其连接到注释(FastERP中注释字段名为FNote
)字段,并将对象的大小设置为一个固定数值。但是,报表(报告)预览并不是我们想要的:FastReport完全按照指示执行。 注释字段包含长度可变的多行文本,但是显示该字段信息的文本对象具有固定大小。这就是为什么某些行似乎被切断的原因。
当然,可以增加对象的大小或减小其字体的大小。但是,这可能会导致输出页面上的空间浪费,因为有些备注信息可能会很长,有些会很短。FastReport提供了一些属性用来解决这个问题。
这些属性允许数据段或对象自动调整其高度,为给定记录(行)创建必要的空间。为此,我们只需要启用数据段和文本对象的Stretch
属性。但是,这还不够,因为文本较长的文本对象应该能够自行拉伸,因此我们还需要设置其他一些属性。
文本对象可以自动设置其高度和宽度,以为其内容腾出空间。可以使用AutoWidth
和StretchMode
。AutoWidth
允许文本对象改变其宽度,以使所有行都留出空间而不会拆分任何单词。当一个对象只有一个文本行并且向右增长不会影响其他对象时,此模式很有用。 Stretch
属性允许对象的高度增加以容纳文本,而无需更改对象的宽度。 Stretch
有几种模式可以在对象检查器中选择:
- smDontStretch –不拉伸对象(默认)
- smActualHeight –拉伸对象,以便为整个文本腾出空间
- smMaxHeight –拉伸对象,使其底部到达放置对象的区域的底部,我们将在以表格形式展现数据介绍此模式
在这里,我们对文本对象的属性感兴趣。通过对象查看器将StretchMode
设置为smActualHeight
启用它。同时启用数据段的Stretched
属性。预览报表(报告),并确保现在一切都按预期进行。

如您所见,在构建报表时,FastReport使用数据填充对象,并在启用拉伸的情况下拉伸对象。然后计算数据段的高度,以便每个对象都有足够的空间。如果禁用了数据段的拉伸属性,则不会执行此高度调整,并且频段将以设计中设置的高度显示。在这种情况下,我们将看到具有较长文本的对象仍将被拉伸,但是数据段不会被拉伸,这会导致文本覆盖。
# 7. 数据分隔
让我们看一下上图中显示的报表(报告)内容显示区域的特别之处:页面底部有很多空白。 为什么会出现这样的情况?创建报表(报告)后,FastReport引擎将数据段填充页面的空白区域。 显示每个数据段后,当前位置向下移动。 当FastReport发现没有足够的空白显示下一个区域时(其高度大于页面上剩余的空白),FastReport会创建一个新页面并从此处继续显示。
报表(报告)包含一个大文本的对象的数据段,这就是数据段高度很大的原因。 此外,如果较大的数据段区在页面上没有足够的空间显示,则将其移至下一个数据段区,从而在页面底部留下大量未使用的空间。
为了减少纸张浪费,我们需要使用FastReport中的一个功能,该功能可以根据数据段的内容制作段落。 我们需要做的就是启用MasterData 数据段的AllowSplit
属性。 您将看到报表(报告)页面底部的空白越来越少:
此数据段拆分如何工作? FastReport中有一些对象支持此功能。 它们是文本对象和Rich文本(富文本)对象。 它们可以拆分,而其他对象则不能。 当FastReport需要拆分数据段时,它会通过以下方式进行拆分:
- 显示在空白区域有空间的不可拆分对象
- 部分显示可拆分的对象(文本对象以对象中所有行都有空格的方式显示)
- 创建一个新页面并继续显示对象
- 如果不可拆分的对象在空白区域中没有空间,则将其移至下一页; 同时,位于其下方的所有对象均根据需要移动
- 该过程一直持续到所有数据段对象都完全显示为止。
以下示例为拆分的具体过程分析:
分割算法并不完美,最终输出可能与预期不符。 如果分割数据段上的对象以复杂的方式分组和/或它们的字体大小不同,则应非常谨慎地使用此选项。 这是可能生成的示例:
# 8. 对象的文字换行
在某些报表设计中,可能需要文本来包裹其他对象(通常在使用图片时)。 让我们在当前示例中演示FastReport如何做到这一点。
在下方的数据数据段中再添加一个文本对象。示例如下所示:
我们将为[Bio."Notes"]
对象禁用拉伸,并为底部对象启用拉伸。使文本从[Bio."Notes"]
对象“流动”到底部,在对象查看器中设置[Bio."Notes"]
对象的FlowTo
属性,这是一个下拉列表。从此列表中选择底部对象的名称。结果报表(报告)将如下所示:

生成报表(报告)时,如果文本不适合顶部对象,则多余部分将移至底部对象。通过将两个对象排列在图片周围,可以实现文本环绕效果。
请注意: 在插入链接的对象之前,必须在报表中插入主要对象,否则文本流动可能无法正常工作!如果发生这种情况,请选择链接的对象,然后使用[编辑]
-[置于顶层]
菜单项将其置于最前。
# 9. 以表格形式展现数据
有时有必要以框架表的形式来显示数据。要在FastReport中创建这种类型的报表(报告),只需为位于数据数据段中的对象启用框架即可。 让我们用一个示例来演示框架的几种变体。
创建与此类似的报表(报告):
将文本对象并排放置在数据段上,并最小化数据段的高度。
第一种也是最简单的表具有完整的单元框架。 为此,请为每个对象启用所有框架线(位于Frame.Typ
属性中):
再次通过设置Frame.Typ
属性,框架仅绘制水平或垂直单元格线:
最后,要仅在表上绘制外部框架,需要对报表(报告)进行修改:
可以看到,我们添加了两个文本对象,一个在页首,另一个在页面页脚区域中。 启用了沿数据数据段边缘的对象的适当框架线,结果报表(报告)如下所示:
所有这些示例都包含大小固定的数据段。 伸展数据段时如何显示表格? 让我们通过一个例子来解释。 在我们的报表(报告)中添加一个新字段FNote
。 正如您已经了解的那样,必须为此对象以及对象所在的数据段都启用Stretch
属性,以便更改数据段高度,具体取决于文本对象中文字的大小。 生成的报表(报告)如下所示:

这与我们需要的有所不同。如果相邻对象的框架也拉伸,则看起来会更好。 FastReport可以轻松解决此问题。 在对象查看器中,将所有要拉伸的对象的StretchMode
属性设置为smMaxHeight
,FastReport引擎将首先计算最大带高度,然后在启用拉伸的情况下拉伸对象到数据段的底部边缘。 由于对象框架与对象一起伸展,因此报表的外观会发生变化:

# 10. 标签报表(显示顺序)
与表格类型的报表(报告)相比,其他报表(报告)(例如标签报表(报告))可能会将数据安排在一个字段的另一字段下。 让我们看一看此类报表(报告)的示例,该示例显示有关物料的数据,如前一个示例所示。 报表(报告)数据以标签形式显示,并具有以下结构:
预览效果如下:
请注意,页面右侧有很多空白。 要使用整个页面,可以在报表(报告)页面设置中设置显示数据的列数。 为此,请双击设计页面上的空白区域,或使用菜单上的[文件]
-[页面设置...]
。
在对话框的[其他选项]
选项卡上设置栏数,栏间距和位置。 在我们的示例中,栏数需要设置为3,FastReport会自动调整其他选项。 列框架在设计器中显示为垂直细线:
现在可以通过以下方式创建报表(报告)。 只要页面底部有空白,FastReport就会重复主数据数据段。 之后,将在同一页面上创建一个新列,并且数据数据段将从新列的顶部开始重复:这与简单报表形成对比,在简单报表中,将创建一个新页面而不是一个新列。 当第二列被填充后,将创建第三列,依此类推-我们的示例中有三列。 当所有列都填满后,FastReport将创建一个新页面并继续从第一列开始显示数据。
我们的三列报表(报告)如下所示:
对象查看器中可用于所有数据数据段的Coloums
属性是设置列数的另一种方法。 但是,如果将此属性从零更改,则仅针对所选数据数据段而不是整个页面设置列数(如上例所示)。 效果是首先从“从左到右然后从上到下”显示数据,这与上面显示的“从上到下然后从左到右”输出相反。
在[页面设置]
对话框中禁用列(将[栏数]
设置为1),然后在数据数据段的Coloums
属性中输入3。 请注意,ColumnWidth
属性也必须从默认值零更改,以防止第2列第3列与第1列重叠; 也可以选择更改[栏间距]
属性。 然后,FastReport将列框架显示为虚线:
此设计以“从左到右然后从上到下”的顺序显示数据。
# 11. 子数据段
当标签类型报表(报告)中的一个字段的内容长度可变时,可能会出现问题。 为了在我们的示例中模拟此情况,让我们将[dts1."FNote"]
对象的宽度减小到2.5厘米,并为此对象以及数据段启用 Stretch
属性。 启用所有对象的所有框架线,以使拉伸功能的效果清晰可见。 现在,设计输出如下报表(报告):
在这里,[dts1."FNote"]
字段对象包含很多文本,并被拉伸成多行。 这会使位于其下方的对象向下移动。 发生这种情况的原因是,所有对象的默认ShiftMode
属性均设置为smAlways
,这意味着如果它们上方有可拉伸对象(启用了Stretch
属性的文本对象),则它们将向下移动。 偏移的距离取决于上方对象的伸展程度。
我们不希望在标签上发生这样的事情,我们希望[dts1."FItemName"]
对象也能移动相同的量。 此时我们可以通过使用特殊的FastReport数据段类型(称为子数据段)来实现。 子数据段链接到其父数据段(并显示在其父数据段之后)。 在设计中添加一个子数据段,并将两个文本对象拖到其中,如下所示:
通过在对象查看器中将MasterData 数据段的Child
属性设置为 Child1
,将MasterData 数据段链接到Child 数据段。 现在,每次MasterData 数据段显示时,Child 数据段都将紧随其后显示:
现在,子数据段中的内容完全对齐。要防止子数据段在页面上的空白空间不足(从其父数据段变为“孤立”)的情况下移至下一页,请在对象查看器中启用父数据段的KeepChild
属性。
# 12. 转移对象
您已经了解了smAlways
如何用于ShiftMode
属性。 让我们看一下smWhenOverlapped
。 在此模式下,当上方的对象伸展并与下方的对象重叠时,会发生对象移动。
顶部的三个对象启用了拉伸,底部的三个对象将
ShiftMode
设置为smAlways
。 底部对象仅移动足够远,以为其上方的对象拉伸留出空间:三个顶部对象已启用拉伸,三个底部对象已将
ShiftMode
设置为smWhenOverlapped
。 底部对象移动以为拉伸的对象留出空间,并保持两个对象的间隔:这样就可以创建复杂的报表(报告),特别是在一个对象可能同时与上面其他几个对象重叠的情况下。 在下面的示例中,所有上部对象均包含可拉伸文本,所有下部对象均处于
smWhenOverlapped
模式。 下部对象将始终显示在上方对象附近,而与上方对象中的文本长度无关。
# 13. 主-从数据集报表
到目前为止,我们的示例报表(报告)仅使用一个数据集(“一级数据”或MasterData)来控制数据输出。 这足以从一个数据库表中输出数据。 FastReport还允许设计的报表(报告)最多具有六个数据级别,所有这些数据级别都在一个设计页面上。 此外,通过使用子报表对象可以实现报表(报告)中无限数量的数据级别。 通常,大多数报表(报告)仅需要一个,两个或三个数据级别,很少有大量数据级别。
让我们看看如何设计两个数据级别的报表(报告)。分别使用FastERP
中的两种数据表Basic_CommonDataType
与Basic_CommonData
,分别对应为主-从数据表。将这两个表种的数据制作成为对应的数据集A
、B
。
在报表设计器中,在[报表]-[数据]
对话框中勾选使用的数据源,添加一个主数据
和明细数据
。并在其中设置以下字段内容。
主数据必须放在明细数据上方,否则在生成报表时会产生出错信息。
如果现在执行预览报表,您会发现每个B的列表都没有发生变化,这是因为我们还没有链接相关的属性。双击明细表,在其过滤条件中输入<A."FInterID">=<B."FTypeID">
,即表示的是,在输出这些资料时,只有属于当前分类下的资料才会显示在明细数据中。这是一个需要掌握的重要概念。尽管数据段可以是主数据段或详细类型,但它们仅控制输出页面上数据的定位(显示的顺序和次数)。由条段中的对象显示的数据取决于对象链接到哪些字段以及两个表的外部链接。保存确认后进行预览。

# 14. 数据段的页眉页脚
每个数据段可以具有页眉和页脚。首先输出标题,然后输出数据段中的所有记录,最后输出页脚。以下是页眉和页脚如何在简单报表中工作的示例:
让我们看一个使用两个数据级别的更复杂的例子 - 主数据和详细信息:
如您所见,标头在所有数据段记录之前输出。因此,主数据头在报表开始时输出一次,并且在属于当前主记录段的每组细节段之前输出详细数据头。在输出所有主数据段记录之后,直到属于主记录段和主页脚的细节段组才输出之后输出细节页脚。
使用数据段的FooterAfterEach
属性,我们可以覆盖此行为。将此属性设置为True(您也可以使用数据段的上下文菜单 - 每行后脚注
)在每个数据行之后导致页脚输出。这在设计一些主 -明细报表时可能很有用。如果主数据段的FooterAfterEach
设置为True,则报表将如下所示:
# 15. 多页报表
FastReport报表可以包含多个设计页面。多页设计允许调整每个页面的大小和方向等属性,以及允许在页面上放置对象和数据段的位置。当输出这种类型的报表时,将显示来自第一个设计页面的所有段,然后显示来自第二个页面的段,依此类推。
在设计器中创建新报表时,默认情况下它包含一个页面。您可以通过单击工具栏中的/按钮或选择文件-新页面
菜单命令来添加新页面。然后您会看到设计器中出现一个新页面选项卡:
您可以通过单击页面选项卡轻松切换页面。可以拖动页面选项卡(“拖放”)以轻松更改其打印顺序。可以使用工具栏中的/按钮或选择编辑-删除页
菜单命令删除不必要的页面。您也可以通过右键单击页面选项卡来调用上下文菜单:
报表中的设计页面数量不受限制。通常,附加页面用于标题页,或者在更复杂的报表中,用于来自许多数据源的数据。
以下是创建标题页的简单示例。让我们使用我们之前的报表,它有一个数据级别。向其添加新页面,它将作为第二页添加。通过使用鼠标抓住page2选项卡并将其拖到第一页选项卡page1上,将其移动到报表的前面。这会更改页面顺序。选择新页面并在页面中间放置一个包含“我们的报表”的“文本”对象。这就是所需要的。标题页的报表已完成:

但是,请注意多页报表的一个功能。如果在第二个输出页面的对象检查器中启用了PrintOnPreviousPage
属性,则第二个输出页面的对象将开始在第一个输出页面的空白区域上打印,而不是在新的输出页面上打印。
# 16. RowCount与PageCount属性
有时需要多次显示静态数据,例如在打印“空白”名片或明信片时。为此,数据段具有RowCount
属性,报表页面具有PageCount
属性。
这两个属性控制报表中的段/页重复的程度,而不受报表数据的影响。