📄 9934.txt
字号:
****************************************************************
用VFP 3.0绘制统计图形
北京有色冶金设计研究总院(100039) 祝建荣
Visual Foxpro 3.0(以下简称VFP)提供了一个调用MS-Graph统计图形的向
导程序 ,其程序名为WZGRAPH.APP。遗憾的是,利用该向导程序只能以交互
的方法绘制统计图,无 法以编程的方式根据不同的需要灵活地控制统计图。
而VB 4.0提供了一个绘制统计图形的 Graph控件,该控件是以OLE DLL方式
提供的,具有很强的绘图功能,包括直方图、饼图等11 种图形。VFP的OLE容
器控制可以调用该Graph控件,达到绘制统计图形的目的。
Graph控件属性
Graph控件提供的属性非常丰富,共有五十多种,详细说明可以参考VB4.0的
用户控件手册,下面将介绍几个常用的属性。
·AutoInc:向统计图数组属性赋值时,是否自动增加计数属性(ThisPoint、
ThisSet属性)的值。AutoInc=1自动,AutoInc=0由人工增加。
·DrawMode:定义图形如何绘制。其赋值如下:
DrawMode=0图不出现
DrawMode=1 图形显示为空,但按BackGroup属性的颜色显示背景和显示
GraphCapt ion属性设置的标题
DrawMode=2重新显示图形
DrawMode=3以位图方式显示图形
DrawMode=4将图形拷贝到剪贴板
DrawMode=5打印图形的拷贝
DrawMode=6将图形保存到文件
·GraphCaption:指定图的标题。
·GraphTitle:指定数据集的数目。
·ThisPoint:指定或返回当前点的位置。
·ThisData:设定作图的数据,该属性是数组属性,数据在图上的位置由
ThisPoint和ThisSet属性确定。
·LabelText:每个数据点的标号,该属性也是数组属性,数据点在图上的位
置由ThisPoint和ThisSet属性确定。
·GraphType:指定图形的类型。其赋值如下:
GraphType=0 没有图形
GraphType=1 二维饼图
GraphType=2 三维饼图
GraphType=3(缺省)二维直方图
GraphType=4三维直方图
GraphType=5甘道图
GraphType=6线图
GraphType=7日志/线图
GraphType=8区域图
GraphType=9散点图
GraphType=10极状图
GraphType=11高低图
实现方法
首先,将VB4.0中的Graph32.OCX文件拷贝到Windows系统的system目录下,随
后应对该控件进行注册。运行VFP系统,在主菜单中选择"工具"项,然后选择
"选项",在弹 出的页框控制窗口中选择"控制"项,选中OLE控制项。此时在
列表框中会列出所有的已注 册的OLE控制,选择"添加"按钮,系统会弹出一
个输入文件名的窗口,将system目录下的 Graph32.OCX文件选入,则在OLE控
制列表框中会出现Pinnacle-BPS Graph Control项。
现在完全可以像使用Outline控制那样使用Graph控制,在VFP下既可以使用
表单设计器,也可以使用类设计器来编制统计图形程序;在程序中完全可以
对图形的每个细节进行 控制。
下面的例子是对Graph控制的简单应用,首先定义了一个表单类,在该表单中
加入一个 Graph OLE控制,其OleClass="GraphLib.Graph"。为了简单起见,
统计图形数据采用直接 将数据赋值到GraphData和LabelText属性,当然也
可以将数据库中的数据赋到该属性中进行 绘图。
本程序的运行环境为:中文Windows 95,中文VFP 3.0。
……
frmMyForm=CREATEOBJECT(‘frmGraph') &&创建表单
frmMyForm.Caption=‘统计图形窗口'
frmMyForm.oleGraphObject.GraphTitle=‘统计图形'
*可根据实际情况,用数据库中的数据
*或内存变量中的数据进行绘图
With frmMyForm.oleGraphObject
·NumSets=2 &&共两组数据
·NumPoints=4 &&每组数据点4个
·AutoInc=1 &&自动增加计数
*设置统计数据
·ThisPoint=1
·ThisSet=1
·GraphData=10
·GraphData=20
·GraphData=30
·GraphData=40
·GraphData=20
·GraphData=30
·GraphData=40
·GraphData=50
*设置标号
·ThisPoint=1
·ThisSet=1
·DataReset=4
·LabelText=' 1月'
·LabelText=' 2月'
·LabelText=' 3月'
·LabelText=' 4月'
·GraphType=4 && 三维直方图
·GridStyle=3 && 设置网格
Endwith
frmMyForm.Show && 显示表单
READ EVENTS && 启动事件处理
*定义表单类
Define Class frmGraph As Form
AutoCenter=.T.
Closable=.F. && 废止控制菜单框
BackColor=RGB(192,192,192)
Height=350
Width=500
ControlBox=.F.
*创建退出命令按钮
ADD OBJECT cmdMyCmdBtn1 AS CommandButton;
With Caption='退出[<X]',;
Cancel=.T.,:
Left=200,;
Top=310,;
Height=25,;
Visible=.T.,:
PROCEDURE cmdMyCmdBtn1.Click
CLEAR EVEBTS &&结束事件处理,关闭表单
ENDPROC
*创建统计图形对象
ADD OBJECT oleGraphObject as OLEControl;
WITH OleClass="GraphLib.Graph",;
Visible=.T.,;
Height=300,;
Width=500
oleGraphObject.PrintStyle=2 &&彩色方式打印。
ENDDEFINE
****************************************************************
在PB中巧用下拉数据窗口
北京 刘增进
---- PowerBuilder 作 为 目 前 比 较 流 行 的 一 种 开 发 工 具,
有 其 独 到 之 处, 那 就 是 数 据 窗 口 (DataWindow)。 可 以 说,
数 据 窗 口 是PowerBuilder 的 核 心, 在 对 数 据 库 的 开 发 过
程 中, 无 论 是 录 入、 查 询、 统 计 还 是 报 表, 都 离 不 开
数 据 窗 口。 但 是, 除 了 数 据 窗 口,PB 还 提 供 了 下 拉 数
据 窗 口(DropDown DataWindow), 下 拉 数 据 窗 口 的 使 用, 使
数 据 窗 口 更 灵 活, 更 方 便, 下 面 举 例 介 绍 在 数 据 窗
口 中 使 用 下 拉 数 据 窗 口 的 一 些 技 巧。
---- 在 用 数 据 窗 口 作 数 据 录 入 时, 经 常 用 到 代 码 录
入, 即 对 经 常 输 入 的 某 些 值 设 置 代 码, 录 入 时 直 接
录 入 代 码 即 可。 例 如, 有 两 个 表, 主 表main_table 和 代
码 表code_table, 结 构 如 下:
main_table
字段名 类型 长度 描述
id integer 标识号
name char 8 姓名
sex char 4 性别
city Varchar 30 城市
unit Varchar 40 单位
---- 下 面, 详 细 讨 论 如 何 使 用 下 拉 数 据 窗 口:
一、 静 态 设 计 下 拉 数 据 窗 口
---- 首 先 对 主 表 和 代 码 表 设 计 两 个 数 据 窗 口dw_main 和
dw_code, 其 中dw_main 包 括 字 段id,name,sex,city 和unit;dw_code
包 括 字 段code 和data。 假 设 unit 字 段 有 几 个 常 用 值 可 使
用 代 码 录 入, 则 在 设 计dw_main 时, 用 鼠 标 右 键 点 击 字
段unit, 在 下 拉 菜 单 中 选 择Properties...( 属 性), 则 系
统 会 弹 出unit 列 的 属 性 对 话 框, 在 其 中 选 择Edit( 编 辑)
项, 并 在Style( 风 格) 下 拉 列 表 框 中 选 择 DropDownDW 项,
然 后 在 下 面 的Options( 选 项) 框 中 作 具 体 的 选 项 配 置:
在DataWindow 下 拉 框 中 选 择 已 设 计 好 的 代 码 数 据 窗 口
dw_code 作 为 下 拉 数 据 窗 口; 在DisplayColumn( 显 示 列) 下
拉 框 中 选 择code 字 段; 在Data Column( 数 据 列) 下 拉 框 中
选 择data 字 段 , 这 表 示 显 示 的 是code 字 段 的 内 容, 而 实
际 存 于 表main_table 中 的 是data 字 段 的 内 容。 至 此, 数 据
窗 口 设 计 完 毕。
---- 设 计 完 数 据 窗 口 后, 需 要 建 立 一 个 数 据 录 入 的 窗
口(window), 名 字 为w_input, 在 窗 口w_input 上 建 立 一 个 数
据 窗 口 的 控 件dw_1, 其 属 性DataWindow Object Name 为dw_main。
并 在w_input 的open 事 件 中 写 入 下 列 语 句:
dw_1.SetTransObject(SQLCA)
dw_1.Retrieve()
---- 这 样, 在 执 行 此 窗 口 时, 在unit 字 段 上 就 会 出 现 一
个 下 拉 列 表 框, 列 出 了 表code_table 中 所 有 的 内 容, 用
户 可 以 用 鼠 标 选 择 录 入。
二、 动 态 改 变SQL 语 句
---- 在 上 面 的 例 子 中, 如 果 表main_table 中 的 字 段city 也 需
要 代 码 录 入, 则 还 需 为city 字 段 新 建 一 个 表, 这 样 很 麻
烦, 因 为 有 几 个 字 段 需 要 代 码, 就 须 有 几 个 表 与 之 对
应。 我 们 可 利 用 下 拉 数 据 窗 口 的 一 些 特 点 减 少 麻 烦。
对 此, 可 以 相 应 地 修 改 表code_table 的 结 构, 加 一 个 字 段
field(char(30)), 以 存 储 需 要 代 码 的 字 段 名, 这 样, 就 可
利 用SQL 语 句 对 之 进 行 检 索, 以 得 到 某 字 段 的 所 有 代 码。
具 体 实 现 如 下: 重 新 设 计 数 据 窗 口dw_code, 把field 字 段
加 上 并 使 它 不 可 见, 因 为 用 户 不 需 要 见 到 该 字 段 的 内
容), 数 据 窗 口dw_main 和 窗 口w_input 的 设 置 如 上, 只 是 在
数 据 窗 口dw_1 中 需 要 进 行 一 些 编 程, 具 体 是 在 ItemFocusChanged
事 件 中, 加 入 如 下 的 代 码:
String ls_sql
Integer rtncode
DataWindowChild field_child
//dwo为该事件的参数,
其name属性的值表示获得焦点的字段名
Choose Case lower(dwo.name)
Case 'city' //city字段获得焦点
//获得city字段下拉数据窗口的句柄
rtncode = dw_1.GetChild("city",field_child)
If rtncode = -1 Then MessageBox( "Error", "Not a DataWindowChild")
//设置事务对象
field_child.SetTransObject(SQLCA)
//获得下拉数据窗口的SQL语句
ls_sql = field_child.GetSQLSelect()
//重新设置SQL语句,加上Where条件
ls_sql = ls_sql + " Where field = '" + dwo.name + "'"
field_child.SetSQLSelect(ls_sql)
//取得满足条件的数据
field_child.Retrieve()
Case 'unit' //unit字段获得焦点
//获得unit字段下拉数据窗口的句柄
rtncode = dw_1.GetChild("unit",field_child)
......(此处编程同上一样)
End Choose
三、 动 态 设 置 取 值 参 数
---- 上 例 中, 是 采 用 动 态 改 变SQL 语 句 实 现 的,其 实, 下
拉 数 据 窗 口 有 一 种 更 简 单 的 方 法 就 是 设 置 取 值 参 数
(Retrieval Arguments) 但 这 种 方 法 适 合 从 固 定 表 中 取 数 据,
如 果 是 从 动 态 表( 即 表 名 不 固 定) 中 取 数 据, 则 只 能 通
过 改 变SQL 语 句 来 实 现。
---- 修 改 数 据 窗 口dw_code, 在 图 形 方 式 下, 选 择 Design 菜
单 下 的Retrieval Arguments..., 设 置 取 值 参 数 的 类 型 为String,
名 字 可 任 取, 假 设 为field_data , 然 后 在 窗 口 下 面 的Where
标 签 中 选 择Column 为"code_table.field",Operator 为" =",Value 为
取 值 参 数 的 值:field_data( 变 量 名 前 加 冒 号 表 示 该 变 量 的
值),至 此, 取 值 参 数 设 置 完 毕。 同 上 例, 也 需 要 在 窗 口
w_input 中 的 数 据 窗 口 控 件dw_1 中 的ItemFocusChanged 事 件 中 进
行 如 下 的 编 程:
Integer rtncode
DataWindowChild field_child
//dwo为该事件的参数,
其name属性的值表示获得焦点的字段名
Choose Case lower(dwo.name)
Case 'city' //city字段获得焦点
//获得city字段下拉数据窗口的句柄
rtncode = dw_1.GetChild("city",field_child)
If rtncode = -1 Then MessageBox
( "Error", "Not a DataWindowChild")
//设置事务对象
field_child.SetTransObject(SQLCA)
---- // 利 用 取 值 参 数 取 得 满 足 条 件 的 数 据, 如 果 没
有 数 据, 则 插 入 一 空 记 录,// 否 则 系 统 会 提 示 一 个 英
文 对 话 框, 要 求 输 入 取 值 参 数 的 值。
If field_child.Retrieve(dwo.name) < 1 Then field_child.InsertRow(0)
Case 'unit' //unit字段获得焦点
//获得unit字段下拉数据窗口的句柄
rtncode = dw_1.GetChild("unit",field_child)
......(此处编程同上一样)
End Choose
---- 至 此, 已 介 绍 了 使 用 下 拉 数 据 窗 口 的 一 些 技 巧,
希 望 能 给 读 者 提 供 一 些 帮 助。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -