《vb编程技术》过程.ppt_第1页
《vb编程技术》过程.ppt_第2页
《vb编程技术》过程.ppt_第3页
《vb编程技术》过程.ppt_第4页
《vb编程技术》过程.ppt_第5页
已阅读5页,还剩120页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章 过程,8.1 Sub过程 8.2 Function过程 8.3 参数传递 8.4 键盘与鼠标事件过程 习题八,8.1 Sub 过 程,8.1.1 事件过程与通用过程 1. 事件过程 事件过程由VB自行声明,用户不能增加或删除。 当用户对某个对象发出一个动作时,Windows会通知VB产生了一个事件,VB会自动地调用与该事件相关的事件过程。,控件事件过程的语法为 Private Sub控件名_事件名(形参表) 语句组 End Sub 窗体事件过程的语法为: Private Sub Form_事件名(形参表) 语句组 End Sub,图8.1 “代码编辑器”窗口,图8.2 设置对象的Name属性,2. 通用过程 通用过程不与任何特定的事件相联系,只能由别的过程来调用,它可以存储在窗体或标准模块中。,8.1.2 通用过程的创建 1. 在“代码”编辑窗口中输入 在“代码”编辑窗口中,把光标定位在已有过程的外面。然后按如下格式输入通用过程: Private | Public Static Sub过程名( 形参表 ) 语句列 Exit Sub 语句列 End Sub,2. 使用“添加过程”对话框 使用“添加过程”对话框建立过程的方法为 (1) 打开要添加过程的代码编辑窗口。 (2) 执行“工具”菜单中的“添加过程”命令, 打开“添加过程”对话框, 如图8.3所示。 (3) 在“名称”文本框中输入过程名。从“类型”组中选择过程类型。从“范围”组中选择范围,相当于使用Public或Private关键字。 (4) 单击“确定”按钮,在代码窗口中显示情况如图8.4所示。,图8.3 “添加过程”对话框,图8.4 代码编辑窗口,8.1.3 通用过程的调用 每次调用过程都会执行Sub和End Sub之间的语句列。Sub过程以Sub开始,以End Sub结束。当程序遇到End Sub时,退出过程,立即返回到调用语句的后续语句。 调用过程有诸多技巧,它们与过程的类型、位置以及在应用程序中的使用方式有关。,调用Sub过程有两种方法: (1) 使用Call语句:Call过程名( 实参表 ) (2) 直接使用过程名:过程名实参表,【例8-1】 编写一个计算矩形面积的Sub过程,然后调用该过程计算矩形面积。 设计步骤如下: (1) 建立应用程序用户界面并设置对象属性,如图8.5所示。,图8.5 建立计算矩形面积的用户界面,(2) 在代码窗口中直接输入通用事件代码。 Sub recarea(rlen, rwid) Dim area area = rlen * rwid 计算矩形面积 MsgBox “矩形的面积是:“ & area 用消息框输出矩形面积 End Sub,(3) 编写窗体Form的单击Click事件代码。 Private Sub Form_Click() Dim a, b a = InputBox(“请输入矩形面积的长度:”) 用输入框输入矩形的长 b = InputBox(“请输入矩形面积的宽度:”) 用输入框输入矩形的宽 recarea a, b 调用recarea过程,也可以改为Call recarea(a, b) End Sub 如图8.6所示,编写子过程与窗体的事件过程代码。,图8.6 子过程与窗体的事件过程代码,(4) 运行工程。 单击标准工具栏中的“启动”按钮,运行工程,单击窗体,依次输入矩形的长、宽,如图8.7所示,求得矩形面积如图8.8所示。,图8.7 输入矩形的长、宽,图8.8 矩形面积的计算结果,【例8-2】 编写一个用来延迟指定时间(秒)的Sub过程。通过调用该过程,按指定的时间间隔显示若干行信息。,设计步骤如下: (1) 为了简化操作,直接在窗体上输出。 (2) 编写通用事件过程代码: Static Sub delayloop(delaytime) Const secinday = 24& * 60& * 60& 一整天的秒数 loopfinish = Timer + delaytime 计算完成时间 If loopfinish secinday Then 如果延迟时间从午夜前开,loopfinish = loopfinish - secinday Do While Timer loopfinish 利用空循环实现延迟 Loop End If Do While Timer loopfinish 利用空循环实现延迟 Loop End Sub,一般情况下,Timer比loopfinish要小,因此可以用 Do While Timer loopfinish Loop 来控制时间延迟。,用上面的delayloop过程可以延迟指定的时间,调用时用需要延迟的时间(秒)作为实参。例如,延迟3秒可以用下面的代码实现: delayloop 3,(3) 编写窗体Form的Click事件代码: Private Sub Form_Click() Print “ 输出第一行内容。“ Print Print “ 请等3秒。“ delayloop 3 调用通用过程,延迟3秒 Print Print “ 输出第二行内容。“,Print Print “ 请等6秒。“ Call delayloop(6) 调用通用过程,延迟6秒 Print Print “ 输出第三行内容。“ End Sub 运行程序。单击窗体,显示第一部分内容,等待3秒后,显示第二部分内容,再过6秒显示第三部分内容,如图8.9所示。,图8.9 时间延迟示例,8.2 Function 过 程,8.2.1 Function过程的定义 与Sub过程一样,Function过程也是一个独立的过程,可读取参数、执行一系列语句并改变其参数的值。与Sub过程不同的是,Function过程可返回一个值。Function过程的语法是:, Private | Public Static Function函数名( 形参表 ) As类型 语句列 函数名=表达式 Exit Function 语句列 函数名=表达式 End Function,图8.10 定义函数过程,【例8-3】 编写求矩形面积的自定义函数。 在代码窗口中直接输入下面的代码: Public Function area(a As Integer, b As Integer) As Long area = a * b 计算并返回函数值 End Function,【例8-4】 计算任意整数n的阶乘的Function过程fact: Function fact(x As Integer) As Long Dim p As Long, i As Integer p = 1 For i = 1 To x p = p * i 累乘 Next i fact = p 返回函数值 End Function,8.2.2 Function过程的调用 1. 直接调用 Function过程的调用比较简单,可以像使用VB内部函数一样来调用Function过程,即在表达式中写上它的名字。例如调用例8-3中计算矩形面积的Function过程,用下面代码: Print area(5, 6),2. 用Call语句调用 与调用Sub过程一样调用Function过程。下面的代码调用了同一个Function过程: Call area (2, 4) area 2, 4 当用这种方法调用函数时,VB放弃返回值。,3. 无参函数的调用 函数可以没有参数,在调用无参函数时不发生虚实结合。调用无参函数得到一个固定的值,如下述无参函数: Function F2 F2 = “Follow me.“ End Function 可如下调用: Debug.Print F2,【例8-5】 利用Function函数求矩形面积。 直接调用例8-3的area函数,代码如下: Private Sub Form_Load() Show Label3.Caption = area(5, 6) 通过实参,调用area函数,输出 End Sub 如图8.11左所示输入函数代码和事件过程代码。运行结果如图8.11右所示。,图8.11 利用Function函数求矩形面积,【例8-6】 求16的阶乘之和。 下面给出命令按钮的Click事件代码。 Private Sub Command1_Click() Dim sum As Long, i As Integer 定义数据类型 For i = 1 To 6 求1到6的阶乘 sum = sum + fact(i) 累加阶乘和 Next i Label2.Caption = sum 输出结果 End Sub,图8.12 求阶乘和,【例8-7】 编制随机整数Function过程,输出n个指定范围的随机数。 设计步骤如下: (1) 设计程序界面和设置对象属性,参见图8.13。,图8.13 输出n个指定范围内的随机数,(2) 编写代码。首先自定义Function函数,返回指定范围之内的随机整数。 Private Function Randomnum(n As Integer, m As Integer) Randomize Timer 随机数种子 Randomnum = Int(Rnd * (b + 1 - a) + a 产生并返回随机数 End Function “生成”命令按钮Command1的Click事件代码为,Private Sub Command1_Click() Dim n As Integer, x As Integer, y As Integer n = Val(InputBox(“随机数的个数:“, “请输入“, “100“) x = Val(Text1.Text) y = Val(Text2.Text) For i = 1 To n List1.AddItem Randomnum(x, y) 在列表框中添加随机数 Next End Sub,“清空”命令按钮Command2的Click事件代码为 Private Sub Command2_Click() List1.Clear End Sub 程序运行结果如图8.13所示。,【例8-8】 编写Function过程;返回指定字符、长度的字符串,实现在窗体上输出如图8.14所示的图形。 首先编写能够返回指定字符、长度字符串的Function过程:,图8.14 输出图形,Private Function stri(n As Integer, f As String) p = “ For i = 1 To n 指定长度 p = p & “ “ & f 连接字符串 Next stri = p 返回函数值 End Function,编写窗体的Click事件代码,调用上述stri过程: Private Sub Form_Click() Dim f As String * 1 f = InputBox(“显示的字符:”, “请输入”, “$”) 指定组成图形的字符 If f = “ Then f = “$“ 输出字符,默认为“$” Cls Print,For n = 1 To 7 输出7行 Print Tab(2 * n + 2); 定位 Print stri(15 - 2 * n, f); 输出左半部分 Print Spc(8); 左右两部分间的间隔 Print stri(2 * n - 1, f); 输出右半部分 Print 换行 Next End Sub,8.2.3 查看过程 1. 查看当前模块中的过程 为了查看现有的通用过程或Function过程,在“代码编辑器”窗口的对象框中选择“通用”,然后在过程框中选择过程名。,2. 查看其他模块中的过程 在“视图”菜单中选取“对象浏览器”,在“工程/库”框中选择工程,在“类/模块”列表中选择模块,并在“成员”列表中选择过程,单击“查看定义”按钮,即可调出相应的代码,如图8.15所示。,图8.15 查看其他模块中的过程,8.3 参 数 传 递,调用过程的目的,就是在一定的条件下完成某一工作或计算某一函数值。外界要把条件告诉过程,反过来,过程要把某些结果报告给外界,这就是过程与外界的数据传递。 过程与外界的数据传递有两种方式: (1) 通过非局部变量。 (2) 通过参数。,8.3.1 形式参数与实际参数 形式参数是在Sub、Function过程的定义中出现的变量名;实际参数则是在调用Sub、Function过程时传送给Sub、Function过程的常数、变量、表达式或数组。 1. 形参表 形参表中的各个变量之间用逗号分隔,形参可以是后面跟有左、右圆括号的数组名或除定长字符串之外的合法变量名。,2. 实参表 实参表中的各项用逗号隔开,实参可以是常量,表达式,合法的变量名或后面跟有左、右括号的数组名。 3. 形参与实参的对应关系 形参与实参的对应关系为 在定义过程时,形参为实参保留位置。在调用过程时,实参被插入形参中的各变量处,第一个形参接收第一个实参的值,第二个形参接收第二个实参的值,8.3.2 传值与传址 在调用过程时,一般调用过程与定义过程之间有数据传递,即将调用过程的实参传递给定义过程,完成实参与形参的结合,然后执行调用过程。,1. 传址 传址就是让过程根据变量的内存地址去访问实际变量的内容,即形参与实参使用相同的内存地址单元,这样通过子过程就可以改变变量本身的值。 在传址调用时,实参必须是变量,常量或表达式无法传址。,【例8-9】 传址调用示例。 现在有下面的通用过程: Sub tryout(x As Integer, y As Integer) x = x + 100 在子程序中改变变量的值 y = y * 6 在子程序中改变变量的值 Print “x=“; x, “y=“; y 在子程序中输出变量的值 End Sub,窗体Form的Click事件代码如下: Private Sub Form_Click() Dim a As Integer, b As Integer a = 10 在主程序中变量的原值 b = 20 在主程序中变量的原值 tryout a, b 传址调用 Print “a=“; a, “b=“; b 在主程序中输出变量的值 End Sub,图8.16 传址调用,2. 传值 当要求变量按值传送时,可以用下面的方法: (1) 把变量变成一个表达式。 (2) 定义过程时用ByVal关键字指出参数是按值来传递的,例如: Sub PostAc( ByVal x As Integer ) x = x + 1 这里放语句 End Sub,【例8-10】 传值调用示例。 将前面例8-9改用传值方式编写通用过程,则运行结果是不一样的。改为传值方式的通用过程如下: Sub tryout(ByVal x As Integer, ByVal y As Integer) x = x + 100 在子程序中改变变量的值 y = y * 6 在子程序中改变变量的值 Print “x=“; x, “y=“; y 在子程序中输出变量的值 End Sub 窗体Form的Click事件代码与例8-9相同。 程序运行后,输出结果如图8.17所示。,图8.17 传值调用,8.3.3 使用参数 1. 使用可选的参数 在过程的形参表中列入Optional关键字,就可以指定过程的形参为可选的。如果指定某一参数可选,则此参数后面的其他参数也必是可选的,并且每个参数都要用Optional关键字来声明。,【例8-11】 可选参数示例。使两个命令按钮的事件代码调用同一个过程,一个传递一个参数,而另一个传递两个参数,如图8.18所示。,图8.18 使用可选参数示例,Sub过程ListText将传递过来的参数值添加到列表框中,其中第2个参数使用Optional关键字,该过程的代码为 Private Sub ListText(x As String, Optional y As String) If IsMissing(y) Then 用IsMissing函数测试丢失的可选参数 temp = Format(x, “) Else temp = Format(x, “) & Format(y, “) End If,List1.AddItem temp 在列表框中添加项目 End Sub 传递一个参数的命令按钮Command1的Click事件代码为 Private Sub Command1_Click() Dim a As String a = InputBox(“) 通过输入框输入变量的值 Call ListText(a) 带一个实参调用过程 End Sub,传递两个参数的命令按钮Command2的Click事件代码为 Private Sub Command2_Click() Dim a As String, b As String a = InputBox(“) 通过输入框输入变量的值 b = InputBox(“) 通过输入框输入变量的值 Call ListText(a, b) 带两个实参调用过程 End Sub,【例8-12】 在上例中,可以为未传递的参数指定一个缺省值,如图8.19所示。 要完成上述功能,只需修改Sub过程ListText的代码: Private Sub ListText(x As String, Optional y As String = “) temp = Format(x, “) & Format(y, “) List1.AddItem temp End Sub,图8.19 为未传递的参数指定一个缺省值,2. 使用不定数量的参数 一般说来,过程调用中的参数个数应等于过程说明的参数个数。如果使用ParamArray关键字,则过程可以接受任意个数的参数。 【例8-13】 改写例8-11中的Sub过程ListText,使之可以接收任意多个参数,如图8.20所示。,图8.20 接收任意多个参数,Sub过程ListText的代码改为 Private Sub ListText(ParamArray strx() For Each x In strx temp = temp & Format(x, “|“) Next List1.AddItem temp End Sub 传递一个参数的命令按钮Command1的Click事件代码为,Private Sub Command1_Click() Dim a As String a = Left(InputBox(“), 6) Call ListText(a) 带一个参数调用过程 End Sub 传递两个参数的命令按钮Command2的Click事件代码为 Private Sub Command2_Click(),Dim a As String, b As String a = Left(InputBox(“), 6) b = Left(InputBox(“), 6) Call ListText(a, b) 带两个参数调用过程 End Sub 传递三个参数的命令按钮Command3的Click事件代码为 Private Sub Command3_Click(),Dim a As String, b As String, c As String a = Left(InputBox(“), 6) b = Left(InputBox(“), 6) c = Left(InputBox(“), 6) Call ListText(a, b, c) 带三个参数调用过程 End Sub,8.3.4 传递数组 VB允许把数组作为实参传送到过程中。例如,假设定义了如下过程: Sub s(a( ), b( ) End Sub 该过程有两个形参,这两个参数都是数组。注意,用数组作为过程的参数时,应在数组名的后面加上一对括号,以免与普通变量相混淆。可以用下面的语句调用过程: Call s(p( ), q( ),1. 传递数组的全部元素 为了把一个数组的全部元素传送给一个过程,应将数组名分别放入实参表和形参表中,并略去数组的上下界,但括号不能省略。,【例8-14】 传递数组中的全部元素示例。在窗体层声明如下数组: Dim values() As Integer 编写如下通用过程: Static Sub changarray(min As Integer, max As Integer, p() As Integer) For i = min To max p(i) = i 3 Next i End Sub,Static Sub printarray(min As Integer, max As Integer, p() As Integer) Print For i = min To max Print p(i); 输出各数组元素的值 Next i End Sub,编写窗体Form的Click事件代码为 Private Sub Form_Click() ReDim values(1 To 10) As Integer Call changarray(1, 10, values() 调用通用过程changarray Call printarray(1, 10, values() 调用通用过程printarray End Sub 程序运行结果如图8.21所示。,图8.21 数组参数的传送,2. 传递数组中的单个元素 如果不需要把整个数组传送给通用过程,可以只传送指定的单个元素,这需要在数组名后面的括号中写上指定元素的下标。,【例8-15】 传送数组中的单个元素示例。 在窗体层声明如下数组: Dim test_array() As Integer 编写如下通用过程: Static Sub sqval(a) a = Sqr(Abs(a) 求某数绝对值的平方根 End Sub 编写窗体Form的Click事件代码为,Private Sub Form_Click() ReDim test_array(1 To 3, 1 To 4) 定义数组 test_array(2, 3) = -100 为数组test_array中的第2行第3列元素赋值-100 Print test_array(2, 3) 输出数组元素test_array(2, 3)的值 Call sqval(test_array(2, 3) 调用通用过程,Print test_array(2, 3) 调用通用过程后,输出test_array(2, 3)的值 End Sub 程序运行结果如图8.22所示。,图8.22 数组中单个元素的参数传递,LBound和UBound函数常用来确定传送给过程的数组大小。用LBound函数可以求出数组的最小下标值,而用UBound函数可以求出数组的最大下标值,这样就能确定传给过程的数组中各维的上下界。,【例8-16】 编写一个Function过程,求数组的最大值。 求数组最大值的通用过程如下: Private Function findmax(a() As Integer) Dim start As Integer, finish As Integer, i As Integer start = LBound(a) 求出数组的下标下界 finish = UBound(a) 求出数组的下标上界,max = a(start) 赋初值 For i = start To finish 依次判断各元素值 If a(i) max Then max = a(i) 求最大的数组元素值 Next i findmax = max 返回函数值 End Function,该过程先求出数组的上界和下界,然后从整个数组中找出最大值,过程中的数组是一个形式参数,可以在下面的事件过程中调用该过程: Private Sub Form_Click() ReDim b(4) As Integer b(1) = 100 各元素赋值 b(2) = 200 b(3) = 150 b(4) = 50,c = findmax(b() 调用函数过程求最大值 Print Print “数组的最大值是:“; c End Sub 程序执行后,单击窗体,输出结果如图8.23所示。,图8.23 求数组的最大值,8.4 键盘与鼠标事件过程,8.4.1 键盘事件 键盘事件是指能够响应各种按键操作的KeyDown、KeyUp及KeyPress事件,通过编写键盘事件的代码,可以响应和处理大多数的按键操作,解释并处理ASCII字符。,1. KeyPress事件 KeyPress事件当用户按下和松开一个ASCII字符键时发生。该事件被触发时,被按键的ASCII码将自动传递给事件过程的KeyAscii参数。,【例8-17】 编写如图8.24所示的能显示按键及其ASCII码的程序。其中,在Text2中显示按键的ACSII码,Text3中显示按键。,图8.24 KeyPress事件接受的按键,编写程序代码如下: 复选框的Click事件代码为 Private Sub Check1_Click() Text1.SetFocus End Sub 文本(输入)框Text1的KeyPress事件代码为 Private Sub Text1_KeyPress(KeyAscii As Integer) Text2.Text = KeyAscii,Select Case KeyAscii Case 0 To 7, 9 To 12, 14 To 26, 28 To 31 Text1.Text = “ Text3.Text = “Ctrl+“ & Chr(64 + KeyAscii) Case 8 Text3.Text = “Ctrl+“ & Chr(64 + KeyAscii) & “ 或 退格键“ Case 13 Text1.Text = “,Text3.Text = “Ctrl+“ & Chr(64 + KeyAscii) & “ 或 回车键“ Case 27 Text1.Text = “ Text3.Text = “Ctrl+“ & Chr(64 + KeyAscii) & “ 或 Esc键“ Case Else Text3.Text = Chr(KeyAscii),End Select If Check1.Value = 0 Then KeyAscii = 0 取消“回显”,输入框不显示刚按下的键 End If End Sub,2. KeyDown和KeyUp事件 KeyDown和KeyUp事件是当一个对象具有焦点时按下或松开一个键时发生的。当控制焦点位于某对象上时,按下键盘中的任意一键,则会在该对象上触发产生KeyDown事件,当释放该键时,将触发产生KeyUp事件,之后产生KeyPress事件。其语法格式为 Private Sub 对象名_KeyDown(KeyCode As Integer, Shift As Integer) Private Sub 对象名_KeyUp(KeyCode As Integer, Shift As Integer),【例8-18】 测试功能键与控制键。结合图8.25阅读下面的程序代码。其中,Text2中显示按键接受的KeyCode参数,Label1(2)的Visible设为False。 图形方式的复选框Check1、Check2和Check3分别表示Shift、Ctrl和Alt键。,图8.25 测试功能键与控制键,文本(输入)框Text1的Keydown事件代码为 Private Sub Text1_Keydown(KeyCode As Integer, Shift As Integer) Text2.Text = Text2.Text & Str(KeyCode) & “,“ If KeyCode 111 And KeyCode 124 Then Label1(2).Caption = “你刚才按了功能键:“ & “F“ & Str(KeyCode - 111) Label1(2).Visible = True Else,Label1(2).Visible = False End If Check1.Value = IIf(Shift And vbShiftMask) 0, 1, 0) Check2.Value = IIf(Shift And vbCtrlMask) 0, 1, 0) Check3.Value = IIf(Shift And vbAltMask) 0, 1, 0) End Sub 命令按钮(清除)Command1 的 Click事件代码为,Private Sub Command1_Click() Text1.Text = “ Text2.Text = “ Text1.SetFocus End Sub,8.4.2 鼠标事件 在前面的例子中曾多次使用鼠标事件,即单击(Click)事件和双击(DblClick)事件,这些事件是通过快速按下并松开鼠标键而产生的。,1. MouseDown和MouseUp事件 MouseDown和MouseUp事件当按下(MouseDown)或者释放(MouseUp)鼠标按钮时发生。其语法为 Private Sub 对象名_MouseDown(button As Integer, shift As Integer, x As Single, y As Single) Private Sub 对象名_MouseUp(button As Integer, shift As Integer, x As Single, y As Single),2. MouseMove事件 MouseMove 事件在移动鼠标时发生。其语法格式为 Private Sub 对象名_MouseMove(button As Integer, shift As Integer, x As Single, y As Single),3. 自定义鼠标指针 在VB中,可以通过属性设置来改变鼠标指针的形状。鼠标指针的改变可以告知用户诸多信息,例如,正在进行长时间的后台任务,调整某个控件或窗口的大小,某控件不支持拖放操作等等。,8.4.3 拖放 在可视化编程的步骤中,第一步就是在窗体上摆放一些控件,这样的操作常常是使用鼠标在窗体上拖放控件。拖放操作其实包括两个操作:拖与放。,1. 拖放属性 与拖放有关的属性有DragMode和DragIcon。 1) DragMode属性 DragMode属性用来设置

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论