null第六章 过程第六章 过程 6.1 函数过程的定义与调用
6.2 子过程的定义与调用
6.3 参数传递
6.4 变量、过程的作用域null6.1 函数过程的定义
除了系统提供的内部函数过程和事件过程外,用户可自定义过程:
以Sub保留字开始的为子过程
以Function保留字开始的为函数过程
1. 引例6.1
已知多边形的各条边的长度,要计算多边形的面积。
计算多边形面积,可将多边形分解成若干个三角形。
计算三角形面积的公式如下: (c为三角形周长的一半
X、y、z为任意三角形的三条边)定义函数过程area
Public Function area(x!, y!, z!) As Single
Dim c!
c = 1 / 2 * (x + y + z)
area = Sqr(c * (c - x) * (c - y) * (c - z))
End Function调用函数过程的事件过程:
Sub command1_click()
…… 输入若干个三角形边长
S=area(a,b,c)+area(c,d,e)
S=S+area(e,f,g)
Print S
End Subnull2.函数过程的定义
自定义函数过程有两种方法:
(1)利用“工具”菜单下的“添加过程”命令定义,生成一个函数的框架
(2)利用代码窗口直接定义
函数过程形式:
[Static] [Public | Private] Function 函数过程名([参数列
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
]) [As 类型]
局部变量或常数定义
语句块
函数名 = 返回值
[Exit Function] 函数过程体
[ 语句块]
[函数名 = 返回值]
End Functionnull(1) Public | Private: Public表示函数过程是公共(全局)过程,所有模块中的所有过程都可以使用这个函数过程。Private表示函数过程是局部过程,只能被包含其声明的模块中的过程访问,不能被其他模块中的过程访问。缺省时,系统默认是“Public”。
Static:被指定过程中的局部变量在内存中的存储方式。使用Static,则函数过程中的局部变量就是“Static”型的,即在每次调用函数过程时,局部变量的值保持不变;如果省略“Static”,则局部变量在每次调用函数过程时,被初始化为0或空字符串。
(2)函数过程名:命名规则同变量名。函数过程的说明:null Function 函数过程名([参数列表]) [As 类型]
(3)参数列表:指明了参数类型和个数。其中每个参数的格式为:
[ByVal | ByRef ] 变量名 [( )] [As 类型]
在定义函数过程时,“参数列表”中的参数为形式参数(Formal Parameter),简称为形参或哑元。只能是变量或数组名(数组名后要加”( )” ),在定义时没有值,参数名之间用逗号分隔。
函数过程没有参数时,函数过程名后面的括号不能省略。
“变量名”前面的“ByVal” 表示该参数是“传值”(Passed by Value)参数。未加“ByVal”或加“ByRef”的参数称为”传址“(“引用”)(Passed by Reference)参数。
(4)As 类型:定义函数过程返回值的类型,若缺省,则为Variant。
(5)函数过程名 = 返回值 :函数过程直接返回一个值到调用处,因此在函数过程中至少要对“函数过程名”赋一次值。如果没有对函数过程名赋值,则函数过程将返回一个缺省值:数值函数返回0;字符串函数返回一个零长度字符串(“”);Variant函数则返回Empty。
(6) [Exit Function] :表示退出函数过程null3.函数过程的调用
函数过程的调用和标准内部函数相同,惟一的差别是函数过程的调用由用户定义,内部标准函数由系统提供。形式如下:
函数过程名( [参数列表] )
说明:
参数列表:列表中的参数称为实际参数(Actual Parameter),简称实参。参数的个数、位置、类型必须与形参完全一致。实参可以是同类型的常量、变量、表达式。如果是数组,省略维数(括号不能省)。
与标准函数一样,函数过程不能作为单独的语句使用,只能作为表达式或表达式中的一部分。
由于VB是事件驱动的运行机制,对自定义过程的调用一般是用事件过程调用的。null
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
:
本例是一个计算组合数的例子,可以利用如下组合数公式进行计算:
在组合公式中,三次用到了求阶乘,其算法相同。对于算法相同的程序段,可以独立编写,作为自定义函数。在程序中使用这一算法时,只需直接调用这一自定义函数。例:某班有m名学生,要选派n名学生参加合唱队,计算有多少种选派方法。null编程实现:
在通用声明段定义计算阶乘的函数过程如下:其中factorial为函数过程名,n为函数过程的形参,阶乘值t可能很大,用双精度型。
Public Function factorial(ByVal n As Integer) As Double
Dim i%, t As Double
t = 1
For i = 1 To n
t = t * i
Next i
factorial = t
End Function
在单击“计算”按钮事件过程中,调用factorial函数过程,计算组合数。程序代码如下:
Private Sub Command1_Click()
Dim m As Integer, n As Integer, c As Double
m = Val(Text1)
n = Val(Text2)
c = factorial(m) / (factorial(n) * factorial(m - n))
Label3.Caption = "共有" & c & "种选派方法"
End Subnull例6.2 定义MyReplace(S,OldS,NewS)函数过程,具有Replace函数功能。
Function MyReplace(s$, OldS$, NewS$) As String
Dim i%, lenOldS%
lenOldS = Len(OldS) ' 取OldS字符子串长度
i = InStr(s, OldS) ' 在字符串中找有否OldS字符子串
Do While i > 0 ' 找到用NewS 字符子串替换OldS字符子串
s = Left(s, i - 1) + NewS + Mid(s, i + lenOldS)
i = InStr(s, OldS) ' 找下一个OldS字符子串
Loop
MyReplace = s ' 替换后的字符串赋值给函数过程名
End Function
假定S为“abcdefgabcd”,Oolds为“cd”,News为“3”,调用MyReplace函数的返回值为“ab3efgab3”。上述程序循环执行2次:
(“abcdefgabcd”,“cd”,“3”) 第1 次 i=3 结果 “ab3efgabcd”
(“ab3efgabcd”,“cd”,“3”) 第2 次 i=9 结果 “ab3efgab3” nullPrivate Sub Command1_Click()
s= “VB程序设计教程5.0版”
Print MyReplace(s, "5.0", "6.0")
End SubFunction MyReplace$(s$, OldS$, NewS$)
Dim i%, lenOldS%
lenOldS = Len(OldS)
i = InStr(s, OldS)
Do While i > 0
s= Left(s, i - 1) + NewS + Mid(s, i + lenOldS)
i = InStr(s, OldS)
Loop
MyReplace = s
End FunctionEnd SubPrivate Sub Command1_Click()
s= “VB程序设计教程5.0版”
Print MyReplace(s, "5.0", "6.0")程序运行的流程 :VB程序设计教程6.0版下面的事件过程调用了例6.2中求Replace( )函数的函数过程。null6.2 子过程的定义与调用
使用函数过程给编程带来了很多优点,如果不是为了获得某个函数值,而是为了某种功能的处理,或者要获得多个结果等,则可以使用子过程。例6.3 编写一个过程,对Label1控件进行移动,其中通过参数Tag的值(1或-1)决定向右下角移动或是向左上角移动。
分析:该过程不是为了计算获得某个结果,而是对控件进行移动处理。子过程的代码如下:Sub MyMove(ByVal Tag%)
Label1.Left = Label1.Left + Tag * 400
Label1.Top = Label1.Top + Tag * 400
End Sub‘事件过程调用子过程MyMove:
Private Sub Command1_Click()
Dim K%
If Rnd > 0.5 Then K = 1 Else K = -1
Call MyMove(K)
End Sub例:MyMove子过程null 子过程是取了名字的一段程序代码,它通常完成一个独立的(子)功能。在主程序中通过子过程的名来使用(调用)子过程。子过程执行结束后,自动返回主程序的调用点,继续执行调用点后的程序代码。
子过程和函数过程的性质基本相同,它们之间的区别是:子过程名不带值;而函数过程名带值。(在实际应用中,有一些问题的解决,既可以用函数过程也可以用子过程)1.引例6.3
编写一个两个数交换的过程供多次调用。
Swap (x,y)子过程的定义 主调程序调用Swap子过程
Public Sub Swap(x, y) Private Sub Form_Click()
Dim t Dim a, b
t = x a = 10
x = y b = 20
y = t Call Swap (a, b)
End Sub Print "a=";a,",b="; b
End Subnull2.子过程定义
[Static] [Public | Private] Sub 子过程名[(形参列表声明)]
局部变量或常数定义
语句块
[Exit Sub]
End Sub
其中,
1.子过程名、形参列表、“Static”、“”Public”、 “Private”、“Exit Sub”与函数过程中对应项的规定相同。
2.建立子过程的操作与函数过程相同。null3.子过程的调用
子过程名 [实参列表]
或 Call 子过程名( [实参列表] )
注意:
1. 调用子过程是一个独立的语句。
2. 使用Call语句时,参数必须在括号内,若省略Call关键字,则实参两边不带括号。
3. 若实参要获得子过程的返回值,则形参必须是“引用”参数(ByRef),实参只能是变量,不能是常量、表达式或控件名。
4. 实参列表中的实参与形参列表中的形参的个数、类型、顺序必须相同。null4.子过程与函数过程区别:
(1)函数过程名有值,有类型,在函数体内至少赋值一次;
子过程名无值,无类型,在子过程体内不能对子过程名赋值;
(2)调用时,子过程调用是一句独立的语句。
函数过程不能作为单独的语句加以调用,必须参与表达式运算.
(3)一般当过程有一个函数值,使用函数过程较直观;
反之若过程无返回值,或有多个返回值,使用子过程较直观。
(4) 形参个数的确定。形参是过程与主调程序交互的接口,从主调程序获得初值,或将计算结果返回给主调程序。不要将过程中所有使用过的变量均作为形参。例6.1中形参X,Y,Z是计算三角形面积必须的初值,而变量C用于存放计算三角形半周长,临时使用,不必作为形参。
(5) 形参没有具体的值,只代表了参数的个数、位置和类型。实验指导与测试 P95 6.3-1null例6.4分别编一计算某级数部分和的子过程和函数过程,并调用。
级数为: 精度为:函数过程实现求部分级数和
Function jishu1(x!, eps#) As Double
Dim n%, s#, t#
n = 1: s = 0: t = 1
Do While (Abs(t) >= eps)
s = s + t
t = t * x / n
n = n + 1
Loop
jishu1 = s
End Function子过程实现求部分级数和
Sub jishu2(s#, x!, eps#)
Dim n%, t#
n = 1: s = 0: t = 1
Do While (Abs(t) >= eps)
s = s + t
t = t * x / n
n = n + 1
Loop
End Subf1 = jishu1(2, 0.000001) ' 调用函数过程
Call jishu2(f2, 2, 0.000001) ‘ 调用子过程
或 jishu2 f2,2,0.00001 null 程序运行流程:
Private Sub Command1_Click()
Dim f1#, f2#
f1 = jishu1(2, 0.000001)
Call jishu2(f2, 2, 0.000001)
Print "f1="; f1, "f2 = "; f2
End Sub①⑤null6.3 参数传递
在调用函数过程和子过程时,主调程序必须把实际参数传递给被调过程,完成形式参数(形参)和实际参数(实参)的结合。
形参与实参
形参是在子过程或函数过程的定义中出现的变量名,只代表了该过程参数的个数、类型、位置。形参只能是变量或数组名等,不能是常量、表达式或数组元素。
实参则是在调用子过程或函数过程时传送给子过程或函数过程的常数、变量、表达式或数组。在VB中,实参和形参的传递有两种形式:
传址(ByRef)和传值(ByVal),其中传址又称为引用,是默认的方法。
null2. 参数传递
传值(ByVal) :
传值方式是通过在形参前面加关键字ByVal来实现的。在调用带参数的函数过程或子过程时,实参的值复制给函数过程(或子过程)的形参,称为值传递(传值)实参与形参分配不同的内存单元,这种传递方式是单向的数据传递,即调用时只能由实参将值传递给形参;调用结束时不能由形参将结果返回给实参。
传址(ByRef) :
传地址是将实参的地址传递给形参。实参和形参共用同一内存单元。这种传递方式是一种双向的数据传递,即调用时实参将值传递给形参;调用结束时由形参将操作结果返回给实参。传址方式是通过在形参前面加关键字ByRef来定义的。在缺省时,VB采用传址方式。null例6.5 编写一个子过程,分别改变两个自变量的值,第一个变量的值为两个变量之和,第二个变量的值为两个变量之积,并显示两个变量的值。参数传递用传值方式。在单击窗体事件过程中对两个变量(实参)赋值,在调用子过程后,再打印两个变量(实参);观察形参和实参的变化.Sub swap_byval(ByVal x%, ByVal y%)
x=x+y
y=x*y
End Sub
Private Sub Form1_Click()
dim a%,b%
a = 10: b = 20
Print “调用前 a= ”; a, “b ="; b
Swap_byval a, b
Print “调用后 a= ”; a, “b ="; b
End Subnull例传址:编写一个子过程,分别改变两个自变量的值,第一个变量的值为两个变量之和,第二个变量的值为两个变量之积,并显示两个变量的值。参数传递用传址方式。在单击窗体事件过程中对两个变量(实参)赋值,在调用子过程后,再打印两个变量(实参);观察形参和实参的变化.Sub swap_byref( x%, ByRef y%)
x=x+y
y=x*y
End Sub
Private Sub Form1_Click()
dim a%,b%
a = 10: b = 20
Print “调用前 a= ”; a, “b ="; b
Call Swap_byref ( a, b)
Print “调用后 a= ”; a, “b ="; b
End Subnull2. 数组参数的传递
在VB中允许参数是数组,数组只能通过传址方式进行传递。在传递数组时要注意:
(1)在形参中只写数组名,忽略维数的定义,但圆括号不能省。在实参中只写数组名,不写圆括号。
(2)当被调过程不知道实参数组的下、上界,可以用Lbound和Ubound函数确定实参数组的下、上界。
(3)如果只是传递数组中某个元素的值给被调用过程,则在实参列表的数组名后的括号中写上指定元素的下标。例: 编两个子过程:子过程fmaxmin求数组中最大值和最小值;子过程printa 以每行5列显示数组元素.主调程序20个元素(数据范围是 0~100),并分别调用两个子过程。nullPublic Sub fmaxmin( x%(), amax%, amin%)
Dim i%
amax = x(0): amin = x(0)
For i = 1 To UBound(x)
If x(i) > amax Then amax = x(i)
If x(i) < amin Then amin = x(i)
Next i
End Sub分析:该题求最大、最小值的算法没有难度,在第五章就解决了;问题是子过程定义中参数个数、传值还是传址的确定。本题的Printa子过程中形参只有一个,是数组即引用类型;子过程fmaxmin中形参有3个,一个是数组,另2个是求得的数组的最大、最小值,要返回给调用过程,所以它们都应该是传址方式。Public Sub printa( x%())
Dim i%
Cls
For i = 0 To UBound(x)
Print x(i);
If (i + 1) Mod 5 = 0 Then Print
Next i
Print
End Subnull主调程序:
Private Sub Command1_Click()
Dim a%(19), i%, a1%, a2%
Randomize
For i = 0 To 19
a(i) = Int(Rnd * 101)
Next i
Call printa(a)
Call fmaxmin(a, a1, a2)
Print "最大值是:"; a1
print "最小值是:"; a2
End Sub例子过程调用通过上例可以看到:
1)形参是数组,则只需用数组名和后面的圆括号表示。
2)实参是数组,只要给出数组名即可,后面不需要加圆括号。
3)当数组作为参数传递时,不管参数前是Byval还是ByRef,都是以传址方式传送,因为系统实现时,是将实参数组A的起始地址传给过程,使形参X数组也具有与A数组相同的起始地址,如图6.1所示。因此,由于A和X数组相应各元素共享一个存储单元,当在过程中改变X数组元素时,也改变了B数组对应元素的值。X数组,a数组null
例 6.7 编一函数tim,求任意一维数组中各元素之积。
调用tim,求 和
Function tim(a() As Integer)
Dim t#, i%
t = 1
For i = Lbound(a) To Ubound(a)
t = t * a(i)
Next i
tim = t
End Function主调程序:
Sub Command1_Click()
Dim a%(1 To 5),b%(3 To 8)
…
t1# = tim(a())
t2 #= tim(b())
Print t1, t2
End Subnull使用过程注意事项:
1. 确定自定义的过程是子过程还是函数过程
函数过程名有值,子过程名无值。
2.过程中形参的个数和传递方式的确定
过程中参数的作用是实现过程与调用者的数据通信。
(1)从主调程序获得初值,值传递。
(2)将结果返回给主调程序,地址传递。
3. 实参与形参结合时对应问题
个数、类型、位置、次序一一对应。
形参是值传递,对应实参可以是表达式、常量、数组元素。
形参是地址传递,对应实参只能是简单变量。
数组、记录类型、对象只能是地址传递。null VB的应用程序由若干个过程组成,这些过程一般保存在窗体文件(.frm)、标准模块文件(.bas)或类模块中,一个VB应用程序的组成如下图所示:6.4 变量、过程的作用域null6.4 变量、过程的作用域
作用域:变量、过程随所处的位置不同,可被访问的范围。
1.过程的作用域
窗体/模块级:加Private关键字的过程,只能被定义的窗体或模块中的过程调用。
全局级:加Public关键字(缺省)的过程,可供该应用程序的所有窗体和所有标准模块中的过程调用。null2. 变量的作用域
局部变量:在过程内用声明的变量,只能在本过程中使用。
窗体/模块级变量:在“通用声明”段中用Dim语句或用Private语句 声明的变量,可被本窗体/模块的任何过程访问。
全局变量:在“通用声明”段中用Public语句声明的变量,可被本应用程序的任何过程或函数访问。null例如在下面一个标准模块文件中不同级的变量声明:
Public Pa As integer ‘ Pa为全局变量
Private Mb As string *10 ‘ Mb为窗体/模块级变量
Sub F1( )
Dim Fa As integer ' Fa局部变量
…
End Sub
Sub F2( )
Dim Fb As Single ' Fb局部变量
…
End Sub
例:局部变量例:窗体变量null 若在不同级声明相同的变量名,系统按局部、窗体/模块、全局次序访问如:
Public Temp As integer ‘ 全局变量
Sub Form_Load()
Dim Temp As Integer ' 局部变量
Temp=10 ' 访问局部变量
Form1.Temp=20 ' 访问全局变量必须加窗体名
Print Form1.Temp, Temp ' 显示 20 10
End Subnull习题选讲 设工程中有两个窗体Form1、Form2、一个标准模块Module1. 要在Form1中单击命令按钮Command1时,调用以上过程计算两个数的平方和立方和,并分别将结果显示在文本框Text3和Text4中,请在下程序段中写出相应的调用语句。 Private Sub Commandl_CliCk()
a=val(Text1.Text)
b=val(Text2.Text)
Call Form2.test1(a,b,c1)
Text3.Text=c1
test2 a,b,c2
Text4.Text=c2
End Subnull在Form2的代码中定义了以下子过程:
Sub test1(a,b,c)
c=a^2+b^2
End Sub
在Module1中定义了以下子过程:
Sub test2(a, b,c )
c=a^3+b^3
End Sub
null将上题的test1过程和test2过程改成用函数过程实现
Private Sub Command1_Click()
a = Val(Text1.Text)
b = Val(Text2.Text)
Text3.Text = Form2.f1(a, b)
Text4.Text = f2(a, b)
End SubFunction f1(x, y)
f1 = x ^ 2 + y ^ 2
End Function
Function f2(x, y)
f2= x ^ 3 + y ^ 3
End Function
在FORM1在FORM2在MODULE1null3. 静态变量
局部变量声明:
Dim 声明,随过程的调用而分配存贮单元,每次调用都对变量初始化;过程体结束,变量的内容自动消失,存储单元释放。
Static 声明,每次调用过程,变量保持原来的值。声明形式:
Static 变量名 [AS 类型] ‘过程内定义的变量
Static Function 函数过程名([参数列表]) [As 类型]
Static Sub 子过程名[(参数列表)]
过程名前加Static,表示该过程内的局部变量都是静态变量。nullPrivate Sub Command1_Click()
Dim i% ,isum%
For i = 1 To 5
isum = sum(i)
Print isum;
Next i
End SubFunction sum(n As Integer)
j = j + n
sum = j
End Function
Static j % ‘结果?例 :编一使用静态变量的sum函数。在Command1_Click过程中5次调用该函数,程序如下:例,静态调用Dim j% 1 2 3 4 51 3 6 10 15Static j%nullPrivate Sub Command1_Click()
Dim Z%
Z=Z+2
Call S
Print Z
End SubSub S( )
Static Z%
Z=Z+2
Print Z
End Sub例3-7 有如下S子过程和Command1_Click事件过程:调用Command1_Click()3次,最后一次输出结果是:例3-72
2
4
2
6
2练习题练习题假定有如下的Sub过程: Sub S(x As Single , y As Single) t = x x = t / y y = t Mod y End Sub 在窗体上画一个命令按钮,然后编写如下事件过程: Private Sub Commandl_Click ( ) Dim a As Single ,b As Single a =5: b =4 S a , b Print a, b End Sub 程序运行后,单击命令按钮,输出结果为( )null 1.数制转换
例6.13 将一个十进制整数m转换成 r (2~16)进制字符串。
方法:将m不断除 r 取余数,直到商为零,以反序得到结果。6.6 常用算法(三)null2.例6.14加密和解密
简单加密的思想是:
将每个字母C加一序数K,式子 c=chr(Asc(c)+k),
例如序数k为5,这时
“A”“F”,“a”“f”,“B”“G”…
当加序数后的字母超过“Z”或“z”则 c=hr(Asc(c)+k -26)。
解密为加密的逆过程。
6.7重点和难点 6.7重点和难点 1. 确定自定义的过程是子过程还是函数过程
函数过程名有值,子过程名无值。
过程有一个返回值,则使用函数过程;
若返回多个值或无返回值,一般使用子过程。
2.过程中形参的个数和传递方式的确定
过程中参数的作用是实现过程与调用者的数据通信。
(1)从主调程序只获得初值,值传递。
(2)将结果返回给主调程序,地址传递。
3. 实参与形参结合时对应问题
个数、类型、位置、次序一一对应。
形参是值传递,对应实参可以是表达式、常量、数组元素。
形参是地址传递,对应实参只能是简单变量。
数组、记录类型、对象只能是地址传递。
4. 变量的作用域问题
局部变量、静态变量、全局变量特点、作用 。null实验
1. 某班有m名学生,要选派n名学生参加合唱队,计算有多少种选派方法。2.实验六:实验6.1 ~实验6.3第七章 常用控件第七章 常用控件7.1 单选按钮和复选框
7.2 框架
7.3 列表框和组合框
7.5 时钟null标准控件
标准控件又称内部控件( 20个),它总是出现在工具箱上的控件。2. ActiveX控件
ActiveX部件:是可以重复使用的编程代码和数据
是由用ActiveX技术创建的一个或多个对象所组成
ActiveX部件文件:扩展名OCX,在Windows的SYSTEM目录中ActiveX部件null 常用ActiveX控件所在的文件:null 除了ActiveX控件之外,还有向用户提供对象形式库的代码部件ActiveX DLL和ActiveX EXE。
ActiveX控件与ActiveX DLL/EXE的区别:
ActiveX控件:
有界面
用“工程/部件”命令加载
工具箱上有图标
ActiveXDLL/EXE:
没有界面
用“工程/引用”设置引用
工具箱上没有图标,但可以用“对象浏览器”查看其中的对象、属性、方法和事件。
3. 可插入对象
Windows应用程序的对象
可插入对象可添加到工具箱上
同标准控件一样使用
例如:Microsoft Excel工作表7.1 单选钮和复选框7.1 单选钮和复选框单选按钮(OptionButton)的左边有一个○。单选按钮必须成组出现,用户在一组单选按钮中必须且最多只能选择一项。当某一项被选定后,其左边的圆圈中出现一个黑点 。单选按钮主要用于在多种功能中由用户选择其中的一种功能。 7.1 单选钮和复选框7.1 单选钮和复选框Caption属性:即单选按钮或复选框边上的文本标题。
Alignment属性:
0:控件钮在左边,标题显示在右边。
1:控件钮在右边,标题显示在左边。
Value属性:该属性是默认属性,表示单选按钮或复选框的状态。
单选按钮(逻辑型) True:被选定 False:未被选定
复选框(数值型)
0--Unchecked:未被选定,默认设置。
1--Checked:被选定。
2--Grayed:灰色,禁止用户选择。
Style属性:指定单选按钮或复选框的显示方式,用于改善视觉效果。
0--Standard:标准方式。 1--Graphical:图形方式。nullClick事件:单选按钮或复选框的都能接收Click事件。当用户单击单选按钮或复选按钮框时,它们都会自动改变状态。
因为单击时自动改变状态,故不需要编写过程
例7.1 用单选钮和检查框设置文本框的字体。null例7.1‘ 用单选钮和检查框设置文本框的字体。初始界面如下:运行时界面如下:7.2 框架(Frame)7.2 框架(Frame)框架内控件的创建方法:
方法1:单击工具箱上的工具,然后用出现的“+”指针,在框架中适当位置拖拉出适当大小的控件。
不能使用双击工具箱上图标的自动方式。
方法2:将控件“剪切”到剪贴板,然后粘贴(Ctrl+V)到框架。null Caption属性:框架标题
Enabled属性
False:标题呈灰色,不允许对框架内的对象进行操作。
Visible属性
True:框架及其控件可见。
False:框架及其控件被隐含起来。
Click、DblClick事件
一般不需要编写框架的事件过程。
例7.2 框架用法示例null 例 编写一个选课程序,要求:限选课必须选一门;任选课可以不选,或选多门.初始化界面运行界面提示: 除文本框的MultiLine属性(True)必须在属性窗口设置外,其他控件属性均在程序运行时用代码设置.nullPrivate Sub Form_Load()
Form1.Caption = "选课程序"
Frame1.Caption = "限选课"
Frame2.Caption = "任选课"
Option1.Caption = "VB程序设计语言"
Option2.Caption = "C程序设计语言"
Check1.Caption = "数据库技术与应用"
Check2.Caption = "网络技术与Internet应用"
Check3.Caption = "多媒体技术与应用"
Label1.Caption = "我的计算机学习
计划
项目进度计划表范例计划下载计划下载计划下载课程教学计划下载
:"
Text1.Text = ""
‘Text1.MultiLine = True ‘只读属性,只能在属性窗口设置
Command1.Caption = "确定"
Option1.Value = True
End SubnullPrivate Sub Command1_Click()
Dim I% , t$(2),s$
Text1.Text = ""
S = IIf(Option1.Value, Option1.Caption, Option2.Caption) _
+ vbCrLf
If Check1.Value = 1 Then T(0) = Check1.Caption + vbCrLf
If Check2.Value = 1 Then T(1) = Check2.Caption + vbCrLf
If Check3.Value = 1 Then T(2) = Check3.Caption + vbCrLf
Text1.Text = S & T(0) & T(1) & T(2)
End Sub
思考:
如果将t$(2),s$ 定义为全局变量,程序执行多次后会有什么问题?为什么?7.3 列表框和组合框7.3 列表框和组合框 列表框(ListBox)通过显示多个选项供用户选择,达到与用户对话目的。如果有较多的选项而不能一次全部显示,则自动加上滚动条。列表框最主要的特点是只能选择,而不能直接修改其中的内容。 组合框(ComboBox)是组合了文本框和列表框的特性而形成的一种控件。当用户在组合框中许定某项后,其内容会自动装入文本框中。7.3 列表框和组合框7.3 列表框和组合框组合框有三种式样:
下拉式组合框:DropDownStyle属性为DropDown(默认值)。程序运行时,用户可以直接在文本框中输入。
简单组合框:DropDownStyle属性为Simple。它的列表框不能被收起和拉下,与文本框一起显示在屏幕上。用户可以直接在文本框中输入。
下拉式列表框:DropDownStyle属性为DropDownList。它的功能下拉式组合框类似,但不能输入列表框中没有的选项。 null 1. 共有的重要属性
(P:可在程序中设置或引用,D:可在设计状态设置)
List :PD
字符型数组,存放列表框的项目,下标是从0开始。
ListIndex:P
选中的项目的序号,没有项目被选定时为-1
ListCount:P
项目的数量,ListCount-1是最后一项的下标。
Sorted:D
True:按字母顺序排列。 False:按加入先后顺序排列。
Text:P 列表项中被选定的内容,
List 1.List(List 1.ListIndex) = List1.Text。null2. 列表框的特有属性
Selected:P 逻辑数组。
Selected(i)的值为True表示第i+1项被选中。
MultiSelect
0-None:禁止多项选择。
1-Simple:简单多项选择。
2-Extended:扩展多项选择。
3. 组合框的特有属性
Stylenull列表框各主要属性的值:
List1.ListIndex = 3 (下标从0开始的)
List1. ListCount = 5
List1. Selected(3) = True,其余为False。
List1. Sorted = False,没有排序。
List1. Text 为 “cox” ,
与List1. List(List1. ListIndex)相等List1null4. 方法
AddItem
格式: 对象.AddItem item [, index]
RemoveItem
格式: 对象.RemoveItem index
Clear
格式: 对象.Clear
5. 事件
列表框:Click、DblClick
组合框:Click,只有简单组合框才有DblClick事件
一般不需要编写Click事件过程
通常在单击命令按钮或发生DblClick事件时才读取Text属性 null 例7.3 对列表框进行项目添加、修改和删除操作。 例7.4 对列表框进行项目添加、修改和删除操作。 7.5 时钟(Timer)7.5 时钟(Timer) 时钟控件以Interval为时间间隔产生 Timer事件。
属性
Interval属性
单位:ms(0.001s),0.5秒是500。
Interval=0:计时器不工作。
Enabled属性
True:有效计时
False:停止时钟工作
事件
Timer
例7.8 定时的闹钟
例7.9 蝴蝶飞舞 7.10 鼠标器和键盘7.10 鼠标器和键盘 1. 鼠标器事件
注意:鼠标事件发生在什么对象上,是窗体上还是控件上。
MouseDown事件
Sub Form_MouseDown(Button As Integer, Shift As Integer,
X As Single, Y As Single)(发生在窗体上的事件过程)
MouseUp事件
Sub Form_MouseUp(Button As Integer, Shift As Integer,
X As Single, Y As Single) (发生在窗体上的事件过程)
MouseMove事件
Sub Form_MouseMove(Button As Integer, Shift As Integer,
X As Single, Y As Single) (发生在窗体上的事件过程)7.10 键盘7.10 键盘 2. 键盘事件
KeyPress事件过程
Sub Form_KeyPress(KeyAscii As Integer)
Sub object_KeyPress([index As Integer,]KeyAscii As Integer)
KeyDown事件过程
Sub Form_KeyDown(keycode As Integer, shift As Integer)
Sub object_KeyDown([index As Integer,]keycode As Integer,
shift As Integer)
KeyUp和KeyDown事件过程
Sub Form_KeyUp(keycode As Integer, shift As Integer)
Sub object_KeyUp([index As Integer,]keycode As Integer,
shift As Integer)
参数说明
Shift与鼠标事件过程Shift相同
KeyCode:键盘扫描码
KeyAscii:字符ASCII码 null区别null 窗体的:
KeyPress
KeyDown
KeyUp 控件的:
KeyPress
KeyDown
KeyUp 窗体的KeyPreview为True焦点在控件上输入Sub Form_KeyPress(KeyAscii AsInteger)
KeyAscii = KeyAscii + 1
End SubSub Text1_KeyPress(KeyAscii As Integer)
KeyAscii = KeyAscii + 1
End Sub假定窗体KeyPreview为True,并有下面事件过程,
则当文本框中输入“1”时,实际上是得到的是“3”?窗体KeyPreview为False时 在文本框中输入“1”时,实际上得到的是什么。在这里作一点修改
影响所有控件在这里作一点修改
影响一个控件null 对输入的数据进行验证、限制和修改
1. 修改输入数据。
接收大写字符
将KeyPreview设置为True时
Sub Form_KeyPress(KeyAscii As Integer)
If KeyAscii >= Asc("a") And KeyAscii <= Asc("z") Then
KeyAscii = KeyAscii + Asc("A") - Asc("a")
End If
End Sub
如果把它改为某个控件的事件过程,效果一样吗?
2. 限制数据输入
文本框只能接收“0”~“9”的数字字符。
Sub txtExample_KeyPress(KeyAscii As Integer)
If KeyAscii < 48 Or KeyAscii > 57 Then
KeyAscii = 0
End If
End Subnull
例7.15 编写一个程序,当按下Alt+F5时终止程序的运行。
'先把窗体的KeyPreview设置为True,再编写如下的程序:
Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'按下Alt键时,Shift的值为4
If (KeyCode = vbKeyF5) And (Shift = 4) Then
End
End If
End Subnull例7.16 “锤打红心”游戏(1) 我们利用上、下、左、右四个箭头键控制“铁锤”
“”:37(&H25) “”:38(&H26)
“”:39(&H27) “”:40(&H28)
(2) 如果Abs(Image1.Left - Image2.left < 300) And Abs(Image1.Top - Image2.Top < 320)成立,则认为是重叠,“铁锤”锤打到“红心”。
(3) 在窗体上的时钟控件(Timer1)过程中控制“红心”移动。Timer1的Interval属性为200,即每1秒产生5个Timer事件。Image2 Image1 null例题:编写一个“选择旅游区”的程序,旅客可以在窗体上选择自己想去旅游的地区。假定有共三个地区,包括丽江、香格里拉和泸沽湖,每个旅客可以选择其中的1个、两个或3个地区,然后在文本框中显示所选择的地区。(在指定的框架内编程)界面设计运行时的界面nullOption Explicit
Dim s$(2)
Private Sub Form_Load()
Form1.Caption = "选择旅游地区"
Check1.Caption = "丽江"
Check2.Caption = "香格里拉"
Check3.Caption = "卢沽湖"
Command1.Caption = "确定"
Command2.Caption = "结束"
Text1.Text = ""
End SubPrivate Sub Command2_Click()
End
End SubPrivate Sub Command1_Click()
Text1.Text = s(0) & s(1) & s(2)
End SubSub Check1_click()
s(0) = Check1.Caption
End Sub
Sub Check2_click()
s(1) = Check2.Caption
End Sub
Sub Check3_click()
s(2) = Check3.Caption
End Sub例复选框第八章 界 面 设 计8.1 通用对话框
8.2 菜单设计
8.3 多重窗体和多文档界面
8.4 工具栏和状态栏
8.5 RichTextBox控件
8.6 应用程序向导第八章 界 面 设 计8.1 通用对话框(CommonDialog)8.1 通用对话框(CommonDialog) 通用对话框添加到工具箱:打开通用对话框:8.1 通用对话框(CommonDialog)8.1 通用对话框(CommonDialog) 属性
Action:打开通用对话框。
DialogTitle:对通用话框标题。
CancelError
True:选择“取消”按钮,出现错误警告;
Err.Number 置为32755(cdCancel)。
False(缺省):选择“取消”按钮,没有错误警告。1.文件对话框(打开、保存)需设置的属性1.文件对话框(打开、保存)需设置的属性“打开”文件对话框属性页“打开”文件对话框属性页属性:
FileName:包含路径;
FileTitle:不包含路径。
Filter:例如,
Documents(*.DOC)|*.DOC|Text