Foxpro9 可以传递数组传递吗

你对这个回答的评价是

你对这個回答的评价是?

}

  本书以培养大学生实践能力為核心增强大学生计算机应用水平为目的。全书共分为12章前10章系统地介绍了Visual FoxPro的基础知识和编程方法;第11章、第12章以案例教学的方式,姠读者展示了开发“学生成绩管理系统”的整个过程为广大初学者提供了一种开发应用程序的经验和思路。   本书注重基础知识的理解与实际操作技能相结合的培养;在强调操作技能的同时为了巩固基础知识,还配有相应的实验、习题册   本书层次清楚,实用性強可作为普通高等学校计算机相近专业及非计算机专业本科生的程序设计类课程教材,也可供编程爱好者参考使用

目 录 第 1章 数据庫系统概述 1 1.1 数据库系统基础知识 1 1.1.1 数据、数据库、数据库管理系统、数据库系统 1 1.1.2 数据管理技术的发展 2 1.1.3 数据库系统的特点 3 1.2 数据模型 4 1.2.1 数据模型组成要素 4 1.2.2 两大数据模型 4 1.2.3 概念模型 5 1.2.4 常用的数据模型 6 1.3 关系数据库 7 3.6 SET命令 56 3.7 数组变量 59 思考题 62 苐4章 项目管理器及数据库的创建与操作 63 4.1 项目管理器 63 4.1.1 创建项目 63 4.1.2 定制项目管理器 66 4.1.3 使用项目管理器 67 4.2 数据库的创建与操作 69 4.2.1 创建数据库 69 4.2.2 使用数据库 70 思考题 73 第5章 Visual FoxPro 9.0表的创建与操作 74 5.1 创建表 74 5.1.1 使用表设计器建表 75 5.1.2 使用表向导建表 76 5.1.3 使用命令建表 78 5.2 表记录的录入 79 5.2.1 浏览方式录入 79 5.2.2 编辑方式录入 80 5.2.3 使用命令录入 82 5.3 表的操作 82 5.3.1 打开和关闭表 83 5.3.2 复制表 84 5.3.3 浏览表 85 5.6.2 表間的物理连接 104 5.7 数据库表 105 5.7.1 添加自由表 105 5.7.2 移去、删除表 106 5.7.3 设置数据库表属性 107 5.7.4 设置表中字段的显示属性 107 5.7.5 设置表中字段的有效性 108 5.8 数据库表之间的关系 109 5.8.1 建立关系 109 5.8.2 编辑和删除关系 110 8.4.2 数据编辑表单设计 217 8.4.3 数据查询表单设计 219 思考题 221 第9章 报表及标簽设计 222 9.1 创建报表 222 9.1.1 使用向导创建报表 222 9.1.2 利用快速报表方法创建报表 224 9.1.3 使用设计器创建报表 225 9.2 修改报表 226 9.2.1 设置报表数据环境 226 9.2.2 添加报表控件 227 10.2.2 设置菜单的常规选项与菜单选项 239 10.2.3 保存与生成菜单 240 10.2.4 在顶层表单中使用菜单 240 10.2.5 创建快速菜单 241 10.3 快捷菜单设計 242 10.3.1 创建快捷菜单 242 10.3.2 将快捷菜单附加到对象 242 思考题 243 第 11章 学生成绩管理系统开发实例 244 11.1 系统的总体设计 244 12.1 连编可运行文件 260 12.2 发布应用程序 262 思考题 264

}

微软在2004年岁末发布最新版Visual Foxpro 9.0这则消息让我们回想起曾经风光无限的Foxpro,现在它已经被JavaDelphiVB等众多明星遮掩了光芒有人认为如果不是诞生在豪门微软,它肯定已经消失但叻解Visual Foxpro的都知道,Visual Foxpro的卓越性能是无法代替的新版Visual Foxpro 9.0在Foxpro社区引起了轰动,新版中将包含一个更快的本地数据引擎支持更多的数据类型,SQL语句執行中有更大的一致性一个完全重新设计的可扩展报表编写器,以及一系列效率和功能增强特性在Visual FoxPro 9.0的报表系统出现了难以置信的改进。在本文中我只讨论几个新增功能中的一个——扩展运行时报表引擎(runtime reporting engine)的能力。Visual FoxPro小组在处理运行时改进工作时一直紧记着几个目标包括:

  • 处理打印和预览之外的多种报表输出
  • 使用GDI+进行报表输出。这会带来很多显著的改进例如精确地显示、图像和字体的平滑调整,以忣一些附加的能力(例如文本旋转)
  • 提供一个更加灵活和可扩展的报表系统

你可以同时访问旧的和新的报表引擎因此你可以根据需要选擇在哪种引擎下运行报表。但是一旦你看到新的报表引擎的优点你就再也不希望使用旧式报表了。报表系统的架构Visual FoxPro 9以前版本中的报表系統类似于单片电路:它处理所有细节信息只有少量的例外(用户定义的函数、报表带条的OnEntry和OnExit表达式等等),在报表运行的时候你是不能与它交互操作的。新的报表引擎把报表的功能分成了两部分:现在的报表引擎只处理数据和对象定位;一种新对象(报表监听器)处理顯示和输出的事务由于报表监听器是类(class),因此我们现在可以使用以前梦寐以求的方式与报表进程交互操作新的报表语法Visual FoxPro 9支持使用舊的报表引擎运行报表;你可以像以前一样使用REPORT命令(尽管你可以使用新命令重载REPORT的行为)。为了得到新式的报表行为必须使用REPORT命令的OBJECT孓句。OBJECT子句支持两种使用方法:指定报表监听器和指定报表样式微软把它归纳为对象辅助(object-assisted)报表。报表监听器是提供新式报表行为的對象报表监听器是基于Visual FoxPro 9的新的基础类ReportListener的。为了让Visual FoxPro 9使用报表指定的监听器需要实例化监听器类,并在REPORT命令的OBJECT子句中指出该对象的名称丅面是一个例子:

如果不希望手动实例化监听器,可以通过指定报表类型让Visual FoxPro自动为你完成实例化过程例如:

  • 2——某个时刻的页面信息模式,但不会输出到打印机
  • 3——所有页面模式但不会调用预览窗口

当然我们还可以使用其它的用户自定义类型。使用这种方式运行报表的時候将调用新的_REPORTOUTPUT系统变量(默认情况下它位于Visual FoxPro主目录的ReportOutput.APP中)中指定的应用程序来决定指定该类型使用哪种监听器类来实例化。它是通过查看APP中内建的监听器注册表(尽管你可以指定它使用一个外部表)中的监听器类型来实现的如果它找到了需要的类,它就实例化该类并傳递该监听器对象的一个引用到报表引擎中因此,在REPORT命令中使用OBJECT TYPE 某种类型的效果与下面的代码的效果是相同的:

在报表运行的过程中伴随着报表事件的发生,Visual FoxPro把这些事件暴露给基于ReportListener基类的对象Visual FoxPro帮助文件记录了ReportListener的属性、事件和方法(PEMs),但是在本文中我只讨论其中最有鼡的一些表1列举了ReportListener类的最常使用的一些属性。表1:ReportListener类的一些有用属性

报表数据的数据对话ID
FRX游标的数据对话ID
用于显示的GDI+绘图对象句柄
监听器生成的报表输出类型默认值是-1(无输出),你应该把它改成符合需要的值它的值与REPORT 命令的OBJECT TYPE 子句中规定的值是相同的。
如果它的值为.T. (默认值是 .F.) 就支持进度信息
在FRX被载入和打印机假脱机操作被打开前调用
在FRX被载入但是报表运行前调用
处理某个报表条带前调用
处理某个报表條带后调用
向特定的设备输出指定显示的页面

FoxPro主目录中的FFC(FoxPro基础类)子目录包含了_ReportListener.VCX文件该文件包含了ReportListener的一些子类,而这些子类的功能比基类更多这些子类中最有用的是_ReportListener。_ReportListener最重要的特性之一是对继承(successors)的支持当你运行报表的时候,你可以希望使用多个报表监听器例洳,如果你希望预览某个报表同时输出为HTML,就会涉及到一个以上的报表监听器_ReportListener通过提供Successor(它包含一个引用另一个监听器的对象)属性尣许我们构建监听器链。例如假设ListenerA和ListenerB都是_ReportListener的子类,它们各自执行某些事务并且你希望在某个报表上同时使用这两个监听器。下面是把這些监听器链接起来的代码:

报表引擎只与REPORT或LABEL命令中指定的监听器(称为lead listener头监听器)通讯。当报表引擎引发报表事件的时候头监听器調用它的后继者的适当方法,而后继者又调用自己的后继者的适当方法这样一直沿着链进行下去。这种架构就是响应链链中的任何监聽器都可以决定执行某些操作或者把消息传递给链中的后继节点。_ReportListener的另外一种有趣的能力是链接报表AddReport方法把一个报表添加到定制的ReportFileNames集合Φ。你给这个方法传递报表名、可选参数还有将要使用的报表子句(例如RANGE子句)和另一个监听器对象的引用RemoveReports方法从集合中删除所有的报表。RunReports运行报表;传递进去的第一个参数是.T.的时候将在报表运行后从集合中删除报表第二个参数为.T.时将忽略AddReport指定的任何监听器。下面是一個示例它运行了两个报表,但是表面看起来好像是一个报表:

由于开发小组的设计目标之一是提供更多的报表输出类型所以Visual FoxPro

但是如果這样操作你将无法控制将要建立的文件名和其它一些设置。作为替代调用ReportOutput.APP可以让你得到需要的监听器引用、设置需要的属性、接着告诉REPORT命令使用该监听器。下面的代码从MyReport报表中建立了一个叫做MyReport.HTML的HTML文件当你指定为类型5时,ReportOutput.APP使用自己内建的HTMLListener类提供输出

下面的代码从MyReport报表中建立MyReport.XML文件,只包含了数据在这种情况下,代码片断使用了XMLListener类(类型4)

HTML输出实际上使用XML监听器生成XML,接着使用XSLT来生成最终的HTML这两个监聽器类都有一些附加的属性,你可以使用这些属性进一步控制输出我推荐你查阅一下Visual FoxPro文档。此外由于它们是_ReportListener的子类,所以监听器类支歭_ReportListener类的能力包括链接监听器和运行多个报表。下面是一个同时输出XML和HTML的示例:

由于报表监听器是类所以报表运行的时候,你可以建立孓类来改变报表系统的行为例如,我一直希望在运行时动态地格式化字段在某些条件下,我希望字段用红颜色打印其它条件下用黑顏色打印。一个字段有时需要加粗而其它时候则不需要改变字段在报表中的显示样式的关键是EvaluateContents方法。这个方法在字段被显示之前调用每個字段对象赋予监听器改变字段样式的权力。该方法的第一个参数是被处理的字段对象的FRX记录号第二个参数是包含属性和字段对象信息的对象(请查看Visual FoxPro帮助文件中该对象包含的属性列表)。你可以修改任何属性来改变报表中字段的样式如果你是这样做的,那么还需要紦该对象的Reload属性设置为.T.以通知报表引擎你已经改变了一个或多个属性。列表1显示了定义_ReportListener的一个子类(叫做EffectsListener)的代码片断该子类处理可能应用于报表中的字段的不同效果类型。这些效果通过效果处理对象来应用而这些对象都存储在EffectsListener的oEffectsHandlers属性的集合中。每种效果处理对象处悝一种效果在报表被处理的时候,监听器需要确定哪些字段应用了效果它在EvaluateContents方法中查看每个将要显示的字段,实现这种功能EvaluateContents调用SetupEffectsForObject,咜调用每个效果处理程序的GetEffect方法来决定是否给该字段应用某种效果GetEffect查看FRX中的字段记录的USER备注来指令应用哪种效果。如果该字段需要某种特定的处理程序该处理程序就被添加到处理该字段的处理程序集合中(因为每个字段可能应用多个效果)。这意味着在每条记录的每个芓段上都会调用EvaluateContents可是没有必要在一个特定字段上进行多次效果检查(这样做将导致报表性能下降)。因此BeforeReport建立了一个数组,它存储了FRXΦ记录的行如果该数组的第一列为默认值.F.,说明监听器还没有检测将要显示的字段的效果因此EvaluateContents做出检测并把该数组的第一列设置为.T.,這样FRX就不会再次检测了在检测某个字段是否应用了效果后,EvaluateContents进入到该字段的效果处理程序集合中调用每个程序的Execute方法执行必要的操作。DynamicForeColorEffect就是一个效果处理程序它用下面的格式查看报表中某个字段的USER备注:

图1:TestDynamicFormatting报表。列表1中的代码生成这个报表它演示了对装运日期和裝运形式列的动态格式化。

DynamicForeColorEffect的Execute方法通过把传递到EvaluateContents中的字段属性对象的PenRed、PenGreen和PenBlue属性设置为适当的颜色并把Reload设置为.T.(告诉报表引擎已经做了一些修改)来改变字段的颜色。DynamicStyleEffect使用类似的指令来改变字体样式此处使用的样式必须是一个数值:0是正常体、1是粗体、2是斜体、3是粗斜体。TestDynamicFormatting报表中的SHIPVIA字段的USER中有下面的指令它引起SHIPVIA为3(因为该字段的表达式实际上显示为Mail)的字段显示为粗体,否则为正常体

自定义显示你不僅可以改变字段的外形——你还几乎可以在报表监听器中执行自己需要的任何事务。ReportListener的Render方法负责在报表页面上绘制每个对象你可以重载這个方法来实现各式各样的输出。实现自定义显示的监听器当然需要使用GDI+函数GDI+是执行图像操作和输出的数百个WindowsAPI函数的集合。为了更方便使用GDI+函数Visual API包装基础类”主题列举了这些类,并提供了它们的少量背景信息这个类库对于执行GDI+显示有很大的帮助,因为你在使用它们的時候不需要知道GDI+的太多相关信息。我也不太了解GDI+的很多信息但是仍然在几个小时之内建立了接下来要讨论的监听器类。

列表2中的代码來自TestColumnChart.PRG它运行了图2中所示的TestColumnChart.FRX报表,建立了图3所示的输出请注意,输出结果与报表布局之间有很大的差别字段和形状(shape)没有显示出来,而绘制示例Northwind

When子句防止它们被打印出来但最大的原因在于这个报表使用的监听器类(ColumnChartListener)把Summary(汇总)报表条带中的形状对象更替为列条状圖。下面让我们看看这个监听器是如何实现这种功能的ColumnChartListener的Init方法把aColumnColors数组初始化为报表中的列将会使用到的颜色。请注意GDI+的颜色与RGB()函数返囙的值有一点点不同,因此它使用CreateColor方法来进行必要的转换如果你希望使用不同的颜色集,你可以从ColumnChartListener衍生出子类或者实例化ColumnChartListener之后在数组Φ存储另一组颜色集合。请注意我们只定义了八种颜色,如果报表中的列多于八个每种颜色可能用于多个带条。

 图3:列表2中的代码苼成这个报表它建立了带状图而不是传统的输出。

BeforeReport方法实例化一个GPGraphics对象到自定义的oGDIGraphics属性中GPGraphics是_GDIPlus.VCX中的一个类。它和其它_GDIPlus类都被用在DrawColumnChart方法中來绘制条状图的组件GPGraphics需要一个将要显示的GDI+表面的句柄。幸运的是监听器已经有这样一个句柄存储在GDIPlusGraphics属性中。唯一的复杂因素是该句柄茬每个页面上都会改变因此当标题或页面头部带条被处理的时候,BeforeBand方法(在报表条带被处理前调用)调用GPGraphics对象的SetHandle方法来赋予它句柄在報表被处理的时候,监听器必须确定图表中的标签和值来自于何处在字段将要被显示的时候,它在EvaluateContents方法中通过查看每个字段得到这些信息如果该字段在FRX中的USER备注包含了LABEL(与CategoryName字段中一样),就表明该字段应该用于条状图的标签USER备注中的DATA(例子中是CategorySales字段)表明这个字段用莋图表的值。有了前面讨论过的EffectListener类之后根本就不需要多次检查USER备注,因此在示例中使用了相同的机制——在一个数组属性中存储标识以表明某个字段是否被处理过如果监听器仍然没有检测某个将显示的字段的USER备注,EvaluateContents将执行这种检测设置数组中的标识以表明该字段是否鼡作标签或值,并把数组的第一列设置为.T.这样FRX记录就不会再次检查了。如果某个字段用作标签或值EvaluateContents相应地更新aValues数组。AdjustObjectSize与EvaluateContents类似除了它茬形状(shape)上而不是在字段上调用。AdjustObjectSize检查当前形状的FRX记录的USER备注中是否存在COLUMNCHART如果存在就表明这个形状应该被条状图代替。有了EvaluateContents之后监聽器只需要检查一次,因此它也使用了相似的逻辑Render方法负责在报表上绘制对象。如果将被绘制的对象是一个被条状图代替的形状它就調用自定义的DrawColumnChart方法,带上NODEFAULT防止该形状被绘制出来否则,该对象会被正常地绘制出来(请注意如果没有DEDEFAULT(),初始的行为是绘制对象因此這个参数是必要的)。DrawColumnChart计算出图表显示的最大值这样它才知道条带应该多大,接着它从_GDIPlus类中建立一些执行绘制操作的对象它调用DrawLine方法繪制出图表的垂直和水平边界,接着进入aValues数组使用DrawRectangle绘制出每个值的条带并使用FillRectangle用适当的颜色填充。DrawColumnChart使用相同的DrawRectangle和FillRectangle方法绘制方框、使用DrawStringA绘淛标签给图表添加了一个方框和标签图例。其中一些绘图属性来自于自定义属性中的值这使得绘制图表更加灵活。例如属性cLegendFontName和nLegendFontSize指定叻图例标签使用的字体和大小,nLegendBoxSize指定了将要绘制的方框的大小你可以在代码列表2开始处看到这些属性的注释。微软已经揭开了Visual FoxPro报表系统嘚面纱!通过给ReportListener对象传递报表事件我们可以与这些事件交互作用来执行一些自己希望实现的事务,其范围从提供各式各样的输出类型到動态地改变被显示的对象Visual FoxPro团体使用这些新特性会实现什么样的效果?难以想象!

}

我要回帖

更多关于 数组传递 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信