ccidnet????

出版日期:2002-03-25 总期号:460 本年期号:10

本期导读
热点聚焦
硬件世界
CCE评测
软件.net
数字生活
社会培训
教育信息化
读者俱乐部
VFP变量的魔术
在VFP中进行对象引用
冯宗任

  VFP最大的特点是它的灵活性。那么什么是灵活性呢?在编程语言的世界里,灵活性几乎就等于是简单易用的反义词。灵活性意味着编程语言把大量的工作留给你自己去定制,而不是预先为你做好它。那么被称为“数据库里的C语言”的VFP,其灵活性具体表现在哪里呢?今天我们就来共同探讨一个魔术——“对象引用”。


  “对象引用”的概念


  什么是“对象引用”呢?在VFP6的时候,有时候在代码中需要输入很长的对象层次。比如,现在我们有一个表单form1,表单上有一个页框pageframe1,页框的第一页上有一个表格grdView,现在,我要把第一列的标题设置为“第一列”,把背景色设置为灰色,正常情况下,我们不得不输入长长的对象层次如:

  thisform.pageframe1.page1.grdview.column1.header1.caption = "第一列"

  thisform.pageframe1.page1.grdview.column1.BackColor = RGB(192,192,192)

  使用With……EndWith结构可以让上面麻烦的输入变得简单点:

  WITH thisform.pageframe1.page1.grdview.column1

  .header1.caption = "第一列"

  .BackColor = RGB(192,192,192)

  ENDWITH

  但是,如果代码中经常出现这样的情况,而且又不一定连贯的话怎么办呢?这时,我们就可以使用对象引用来简化输入:

  LOCAL oColumn ' 建立对表格中Column1对象的引用

  oColumn = thisform.pageframe1.page1.grdview.column1

  oColumn.header1.caption = "第一列"

  oColumn.BackColor = RGB(192,192,192)

  这里建立了一个oColumn变量,然后把它指定为Column1对象的引用,这样,我们就可以像直接操作Column1对象那样操作oColumn变量了。

  卧龙传说提醒:对oColumn的任何操作都会反映到Column1对象上。


  对象引用≠普通变量


  看上去,这个所谓的“对象引用”变量跟普通变量好像没什么区别。那就让我们来证明一下。

  继续使用前面的例子,不过要把上述代码中的Local改为Public,然后把这些代码放入到表单的Init方法中去,运行这个表单后关闭它,看看发生了什么。

  “表单关不掉了!是不是死机了?让我按下Ctrl+Alt+Del试试……”

  “NO!不要这样!”,并没有死机,只是对象的引用在作怪而已。你可以打开调试器来看看究竟发生了什么事:在Local窗口里,表单的变量名还在,它的类型为“O”,可它的值已经为“.NULL.”,也就是说:表单事实上已经被释放了。而在下方的oColumn变量则不同,它的类型为“O”,值却是“对象”!

  原因:任何在表单中建立的Public变量在表单释放时都不会自动被释放。

  由于我们将oColumn对象声明为Public了,所以oColumn对象在关闭表单后没有被释放。

  从这里我们可以看到:利用对象引用的技术,就可以访问到表单上的任何一个对象,这是普通变量所不能达到的。


  传递对象引用


  让我们考虑一下对象引用的优点:对象引用是一种变量,因此你可以像传递一个普通变量那样传递它,包括将它传递到另一个表单;同时,对象引用又不止是一种变量而已,它可以拥有自己的属性、事件、方法——这意味着你甚至可以自由自在地向它添加任意多个自定义属性!

  现在让我们做个精彩的试验:

  1、建立一个表单Form1,表单上放上3个文本框Text1, Text2, Text3、一个 Custom 对象 Custom1、一个命令按钮 cmdTransObj,在命令按钮的Click事件中放入如下代码:

  Do form form2 with this.Custom1

  Thisform.Refresh()

  2、建立一个模式表单Form2(把该表单的WindowType属性设置为“1—模式”),像表单1那样放上3个文本框,给表单建立一个自定义属性oFrm1Cust,在表单的Init事件中输入以下代码:

  PARAMETER oCustom

  This.oFrm1Cust = oCustom

  WITH this

  .Text1.Value = . oFrm1Cust.parent.Text1.Value

  .Text2.Value = . oFrm1Cust.parent.Text2.Value

  .Text3.Value = . oFrm1Cust.parent.Text3.Value

  ENDWITH

  3、在Form2上再添加一个命令按钮cmdReturn,其中放入以下代码:

  WITH THISFORM

  . oFrm1Cust.parent.Text1.Value = .Text1.Value

  . oFrm1Cust.parent.Text2.Value = .Text2.Value

  . oFrm1Cust.parent.Text3.Value = .Text3.Value

  ENDWITH

  THISFORM.Release

  OK,现在运行Form1,在三个文本框中各输入一些数据,然后按下命令按钮。表单1上的数据现在都传递到表单2的三个文本框里了,现在再把表单2里面的数据改动一下,然后按下命令按钮CmdReturn,表单2中所做的改动又反映到表单1里了!

  你可以使用这个方法轻松地在表单间传递多个数据,而且由于可以直接在被调用表单中修改对象引用的数据,你甚至不需要返回任何参数——想想难以从一个表单返回数组的情况、从一个用CreateObject(表单类)的方法建立的表单中无法返回参数的情况——你完全可以相信:这就是最棒的魔术!