第9章更复杂的工程(时间:4次课,8学时)第9章更复杂的工程教学提示:在本章以前,介绍的工程只含有一个窗体。本章将介绍含有多个窗体的工程,在一个工程中还可以含有标准模块和公用过程。在学习中要注意多窗体的切换和VisualBasic工程结构、公用过程的定义和调用与变量的作用域。教学目标:掌握Show方法和Hide方法;掌握Sub过程和Function过程的编写与调用;掌握哑实结合按值传送和按址传送的区别;掌握标准模块的定义和使用方法。第9章更复杂的工程9.1公用过程9.2多窗体9.3多窗体与公用过程、标准模块9.4综合运用公用过程在前面章节中,曾经使用过事件过程的调用。如例8.1中,Command1_Click过程调用Combo1_DblClick事件过程,这样减少了程序代码。在程序设计中,有些数据处理的操作是相同的,在程序中把要进行同类的操作的代码独立出来,供其他程序使用。我们把这种公用的,完成某一特定功能的程序设计成可供其他程序调用的、独立的程序段,称为公用过程,也称为子程序。公用过程9.1.1属于窗体的子程序公用过程9.1.2属于窗体的函数公用过程9.1.3参数的传送9.1.4函数过程的使用9.1.5参数的传送属于窗体的子程序公用过程例9.1绘制带中心轴的小圆设计一个窗体,在窗体上添加两个命令按钮。运行程序时,单击【开始】在窗体不同位置绘制4个带中心轴的小圆,单击【退出】结束程序的执行。子程序公用过程的使用1.子程序公用过程的格式因Sub过程常被其他事件过程调用,也称它为公用过程或子程序过程。与事件过程不同的是:子程序过程必须由其他过程调用,它用来完成特定的任务,子程序过程由用户创建。子程序过程可以建立在窗体或标准模块中。Sub子程序过程的一般格式为:[Private|Public][Static]Sub过程名([形参表])语句序列[ExitSub]EndSub形参表用于声明形参的名称、个数、位置和类型。形参表的格式如下。[ByVal]变量名[()][AS类型][,[ByVal]变量名[()][AS类型]]…形参在子程序被调用前没有具体的数值,它的命名规则和普通变量一样。形参不能是常数、表达式和数组元素,但可以是数组名。建立公用过程的步骤(1)打开要添加过程的代码编辑窗口。(2)选择【工具】下拉菜单中的【添加过程】命令,打开【添加过程】对话框,如图9.2所示。(3)在对话框中输入过程名,选择过程类型、范围和是否使用Static说明过程。(4)单击【确定】按钮,返回【代码编辑】窗口。在【代码编辑】窗口出现了过程的首尾语句。在Sub语句中加入形参,在Sub与EndSub之间键入本过程要执行的代码。调用子程序过程的方法调用本模块的过程有两种方法,分别是使用Call语句调用和直接使用过程名调用。使用Call语句Call过程名([实参表])直接使用过程名过程名[实参表]两种调用方法的区别在于,使用Call语句时,实参表必须用括号括起来;直接使用过程名时,实参表不要用括号括起来。事件过程:CallP1(A,B,C)::PrivateSubP1(A,B,C)语句序列[ExitSub]EndSub程序中凡是要执行子程序的地方都可以写上调用子程序的语句。调用要求实参与形参一一对应。实参允许是常数、变量名、数组元素、数组名和任意算术表达式或逻辑表达式,但必须注意,实参和形参的个数应该相同,它们之间的类型、位置必须一一对应。实参和形参之间数据的传递是依据它们排列的位置实现的,而不是用名字相同来实现,即它们之间数据的传递与名字本身无关。子程序的形参如果是数组名,则与之相应的实参也必须是数组名。实参与形参之间的这种数据传递通常称为虚实结合。属于窗体的函数公用过程例9.2计算四边型的面积设计一个窗体,在窗体上添加两个命令按钮。运行程序时,单击【计算】在窗体输出已知四边长和一条对角线长的四边型面积,单击【退出】结束程序的执行。函数过程的使用1.定义函数过程函数过程可以建立在窗体或标准模块中。函数过程的一般格式为:[Private|Public][Static]Function函数名([形参表])[As类型]语句序列[ExitFunction][函数名=表达式]EndFunction函数过程格式中各关键字的含义同子程序过程。调用函数过程调用自定义函数过程与调用内部函数的方法一样:在表达式中写上函数过程的名字,并给出相应的实参。参数的传送过程是独立的程序段,过程中虚拟参数在调用时才能确定,因此过程与调用程序之间需要传送数据。过程与过程外部的数据通讯有两种方式:通过窗体级变量或全程变量;通过参数的哑实结合实现数据传送。用哑实结合的方式,实现调用程序和被调用过程之间的数据传送,有两种方式:按值传送和按址传送。按值传送,在调用语句中的实际参数是常量或表达式,或者当要求变量按值传送时,可以把变量用括号括起来,使之成为一个表达式。在过程的定义语句中使用Byval关键字指定形式参数,也表示按值传送参数。按地址传送,Call语句中的实际参数为变量名,与实际参数对应的形式参数也没有用关键字Byval指定,表示是按地址传送参数。另外,当实际参数和对应的形式参数都是数组时,也是按地址传送参数。例如,下面程序OptionExplicitSubbubian(ByValaAsString,bAsInteger)a=VB&a:b=b+1Print调用时a是:;a,调用时b是:;bEndSubPrivateSubform_Click()DimaAsString,bAsIntegera=程序设计Print调用前a是:;a,调用前b是:;bCallbubian(a,(b))Print调用后a是:;a,调用后b是:;bEndSub运行时,窗体输出是:调用前a是:程序设计调用前b是:0调用时a是:VB程序设计调用时b是:1调用后a是:程序设计调用后b是:0(aAsString,bAsInteger)a=VB&a:b=b+1Print调用时a是:;a,调用时b是:;bEndSubPrivateSubform_Click()DimaAsString,bAsIntegera=程序设计Print调用前a是:;a,调用前b是:;bCallbubian(a,b)Print调用后a是:;a,调用后b是:;bEndSub运行时,窗体输出是:调用前a是:程序设计调用前b是:0调用时a是:VB程序设计调用时b是:1调用后a是:VB程序设计调用后b是:1多窗体在单一窗体有时不能满足用户的需求时,VB允许使用多重窗体。多重窗体实际就是工程中包含多个普通窗体,每个窗体的用法和特点与前几章介绍的窗体一样。例9.3两个窗体设计两个窗体,在第一个窗体上添加一个标签框和5个命令按钮,在第二个窗体上添加两个命令按钮。运行程序时,显示第一个窗体,单击【左对齐】【右对齐】【居中显示】,使标签框中的字完成对齐格式设置,单击【下一个】显示第二个窗体,隐藏本窗体,单击【退出】结束程序的执行。在第二个窗体显示时,单击【显示】在窗体输出“这是第二个窗体”,单击【返回】显示第一个窗体,隐藏本窗体。多窗体9.2.1多窗体的操作9.2.2启动窗体与保存多窗体的操作1.窗体的添加从【工程】菜单中选择【添加窗体】,并单击对话框的【打开】,便把第二个窗体添加到工程中。也可以使用工具栏中的【添加窗体】按钮完成。窗体添加完成后,VB集成环境的工程窗口就会显示出新增加的窗体。2.窗体的加载方法格式:Load窗体名称Load方法将指定窗体加载到内存,但不显示在屏幕上。Load方法将触发窗体的Form_Load事件,Load方法执行之后,在程序中可以引用窗体中的控件及其属性。窗体的卸载方法格式:Unload窗体名称Unload方法是将窗体从内存中卸载。如果窗体显示在屏幕上,那么也将清除屏幕上的显示。4.Show方法格式:[窗体名称.]show[模式]Show方法用于将窗体显示在屏幕上。如果窗体没有在内存中,则Show方法会自动将窗体加载并显示。其中的“模式”表示被显示窗体的状态,其值可为1或0。值等于1时,表示窗体状态为“模态”,显示“模态”窗口时,用户无法把鼠标指针移出当前窗口,只有关闭“模态”窗口后才能对其他窗口进行操作;值等于0时,表示窗体状态为“非模态”,显示“非模态”窗口时,用户不必关闭当前窗口就可以对其他窗口进行操作。方法格式:[窗体名称.]HideHide方法是将窗体隐藏起来。使用Hide方法后,窗体虽然没有在屏幕上显示,但是仍然在内存中,因此窗体及其内部控件可以引用。与Hide方法效果相同的操作是将窗体的Visible属性置为False。启动窗体与保存前面重点讨论了多重窗体的设计和多重窗体之间的切换,添加多窗体后,在界面设计时,多窗体切换非常容易,用下面方法可以使某个窗体窗口为活动窗体窗口。l单击要切换到的窗体窗口中某一裸露的部分。l双击工程资源管理器窗格中要切换到窗体窗口的图标。切换到的窗体窗口为活动窗体窗口,其标题栏为蓝色,具有焦点。在运行多重窗体工程时,哪一个窗体先启动,用户是可以设定。保存多重窗体工程也必须保存每个窗体文件。设置启动窗体在运行多重窗体工程时,系统默认将第一个建立的窗体首先打开。该窗体称为启动窗体。用户可以重新设定,启动窗体的设定方法如下:从【工程】菜单中选择【工程属性】,然后在弹出的【工程属性】对话框中选择【通用】选项卡,再用其中的【启动对象】设定启动窗体。2.保存或打开多重窗体的工程在建立多重窗体的工程时,工程资源管理器窗格可以很容易地观察工程中包含的窗体和标准模块。多窗体与公用过程、标准模块例9.4B计算a!+b!+c!。要求在标准模块中编写函数子程序