《【教学课件】第四章程序设计.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第四章程序设计.ppt(31页珍藏版)》请在三一办公上搜索。
1、第四章 程序设计,Vb是通过工程来管理构成应用程序的所有不同文件,vb的代码存储在不同的模块文件中。,一、文件类型,1、工程文件(.vbp)包含组成应用程序的所有窗体文件(.frm)、模块文件(.bas)和其他文件,也有环境设置选项方面的信息。(1)打开和保存工程:选择“文件”菜单中的“打开”或“保存”(2)生成exe文件:当设计和调试好工程的全部文件之后,即可将此工程编译成可执行文件(.exe),选择“文件”中的“生成exe”命令来实现,(3)设置工程属性,选择“工程”菜单中的“工程属性”命令,在弹出的对话框中设置相关项启动对象:运行时最先启动的窗体,或者使用Sub Main工程类型:设置工
2、程类型,一般为“标准.exe”工程名:设置工程名称帮助文件名:与工程相关的Help文件名工程帮助上下文ID:在“对象浏览器”中选定“?”按钮是调用的“帮助”主题的上下文标识符工程描述:工程的外部名,显示在“引用”和“对象浏览器”对话框里,(4)添加/删除工程,添加新工程:单击工具栏中的“添加工程”按钮或从“文件”菜单中选择“添加工程”命令添加现有工程:选择“文件”中的“添加工程”命令,然后选择要添加的工程文件删除工程:选中要删除的工程文件,然后选择“文件”中的“删除工程”命令或在“工程资源管理器”中线选中该文件右击,在弹出的菜单中选择“移除”命令,2、窗体文件,窗体文件(.frm)包含窗体、控
3、件的描述和属性设置,也含有窗体级的常数、变量、外部过程的声明,事件过程和一般过程。如果没有frm窗体文件,则表示没有用户界面。3、窗体的二进制文件数据(.frx)含有窗体上控件的二进制属性数据。这些文件是在创建窗体时自动产生的。4、标准模块文件标准模块文件(.bas)用于存放在几个窗体中都需要用的公共代码,包含常数、类型、变量和过程的声明,以及过程代码。,二、过程,将较复杂的程序分割成较小的逻辑部件,这些部件称为过程。每个过程编写一段程序。一个过程可以被另一个过程调用,用这些过程可以构成一个完整、复杂的应用程序。将一个问题分解成若干个过程编写、调用,可以极大地简化程序设计任务在VB中一般有两种
4、过程:子程序过程和函数过程;前一种无返回值,后一种有返回值,1、sub过程,Sub过程可以存放在标准模块和窗体模块中。VB中有两种sub过程,即事件过程和通用过程。过程定义语句如下:Private Public Static Sub(参数列表)局部变量和常数声明语句块End SubSub和EndSub之间的语句块是每次调用过程执行的部分,(1)事件过程,VB是事件驱动的,所谓事件是能被对象(窗体和控件)识别的动作。如对象的事件有单击(Click)、双击(DblClick)、内容改变(Change)和定时事件(Timer)等。为一个事件所编写的程序代码称为事件过程。当VB中对象的某个事件发生时,
5、该事件所对应的过程代码就被执行。事件过程有两种:窗体事件和控件事件过程窗体事件过程:Private Sub Form_事件名(参数列表)局部变量和常数声明语句块End Sub 如果正在使用MDI窗体,则事件过程定义为MDIForm_事件名,(2)控件事件过程Private Sub 控件名_事件名(参数列表)局部变量和常数声明语句块End Sub(3)创建事件过程在VB中,不同的对象会响应特定的事件。用户为特定事件编写代码只能在对应的窗口内进行。打开代码编辑器窗口的方法:双击对象用鼠标选中对象,按F7用鼠标选中对象,在选择“视图”中的“代码窗口”在工程资源管理器窗口中选中对象所在的窗体后右击,在
6、弹出的菜单中选择“查看代码”,2、通用过程,当几个不同的事件过程要完成一个为相同的功能时,为避免重复编写代码,可以采用通用过程来实现该功能,然后有需要的事件过程来调用该通用过程。通用过程可以保存在模块中:窗体模块(.frm)和标准模块(.bas)。一个通用过程一般不和用户界面中的对象联系,通用过程直到被调用时才起作用,因此事件过程是必要的,但通用过程不是必要的,只是为了方便和简洁而单独建立的。(1)定义的格式Private|Public static Sub 过程名 参数列表局部变量和常数声明 声明在过程中定义的变量和常数。可用dim等语句声明语句块Exit Sub语句块End Sub其中:P
7、rivate|Public:局部的(私有的)|全局的(通用的);系统默认是Publicstatic局部静态变量。“静态”是指在调用结束后仍保留Sub过程的变量值。Static对于在Sub外声明的变量不会产生影响,即使过程中也使用了这些变量名。过程名:与变量命名规则相同。在同一模块中,同一名称不能既用于Sub过程中,又用于Function中。注意的是:无论有无参数,过程后面的()都不可省略。,Exit Sub:立即从Sub过程中退出,程序接着从调用该Sub过程语句的下一句继续执行。在Sub过程的任何位置都可以用Exit Sub语句。语句块:用于描述过程的操作,称为子程序体或过程体。End Sub
8、:当执行该语句时,退出该过程,并立即返回到调用处继续执行调用语句的下一句。Sub过程不能嵌套定义,即不能在别的Sub、Function等过程中定义Sub过程。但可以嵌套调用。参数列表:类似于变量声明,列出了从调用过程传递来的参数值,称为形式参数(简称形参),多个形参之间用逗号间隔。格式如下:ByVal(ByRef)变量名 As 数据类型,(2)通用过程的建立,建立的方法有两种:a.打开“代码编辑器”窗口,选择“工具”中的“添加过程”;然后再打开的对话框中键入过程的名称,选择“子程序”,并根据需要选择“公有的”或“私有的”b.打开“代码编辑器”窗口,选择“对象列表框”中的“通用”;然后在文本编辑
9、区中键入过程代码,例:在计算器窗口中添加8个按钮(当选择“编辑”菜单中的“科学型”后展开),分别实现相应的功能。例如在文本框中输入的数据是0,则单击1/x按钮时应弹出出错警告。首先定义一个“警告”过程:Public Sub 警告()y=MsgBox(数据有误!,vbOKOnly,警告信息)End Sub其次,在单击“1/x”按钮对应的程序代码如下:If Text1.Text=0 Then Call 警告 Else Text2.Text=Str(Int(qq1(Val(Text1.Text)*100)/100)End If,3、Function过程,通过Function过程,用户可以自己定义函数
10、。格式:Private|Public static Sub 过程名 参数列表 As 数据类型 语句块函数名=表达式End Function与Sub过程一样,Function过程也是一个独立的过程,但不同的是Function过程可返回一个直到调用的过程。其中:As 数据类型:函数返回值的数据类型,与变量一样,如果没有该子句,默认的数据类型是Variant。语句块:是描述过程的操作,称为子函数体或函数体。函数名=表达式:在函数体中用该语句给函数赋值。语句块中可使用Exit Function语句,使之从函数过程中退出。但需要注意函数一定赋值,否则会出错。和Sub过程一样,Function过程不能嵌套
11、定义,但可以嵌套调用。函数过程与通用过程的定义可以在窗体中定义,也可以放在模块中。,三、过程的调用,1、调用Sub事件过程调用Sub过程是一个独立的语句。两种方法:用call语句、直接用Sub过程名。Call 过程名(参数列表)或者:过程名参数列表其中:参数列表:在调用语句中的参数称为实在参数(简称实参)。实参可以是变量、常熟、数组和表达式。使用Call语句调用时,参数必须在括号内,当被调用过程没有参数时,()也可省略;使用过程名调用时,必须省略参数两边的()。,2、调用Sub通用过程,调用Sub通用过程的语法与调用Sub的事件过层。不同的是,通用过程只有被调用时才起作用,否则不会被执行。例如
12、前面的例题的调用和定义的过程如下:Private Sub Command_Click()Call 警告 End SubPublic Sub 警告()MsgBox 警告信息,数据有误!”或用输出函数:y=msgbox(“数据有误”,vbokonly,“警告信息!”)End Sub,3、调用Function过程,调用函数Function过程的方法与调用内部函数的方法一样。在语句中直接使用函数名,Function过程可返回一个值。格式:变量=Function函数名(参数列表)或与调用Sub一样用:call 过程名(参数列表)或过程名参数列表注意:调用Function过程与调用Sub过程不同,当无参数
13、时,()不能省略。,例:在计算器窗口中添加8个按钮(当选择“编辑”菜单中的“科学型”后展开),分别实现相应的功能。对于圆面积等可以定义一个函数,使用时调用该函数;N!也可以定义一个函数,然后单击“n!”按钮则调用这个函数,例:建立一个自定义函数,函数名为max,函数的数据类型为single,函数的两个参数是:单精度数a和b,返回值为两个数中的最大的。创建如下图所示的界面,形参a和b的值由text1和text2的输入值来确定。求出的结果显示在Label1中。Private Function max(a As Single,b As Single)As SingleIf a=b Then max=
14、aElse max=bEnd IfEnd Function按钮“求最大数”的代码如下:Private Sub Command1_Click()Label3.Caption=max(Val(Text1.Text),Val(Text2.Text)End Sub,四、参数的传递,参数是在本过程有效的局部变量,用于传递数据。参数传递有两种:按值传递和按地址传递。1、形参和实参形参:出现在Sub和Function过程中的。在过程被调用之前,形参并未被分配内存,只是说明形参的类型和在过程中的作用。实参:是在调用中实际使用的参数。注意:形参和实参列表中对应变量名可以不同,但实参和形参的个数、顺序以及数据类型
15、必须相同。形参的类型:创建中如果没有声明形参的数据类型,则默认为Variant型。当实参数据类型与形参定义的不一样时,VB会按要求对实参进行数据类型转换,然后将转换至传递给形参。,2、参数按值传递和按地址传递,按值传递参数按值传递参数时使用ByVal关键字。按值传递参数时,VB给传递的形参分配一个临时内存单元,将实参的值传递到这个临时单元中。实参向形参传递是单向的,如果被调用的过程中改变了形参值,则临时单元的值变动,不会影响实参变量本身。按地址传递参数在定义过程中,如果没有ByVal关键字,默认的是按地址传递参数,或者用ByRef关键字指定地址传递。按地址传递参数,是把形参变量的内存地址传递给
16、被调用过程,形参和实参具有相同的地址,即形参和实参共享同一段存储单元。因此,在被调用过程中改变形参的值,则实参的值也被改变,也就是说,与按值传递参数不同,按地址传递参数可以在被调用过程中改变实参的值。此外,还有数组参数和对象参数,我们不再细述。,3、递归调用,递归调用:是指在过程中直接或间接地调用过程本身。如前面的例题中。我们定义的函数(n!)就是一个递归调用。对于单击“n-1!”按钮就是求1-n之间的阶乘和,即1!+2!+(n-1)!+n!,五、变量和过程的作用范围,1、变量的作用范围变量的作用范围是指变量发挥作用的有效范围。根据定义变量的位置和定义变量的语句的不同,在VB中变量可分为过程及
17、变量、模块级变量和全局变量。(1)过程级变量:只在声明它们的过程中才有效,成为局部变量。用户无法在其他过程中访问或改变该类变量的值。用dim或Static来声明(2)模块级变量:按照默认规定,模块级变量对该模块的所有过程都有效,在模块中的任何过程都可以访问该变量,但其他模块的过程则不可用。定义的方法是:在窗体模块和标准模块的顶部用Dim或Private声明模块级变量,(3)全局变量,全局变量的作用范围是应用程序的所有过程,也称为公用变量。全局变量可以用模块顶部的声明段Public关键字声明模块级变量。格式:Public 变量名 As 数据类型通过选择“工程”来添加模块,然后在添加的标准模块(M
18、odule1)的顶部声明全局变量2、静态变量变量除了使用范围外,还有存活期,也就是变量能够保持其值的时期。模块级变量和全局变量的存活期是整个应用程序的运行期间。对于过程中用Dim声明的局部变量仅当本过程执行期间存在,当一个过程执行完毕,它的局部变量的值就不存在了。当下一次执行该过程时,所有的局部变量将重新初始化。静态变量是在过程结束后仍保留变量的值,即其占用的内存单元未释放。方法:在过程中用static来定义。,3、使用同名的变量,在不同的范围内应用程序可能会使用多个同名的变量,这样会有同名的变量有效。(1)不同模块中的全局变量同名,则通过引用:模块名.变量名(2)全局变量与局部变量同名当全局
19、变量与局部变量同名时,全局变量和局部变量在不同的范围内有效。在过程内局部变量有效,而在过程外全局变量有效。(3)窗体的属性、控件名与变量同名窗体的属性、控件、符号常数和过程都被视为窗体中的模块级变量。窗体属性名、控件名与模块级变量、常数和过程名相同是不合法的,应为它们的作用范围相同。因此,在窗体模块中应尽量使变量名和窗体中的控件名不一样,养成对不同的变量使用不同的名称的编程习惯。,六、在VB程序中使用MicrosoftOffice所提供的对象,我们在word和excel中使用的“宏”就是使用内嵌的VB。VBA是Visual Basic Applicationd的缩写。参见书上105113之间的
20、内容。,七、创建图形,当设计用户界面时需要创建线条、图形等时,可以利用标准控件中的“线条、图形”,以满足用户的特殊需求。1、坐标系在VB中,添加控件时要确定控件的位置,通过Top和Left两个属性值来确定控件的位置。其中:Top是指该控件距离窗体上边沿的长度,而Left是指该控件距离窗体左边沿的长度。在绘图时,更是需要坐标系来确定线条或图形在界面中的位置。在VB环境中的坐标系,坐标轴的刻度单位为缇(Twip),一缇等于二十分之一磅,567缇等于一厘米。,(1)设置刻度:ScaleMode属性进行设置,来改变坐标系的刻度。(2)ScaleLeft属性和ScaleTop属性:系统默认的坐标原点都到
21、是容器的左上角定点。X轴,方向向右;Y轴,方向向下。利用X轴和Y轴可以重新设置坐标系的原点在容器中的位置,从而实现新坐标系的定义。(3)ScaleWidth属性和ScaleHeight属性:可以重新设置容器的宽度和高度,也可以通过这两个属性来获取容器中的宽度和高度值。(4)CurrentX属性和CurrentY属性:可以设置当前位置的横坐标和纵坐标,该坐标即成为下次绘图时的起点坐标位置,当然通过这两个属性值获得当前位置的横、纵坐标。其他参见书114117页的相关内容。,2、Line控件和Shape控件,Line控件:可以画出各种宽度、长度和样式的线。Shape控件:画出长方形、正方形、圆等多种
22、图形。(1)Line控件:是标准控件,主要的属性见书117页的表6-5。(2)Shape控件:是标准控件,利用该控件可以绘制出6种不同的图形,可做为容器控件。绘制图形时,先绘制然后通过Shape属性来选择需要的图形。相关的属性见书118页的图6-26和表6-6。如果要绘制多个图形,可先添加“图片框”控件,然后将其作为容器,再把需要的图形绘制在图片容器中。,(3)在PictureBox控件中作图与绘图相关的常用方法有:Cls:清除图形和Print输出文本Pset:给指定的点着色Point:返回指定点的颜色Line:画直线Circle:画圆、椭圆、画弧说明:Picture1.Cls:将Pictur
23、e1中的图形和文本清除掉。Picture1.Pset(x1,y1),color:在Picture1中给(x1,y1)点按color着色。Picture1.Line(x1,y1)-(x2,y2),color:在Picture1中画直线从(x1,y1)到(x2,y2)并按color着色。Picture1.Circle(x1,y1),radius,color:在Picture1中画圆,半径为Radius,并按color着色。Picture1.Circle(x1,y1),radius,color,start,end:在Picture1中画圆弧,半径为Radius,并按color着色,从start开始到end终止。有关的例题看书119页122页。,小结,过程和函数定义的方法,过程是没有数值返回,而函数有数值返回。过程的调用方法:call 过程名(参数表)函数的调用方法:变量名=函数名(参数表)或call 函数名形参和实参变量的作用域:作用的范围Line和Shape控件,