[返回]
中国计算机报1999年第35期
如何用Visual FoxPro实现图形统计报表
刘俊强 李冬梅
本文介绍采用OLE技术,实现图形统计报表功能。
VFP提供了一种称为“通用类型(General)”的字段,可以用于存储OLE对象的引用。而OLE绑定型控件则可以在表单(Form)或报表(Report)中,显示数据库表General字段对应的OLE对象的内容。在VFP的表单设计器和报表设计器中都可以使用OLE绑定型控件。
图形统计报表的实现
要实现图形统计报表,需要一个支持OLE的图形软件绘制图形。由于Microsoft
Graph(以下简称MsGraph)支持OLE技术,并且支持的图表类型众多,因此,我们选用MsGraph进行图形的显示输出。
MsGraph支持的图表类型主要有柱形图、条形图、折线图、饼图、XY(散点)图等等。MsGraph对各种图表类型都给出了相应的常量定义,如三维簇状柱形图(xl3DclumnClustered)、三维簇状条形图(xl3DbarClustered)、折线图(xlLine)、折线散点图(xlXYScatterLines)等等,在程序中需要确定图表类型时可方便地加以引用。
MsGraph采用面向对象技术,对MsGraph对象提供了清晰的对象层次,用于程序中对图表的各个部分(如分类轴、数据轴、标题、图例等等)进行控制。利用MsGraph所提供的各个对象,可以通过程序对MsGraph图表对象的各个部分进行精细的控制,下面的例子列举了如何对MsGraph图表对象施加控制。
为叙述方便,这里假设有一个需要统计的数据库表,名为Details,其中的两个字段定义如下:Date(日期型)和Value(数值型,假设为某一设备的电气参数,如绝缘电阻)。现在需要统计出该设备电气参数从某一年以来(nFirstYear)的历年变化趋势。另外定义了一个统计数据库表(名为Statistics),其中的一个字段定义为GraphRec,字段类型为General。
将统计数据送入临时表中:
Close Tables All
Select Date,Value From Details Where Year(Date)>=nFirstYear;
Order by Date Into Cursor MyTemp
生成数据串:
MsGraph可以根据字符串数据生成图形,但要求字符串数据具有表格型式(实际上字符串数据就是按这种格式填入MsGraph数据表中的),在本例中,字符串数据格式如下表所示:
| 1990 | 1991 | … | 1999 | |
| 绝缘电阻(mΩ) | 123456.234 | 654321.432 | … | 654321.432 |
实现代码为:
Local lcData,lcYear
Select MyTemp
lcYear=′′
lcData=′绝缘电阻(MΩ)′
Scan
lcYear=lcYear+TAB+AllTrim(Str(Year(Date)))
lcData=lcData+TAB+AllTrim(Str(Value,16,3))
EndScan
lcData=lcYear+CRLF+lcData
Use
数据串传递给MsGraph:
Use Statistics
Append Blank
Append General GraphRec Data lcData Class ″MsGraph.Chart″
Use
修改图形类型
上面生成的图形类型是MsGraph的默认类型,并不总是能满足要求,因此需要软件对它加以修改。本文的例子是将MsGraph的图表类型设置为折线散点图(xlXYScatterLines),并分别设置它的分类轴(xlCategory)与数值轴(xlValue)的标题与字体大小。方法如下:
(1) 新建表单Form1,在上面放置OLE绑定型控件,名为Ole1,设置Ole1的ControlSource属性为Statistics.GraphRec。
(2) 在Form1.Init方法程序中添加如下代码:
#define xlXYScatterLines 74
#define xlCategory 1
#define xlValue 2
#define xlTickLabelOrientationUpward -4171
#define xlUpward -4171
#define xlTickLabelOrientationHorizontal -4128
If Not Used('Statistics')
Use Statistics
EndIf
Select Statistics
Scan
ThisForm.Refresh
With This.Ole1
.hasTitle=.F. &&没有标题
.hasLegend=.F. &&没有图例
.chartType=xlXYScatterLines
With .Axes(xlValue) &&设置数值轴
.hasTitle=.T.
.AxisTitle.Caption=′绝缘电阻(MΩ)′
.AxisTitle.Font.size=9
.AxisTitle.Orientation=xlUpward
.TickLabels.Font.size=9
EndWith
With .Axes(xlCategory) &&设置分类轴
.hasTitle=.T.
.AxisTitle.Caption=′年份′
.AxisTitle.Font.size=9
.TickLabels.Font.size=9
.TickLabels.Orientation=;
xlTickLabelOrientationHorizontal
EndWith
EndScan
(3) 已经完成对图形类型的设定,生成的图形如图1所示。

图1 上述代码生成图形的示意图
(4)
以上步骤已经完成了图形的生成与图形类型的设定,并保存在Statistics表中的GraphRec字段中。要输出图形统计报表,只需在报表(数据环境设为Statistics.Dbf)相应位置放置一个图片/OLE绑定型控件,设置它的字段属性为Statistics.GraphRec即可。