3、 组合多个 ReportListener 以提供多种输出
从前面的例子上再走远一点,让我们来看看你可以怎样通过组合多个 ReportListener 来实现在同一个运行中的报表上提供多种输出方案。在默认的 ReportOutput.app(以及在新的 _reportListerer.vcx FFC 基础类库中)提供的 ReportListener 的子类有一个属性叫 Successor,可以用这个属性记录下对另一个个 ReportListener 实例的引用,而个被引用的实例将被挂钩到报表生成引擎上,因而是起着主导作用的“主控 Listener”。 在下面的示例中,我通过执行 DO (_reportoutput) 两次来建立两个 listener,每次执行的时候都传递给它一个变量,以返回一个对带有正确的输出类型的Listener的对象引用,输出类型是 (_reportoutput)程序决定的。在下面的代码中,olistener 接收到一个对一个输出类型为 0 (打印输出)的 listener 的对象引用,而 olistener2 则接收到一个输出类型为4的 XMLListener对象的引用。 现在,我们有一个全局的集合(_oReportOutput),该集合中拥有对缓存中的打印和XML两个Listener的引用,而我们则将这两个 Listener 引用为 olistener 和 olistener2。现在,为了演示从 ReportOutput.app 来取得一个 ReportListener 的引用的另一种办法,我们象这样给集合添加另一个将被放入缓存中的 HTMLListener 的实例:DO (_reportoutput) WITH 5 注意,现在我们可以通过集合引用的办法来操作 HTMLListener 的属性,象这样: _ReportOutput("5").targetfilename = "c:\htmltest2.htm" 现在剩下的活是将这三个 Listener 象链条一样的串连起来,输出类型为0的打印Listener放在链条的最前面。
这个 Listener 将是我们在使用 REPORT FROM 命令的时候放在 OBJECT 子句里面去的那个,这样一来,它就变成了一个“驱动,或者主控”listener,而它会与另外两个与它在一条链条上的 listener 进行通讯。将它们链接起来的代码是: olistener.successor = olistener2
olistener2.successor = _oReportOutput("5") 就是这样。现在,运行这个报表,从同一次运行你就会获得三种类型的输出——在默认打印机上的一个报表、一个只带着数据的 XML 文件、以及一个显示着报表的 HTML 页面。 LOCAL olistener, olistener2 * 获得一个对打印类的引用
DO (_reportoutput) WITH 0, olistener * 获得一个对 XMLListener 类的引用
DO (_reportoutput) WITH 4, olistener2 * 关闭用户界面的返回和提示
olistener2.quietmode=.T. * 只包含数据,不带布局信息
olistener2.xmlmode=0 * 指定文件名和路径,并关闭文件名提示
olistener2.targetfilename = "c:\xmltest2.xml"
olistener2.quietmode=.T. * 现在为 HTML 输出做准备,但使用另一种办法来从全局的
* _oreportoutput 集合中获得一个对listener 的引用
DO (_reportoutput) WITH 5 * 通过集合引用来设置 HTMLListener 的属性
_oReportOutput("5").targetfilename = "c:\htmltest2.htm"
_oReportOutput("5").quietmode=.T. * 把三个 listeners 象链条一样的链接在一起
* 其中,用打印 listener 作为驱动
olistener.successor = olistener2
olistener2.successor = _oReportOutput("5") * 运行一个雇员电话号码列表,引用在列表中的第一个 listener
REPORT FORM (_samples+"solution\reports\ledger.frx") ;
OBJECT olistener * 在浏览器中显示 XML 和 HTML 结果
* 并在打印机上打印报表
RUN /n Explorer.exe c:\xmltest2.xml
RUN /n Explorer.exe c:\htmltest2.htm
VFP9.0 中文汉化版下载:http://www.cr173.com/k/vfp/