第2章 数组
第1章介绍了VB的语言基础,对VB的标识符、常量、变量、数据类型等知识已经有所了解,这是VB编程的基础。在VB中,除了上面提到的语言基础之外,还有一种非常重要的VB语言基础——数组,数组是一种存储多个元素的数据结构,数组中每个元素具有相同的数据类型,并且按照一定的顺序排列。数组在编程中主要运用在矩阵运算、表格的输出、数据排序等方面。数组的运用在很大程度上方便了书写过程,但也增加了出错的几率,因此在使用数组的过程中要特别注意,本章就是在这样的基础上介绍数组的相关知识。
2.1 一维数组应用
按照维数,数组可以分为一维数组和多维数组。首先介绍简单的一维数组,顾名思义,这种数组只有一个维,即只有一个下标。本节运用实例来介绍一维数组的应用实例,即对输入的数据序列进行排序。
技术要点
在本实例中主要用到了运用一维数组和For循环语句,主要功能和用法如下:
●一维数组,主要用来存放一系列的数据,存放的数据可以是任意数据类型。使用一维数组之前要先定义该数组。
● For循环语句主要是控制对数组的执行。详细在下面章节介绍。
一维数组的主要语法为:
[Public|Private]数组名(数组大小)As数组中元素类型
其中Public和Private参数主要限定数组的使用范围,如果是Public,说明数组是全局数组;如果是Private,说明数组是局部数组;参数“数组名”,就是对数组的命名,命名规则与标识符的命名规则一样;参数“数组大小”,对于固定数组来说,这个参数要求定义,并且数组大小=数组长度-1,这是因为数组的第一个元素的下标是0,对于动态数组,若参数实现的不确定,就不必设定,只有当确定之后才使用如下语法定义:
ReDim 数组名(数组大小)
数组中的元素类型,表示数组中存储的元素的数据类型,这些数据类型可以是任意的。
说明:对于数组的定义,最常用的是使用Dim语句,具体语法为:
Dim 数组名(数组大小)As数组中元素类型
实现代码
Dim Arr(10)As Integer '定义数组存放输入的数据 Private Sub CmdShow_Click() Dim i As Integer '定义循环变量 For i = 0 To 9 '排序 TxtShow.Text = TxtShow.Text & Arr(9 - i)&"" '显示倒序结果 Next i End Sub Private Sub Form_Load() Dim i As Integer '定义循环变量 For i = 0 To 9 '循环输入排序的数据序列 Arr(i)=I '给数组赋初始值 TxtSource.Text = TxtSource.Text & Arr(i)&"" '显示初始结果 Next i End Sub
单击工具栏中的保存按钮,保存工程,然后单击工具栏中的启动按钮,运行工程,程序的运行结果如图2.1所示。
图2.1 程序运行界面图
单击工具栏中的结束按钮,或者单击运行窗口的关闭按钮,结束程序的运行。
源程序解读
(1)代码首先定义了一个数组名为Arr数组大小为9的一维数组Arr(9),并且数组中的元素类型是整型。
(2)在Form_ Load()事件中,运用For循环语句对数组赋初值,并且由“TxtSource”文本框显示出来。当单击“CmdShow”按钮时,就触发CmdShow_ Click()事件。
(3)在CmdShow_ Click()事件中,同样运用For循环语句执行对数组中元素的倒序操作,并且结果由“TxtShow”文本框显示出来。
2.2 从数组中删除奇数元素
在上一节中简单介绍了一维数组的运用,其中重点介绍了一维数组的定义方式。本节通过一个从数组中删除奇数元素的实例继续介绍一维数组的运用,其中将重点介绍数组的重定义方式。
技术要点
本实例中主要用到的技术是动态数组的定义和数组的重定义。主要功能和用法如下:
●动态数组,顾名思义,是指大小不确定的数组。于是在定义这类数组时不能像定义固定数组那样指明数组的大小。主要使用Dim语句进行声明。
●数组的重定义,就是对数组的重新定义。对于动态数组而言,开始数组的大小不确定,但是一旦在使用之前确定数组的大小,就要对数组使用ReDim语句重新声明。
动态数组定义的具体语法如下:
Dim 数组名()As数组中元素类型
尽管数组大小不确定,但是表示数组大小的“()”不能省略。数组重定义的具体语法为:
ReDim 数组名(数组大小)As数组中元素类型
说明:数组重声明中的的数组名应该与初始声明动态数组时的数组名一样。并且数组的重声明除了对动态数组使用外,还可以对固定数组使用。
实现代码
Dim Arr()As Integer '定义动态数组 Private Sub Form_Load() Dim i As Integer '定义循环变量 ReDim Arr(7)As Integer '重新定义数组 For i = 0 To 7 Arr(i)=I '给数组初始化 TxtS.Text = TxtS.Text & Arr(i)&"" '显示原始数组 Next i For i = 0 To 3 Arr(i)=Arr(2*i) '删除数组中的奇数 TxtShow.Text = TxtShow.Text & Arr(i)& " " '显示最终结果 Next i End Sub
按Ctrl+S组合键保存工程,然后按F5键运行工程。单击启动按钮后,程序的运行结果如图2.2所示。
图2.2 程序运行结果图
源程序解读
(1)代码首先定义动态数组Arr(),数组中元素类型为整型。
(2)在Form_ Load()事件中,对数组重新声明为Arr(7),即定义数组长度为8。
(3)接下来运用For循环语句对数组初始化,并且由“TxtS”文本框显示初始数据。
(4)最后再次运用For循环语句,执行从数组中删除奇数元素的操作,并由“TxtShow”文本框显示最终结果。
2.3 二维数组的应用
本节介绍二维数组的应用实例,即矩阵的乘法,二维数组,顾名思义,有两维,即有两个下标。
技术要点
本实例运用的主要技术是二维数组的定义,框架Frame控件,文本框控件TextBox数组,主要功能和用法如下:
●二维数组的定义,即声明二维数组,一般用来表示矩阵,由两个坐标表示的图表、图形等。主要使用Dim语句进行。
●框架控件Frame一般用来作为其他控件的容器,主要使界面看起来比较整洁,在本实例中,Frame用作文本框控件的容器。
●文本框控件数组,主要是为了表示的方便而采用。
二维数组定义的具体语法为:
Dim 数组名(下标1,下标2)As数组中元素的数据类型
其中,下标1表示二维数组中行的大小,即行长度-1;下标2表示二维数组中列的大小,即列长度-1。
实现代码
Dim ArrM(2,3)As Integer '定义M矩阵 Dim ArrN(3,3)As Integer '定义N矩阵 Dim ArrR(2,3)As Integer '定义结果矩阵 Private Sub Form_Load() Dim i,j,k As Integer '定义循环变量 ArrM(0,0)= 3 '给M矩阵的第1个元素赋值 ArrM(0,1)= 0 '给M矩阵的第2个元素赋值 ArrM(0,2)= 0 '给M矩阵的第3个元素赋值 ArrM(0,3)= 5 '给M矩阵的第4个元素赋值 ArrM(1,0)= 0 '给M矩阵的第5个元素赋值 ArrM(1,1)= -1 '给M矩阵的第6个元素赋值 ArrM(1,2)= 0 '给M矩阵的第7个元素赋值 ArrM(1,3)= 0 '给M矩阵的第8个元素赋值 ArrM(2,0)= 2 '给M矩阵的第9个元素赋值 ArrM(2,1)= 0 '给M矩阵的第10个元素赋值 ArrM(2,2)= 0 '给M矩阵的第11个元素赋值 ArrM(2,3)= 1 '给M矩阵的第12个元素赋值 ArrN(0,0)= 0 '给N矩阵的第1个元素赋值 ArrN(0,1)= 2 '给N矩阵的第2个元素赋值 ArrN(0,2)= 2 '给N矩阵的第3个元素赋值 ArrN(0,3)= 1 '给N矩阵的第4个元素赋值 ArrN(1,0)= 1 '给N矩阵的第5个元素赋值 ArrN(1,1)= 0 '给N矩阵的第6个元素赋值 ArrN(1,2)= 3 '给N矩阵的第7个元素赋值 ArrN(1,3)= 4 '给N矩阵的第8个元素赋值 ArrN(2,0)= -2 '给N矩阵的第9个元素赋值 ArrN(2,1)= 4 '给N矩阵的第10个元素赋值 ArrN(2,2)= -3 '给N矩阵的第11个元素赋值 ArrN(2,3)= 0 '给N矩阵的第12个元素赋值 ArrN(3,0)= 1 '给N矩阵的第13个元素赋值 ArrN(3,1)= 0 '给N矩阵的第14个元素赋值 ArrN(3,2)= -5 '给N矩阵的第15个元素赋值 ArrN(3,3)= 7 '给N矩阵的第16个元素赋值 For i = 0 To 3 TxtM1(i).Text = ArrM(0,i) '显示M矩阵的第一行元素 TxtM2(i).Text = ArrM(1,i) '显示M矩阵的第二行元素 TxtM3(i).Text = ArrM(2,i) '显示M矩阵的第三行元素 TxtN1(i).Text = ArrN(0,i) '显示N矩阵的第一行元素 TxtN2(i).Text = ArrN(1,i) '显示N矩阵的第二行元素 TxtN3(i).Text = ArrN(2,i) '显示N矩阵的第三行元素 TxtN4(i).Text = ArrN(3,i) '显示N矩阵的第四行元素 Next i For i = 0 To 2 For j = 0 To 3 ArrR(i,j)= 0 '初始化结果矩阵 For k = 0 To 3 ArrR(i,j)=ArrR(i,j)+ArrM(i,k)*ArrN(k,j) '计算矩阵乘积 Next k Next j Next i For i = 0 To 3 TxtR1(i)= ArrR(0,i) '显示结果矩阵的第一行 TxtR2(i)= ArrR(1,i) '显示结果矩阵的第二行 TxtR3(i)= ArrR(2,i) '显示结果矩阵的第三行 Next i End Sub
按Ctrl+S快捷键保存工程,然后按F5键运行工程。单击启动按钮后,程序的运行结果如图2.3所示。
图2.3 程序运行结果界面图
源程序解读
(1)代码首先定义了三个二维数组:ArrM(2,3),表示M矩阵;ArrN(3,3),表示N矩阵;ArrR(2,3)表示两个矩阵乘积的结果矩阵。
(2)在Form_ Load()事件中,首先定义三个整型循环变量。然后分别给M矩阵和N矩阵赋初值。接下来分别由“TxtM”文本框数组和“TxtN”文本框数组显示M矩阵和N矩阵的初始值。
(3)代码的重心在于运用三重For循环执行两个矩阵的乘积。三重循环分别由循环变量i,j,k控制,最终计算结果存储在数组ArrR()中,并由“TxtR”文本框数组显示出来。
2.4 Array给数组赋值
本节介绍另外一种给数组赋值的方法——Array函数的应用实例,即给数组赋值。
技术要点
本实例中主要运用的技术是Array函数和DBGrid控件,主要功能和用法如下:
● Array函数,主要对数组进行数据的输入。
● DBGrid控件,是一种快速、便捷访问数据库的控件,在后面数据库处理篇中,将详细介绍此控件。
Array函数的具体语法为:
数组名=Array(数值表)
其中,数值表中的数据就是数组中元素的值,数据之间用逗号隔开,并且这些数据可以具有不同的数据类型,因此,数组声明时不需要定义数组中元素的数据类型,数组中的数据类型由数值表中的数据决定。这时定义数组的方法有如下两种:
Dim 数组名()As Variant Dim 数组名()
另外,由Array函数赋值的数组的下界是0,上界由数值表中的数据个数决定。
说明:Array函数对数组赋值后,在使用数组之前应该根据数值表中数据的个数对数据重新声明,并且Array函数的赋值一般针对一维数组。
实现代码
Private Sub Form_Load() Dim ArrayWidth() '定义每列的宽度值 Dim ArrayTableHead() '定义表头数组 Dim i As Integer '定义循环变量 '设置每一列的宽度值 ArrayWidth = Array("1000","1000","500","500","2000","1000","2000","3000") '给表头赋值 ArrayTableHead = Array("学号","姓名","性别","年龄","籍贯","班级","学校","备注") ReDim Preserve ArrayWidth(7) '重新定义动态数组 ReDim Preserve ArrayTableHead(7) '重新定义动态数组 For i = 0 To 7 MS1.ColWidth(i)= ArrayWidth(i) '设置列宽 MS1.TextMatrix(0,i)= ArrayTableHead(i) '表头赋值 Next MS1.Row = 1 '设置MS1的行数 MS1.Cols = 8 '设置MS1的列数 Adodc1.RecordSource = "select * from Table1" '从数据库中获得表中的数据 Adodc1.Refresh If Adodc1.Recordset.RecordCount > 0 Then Do While Adodc1.Recordset.EOF=False '将记录显示到MS1控件中 MS1.TextMatrix(MS1.Row,0)= Adodc1.Recordset.Fields("学号") MS1.TextMatrix(MS1.Row,1)= Adodc1.Recordset.Fields("姓名") MS1.TextMatrix(MS1.Row,2)= Adodc1.Recordset.Fields("性别") MS1.TextMatrix(MS1.Row,3)= Adodc1.Recordset.Fields("年龄") MS1.TextMatrix(MS1.Row,4)= Adodc1.Recordset.Fields("籍贯") MS1.TextMatrix(MS1.Row,5)= Adodc1.Recordset.Fields("班级") MS1.TextMatrix(MS1.Row,6)= Adodc1.Recordset.Fields("学校") MS1.TextMatrix(MS1.Row,7)= Adodc1.Recordset.Fields("备注") MS1.Row = MS1.Row + 1 '列递增 Adodc1.Recordset.MoveNext '指向下一条记录 Loop End If End Sub
按Ctrl+S组合键保存工程,然后按F5键运行工程。单击启动按钮后,程序的运行结果如图2.4所示。
图2.4 程序运行结果界面图
源程序解读
(1)在Form_ Load()事件中,首先定义两个一维数组ArrayWidth()和ArrayTableHead()。这两个数组的大小和数组中元素的数据类型都不确定。
(2)接下来由Array函数给两个数组赋初值。由此确定两个数组的大小和数组中元素的数据类型。由此可以重新声明两个数组为:ArrayWidth(7)和ArrayTableHead(7)。
(3)最后由已知的数组设置DBGrid控件的列宽和表头,并访问数据库,从数据库中逐条得到记录的信息。
2.5 使用二维数组分析图表数据
在前面几节中提到数组的运用除了矩阵的运算、数据排序外,还有就是对图表的处理。本节介绍一个使用二维数组分析图表数据的例子,从中希望读者能够了解一下图表的知识。
技术要点
本节实例中主要使用的技术是MSChart控件及其ChartData属性和Title属性。主要功能和用法如下:
● MSChart控件是一种Active X控件,主要用来动态显示随机数据和数组,用于所有图表类型。
● MSChart控件的ChartData属性,主要用于设置绘制图表的数据,返回值是一个二维数组。这个属性是绘制图表必须的属性,也是MSChart控件的默认属性。
● MsChart控件的Title属性,用来设置绘制图表的标题,一般情况下,在编程过程中,这个属性要求被提供,但是对于图表含义不要求明确给出时,可以省略。
实现代码
Private Sub Form_Load() Dim ArrSale(7,1) '定义二维数组 ArrSale(0,0)= "一月" '给数组的第一列赋值 ArrSale(1,0)= "二月" '给数组的第一列第一个元素赋值为"二月" ArrSale(2,0)= "三月" '给数组的第一列第二个元素赋值为"三月" ArrSale(3,0)= "四月" '给数组的第一列第三个元素赋值为"四月" ArrSale(4,0)= "五月" '给数组的第一列第四个元素赋值为"五月" ArrSale(5,0)= "六月" '给数组的第一列第五个元素赋值为"六月" ArrSale(6,0)= "七月" '给数组的第一列第六个元素赋值为"七月" ArrSale(7,0)="八月" '给数组的第一列第七个元素赋值为"八月" ArrSale(0,1)= 82000 '给数组的第二列赋值 ArrSale(1,1)= 45000 '给数组的第二列第一个元素赋值为"45000" ArrSale(2,1)= 12800 '给数组的第二列第一个元素赋值为"12800" ArrSale(3,1)= 32000 '给数组的第二列第一个元素赋值为"32000" ArrSale(4,1)= 20000 '给数组的第二列第一个元素赋值为"20000" ArrSale(5,1)= 66800 '给数组的第二列第一个元素赋值为"66800" ArrSale(6,1)= 65000 '给数组的第二列第一个元素赋值为"65000" ArrSale(7,1)= 78023 '给数组的第二列第一个元素赋值为"78023" MSChart1.ChartData = ArrSale '给图表赋值,分析销售额 MSChart1.Title = "一片天公司2008年八个月的销售额分析(单位:万元)" '给图表添加标题 End Sub
按Ctrl+S组合键保存工程,然后按F5键运行工程。单击启动按钮后,程序的运行结果如图2.5所示。
图2.5 程序运行结果图
源程序解读
(1)在Form_ Load()事件中,首先定义一个二维数组ArrSale(7,1),该数组中元素的数据类型不确定,即是Variant类型。
(2)接下来分别给二维数组的第一列和第二列赋值,由赋值的情况可以看出,第一列中元素的数据类型是字符串型,第二列中元素的数据类型是整型。
(3)最后把二维数组的值赋值给MSChart控件的ChartData属性,获得绘制图表的数据。运用MSChart控件的Title属性给绘制成的图表命名。
2.6 利用控件数组设置形状控件属性的实例
在上一节中,分别介绍了一维和二维数组的运用实例,除此之外,在有的实例中还用到了控件数组,即由一些类型相同功能相近的控件组成的数组,与数组变量一样,这些数组具有相同的名称,通过下标区别控件数组中的元素。在编程过程中,使用控件数组可以节省系统内部资源,增加程序的可读性。
技术要点
本实例中使用的主要技术是按钮控件CommandButton数组及Click事件,形状控件Shape数组和标签控件Label数组。
按钮控件数组、形状控件数组和标签控件数组都使用了控件数组,所以,可以统一介绍,运用控件数组首先要了解控件数组的创建方法,创建控件数组的方式大致有如下三种:
●与数组变量的定义类似,在代码中给控件定义相同的控件名称。
●最简单的一种是在对象窗口中直接对要创建数组的控件进行复制、粘贴。
●最后一种是在控件的属性窗口中把Index属性的值设置为非Null数值。
创建控件数组之后就是控件数组的运用,运用控件数组一般使用For循环语句,根据控件数组的下标,即Index属性分别对控件数组中的元素赋值。但是有时需要使用Select Case语句,如本例中的按钮控件。
按钮控件数组的Click事件,即CmdArray_ Click(Index As Integer),可以看出此处Click事件后面附加有参数 Index,这就是按钮控件数组的下标,在本事件中,就使用了 Select Case语句,根据参数Index视不同情况执行不同的操作,执行操作的类别由Index的数值决定,在本实例中,Index有五种取值方式,分别为:0,执行对图形形状的设置;1,执行对图形颜色的设置;2,执行对图形填充形状的设置;3,执行对图形边框形状的设置;4,执行退出窗体的操作。
实现代码
Private Sub CmdArray_Click(Index As Integer) Select Case Index Case 0 For i = 0 To 5 Shape1(i).BorderStyle = I '设置Shape的BorderStyle属性 Label2(i).Caption = "BorderStyle=" &Str$(i) '显示设置属性值 Next i Case 1 For i = 0 To 5 Shape1(i).FillStyle = 1 '设置Shape的FillStyle属性 Shape1(i).BackStyle = 1 '设置Shape的BackStyle属性 Shape1(i).BackColor = QBColor(i) '设置Shape的BackColor属性 Label2(i).Caption = "BackColor=" & Str$(i) '显示设置属性值 Next i Case 2 For i = 0 To 5 Shape1(i).FillStyle = i + 2 '设置Shape的FillStyle属性 Label2(i).Caption = "FillStyle=" & Str$(i + 2) '显示设置属性值 Next i Case 3 For i = 0 To 5 Shape1(i).Shape = i '设置Shape的Shape属性 Label2(i).Caption = "Shape=" & Str$(i) '显示设置属性值 Next i Case 4 Unload Me '退出系统 End Select End Sub
按Ctrl+S组合键保存工程,然后按F5键运行工程。当单击形状设置按钮时,程序运行结果如图2.6所示。当单击“颜色设置”按钮时,程序运行结果如图2.7所示。
图2.6 形状设置界面图
图2.7 颜色设置界面图
源程序解读
(1)运行工程,出现初始界面。这时当鼠标单击按钮控件数组CmdArray()时,触发CmdArray_ Click(Index As Integer)事件。在该事件中,运用Select Case语句,根据参数Index的数值,分别执行对形状图形的操作。
(2)当单击“形状设置”按钮时,Index=0,这时通过Shape数组的BorderStyle属性设置图形的形状。当单击“颜色设置”按钮时,Index=1,这时通过Shape数组的BackColor属性设置图形的颜色。当单击“填充线条设置”按钮时,Index=2,这时通过Shape数组的FillStyle属性设置图形的填充形状。当单击“边框形状设置”按钮时,Index=3,这时通过Shape数组的Shape属性设置图形的边框形状。当单击“退出系统”按钮时,Index=4,这时退出窗体。
(3)在执行图形属性设置的同时,使用“Label”标签控件数组,在图形的下面,显示设置属性的类别和设置的属性值。这个功能主要通过Label的Caption属性实现。
2.7 利用控件数组控制按钮的增减
在上一节中介绍了控件数组的使用,主要介绍了控件数组的创建和运用方法,为了使得读者对控件数组有更深入的理解,本节接着介绍控件数组的运用实例,即控件数组的动态创建。
技术要点
本节使用的主要技术是单选按钮Option控件数组和工具栏ToolBar控件,主要功能和用法如下:
●单选按钮Option控件,指的是多种选项同时存在时,一次只能选择一个选项,执行一种操作,单选按钮数组就是多个单选按钮使用相同的名称,只是下标是不同的组合。在本实例中,单选按钮控件数组都使用 Option1 这个名称,最大的下标是5。
●工具栏ToolBar控件,顾名思义,主要用来在窗体上创建工具栏,该控件中包含创建工具栏的ToolBarButton对象的集合,该控件是Active X的一种。
实现代码
Private Sub Option1_Click(Index As Integer) Shape1.Shape = Index '设置形状控件的形状 LabShow.Caption = "Shape=" & Inde '显示形状类型 End Sub Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button) Static IndexNum As Integer '定义单选按钮的个数 Select Case Button Case"增加单选按钮" '增加单选按钮 IndexNum = IndexNum + 1 '单选按钮的数目增1 If IndexNum > 5 Then IndexNum = 5 '限定单选按钮的数目为5 Exit Sub End If Load Option1(IndexNum) '建立新的控件数组元素 Option1(IndexNum).Top=Option1(IndexNum-1).Top+360 '指定控件位置 Option1(IndexNum).Caption="Option("&IndexNum&")" '指定选项按钮控件的Caption属性 Option1(IndexNum).Visible = True '使选项按钮可见 Case"删除单选按钮" '卸载单选按钮 If IndexNum > 0 Then Unload Option1(IndexNum) IndexNum = IndexNum - 1 '单选按钮的数目减1 End If End Select End Sub
按Ctrl+S组合键保存工程,然后按F5键运行工程。当单击单选按钮“Option(0)”时,程序的运行结果如图2.8所示。当单击“增加单选按钮”按钮并单击单选按钮“Option(2)”时,程序的运行结果如图2.9所示。当单击单选按钮“Option(5)”时,程序的运行结果如图2.10所示。当单击“删除单选按钮”按钮时,程序的运行结果如图2.11所示。
图2.8 单个单选按钮的界面图
图2.9 增加4个并选中第三个单选按钮的界面图
图2.10 增加5个并选中第六个单选按钮的界面图
图2.11 删除第六个单选按钮的界面图
源程序解读
(1)在“Toolbar1”工具栏的Click事件,即Toolbar1_ ButtonClick(ByVal Button As MSComctlLib.Button)中,首先定义整型变量IndexNum,表示单选按钮的个数。然后运用Select Case语句,根据参数Button的值,分别执行增加单选按钮和删除单选按钮的操作。
(2)当单击按钮“增加单选按钮”时,就执行Case "增加单选按钮"对应的语句体。首先让IndexNum加1,即单选按钮的数目加1。接着使用If语句判断IndexNum的大小是否超过5,若超过,仍然让IndexNum=5,并退出过程;否则,使用Load语句加载一个单选按钮,同时设置单选按钮的属性。
(3)当单击按钮“删除单选按钮”时,执行Case "删除单选按钮"对应的语句体。判断IndexNum的大小是否大于0,即单选按钮是否全部被删除。如果大于0,则使用Unload语句卸载单选按钮,并把IndexNum减1。
说明:Toolbar1_ ButtonClick(ByVal Button As MSComctlLib.Button)中参数Button的数据类型是按钮对象类型。