同城约会| 杂志期刊| 小说| 两性论坛| 军事电影| 两性知识| 电脑知识| 汽车| 旅游| 收藏

Visual FoxPro9.0中扩展报表系统功能

来源:天极网 作者:陶刚编译 出处:综艺读书 2005-11-18 
关 键 词:注册表  效果  数据库  设计  存储  
上一页 1 2 3 
  自定义显示

  你不仅可以改变字段的外形——你还几乎可以在报表监听器中执行自己需要的任何事务。ReportListener的Render方法负责在报表页面上绘制每个对象。你可以重载这个方法来实现各式各样的输出。


  实现自定义显示的监听器当然需要使用GDI+函数。GDI+是执行图像操作和输出的数百个Windows API函数的集合。

  为了更方便使用GDI+函数,Visual FoxPro的FFC目录中包含了_GDIPlus.VCX。_GDIPlus由新西兰Cornerstone软件公司的Walter Nicholls编写,它由GDI+函数的包装类组成,使这些函数更易于使用,同时还是面向对象的。Visual FoxPro帮助文件中的“GDI+ API包装基础类”主题列举了这些类,并提供了它们的少量背景信息。这个类库对于执行GDI+显示有很大的帮助,因为你在使用它们的时候,不需要知道GDI+的太多相关信息。我也不太了解GDI+的很多信息,但是仍然在几个小时之内建立了接下来要讨论的监听器类。

Visual FoxPro9.0中扩展报表系统功能
图2:设计时的TestColumnChart.FRX样式

  列表2中的代码来自TestColumnChart.PRG,它运行了图2中所示的TestColumnChart.FRX报表,建立了图3所示的输出。请注意,输出结果与报表布局之间有很大的差别,字段和形状(shape)没有显示出来,而绘制示例Northwind数据库中的Category_Sales_For_1997视图的内容的条状图却显示出来了。这部分原因是字段上的Print When子句防止它们被打印出来,但最大的原因在于这个报表使用的监听器类(ColumnChartListener)把Summary(汇总)报表条带中的形状对象更替为列条状图。

  下面让我们看看这个监听器是如何实现这种功能的。

  ColumnChartListener的Init方法把aColumnColors数组初始化为报表中的列将会使用到的颜色。请注意,GDI+的颜色与RGB()函数返回的值有一点点不同,因此它使用CreateColor方法来进行必要的转换。如果你希望使用不同的颜色集,你可以从ColumnChartListener衍生出子类或者实例化ColumnChartListener之后,在数组中存储另一组颜色集合。请注意,我们只定义了八种颜色,如果报表中的列多于八个,每种颜色可能用于多个带条。

Visual FoxPro9.0中扩展报表系统功能
   图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团体使用这些新特性会实现什么样的效果?难以想象! 更多文章 更多内容请看系统安全设置  系统安装手册  系统备份专题专题,或进入讨论组讨论。
上一页 1 2 3 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
综艺读书宗旨
相关专题
·系统优化大全 (13888篇文章)
·系统安全设置 (18678篇文章)
·系统安装手册 (16366篇文章)
·系统备份专题 (13499篇文章)
·系统维护手册 (13037篇文章)
热点标签: 注册表  效果  数据库  设计  存储  
最新技术文档
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
百度推荐,商机无限
搜索您感兴趣的内容
Web 全站
综艺电脑频道编辑信箱  告诉我们您想看的专题或文章

Google

友情互链 | 收藏本站 | 联系我们 | 在线留言 | 京ICP备08008424号|