e股脑电脑教程网
  • 首 页
  • 操作系统
  • 应用软件
  • 下载工具
  • 影音视频
  • 办公软件
  • 媒体制作
  • 网站建设
  • 平面设计
  • 数据库
  • 程序开发
  • 视频教程
编辑推荐: | 文章搜索:
您现在的位置: e股脑 >> 数据库 >> FoxPro教程 >> Visual FoxPro9.0中扩展报表系统功能 >> 教程正文
 
教程搜索
 
 
相关教程
  • 二级FoxBASE上机考试技巧
  • VFP中状态栏控件的使用说明
  • Visual FoxPro 9.0更强大了
  • VFP智能感应的二次开发
  • VFP中多条件数据查询程序的实现
  • VFP应用程序多媒体徽标的实现
  • VFP 6.0网络编程应注意的问题
  • VFP程序的五点经验
  • Visual Foxpro通用报表打印程序
  • 在ASP.NET中使用Visual FoxPro7.0
  • 修复DBF数据表文件的简单方法
  • 在VisualFoxPro5.0中激活InternetExpl
  • 在VFP中制做异型窗口
  • Visual FoxPro 9 集成开发环境新特性
  • Visual FoxPro 9.0 的报表设计器
  • Visual FoxPro 9中新的数据处理方式
 
 

图文教程


  • Windows抢了谁的饭碗 非主流操作系统To

  • 地球还是火星 平常心看“非主流”

  • 综合运用Office 2007批量制作奖状

  • 没有系统盘如何才能修复受损系统?

  • 巧妙运用Excel中边界的附加功能!
 
 
赞 助 商
 
 
Visual FoxPro9.0中扩展报表系统功能
  • 来源:e股脑
  • 点击次数:
  • 更新时间:2007-8-9
器。 下面的代码从MyReport报表中建立了一个叫做MyReport.HTML的HTML文件。当你指定为类型5时,ReportOutput.APP使用自己内建的HTMLListener类提供输出。 loListener = .NULL.do (_reportoutput) with 5, loListenerloListener.TargetFileName = 'MyReport.html'loListener.QuietMode = .T.report form MyReport object loListener 下面的代码从MyReport报表中建立MyReport.XML文件,只包含了数据。在这种情况下,代码片断使用了XMLListener类(类型4)。 loListener = .NULL.do (_reportoutput) with 4, loListenerloListener.TargetFileName = 'MyReport.xml'loListener.QuietMode = .T.loListener.XMLMode = 0&& 0 = data only, 1 = layout only, 2 = bothreport form MyReport object loListener HTML输出实际上使用XML监听器生成XML,接着使用XSLT来生成最终的HTML。 这两个监听器类都有一些附加的属性,你可以使用这些属性进一步控制输出。我推荐你查阅一下Visual FoxPro文档。此外,由于它们是_ReportListener的子类,所以监听器类支持_ReportListener类的能力,包括链接监听器和运行多个报表。下面是一个同时输出XML和HTML的示例: use _samples + 'Northwind\Orders'loListener1 = .NULL.do (_reportoutput) with 4, loListener1loListener1.TargetFileName = 'MyReport.xml'loListener1.QuietMode = .T.loListener1.XMLMode = 0&& 0 = data only, 1 = layout only, 2 = bothloListener2 = .NULL.do (_reportoutput) with 5, loListener2loListener2.TargetFileName = 'MyReport.html'loListener2.QuietMode = .T.loListener1.Successor = loListener2report form MyReport object loListener1 建立自己的监听器

由于报表监听器是类,所以报表运行的时候,你可以建立子类来改变报表系统的行为。 例如,我一直希望在运行时动态地格式化字段。在某些条件下,我希望字段用红颜色打印,其它条件下用黑颜色打印。一个字段有时需要加粗而其它时候则不需要。 改变字段在报表中的显示样式的关键是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备注: *:EFFECTS FORECOLOR = expression(你可以从某个对象的属性对话框中的“其它”选项页中看到该对象的USER备注。) 列表1中使用的TestDynamicFormatting报表的ORDERDATE字段的USER备注中有下面的代码片断指令;它告诉EffectsListener:DynamicForeColorEffect对象应该调整字段的颜色,当装运时间大于订单时间10天以上就用红颜色显示,否则就用黑颜色显示: *:EFFECTS FORECOLOR = iif(SHIPPEDDATE > ORDERDATE +10, rgb(255, 0, 0), rgb(0, 0, 0)) 图1:TestDynamicFormatting报表。列表1中的代码生成这个报表,它演示了对装运日期和装运形式列的动态格式化。 DynamicForeColorEffect的Execute方法通过把传递到EvaluateContents中的字段属性对象的PenRed、PenGreen和PenBlue属性设置为适当的颜色,并把Reload设置为.T.(告诉报表引擎已经做了一些修改)来改变字段的颜色。 DynamicStyleEffect使用类似的指令来改变字体样式。此处使用的样式必须是一个数值:0是正常体、1是粗体、2是斜体、3是粗斜体。TestDynamicFormatting报表中的SHIPVIA字段的USER中有下面的指令,它引起SHIPVIA为3(因为该字段的表达式实际上显示为Mail)的字段显示为粗体,否则为正常体。 *:EFFECTS STYLE = iif(SHIPVIA = 3, 1, 0) DynamicStyleEffect的工作方式与DynamicForeColorEffect类似,只是改变了字段属性对象的Style属性。 运行TestDynamicFormatting.PRG将出现图1所示的输出结果。 自定义显示

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

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

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

图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之后,在数组中存储另一组颜色集合。请注意,我们只定义了八种颜色,如果报表中的列多于八个,每种颜色可能用于多个带条。

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

BeforeReport方法实例化一个GPGraphics对象到自定义的oGDIGraphics属性中。GPGraphics是_GDIPlus.VCX中的一个类。它和其它_GDIPlus类都被用在DrawColumnChart方法中来绘制条状图的组件。

GPGraphics需要一个将要显示的GDI+表面的句柄。幸运的是监听器已经有这样一个句柄,存储在GDIPlusGraphics属性中。唯一的复杂因素是该句柄在每个页面上都会改变,因此当标题或页面头部带条被处理的时候,BeforeBand方法(在报表条带被处理前调用)调用GPGraphics对象的SetHandle方法来赋予它句柄。

在报表被处理的时候,监听器必须确定图表中的标签和值来自于何处。在字段将要被显示的时候,它在EvaluateContents方法中通过查看每个字段得到这些信息。如果该字段在FRX中的USER备注包含了LABEL(

上一页  1 2 3 下一页
  • 上一篇教程: Visual FoxPro9.0构建管理系统图解
  • 下一篇教程: VFP6.0中实现记录删除后自动调整编号
  •  

    关于本站 | 广告联系 | 版权声明 | 使用帮助

    Copyright © 2004-2008 www.egunao.com All rights reserved.