Database 版 (精华区)
发信人: starstar (星语心愿), 信区: Database
标 题: 对Visual FoxPro表单生成器向导的改进
发信站: 哈工大紫丁香 (2001年05月19日20:28:40 星期六), 站内信件
作为一种可视化的面向对象的编程语言,Visual FoxPro提供了很多非常好的生成
器向导,如表单向导、查询向导、视图向导,甚至还有制作安装盘的向导。使用这
些向导,编程人员可以不用书写任何一句程序而制作出非常漂亮的、功能强大的程
序界面、报表、安装盘等最终成品。使用Visual FoxPro 5.0提供的应用程序向导
,你甚至可以直接制作出一个完整的 Windows 95中的应用程序。在众多的生成器
向导中,表单向导可能是最常用的向导之一,但是在使用中笔者发现表单向导也并
非尽善尽美。以下是笔者使用中发现的两个问题及笔者的改进方法,有兴趣的读者
不妨一试。
为方便演示,需先建立两个表:DEPT和EMP,表结构如下:
DEPT表:
字段名 字段类型 字段长度 标题 索引
DEPTNO Char 6 单位编号 主索引
DNAME Char 20 单位名称
LOA Char 20 单位地址
EMP 表:
字段名 字段类型 字段长度 标题 索引
DEPTNO Char 6 单位编号
EMPNO Char 20 职员编号 主索引
ENAME Char 8 职员姓名
DEPT表为父表,EMP表为子表,两表之间通过DEPTNO字段相关联。
表单向导分为‘表单向导’和‘一对多表单向导’,前者用于为单个表建立数
据操作的表单,后者用于为两个相关表建立数据操作的表单,在表单的表格中显示
子表的字段。首先谈谈‘表单向导’,‘表单向导’可以创建一个显示表中字段并
带有十个按钮的数据操作表单。在此表单中,Visual FoxPro 提供了一个很有用的
按钮:‘查询’按钮,按下‘查询’按钮后可在‘查询’窗口中选择表中不同的字
段输入条件进行查询。进入‘查询’窗口就可发现‘表单向导’的一处明显的‘缺
陷’:字段列表框中直接显示的是表中的字段名,即DEPTNO、DNAME等,用字段名
面向普通操作人员显然是不合适的。笔者对‘表单向导’进行剖析,发现可通过修
改‘表单向导生成器’调用的可视类库WizStyle.VCX中的‘SerchClass’类对其进
行改进。WizStyle.VCX可在Visual FoxPro系统目录下的WizStyle目录中找到。选
择‘文件’菜单中的‘打开’,打开WizStyle.VCX,在‘类名’框中双击‘
SerchClass’即可对‘SerchClase’类进行修改。双击Form进入过程编写窗口,在
‘对象’下拉框中选择cboFields1,‘过程’下拉框中选择‘Init’。改进时用到
Visual FoxPro 提供的一个函数DBGETPROP(),此函数用于从数据库的表中根据
字段名提取相应字段落信息,当然这些信息中也包括‘字段标题’(Caption)信
息,利用此信息即可对‘表单向导’的查询窗口中的列表框进行汉化处理。处理方
法如下:
将‘cboFields1’的‘Init’过程改为如下的程序:
LOCAL i
PUBLIC aWizFList
DIMENSION aWizFList[1]
=AFIELDS(aWizFList)
FOR m.i = FCOUNT() TO 1 STEP -1
IF INLIST(aWizFList[m.i,2],"G","M","U") =ADEL(aWizFList,m.i)
DIMENSION aWizFList[MAX(1,ALEN(aWizFList,1)-1),11]
ENDIF
ENDFOR
OldPath = SET('FullPath')
Set FullPath Off
For m.i = 1 To MAX(1,ALEN(aWizFList,1)-1) + 1
If NOT EMPTY(DBGETPROP(STRTRAN(SUBST(DBF(),3),".DBF")+ ;
'.'+aWizFList(m.i,1), 'Field', 'Caption'))
aWizFList(m.i,1)=DBGETPROP(STRTRAN(SUBST(DBF(),3),;
".DBF")+'.'+aWizFList(m.i,1), 'Field', 'Caption')
EndIf
EndFor
Set FullPath &OldPath
THIS.RowSourceType = 5
THIS.RowSource = "aWizFlist"
THIS.VALUE = THIS.LIST[1]
保存后再运行已生成好的数据操作表单,会发现‘查询’窗口的条件选择框中
的条件已变成相应字段的标题,界面友好性自然大增。
再来谈谈‘一对多表单向导’,笔者认为,微软公司提供此向导或许是为了建
立一个主/从(Master/Detail)表单(父表中记录改变时,子表表格中显示与父表
相关联的子表中值),但却又未能达到主/从表单的效果(子表表格中值始终不发
生变化),故而此向导似乎没有什么意义。笔者对此生成器进行分析,发现无法对
其进行改进,笔者在此只能提供一种生成主/从表单的快捷方式。还是以DEPT和
EMP表为例,DEPT为父表,EMP为子表,当DEPT中记录改变时,EMP的表格中显示相
应单位的人员信息。首先,用‘表单向导’生成DEPT表的操作表单,存储后对其进
行修改。进入表单修改界面,选择表单控制中的‘列表框’在FORM上拉出一个方框
,建立一个列表框(LIST1)用于显示子表中记录,设置LIST1的ColumnCount属性
为3列,CloumnWidth为(100,150,150),RowSource属性为 EMP_A,RowType为
2-别名。双击FORM窗体,建立FORM的Activate过程为:
Select * From EMP Into Cursor EMP_A Where ALLTRIM(EMP.DEPTNO) ==
ALLTRIM(ThisForm.Deptno1.Value)
ThisForm.List1.ReQuery
双击文本框DNAME1,建立DNAME1的Refresh过程,过程内容同上。运行此表单
可见到当父表中记录改变时,LIST1中列出子表中相应记录,这在编制应用程序时
显然是非常常用的方法。
以上的方法均适用于Visual FoxPro 3.0和Visual FoxPro 5.0。
--
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.239.32]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.421毫秒