表单怎么关不掉?揭密VFP对象引用的魔术

这篇博客探讨了对象引用的概念,通过示例解释了如何简化代码并实现对象的操作。作者展示了如何在表单之间传递对象引用,以此实现数据的高效交互,并通过一个实验说明了对象引用在表单关闭后的持久性问题。此外,还介绍了如何利用对象引用进行跨表单数据传递,从而避免传统方法的复杂性。
摘要由CSDN通过智能技术生成

昨天是2022首发直播课,XINJIE老师主讲,猫猫因为在外面培训上课,也就仅仅露了两分钟的脸,没能收看全程,只能看回放了。

这是大家的收获,让大家的软件可以包装一下,更有档次,当然我们也要获取更多的溢价。

来加菲猫的社群,已经有太多的狐友超越我了,所以接下的都会请大家来做分享,来听听他们的知识分享,你的苹果+我的苹果,交换一下,还是一个苹果,但知识,你的知识+我的知识=双倍知识。

很多狐友还不会写类,不会用对象,今天来讲一点基础。以下示例来自网络。

“对象引用”的概念

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

thisform.pageframe1.page1.grid1.column1.header1.caption = ”第一列“
thisform.pageframe1.page1.grid1.column1.BackColor = RGB(192,192,192)

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

WITH thisform.pageframe1.page1.grid1.column1
		.header1.caption = "第一列"
		.BackColor = RGB(192,192,192)
ENDWITH

这里是要求代码一定连续,如果不连续又该怎么办?
把这个对象放入一个变量,变量就变成了对象的分身。

LOCAL oColumn ’建立对表格中Column1对象的引用
oColumn = thisform.pageframe1.page1.grid1.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(表单类)的方法建立的表单中无法返回参数的情况——你完全可以相信:这就是最棒的魔术!
更多资料http://www.sn58.cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加菲猫的VFP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值