html5-img
1 / 43

第六章 数组

第六章 数组. 教学目标 掌握数组的基本概念 掌握静态数组和动态数组的用法 熟悉 ProgressBar、TrackBar 和 TabControl 控件. 6.1 静态数组. 一个变量表示一个数据,这种变量称为 简单变量 。 用一个变量表示一组相同性质的数据, — 数组 每个数据称为 数组元素 ,各元素通过下标来区分。 数组必须先声明后使用。在声明数组时,如果数组的大小(包含数据的个数)已经确定,称为 静态数组 ,否则称为 动态数组 。. 6.1.1 一维数组.

eitan
Télécharger la présentation

第六章 数组

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第六章数组 教学目标 掌握数组的基本概念 掌握静态数组和动态数组的用法 熟悉ProgressBar、TrackBar和TabControl控件

  2. 6.1 静态数组 • 一个变量表示一个数据,这种变量称为简单变量。 • 用一个变量表示一组相同性质的数据,—数组 • 每个数据称为数组元素,各元素通过下标来区分。 • 数组必须先声明后使用。在声明数组时,如果数组的大小(包含数据的个数)已经确定,称为静态数组,否则称为动态数组。

  3. 6.1.1 一维数组 用一个下标就能确定数组中的不同元素,这种数组称为一维数组,否则称为多维数组。一维数组声明的格式为: Dim 数组名(最大下标) As 类型名 其中最小下标为0。 Dim语句声明数组为系统提供了一系列信息,如数组名、数组中各元素的类型、数组的维数和各维的大小。 例如,要表示10个学生的成绩,可以声明具有10个元素的数组intScore,其声明如下: Dim intScore(9) As Integer 系统必须为该数组的10个元素分配存储空间,形式如下所示:

  4. 数组需要注意以下几点: • 数组名的命名方法同简单变量,可以是任意合法的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

  5. 6.1.2 多维数组 多维数组声明形式如下: Dim 数组名(最大下标1,最大下标2 [, 最大下标3 ]) As 类型名 其中最大下标的个数决定数组的维数,相邻的两个最大下标之间用逗号隔开。类型名决定每个数组元素的数据类型。例如: Dim a(2, 3) As Single 声明了一个二维数组,第0维下标的取值范围为0~2,第1维下标的取值范围为0~3。每一个元素都是单精度型。声明该数组时,系统要为每一个元素分配一个单精度数据的存储单元,并且各元素的存储单元是连续的,按照行来排列,其排列顺序如表所示:

  6. 数组的元素个数可按下式计算: 数组的元素个数 = (第0维的最大下标 +1)× (第1维的最大下标 + 1) × … 数组声明中的下标规定每一维的大小,表明数组的整体特性,而在其他位置出现的下标表示数组中的不同元素。两者虽然写法相同,但含义不同。例如: Dim c(5) As Integer c(5) = 23 第一行的c(5)表示数组c下标的最大值为5,数组中元素的个数为6。而第二行的c(5)表示下标为5的元素。 要确定数组某一维下标的下界或上界,可以通过数组本身的方法GetLowerBound和GetUpperBound来得到。其形式为: GetLowerBound (维度) GetUpperBound(维度)

  7. 例如: 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。

  8. 6.2 动态数组 动态数组在声明时,不指定数组的维数及下标界限,在使用前通过ReDim语句指定数组的下标界限,所以在程序运行到ReDim语句时才给数组分配存储空间。对于一个动态数组,可以根据用户需求,多次使用ReDim语句来指定数组的下标界限,从而有效利用存储空间。

  9. 使用动态数组 声明动态数组和静态数组的不同之处是不指定数组的下标界限,其形式为: Dim 数组名() As 类型名 声明多维数组时,可以在括号中加逗号,以表明维数。如要声明二维的动态数组,形式如下: Dim 数组名(, ) As 类型名 在使用动态数组前,必须通过ReDim语句指定数组每维下标的上限,其形式为: ReDim 数组名(下标最大值) 其中,下标最大值可以通过常量给出,也可以通过有了具体值的变量给出。 一个动态数组的示例。在窗体上加入3个按钮,通过单击不同的按钮来改变数组的大小。在窗体加入一个TextBox和3个按钮。

  10. 分别为这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 重定义数组的大小

  11. 注意:为了使intA在3个按钮的事件处理程序中都可用,将intA的声明放在了3个事件处理程序之外。下标界限也通常用一个变量(有确定值)指定。当变量的值发生变化时,就实现了数组元素个数的变化。例如: Dim intMark( ) As Integer Dim intNo As Integer ....... intNo = Convert.ToInt32(TxtInput.text) ReDim mark(intNo) ....... 在此例中还可以看到,可以多次使用ReDim语句定义同一个动态数组。但是每次使用ReDim语句都会使原来数组中元素的值丢失。如果需要保留数组元素原来的值,应在ReDim后加Preserve参数。

  12. 例如: 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

  13. ReDim后丢失原数据 原数据未丢失 执行语句ReDim name(3)时,将数组name中各元素原来的值全部丢失,输出结果将变如左上图所示 。当将该程序中的ReDim语言句改为ReDim Preserve name(),再运行该程序,输出结果将变如右上图所示,原数据未丢失。

  14. 6.3 数组的基本操作 声明了一个数组后,就可以对其进行各种操作。对数组的操作主要是对数组元素的操作。由于数组元素的下标可以使用变量,和循环语句结合起来使用,可以发挥巨大作用。除对数组元素操作外,还可以通过For Each ....... Next语句对数组进行操作。

  15. 6.3.1 数组的引用 对数组的引用→是对其元素的引用。   数组元素的引用方法是:在数组名后面的括号中指定其下标。 数组元素能出现在简单变量可以出现的任何情况下:可以被赋值,可以被打印,可以参加表达式计算。 例如: Dim intAge(3) As Integer intAge (1) = 23 intAge (2) = 2 + intAge (1)

  16. 要严格区分数组声明和数组元素。 例如,在下面的程序段中: 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)则是错误的。对于二维及二维以上的多维数组,引用数组元素时,相邻的两个下标之间用逗号隔开。

  17. 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个数组在类型和大小上不一致时,应该使用循环逐个元素拷贝。

  18. 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

  19. 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。

  20. 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

  21. 6.4 数组的应用 数组是Visual Basic .NET中重要的数据结构,是程序设计课程的重要组成部分,本节通过几个典型例子说明数组的具体应用。

  22. 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位置。

  23. 例如:假定有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

  24. 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 += "排序后:"

  25. 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 具体的代码请同学们课后自行完成。

  26. 6.4.3 字符统计 在字符串的统计方面也经常利用数组。 例如,输入一串字符,统计其中的大写字母、小写字母、数字和其他字符的出现次数。如果输入字符串 I am in Grade 5. 统计结果应该为大写字母2、小写字母8、数字1和其它5。 为了统计字符,可以声明具有4个元素的数组,分别用来存放大写字母、小写字母、数字和其它符号的出现次数。在程序中,通过一个TextBox作为字符串的输入,另外一个TextBox作为统计结果的输出。用一个Button按钮来启动程序。在上一例的基础上在添加一个TextBox,Name为TxtInput。为Button的Click事件编写代码如下:

  27. 程序使用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

  28. 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

  29. 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

  30. 6.5 自定义数据类型 在进行有关数据处理方面的程序设计时,常会发现要处理的数据相当复杂。以工资核算程序为例,每个职工的工资单上有姓名、部门、基本工资等项目,在计算这些项目时,可能还要用到职称、职务、工种、参加工作时间等数据。这些数据的类型各异,有的可以用整型数表示、有的只能用浮点类型数据表示,有的用字符串类型表示,有的数据项目本身也比较复杂,如日期本身又有其内部结构。对于像这类各数据项类型不一致的复杂数据,可以采用自定义数据类型来处理。 自定义数据类型必须在模块的声明部分使用Structure语句定义。其语法如下: Structure 类型名 元素名 As 类型名 元素名 As 类型名 … End Structure 定义了类型后,就可以定义该类型的变量了。定义用户自定义类型变量的方法同其他系统数据类型。

  31. 例如,定义包含学生学号(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

  32. 6.6 ProgressBar、TrackBar和TabControl3个控件

  33. 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 个矩形,这是可以显示的矩形个数的一半。

  34. 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值改变时所触发的事件。

  35. 6.6.3 TabControl • TabControl 显示多个选项卡,这些选项卡类似于档案柜文件夹中的标签。 • 选项卡中可包含图片和其他控件。 • TabControl 控件可用来产生多页对话框。这种对话框出现在 Windows 操作系统中的许多地方,如显示器控制面板中。 • TabControl 控件最重要的属性是 TabPages,它包含单独的选项卡。每个单独的选项卡是一个 TabPage 对象。单击选项卡时,将为相应的 TabPage 对象引发 Click 事件。 • 如果要创建多行选项卡 ,将 TabControl 控件的Multiline 属性设置为 true。 如果选项卡尚未以多行方式显示,则设置 TabControl 控件的 Width 属性,使其比所有的选项卡都窄。 • 如果要在控件一侧排列选项卡,将 TabControl 控件的 Alignment 属性设置为 Left 或 Right。

  36. 6.6.4 ProgressBar、TrackBar和TabControl的例子 编写一个程序,根据TrackBar滑块的位置来设置一个时钟控件的间隔。根据时钟间隔的不同,以不同的速率填充ProgressBar。TrackBar和ProgressBar被放置在一个TabControl控件的不同页上。 新建一个项目,取名为TabControl。先在窗体上放置一个TabControl控件。在TabControl的属性窗口中选择TabPages属性,单击该属性设置值的带有一个省略号的按钮。此时,TabPages集合编辑器窗口打开,如下图所示:

  37. TabPages集合编辑器窗口

  38. 单击左边的添加按钮,可以添加一个TabPage。此时右边的窗口显示了新的TabPage的属性。在本例中添加了2个TabPages。分别在右边的窗口中将这两个TabPage的Name属性改为PgProg和PgTrack;将Text属性分别改为ProgressBar和TrackBar。随后在第一个TabPages页上放置一个TrackBar如左下图所示(在TrackBar两边使用了2个Label作为对TrackBar的说明),接下来在第二页上放置一个ProgressBar控件和一个按钮。随后再将一个Timer控件放置在窗体上。如右下图:

  39. 设置各个控件的属性如下表: TrackBar控件: ProgressBar控件: Timer 控件 : Button控件: TabControl控件:

  40. 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

  41. 每当TrackBar的值被改变时会产生ValueChanged的事件。为此事件编写代码,将当前TrackBar的值做为Timer控件的时间间隔。当单击按钮后,将Timer的Enabled属性设置True从而启动时钟。此时按TrackBar所设定的时间产生Tick事件。每次Tick事件产生将ProgressBar的值加5。使用了一个变量intStep来做每次的增加。判断了它的值没有超出范围后,才将它的值赋给了ProgressBar。如果直接在ProgressBar的Value上增加,则一旦超出了ProgressBar的最大值,程序会出错中止。 程序运行结果如右图所示,可见ProgressBar被逐步填满

  42. 小结 • 数组的基本概念 • 静态数组和动态数组的用法 • ProgressBar、TrackBar和TabControl控件的使用

  43. 作业 P101: 1、6

More Related