430 likes | 654 Views
第六章 数组. 教学目标 掌握数组的基本概念 掌握静态数组和动态数组的用法 熟悉 ProgressBar、TrackBar 和 TabControl 控件. 6.1 静态数组. 一个变量表示一个数据,这种变量称为 简单变量 。 用一个变量表示一组相同性质的数据, — 数组 每个数据称为 数组元素 ,各元素通过下标来区分。 数组必须先声明后使用。在声明数组时,如果数组的大小(包含数据的个数)已经确定,称为 静态数组 ,否则称为 动态数组 。. 6.1.1 一维数组.
E N D
第六章数组 教学目标 掌握数组的基本概念 掌握静态数组和动态数组的用法 熟悉ProgressBar、TrackBar和TabControl控件
6.1 静态数组 • 一个变量表示一个数据,这种变量称为简单变量。 • 用一个变量表示一组相同性质的数据,—数组 • 每个数据称为数组元素,各元素通过下标来区分。 • 数组必须先声明后使用。在声明数组时,如果数组的大小(包含数据的个数)已经确定,称为静态数组,否则称为动态数组。
6.1.1 一维数组 用一个下标就能确定数组中的不同元素,这种数组称为一维数组,否则称为多维数组。一维数组声明的格式为: Dim 数组名(最大下标) As 类型名 其中最小下标为0。 Dim语句声明数组为系统提供了一系列信息,如数组名、数组中各元素的类型、数组的维数和各维的大小。 例如,要表示10个学生的成绩,可以声明具有10个元素的数组intScore,其声明如下: Dim intScore(9) As Integer 系统必须为该数组的10个元素分配存储空间,形式如下所示:
数组需要注意以下几点: • 数组名的命名方法同简单变量,可以是任意合法的Visual Basic变量名。和前面强调的一样,最好起一个有意义的名字。 • 数组类型可以是任意的基本类型,如Integer,Long,Single,Double,Currency和String等,也可以是Object类型。 • 数值数组中的元素若为基本数值类型,则全部元素都自动初始化为0。而字符串数组或字符数组中全部元素都自动初始化Nothing。 • 数组中各元素通过下标来区分,并且下标可以使用变量,所以数组和循环语句结合使用,使得程序书写简洁,操作方便。例如,要计算100个学生的平均成绩,可以使用以下的程序段: Dim sngSum As Single = 0 Dim i As Integer Dim intScore(100)As Integer For i = 1 To 100 sngSum += intScore(i) Next i sngSum = sngSum / 100
6.1.2 多维数组 多维数组声明形式如下: Dim 数组名(最大下标1,最大下标2 [, 最大下标3 ]) As 类型名 其中最大下标的个数决定数组的维数,相邻的两个最大下标之间用逗号隔开。类型名决定每个数组元素的数据类型。例如: Dim a(2, 3) As Single 声明了一个二维数组,第0维下标的取值范围为0~2,第1维下标的取值范围为0~3。每一个元素都是单精度型。声明该数组时,系统要为每一个元素分配一个单精度数据的存储单元,并且各元素的存储单元是连续的,按照行来排列,其排列顺序如表所示:
数组的元素个数可按下式计算: 数组的元素个数 = (第0维的最大下标 +1)× (第1维的最大下标 + 1) × … 数组声明中的下标规定每一维的大小,表明数组的整体特性,而在其他位置出现的下标表示数组中的不同元素。两者虽然写法相同,但含义不同。例如: Dim c(5) As Integer c(5) = 23 第一行的c(5)表示数组c下标的最大值为5,数组中元素的个数为6。而第二行的c(5)表示下标为5的元素。 要确定数组某一维下标的下界或上界,可以通过数组本身的方法GetLowerBound和GetUpperBound来得到。其形式为: GetLowerBound (维度) GetUpperBound(维度)
例如: Dim intA(5, 8) As Integer Dim intB(12) As String Dim intUpBound As Integer intUpBound = intA.GetUpperBound(0) ‘intUpBound = 5 intUpBound = intA.GetUpperBound(1) ‘intUpBound = 8 intUpBound = intB.GetUpperBound(0) ‘intUpBound = 12 在上例中,intA是一个2维数组。第0维和第1维的上界分别为5和8。因此intA的GetUpperBound方法调用分别得到5和8。intB是一维数组,只有第0维。由于数组的下界总是0,所以对GetLowerBound的调用总是会得到0。
6.2 动态数组 动态数组在声明时,不指定数组的维数及下标界限,在使用前通过ReDim语句指定数组的下标界限,所以在程序运行到ReDim语句时才给数组分配存储空间。对于一个动态数组,可以根据用户需求,多次使用ReDim语句来指定数组的下标界限,从而有效利用存储空间。
使用动态数组 声明动态数组和静态数组的不同之处是不指定数组的下标界限,其形式为: Dim 数组名() As 类型名 声明多维数组时,可以在括号中加逗号,以表明维数。如要声明二维的动态数组,形式如下: Dim 数组名(, ) As 类型名 在使用动态数组前,必须通过ReDim语句指定数组每维下标的上限,其形式为: ReDim 数组名(下标最大值) 其中,下标最大值可以通过常量给出,也可以通过有了具体值的变量给出。 一个动态数组的示例。在窗体上加入3个按钮,通过单击不同的按钮来改变数组的大小。在窗体加入一个TextBox和3个按钮。
分别为这3个按钮的Click事件编写代码如下: Public Class Form1 Inherits System.Windows.Forms.Form Windows 窗体设计器生成的代码 Dim intA() As Integer Private Sub BtnRD5_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnRD5.Click ReDim intA(5) TxtOutput.Text = "数组上界为" + (intA.GetUpperBound(0)).ToString End Sub Private Sub BtnRD10_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnRD10.Click ReDim intA(10) TxtOutput.Text = "数组上界为" + (intA.GetUpperBound(0)).ToString End Sub Private Sub BtnRD14_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnRD14.Click ReDim intA(14) TxtOutput.Text = "数组上界为" + (intA.GetUpperBound(0)).ToString End Sub End Class 重定义数组的大小
注意:为了使intA在3个按钮的事件处理程序中都可用,将intA的声明放在了3个事件处理程序之外。下标界限也通常用一个变量(有确定值)指定。当变量的值发生变化时,就实现了数组元素个数的变化。例如: Dim intMark( ) As Integer Dim intNo As Integer ....... intNo = Convert.ToInt32(TxtInput.text) ReDim mark(intNo) ....... 在此例中还可以看到,可以多次使用ReDim语句定义同一个动态数组。但是每次使用ReDim语句都会使原来数组中元素的值丢失。如果需要保留数组元素原来的值,应在ReDim后加Preserve参数。
例如: Dim strNames() As String Private Sub BtnStart_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnStart.Click ReDim strNames(2) strNames(0) = "Microsoft" strNames(1) = "IBM" strNames(2) = "SUN" Dim i As Integer For i = 0 To 2 TxtOutput.Text += i.ToString() + ": " + strNames(i) + vbCrLf Next ReDim strNames(3) TxtOutput.Text += "-----------------" + vbCrLf strNames(3) = "HP" For i = 0 To 3 TxtOutput.Text += i.ToString() + ": " + strNames(i) + vbCrLf Next End Sub
ReDim后丢失原数据 原数据未丢失 执行语句ReDim name(3)时,将数组name中各元素原来的值全部丢失,输出结果将变如左上图所示 。当将该程序中的ReDim语言句改为ReDim Preserve name(),再运行该程序,输出结果将变如右上图所示,原数据未丢失。
6.3 数组的基本操作 声明了一个数组后,就可以对其进行各种操作。对数组的操作主要是对数组元素的操作。由于数组元素的下标可以使用变量,和循环语句结合起来使用,可以发挥巨大作用。除对数组元素操作外,还可以通过For Each ....... Next语句对数组进行操作。
6.3.1 数组的引用 对数组的引用→是对其元素的引用。 数组元素的引用方法是:在数组名后面的括号中指定其下标。 数组元素能出现在简单变量可以出现的任何情况下:可以被赋值,可以被打印,可以参加表达式计算。 例如: Dim intAge(3) As Integer intAge (1) = 23 intAge (2) = 2 + intAge (1)
要严格区分数组声明和数组元素。 例如,在下面的程序段中: Dim intA(10) As Integer intA(10) = 24 有两个intA(10),但是Dim语句中的intA(10)是数组声明,表明数组intA中元素的最大下标是10;而intA (10) = 24中的intA (10)是数组intA中下标为10的元素。 在引用数组元素时,数组名、类型、维数和下标的范围必须与数组的声明严格一致。例如: Dim intB(4,5) As Integer 这里,定义了一个二维数组intB,第一维下标的可取值为0,1,2,3和4,第二维下标的可取值为0,1,2,3,4和5,每个元素只能取整型值。在引用该数组元素时,必须严格遵守其声明。如元素引用intB (2, 4)是正确的,但引用intB (5, 3)则是错误的。对于二维及二维以上的多维数组,引用数组元素时,相邻的两个下标之间用逗号隔开。
6.3.2 数组的复制 要将一个数组的诸元素的值复制到另外一个数组的各元素,可以通过循环语句,逐个元素进行赋值。例如: Dim i As Integer Dim j As Integer Dim intA(3, 4) As Integer Dim intB(3, 4) As Integer … '给数组a的各元素赋值 For i = 0 To 3 For j = 0 To 3 intB (i, j) = intA (i, j) Next Next 本例中,进行复制的两个元素具有相同的维数,每维的大小也相同。事实上,通过逐个元素赋值的方法也可以在不同维数、不同大小的数组之间进行复制。而在具有相同大小,相同类型的数组之间赋值(如上例)可以简单的写为 intB = intA 但是如果2个数组在类型和大小上不一致时,应该使用循环逐个元素拷贝。
6.3.3 数组的输出 数组的输出也是逐个元素结合循环语句实现的。 例如:在一个ListBox控件中列出一个2维数组的元素可以这么写: Dim i As Integer Dim j As Integer Dim strBuf AsString Dim intA(3, 4) As Integer For i = 0 To 3 strBuf = "" For j = 0 To 4 intA(i, j) = i + j strBuf = strBuf & " " & intA(i, j) Next j ListBox1.Items.Add(buf) Next i
6.3.4 数组的初始化 数组的初始化就是给数组元素赋初始值。 可以通过赋值语句,逐个元素赋值。此外,还可以在定义数组的时候直接赋值,其格式如下: Dim 数组名( ) As 类型={数组元素值} 例如: Dim intScore() As Integer = {80, 93, 65} Dim strDays() As String = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"} 给数组元素赋初始值时,数组元素的个数等于初始值的个数。下标的下限为0,上限由初值的个数决定。在本例中,下标的下限为0,days数组共有7个元素,所以元素下标的上限为6;score数组元素的个数为3,所以下标的上限为2。
6.3.5 For Each....... Next语句 For Each..... Next语句用于解决循环次数已知的操作,类似For... Next语句,对数组元素处理时,For Each... Next语句更方便。其格式如下: For Each 变量名 In 数组名 循环体 Next 变量名 该语句的功能是对于数组中的每个元素,执行一次循环。每次循环时,变量名所指定的变量取数组中的一个元素值。例如: Dim i As Integer Dim intSum As Integer Dim intA(10) As Integer For i = 1 To 10 a(i) = i * 3 Next For Each i in intA intSum += i Next
6.4 数组的应用 数组是Visual Basic .NET中重要的数据结构,是程序设计课程的重要组成部分,本节通过几个典型例子说明数组的具体应用。
6.4.1选择排序 排序是将一组数按照递增或递减的顺序排列。排序的方法很多,其中最基本的是选择法。 此处介绍选择法排序,其基本思想如下: 对于给定的n个数,从中选出最小(大)的数,与第1个数交换位置,将最小(大)的数置于第1个位置。 对于除第1个数外的剩下的n-1个数,重复步骤1,将次小(大)的数置于第2个位置。 对于剩下的n-2,n-3,…,n-n+2个数用同样的方法,分别将第3个最小(大)数置于第3位置,第4个最小(大)数置于第4位置,…,第n-1个最小(大)数置于第n-1位置。
例如:假定有7个数,7,4,0,6,2,5,1,根据该思想,对其按照递增顺序排列,需要进行6轮选择和交换过程:例如:假定有7个数,7,4,0,6,2,5,1,根据该思想,对其按照递增顺序排列,需要进行6轮选择和交换过程: • 第1轮: 7个数中,最小数是0,与第1个数7交换位置,结果为0 4 7 6 2 5 1 • 第2轮: 剩下的6个数中,最小数是1,与第2个数4交换位置,结果为0 1 7 6 2 5 4 • 第3轮: 剩下的5个数中,最小数是2,与第3个数7交换位置,结果为0 1 2 6 7 5 4 • 第4轮: 剩下的4个数中,最小数是4,与第4个数6交换位置,结果为0 1 2 4 7 5 6 • 第5轮: 剩下的3个数中,最小数是5,与第5个数7交换位置,结果为0 1 2 4 5 7 6 • 第6轮: 剩下的2个数中,最小数是6,与第6个数7交换位置,结果为0 1 2 4 5 6 7
For i = 0 To intNumber - 1 k = i For j = i + 1 To intNumber If intA(j) < intA(k) Then k = j End If Next j intTemp = intA(i) intA(i) = intA(k) intA(k) = intTemp Next i For i = 0 To intNumber TxtOutput.Text += intA(i).ToString() + " " Next i End Sub 新建工程文件Sort,在上面放置一个Button控件和一个TextBox控件。为Button的Click事件编写代码如下: Private Sub BtnStart_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnStart.Click Const intNumber As Integer = 9 Dim i As Integer Dim j As Integer Dim k As Integer Dim intTemp As Integer Dim intA() As Integer = {12, 22, 2, 34, 5, 67, 88, 33, 12, 123} TxtOutput.Text += "排序前:" For i = 0 To intNumber TxtOutput.Text += intA(i).ToString() + " " Next i TxtOutput.Text += vbCrLf TxtOutput.Text += "排序后:"
6.4.2 冒泡排序 冒泡排序是一类依靠“交换”进行排序的方法。 冒泡排序的过程是:首先将第一个数和第二个数进行比较,如果前者较大,则将两个数交换,然后比较第二个数和第三个数的大小。依次类推,直至第n-1个数和第n个数为止。上述过程称为第一趟冒泡排序,其结果是使得最大的数被交换到了最后。然后进行第二趟冒泡排序,对前n-1个记录进行同样的操作,结果将是次大的数被放置到了倒数第二的位置上。依此进行下去,直到排序完成。而判断排序是否结束的条件应该是在一趟冒泡中没有交换(为什么?),而不一定总要进行n-1趟冒泡。一个简单的例子如下: 初始数据: 48 39 67 99 71 55 第一趟排序:39 48 67 71 55 99 第二趟排序:39 48 67 55 71 第三趟排序:39 48 55 67 第四趟排序:39 48 55 具体的代码请同学们课后自行完成。
6.4.3 字符统计 在字符串的统计方面也经常利用数组。 例如,输入一串字符,统计其中的大写字母、小写字母、数字和其他字符的出现次数。如果输入字符串 I am in Grade 5. 统计结果应该为大写字母2、小写字母8、数字1和其它5。 为了统计字符,可以声明具有4个元素的数组,分别用来存放大写字母、小写字母、数字和其它符号的出现次数。在程序中,通过一个TextBox作为字符串的输入,另外一个TextBox作为统计结果的输出。用一个Button按钮来启动程序。在上一例的基础上在添加一个TextBox,Name为TxtInput。为Button的Click事件编写代码如下:
程序使用String对象的属性Chars将字符串拆分为单个的字符。在case语句中,利用符号常量C表示”A” 、”Z”等是字符而不是字符串。运行该程序,并在TextBox1的文本框中输入“I am 6 years old.”,单击按钮,结果如下图所示。 Private Sub BtnStart_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnStart.Click Dim chSub As Char Dim strIn As String Dim i As Integer Dim intCount(3) As Integer Dim strOut() As String = {"大写字母", "小写字母", "数字", "其它"} strIn = TxtInput.Text For i = 0 To strIn.Length - 1 chSub = strIn.Chars(i) Select Case chSub Case "A"C To "Z"C intCount(0) = intCount(0) + 1 Case "a"C To "z"C intCount(1) = intCount(1) + 1 Case "1"C To "9"C intCount(2) = intCount(2) + 1 Case Else intCount(3) = intCount(3) + 1 End Select Next i TxtOutput.Clear() For i = 0 To 3 TxtOutput.Text += strOut(i) + intCount(i).ToString() + vbCrLf Next End Sub
6.4.4 矩阵运算 数学中的矩阵在Visual Basic中用二维数组来实现,下面例子中要进行矩阵的加、乘的运算。使用一个TextBox控件作为结果的输出,用两个Button按钮来完成矩阵的加法和乘法。程序代码如下: Dim sngA(,) As Single = {{23.56, 34.5, 187.45}, {123.56, 789.23, 12.34}, _ {0.877, 3.456, 22.456}} Dim sngB(,) As Single = {{223.56, 314.5, 87.45}, {13.56, 89.23, 122.34}, _ {34.877, 37.456, 122.456}} Const intDimension As Integer = 3 Private Sub BtnAdd_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnAdd.Click Dim i As Integer Dim j As Integer Dim sngC(intDimension, intDimension) As Single For i = 0 To intDimension - 1 For j = 0 To intDimension - 1 sngC(i, j) = sngA(i, j) + sngB(i, j) Next Next
TxtOutput.Clear() For i = 0 To intDimension - 1 For j = 0 To intDimension - 1 TxtOutput.Text += sngC(i, j).ToString() + vbTab Next TxtOutput.Text += vbCrLf Next End Sub Private Sub BtnMulti_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnMulti.Click Dim i As Integer Dim j As Integer Dim k As Integer Dim sngC(intDimension, intDimension) As Single For i = 0 To intDimension - 1 For j = 0 To intDimension - 1 For k = 0 To intDimension - 1 sngC(i, j) += sngA(i, k) * sngB(k, j) Next k Next j Next i TxtOutput.Clear() For i = 0 To intDimension - 1 For j = 0 To intDimension - 1 TxtOutput.Text += sngC(i, j).ToString() + vbTab Next TxtOutput.Text += vbCrLf Next End Sub
6.5 自定义数据类型 在进行有关数据处理方面的程序设计时,常会发现要处理的数据相当复杂。以工资核算程序为例,每个职工的工资单上有姓名、部门、基本工资等项目,在计算这些项目时,可能还要用到职称、职务、工种、参加工作时间等数据。这些数据的类型各异,有的可以用整型数表示、有的只能用浮点类型数据表示,有的用字符串类型表示,有的数据项目本身也比较复杂,如日期本身又有其内部结构。对于像这类各数据项类型不一致的复杂数据,可以采用自定义数据类型来处理。 自定义数据类型必须在模块的声明部分使用Structure语句定义。其语法如下: Structure 类型名 元素名 As 类型名 元素名 As 类型名 … End Structure 定义了类型后,就可以定义该类型的变量了。定义用户自定义类型变量的方法同其他系统数据类型。
例如,定义包含学生学号(no)、姓名(name)、年龄(age)的数据类型Students如下: Structure Students Public strNo As String(7) Public strName As String(8) Public intAge As Integer End Structure 定义了类型Students后,就可以定义该类型的变量了。例如要定义Students类型的变量student1的方式如下: stdntMyStudent As Students 正像使用数组的方式是应用数组的各元素,使用自定义数据类型变量的方式也是分别引用各元素。使用自定义数据类型变量元素的方式是: 变量名.元素名 通常情况下,“变量名.元素名”可以出现在该类型变量能出现的任何场合。例如,要给上面定义的变量stdntMyStuden的元素strNo赋值2003,给strName赋值“李文化”,给intAge赋值21,可以通过以下的程序段来实现: student1.no="2001" student1.name="李文化" student1.age=21
6.6.1 ProgressBar 当执行耗时较多的操作时,可以通过一个ProgressBar(进度条)显示事务处理的进度。ProgressBar 控件通过在水平条中显示适当数目的矩形来指示进程的进度。进程完成时,进度栏被填满。进度栏通常用于帮助用户了解等待一项长时间的进程(例如,加载大文件)完成所需的时间。 ProgressBar 控件的主要属性有: • Value获取或设置进度栏的当前位置。 • Minimum获取或设置控件范围的最小值。此属性指定 Value 属性的下限。当 Minimum 属性的值更改时,将重绘 ProgressBar 控件以反映该控件的新范围。当 Value 属性的值等于 Minimum 属性的值时,进度栏为空。 • Maximum获取或设置控件范围的最大值。此属性指定 Value 属性的上限。当 Maximum 属性的值更改时,将重绘 ProgressBar 控件以反映该控件的新范围。当 Value 属性的值等于 Maximum 属性的值时,进度栏被完全填满。 在加载大文件的例子中,可将最大值设置为以 KB 为单位的文件大小。如果将 Maximum 属性设置为 100,将 Minimum 属性设置为 10,将 Value 属性设置为 50,则将显示 5 个矩形,这是可以显示的矩形个数的一半。
6.6.2 TrackBar TrackBar(滑块) 控件是包含滑块和刻度标记的窗口。它和进度条类似,以可视化的方式向用户提供刻度设置的功能。TrackBar 控件有两部分:滑块和刻度线。滑块是可以调整的部分,其位置由 Value 属性决定。当用户用鼠标拖动滑块、按箭头键、按PAGE UP 或 PAGE DOWN 键时,Value 属性值进行相应地变化。再通过Value 属性值改变其他的系统设置,如控制系统的鼠标速度或光标闪烁频率等。 TrackBar 控件可以在水平方向排列,也可以在垂直方向排列,这由Orientation属性设置的。TrackBar 控件的主要属性有: • Value获取或设置表示滑块在跟踪条控件上的当前位置的数值。Value属性包含表示滑块在跟踪条上的当前位置的数。 • Minimum获取或设置此 TrackBar 使用的范围的下限。 • Maximum获取或设置此 TrackBar 使用的范围的上限。也可使用 SetRange 方法同时设置 Maximum 和 Minimum 属性。 • TickFrequency获取或设置一个值,该值指定控件上绘制的刻度之间的增量。对于 Minimum 和 Maximum 之间有大量值的 TrackBar 而言,绘制出控件上所有值的刻度可能不切实际。例如,如果控件的范围是 100,向其中传入值 5 则会使控件绘制 20 个刻度。在这种情况下,每个刻度表示值范围中的 5 个单元。 • SmallChange获取或设置当滑块短距离移动时对 Value 属性进行增减的值。当用户按箭头键之一时,Value 属性会根据 SmallChange 属性中设置的值发生更改。默认值为 1。 • LargeChange获取或设置一个值,当滚动框长距离移动时向 Value 属性中加上该值或从中减去该值。当用户按 PAGE UP 或 PAGE DOWN 键、或者单击滑块的任一侧时,Value 属性会根据 LargeChange 属性中设置的值更改。默认值为 5。 TrackBar 控件触发的事件主要有两个: Scroll和ValueChanged。前者表示当滑块位置移动时所触发的事件,后者表示当属性Value值改变时所触发的事件。
6.6.3 TabControl • TabControl 显示多个选项卡,这些选项卡类似于档案柜文件夹中的标签。 • 选项卡中可包含图片和其他控件。 • TabControl 控件可用来产生多页对话框。这种对话框出现在 Windows 操作系统中的许多地方,如显示器控制面板中。 • TabControl 控件最重要的属性是 TabPages,它包含单独的选项卡。每个单独的选项卡是一个 TabPage 对象。单击选项卡时,将为相应的 TabPage 对象引发 Click 事件。 • 如果要创建多行选项卡 ,将 TabControl 控件的Multiline 属性设置为 true。 如果选项卡尚未以多行方式显示,则设置 TabControl 控件的 Width 属性,使其比所有的选项卡都窄。 • 如果要在控件一侧排列选项卡,将 TabControl 控件的 Alignment 属性设置为 Left 或 Right。
6.6.4 ProgressBar、TrackBar和TabControl的例子 编写一个程序,根据TrackBar滑块的位置来设置一个时钟控件的间隔。根据时钟间隔的不同,以不同的速率填充ProgressBar。TrackBar和ProgressBar被放置在一个TabControl控件的不同页上。 新建一个项目,取名为TabControl。先在窗体上放置一个TabControl控件。在TabControl的属性窗口中选择TabPages属性,单击该属性设置值的带有一个省略号的按钮。此时,TabPages集合编辑器窗口打开,如下图所示:
单击左边的添加按钮,可以添加一个TabPage。此时右边的窗口显示了新的TabPage的属性。在本例中添加了2个TabPages。分别在右边的窗口中将这两个TabPage的Name属性改为PgProg和PgTrack;将Text属性分别改为ProgressBar和TrackBar。随后在第一个TabPages页上放置一个TrackBar如左下图所示(在TrackBar两边使用了2个Label作为对TrackBar的说明),接下来在第二页上放置一个ProgressBar控件和一个按钮。随后再将一个Timer控件放置在窗体上。如右下图:
设置各个控件的属性如下表: TrackBar控件: ProgressBar控件: Timer 控件 : Button控件: TabControl控件:
TrackBar控件的程序代码如下: Dim intStep As Integer Private Sub TrckbarTimer_ValueChanged(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles TrckbarTimer.ValueChanged Timer.Interval = TrckbarTimer.Value End Sub Private Sub BtnTimer_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles BtnTimer.Click ProgbarTimer.Value = 0 intStep = 0 Timer.Enabled = True End Sub Private Sub Timer_Tick(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Timer.Tick intStep += 5 If intStep <= 100 Then ProgbarTimer.Value = intStep Else ProgbarTimer.Value = 100 Timer.Enabled = False End If End Sub
每当TrackBar的值被改变时会产生ValueChanged的事件。为此事件编写代码,将当前TrackBar的值做为Timer控件的时间间隔。当单击按钮后,将Timer的Enabled属性设置True从而启动时钟。此时按TrackBar所设定的时间产生Tick事件。每次Tick事件产生将ProgressBar的值加5。使用了一个变量intStep来做每次的增加。判断了它的值没有超出范围后,才将它的值赋给了ProgressBar。如果直接在ProgressBar的Value上增加,则一旦超出了ProgressBar的最大值,程序会出错中止。 程序运行结果如右图所示,可见ProgressBar被逐步填满
小结 • 数组的基本概念 • 静态数组和动态数组的用法 • ProgressBar、TrackBar和TabControl控件的使用
作业 P101: 1、6