【原创】总结上面文章的核心内容:
(注:下文中引用之所有代码仅作原理说明用,未经调试和测试。实际使用中可能需要作一定的修改)
对于一个包含事件的对象(比方说Access中的Form),我们在通过Set获得其引用的同时,我们也可以捕获他的事件。声明的方法为:Dim/Public/Private WithEvents
例如:
Public WithEvents X As Form
Set A=Forms(0)
Public Sub A_OnLoad()
'这里的代码将在窗体0被Load的时候执行
End Sub
有人可能会质疑,为什么要这样做,直接写在Form_OnLoad里面不是更方便?这里有个很大的区别,Form_OnLoad中的代码针对的对象是固定的,也就是说你写在窗体1里面就只有窗体1能执行,窗体2则要另外写,而上面的方式则不同,如:(以下代码需要根据VBA的规定分散到窗体和模块中)
Dim Tag As Boolean
Publice WithEvents rs As DAO.RecordSet
Private Sub Command0_Click()
If Tag then
Set rs = RecordSet1
Else
Set rs = RecordSet2
End If
End Sub
Publice Sub rs_OnMoveComplete()
'执行代码
End Sub
我们可以通过按钮来切换我们所要监视的对象,如果和常规方法比较,打个简单的比方,警察要监视100个嫌疑犯,常规的方法是警察想要监视哪个嫌疑犯的时候,要跑一趟他家,把监视器打开,并把刚才监视完毕的那个嫌疑犯家里的监视器关掉,免得占用了通讯频道。而新的做法是警察在自己的监视器上装了一个切换器,能够自由切换接收哪家的监视信号。
如果说上面的例子还没有让你对WithEvents的作用引起足够的重视,那么下面的例子将充分表现WithEvents的有用之处:
Public WithEvents rs As Control
Public Sub SwitchDest(ByVal n As Long)
Set rs = Forms(0).Controls(n)
End Sub
Private Sub rs_OnChange()
MsgBox "你所监视的对象被改变了,你可以在这里的代码中对改变后的值作出相应。"
End Sub
看到这里,你应该已经可以明白,新的处理方式将能给我们带来什么,事件并不是在运行时无法变更对象,对事件进行第二层包装后,我们可以随意决定我们想要捕获事件的对象,比方说,根据数据表中的某个字段,来决定今后几个字段的计算方式,以及计算结果要对哪几个值的变更作出相应。
用一个通俗的比喻来理解上述的应用,由于嫌疑犯数量众多,一个警察不堪重负,因此上级决定扩大编制为20个警察,并且根据实际情况的需要还有可能增加,于是这个警察再次重新设计了监视系统,他把监视系统改变成监视信号不直接发到任何一台单独的监视器上,而是集中到一个发射台上,警察的监视器统一接收发射台信号,并且改装了监视器,能够切换不同的频道。
多种的事件处理方法可以使我们设计出更灵活的数据库,当然更多其他的应用需要开发者在使用中共同挖掘。
[此贴子已经被作者于2005-8-22 17:38:51编辑过]
|