Download presentation
Presentation is loading. Please wait.
1
过程 第 7 章
2
本章主要内容 第7章 过 程 通用过程 Sub过程/Function过程 参数传递 过程的嵌套与递归调用 变量的作用范围
多窗体与Sub Main过程 程序举例
3
VB应用程序是由过程组成的,过程是完成某种特殊功能的一组独立的程序代码。两大类过程。
事件过程 Sub过程 通用过程 Function过程 事件过程是当某个事件发生时,对该事件作出响应的程序段,它是VB应用程序的主体 通用过程是独立于事件过程之外,可供其他过程调用的程序段
4
7.1 通用过程 过程调用示例 把相同的任务编成相对独立的“子过程” 当事件过程需要执行这个任务时,可使用调用语句(如Call)实行调用。子过程执行完后,会返回事件过程中调用语句Call的后续语句继续执行 通用过程又分为Sub(子程序)过程和Function(函数)过程 调用过程 …… Call SubA Call SubB 子过程SubA 子过程SubB
5
7.1.1 Sub过程 例7.1 使用Sub过程的示例1 Show Call mysub1(30) Call mysub2
Private Sub Form_Load() Show Call mysub1(30) Call mysub2 End Sub 程序运行结果 Private Sub mysub1(n) Print String(n, "*") End Sub Private Sub mysub2() Print "*"; Tab(30); "*"
6
调用过程 Mysub1过程 Form_Load() 事件过程 Call mysub1(30) Call mysub2 Mysub2过程
7
过程mysub2()不带参数,其功能是输出左右两边的“*”号
在上述事件过程Form_Load()中,通过Call来分别调用两个Sub过程 在Sub过程mysub1(n)中,n为参数(也称形参),当调用过程(即Form_Load())通过Call mysub1(30)(30称为实参)调用时,就把30传给n,这样调用后就输出30个“*”号 过程mysub2()不带参数,其功能是输出左右两边的“*”号
8
1. Sub过程的定义 定义格式: [Private|Public | Static] Sub 过程名([参数表]) 语句块 [Exit Sub] End Sub 说明: · 局部(Private)过程、全局(公用, Public)过程和静态(Static)过程 · 参数表定义格式: [ByVal |ByRef] 变量名 [( )][As 数据类型] … ByVal表示该参数按值传递,ByRef表示该参数按地址传递 · 通过参数表传送参数 Sub过程可以获取调用过程传送的参数,也能通过参数表的参数,把计算结果传回给调用过程
9
2. Sub过程的建立 可以在代码窗口中直接键入来创建Sub过程 选择“工具”菜单中的“添加过程”命令
Sub过程可以保存在两种模块中:窗体模块(.frm)和标准模块(.bas) 可以在代码窗口中直接键入来创建Sub过程 选择“工具”菜单中的“添加过程”命令
10
3. Sub过程的调用 事件过程是通过事件驱动和由系统自动调用的,而Sub过程则必须通过调用语句实行调用 调用Sub过程有以下两种方法:
(1)使用Call语句。格式: Call 过程名([实参表]) (2)直接使用过程名,格式: 过程名[实参表] 例如,调用名为SubCal的过程: Call SubCal(10) SubCal 10
11
例7.2 使用Sub过程示例2 在事件过程Form_Load()中,有三处调用Sub过程Sub_Cont()
Private Sub Form_Load() Show Print "VB的基本特点是: " Call Sub_Cont Print "面向对象的可视化编程 " Print "事件驱动的编程机制 " Print "结构化的设计语言 " End Sub 在事件过程Form_Load()中,有三处调用Sub过程Sub_Cont() Private Sub Sub_Cont() Dim resp As String Do While True resp = InputBox("是否继续(y/n) ? ") If UCase(resp) = "N" Then End If UCase(resp) = "Y" Then Exit Do Loop End Sub
12
例7.3 计算5! + 10! 因为计算5!和10!都要用到阶乘n! (n!=1×2×3×…×n) 所以把计算n!编成Sub过程
例7.3 计算5! + 10! 因为计算5!和10!都要用到阶乘n! (n!=1×2×3×…×n) 所以把计算n!编成Sub过程 采用Print直接在窗体上输出结果,程序代码: Private Sub Form_Load() Show Dim y As Long, s As Long Call Jc(5, y) s = y Call Jc(10, y) s = s + y Print "5! + 10! ="; s End Sub 程序运行结果: 5! + 10! = Private Sub Jc(n As Integer, t As Long) Dim i As Integer t = 1 For i = 1 To n t = t * i Next i End Sub 注意参数n及t的调用情况
13
7.1.2 Function过程 允许用户自定义函数过程(又称Function过程) 一般语法格式:
[Private | Public | Static] Function 函数名([参数表]) [As 数据类型] 语句块 [函数名=表达式] [Exit Function] End Function 函数返回值的处理
14
2. Function过程的建立 与Sub过程相同 可以在“代码窗口”中直接输入来建立Function过程
15
例7.4 输入三个数,求出它们的最大数 本例采用InputBox函数输入三个数,判断出最大数后采用Print直接输出在窗体上。程序代码:
例7.4 输入三个数,求出它们的最大数 把求两个数中的大数编成Function过程,过程名为Max 本例采用InputBox函数输入三个数,判断出最大数后采用Print直接输出在窗体上。程序代码: Private Sub Form_Load() Show Dim a As Single, b As Single, c As Single Dim s As Single a = Val(InputBox("输入第一个数")) b = Val(InputBox("输入第二个数")) c = Val(InputBox("输入第三个数")) s = max(a, b) Print "最大数是:"; max(s, c) End Sub Function max(m, n) As Single If m > n Then max = m Else max = n End If End Function
16
3. Function过程的调用 (1)直接调用 像使用VB内部函数一样,只需写出函数名和相应的参数即可。例如: s = Max(a, b) Print Max(s, c) (2)用Call语句调用 与调用Sub过程一样来调用Function过程,例如: Call Max(a, b) 当用这种方法调用Function过程时,将会放弃返回值
17
例7.5 判断输入字符是不是英文字母 分析:英文字母有大小写之分,只要将该字符转换为大写,再判断是不是处于‘A’~‘Z’范围内,若是,则是英文字母,否则不是 本例采用InputBox函数来输入字符,判断后结果直接输出在窗体上。
18
Private Sub Form_Load()
Dim s As String Show s = InputBox("请输入一个字符") If Checha(s) Then Print "***输入的字符是英文字母***" Else Print "***输入的字符不是英文字母***" End If End Sub Function Checha(inp As String) As Boolean Dim upalp As String upalp = UCase(inp) If "A" <= upalp And upalp <= "Z" Then Checha = True Checha = False End Function
19
4. 查看过程 查看当前模块中有哪些Sub过程和Function过程; 要查看的是其他模块中的过程
20
7.2 参数传递 参数传递可以实现调用过程和被调过程之间的信息交换 7.2.1 形参与实参 形式参数(简称形参)
7.2 参数传递 参数传递可以实现调用过程和被调过程之间的信息交换 两种方式:按值传递和按地址传递 7.2.1 形参与实参 形式参数(简称形参) 在被调过程中的参数。出现在Sub过程和Function过程中 形式参数可以是变量名和数组名 实际参数(简称实参) 在调用过程中的参数。过程调用时实参数据会传递给形参 形参表和实参表中的对应变量名可以不同,但实参和形参的个数、顺序以及数据类型必须相同
21
定义过程和调用过程的示例: 调用过程:Call Mysub(100, "计算机" , 1.5)
定义过程:Sub Mysub(t As Integer,s As String,y As Single) “形实结合”是按照位置结合的,即第一个实参值(100)传送给第一个形参t,第二个实参值(“计算机”)传送给第二个形参s,第三个实参值(1.5)传送给第三个形参y。 数组可以作为形参出现在过程的形参表中
22
输入若干个(不超过100)个学生的成绩,求出平均分、最高分及最低分
例7.6 求出学生成绩的平均分、最高分及最低分 输入若干个(不超过100)个学生的成绩,求出平均分、最高分及最低分 本例采用InputBox函数来输入成绩,计算结果直接输出到窗体上
23
Private Sub Form_Load()
Dim jc(100) As Integer, x As Integer,n As Integer, _ sum As Long, max As Integer, min As Integer n = 0 Do While True x = Val(InputBox("请输入第" & n + 1 & _ "个学生的成绩(-1结束)")) If x = -1 Then Exit Do n = n + 1 jc(n) = x Loop If n > 0 Then Call Caljc(n, jc(), sum, max, min) Else End End If Show Print "平均分:"; Format(sum / n, "###.0") Print "最高分:"; max Print "最低分:"; min End Sub
24
s As Long, m As Integer, n As Integer) Dim i As Integer
Sub Caljc(k As Integer, darray() As Integer, _ s As Long, m As Integer, n As Integer) Dim i As Integer s = darray(1) : m = darray(1) : n = darray(1) If k = 1 Then Exit Sub For i = 2 To k s = s + darray(i) If m < darray(i) Then m = darray(i) If n > darray(i) Then n = darray(i) Next i End Sub
25
7.2.2 按地址传递和按值传递 1. 按地址传递 VB默认的数据传递方式
按地址传递和按值传递 1. 按地址传递 VB默认的数据传递方式 按地址传递(关键字ByRef):把实参变量的内存地址传递给被调过程(如Sub过程),即形参与实参使用相同的内存地址单元,这样通过过程就可以改变变量本身的值 实参必须是变量,不能采用常量或表达式。 例7.3中,Form_Load()事件过程是通过“Call Jc(5,y)”和“Call Jc(10,y)”来调用过程Jc(n,t)的,其中采用的第二个参数就是按地址来传送数据的
26
2. 按值传递 按值传递(关键字ByVal):通过常量传递实际参数,即传递参数值而不是传递它的地址
因为通用过程不能访问实参的内存地址,因而在通用过程中对形参的任何操作都不会影响实参
27
例7.7 参数传递方式示例 设置两个通用过程Test1和Test2,分别按值传递和按地址传递 Private Sub Form_Load()
例7.7 参数传递方式示例 设置两个通用过程Test1和Test2,分别按值传递和按地址传递 Private Sub Form_Load() Dim x As Integer Show x = 5 Print "执行test1前,x="; x Call test1(x) Print "执行test1后,test2前,x="; x Call test2(x) Print "执行test2后,x="; x End Sub Sub test1(ByVal t As Integer) t = t + 5 End Sub Sub test2(s As Integer) s = s - 5 运行结果 执行Test1前,x=5 执行Test1后,Test2前,x=5 执行Test2后,x=0
28
7.3 过程的嵌套与递归调用 7.3.1 过程的嵌套调用 在一个过程(Sub过程和Function过程)中调用另外一个过程
7.3 过程的嵌套与递归调用 7.3.1 过程的嵌套调用 在一个过程(Sub过程和Function过程)中调用另外一个过程 例 输入两个数n、m,求组合数Cnm 的值 Cnm = n! m!(n-m)!
29
Private Function Calcomb(n, m)
Private Sub Form_Load() Show m = Val(InputBox("输入m的值")) n = Val(InputBox("输入n的值")) If m > n Then MsgBox "输入数据错误", 0, "检查错误" End End If Print "组合数是:"; Calcomb(n, m) End Sub Private Function Calcomb(n, m) Calcomb = Jc(n) / (Jc(m) * Jc(n - m)) End Function Private Function Jc(x) t = 1 For i = 1 To x t = t * i Next i Jc = t 程序中,采用了过程的嵌套调用方式。在事件过程Form_Load()中调用了Calcomb过程,而在Calcomb过程中调用了三次jc过程。
30
7.3.2 过程的递归调用 一个过程调用过程本身,就称为过程的递归调用
过程的递归调用 一个过程调用过程本身,就称为过程的递归调用 采用递归方法来解决问题时,必须符合以下两个条件: (1)可以把要解的问题转化为一个新的问题,而这个新的问题的解法仍与原来的解法相同; (2)有一个明确的结束递归的条件(终止条件),否则过程将永远“递归”下去
31
例7.9 采用递归方法求n! (n>0) 可用下列的递归公式 1 n=1 n×(n-1)! n>1
32
Private Sub Form_Load()
Dim n As Integer, m As Double Show n = Val(InputBox("输入1~15之间的整数")) If n < 1 Or n > 15 Then MsgBox "错误数据", 0, "检查数据" End End If m= fac(n) Print n; "!= "; m End Sub Private Function fac(n) As Double If n > 1 Then fac = n * fac(n - 1) '递归调用 Else fac = 'n=1时,结束递归 End Function
33
递归调用过程(n=3) 说明:当n>1时,在Fac过程中调用Fac过程,然后n减1,再次调用Fac过程,这种操作一直持续到n=1为止。例如,当n=3时,求Fac(3)变成求3×Fac(2),求Fac(2)变成求2×Fac(1),而Fac(1)为1,递归结束。以后再逐层返回,递推出Fac(2)及Fac(3)的值 注意,在某次调用Fac过程时并不是立即得到Fac(n)的值,而是一次又一次地进行递归调用,到Fac(1)时才有确定的值,然后通用过程逐层返回中依次算出Fac(2)、Fac(3)的值 Form_Load过程 m=Fac(3) Fac过程 调用 Fac(3)值 为6 参数n为3 Fac=3*Fac(2) Fac(2)值 为2 参数n为2 Fac=2*Fac(1) Fac(1)值 为1 参数n为1 Fac=1
34
例7.10 用递归方法求两个正整数n和m的最大公约数
也可采用递归调用方法来求解,递归终止条件是余数为0 Private Sub Form_Load() Show m = Val(InputBox("输入m的值")) n = Val(InputBox("输入n的值")) Print m; "和"; n; "的最大公约数是:"; gys(n, m) End Sub Private Function gys(n, m) p = n Mod m If p = 0 Then '终止条件 gys = m Else gys = gys(m, p) 'm→n,p→m,再调用 End If End Function
35
7.4 变量的作用范围 7.4.1 代码模块的概念 应用程序通常包括窗体文件(.frm)、模块文件(.bas)和类模块(.cls)
7.4 变量的作用范围 变量的作用域(空间)和生存期(时间) 代码模块的概念 应用程序通常包括窗体文件(.frm)、模块文件(.bas)和类模块(.cls) 应用程序 工程文件 (.vbp) 窗体模块 文件(.frm) Sub 过程 Function 事件 声明 部分 类模块 文件(.cls) 标准模块 文件(.bas) Sub Main
36
7.4.2 变量的作用域 这两个同名变量Sum没有任何联系 变量根据所处的位置或被定义不同,其作用范围也不同 局部变量、模块级变量和全局变量
变量的作用域 变量根据所处的位置或被定义不同,其作用范围也不同 局部变量、模块级变量和全局变量 1. 局部变量 在一个过程内部用Dim或Static声明的变量称为局部变量。只能在本过程中有效。在一个窗体中,不同过程中定义的局部变量可以同名。例如,在一个窗体中定义 Private Sub Command1_Click() Dim Count As Integer Dim Sum As Integer . . . End Sub Private Sub Command2_Click() 这两个同名变量Sum没有任何联系
37
2. 模块级变量 在窗体模块的声明部分中声明该变量 模块级变量可以在一个窗体的不同过程中使用
2. 模块级变量 模块级变量可以在一个窗体的不同过程中使用 在窗体模块的声明部分中声明该变量 如果用Private或Dim来声明,则该变量只能在本窗体(或本模块)中有效,在其他窗体或模块中不能引用该变量。 以Public声明的变量,允许在其他窗体和模块中引用
38
3. 全局变量 全局变量可以被应用程序中任何一个窗体和模块直接访问。
3. 全局变量 全局变量可以被应用程序中任何一个窗体和模块直接访问。 全局变量要在标准模块文件(.bas)中的声明部分用Global或Public语句来声明。 格式: Global 变量名 As 数据类型 Public 变量名 As 数据类型
39
7.4.3 变量的生存期 分为动态变量和静态变量 生存期,也即变量能够保持其值的时间 1. 动态变量
变量的生存期 生存期,也即变量能够保持其值的时间 分为动态变量和静态变量 1. 动态变量 动态变量是指程序运行进入变量所在的过程时,才分配给该变量的内存单元,经过处理退出该过程时,该变量占用的内存单元自动释放,其值消失。当再次进入该过程时,所有的动态变量将重新初始化。 使用Dim关键字在过程中声明的局部变量属于动态变量
40
2. 静态变量 静态变量是指程序进入该变量所在的过程,经过处理退出该过程时,其值仍被保留,即变量所占的内存单元没有释放。当以后再次进入该过程时,原来的变量值可以继续使用 使用Static关键字在过程中声明的局部变量属于静态变量 例7.11 使用Static Sub语句的示例 Static Sub Subtest() Dim t As Integer 't为静态变量 t = 2 * t + 1 Print t End Sub Private Sub Command1_Click() Call Subtest '调用子过程Subtest
41
运行后,多次单击命令按钮Command1,执行结果为:
3 7 …… 将Static Sub改为Private Sub后,运行过程中多次单击命令按钮Command1,执行结果为:
42
7.5 多窗体与Sub Main过程 2. 删除窗体 3. 保存窗体 4. 设置启动窗体 7.5.1 多窗体处理
在多窗体程序中,每个窗体可以有自己的界面和程序代码,完成不同的操作 1. 添加窗体 通过“工程”菜单中的“添加窗体”命令来实现 2. 删除窗体 选择“工程”菜单中的“移除”命令 3. 保存窗体 选择“文件”菜单中的“保存”或“另存为”命令 4. 设置启动窗体 在“工程属性”对话框中设置
43
5. 有关语句和方法 Load语句:把一个窗体装入内存 UnLoad语句:清除内存中指定的窗体 Show方法:显示一个窗体
Hide方法:隐藏窗体。即不在屏幕上显示,但仍在内存 中,因此它与UnLoad的作用是不一样的
44
例7.12 多窗体应用示例 创建3个窗体和1个标准模块 (1)主窗体(Form1)
例 多窗体应用示例 创建3个窗体和1个标准模块 (1)主窗体(Form1) 本窗体上建立了“输入参数”(Command11) 、“画圆”(Command12)和“结束”(Command13)三个命令按钮 设置为启动窗体
45
Private Sub Command11_Click() '主窗体“输入参数”按钮 Form1.Hide '隐藏主窗体
Form2.Show '显示“输入参数”窗体 End Sub Private Sub Command12_Click() '主窗体“画圆”按钮 Form1.Hide '隐藏主窗体 Form3.Show '显示“画圆”窗体 Private Sub Command13_Click() '主窗体“结束”按钮 Unload Form1 Unload Form2 Unload Form3 End 先卸载所有已打开的窗体
46
(2)“输入参数”窗体(Form2) 这是在主窗体上单击了“输入参数”按钮后弹出的窗体,用于输入圆的坐标位置(x,y)和半径(r)。窗体上建立了3个文本框(Text21、Text22和Text23)和1个“返回”命令按钮(Command21) Private Sub Command21_Click() '“输入参数”窗体的“返回”按钮 X = Val(Text21.Text) Y = Val(Text22.Text) R = Val(Text23.Text) Form2.Hide '隐藏“输入参数”窗体 Form1.Show '显示主窗体 End Sub
47
Private Sub Command31_Click() '“画圆”窗体的“画圆”按钮
(3)“画圆”窗体(Form3) 这是在主窗体上单击了“画圆”按钮后弹出的窗体。窗体上建立了1个图片框和2个命令按钮,如图7.10所示。用户可以单击“画圆”(Command31)命令按钮,使之按给定参数在图片框上画圆。 Private Sub Command31_Click() '“画圆”窗体的“画圆”按钮 Picture1.Cls Picture1.Circle (X, Y), R ‘在图片框上画圆,圆心(X,Y), 半径R End Sub Private Sub Command32_Click() '“画圆”窗体的“返回”按钮 Form3.Hide '隐藏“画圆”窗体 Form1.Show '显示主窗体
48
(4)标准模块(Modulel) 由于在各窗体之间需要使用公共变量来传送数据,所以建立一个标准模块Modulel,对用到的全局变量X、Y和R进行声明 运行程序后,首先显示主窗体。在主窗体上,用户可通过“输入参数”和“画圆”两个按钮来选择进入不同的窗体,例如单击“输入参数”按钮,则主窗体消失,显示“输入参数”窗体。在“输入参数”窗体或“画圆”窗体上,单击“返回”按钮,又可以隐藏当前窗体和重现主窗体
49
Sub Main过程 程序一般从启动窗体的Form_Load过程开始执行 有时在程序启动时不加载任何窗体,而是首先执行一段程序代码,此时可把要执行的程序代码放在Sub Main过程中,并指定Sub Main为“启动对象”。应用程序在运行时会先执行Sub Main过程 在一个工程中只能有一个Sub Main过程 设置Sub Main过程为“启动对象”的方法:在“工程属性”对话框的“通用”选项卡中,从“启动对象”下拉列表框中选中“Sub Main”
50
例7.13 使用Sub Main过程示例 建立两个窗体(Form1及Form2)和1个标准模块(Module1)。标准模块包含一个Sub Main过程。如图7.12所示 两个窗体分别显示当前日期和时间 运行程序时首先判断当前时间是否超过12时,若超过,则显示窗体Form2;否则显示窗体Form1
51
(1)Sub Main过程 编写的Sub Main过程代码如图7.12所示。再设置Sub Main过程为“启动对象” (2)窗体Forml 本窗体显示当前日期,其Form_Load事件过程代码如下: Private Sub Form_Load() Show Print "这里是窗体Form1" Print "当前日期: "; Date End Sub
52
(3)窗体Form2 本窗体显示当前时间,其Form_Load事件过程代码如下: Private Sub Form_Load() Show Print "这里是窗体Form2" Print "现在时间: "; Time End Sub 程序运行时,先执行Sub Main过程,即取出当前时数t,再根据条件“t<=12”来决定是显示Form1,还是显示Form2 不需要加载任何窗体(这种情况极少)时,可把执行的代码直接写入Sub Main过程中
53
7.6 程序举例 例7.14 绘制一个圆,使之从小变大,再从大变小
7.6 程序举例 例 绘制一个圆,使之从小变大,再从大变小 分析:为了得到一个圆大小变动的动画效果,先在某一位置上绘制一个圆,显示一段时间(延时)后抹除,接着在下一位置上依此处理,直到指定位置为止 抹除方法是采用底色(背景色)来掩盖图形 采用Circle方法可以画一个圆 延时时间:利用 Timer函数,该函数返回系统时钟从午夜开始计算的秒数(带两位小数) Private Sub Delay(d) ‘延迟 t = Timer + d Do While Timer < t '利用空循环实现延迟 Loop End Sub
54
Private Sub Form_Load()
Show Form1.BackColor = QBColor(15) '设置背景颜色 Call Pict(30, 1600, 30) '从小变大 Call Pict(1600, 30, -30) '从大变小 End Sub Private Sub Pict(a, b, c) ‘显示→延迟→抹除 For i = a To b Step c Call Plot(i, 4) '显示圆 Delay '延迟0.1秒 Call Plot(i, 15) '抹除 Next i Private Sub Plot(r, clr) Form1.Circle (2400, 1600), r, QBColor(clr) '画圆
55
例7.15 变幻圆 随机产生圆的有关参数 Private Sub Form_Load() Show Randomize
例 变幻圆 随机产生圆的有关参数 Private Sub Form_Load() Show Randomize Form1.BackColor = QBColor(15) '设置背景颜色 For i = 1 To '控制进行200次 clr = Int(15 * Rnd) '产生0~14颜色码 x = Int(4000 * Rnd) '产生圆心x坐标值 y = Int(4000 * Rnd) '产生圆心y坐标值 r = Int(500 * Rnd) '产生圆半径r值 Call Plot(x, y, r, clr) '画圆 Delay '延时0.1秒 Call Plot(x, y, r, 15) '抹除 Next i End Sub Private Sub Plot(x, y, r, clr) Form1.Circle (x, y), r, QBColor(clr) '画圆
56
例7.16 动态文字 在窗体上建立3个文本框,使之以不同效果显示文字“2008年世界奥运会将在中国北京市举行”
例7.16 动态文字 在窗体上建立3个文本框,使之以不同效果显示文字“2008年世界奥运会将在中国北京市举行” 第一个文本框Text1从左到右逐字显示,直到把整行文字显示出来; 第二个文本框Text2使文字从左到右作水平移动; 第三个文本框Text3以闪动方式显示文字 设计阶段 运行阶段
57
Dim txt As String, n As Integer, k As Integer
Private Sub Form_Load() n = 0 txt = "2008年世界奥运会将在中国北京市举行" k = Len(txt) Text1.ForeColor = RGB(255, 0, 0) '红色 Text2.ForeColor = RGB(0, 0, 0) '黑色 Text3.ForeColor = RGB(0, 0, 255) '蓝色 End Sub
58
Private Sub Timer1_Timer() n = n + 1 ‘模块级变量n是关键参数 If n <= k Then
Text1.Text = Left(txt, n) ‘逐次取n个汉字,n每次加 1 Text2.Text = Space(2 * (k - n)) + Left(txt, n) Else n = 0 Text1.Text = "" Text2.Text = "" End If If n Mod 2 = 0 Then ‘以2个定时时间为1个周期,显示及清除交替进行 Text3.Text = txt 'n为偶数时显示 Text3.Text = "" 'n为奇数时清除 End Sub 逐次减少空格 1个汉字占2个字符位置 逐次增加汉字
Similar presentations