现在的位置: 首页 > 综合 > 正文

VB6.0属性过程详解(Property过程)[第二章:属性Set过程的应用(设计如字体属性的具有弹出式对话框的属性)] VB6.0属性过程详解(Property过程)

2013年10月23日 ⁄ 综合 ⁄ 共 3234字 ⁄ 字号 评论关闭

 

     这里是《VB6.0属性过程详解(Property过程) 》的第二章,如果你没有看过上面的这篇文章,你应该先去看看,除非你觉得你已经初步了解了属性过程的运作机制。

            第二章:第一节:属性Set过程的应用

       上一章,我介绍了属性Get过程,属性Set过程的用途,现在我来说一下属性Set过程。先看看以下的几张图片:

这是字体属性的对话框

这是Picture属性的对话框。

       不知道你有没有想过,这两个如此常用的属性,他们的属性过程又是怎样的,才能使到单击这个属性时出现一个对话框呢?这就是属性Set过程的用途。当一个属性本身就是一个对象时,声明这个属性就需要用到属性Set过程,而且有了属性Set过程就不再需要Let过程了。但是,并非所有的对象都能被弄成属性,针对字体属性和Picture属性,VB提供了两个对应的对象作为编程接口,那就是StdFont和StdPicture对象。现在,我就以字体属性为例进行说明。

       我们对以前的代码进行修改:

VB代码开始:

Dim gAbss As StdFont

Public Property Get ABSS() As StdFont

 

End Property

Public Property Set ABSS(ByVal vNewValue As StdFont)

 

End Property

VB代码结束

我们可以看到,原来的ABSS属性的Let过程已经被改成了Set过程,实际上就是把Let换成Set。然后还能看到我将属性的类型设置成StdFont。然后我们在属性Get过程里加入如下代码:

VB代码开始:

Set ABSS = gAbss
VB代码结束

然后在属性Set过程里加入如下代码:

VB代码开始:

Set gAbss = vNewValue

VB代码结束

       不知道大家是否留意到上面的代码我都是用了Set语句,那就是因为变量gAbss,属性ABSS,和参数vNewValue他们的类型都是StdFont对象,而对象间的复制就必须使用Set语句。还有不知道大家是否有过这样的疑问,为什么在Let(set)过程里获得的新的属性值不是直接通过“ABSS
= vNewValue”语句赋值给属性,而是要用“gAbss = vNewValue”赋值给一个变量呢?其实很简单,还记得我所过的吗?当我们以任何形式给一个属性设置值时,属性的Let(Set)过程就会发生,所以如果在Let过程里使用“ABSS = vNewValue”语句,就会造成归递,最终的结果只有一条:“
内存溢出(错误 7)”。
所以谨记:不能在Let或Set过程里出现属性名称在左边的赋值语句。同时说一下,在Get过程里的“ABSS
= vNewValue”语句不会引发Let(Set)过程。

      现在,我们回到窗体中,单击一下我们之前拖放到窗体上的MyControl控件,然后看属性页,我们就能看到ABSS这个属性,用鼠标点击一下它,我们看到了在属性的右边出现了一个“...”的按钮,如下图所示:

单击一下那个按钮,就出现了字体对话框。现在我们随便做一些设置,然后单击确定按钮。但是我们却看到了如下的提示:

这又是为什么呢?原来光是用Get和Set语句将ABSS属性的类型改成StdFont对象类型还是不行的,我们知道,每一个对象我们都需要用New语句(不管你是在Dim语句里用还是在Set语句里用)来明确指出创建一个新的对象。之前的声明只是说明了ABSS这个属性是StdFont类型的,但却没有明确的创建一个StdFont对象。明白了为什么之后,为了解决这个问题,我们在用户控件设计器的Initialize事件中加入如下的代码:

VB代码开始:

Set ABSS = New StdFont

VB代码结束

       这样我们便使到ABSS属性成为一个真正的对象。关掉用户控件设计器和他的代码窗口。打开窗体,按照上面的步骤,打开字体对话框,做一些设置,点击确定,没问题了,不再出现那个提示了。
       同样的,我们可以用相同的方法做出带有加载图片(StdPicture对象)对话框的属性。

 

第二节:带参数的属性过程

        我们会设计带有参数的函数,子过程。同样,属性过程一样可以带有参数。大家可能还没有想到带参数的属性过程有什么用,不过,在下面的讲述中,你可以慢慢地体会到它的用处。

        对于一个对象集(包含有多个相同结构的不同实例的控制权的对象。可以通过这个对象返回其某个子对象的引用),我们需要返回某一个子对象的引用,这时候我们就需要一个参数,来标识我们到底需要的是那个子对象。书写下面代码:

VB代码开始:

Public Property Get SomeObject(ByVal Index As Integer) As Cls_ABC

 

End Property

Public Property Set SomeObject(ByVal Index As Integer, ByVal vNewValueAs Cls_ABC)

 

End Property

VB代码结束

        上面的代码比以前的代码多了一些东西,就是一个Index参数。我们将用这个参数来确定我们要的是那个子对象。在写带参数的属性过程的时候,我们必须要注意几点:

    ①Set或Let过程的参数是放在前面的,最后一个参数用来接收新的属性值(下面所说的参数都不包括最后一个)

    ②Get过程的参数必须要跟Set或Let过程的参数相一致。

    ③属性过程的参数不能使用Optional
ParamArray关键字。

       
从上面的注意事项不难看出,不仅是例子里的Set过程能够有参数,Let过程也可以有参数,只要符合上述的规范,都是被允许的。

        如果你还只是觉得这样的描述显得很抽象,在应用方面无从下手,那么下面就来设计一个小程序,来说明带参数的属性过程的应用。

        (1)启动VB。选择【标准EXE】工程

        (2)选择【工程】菜单的【添加类模块】菜单项,从弹出的对话框中选择【类模块】,添加两个类模块

                

        (3)将其中一个类模块重命名为ABC,另一个为DEF(DEF是ABC的子对象)如图所示。

                

         (4)在类模块DEF中书写如图的代码

                

        (5)在类模块中书写如下图的代码

               

      (6)在Form1的代码写书写如下代码:

               

        如果完全按照上面的代码,当我们单击【运行】,我们会看到一个消息框,显示数字“0”。那么这说明什么呢?在上面我建立了Form1→ABC→{DEF(0),DEF(1)……}的结构。先是Form1创建ABC。在ABC被创建的时候(ABC类模块的Class_Initialize事件),就自动创建了5个DEF对象(如(5)中的代码),并分别给这五个DEF对象的Now属性赋以当前的数组索引。

        所以,在Form1的代码中以Set NowDEF = NewABC.Item(0)返回了所以为0的DEF对象的引用,最终消息框输出的值自然就是0了。你可以试一下,把Form1代码的Set NowDEF = NewABC.Item(0)改为Set NowDEF = NewABC.Item(1),那么输出的就是1了。以此类推。

        在这里,我们看到了参数的作用,实际上参数并不只是有用于标示所需的对象这一功能,你还可以根据实际,设计别的用途的参数。

     然而,如果我们只是想属性设置成某一些值,像BackStyle属性那样,属性过程又该怎么写呢?别着急,请看第三章:《VB6.0属性过程详解(Property过程)[第三章:枚举属性和OLE_COLOR类型(设计限定输入的属性,如DragMode属性)]》

抱歉!评论已关闭.