2、 子过程(Sub过程)
子过程是在响应事件时执行的程序段。将模块中的代码分成子过程后,在应用程序中查找和修改代码变得更容易了,子过程类似于用户自定义函数,不同之处是子过程不返回与其名称相关联的值,子过程一般用来从用户那里得到输入数据、显示或打印信息,或者操纵与某一条件相关的几种属性。子过程也用来在过程调用中处理和返回若干个变量。大多数函数只能返回唯一一个值,但子过程却能够返回多个值。
(1)定义Sub子过程
定义子过程的语法格式:
[Private|Public|Friend][Static]Sub过程名[(参数列表)]
[程序段]
[Exit sub]
[程序段]
End Sub
例如:
Private Sub Subtest() Print"This is a Sub procedure" End Sub
说明:
1)Sub过程以Sub开头,以End Sub结束,在Sub和End Sub之间是描述过程操作的语句块,称为“过程体”或“子程序体”。
格式中个参量的含义如下: Public(可选的):表示Sub过程是公有过程,可以在程序的任何地方调用它。各窗体通用的过程通常在标准模块中用Public定义,在窗体层定义的通用过程一般在本窗体中使用,也可以在其它窗体模块中使用。
Private(可选的):表示Sub过程是私有的,只能被本模块中的其它过程访问,不能被其它模块中的过程访问。
Friend(可选的):只能在类模块中使用。表示该Sub过程在整个工程中都可见的,但对对象实例的控件者是不可见的。
Static(可选的):表示在每次调用过程时,局部变量的值保持不变。如果省略Static,则局部变量默认为”自动“的,即在每次调用过程时,局部变量被初始化为0或空字符串。Static属性对在Sub外声明的变量不会产生影响,即使过程中也使用了这些变量。
注:如果没有使用Private,Public或Friend等,Sub过程在缺省情况是公用的。 过程名(必需的):Sub的名称遵循标准的变量命名约定。在同一个模块中,同一个变量名不能既做Sub过程名,又做Function过程名。
参数列表(可选的):代表在调用时要传递给Sub过程的参数的变量列表。如果不止一个参数,则由逗号分开。
“参数列表”指明了调用时传送给过程的参数的类型和个数,每个参数的格式为:
[ByVal]变量名[()][As数据类型]
这里的“变量名”是合法的VB变量名或数组名,如果是数组,则要在数组名后面加一对括号;
“数据类型”指的是变量的类型,如果省略,则默认为Variant;
变量名前面的“ByVal”是可选的。如果加上ByVal,则表明该参数是“传值”参数,否则为“引用”参数。关于这方面内容将在后面详细介绍。
2)在过程体内可以用一个或多个Exit Sub 语句,执行从一个Sub过程中退出。
3)Sub过程不能嵌套。也就是说,在Sub过程内,不能定义Sub过程或Function过程;不能使用GoSub,GoTo或Return来进入或退出Sub过程,只能通过调用执行Sub过程,而且可以嵌套调用。
4)Sub过程可以是递归的,也就是说,该过程可以调用自己来完成某个特定的任务。不过,递归可能会导致堆栈上溢。通常Static关键字和递归的Sub过程不在一起使用。
5)在过程调用中,发送到子过程的参数值和类型必须与子过程声明语句中参数值和类型相符。
下面是一个Sub过程的例子:
Sub Tryout(x As Integer,ByVal y As Integer) x=x+100 y=y*6 print x,y End Sub
上面的过程有两个形式参数,其中第二个前面有ByVal,表明该参数是一个传值参数。
过程可以有参数,也可以不带任何参数——称无参过程。如下例:
Sub ContinueQuery() Do Response$=InputBox$("Continue(Y or N)?") If Response$="N" Or Response$="n" Then End If Response$="Y" Or Response$="y" Then Exit Do Loop End Sub
对于无参过程,调用时只写过程名即可。
(2)建立Sub过程
Sub过程可以在标准模块中建立,也可以在窗体模块中建立。
在标准模块中建立过程的方法有两种。
第一种方法操作步骤为:
1)“添加模块”,同时打开模块“代码窗口”;
2)“工具”菜单/“添加过程”命令,打开“添加过程”对话框;

3)在“名称”框中输入要建立的过程的名字(例如Tryout);
4)在类型栏内选择要建立的过程的类型。如果建立子过程,则选择“子过程”,同样,如果建立的是函数过程,则选择“函数过程”;
5)在范围栏内选择过程的适用范围。选择“公有的”,则建立的过程可用于本工程内所有窗体模块,选择“私有的”,只能用于本标准模块。
6)“确定”。
第二种方法:直接在模块“代码窗口”中键入过程的名字,如键入“Sub Tryout()”后,按回车键。
在窗体模块中建立过程很简单,和上面的第二种方法类似,只是在窗体模块的“代码窗口”中输入。
双击窗体进入“代码窗口”,在对象框中选择“通用”,“过程”框中选择“声明”,然后直接在窗口内键入“Sub Tryout()”后,按回车键。
建立了过程后,在模块“代码窗口”中的“过程”框中,将显示该过程名。
(3)查看其它模块中的过程
要查看其它模块中的过程,请按照以下步骤:
1)"视图"菜单中选取"对象浏览器";
2)在"工程/库"框中选择工程;
3)在"类/模块"列表中选择模块,并在"成员"列表中选择过程;
4)单击右键,在弹出菜单中选取"查看定义",查看选中的过程。
(4)调用子过程
要执行一个过程,必须调用该过程。
调用Sub过程有两种方法:使用Call语句和直接把过程名作为一个语句使用。
1)用Call语句调用Sub过程
格式:Call 过程名[(实际参数)]
如果过程没有参数,则“实际参数”和括号可以省略,否则应给出相应的实际参数,并放在括号内。如:
Call Tryout(a,b)
2)把过程名作为一个语句来使用
这时,省略关键字Call。例如:
Tryour a,b
说明:当使用Call语法时,参数必须在括号内。若省略Call关键字,则也必须去掉参数两边的括号。
例如,先定义一个名为Display的子过程:
Sub Display(disString As String) Cls Print disString End Sub
调用这个子过程(在窗体上添加一个命令按钮):
Private Sub Command1_Click() Call Display("请显示字符串") ' 或者改为:Display"请显示字符串" End Sub
(5)例题
下面将通过一些例子,理解过程的使用。
例1:编写一个计算矩形面积的Sub过程,然后调用该过程计算矩形面积。
程序如下:
Sub Recarea(Rlen,Rwid) Dim Area Area=Rlen*Rwid MsgBox"Total Area is "&Area End sub
Private Sub Command1_Click() Dim A, B A = InputBox("what is the length?") A = Val(A) B = InputBox("what is the width?") B = Val(B) Recarea A, B End Sub
在上面的例子中,Rlen、Rwid称为窗体参数。除窗体参数外,控件也可以作为通用过程的参数,即在一个通用过程中设置相同性质控件所需要的属性,然后用不同的控件调用此过程。
例2:编写一个通用过程,在过程中设置字体属性,并调用该过程显示指定的信息。
界面:
在窗体上添加两个文本框,大小适中。
代码:
Sub Fontout(TextCtrl1 As Control, TextCtrl2 As Control) With TextCtrl1 .FontName = "隶书" .FontSize = 24 .FontItalic = True .FontUnderline = True End With With TextCtrl2 .FontName = "华文彩云" .FontSize = 36 .FontItalic = False .FontUnderline = False End With End Sub
Private Sub Form_Click() Fontout Text1, Text2 End Sub
Private Sub Form_Load() Text1.Text = "欢迎使用" Text2.Text = "Visual Basic 6.0" End Sub
[程序演示]
例3:实现字体闪烁效果。
界面:
在Form1上配置一个计时器控制Timer1、标签控件Label1、命令控件Command1。Timer1的Enabled设置为True;Label1的Caption设置为需闪烁的文字,如“蚌埠电大”;Command1中的Caption设置为“退出”。
代码:
Option Explicit
Private Sub Form_Load() Timer1.Interval = 555 '设置字体闪烁间隔时间 End Sub
Private Sub Timer1_Timer() '利用计时器控件Timer有规律地改变字体颜色 (ForeColor) Chc Label1, 3, 12, 13 '调用过程,Chc过程可循环地改变字体颜色 (ForeColor)
End Sub
Sub Chc(Cont As Control, Color1 As Integer, Color2 As Integer, Color3 As Integer) If Val(Cont.Tag) = Color1 Then Cont.Tag = Color2 ElseIf Val(Cont.Tag) = Color2 Then Cont.Tag = Color3 ElseIf Val(Cont.Tag) = Color3 Then Cont.Tag = Color1 Else Cont.Tag = Color1 End If Cont.ForeColor = QBColor(Cont.Tag) End Sub
Private Sub Command1_Click() End End Sub
[程序演示] [程序下载]
例3:见教材P182自测题五的第4题,设计一个程序,可以对Image控件中的图像进行放大和缩小。
如果不用过程,代码为:
Option Explicit
Private Sub Command1_Click() Image1.Stretch = True Image1.Left = Image1.Left + Image1.Width * 0.5 / 2 Image1.Top = Image1.Top + Image1.Height * 0.5 / 2 Image1.Width = Image1.Width - Image1.Width * 0.5 Image1.Height = Image1.Height - Image1.Height * 0.5 End Sub
Private Sub Command2_Click() Image1.Stretch = True Image1.Left = Image1.Left + Image1.Width * (-1) / 2 Image1.Top = Image1.Top + Image1.Height * (-1) / 2 Image1.Width = Image1.Width - Image1.Width * (-1) Image1.Height = Image1.Height - Image1.Height * (-1) End Sub
本例也可以使用过程,代码为:
Option Explicit
Private Const ratio_small As Single = 0.5 Private Const ratio_large As Single = -1#
Private Sub bianhuan(ByVal img As Image, ByVal ratio As Single) img.Stretch = True img.Left = img.Left + img.Width * ratio / 2# img.Top = img.Top + img.Height * ratio / 2# img.Width = img.Width - img.Width * ratio img.Height = img.Height - img.Height * ratio End Sub
Private Sub Command1_Click() bianhuan Image1, ratio_small End Sub
Private Sub Command2_Click() bianhuan Image1, ratio_large End Sub
[程序演示]
|