如果监听器仍然没有检测某个将显示的字段的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团体使用这些新特性会实现什么样的效果?难以想象!






