对话框窗口
# 对话框窗口
与通常的报表设计页面一样,您可以在报表中使用对话表单。使用设计器工具栏中的新对话框按钮在通常的报表设计器中创建对话表单:该按钮为报表添加了一个新的对话页面选项卡。切换到对话框页面选项卡时,设计器工作区将更改为显示表单,对象工具栏将更改为显示可以放置在表单上的控件对象:

# 1. 控件
以下是可以使用在对话框中的控件列表。
| 图标 | 名称 | 描述 |
|---|---|---|
| TfrxLabelControl | 文本控件,在对话表格上显示固定文本 | |
| TfrxEditControl | 编辑控件,使用键盘输入文本 | |
| TfrxMemoControl | 多行编辑控件,使用键盘输入多行文本 | |
| TfrxButtonControl | 按钮控件,代表一个按钮 | |
| TfrxCheckBoxControl | 复选框控件,代表一个标志,有两个状态:启用或禁用; 有一个相邻的标签 | |
| TfrxRadioButtonControl | 单选按钮控件,代表一个单选按钮,如表单上使用了此控件则必须有多个 | |
| TfrxListBoxControl | 列表控件,表示可以从中选择一个项目的列表 | |
| TfrxComboBoxControl | 下拉选择列表控件,表示可从中选择一个项目的下拉列表 | |
| TfrxPanelControl | 面板控件,表示可以包含其他对象的面板 | |
| TfrxGroupBoxControl | 分组框控件,表示可以包含其他对象的标记框 | |
| TfrxPageControl | 标签页面控件,表示多个使用标签进行切换的页面 | |
| TfrxDateEditControl | 日期选择控件,表示具有日期条目的下拉日历的字段 | |
| TfrxImageControl | 图像控件,表示BMP,ICO,WMF或EMF格式的图片 | |
| TfrxBevelControl | 边框控件,在表单上显示行和框架的控件 | |
| TfrxBitBtnControl | 图片按钮控件,表示包含图片的按钮 | |
| TfrxSpeedButtonControl | 快速选择按钮控件,表示包含图片的速度按钮 | |
| TfrxMaskEditControl | 掩码编辑控件,使用键盘输入文本并使用掩码遮盖的编辑框 | |
| TfrxCheckListBoxControl | 复选框选择控件,表示通过复选框选择的项目列表 |
关于控件的属性、事件与方法信息请参考FastReport组件帮助文档。
# 2. "Hello World!"报表
在此示例中,我们将创建一个报表,在创建预览之前,使用对话框窗口显示问候窗口。
打开设计器,并在报表中添加一个对话框。在表单上放置TfrxLabelControl和TfrxButtonControl对象。
设置对象属性:
Label:
Caption = 'Hello, World!'
Button:
Caption = 'OK'
Default = True
ModalResult = mrOk
2
3
4
5
6
7
为表单设置BorderStyle = bsDialog属性。控件和表单都具有与控件相同的属性集。
完成对话框设计后,返回到报表设计Page1选项卡,并在页面上放置包含问候语的文本对象。
预览报表,您将看到对话框:
单击[OK]按钮后,对话框将关闭,并构建并显示报表。如果通过单击系统菜单[X]按钮关闭对话框,则不会构建报表。 FastReport的工作方式如下:如果报表中有对话表单,则仅在使用ModalResult = mrOk关闭每个对话框后构建报表,即在此示例中单击[ОК]按钮。这就是为什么按钮的ModalResult属性必须设置为mrOk。
# 3. 输入参数并将参数传递至报表
接下来让这个例子做的复杂一些,以展示如何将对话中输入的值传输到报表中。修改对话框如下:
在报表Page1上放置一个包含此文本的文本对象,并将其AutoWidth设置为True。在文本对象中输入的内容如下:
您输入的内容为:
[Edit1.Text]
2
预览报表并确保在报表中成功显示输入的文本。可以以类似的方式访问对话中的其他对象。由于每个对象的名称在整个报表中都是唯一的,因此可以在同一报表中的任何位置使用。
# 4. 与控件交互
通过使用脚本,复杂的逻辑可以合并到对话的操作中。让我们用一个简单的例子来说明这一点:修改表单如下:
双击CheckBox对象以创建OnClick事件处理程序并输入以下脚本:
procedure CheckBox1OnClick(Sender: TfrxComponent);
begin
Button1.Enabled := not CheckBox1.Checked;
end;
2
3
4
在运行报表时,按钮会响应复选框的状态。
# 5. 几种对话框的形式
让我们看看有两个对话的报表是如何工作的。创建包含两个对话框和一个设计页面的报表:
将[确认]和[取消]按钮的ModalResult属性分别设置为mrOk和mrCancel。
现在运行报表。首先,用户将被要求回答第一个对话(姓名,是否有孩子)的问题,然后点击[确认],打开第二个对话(孩子的名字)。在第二个对话框中单击[确认]后,将构建报表。 FastReport以这种方式处理多个对话:对话以其创建顺序显示; 每个对话框仅在使用ModalResult = mrOk关闭前一个对话框后显示(在本例中,单击每个[确认]按钮)。如果使用[取消]按钮或系统菜单[Х]按钮关闭任何对话框,则会阻止构建报表。
# 6. 管理对话框
在前面的示例中,无论是否勾选是否有孩子?,都会显示第二个对话框。让我们展示如何在未选中此标志时隐藏第二个对话框。在第一个对话框上为[确认]按钮创建一个OnClick处理程序(双击按钮创建处理程序):
procedure Button1OnClick(Sender: TfrxComponent);
begin
DialogPage2.Visible := CheckBox1.Checked;
end;
2
3
4
如果未选中该选框,则此代码隐藏第二个对话框(DialogPage2)。预览报表以查看其是否正常工作。
管理表单的另一种方法是使用OnRunDialogs报表事件。要创建此事件处理程序,请在报表树或对象检查器中选择报表对象,然后切换到对象检查器中的事件选项卡。双击OnRunDialogs事件以创建处理程序:

在处理程序中编写以下代码:
procedure frxReport1OnRunDialogs(var Result: Boolean);
begin
Result := DialogPage1.ShowModal = mrOk;
if Result then
begin
if CheckBox1.Checked then
Result := DialogPage2.ShowModal = mrOk;
end;
end;
2
3
4
5
6
7
8
9
处理程序的工作方式如下:显示第一个对话框:如果通过[确认]按钮关闭,则查看CheckBox1的状态:如果此状态为Checked,则显示第二个对话框:如果第二个对话框通过[确认]按钮关闭则将Result设置为True。如果处理程序返回Result=True然后构建预览;如果Result=False,则报表停止运行而不构建预览。