1、第第11章章 编写事件驱动程序编写事件驱动程序o理解事件驱动的基本概念;理解事件驱动的基本概念;o掌握事件模块的定义和调用;掌握事件模块的定义和调用;o掌握常用对象事件的使用方法;掌握常用对象事件的使用方法;o了解了解ActiveX控件的设计方法。控件的设计方法。11.1 事件驱动的概念事件驱动的概念11.1.1 对象的属性、事件和方法对象的属性、事件和方法可以把属性看做一个对象的性质,把事件看做对象的可以把属性看做一个对象的性质,把事件看做对象的响应,把方法看做对象的动作。响应,把方法看做对象的动作。1.属性属性 对象中的数据保存在属性中,用来描述和反映对象对象中的数据保存在属性中,用来描述
2、和反映对象特征的参数。特征的参数。代码赋值实现格式:代码赋值实现格式:集合名集合名!对象名对象名.属性名属性名=属性值属性值感叹号感叹号“!”可用来引用集合中由用户定义的一个项;可用来引用集合中由用户定义的一个项;点点“.”可用来引用集合中可用来引用集合中Access定义的一个项。定义的一个项。注意:引用窗体或报表必须从集合开始;而控件可从注意:引用窗体或报表必须从集合开始;而控件可从集合开始,也可从控件开始引用。集合开始,也可从控件开始引用。2.事件事件 对于对象而言,事件就是发生在对象上的事情。对于对象而言,事件就是发生在对象上的事情。 Access把改变对象的状态作为中断正常处理程序把改
3、变对象的状态作为中断正常处理程序的一种途径,这些对象状态的特定改变就叫做事件。的一种途径,这些对象状态的特定改变就叫做事件。 一个事件是对象状态的一种改变,用户可以在事一个事件是对象状态的一种改变,用户可以在事件发生后中断正常的处理过程,即定义一种对事件的件发生后中断正常的处理过程,即定义一种对事件的响应。响应。11.1.1 对象的属性、事件和方法对象的属性、事件和方法3.方法方法 面向对象的程序设计语言为程序设计人员提供了一面向对象的程序设计语言为程序设计人员提供了一种特殊的过程函数(称为方法),这些过程和函数已种特殊的过程函数(称为方法),这些过程和函数已经封装好,供用户直接调用。经封装好
4、,供用户直接调用。调用格式:调用格式:集合名集合名!对象名对象名.方法方法参数名表参数名表11.1.1 对象的属性、事件和方法对象的属性、事件和方法按引发事件的行为分类:按引发事件的行为分类:1.当用户单击窗体对象时触发当用户单击窗体对象时触发鼠标事件鼠标事件;例如:例如:Click、DblClick、MouseDown、MouseUp、MoseMove。2.当用户在活动窗体对象中输入字符或用当用户在活动窗体对象中输入字符或用Sendkeys命令发送击键消息时,由窗体和窗体控件触发命令发送击键消息时,由窗体和窗体控件触发键盘事键盘事件件;例如:例如:KeyDown、KeyUp、KeyPress
5、。11.1.2 理解理解Access的事件指令集的事件指令集按引发事件的行为分类:按引发事件的行为分类:3.当打开或关闭窗体或报表时触发当打开或关闭窗体或报表时触发窗体事件窗体事件;例如:例如:Open、Load、Unload、Close、Resize。4.当一个窗体或窗体控件得到或失去焦点时,或者一当一个窗体或窗体控件得到或失去焦点时,或者一个窗体或报表变成活动的或非活动时,触发个窗体或报表变成活动的或非活动时,触发焦点事件焦点事件;例如:例如:Enter、GotFocus、Exit、LostFocus、Activate、Deactivate。11.1.2 理解理解Access的事件指令集的
6、事件指令集按引发事件的行为分类:按引发事件的行为分类:5.当用户在控件或记录中修改数据时由窗体和窗体控当用户在控件或记录中修改数据时由窗体和窗体控件触发件触发数据事件数据事件,或者把焦点从一条记录移动到另一,或者把焦点从一条记录移动到另一条记录也会由窗体触发条记录也会由窗体触发数据事件数据事件;例如:例如:Current、BeforeInsert、AfterInsert、Delete、BeforeDelConfirm、AfterDelConfirm、BeforeUpdate、AfterUpdate、Change、Updated、Dirty、NotInList。6.当用户应用或去掉筛选时,触发当
7、用户应用或去掉筛选时,触发筛选事件筛选事件;例如:例如:Filter、ApplyFilter。11.1.2 理解理解Access的事件指令集的事件指令集按引发事件的行为分类:按引发事件的行为分类:7.当用户打印或预览报表时,由报表触发当用户打印或预览报表时,由报表触发打印事件打印事件;例如:例如:Format、Print、Retreat、Nodata、Page。8.当出现错误时,触发当出现错误时,触发筛选事件筛选事件;例如:例如:Error。9.当指定的时间间隔终止时,由窗体触发当指定的时间间隔终止时,由窗体触发时钟事件时钟事件;例如:例如:Timer11.1.2 理解理解Access的事件指
8、令集的事件指令集按引发事件的行为分类:按引发事件的行为分类:10.当用户打开或关闭一个类的实例时,触发当用户打开或关闭一个类的实例时,触发类模块事类模块事件件,用户也可以使用新的,用户也可以使用新的With Events限定词和限定词和Raise Event命令来定义自定义事件;命令来定义自定义事件;例如:例如:Initialize、Terminate。11.当用户增加或去掉一个对象的引用,或在新的当用户增加或去掉一个对象的引用,或在新的References集合中类型库的引用时,会触发集合中类型库的引用时,会触发引用事引用事件件;例如:例如:ItemAdded、ItemRemoved11.1.
9、2 理解理解Access的事件指令集的事件指令集11.1 .3 事件过程事件过程 在在VBA中使用一种特殊的命名方式来命名事中使用一种特殊的命名方式来命名事件过程,这种格式的一般形式为:件过程,这种格式的一般形式为:“对象名对象名_事件事件”Sub 对象名对象名_事件事件(参数列表参数列表) 事件过程代码事件过程代码End sub例如单击例如单击“cmdOK”命令按钮,使命令按钮的字体命令按钮,使命令按钮的字体大小改为大小改为20磅:磅:Sub cmdOK_Click() cmdOK.FontSize=20End sub11.1 .3 事件过程事件过程 注意:当用户对一个对象发出一个动作时,可
10、注意:当用户对一个对象发出一个动作时,可能同时在该对象上发生多个事件,写程序时,并不能同时在该对象上发生多个事件,写程序时,并不要求对所有事件都编写代码,只要对感兴趣的事件要求对所有事件都编写代码,只要对感兴趣的事件编写过程编码。没有编码的为空事件过程,系统不编写过程编码。没有编码的为空事件过程,系统不处理该过程。处理该过程。11.2 编写事件驱动程序编写事件驱动程序建立一个应用程序一般步骤建立一个应用程序一般步骤1. 建立用户界面的对象建立用户界面的对象2. 对象属性的设置对象属性的设置3. 对象事件过程及编码对象事件过程及编码4. 保存和运行程序保存和运行程序11.2 编写事件驱动程序编写
11、事件驱动程序例题例题11.1 编写一个对字符进行转换的程序。转换编写一个对字符进行转换的程序。转换规则是:将其中的大写字母转换成小写字母,小写规则是:将其中的大写字母转换成小写字母,小写字母转换成大写字母,数字不转换,其余字符装换字母转换成大写字母,数字不转换,其余字符装换成成”*”。要求每输入一个字符,马上就进行判断和。要求每输入一个字符,马上就进行判断和转换。转换。11.2.1 建立用户界面的对象建立用户界面的对象要建立应用程序,首先要明确这个应用程序执行后窗口上显示的要建立应用程序,首先要明确这个应用程序执行后窗口上显示的形式。形式。11.2.2 对象属性的设置对象属性的设置考虑用什么事
12、件来激发对象执行所需的操作。考虑用什么事件来激发对象执行所需的操作。1.当在当在“输入字符串输入字符串”文本框中每键入一个字符键,文本框中每键入一个字符键,马上就进行判断马上就进行判断“输入字符串输入字符串”文本框对象文本框对象text0对应的对应的KeyPress事件。事件。2.当单击当单击“清屏清屏”命令按钮,清除两个文本框中的所命令按钮,清除两个文本框中的所有内容有内容“清屏清屏”命令按钮对象命令按钮对象command4对应的对应的Click事件。事件。3.当单击当单击“结束结束”命令按钮,程序运行结束命令按钮,程序运行结束“结束结束”命令按钮对象命令按钮对象command5对应的对应的
13、Click事件。事件。11.2.3 对象事件过程及编码对象事件过程及编码Private Sub Text0_KeyPress(KeyAscii As Integer)Dim aa As String * 1aa = Chr(KeyAscii)If KeyAscii = 97 And KeyAscii = 65 And KeyAscii = 48 And KeyAscii 0intAltDown =(Shift And acAltMask)0intCtrlDown =(Shift And acCtrlMask)0If intShiftDown Then MsgBox You pressed th
14、e SHIFT key. End ifif intAltDown Then MsgBox You pressed the AlT key. End ifif intCtrlDown Then MsgBox You pressed the CTRl key. End IfEnd Sub11.3.2 鼠标事件鼠标事件鼠标事件即在操作鼠标所引发的事件。鼠标事件即在操作鼠标所引发的事件。单击事件单击事件当在某对象上当在某对象上单击鼠标左键单击鼠标左键时触发该事件,事件时触发该事件,事件的定义格式:的定义格式:Private Sub 对象对象_Click()双击事件双击事件当在某对象上当在某对象上双击鼠
15、标左键双击鼠标左键时触发该事件,事件时触发该事件,事件的定义格式:的定义格式:Private Sub 对象对象_DblClick(CancelAs Integer)参数决定该操作是否能够有效。参数决定该操作是否能够有效。鼠标按下事件鼠标按下事件当在某对象上当在某对象上按下鼠标左键按下鼠标左键时触发该事件,事件的时触发该事件,事件的定义格式:定义格式:Private Sub 对象对象_MouseDown(Button As Integer,Shift As Integer,X As Single,Y As Single)参数:参数:button为按键的信息,为按键的信息,Shift为个状态键为个
16、状态键的参数,参数的参数,参数X,Y为按下鼠标按键时鼠标所在的位为按下鼠标按键时鼠标所在的位置置鼠标释放事件鼠标释放事件当在某对象上当在某对象上释放鼠标左键释放鼠标左键时触发该事件时触发该事件定义格式:定义格式:Private Sub 对象对象_MouseUp(Button As Integer,Shift As Integer,X As Single,Y As Single)鼠标移动事件鼠标移动事件当在某对象移动鼠标时触发该事件,事件的定义格当在某对象移动鼠标时触发该事件,事件的定义格式:式:Private Sub 对象对象_MouseMove(Button As Integer,Shift
17、 As Integer,X As Single,Y As Single)例题:以下示例确定鼠标位置,以及是否按下鼠例题:以下示例确定鼠标位置,以及是否按下鼠标左键和标左键和Shift按键,当移动鼠标时,鼠标位置的按键,当移动鼠标时,鼠标位置的x和和y坐标显示在文本框中。坐标显示在文本框中。Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim intshiftdown As Integer, intleftbutton As Integer Text0.SetFo
18、cus Text0.Text = X Text2.SetFocus Text2.Text = Y 使用位掩码确定使用位掩码确定shift键和鼠标左按钮的状态键和鼠标左按钮的状态 intshiftdown = Shift And acShiftMask intleftbutton = Button And acLeftButton 检查是否同时按下检查是否同时按下shift键和鼠标左按钮键和鼠标左按钮If intshiftdown And intleftbutton 0 Then MsgBox Shift key and left mouse button were pressed. End I
19、fEnd SubEnd Sub3.窗体事件窗体事件窗体事件是指操作窗体时引发的事件。窗体事件是指操作窗体时引发的事件。打开事件打开事件在在打开一个窗体或报表打开一个窗体或报表时触发该事件,定义格式:时触发该事件,定义格式:Private Sub 对象对象_Open(Cancel As Integer)参数:参数:Cancel决定该操作是否能够有效的进行。当决定该操作是否能够有效的进行。当Cancel值为时窗口被打开,为时窗口将不被打值为时窗口被打开,为时窗口将不被打开。开。关闭事件关闭事件当当关闭一个窗体或报表关闭一个窗体或报表时触发该事件,定义格式:时触发该事件,定义格式:Private S
20、ub 对象对象_Close()加载事件加载事件当一个当一个窗体被加载窗体被加载时触发该事件,定义格式:时触发该事件,定义格式:Private Sub 对象对象_Load()在该事件中可以进行一些窗体的初始化工作。在该事件中可以进行一些窗体的初始化工作。卸载事件卸载事件当一个当一个窗体被卸载窗体被卸载时触发该事件,定义格式:时触发该事件,定义格式:Private Sub 对象对象_Unload(Cancel As Integer)例题:以下示例测试窗体的打开事件。实例用于例题:以下示例测试窗体的打开事件。实例用于显示在用户单击显示在用户单击“否否”按钮时,如何取消窗体的按钮时,如何取消窗体的打开
21、事件。如果单击打开事件。如果单击“否否”,”Mouse Event”窗窗体将不打开,如果单击体将不打开,如果单击“是是”,将打开,将打开“Mouse Event”窗体。窗体。Private Sub Form_Open(Cancel As Integer) Dim intreturn As Integer intreturn = MsgBox(Enter order details now?, vbYesNo) Select Case intreturn Case vbYes 打开打开Mouse Event窗体窗体 DoCmd.OpenForm Mouse Event Case vbNo Msg
22、Box Remember to enter order details by 5 P.M. Cancel = ture 取消取消open事件事件 End SelectEnd Sub4.对象事件对象事件对象事件是指当对对象进行操作时所引发的事件。对象事件是指当对对象进行操作时所引发的事件。获得焦点事件获得焦点事件当一个对象当一个对象由没有焦点的状态变为有焦点的状态由没有焦点的状态变为有焦点的状态时时触发的事件,定义格式:触发的事件,定义格式:Private Sub 对象对象_GotFocus()失去焦点事件失去焦点事件当一个对象当一个对象由有焦点的状态变为没有焦点的状态由有焦点的状态变为没有焦点
23、的状态时时触发的事件,定义格式:触发的事件,定义格式:Private Sub 对象对象_LostFocus()更新前事件更新前事件对象中的数据被修改时,当对象中的数据被修改时,当按下按下enter键,或将焦键,或将焦点从该对象上移开点从该对象上移开时触发该事件,定义格式:时触发该事件,定义格式:Private Sub 对象对象_BeforeUpdate(Cancel As Integer)该事件可用于检验数据输入的有效性,当输入无效该事件可用于检验数据输入的有效性,当输入无效数据时,可以将参数数据时,可以将参数Cancel设置为,此时将无法设置为,此时将无法将焦点从该对象上移开。将焦点从该对象
24、上移开。更新后事件更新后事件当对象中的当对象中的数据被修改得到认可后数据被修改得到认可后触发该事件,定触发该事件,定义格式:义格式:Private Sub 对象对象_Change()例题:要求对学生信息窗体上的学生编号文本框例题:要求对学生信息窗体上的学生编号文本框控件控件“学号学号”中输入的数据进行验证。要求:该中输入的数据进行验证。要求:该文本框只接受文本框只接受100到到300之间的数值数据,提示之间的数值数据,提示取消不合法的数据。取消不合法的数据。Private Sub 学号学号_BeforeUpdate(Cancel As Integer)If Me!学号学号 = Or IsNul
25、l(Me!学号学号) Then MsgBox 学生编号不能为空!学生编号不能为空!, vbCritical, 警告警告 Cancel = 1ElseIf IsNumeric(Me!学号学号) = False Then MsgBox 学生编号必须为数字数据学生编号必须为数字数据, vbCritical, 警告警告 Cancel = 1ElseIf Me!学号学号 300 Then MsgBox 学生编号必须在学生编号必须在100-300之间!之间!, vbCritical, 警告警告 Cancel = 1Else MsgBox 数据验证数据验证OK, vbInformation, 通通告告End
26、 IfEnd Sub Timer事件发生在窗体的事件发生在窗体的TimerInterval属性指属性指定的规则时间间隔内。语法:定的规则时间间隔内。语法:Private Sub Form_Timer() 通过通过Timer事件发生时运行宏或事件过程,可以事件发生时运行宏或事件过程,可以控制在每一计时器间隔内需要控制在每一计时器间隔内需要Access完成的操作。完成的操作。 窗体的窗体的TimerInterval属性设置以毫秒为单位,属性设置以毫秒为单位,指定指定Timer事件间的间隔。如果设置为事件间的间隔。如果设置为0,将阻止,将阻止Timer事件发生。事件发生。11.3.5 Timer事件
27、事件例题:演示一个在窗体上显示的数字时钟,一个标例题:演示一个在窗体上显示的数字时钟,一个标签控件根据计算机系统时钟显示当前时间。签控件根据计算机系统时钟显示当前时间。 将下面的事件过程添加到一个窗体中,该窗体将下面的事件过程添加到一个窗体中,该窗体包含名为包含名为“Clock”的标签。的标签。 在窗体在窗体“属性属性”窗口中,选择窗口中,选择“事件事件”选项卡,选项卡,设置设置TimerInterval间隔属性为间隔属性为1000ms,即每隔,即每隔一秒更新一次时钟。一秒更新一次时钟。 在在“计时器触发计时器触发”属性中选择属性中选择“事件过程事件过程”,点击进入代码编辑窗口,点击进入代码编
28、辑窗口,VBE编辑环境自动创建了编辑环境自动创建了事件过程模板。事件过程模板。Private Sub Form_Timer() Clock.caption=TimeEnd Sub ActiveX控件是以控件是以.ocx作为扩展名,保存在作为扩展名,保存在Windows的的System文件夹中。文件夹中。 在窗体设计视图中使用在窗体设计视图中使用ActiveX控件有两种方法:控件有两种方法:1.执行执行“插入插入”|“ActiveX”命令命令(Microsoft Date and Time Picker Control Version 6.0、Microsoft Slider Control v
29、ersion 6.0等等)2.单击工具箱中单击工具箱中“其他控件其他控件”按钮按钮11.3.6 ActiveX控件控件例题例题 用滑块控件显示数字,要求无论滑块指向什么用滑块控件显示数字,要求无论滑块指向什么刻度,都能显示相应的数字。刻度,都能显示相应的数字。操作步骤:操作步骤:1.新建窗体和增加文本框。窗体的标题为新建窗体和增加文本框。窗体的标题为“用滑块控用滑块控件浏览件浏览”,标签的标题为,标签的标题为“您选择的是:您选择的是:”。2.插入滑块控件插入滑块控件Slider0,设置属性,设置属性max为为100,min为为0。3.滑块控件的鼠标释放事件过程编写如下:滑块控件的鼠标释放事件过程编写如下:Private Sub Slider0_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Long, ByVal y As Long)Text1 = Slider0.ValueEnd Sub例题例题 使用日历控件,显示每个日期的星期情况。使用日历控件,显示每个日期的星期情况。操作步骤:操作步骤:1.新建窗体。新建窗体。2.插入日历控件插入日历控件“calendar control 8.0” (日历控件(日历控件11.0)