Micorsoft公司对新推出的Visual Foxpro 9报表设计器作了显著地改进,同时又与老版本的Visual Foxpro保持了向后兼容性,新版本的报表设计器是一个新旧版本的混合体。
在本文中,你将了解报表设计器对新的数据环境、报表保护、用户界面、对象布局与数据分组功能的增强。最后,你将了解Visual FoxPro 9报表设计器的一个最有用的增强功能:多条明细区带(multiple detail bands)。
报表设计被一个新增的“Xbase报表设计器”的工具代替。它提供了一些新的对话框,并且比以前的版本更方便使用。它还提供了一些旧版本报表设计中所没有的新特色。你可以通过改变一个名为“_REPORTBUILDER”的系统属性来决定使用哪种报表设计器,如下所示:
*--如果要使用新版本的报表设计器
_REPORTBUILDER = HOME() + 'ReportBuilder.app'
*--如果要使用旧版本的报表设计器
_REPORTBUILDER = ''
报表输出引擎:与报表设计器一样,你可以控制是否选用新版本的报表输出引擎。但与报表设计器不同的是Visual FoxPro 9默认报表输出引擎为旧版本方式。主要是因为在新版本的输出引擎中使用了GDI+库,而老版本的输出引擎使用的是GDI库,使用老版本的输出引擎就可以让应用程序可以在不用版本的windows上显示出同样的输出效果。你可以用如下命令来切换你的输出引擎:
*--使用新版本的输出引擎
SET REPORTBEHAVIOR 90
*--使用旧版本的输出引擎
SET REPORTBEHAVIOR 80
在下文中我们假定使用的是新版本的报表设计器和输出引擎。
数据环境(DE)Visual FoxPro 9的报表设计器能与让多个报表共享同一个数据环境。数据环境能够以类的方式保存,并在需要的时候被报表载入。这为那些需要制定通用报表数据环境的应用程序提供了方便。
要将数据环境保存为一个类,首先你要为报表定义一个数据环境,然后激活数据环境窗口,并在“File”主菜单中单击“Save As Class...”选项。
这样系统会弹出一个新的对话框(参见图1)。在这种情况下,Save单选按钮组中只有“DataEnvironment”处于允许状态。
图1. 使用“Save As Class”对话框指定要保存的类名以及所在的类库,并将指定报表的数据环境保存在这个类中。
载入数据环境除了能为报表定义数据环境以外,Visual FoxPro 9还能让你将某个报表的数据环境类载入到报表中去。“Report”菜单中的“Load Data Environment...”选项可以让你选择到底载入哪个数据环境。
通过报表设计器载入数据环境如果要为一个新报表载入数据环境,那源数据环境的所有代码和成员变量都会复制到新报表中。这表明当你改变原来报表的数据环境后,并不会对新报表的数据环境产生任何影响。
图2显示了当你从“Report”主菜单中单击了“Load Data Environment...”选项后弹出的属性对话框。你可以在里面选择从哪个报表中复制源数据环境。
图2. 单击”Data Environment“选项卡,从中选择你要从哪个报表中复制数据环境
在上图中,单击“Copy from another report file”单选按钮,然后单击“Select...”按钮,这样会弹出一个打开对话框,你可以从中选择从哪个报表中复制。如果你选中了一个报表,那系统弹出一个确认框。
假如我们要将某个报表的数据环境复制到当前报表中去,Visual FoxPro 9会警告你将覆盖当前报表的数据环境,你必须选择“是”才能继续进行复制。这个提示功能可以防止由于你的误操作而将当前报表的数据环境覆盖掉。如果你选择“否”的话,那复制就会取消,如果选择的是“是”,那就会真正进行复制操作,并且当操作完成后,系统会出现另一个对话框,提示你操作完成。
现在数据环境已经复制成功了,你可以操控新的数据环境。但你要始终记得原报表数据环境的改变并不会对新的数据环境有任何影响。
从一个类中载入数据环境当要从一个类中载入数据环境时,你必须要为新报表的数据环境写一些额外的代码,使得它能够动态地绑定源数据环境,并且初始化它的一个实例。这意味着如果从类中载入数据环境时,对源数据环境做的所有改动会影响到所有使用它的报表。
你同样可以用图2所示的报表属性对话框来完成这个效果,先单击“Link to a visual DE class”单选按钮,然后从系统弹出的打开对话框中选择你要载入的类库以及类名,当你点击确定按钮后,当前报表的数据环境将得到更新,并且系统会给出相应提示信息。
其实Visual FoxPro自动为数据环境的如下5个方法中加入了一些代码:Init()、BeforeOpentables()、AfterCloseTables()、Destroy()和Error()。有些方法中加入的代码非常简单,仅仅是一个DODEFAULT()命令,这个命令不执行任何操作。其原因是BindEvents()方法必须保证数据环境的这5个方法中的代码行数超过一行才能执行。你可以手动查看这些自动生成的代码,但我强烈建议你别去动这些代码。
保护如果要在Visual FoxPro 9使用报表设计器或者标签设计器,你可以为一个或多个的布局对象设置保护。这种特性可以让你的用户只能对报表进行有限的修改。
你可以为布局对象设置5种保护模式,域对象有着另外的保护选项。带区(Band)有两种保护模式可供你选择。并且你也可对报表本身设置不同的保护方式。
保护一个对象要在报表设计器中为一个布局对象设置保护,通过激活此对象的属性对话框即可操作,你可通过用右键点击此对象,并在弹出的快捷菜单中选择相应的菜单项,或者直接双击此对象。图3显示了一个布局对象属性对话框的保护页,你可以为布局对象设置如下5种保护方式:
· 对象不能被移动或改变大小。它使得用户不能在设计器中移动此布局对象,并且用户不能改变此对象的大小。
· 对象不能被修改。它使得用户不能修改此布局对象的属性。
· 对象不能被删除。 它使得用户不能删除此对象。
· 对象不能被选中。用户不可以选择此对象,当对象处于这种保护方式下时,用户不能移动它或改变它的大小,同样也不能修改或删除它。
· 对象在设计器中不可见。它使得此对象在报表设计中不可见,当对象处于这种保护方式下时,用户不能移动它或改变它的大小,同样也不能修改或删除它。
图3. 布局对象属性对话框中的保护页
这个对话框还有一个名为“Design-time caption”的输入项,它只对域对象有效。你可以在其中输入域对象的名称,这样在报表设计器中就不会显示域的表达示名称,而是显示你输入的名称。当域的表达式非常冗长时,这种显示方式可以使得报表设计器的用户界面更加友好。
保护一个带区 (Band) 在报表设计器中要保护一个带区的话,请先激活此带区的属性对话框。你可以通过选择“Report”菜单中的“Edit Bands...”菜单项来打开这个属性对话框,也可以直接双击带区的灰色条。图4显示了一个带区属性对话框的保护页,你可以选择以下两种保护模式: · 带区不可修改。这可以防止用户修改带区的属性。 · 带区不可改变大小。这可以防止用户改变带区的大小。 图4. 带区属性对话框中的保护页 保护报表本身要为一个报表设定保护方式,要先激活此报表的属性对话框。你可以通过选择“Report”菜单中的“Properties”菜单项来打开这个属性框,也可以右键单击此报表来弹出这样一个菜单。图5显示了一个报表属性对话框的保护页
图5. 报表属性对话框中的保护页
这个对话框的上半部分可让你禁止用户使用属性对话框中的某些属性页。当你选择了相应的检查框后,报表属性对话框中的某些属性页会变得不可用。但“Protection”检查框总是保持选择状态而且不允许你对它进行改动。另外由于“Ruler/Grid”属性页无法保护,因此“Ruler/Grid”检查框也总处于禁止状态,这两个检查框之所以显示是为了保持属性页与检查框的一致性。
属性对话框的下半部分可以禁止用户使用某些菜单项。当你选择了相应的检查框后,相应的菜单会变得不可用。
在命令中设置保护标志如果要通过命令方式来调用报表设计器或标签设计器中的保护方式,则应该使用PROTECTED关键字,如下所示:
CREATE REPORT MyReport PROTECTED
MODIFY REPORT MyReport PROTECTED
CREATE LABEL MyLabel PROTECTED
MODIFY LABEL MyLabel PROTECTED
如果没有指定PROTECTED关键字,报表设计器不会为任何布局对象加上保护。
增强的用户界面(UI)报表设计的用户界面作了很多改进,使得用户能更方便、更直观地设计出报表。菜单项也作了很大的调整,上下文菜单做了改进,报表设计器的工具栏中增加了一些新选项。表达式构造对话框(Expression Builder )和表达式构造选项对话框(Express Builder Options)都有了新的特性,此外报表设计器对其它一些用户界面作了细微的改进。
菜单
菜单加入了一些新项目,一些原有的菜单项被更名使得它们表达的意思更清晰,此






