2008/05/07 | VFP的GRID控制高级应用
类别(数据库学习笔记) | 评论(0) | 阅读(1716) | 发表于 23:02

VFP即Visual FoxPro的缩写,它是目前国内十分流行的微机版数据库管理软件。VFP采用Visual技术,全面支持面向对象的程序设计方法,使得即使比较复杂的编程也变得轻松自如,尤其是它所提供的众多灵活的“控制”(也有称为“控件”)更是魅力无穷,相信使用过它们的人一定会深有体会。笔者在用VFP编程中,发现其中的GRID控制最为奥妙无穷,功能神奇,运用得当的话可以轻而易举完成复杂的程序设计任务,现把其中的一些高级用法介绍给大家,以求抛砖引玉。

  GRID控制是从VFP3.0开始推出的一种新的界面控制,可以说它是Browsers(数据库表文件浏览器)的对象化,两者在界面上比较相似,但在用法上及适应范围各不相同,Browser是一个独立的窗口,而GRID控制则是可以与其他控制共存于一个表单中的表格控件,因此常被使用在应用程序中。在GRID控制中有标题对象(Header Object)、列对象(Column Object)。通常,Header对象用来描述所要显示的表格栏目名称的特征,而列对象则用来提供用户输入的界面,许多人以为列对象的输入界面只能以文本框控制(Textbox Control)来实现,其实不然。文本框控制只是列对象的默认输入界面,使用者完全可以选择其他合适的控制来替代这个默认的输入界面,只不过需要自行加入其他种类的控制(如ComboBox控制、Spinner控制、Checkbox控制等等)到列对象中,加入后修改列对象的有关属性(其中要用到的最重要的列对象属性有CurrentControl特性、Sparse特性以及Visible特性等等)便可利用新的控制所提供的输入界面来进行数据的输入。下面结合一段实例程序来详细说明使用GRID控制可用到的一些高级技巧。

  例程中用到的一些数据表文件也一并附上。

(一) 首先,对例程中所用到的三个数据表文件作简要说明。三个文件中CB_CP.DBF是产品目录库,CB_DD.DBF是生产工作令单库,CB_DY.DBF是期末生产完工情况库,它是例程中用到的主数据文件。为了计算产成品(包括自制半成品)的生产成本,必须对本月投产的产品确定其完工产量以及未完工的在产品数量和在产品的完工程度,其输入数据均保存在CB_DY.DBF中,因此,CB_DY.DBF文件的记录是现成的,而且其“生产对象”字段的内容也是已知的,只是需要往每条记录中输入每种生产对象的完工产量、期末在产品数量以及完工程度等数据。值得注意的是,CB_DY.DBF的“生产对象”字段其实际内容分成两类,一类是产成品、自制半成品的编号即“产品编号”,而另一类则是工作令单的编号即"批号”,若为产品编号的话,根据该值可在产品目录库中找到产品名称,而若是批号的话,则不能直接在产品目录中找到产品名称,而必须先通过该批号值在CB_DD.DBF中寻找对应的工作令单,找到后再根据该工作令单所对应的产品编号值(由CD_DD.DBF文件中的“产品编号”字段提供)搜寻产品目录库从而获得该“生产对象”的名称即产品名称。

(二) 为了完成以上的数据输入工作,同时保证数据输入的方便性,例程采用了GRID控制来设计输入界面:第一栏(Column1)为生产对象,其数据来源于CB_DY的生产对象字段,其栏目标题为“产品编号或工作令单批号”;第二栏(Column2)为产品名称,其数据来源构造比较特殊,设计时采用了IIF函数两重嵌套,表达式为IIF(Upper(Left(CB_DY.生产对象,1))$ "BC",CB_CP.名称,IIF(Seek(CB_DD.产品编号,"CB_CP"), CB_CP.名称,CB_DD.产品编号)),由于已经将CB_DY与CB_CP通过“生产对象”字段单方向关联(注意:虽然,建立关联原则上要求关联的两个表具有同名的关联字段,但实际上不同名时VFP也支持,本例程即利用了VFP的这一特殊性达到了当CB_DY的记录指针移动时, CB_CP的记录指针会自动根据CB_DY的“生产对象”字段值来定位,若“生产对象”字段值为产品编号时,CB_CP的记录指针会定位到相应产品编号的记录位置,于是便可查到产品名称,若不是产品编号,则此时的CB_CP的记录指针会指向文件尾,因此在构造第二栏的数据来源时,先判断“生产对象”字段内容是产品编号还是批号(预先规定产品编号的第一位必须是“B”或“C”两者之一,而批号则为数字),若是产品编号,则直接取与CB_DY已经关联的CB_CP当前记录的“名称”字段;若是批号的话,则由于CB_DY还与CB_DD按照同样原理通过“生产对象”字段建立了关联,因此CB_DD的记录指针会自动定位与“生产对象”值相应的工作令单记录位置上,从而便可知道该批号所对应的产品编号,再通过该产品编号查询产品目录库,便可确知产品名称,这一构造GRID控制某栏数据来源的独特方法便是GRID控制的一大奥秘。第三栏(Column3)是完工数量,该栏需由用户输入实际完工产量,为了说明Grid控制的使用技巧,设计时将此栏的输入界面特意改为“Spinner”控制提供的输入界面,其控制来源为CB_DY数据表的“完工数量”字段;第四栏(Column4)是期末在产品数量,该栏也需由用户输入,其控制来源是CB_DY的“在产品数量”字段,其输入界面采用默认的输入界面;第五栏(Column5)是完工程度,即指期末在产品的完工程度,其控制来源为CB_DY的“完工程度”字段,此栏也需由用户输入百分数,其输入界面也改为由“Spinner”控制提供的输入界面;最后一栏(Column6)是说明栏,表示该产品是否已经全部生产竣工,其控制来源构造比较特殊,它需要根据“完工数量”及“在产品数量”两栏的值来判断,如果用户在“在产品数量”栏输入了数值,或“完工数量”栏数值为零则都视为该生产对象未完工,否则视为完工,因此,该栏的输入控制界面拟采用Checkbox控制提供的界面。第二、六栏的设计表明,在Grid控制中可为栏与栏之间建立关系,也可利用在表(数据表)与表之间已建立的关系。这是Grid控制中经常用到的另一种技巧(事实上,第二栏与第六栏在CB_DY中均无对应的字段)。

(三) 为了实现将第三栏、第五栏的数据输入界面改为由Spinner控制提供的界面,关键把握以下四点:

(1)需要在程序中为相应的列对象加入Spinner控制,如在例程中通过:
Myform.Grid1.Column3.AddObject("Spinner1","Spinner")
Myform.Grid1.Column5.AddObject("Spinner1","Spinner")两条语句达到此目的。

(2) 需要将相应列对象的CurrentControl属性改为“Spinner1”。

(3) 相应列对象的Sparse特性也要视需要进行变动,当Sparse特性值为.T.(此为缺省值)
时表示此列对象只有活动单元格会根据CurrentControl属性的设定取得和显示数据,其他单元格则仍使用默认的Textbox控制来取得和显示数据;而当Sparse特性值为.F.时,则该列对象所有单元格均使用由CurrentControl属性所设定的控制来取得和显示数据。

 

 

1

评论Comments