精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VB和Basic>>〓〓..技术文章连载..〓〓>>跟我学用VB的类(系列)>>(转)跟我学用VB的类(系列)之第三天

主题:(转)跟我学用VB的类(系列)之第三天
发信人: pack27()
整理人: gzwsh(2001-05-12 22:56:12), 站内信件
第三天、解决一些细节问题 

在《第二天》中,我们用“类生成器”生成了一个cDeveloper类,这个类还什么也不能做,因为我们还没知诉他怎么做,这时,的cDeveloper类还象一个小婴儿,还只有一个人的样子,我们还要细心地一行一行代码地告诉他如何成为一个程序员。 
在我们进一步写代码之前,我们先看看下面的一些问题——在看这些问题时,请您先把我们的类忘掉,一会儿再来说它。下面的这些问题对您也许太简单,但我认为,讲讲这些问题对理解类模块涵义的是有好处的。 
问题一、子过程 
您如果建立过子过程,一定知道下面语法的意义 
Public Sub name [(ParameterList)] 
   [statements] 
   [Exit Sub] 
   [statements] 
End Sub 
这是创建一个子过程的语法规则,用这个规则,您可以很简单地创建一个子过程,请看下面的代码 
Option Explicit 
Private Sub Form_Load() 
    Quotient 100, 30 
End Sub 

Public Sub Quotient(dblDividend As Double, dblDivisor As Double) 
    Dim dblQuotient As Double 
    dblQuotient = dblDividend / dblDivisor 
    MsgBox "您提供的两参数相除的结果是:" & dblQuotient 
End Sub 

在上的代码中,Quotient是我们创建的一个子过程。为什么要创建这个子过程本来并不是我们在这里要讨论的问题,但我还是在这里再说几句。您也许会说把这个子过程中的内容放在Form_Load中一样可以而且还可以更简化代码。的确的,如果您的整个程序中只调用一次这种简单运算时,可以不象这样写,但如果有很多地方要用到这同一功能,而且这个功能也并不象上面代码中的简单的数学计算,而是一个相当复杂的功能时,根据程序模块化的原则,因该象上面一样把这些可重用的代码写成单独的模块,建立子过程和下面要提到的函数过程就是这其中的两种基本方法。 
问题二、函数过程 
我现在要对上面的代码进行一些修改: 
Private Sub Form_Load() 
    MsgBox "您提供的两参数相除的结果是:" & Quotient(100, 30) 
End Sub 

Public Function Quotient(dblDividend As Double, dblDivisor As Double) As Double 
    Quotient = dblDividend / dblDivisor 
End Function 
我们可以看到,Quotient现在已经可以返回一个值了,因为它已不再是子过程,而是一个函数过程了。 
函数过程的语法可以写成下面这样: 
Public Function name [(ParameterList)] As DataType 
   [statements] 
   [Exit Function] 
   [statements] 
End Function 
问题三、变量的作用范围。 
当我们用Private声明一个变量时,这个变量是模块级(module level)的变量,只有这个模块中的代码可以访问这个变量,对于模块外的调用,是不可用的。 
Optional. Keyword used at module level to declare constants that are available only within the module where the declaration is made. Not allowed in procedures 
当我们用Public声明一个变量时,这个变量是也是模块级的变量,但他可以从所有的过程中所有的模块中调用。我们常称Public声明的变量为全局变量。 
Optional. Keyword used at module level to declare constants that are available to all procedures in all modules. Not allowed in procedures. 
下面,我们来重新回到我们建立的cDeveloper类模块上来。看看《第二天》中生成的那段代码吧:我把由类生成器生成的注释删除,只留下实际的代码。 
Option Explicit 
下面这两句是用Private定义的cDeveloper类模块的内部变量,在这个类模块以外是无法访问这两个变量的,这两个变量是用来存储DeveloperName 和EmpolderTool的值的。 
Private mvarDeveloperName As String 
Private mvarEmpolderTool As String 
下面这两句是定义的两个事件,语法很简单,不是吗?如果这个事件象MouseMove这种事件一样是要带参数的, 可以用Public Event EventName(Parameter1 as ParameterType,Parameter2 as ParameterType)这种方式来声明这个事件。 
Public Event EmpolderLost() 
Public Event EmpolderSucceed() 
下面分别声明的是两个方法,通过上面的讨论,您可以看出来,这其实就是一个子过程。当您的方法是要返回值的时候,您就要把下而的子过程改写成一个函数过程,也就是把其中的Sub改成Function,并且声明返回值的类型,您也可以在“()”中加入要传递进去的参数。 
Public Sub Empolder() 
End Sub 

Public Sub Study() 
End Sub 

下面的语句可以分为两种: 
一种是Property Let语句,当你对这个类的实例指定属性值时,这些Property Let语句会把您指定的值保存到这个实例的相应的内部变量(前面提到的)中。 相当于Text1.Text=strMyString 
另一种是Proporty Get语句,当您读取这个类的实例的属性值时,这些Property Get语句会把您保存在它的相应的内部变量中的值读出并返回给您。相当于strMyString=Text1.Text 
这两种语句对于同一属性来说一般是成对出现的。这是一种理想情况,就是说这个属性可读可写。您有没有注意到,在VB中,有些控件的属性是只读的,比如我们用Command1.name = "cmd"这一句对Command1按钮的Name属性赋值时,是不会成功的。要让我们的类也有只读属性要怎么做呢?只要删除这个属性相关的Property Let语句就可以了。 
Public Property Let EmpolderTool(ByVal vData As String) 
    mvarEmpolderTool = vData 
End Property 

Public Property Get EmpolderTool() As String 
    EmpolderTool = mvarEmpolderTool 
End Property 

Public Property Let DeveloperName(ByVal vData As String) 
    mvarDeveloperName = vData 
End Property 

Public Property Get DeveloperName() As String 
    DeveloperName = mvarDeveloperName 
End Property 

    当然,除了Proporty Get和Property Let语句以外,您也可能会见到另一种Proporty Set语句,那是当您的类的属性的数据类型为Variant或者别的对象变量(比如ADODB.Recordset)时会用到的。 
从上面的讨论,我们可以得出下面的结论:其实类模块就是由:一些变量、一些事件声明语句、一些Sub过程(为了和一般的Sub过程相区别,为了表明这是我们自定义的过程,我把它们叫做子过程)或一些函数过程、Property Let 语句、Property Get语句组成。 
这次,我们了解了类生成器给我们生成的这些东西的意义了,下次,我们将着手添加代码,让这个类能真的做点事。 

(未完待续) 



----
......
不想想起偏更记起
假装开心心更悲
辗转翻侧因为你起
愿你不是你
......
可捒选不恋上你么
可捒选不想你么
种种捒选可以许多
若我不是我
...... 

[关闭][返回]