VB6.0属性过程详解(Property过程)[第⼀章]
[《VB6.0ActiveX控件开。。。
没有caption属性的控件是这是《VB6.0 ActiveX 控件开发详解》的附属⽂章,如果没有看过这⼀篇⽂章的话应先去看看,除⾮你认为你已经有了⼀定的ActiveX控件开发基础。
第⼀章:认识属性过程
在⽤VB6.0开发ActiveX部件的过程中,我们难免要接触到⼀种不太常⽤(在标准EXE⼯程⾥),但是⼜很重要的的机制,那就是属性过程(Property过程)。属性⼤家经常设置Caption属性,Value属性等等,这些属性要么影响着控件的运⾏⽅式,要么影响着控件的外观,可是,这些属性在控件内部⼜是怎样的呢?
那么我们来看⼀下,⾸先,启动VB6.0,建⽴⼀个标准EXE⼯程,再添加⼀个ActiveX 控件⼯程。将控件设计器的名称属性由UserControl1修改成MyControl。做好后的设置如下图所⽰:
好了,双击⽤户控件设计器,出现⽤户控件设计器的代码窗⼝,如下图所⽰:
这时候,选择【⼯具】菜单的【添加过程】菜单项,做好如下图的设置:
这时候在代码窗⼝出现了如下的代码:
VB代码开始:
Public Property Get ABSS() As Variant
End Property
Public Property Let ABSS(ByVal vNewValue As Variant)
End Property
VB代码结束:
这两个过程就是我们所说的属性过程,它定义了⼀个名为ABSS的属性。这时候我们发现,⼀个属性却有两个属性过程,这两个过程除了⽤Property关键字标识之外,还有⼀个不同的⼦标识,就是Get和Let关键字。现在,我就来介绍⼀下这两种属性过程。
属性过程有三种,均以Property关键字标识,同时,它们⼜具有不同的⼦标识关键字,分别是Get,Let,Set。我们将这三种过程分别称作“属性Get过程”,“属性Let过程”和“属性Set过程”。前⾯两种的声明就如上⾯的代码所⽰,⽽属性Set过程的声明与属性Let过程的类似,只是将Let换成Set⽽已。
不过这些不同⼦标识关键字的属性过程有什么⽤呢?现在,我们将我们设计的MyControl控件拖放到窗体上(由于我们没有对⽤户控件设计器的图形界⾯作更改,所以控件是空⽩的),然后打开窗体的代码窗⼝,在Click事件中加⼊如下的代码,并且在开头设置断点,结果如下图所⽰:
然后我们在⽤户控件设计器的代码窗⼝中加⼊⼀些代码,结果如图所⽰:
接着,我们单击【运⾏】菜单的【启动】菜单项(或单击⼯具栏的启动按钮),⼯程1的窗体出现了,但是断点没什么反应。别着急,单击窗⼝(别单击刚才拖有控件的地⽅),程序在断点处停住了,按F8进⼊下⼀条语句,现在的运⾏情况如下图所⽰:
这就说明程序运⾏到了“a = MyControl1.ABSS”处,这句代码就是将属性ABSS得值读出来并赋给a这个变量,也就是读取属性值。再按F8,这时候我们发现,程序转跳到了属性Get过程⾥,如下图所⽰:
也就是说,当我们通过各种⽅式(属性窗⼝,代码)读取⼀个属性的属性值时,该属性的Get过程就会发⽣。好,弄懂了Get过程。我们再按三次F8。程序⼜回到了窗体1的代码窗⼝,现在到了“MyControl1.ABSS = 1”这⼀句代码。这句代码是将ABSS属性的属性值设成1,就是设置属性值。按照惯例,我们再按⼀次F8。这时候我们发现,程序转跳到了Let过程⾥,如下图所⽰:
这样就说明,当我们通过各种⽅式(属性窗⼝,代码)修改⼀个属性的属性值时,该属性的Let过程就会发⽣。值得注意的是,并不是每⼀个属性都需要Get和Let过程都有,当我们需要设计只读的属性时,我们就需要将Let(Set)过程删掉;当我们需要设计只写的属性时,我们就需要将Get过程删掉。
不过,还没完,既然修改了属性值,那么作为程序员的我们,⼜怎么拿回客户设置的新的属性值呢?⼜是⽼规矩,按F8呗。尽管F8不能让我们拿到新的属性值,但是它可以让我们看到怎么拿回新的属性值。按完F8后,将⿏标移到Let过程的vNewValue参数上。不知道你看到了没有,不过我看到了这个:
还记得上⾯的代码吗?前⾯的代码正是将ABSS属性设为1。其实,我们早就该想到,Let过程的vNewValue参数正是新的属性值,就这样,我们轻⽽易举的拿到了新的属性值。
在此为以前的代码书写错误道歉:严禁在Let和Set过程中直接对属性名称进⾏赋值,我已经修改了所有的图⽰成正确的代码。可能⼤家还是⽆法理解原来的错误是什么,所以我保留⼀幅旧图:
留意Let过程⾥的代码ABSS = vNewValue(新的代码是赋值给gABSS),在ABSS的Let 过程⾥绝对不能出现ABSS=xxx这样的语句,同理,如果是在CDF属性的Let过程⾥也绝对不能出现如CDF=zzz的语句。这就是“在Let过程中为属性名赋值”的含义。之所以不能这样做,是因为当我们通过各种⽅式(属性窗⼝,代码)修改⼀个属性的属性值时,该属性的Let 或Set过程就会发⽣,如果我们在Let或S
et过程⾥为属性名赋值,则会再次引发Let或Set过程发⽣,造成递归(过程调⽤⾃⾝),⽽且是⽆法退出的⽆穷递归,导致程序崩溃,所以绝对不能这样做!
到此,第⼀章完。
你可能会问,那么属性Set过程⼜有什么⽤呢?别着急,那是第⼆章的内容。期待我的下⼀篇博⽂
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论