设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

123下一页
返回列表 发新帖
查看: 8235|回复: 20
打印 上一主题 下一主题

[模块/函数] 【转载 / 文章】VBA对象级事件处理 / 【原创 / 文章】Access VBA中的事件处理

[复制链接]
跳转到指定楼层
1#
发表于 2005-8-22 23:15:00 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
、这篇文章虽然是针对AutoCAD环境而作,但是由于VBA的通用性,所以本文中描述的技术,在Access中完全可以使用,转贴以供VBA中高级开发者参考:

=====================================

对象级事件并不是一直存在于AutoCAD的VBA中的,也就是说,当一个VBA程序被装载时,对象级事件并不会自动被激活。对象级事件必须被VBA和所有其它的ActiveX 自动操作控制器激活。

一旦对象级事件被激活,你就有以下的事件可用:

Modified

当图中的某个对象被修改时引发。







本章主题

激活对象级事件



激活对象级事件

在你能使用对象级事件之前,你必须建立一个新的类模块,并声明一个对象为带事件的AcadObject类型。例如,假定一个新的类模块已经建立并命名为EventClassModule,这个新的类模块将包含带VBA关键字WithEvents的应用程序的声明。

建立一个新的类模块并声明一个带事件的Circle对象

1 在VBA IDE中,插入一个类模块。从插入菜单中选择类模块。

2 在工程窗口中选择新的类模块。

3 在工程窗口中将类模块的名称改为EventClassModule。

4 用F7或通过选择菜单项查看代码打开类模块的代码窗口。

5 在类模块的代码窗口中,增加以下行:

Public WithEvents Object As AcadCircle

当新的对象被声明是带事件的,它就出现在分类模块的对象下拉列表中,并且你可以在类模块中为新对象编写事件过程。(当你在对象框中选择了新对象,对这个对象有效的事件就列在过程下拉列表中。)

但是,在程序执行之前,你必须连接类模块中被声明的对象到Circle对象,你可以用任何模块中的以下代码来完成这一过程。

连接被声明的对象到Automation对象

1 在主模块的代码窗口中,添加以下行到声明段中:

Dim X As New EventClassModule

2 在相同窗口中,建立一个叫"MyCircle"的圆并把它初始化为包含事件:Sub InitializeEvents()

    Dim MyCircle As AcadCircle

    Dim centerPoint(0 To 2) As Double

    Dim radius As Double

    centerPoint(0) = 0#: centerPoint(1) = 0#: centerPoint(2) = 0#

    radius = 5#

    Set MyCircle = ThisDrawing.ModelSpace.AddCircle(centerPoint, radius)

    Set X.Object = MyCircle

End Sub

3 在你的主模块的代码中,添加对InitializeApp子程序的调用:

Call InitializeEvents

一旦InitializeEvents程序执行后,在类模块中的圆对象就会指向被建立的圆对象。并且当事件发生时,这个分类模块中的任何事件过程都会运行。

注意:当在VBA编写代码时,你必须为每个激活为Modified事件的对象提供一个事件处理器,如果你不能提供一个事件处理器,VBA可能会发生意外终止。

只要一个封闭的多义线被更新就显示它的面积

以下示例如何建立一个带事件的细多义线。只要多义线被改变,多义线的事件处理器就可以显示多义线的新面积。要想触发这个事件,你只需在AutoCAD中改变多义线的尺寸。记住,在事件处理器活动之前,你必须先运行CreatePLineWithEvents子程序。Public WithEvents PLine As AcadLWPolyline



Sub CreatePLineWithEvents()

    ' 本例创建一细多义线

    Dim points(0 To 9) As Double

    points(0) = 1: points(1) = 1

    points(2) = 1: points(3) = 2

    points(4) = 2: points(5) = 2

    points(6) = 3: points(7) = 3

    points(8) = 3: points(9) = 2

    Set PLine = ThisDrawing.ModelSpace. _

                   AddLightWeightPolyline(points)

    PLine.Closed = True

    ThisDrawing.Application.ZoomAll

End Sub



Private Sub PLine_Modified _

               (ByVal pObject As AutoCAD.IAcadObject)

    ' 该事件当多义线大小变化时引发。

    ' 如果多义线被删除时modified 事件仍然会被引发,

    ' 所以使用错误处理器来避免从删除了的对象中读取数据。

    On Error GoTo ERRORHANDLER

    MsgBox "对象" & pObject.ObjectName & " 的面积为: " _

            & pObject.Area

    Exit Sub

   

ERRORHANDLER:

    MsgBox Err.Description

End Sub

[此贴子已经被作者于2005-9-21 23:00:07编辑过]

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
21#
发表于 2008-10-17 10:39:48 | 只看该作者
正在努力学习中,正好需要
[:11] [:13]
20#
发表于 2008-8-1 21:27:43 | 只看该作者
只是好奇,收藏---说不定有朝一日会真正感兴趣!
19#
发表于 2006-7-30 00:46:00 | 只看该作者
楼主你太棒了!!!!!
18#
发表于 2006-7-29 07:56:00 | 只看该作者
学习
17#
发表于 2005-8-29 16:40:00 | 只看该作者
说得有理,只不过是自己随便想想罢了,哈哈
16#
 楼主| 发表于 2005-8-27 20:02:00 | 只看该作者
以下是引用esmile在2005-8-27 8:47:00的发言:



谢谢.

自动启动加载?

不知是否这样操作?小弟真是够笨,还是不能实际,LucasLynn 兄能否抽空看看?我还是未明领悟. 谢了.

[em06]



我只是想,有必要这么做吗?

这样处理事件的方法,主要是用于动态对象,也就是对象实例不可确定的时候,但是窗体本身只有一个对象,而且是确定的,有必要重新截获他的OnLoad吗?有什么事情不能在Form_Load()里面干呢?
15#
发表于 2005-8-27 16:47:00 | 只看该作者
谢谢.

自动启动加载?

不知是否这样操作?小弟真是够笨,还是不能实际,LucasLynn 兄能否抽空看看?我还是未明领悟. 谢了.

[em06]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
14#
 楼主| 发表于 2005-8-27 12:27:00 | 只看该作者
以下是引用esmile在2005-8-26 22:19:00的发言:



谢谢,真的可以.

我觉得事件处理器很是好用,但就是不知道速度如何.

如不介意,我又发现一个问题.

当我在类事件中定义了引用窗体的_Load 或_OPEN事件如何调用呢?

仁兄不知道能否明白我的意思,哈哈,感兴趣的话研究一下,如何?





可以放到其他窗体里面,那个窗体可以设定为Access启动自动加载,加载后立即关闭,等等等等。

能用的方法太多了。
13#
发表于 2005-8-27 06:19:00 | 只看该作者
谢谢,真的可以.

我觉得事件处理器很是好用,但就是不知道速度如何.

如不介意,我又发现一个问题.

当我在类事件中定义了引用窗体的_Load 或_OPEN事件如何调用呢?

仁兄不知道能否明白我的意思,哈哈,感兴趣的话研究一下,如何?

[此贴子已经被作者于2005-8-26 22:19:39编辑过]

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-15 00:02 , Processed in 0.099430 second(s), 36 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表