译者:Fbilo 猫猫用过的一个利用VFP报表生成PDF的类库,发现VFP9的报表监听器是自己可以定义,只要你能深刻理解其它文件格式的如PDF,XML 你就可以导出任意的报表格式文件。
VFP 9 的重点之一,是增强报表系统。新的和增强的功能的列表相当庞大:多细节带区、在报表设计器中对对象的保护、设计时事件、为对象绝对定位的能力、更多的缩放级别、更好的菜单、以及大量其它内容。这一章详细的探索了这些增强,演示了某些你在过去版本的 VFP 中无法实现的报表,并为后面的两章“扩展报表系统”做铺垫。
VFP 9 中最大的改动之一,是对报表系统的令人难以致信的增强。它包括增强了的报表设计器以及其它设计时增强、包括输出到 HTML 和 XML 的增强了的运行时能力、以及象对多细节带区的支持之类的新引擎功能。在这一章中,我们将对这些领域逐个进行探讨。
对报表设计器的增强
Microsoft 在对报表设计器进行改进的时候有这么几个目标:
- 保护程序员们在已有的报表上的投入;
- 使用一个开放性的架构以使它能够被高度的定制;
- 增强用户界面;
- 提供新的功能:保护、设计时标题、绝对定位、数据环境处理、以及其它内容。
为了实现第一个目标,VFP 开发组为了能确保已有的报表在 VFP 9 中能象它们在过去的版本中一样正常工作而做了巨大的努力。此外,FRX 文件的结构也没有改变(过去一些不用的字段现在在 VFP 9 中派上用场了,同时现在还支持用户自定义字段和用户自定义记录)。
实现一个更开放架构的关键,是一个名为 _REPORTBUILDER 的系统变量和报表事件。报表设计器现在可以在一个设计时事件(比如添加一个字段、或者打开一个对话框)发生的时候调用一个 VFP 应用程序。这个应用程序指定在 _REPORTBUILDER 中,后者默认指向的是在 VFP 主目录下的 ReportBuilder.APP。如果需要,你可以通过设置 _REPORTBUILDER 指向另一个应用程序来使用你自己的报表生成器应用程序。这个主题的详细讨论在第6章“在设计时扩展报表系统”中。
让我们先讨论余下的两点。
增强用户界面
你在 VFP 9 报表设计器中,你会首先注意到的事情之一,是极大得被增强了的对话框。在 VFP 8 及以前版本中,有许多与报表相关的对话框、各种对象和带区的属性对话框、一个报表的页设置对话框、数据分组和变量对话框、等等。它们中的一些有着非常少见的界面、而另一些则会引出其它一些对话框。一个字段对象上双击,你可以看到一个这种沉闷的界面的例子(见图1):这个操作打开一个属性对话框,可这个对话框却不允许你去改变该字段的所有属性(例如缺少字体和颜色属性),你需要去单击那些按钮来打开别的一些模式对话框以改变某些属性。
图1、报表表达式对话框是过去版本 VFP 报表设计器的沉闷界面的一个例子
在 VFP 9 中只有很少几个对话框,因为一个对象的所有属性现在都在一个地方了。所有对象类型的属性对话框现在使用一个分页的界面,这样你就可以在一个对话框中编辑对象所有可能的属性,而不需要打开其它模式对话框了。图2展示了一个字段的属性对话框。
在图3中展示的新报表属性对话框整合了过去版本中页设置、标题/总结、数据分组、变量、坐标线设置的功能,同时也增加了一些新的东西。
这些对话框并非真正是产品的一部分,而是通过 ReportBuilder.APP 提供的。这是对的,因为它们都是 VFP 表单!VFP 还带有 ReportBuilder.APP的源代码(解压 VFP 主目录下 ToolsXSource 目录下的 XSource.ZIP 文件,然后看看里面的 ReportBuilder 文件夹),所以你可以自定义或者建立各种对话框的子类和行为以满足你自己的需要。如果你的应用程序提供在运行时对报表设计器的访问,请确保在你发布的安装包中包含 ReportBuilder.APP(或者你自己做的对这个应用程序的替代品)。
图2、在 VFP 9 中的属性对话框使用一个分页的界面来使得一个对象的所有属性都在一个对话框中
其它一些用户界面的增强是:
- 报表的 Report 菜单和快捷菜单被重新组织过了,并有了一些额外的项目(包括 Properties 菜单项,它会调用报表属性对话框),以使得它能够更容易的对报表进行工作。
- 当一个对象可以被缩放的时候,现在的鼠标光标能够提供一个可视化的形象。
- 报表设计器工具栏包括页设置和字体属性对话框。此外,View 菜单包括一个用于报表设计器工具栏的菜单项。过去,你必须从 View 菜单中选择 toolbar,然后在打开的对话框中选中 Report Designer toolbar。
- Tools|Options 对话框中的 Reports 页被重新组织过了,并且有了三个新的选项:表达式生成器如何处理字段的别名、默认的运行时行为是向后兼容(与使用新的 SET REPORTBEHAVIOR 80 命令的效果相同,参见本章后面的“新报表语法”一节)还是支持对象(与 SET REPORTEHAVIOR 90 相同)、以及是否为一个字体使用脚本(参见本章后面的“国际化支持”一节)。