VB讲课笔记09:过程

VB讲课笔记09:过程


一、键盘与鼠标事件过程
用户对程序界面的操作都是通过键盘和鼠标完成的。 
(一)键盘事件

1、KeyPress事件

(1)触发条件
    用户按下并且释放一个会产生ASCII码的键时被触发。
(2)过程格式

(3)注意事项注
    只有获得焦点的对象才能够响应键盘事件。

2、KeyDown事件
(1)触发条件
    用户按下键盘上任意一个键时被触发。
(2)过程格式

3、KeyUp事件
(1)触发条件  
    用户释放键盘上任意一个键时被触发。
(2)过程格式

4、如何判断控制键(Shift、Ctrl、Alt)按下状态

有三个重要的符号常量:vbShiftMask - 1(001)、vbCtrlMask - 2(010)、vbAltMask - 4(100)

(1)Shift = 1(001):只按下Shift键

(2)Shift = 2(010):只按下Ctrl键

(3)Shift = 4(100):只按下Alt键

(4)Shift = 3 = 1 + 2(011):按下Shift键与Ctrl键

(5)Shift = 5 = 1 + 4(101):按下Shift键与Alt键

(6)Shift = 7 = 1 + 2+ 4(111):按下Shift键、Ctrl键与Alt键

案例:利用窗体KeyDown事件,按下组合键Ctrl+A时,弹出消息框,内容“全部选定!”



运行程序,按下Ctrl+A组合键:


(二)鼠标事件


1、MouseDown事件

(1)触发条件

    按下任意鼠标按钮时发生。

(2)过程格式


2、MouseUp事件

(1)触发条件

    释放任意鼠标按钮时发生。

(2)过程格式


3、MouseMove事件

(1)触发条件

    每当鼠标指针移动到屏幕新位置时发生。

(2)过程格式


4、如何判断鼠标按钮按下状态

运行程序,单击【输出鼠标事件Button参数值】按钮:

(1)Button = 1(001):只按下鼠标左键

(2)Button = 2(010):只按下鼠标右键

(3)Button = 4(100):只按下鼠标中键

(4)Button = 3 = 1 + 2(011):按下鼠标左键和右键

(5)Button = 5 = 1 + 4(101):按下鼠标左键和中键

(6)Button = 7 = 1 + 2+ 4(111):按下鼠标左键、中键和右键

案例:利用鼠标事件信手涂鸦


运行程序,按下鼠标左键,在窗体上随意移动,效果如下:


二、Sub 过程
1、定义Sub 过程
(1)过程格式
[Private | Public] [Static] Sub 过程名 [(参数表)] 
      语句组
        [Exit Sub]
      语句组
End Sub

(2)两种方法创建Sub过程
方法一、在代码窗口中直接按规定格式编写过程框架

方法二、利用VB的过程添加工具生成过程框架,然后编写过程体。




2、调用Sub过程
(1)直接使用过程名调用Sub过程
    格式:过程名 [参数列表](注意参数列表不用括号括起来)
(2)使用Call语句调用Sub过程
    格式:Call 过程名 [(参数列表)](注意参数列表要用括号括起来)

案例:编写判断素数的过程,利用该过程列举指定范围内的素数
1、创建工程,更名为“列举指定范围内素数”,添加控件,设置属性

2、创建Sub过程,名为IsPrimeNumber,包含两个参数


3、编写【列举】按钮单击事件处理代码



4、编写【清空】按钮单击事件处理代码


5、运行程序,测试效果


输入起始数与终止数,单击【列举】按钮:


案例:演示过程递归调用
1、创建工程,更名为“演示过程递归调用”
2、创建通用过程fun(x As Integer)

3、编写【确定】按钮单击事件处理代码
4、运行程序,查看结果

为什么先输出3,再输出6?过程调用使用栈结构,先进后出。


案例:求解汉诺塔问题

1、创建工程,更名为“求解汉诺塔问题”,添加控件,设置属性

2、声明变量,编写通用过程与两个按钮单击事件处理代码


3、运行程序,查看效果


输入环个数,比如3,单击【求解】按钮:


三、Function过程

1、定义Function 过程

(1)过程格式

 [Public|Private][Static] Function 函数名 ([形参表])_ [As 数据类型]

    语句组
  [
函数名 = 表达式]
  [Exit Function] 
    语句组
    [
函数名 = 表达式]

  End Function

注意:VB不像C、Java、VFP的函数,通过return语句来返回函数值,而是通过函数名变量来返回函数值。

这里演示一下Java里定义的阶乘函数factorial(n):



2、调用Function 过程
调用格式:变量名=Function过程名([参数列表])

案例:判断素数的函数过程


运行程序,单击【判断】按钮:





案例:用递推法和递归法编写阶乘函数过程



运行程序,测试两种方法的阶乘函数:





选择题真题演练:


循环初始条件:i=1,循环条件:i< 6,因此循环5次。

No.1 i=1,s=0+1/(1+1)=1/2 (此时可以排除A与B)

因为要循环5次,所以应该有5项数据相加,于是排除C,选择D。

四、传递参数

1、形参与实参
定义过程时,过程的参数就是形参。
调用过程时,过程的参数就是实参。


2、按地址传递参数

按地址传递参数是把实参变量的内存地址传递给形参变量 。在定义过程时,用ByRef说明的形参,或缺省传递方式说明,都是按地址传递。 


案例:编写交换两个变量值的过程Swap(x, y)

1、创建工程,更名为“利用地址传递交换变量值”,添加按钮,设置属性


2、创建交换变量值的通用过程Swap(x, y)与按钮单击事件处理代码



3、运行程序,单击【交换】按钮,查看结果


给通用过程Swap的两个参数前加上ByRef,显式声明为引用传递,即地址传递方式。


运行程序,单击【交换】按钮,你会看到结果完全相同。

选择题真题演练:


我们将按钮Command1的单击事件处理代码修改一下:





A) fun = n,对函数名赋值,作为函数的返回值,fun没有定义类型,就是变体型,可以接收任何类型数据。所以选项A)是错误的。
B) 输入值为5时,注意fun的参数是按址传递,第一个x是5,第一个fun(x)是fun(5),5不能被3整除,因此返回值是5*5=25,但是实参x也跟着形参n一起变成25,第二个fun(x)是fun(25),25不能被3整除,因此返回值是25*25=625,三项相加:5+25+625=655,因此选项B)正确。
C) 输入值为6,第一个x是6,第一个fun(x)是fun(6),6能被3整除,因此返回值是6+6=12,但是实参x也跟着形参n一起变成了12,第二个fun(x)是fun(12),12能被3整除,因此返回值是12+12=24,三项相加:6+12+24=42,因此选项C)正确。
D) ByRef表示参数按址传递,显然正确。

3、按值传递参数

按值传递参数是把实参变量的值传递给形参变量,实参变量的值在过程调用前后保持不变。定义过程时用ByVal关键字指出参数是按值来传递的。

如果将上述案例中Swap过程的参数改为按值传递,那么就无法实现交换变量值的功能。



选择题真题演练:


过程f的形参x是按值传递,y与z是按址传递。因此调用过程f之后,实参a值依然不变,还是1,但是实参b与c会随着形参y和z值而变化,都增加1,分别是3与4,因此选择B。

4、传递数组参数

静态数组和动态数组都可以作为过程的参数。

案例:演示数组作为过程参数,求传入数组的元素之和。

1、创建工程,更名为“演示数组作为过程参数”,添加按钮,设置属性


2、编写通用过程Sum()和按钮单击事件处理代码


3、运行程序,查看效果


选择题真题演练:

假如函数fun1的参数m采用传值方式,那么结果又该是多少呢?



过程P的参数b()采用默认的按址传递方式,因此调用P a之后,实参数组a的值就变成形参数组b的值,即2、4、6、8,因此选择A)。

五、可选参数与可变参数
1、可选参数
在参数前加上关键Optional,表明该参数是可选参数。利用IsMissing函数来判断是否传入了可选参数,但是对Integer和Single类型无效,对于变体型才有效。




2、可变参数  
(1)在过程声明中,以普通方法定义参数列表。除最后一个参数以外的所有参数均为必选(不是 Optional)。
(2)在最后一个参数名称前面使用关键字
ParamArray。该参数自动为可选。不要包含 Optional 关键字。
 (3)在参数数组名称后面使用一对空括号。
 (4)在空括号后面使用常用的 As 子句。
(5)不要在 As 子句后带默认值。




六、对象参数
1、窗体参数:窗体对象作为过程参数
2、控件参数:控件对象作为过程参数

案例:演示对象参数
1、创建工程,更名为“演示对象参数”,添加控件,设置属性

2、编写两个通用过程和一个按钮单击事件过程


3、运行程序,查看效果


单击【确定】按钮:



真考题库试卷(3)第(32)题也涉及到控件参数。




运行程序,测试效果:


单击图片框:


明明在工程目录里有“pic.jpg”文件,为啥不能加载呢?必须添加一个路径:


此时再运行程序,单击图片框:


单击标签:


除了用TypeOf函数判断控件类型之外,还可以用TypeName函数来判断。