Database 版 (精华区)

发信人: mengy (LEAR DLLS 命令时,将从内存中清除), 信区: Database
标  题: 对Visual FoxPro表单生成器向导的改进
发信站: 哈工大紫丁香 (2000年12月13日09:21:33 星期三), 站内信件

对Visual FoxPro表单生成器向导的改进

    作为一种可视化的面向对象的编程语言,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.227.121]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.162毫秒