第4章 过程
在前面的章节中分别介绍了VB语言基础中的基本概念、数组、语句,这些是VB编程的基础。除了以上知识外,VB的语言基础还包括过程,一个大的系统往往有很多个过程组成,每个过程都是系统的一个小的逻辑部件。过程可以分为子过程和过程函数,其中子过程表示响应事件时执行的代码块,包括通用过程和事件过程两种。通用过程表示供很多个事件过程调用的过程,是为了避免代码的重复书写;事件过程表示某个对象的事件得到触发时,执行的代码段。过程函数也表示一个独立的过程,不过,可以返回一个值到调用的过程,并且两者的语法不同,这些内容都是本章要详细介绍的内容。
4.1 可变参数的例子
过程调用的过程中通常伴随有参数的传递,传递参数的类别多种多样。本节介绍一种可变参数,即传递的参数的数量没有提前确定,只有当传递时才确定数量大小。本节要介绍的实例是计算输入数据的和。
技术要点
在本实例中主要使用的技术是事件过程、通用过程和不定数量的参数,主要功能和用法如下:
●事件过程,主要用于当VB中某个对象的事件被触发时,执行相应操作的代码段,事件过程分为窗体事件过程和控件事件过程。
●通用过程,主要用于供一个或多个事件过程调用的子过程,完成事件过程中的某个功能。
●不定数量的参数,表示被调用过程接受实参的个数是不确定的,即可以接受任意个数的参数。以关键字ParaArray作为标识。
窗体事件过程的具体语法如下:
Private Sub Form或MDIForm_事件名([参数表]) [局部变量或常量声明] [语句块] End Sub
控件事件过程的具体语法为:
Private Sub控件名_事件名([参数表]) [局部变量或常量的声明] [语句块] End Sub
通用过程没有通用的语法标准,具体描述如下:
Private Sub用户自定义过程名([形参数表]) [局部变量或常量的声明] [语句块] End Sub
实现代码
Dim x '定义可变类型变量 Dim y,VSum As Long '定义长整型变量 '求和子过程 Private Sub sumx(ParamArray ArrC()) Dim i As Integer '定义整型变量 For i = 0 To UBound(ArrC) TxtData.Text = TxtData.Text & ArrC(i)&"" '来读每个参数 Next For Each x In ArrC() '遍历数组中的每个元素 y = y + x '求和 Next x VSum = y '把最终结果赋值给VSum End Sub '计算和 Private Sub CmdCalculate_Click() sumx 1,2,6,9,8,15,6,2 '赋参数 TxtSum.Text = VSum '显示最终的和 End Sub '退出系统 Private Sub CmdExit_Click() Unload Me '卸载窗体 End Sub
单击工具栏中的保存按钮,保存工程,然后单击工具栏中的启动按钮,运行工程,程序运行结果如图4.1 所示。输入数据,并单击“计算和”按钮时,程序运行结果如图4.2所示。
图4.1 程序运行初始状态界面图
图4.2 计算和之后的界面图
然后单击工具栏中的结束按钮,或者单击运行窗口的关闭按钮,结束程序的运行。
源程序解读
(1)代码首先定义了一个可变型变量x,两个长整型变量y和VSum。
(2)当单击“CmdCalculate”命令按钮时,就触发CmdCalculate_ Click()事件,这就用到事件过程Private Sub CmdCalculate_ Click(),在该过程中,执行计算输入数据和的操作,首先调用自定义的子过程sumx,并传递可变型参数。
(3)在自定义的子过程Private Sub sumx(ParamArray ArrC())中,可以看到形式参数是一个可变型数组,用来接收传递的可变型变量。在该过程中,首先定义循环变量i。然后运用For循环语句,由文本框控件TxtData显示输入的数据。最后运用For Each循环语句,遍历数组中的元素,并计算数据的和,最后把计算出来的和赋值给变量VSum。
(4)接着转到调用过程,把计算出来的和由“TxtSum”文本框显示出来。
(5)当单击“CmdExit”命令按钮时,就触发CmdExit_ Click()。这就用到另一个事件过程Private Sub CmdExit_ Click()。在该过程中,运用Unload语句卸载当前窗体。
4.2 数组作为过程参数
在上一节中介绍了可变参数的运用,其中要重点注意参数的传递方法和参数的定义方式。在前面已经介绍过数组的相关概念,本节主要介绍数组作为过程参数的用法。
技术要点
本实例中主要用到的技术是过程参数的传递方式。过程参数的传递方式有按值传递和按地址传递。
●按值传递参数,传递的只是变量的副本,当在过程中改变了变量的值,改变的只是副本,不会影响变量本身。按值传递参数的标志是关键字ByVal。
●按地址传递参数,传递的是存储变量的内存地址,当在过程中改变了变量的值,就会永久性的改变变量本身,一般在VB中默认的是按照地址传递参数,本实例中就是按照地址传递的方式传递数组变量,当在过程中给数组排序时,数组也随之改变,所以再次显示数组时,便是排序后的结果,不过运用按地址传递参数时要注意对变量值的改变。
实现代码
Dim ArrValue(4,4) '定义数组变量 Private Sub cmdArray_Click() Call Sort(ArrValue()) '调用过程 Sort For i = 1 To 4 '显示排序后的矩阵值 Text1(i + 3).Text = ArrValue(1,i) '显示数组第一行 Text2(i + 3).Text = ArrValue(2,i) '显示数组第二行 Text3(i + 3).Text = ArrValue(3,i) '显示数组第三行 Text4(i + 3).Text = ArrValue(4,i) '显示数组第四行 Next End Sub '用数组作过程参数 Sub Sort(ByRef arrTemp()) Dim i,j As Integer '定义两个整型变量 For i = 1 To 4 '外循环 For j = 1 To 4 '内循环 arrTemp(i,j)= i + j '给数组排序 Next Next End Sub Private Sub Form_Load() Dim i,j As Integer '定义两个整型变量 For i = 1 To 4 '外循环 For j = 1 To 4 '内循环 ArrValue(i,j)= 10 * i+j '给数组赋初值 Next '显示要排序的矩阵值 Text1(i - 1).Text = ArrValue(1,i) '显示数组第一行 Text2(i - 1).Text = ArrValue(2,i) '显示数组第二行 Text3(i - 1).Text = ArrValue(3,i) '显示数组第三行 Text4(i - 1).Text = ArrValue(4,i) '显示数组第四行 Next End Sub
按Ctrl+S组合键,保存工程,然后按F5键运行工程。单击启动按钮时,程序运行结果如图4.3所示。单击“调用排序过程”按钮时,程序运行结果如图4.4所示。
图4.3 调用排序过程前的界面图
图4.4 调用排序过程后的界面图
源程序解读
(1)首先定义局部全局数组变量ArrValue,主要用于排序。
(2)在Form_ Load()事件中,首先定义两个整型变量i和j作为循环变量。然后运用For循环的嵌套语句给数组赋值,并用文本框控件显示数组。
(3)当单击“cmdArray”命令按钮时,就触发cmdArray_ Click()事件。在该事件中,用Call语句调用排序过程Sort并以数组ArrValue()作为实在参数。
(4)在Sort过程中,以ByRef arrTemp()作为形参,接受传递的参数。首先定义两个整型i和j作为循环变量。然后运用For循环的嵌套语句排序数组,并转换到调用的cmdArray_Click()事件中,最后由文本框数组显示排序后的结果。
4.3 可选参数的实例
在上一节中分别介绍了可变参数和数组作为过程参数,了解了传递参数的类别和参数传递的方式,本节要介绍另外一种过程参数类别——可选参数的实例,即选择参数计算其和。
技术要点
本实例运用的主要技术是可选参数、IsMissing函数和函数过程,主要功能和用法如下:
●可选参数,表示形式参数中的参数是可选的,即可以选择这个参数参与语句块的执行,也可以不选择这个参数参与语句块的执行。可选参数以关键字Optional作为标识,当某个参数前有这个标识时,说明这个参数是可选参数。可选参数是否参与语句块的执行根据IsMissing函数进行判断。
● IsMissing函数,主要用于判断丢失的可选参数。
●函数过程,是一个独立的过程,可以返回一个值到调用过程。
IsMissing函数的具体语法如下:
Function IsMissing(ArgName)As Boolean
其中,参数ArgName表示可选参数名称,如果未传送可选参数,返回True;否则返回False。
函数过程的具体语法如下:
[Private|Public][Static]Function 函数过程名([参数表])[As类型] [语句块] End Function
其中,参数“类型”表示函数过程与变量一样有数据类型,该数据类型从而决定返回值的类型,如果省略该参数,默认数据类型为Variant。
说明:End语句与子过程不同,子过程是End Sub,而函数过程是End Function。
实现代码
Dim x,y As Integer '定义两个整型变量 Private Sub CmbSelect_Click() Select Case CmbSelect.ListIndex '根据组合框中的选项决定参数的选择 Case 0 '两个参数的情况 x = ComAdd(3,4) '调用函数过程 TxtShow.Text = x '显示调用后的结果 Labshow.Caption = "选择两个参数为:3,4" '显示选择的情况 Case 1 '三个参数的情况 y = ComAdd(3,4,5) '调用函数过程 TxtShow.Text = y '显示调用后的结果 Labshow.Caption = "选择三个参数为:3,4,5" '显示选择的情况 End Select End Sub '初始化,给组合框中添加参数选择类别 Private Sub Form_Load() CmbSelect.AddItem "两个参数" '在组合框中添加"两个参数" CmbSelect.AddItem "三个参数" '在组合框中添加"三个参数" End Sub '自定义的函数过程,做参数的累加操作 Function ComAdd(a As Integer,b As Integer,Optional c As Integer) If IsMissing(c)Then '判断是否传递参数c ComAdd = a + b '两个参数的情况 Else ComAdd = a + b + c '三个参数的情况 End If End Function
按Ctrl+S组合键,保存工程,然后按F5键运行工程。当选择组合框中“两个参数”选项时,程序运行结果如图4.5所示。当选择组合框中“三个参数”选项时,程序运行结果如图4.6所示。
图4.5 选择两个参数的界面图
图4.6 选择三个参数的界面图
源程序解读
(1)代码首先定义两个整型变量x和y作为接受过程传递结果的变量。
(2)在Form_ Load()事件中,初始化“CmbSelect”组合框。添加两项参数的选择类别:两个参数和三个参数。单击“CmbSelect”组合框,触发CmbSelect_ Click()事件。这就调用了事件过程Private Sub CmbSelect_ Click()。
(3)在CmbSelect_ Click()事件中,运用Select Case语句,根据“CmbSelect”组合框的ListIndex属性的取值,决定选择参数的个数。当CmbSelect.ListIndex=0时,调用函数过程ComAdd(3,4),表示选择两个参数;当CmbSelect.ListIndex=1时,调用函数过程ComAdd(3, 4,5),表示选择三个参数。
(4)在函数过程Function ComAdd(a As Integer,b As Integer,Optional c As Integer)中,有三个形式参数,两个必选参数a和b,一个可选参数c。运用If语句,根据IsMissing函数的判定结果,选择参加累加的参数个数。如果IsMissing(c)=True,说明c参数丢失,则选择两个参数参加累加操作;否则,选择三个参数参加累加操作。
(5)累加操作完成后,返回调用过程CmbSelect_ Click(),分别使用“TxtShow”文本框和“Labshow”标签显示累加的结果和选择参数的情况。
说明:对于可选参数,也可以给其指定默认值,如本例中可以给参数c指定默认值,方式为:Optional c As Integer=9,如果可选参数丢失,则按照默认值参与运算,否则按照传递的值参与运算。
4.4 运用过程的改变控件背景色和计算参数乘积
在前节中介绍了过程参数传递的类型和过程的类别,希望读者通过上面的介绍,可以对过程的运用有更深入的了解,并注意参数传递时值的改变,在上面的基础上,本节综合介绍一下运用过程改变形状控件背景色和计算选择参数乘积的综合应用实例。
技术要点
本实例中主要运用的技术是通用过程和函数过程的调用以及可选参数设置默认值,主要功能和用法如下:
通用过程的调用,表示由一个事件过程调用的过程。调用通用过程有两种方法,具体语法为:
[Call][Sub]过程名([实参表]) [Sub]过程名([实参表])
函数过程的调用有三种方法,具体语法为:
VarName=函数过程名([实参表]) Call 函数过程名([实参表]) 函数过程名 [实参表]
注意:关键字Call与后面的“()”配对出现,即当调用过程时前面有关键字Call,后面的实参表必须在括号内;当调用过程时前面没有关键字Call,则后面的实参表两侧便不能有括号。
实现代码
Dim x,y As Integer '定义两个整型变量 Private Sub CmbSel_Click() Select Case CmbSel.ListIndex '根据组合框中的选项决定参数的选择 Case 0 '两个参数的情况 x = ComMu(3,4) '调用函数过程 TxtShow.Text = x '显示调用后的结果 LabShow.Caption = "传递两个参数为:3,4" '显示选择的情况 Case 1 '三个参数的情况 y = ComMu(3,4,5) '调用函数过程 TxtShow.Text = y '显示调用后的结果 LabShow.Caption = "传递三个参数为:3,4,5" '显示选择的情况 End Select End Sub Private Sub CmbSelC_Click() Select Case CmbSelC.ListIndex '根据组合框中的选项决定颜色值的选择 Case 0 Call VChange(0) '调用通用过程 LabShowY.Caption = "显示颜色为暗黑色" '显示颜色值 Case 1 Call VChange(1) '调用通用过程 LabShowY.Caption = "显示颜色为蓝色" '显示颜色值 Case 2 Call VChange(2) '调用通用过程 LabShowY.Caption = "显示颜色为绿色" '显示颜色值 Case 3 Call VChange(3) '调用通用过程 LabShowY.Caption = "显示颜色为墨绿色" '显示颜色值 Case 4 Call VChange(4) '调用通用过程 LabShowY.Caption = "显示颜色为褐红色" '显示颜色值 Case 5 Call VChange(5) '调用通用过程 LabShowY.Caption = "显示颜色为紫红色" '显示颜色值 Case 6 Call VChange(6) '调用通用过程 LabShowY.Caption = "显示颜色为黄绿色" '显示颜色值 End Select End Sub '分别初始化组合框CmbSel和CmbSelC Private Sub Form_Load() CmbSel.AddItem "传递两个参数" '添加传递参数个数 CmbSel.AddItem "传递三个参数" '添加传递参数个数 CmbSelC.AddItem "0" '添加颜色数 CmbSelC.AddItem "1" '添加颜色数 CmbSelC.AddItem "2" '添加颜色数 CmbSelC.AddItem "3" '添加颜色数 CmbSelC.AddItem "4" '添加颜色数 CmbSelC.AddItem "5" '添加颜色数 CmbSelC.AddItem "6" '添加颜色数 End Sub Private Function ComMu(a As Integer,b As Integer,Optional c As Integer = 10) ComMu = a * b* c '可选参数有默认值的情况 End Function Private Sub VChange(Index As Integer) Shape1.FillStyle = 1 '设置Shape的FillStyle属性 Shape1.BackStyle = 1 '设置Shape的BackStyle属性 Shape1.BackColor = QBColor(Index) '设置Shape的BackColor属性 End Sub
按Ctrl+S组合键保存工程,然后按F5键运行工程。当选择组合框中“传递两个参数”选项时,程序运行结果如图4.7所示。当选择组合框中“传递三个参数”和“0”选项时,程序运行结果如图4.8所示。
图4.7 传递两个参数的界面图
图4.8 颜色值为0的界面图
源程序解读
(1)代码首先定义了两个整型变量x和y,作为存储乘积结果变量。
(2)在Form_ Load()事件中,分别初始化“CmbSel”组合框和“CmbSelC”组合框。分别添加传递参数的个数和颜色值。
(3)当单击“CmbSel”组合框时,就触发CmbSel的Click事件,从而调用事件过程Private Sub CmbSel_ Click()。
(4)在CmbSel_ Click()事件中,运用Select Case语句,根据CmbSel的ListIndex属性决定传递参数的个数。当ListIndex=0时,调用ComMu(3,4),表示传递参数为两个。当ListIndex=1时,调用ComMu(3,4,5),表示传递参数为三个。
(5)在函数过程Private Function ComMu(a As Integer,b As Integer,Optional c As Integer= 10)中,可以看出,可选参数有默认值10,因此,语句只有一个,即ComMu = a *b *c,当传递两个参数时,c=10参与运算,当传递参数为三个时,c以传递的值参与运算。计算出结果后,返回调用过程CmbSel_ Click(),并分别用文本框和标签显示出计算结果和传递参数的情况。
(6)当单击“CmbSelC”组合框时,就触发CmbSelC的Click事件,调用事件过程Private Sub CmbSelC_ Click()。
(7)在CmbSelC_ Click()事件中,运用Select Case语句,根据CmbSelC的ListIndex属性决定传递颜色的值。当ListIndex=0时,调用通用过程Call VChange(0),表示颜色值为0。当ListIndex=1时,调用通用过程Call VChange(1),表示颜色值为1。当ListIndex=2时,调用通用过程Call VChange(2),表示颜色值为2。当ListIndex=3时,调用通用过程Call VChange(3),表示颜色值为3。当ListIndex=4时,调用通用过程Call VChange(4),表示颜色值为4。当ListIndex=5时,调用通用过程Call VChange(5),表示颜色值为5。
(8)在通用过程Private Sub VChange(Index As Integer)中,由行式参数Index接受传递的参数。首先由Shape控件的FillStyle和BackStyle属性分别设置形状的填充类型和背景类型。然后,由BackColor属性设置形状的背景色。设置完返回调用过程CmbSelC_ Click(),并由标签显示颜色的值。