这是《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或Set过程里为属性名赋值,则会再次引发Let或Set过程发生,造成递归(过程调用自身),而且是无法退出的无穷递归,导致程序崩溃,所以绝对不能这样做!
到此,第一章完。
你可能会问,那么属性Set过程又有什么用呢?别着急,那是第二章的内容。期待我的下一篇博文《VB6.0属性过程详解(Property过程)[第二章:属性Set过程的应用][……]》