




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章设计模块与事件驱动程序模块化程序设计类模块与标准模块模块与过程的关系Sub子过程与Function子过程的定义过程调用与参数传递事件与事件驱动常用的事件过程
学习目标理解类模块、标准模块及其区别了解描述模块与过程的相互关系理解Sub子过程及Function子过程掌握过程定义、调用与参数传递的方法理解变量的作用范围及生命周期理解事件及事件驱动
概述实际上我们在程序设计时,首先将整个系统分解成若干个独立的子系统,然后对子系统进行编程、调试,这种设计方法充分体现了模块化程序设计的思想。在Access中,模块是一个重要的对象,它是用户开发应用程序的基本手段。
过程与模块过程是VBA代码的容器,在Access中有三种类型的容器,它们分别是子程序、函数过程和属性过程。虽然它们的功能可以组合,但是每种过程都有其独特的功能。一个模块由若干个函数过程或子过程组成。另外,在学习窗体或报表时,经常要从工具栏中选取某些控件,放置在窗体或报表上。这些控件就是对象,其中封装了一些属性或方法,用户可以根据设定使用。对于同一种控件,设定的属性不同,其表现的形式就不同,从而产生的实例也就不同。模块和宏的使用很相似,宏的每一个操作都有其对应的VBA代码。因此,我们可以将宏转化为等效的模块,从而提高运行速度。虽然模块和宏的使用很相似,但是宏的使用有一定的局限性,有些复杂的条件或程序结构,只能利用模块来实现。将宏转化为模块的操作如下。在Access数据库窗口对象中单击宏对象,选中要转化为模块的宏,使用工具菜单下的“将宏转化为VisualBasic代码”命令来实现转化。将宏转化为VBA代码子过程的定义与参数传递一个模块中通常包含一个或多个过程,模块功能的实现就是通过执行具体的过程来完成的,在本节中,我们将结合实例介绍过程创建、过程调用和参数传递的使用。VBA程序中的过程分为两种类型,Sub子过程和Function函数过程。例题其中Int_Mul子过程求两个整数的积,并将其输出到立即窗口,在Demo子过程中调用Int_Mul子过程求5与8的积。
在数据库窗口中,选中模块对象,单击“新建”,在打开的VBE中输入如下代码:SubDemo()CallInt_Mul(5,8)‘调用Int_Mul子过程求5与8的积EndSubSubInt_Mul(aasInteger,basInteger)DimResultAsIntegerResult=a*bDebug.PrintResultEndSub
代码编辑窗口命令按钮向导对话框在这里我们选择了查找下一项记录的操作,则生成了如下的子过程代码:PrivateSub命令_Click()OnErrorGoToErr-命令_ClickDoCmd.FindnextFindnext-命令_Click:ExitSubErr-命令_Click:MsgBoxErr.DescriptionResumeFindnext-命令_ClickEndSub在Access窗体视图中浏览窗体时,单击此按钮,窗体就会显示下一个记录。此时这个过程的执行是通过单击按钮事件而进行的。这就是在本章后面要介绍的事件驱动机制。函数过程的定义和调用如果希望一组单一功能的VBA代码返回一个数值,就用函数来表示。Function函数过程是由Function语句开始来声明一个函数,并使用EndFunction语句结束。Function函数执行一系列操作,有返回值。定义格式如下:[Public/Private][static]Function函数过程名([<行参表>])[As数据类型][〈函数过程语句〉][ExitFuncion][〈函数过程语句〉][函数过程名=〈表达式〉]EndFunction使用Public关键字,则所有模块的所有其他过程都可以调用它。使用Private关键字,则该函数只适用于同一个模块中的其他过程。包括Static关键字时,只要含有这个过程的模块是打开的,则所有在这个过程中无论是显示还是隐含说明的变量值都将被保留。可以在函数过程名末尾使用一个类型声明字符或使用As子句来声明被这个函数过程返回的变量数据类型。否则VBA将自动赋予该函数过程一个最合适的数据类型。函数过程的调用形式为:函数过程名[<实参表>]函数过程的调用会返回一个值,函数过程的调用形式与标准函数的使用完全相同。函数代码FunctionInt_Sum(aasInteger,basInteger)DimResultAsIntegerInt_Sum=a+bEndFunction例调用子函数作为表达式的一部分参与运算。要求:在标准模块中输入如下3个过程,CircleArea函数和SquareArea函数分别用于求圆和正方形的面积,主过程Max1用于比较半径和边长相同的圆和正方形的面积的大小。
‘利用半径求圆面积PrivateFunctionCircleArea(rAsInteger)Constpi=3.14‘定义pi为常数
CircleArea=pi*r*rEndFunction‘求正方形的面积PrivateFunctionSquareArea(lineAsInteger)SquareArea=line*lineEndFunction‘比较半径和边长相同的圆和正方形的面积的大小PrivateSubMax1()DimsAsIntegerS=InputBox(“请输入测试数据”)‘利用对话框接收测试数据
IfCircleArea(s)>SquareArea(s)Then‘函数作为表达式参与运算
MsgBox“半径和边长相同的圆和正方形,圆的面积更大!”
EndIfEndSub
参数传递由上面的过程定义可以看到,过程定义时可以设置一个或多个形参(形式参数的简称),形参之间用逗号分隔。其中,每个形参的完整定义格式为:[Optional][ByVal|ByRef][ParamArray]varname[()][AsType][=Defaultvalue]各项含义如下:VarName,必选项,形参名称。遵循标准的变量命名规则。Type,可选项,传递给过程参数的数据类型。Optional,可选项,如果使用了ParamArray,则任何参数都不能使用Optional.ByVal,可选项,表示该参数按值传递。ByRef,可选项,表示该参数按地址传递。Byref是VBA的缺省选项。ParamArray,可选项。只用于形参的最后一个参数,指明最后这个参数是一个Variant元素的Optional数组。但ParamArray关键字不能与Byval,ByRef或Optional一起使用。Defaultvalue,可选项,任何常数或常数表达式。只对Optional参数合法。如果类型为Object,则显示的缺省值是Nothing。代码的编辑窗口
例11.5如果把主调过程命令1_Click()不做任何改变,将被调函数GetData的定义做如下修改,参数传递改为按值传递,代码如下所示:PrivateFunctionGetData(ByValmAsInteger)‘形参m被说明为ByVal传值形式的整型量m=m+6GetData=mEndFunction通过同样的方法调用GetData函数,执行结果如图所示,m值没有发生变化,仍为5。传值调用的结果变量的作用域和生命周期变量作用域的分为三个层次,局部范围、模块范围和全局范围。1.局部范围如果变量定义在过程或函数体内,只有在过程代码执行时变量才发生作用。这样的变量称为局部变量,只能在过程或函数内才有效。不同的过程或函数中,可以定义具有相同名字的变量,它们之间是互相独立的。这种变量一般是在过程内使用Dim定义或通过直接使用一个新变量名,即为隐式定义。例有如下程序PrivateMyNameAsStringPublicYourNameAsStringPrivateSub命令0_Click()DimHisNameAsString…EndSubPrivateSub命令1_Click()DimHerName=”王芳”
…EndSub
说明上面程序中定义了4个变量,其中MyName变量是用Private定义在模块的所有过程前,所以是模块级变量,在本模块的所有过程中均有效,在“命令0_Click”和“命令1_Click”中都可以使用此变量;YourName是用Public定义在模块的所有过程前,是一个全局变量,不仅在本模块中的任何一个过程中可以使用,而且在本模块所在的工程中的其它代码中也可使用;HisName和HerName都只是定义在各自的过程中,所以都是局部变量。注意:尽管在“命令0_Click”过程中没有定义HerName变量,如果直接给HerName变量赋值,也不会出错。但是这个HerName变量是在“命令0_Click”过程中隐式定义的一个变量,和“命令1_Click”中的HerName变量不是同一个变量。例新建一个窗体,窗体上放置命令按钮Command1和Command2。PublicaAsInteger,bAsIntegerPrivateSubCommand1_Click()DimaAsIntegerMsgBox“变量a:”&aMsgBox“变量b:”&bEndSubPrivateSubCommand2_Click()MsgBox“变量a:”&aMsgBox“变量b:”&bEndSubPrivateSubForm_Load()a=1b=1EndSub分析程序运行即定义了a,b两个全局变量,窗体运行时执行了Load事件后两个变量都为1,当点击了Command1,在Command1_Click过程中定义了一个局部变量a,根据规定这个a变量自动初始化为0,并且在本过程内部屏蔽了全局变量a,所以此时的MsgBox函数显示出a,b的值分别为0和1;当点击了Command2,Command2_Click过程MsgBox函数显示出a,b的值均为1。变量的生命周期变量的生命周期是指变量值的有效存活期。对于模块级和全局变量,其生命周期与应用程序的生命周期相同,也就是说,应用程序运行时,该变量总是起作用的。局部变量的生命周期又分为两种情况:1.用Dim定义的局部变量用Dim定义的局部变量或直接使用一个新变量名,其值只能在所属过程或函数的活动期间有效。当退出该过程或函数时,该变量和它的值都将被清除。当该过程或函数被再次调用执行时,将重新创建和初始化该变量。2.用Static定义的静态变量用Static定义的变量称为静态变量,在所属的过程或函数执行结束后,其值仍然存在。在下次调用该过程时,其值不被重置,仍保留原来(上次运行结束时)的结果,直到模块被复位或重新启动。
例如,在一个函数中编写如下代码:StaticaAsIntegera=a+1说明由于用Static定义的变量a是一个静态变量,所以在第一次执行该函数时,a的结果是1。函数执行完毕后,变量a仍然保存在内存中。第二次再执行该函数时就在原来1的基础上再次加1,所以第二次运行完毕后变量a的结果为2。如果要清除过程中的静态变量,选择“运行”菜单的“重新设置”命令。
10.2Access常用的对象事件在前面的章节中我们已经学习了事件和事件过程,在本节中我们将主要讨论Access中的对象事件。我们知道VBA是面向对象的高级程序语言,在VBA中有一类特殊的过程,它们的执行是通过动作来触发执行的。这就是一种事件驱动机制。那么我们怎样来理解呢?其实在日常生活中,我们无时无刻不处在事件以及对事件的处理中。例如,交通路口指示灯的变化、电话铃响、有人喊我们的名字等等,这些都是事件。当这些事件发生时,我们会采取相应的行动;如果交通灯是红色的,就要停下来;电话铃响了,就要接电话。由此可以看出,作为客体的我们也可以叫做一个被事件驱动的人。在Access中通过对窗体或报表上的控件等对象施加某种动作,例如,用鼠标单击按钮、窗体或报表的打开等,这样就发生了事件。如何处理、响应这些事件呢?在Access中是通过两种方式来处理窗体、报表或控件的事件响应。一是使用宏对象来设置事件属性;二是为某个事件编写VBA代码过程,这样的代码过程称为事件过程或事件响应代码。编写事件过程是最常用的事件处理方法。在VBA中,使用一种特殊的命名方式来命名事件过程,这种格式的一般形式是:“对象名_事件”。当该对象发生事件时,系统就去寻找相应的处理过程来处理它,也就是说,每个事件都可以由一段程序驱动来响应。Access窗体、报表和控件的事件有很多,下面我们将介绍一些常用的事件过程。键盘事件键盘事件是用户操作键盘所引发的事件,常用的键盘事件有键按下(KeyDown)、键释放(KeyUp)、击键(KeyPress)等。1.键按下事件当在某对象上按下键盘上的任意键时都会触发该事件,其事件定义格式如下:PrivateSub对象_KeyDown(KeyCodeAsInteger,ShiftAsInteger)参数:KeyCode为按键的位置码,Shift为3个状态键(Shift、Ctrl和Alt)的状态。2.键释放事件当在某对象上释放键盘上的任意键时都会触发该事件,其事件定义格式如下:PrivateSub对象_KeyUp(KeyCodeAsInteger,ShiftAsInteger)3.击键事件当在某对象上按下键盘上的任意字符按键时都会触发该事件,其事件定义格式如下:PrivateSub对象_KeyPress(KeyAsciiAsInteger)参数:KeyAscii为返回按键的Ascii码值。例以下示例确定是否已经按下Shift、Ctrl或Alt按键。要求:新建一个窗体名称为Form1,在窗体上放置一个文本框对象,名称为ytest1,显示内容为“键盘事件的测试”,然后打开文本框的属性对话框,在事件选项卡下选择“键按下”事件过程。其代码如下:PrivateSubytest_KeyDown(KeyCodeAsInteger,ShiftAsInteger)DimintShiftDownAsInteger,intAltDownAsIntegerDimintCtrlDownAsInteger‘使用位掩码确定按下了哪个键intShiftDown=(ShiftAndacShiftMask)>0intAltDown=(ShiftAndacAltMask)>0intCtrlDown=(ShiftAndacCtrlMask)>0‘显示消息,表示用户按下的键IfintShiftDownThenMsgBox“您按下了SHIFT键!”
EndifIfintAltDownThenMsgBox“您按下了ALT键!”EndifIfintCtrlDownThenMsgBox“您按下了CTRL键!”EndifEndSub运行结果如下:将窗体切换到窗体视图,在文本框中单击Shift、Alt或Ctrl键查看显示结果。结果如图11.11所示。图键盘KeyDown事件的测试例以下示例演示,当文本框获取焦点时,接收按下的键盘上的字母键并将其转化为大写字母显示在文本框中。要求:在上例的窗体Form1上放置一个文本框对象,名称为ytest2,显示内容为“键盘事件的测试2”,然后打开文本框的属性对话框,在事件选项卡下选择“击键”事件过程。其代码如下:PrivateSubytest2_KeyPress(KeyAsciiAsInteger)Char=Chr(KeyAscii)KeyAsch=Asc(UCase(Char))EndSub运行结果如下:将窗体切换到窗体视图,在文本框中输入字符student查看显示结果。结果如图11.12所示。图键盘KeyPress事件的测试鼠标事件鼠标事件即在操作鼠标所引发的事件,常用的鼠标事件有单击(Click)、双击(DblClick)、鼠标按下(MouseDown)、鼠标释放(MouseUp)和鼠标移动(MouseMove)等。1.单击事件当在某对象上单击鼠标左键时触发该事件,其事件定义格式如下:PrivateSub对象_Click()2.双击事件当在某对象上双击鼠标左键时触发该事件,其事件定义格式如下:PrivateSub对象_DblClick(CancelAsInteger)参数:Cancel决定该操作是否能够有效。3.鼠标按下事件当在某对象上按下鼠标左键时触发该事件,其事件定义格式如下:PrivateSub对象_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)参数:Button为按键的信息,Shift为3个状态键(Shift、Ctrl和Alt)的状态,参数X,Y为按下鼠标按键时鼠标所在的位置。4.鼠标释放事件当在某对象上释放鼠标左键时触发事件,其事件定义格式如下:PrivateSub对象_MouseUp(ButtonAsInteger,ShiftAsIneger,XAsSingle,YAsSingle)参数:Button为按键的信息,Shift为3个状态键(Shift、Ctrl和Alt)的状态,参数X,Y为按下鼠标按键时鼠标所在的位置。5.鼠标移动事件当在某对象移鼠标时触发该事件,其事件定义格式如下:PrivateSub对象_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)参数:Button为按键的信息,Shift为3个状态键(Shift、Ctrl和Alt)的状态,参数X,Y为按下鼠标按键时鼠标所在的位置。例以下示例确定鼠标位置,以及是否按下了鼠标左键或Shift按键。当移动鼠标时,鼠标指针位置的X和Y坐标将显示在标签控件中。测试此示例,请将下列事件过程添加到窗体Formycx1中,窗体标题为“MouseEvent”,并使该窗体含有一个名为ycx0的标签。PrivateSubFormycx1_MuseMove(ButtonAsInteger,ShiftAsInteger,XAsInteger,YAsInteger)DimintShiftDownAsInteger,intLeftButtonAsIntegerMe!ycx0.Caption=X&”,”&Y‘使用位掩码确定‘Shift键和鼠标左按钮的状态intShiftDown=ShiftAndacShiftMaskintLeftButton=ButtonAndacLeftButton‘检查是否同时按下Shift键和鼠标左按钮IfintShiftDownAndintLeftButton>0ThenMsgBox””EndIfEndSub运行结果如下:将窗体切换到窗体视图,并且同时单击Shift键和鼠标左键,注意查看标签控件的变化及提示框,结果如图11.13所示。图MouseMove鼠标事件的测试窗口事件窗口事件是指操作窗口时引发的事件。常用的窗口事件有打开(Open)、关闭(Close)、调整大小(Resize)、激活(Activate)、停用(Deactivate)、加载(Load)和卸载(Unload)等。1.打开事件在打开一个窗体和报表时触发该事件,其事件定义格式如下:PrivateSub对象_Open(CancelAsInteger)参数:Cancel决定该操作是否能够有效地进行。当Cancel的值为0时窗口被打开;当Cancel的值为1时窗口将不被打开。2.关闭事件当关闭一个窗体和报表时触发该事件,其事件定义格式如下:PrivateSub对象_Close()3.加载事件当一个窗体被别载时触发该事件,其事件定义格式如下:PrivateSub对象_Load()在该事件中可以进行一些窗体的初始化工作。4.卸载事件当一个窗体被卸载触发该事件,其事件定义格式如下:PrivateSub对象_Unload(CancelAsInteger)例以下示例测试窗体的打开事件。示例显示在用户单击“否”按钮时,如何取消窗体的打开事件。如果用户单击“否”,Form1窗体将不打开如果要试验此示例,请将下列事件代码添加到窗体中。PrivateSubForm1_Open(CancelAsInteger)DimintReturnAsIntegerintReturn=MsgBox(“现在打开form1窗体吗?”,vbYesNo)SelectCaseintReturnCasevbYesDoCmd.OpenForm”form1”‘打开form1窗体
CasevbNoMsgBox”RemembertoenterForm1by5P.M.”Cancel=True‘取消Open事件EndSelectEndSub运行结果如下:将窗体切换到窗体视图,即打开窗体时,显示如下结果,如图11.14所示。图窗口事件的测试对象事件对象事件是指当对对象进行操作时所引发的事件。常用的对象事件有获得焦点(GetFocus)、失去焦点(LostFocus)、更新前(BeforeUpdate)、更新后(AfterUpdate)和更改(Change)等。1.获得焦点事件当一个对象由没有焦点的状态变为有焦点的状态时触发的事件,其事件定义格式如下:PrivateSub对象_GetFocus()2.失去焦点事件当一个对象由有焦点的状态变为没有焦点的状态时的事件,其事件定义格式如下:PrivateSub对象_GetFocus()3.更新前事件对象中的数据被修改时,当按下键,或将焦点从该对象上移开时触发该事件,其事件定义格式如下:PrivateSub对象_BeforeUpdate(CancelAsInteger)该事件可以用于检验数据输入的有效性,当输入无效数据时,可以将参数Cancel设置为1,此时就无法将焦点从该对象上移开。例要求对学生信息窗体上的学生编号文本框控件ycx3中输入的数据进行验证。要求:该文本框中只接受200到400之间的数值数据,提示取消不合法的数据。PrivateSuby3_BeforeUpdate(CancelAsInteger)IfMe!Y3=””OrIsNull(Me!Y3)Then‘数据为空时的验证MsgBox”学生编号不能为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年高中物理课时分层作业15机械能守恒定律含解析教科版必修2
- 2024-2025学年高中政治专题三运用辩证思维的方法第4框推动认识发展学案新人教版选修4
- 2024-2025学年高中地理第二章区域可持续发展第二节湿地资源的开发与保护知识梳理学案湘教版必修3
- 装配式建筑 钢结构 预制构件与节点技术条件 编制说明
- “多位数乘一位数(不进位)的笔算乘法”(教学设计)-2024-2025学年三年级上册数学人教版
- 第四单元《第15课 网上点播-在线点播微电影》教学设计-2023-2024学年清华版(2012)信息技术四年级上册
- 第四单元 单元教学设计 2023-2024学年统编版高中语文选择性必修中册
- 第五章排版-排球双手正面传球 教学设计 2023-2024学年北师大版八年级上册
- 2025年变压器、整流器和电感器项目合作计划书
- 多边形内角和 (教学设计)-2023-2024学年四年级下册数学人教版
- 《民营企业清廉建设评价规范》
- 智能RPA财务机器人开发教程-基于来也UiBot 课件 第2章-常用机器人流程自动化
- GB/T 45037-2024粮油机械扒谷机
- 团聚体与土壤有机质转化-洞察分析
- 公务车辆定点加油服务投标文件(技术方案)
- 膝关节镜手术后康复
- 安徽工程大学《回归分析》2023-2024学年第一学期期末试卷
- 读书分享《给教师的建议》课件
- 《中小学校园食品安全和膳食经费管理工作指引》专题讲座
- 广东省茂名市2023-2024学年高一上学期物理期末试卷(含答案)
- 江苏省苏州市昆山、太仓、常熟、张家港四市2024-2025学年八年级上学期期中阳光测评生物学试卷(含答案)
评论
0/150
提交评论