Welcome

首页 / 软件开发 / VFP / foxpro for graph对象全接触(2)

foxpro for graph对象全接触(2)2007-05-09数据序列在哪儿产生?

数据序列产生的依据一个很关键的问题,数据系列是指:绘制在图表中的一组相关数据点。图表中的每一数据系列都具有特定的颜色或图案,并在图表的图例中进行了描述。(在一张图表中可以绘制一个或多个数据系列,但是饼图中只能有一个数据系列。)

就上例数据源表来讲,我们可以指定“季度”作为数据序列产生的依据(“季度”作为图例,横轴为“年份”),也可以制定“年份”作为数据序列产生的依据(“年份”作为图例,横轴为“季度”)。但怎样实现不同的数据系列呢?

我的体会是:在 Visual FoxPro 中数据系列一定产生在 Graph 数据源字符串的行上面。上例中“季度”被指定为数据序列产生的依据(“季度”作为图例,横轴为“年份”)。

按照“在 Visual FoxPro 中数据系列一定产生在 Graph 数据源字符串的行上面”的理论,如果上例要指定“年份”作为数据序列产生的依据(“年份”作为图例,横轴为“季度”)就必须重新生成 Graph 数据源字符——将年份放在行上。代码如下:

#DEFINE TAB CHR(9)
#DEFINE CRLF CHR(13)+CHR(10)
LOCAL CDATA
M.CDATA=""

SELECT BOE_TABLE

M.CDATA=""+TAB+"第一季度"+TAB+"第二季度"+TAB+"第三季度"+TAB+"第四季度"+CRLF
FOR I=2 TO FCOUNT("BOE_TABLE")
M.CDATA=M.CDATA+FIELD(I)+TAB
SCAN
M.CDATA=M.CDATA+ALLTR(TRANSFORM(EVAL(FIELD(I))))+TAB
ENDSCAN
M.CDATA=M.CDATA+CRLF
ENDFOR

用Messagebox() 显示上面产生的 CDATA,如下:

绑定 Graph 数据源字符到 Graph 控件上

以下代码用于把“Graph 数据源字符”加入一个通用型字段中,并指定该字段与“MSGRAPH.CHART”类相关联,最后把字段作为“非绑定型 ActiveX 控件”的数据源。

CREATE CURSOR GRAPH(OLEGRAPH G)

APPEND BLANK
APPEND GENERAL OLEGRAPH DATA M.CDATA CLASS "MSGRAPH.CHART"
* CDATA 就是“Graph 数据源字符”
ThisForm.Graph.CONTROLSOURCE="GRAPH.OLEGRAPH" &&假定 Graph 控件是“非绑定型 ActiveX 控件”

数据刷新

如果控件已经与字段绑定,但我们要刷新 Graph 的数据数据源,可使用如下代码:

SELECT GRAPH
ThisForm.Graph.CONTROLSOURCE=""
APPEND GENERAL OLEGRAPH DATA M.CDATA CLASS "MSGRAPH.CHART"
*替换通用字段的内容为新的 CDADA
ThisForm.Graph.CONTROLSOURCE="GRAPH.OLEGRAPH"

就这么简单,我们已经知道如何生产不同数据系列的“Graph 数据源字符串”;并为 Graph 控件指定了数据源。

格式化 Graph 控件

到目前为止,我们已经建立了图表。下图就是没有任何修饰的图表,这是根据上例中以“季度”为数据系列生成的。不具备美感,怎么能用?

图表类型

Graph 对象为我们提供了丰富多彩的图表样式,每一种图表样式都有各自的经济学意义。当然什么样的情况下用哪种样式的图表已不是本文谈论的问题。就前文例子中的情况,我们可以选用如下图表样式(当然您还可以选择其他样式):

图表类型常量常量值
簇状柱形图xlColumnClustered51
堆积柱形图xlColumnStacked52
三维堆积柱形图xl3DColumnStacked55
簇状柱形圆锥图xlConeColClustered99
我们可以通过以下代码完成图表类型的设定:

#DEFINE xlColumnClustered 51
#DEFINE xlColumnStacked 52
#DEFINE xl3DColumnStacked 55
#DEFINE xlConeColClustered 99

ThisForm.Graph.charttype=xlConeColClustered

图表标题

参看以下代码:

ThisForm.graph.HasTitle =.T.
WITH ThisForm.graph.ChartTitle
.CAPTION = "销售业绩"
.FONT.Name = "隶书"
.FONT.FontStyle = "加粗"
.FONT.Size = 16
.FONT.ColorIndex = 3
.Shadow = .T.
.Interior.ColorIndex = 19
ENDWITH

X 轴和 Y 轴

参看以下代码:

ThisForm.graph.Axes(1).HasTitle = .T.
WITH ThisForm.graph.Axes(1)
.AxisTitle.CAPTION="年份"
WITH .AxisTitle.FONT
.Name = "隶书"
.FontStyle = "加粗"
.Size = 10
.colorindex=25
ENDWITH
WITH .TickLabels.FONT
.Name = "宋体"
.FontStyle = "加粗"
.Size = 10
ENDWITH
ENDWITH

&&以上对X轴进行格式化

ThisForm.graph.Axes(2).HasTitle = .T.
WITH ThisForm.graph.Axes(2)
.AxisTitle.CAPTION="销售额"
.AxisTitle.Orientation = -4166
WITH .AxisTitle.FONT
.Name = "隶书"
.FontStyle = "加粗"
.Size = 10
.colorindex=25
ENDWITH
WITH .TickLabels.FONT
.Name = "宋体"
.FontStyle = "加粗"
.Size = 10
ENDWITH
ENDWITH

&&以上对Y轴进行格式化

图例

参看以下代码:

WITH ThisForm.graph.Legend
WITH .FONT
.Name = "宋体"
.FontStyle = "加粗"
.Size = 10
ENDWITH

WITH .Border
.LineStyle=-4142
ENDWITH
ENDWITH

Graph 控件的格式化设置是一个内容丰富的课题,我们提到的是一些最基本的设置,不过沧海一粟而已!

打印图表

经常在网上看到这样的问题:怎么在 Visual FoxPro 中打印图表?人们往往将思路放在“打印表单”上,因为 VB、Delphi 中都为 Form 封装了 PrintForm 方法,不幸的是 Visual FoxPro 没有,最可气的是:自己用 API 写又太麻烦……

要解决这个问题不妨换个思路。我们知道:Visual FoxPro 的报表支持对 Graph 控件的显示;运行时对 Graph 的设定都记录在与 Graph 绑定的通用性字段中。于是我们只要这么做就行了:

新建一报表,在“页标头”带区中插入一“绑定型 ActiveX”控件,设置它的属性如下图:

注意“字段”中我们填入了上例中的通用性字段。

更多的资料从哪里来

有两个帮助文件时必须看的,就是 Office 2000 目录下的(我的机器中是 D:Program FilesMicrosoft OfficeOffice2052)Graph9.chm 和 Vbagrp9.chm。前者是讲述 Graph 的经济意义的,后者是本文讨论 Graph 对象。由于是以 VBA 代码为程序讲解语言,所以其中会有很多常量(如:xl3DLine),Visual FoxPro 6.0 及以下版本不支持这种外部定义常量,您必须明确的告诉 Visual FoxPro 这些常量的只是什么!

为了方便网友,笔者特意制作了 Graph9 的头文件(定义所有关于 Graph 9的常量),供大家下载。

应用方法:编辑表单时,选“表单”菜单下“包含文件……”项,把下载的 Msgraph9.h 加入其中。

以后就可以直接使用从Vbagrp9.chm 中查到的常量了:

* #DEFINE xlConeColClustered 99由于已经包含了头文件,这句就可以省了
ThisForm.Graph.charttype=xlConeColClustered

附注:Visual FoxPro 7 的 Intellisense 会自动提供常量与常量值的对应关系,到那时就方便了。