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

📄 也谈vfp的图表实现.txt

📁 Vfp 文档 一些经典编程文章 可供初学者学习编程时使用
💻 TXT
字号:
实用技巧 
也 谈 动 态 统 计 图 在VFP 中 的 实 现 
河 南 万 宝 公 司 电 算 中 心 
梁 宏 
---- 贵 报1998 年 第7 期I3 版 刊 出 了《 动 态 统 计 图 在VFP 中 的 实 现》 一 文。 文 中 作 者 给 出 了 通 过 调 用 以 下 方 法 实 现 动 态 出 图: 

   DO (_GENGRAPH) WITH (PARM1),(PARM2),...(PARM9)

---- 由 于_GENGRAPH 是VFP 的 系 统 变 量, 它 其 实 就 是 指 向WZGRAPH.APP, 也 就 是 说 该 方 法 实 质 上 就 是 通 过 调 用VFP 附 带 的 向 导 例 程 来 工 作。 
---- 利 用 该 方 法 确 实 能 够 实 现 统 计 图 的 生 成, 但 非 常 遗 憾 的 是 该 方 法 只 能 运 行 在VFP 开 发 环 境 下, 一 旦 脱 离 了 交 互 环 境, 你 得 到 的 不 再 是 统 计 图 形 而 是 一 条 错 误:“ 只 有 在 开 发 环 境 中 才 能 使 用 本 功 能 !" 很 显 然, 这 种 方 法 并 不 实 用。 下 面 笔 者 给 出 自 己 开 发 的 一 个 自 动 统 计 图 生 成 类, 使 得 即 使 脱 离VFP 开 发 环 境 依 然 能 够 随 心 所 欲 地“ 出 图"。 

一、“ 零 件” 加 工:
---- 自 定 义 一 个 基 类 为“CUSTOM " 的 自 定 义 类: "LHGENGRAPH", 为 其 添 加 下 列 属 性: 
---- AutoRefresh : 值 为 .T., 作 用: 控 制 新 生 成 图 形 是 否 刷 新 原 图 形 格 式. 

---- HasLegend : 值 为 .T., 作 用: 控 制 图 形 是 否 有" 图 例". 

---- MainType : 值 为 0, 作 用: 选 定 生 成 图 形 的 主 类 型 号 

---- SaveTable : 值 为 空 , 作 用: 用 来 指 定 生 成 图 形 的 存 放 表, 要 求 该 表 须 有GEN 类 型 字 段. 

---- SubType : 值 为 0, 作 用: 选 定 生 成 图 形 的 次 类 型 号( 值 为 零 为 自 动 选 择). 

---- Title : 值 为" 此 处 填 标 题", 作 用: 生 成 图 形 的 标 题.( 如 为 空 则 无 标 题). 

---- WorkTable : 值 为 空, 作 用: 指 定 统 计 数 据 的 来 源. 要 求 该 表 的 第 一 

---- 列( 最 左 列) 为 统 计 的X 轴( 如 时 间、 部 门 等). 

---- 为 该 类 添 加 以 下 方 法: 

---- LhGenGraph 作 用: 调 用 该 方 法 即 可 自 动 生 成 统 计 图 形. 

---- GetRecVAl 作 用: 由LhGenGraph 方 法 调 用. 取 得 记 录 值. 

---- 以 下 为LhGenGraph 方 法 的 具 体 内 容: 


*--        动态统计图生成
*--        单位:河南万宝股份有限公司电算中心
*--        作者:梁宏   

LOCAL lcWorktable,lcSavetable,lc
Title,llAutogen,llLegend,lnMtype  , lnStype
*--       工作表,保存表,图表标题,
自动刷新 ,图例 ,图形主格式,图形子格式
lcWorktable=THIS.WorkTable
lcSavetable=THIS.SaveTable
lcTitle    =THIS.Title
llAutogen  =THIS.AutoRefresh
llLegend   =THIS.HasLegend
lnMtype    =THIS.MainType
lnStype    =THIS.Subtype
IF ISBL(lcWorktable) .OR. ISBL(lcSavetable)
   =MESSAGEBOX("请先指定工作表和 
产生图形回存表!",64,"提示信息:")
   RETU
ENDIF
#DEFINE CRLF CHR(13)+CHR(10)
#DEFINE TAB CHR(9)
LOCAL lnCursele,lcData,lnFnumber,
lLoop,llOpenwTable,llOpensTable,;
      lnWcurrec,loForm,LHole,lcFieldval,lcFname
lnCursele=SELE()
llOpenwTable=.T.
llOpensTable=.T.
IF USED("&lcWorktable")
   SELE &lcWorktable
   llOpenwTable=.F.
ELSE
   SELE 0
   USE &lcWorktable
ENDIF    
lnWcurrec=RECN()
lnFnumber=FCOUNT()
IF lnFnumber<2
   =MESSAGEBOX("工作表最
少应包含两个字段!",64,"提示信息:")
   RETU
ENDIF   
lcData=" "+TAB
FOR lLoop=2 TO lnFnumber   &&取字段名
    lcData=lcData+FIELD(lLoop)
    IF !EMPTY(FIELD(lLoop+1))
       lcData=lcData+TAB
    ENDIF
ENDFOR
lcData=lcData+CRLF
GO TOP
SCAN
     FOR lLoop=1 to lnFnumber
         lcFieldval=THIS.GetRecVal(FIELD(lLoop))
         IF lLoop<>lnFnumber
            lcData=lcData+lcFieldval+TAB
         ELSE
            lcData=lcData+lcFieldval+CRLF
         ENDIF   
     ENDFOR     
ENDSCAN
IF llOpenwTable
   USE
ELSE
   GO lnWcurrec
ENDIF      
IF USED("&lcSavetable")
   SELE &lcSavetable
   llOpensTable=.F.
ELSE
   SELE 0
   USE &lcSavetable
ENDIF    
IF RECC()=0
   APPE BLANK
ENDIF   
lnFnumber=FCOUNT()
FOR lLoop=1 TO lnFnumber+1
    IF TYPE(FIELD(lLoop))="G"
       EXIT
    ENDIF
ENDFOR       
IF lLoop>lnFnumber
   =MESSAGEBOX("指定的保存表中不
含有< 通用 >字段,因此无法
生成图表",64,"提示信息:")
   RETU
ENDIF
lcFname=FIELD(lLoop)   
IF llAutogen
   APPEND GENERAL &lcFname DATA lcData
  CLASS "MSGRAPH.CHART"
ELSE
   APPEND GENERAL &lcFname DATA lcData  
ENDIF   
loForm=CREATEOBJECT("FORM")
loForm.ADDOBJECT("LHole","OLEBOUNDCONTROL")
loForm.LHole.STRETCH=2
lcCsource=lcSavetable+"."+lcFname
loForm.LHole.CONTROLSOURCE=lcCsource
loForm.LHole.HEIGHT= _SCREEN.HEIGHT
loForm.LHole.WIDTH=_SCREEN.WIDTH 
lcError=ON("ERROR")
ON ERROR APPEND GENERAL &lcFname
 DATA lcData CLASS  "MSGRAPH.CHART"
loForm.LHole.HasLegend=llLegend
IF ISBL(lcTitle)
   loForm.LHole.HasTitle = .F.
ELSE
   loForm.LHole.HasTitle = .T.   
   loForm.LHole.ChartTitle.Caption = lcTitle
ENDIF   
IF lnMtype<>0 .AND. lnStype<>0
   loForm.LHole.AutoFormat(lnMtype,lnStype)
ENDIF   
IF !ISBL(lcError)
   ON ERROR &lcError
ELSE
   ON ERROR
ENDIF      
loForm.RELEASE
* FLUSH
IF llOpensTAble
   USE
ENDIF   
SELE (lnCURSELE)

以下为GetRecVAl方法的具体内容:

*--         转换字段值
LPARAMETER lcFieldname,lcFval,lcFtype
lcFieldname=&lcFieldname
lcFtype=TYPE("lcFieldname")
DO CASE
   CASE lcFtype="D"
        lcFval=DTOC(lcFieldname) 
   CASE lcFtype="C"
        lcFval=ALLT(lcFieldname) 
   CASE lcFtype="T"
        lcFval=TTOC(lcFieldname) 
   OTHERWISE
        lcFval=ALLT(STR(lcFieldname))
ENDCASE
RETU  lcFval
二、 使 用 方 法:
---- 你 可 以 将 本 类 加 入 到 你 的 表 单 上( 比 如 对 象 名 为LHGENGRAPH1), 再 加 入 一 个 按 钮 用 以 触 发LHGENGRAPH1 的LHGENGRAPH 方 法。 当 然 你 需 要 给LHGENGRAPH1 提 供 至 少 两 个 参 数, 那 就 是WorkTable 和SaveTAble, 即 工 作 表 和 图 形 生 成 回 存 表。 要 得 到 这 两 个 表 其 实 很 简 单, 只 需 用SELE 语 句 选 定 你 需 要 进 行 统 计 分 析 的 数 据 列 和 用CREATE TABLE 命 令 创 建 一 个 含 有GEN 类 型 字 段 的 表 即 可。 将SaveTable 的GEN 字 段 拖 放 到 表 单 形 成OLEBOUNDCONTROL 对 象( 该 对 象 即 为 生 成 的 统 计 图 形)。 调 整 该 对 象 大 小 及 属 性 至 满 意。 在 此, 提 供 一 个 技 巧: 运 行 表 单, 双 击OLEBOUNDCONTROL 对 象 进 入 编 辑 状 态, 调 整 该 图 形 的 背 景 等 属 性, 比 如 背 景 填 充 为“ 大 理 石” 面 等, 退 出 编 辑 状 态 后, 将LHGENGRAPH1 的AUTOREFRESH 属 性 设 为.F., 以 后 再 刷 新 该 图 形 时 将 采 用 你 调 整 好 的 格 式。 这 样, 你 就 可 以 得 到 一 个 十 分 优 美 的 统 计 图 形 了。 如 果 您 的 程 序 需 要 发 布 的 话, 注 意 在 执 行“ 安 装 向 导” 时, 应 该 选 中MSGRAPH 选 项( 如 果 用 户 机 器 上 装 有OFFICE97< 含GRAPH8.0 等> 则 可 不 选)。    免 费 订 阅  


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -