⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9934.txt

📁 关于编程技术技巧的文章
💻 TXT
📖 第 1 页 / 共 4 页
字号:
 
****************************************************************

                     用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 + -