网络开发 调用API函数 报表打印 常用技术 经验汇总 控件使用 软件工程 数据处理
您的位置:首页 >> vfp教程 >> 网上文摘 >> 控件使用 >> 正文

GRID高级应用
出处:网络

  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属性所设定的控制来取得和显示数据。

(4)对相应列对象的新增加控制的Visible属性也应置值为.T.,这是因为在程序中所添加的控制或对象,其Visible属性值默认为.F.。
同理,第六栏的输入界面在设计上也应遵循以上四条原则。

(四) 在Grid控制中,如果某列对象单元格的值都不允许修改,则只需将此列对象的ReadOnly属性值置为.T.。

(五) 为了说明Grid控制可以与其他控制或对象“和平共处”,例程特意设计了四个命令按钮,分别是“快速定位”、“第一条记录”、“最后一条记录”、“退出”等,其中前三个命令按钮的处理结果都表明Grid控制与被其控制的数据表文件之间是密切关联的,在Grid控制的表格中移动活动行,则表文件的记录指针也会相应自动移动,同样,当移动表文件的记录指针时,Grid表格的活动单元行也会作相应移动,不过一定要等到Grid控制获得焦点时才能显示出来,因此,在例程中移动或定位了记录指针后立即使用了一条命令Thisform.Grid1.SetFocus,便是编程中的关键。此外,在“快速定位”按钮的处理程序中,使用了“Container”控制来实现窗口的显、隐,即当用户按动“快速定位”命令钮时,会在Grid表格中间部位“弹”出一窗口,提示用户输入欲查询的产品编号或批别号,输入完毕后,窗口“自动”消失,Grid控制会将当前活动行移到与用户要求一致的行上去,这也充分展示了Grid控制与其他对象“和平共处”的良好功能,由于篇幅所限,这一技巧的详细说明不再赘述,读者可通过提供的例程来理解。不过,有一点需要特别提醒一下,在往表单中添加对象时,建立Grid控制的对象要先于建立Container对象进行,否则将达不到预期的显、隐“窗口”之目的。

  例程采用面向对象的程序设计方法来完成,由于VFP提供的面向对象的编程,其格式多种多样,自由灵活,为了体现这一特点,例程中关于对象的建立与属性描述也尽量采用多种方法。采用表单设计器也能实现类似功能,且编程相对快些,感兴趣者不妨按例程所要求的界面来设计试试。

以上是笔者在用VFP5.0编程时,对Grid控制使用技巧的理解与运用,不足之处,希望大家指正。

PUBLIC Myform1
Myform1=CREATEOBJECT("FORM1")
Myform1.Grid1.Column1.Text1.ToolTiptext="此栏只可阅读,不可修改"
Myform1.Grid1.Column1.Header1.Caption = "产品编号或批号"

Myform1.Grid1.Column2.Text1.ToolTiptext="此栏只可阅读,不可修改"
Myform1.Grid1.Column2.Header1.Caption = "产品名称"

Myform1.Grid1.Column3.Header1.Caption = "完工数量"
Myform1.Grid1.Column3.AddObject("Spinner1","Spinner")
Myform1.Grid1.Column3.CurrentControl="Spinner1"
Myform1.Grid1.Column3.Sparse=.F.
Myform1.Grid1.Column3.Spinner1.Visible=.T.
Myform1.Grid1.Column3.Spinner1.ToolTiptext="此栏输入期末完工产量"
Myform1.Grid1.Column3.Spinner1.SpinnerLowValue=0

Myform1.Grid1.Column4.Text1.ToolTiptext="此栏输入期末在产品数量"
Myform1.Grid1.Column4.Header1.Caption = "在产品数量"

Myform1.Grid1.Column5.Header1.Caption = "完工程度(%)"
Myform1.Grid1.Column5.AddObject("Spinner1","Spinner")
Myform1.Grid1.Column5.CurrentControl="Spinner1"
Myform1.Grid1.Column5.Sparse=.F.
Myform1.Grid1.Column5.Spinner1.Visible=.T.
Myform1.Grid1.Column5.Spinner1.ToolTiptext="此栏输入完工程度用百分比表示的值"
Myform1.Grid1.Column5.Spinner1.SpinnerLowValue=0
Myform1.Grid1.Column5.Spinner1.SpinnerHighValue=100

Myform1.Grid1.Column6.Header1.Caption="完工否"
Myform1.Grid1.Column6.AddObject("CheckBox1","CheckBox")
Myform1.Grid1.Column6.CurrentControl="CheckBox1"
Myform1.Grid1.Column6.CheckBox1.Caption=""
Myform1.Grid1.Column6.CheckBox1.Visible=.T.
Myform1.Grid1.Column6.CheckBox1.ToolTiptext="此栏只供阅读"

Myform1.Show()
Clear All
Return

[返回]

     

首页 | 设为首页 | 加入收藏 | 关于本站 | 友情链接 | 版权声明

     
 
Copyright© www.bianceng.cn Powered by 编程入门网 All Rights Reserved
吉ICP备06005558号