侦听器
UNO 中许多接口用于注册实现特殊侦听器接口的侦听器对象,这样,调用相应的侦听器方法时,对应的侦听器就会获得反馈信息。OpenOffice.org Basic 不支持对象实现概念,因此,引入了一个名为 CreateUnoListener()
的特殊 RTL 函数。它将一个前缀用于那些可从 UNO 回调的方法名称。CreateUnoListener()
需要一个方法名称前缀以及所需侦听器接口的类型名称。它返回一个对象,该对象支持可用于注册当前侦听器的接口。
以下示例将实例化 com.sun.star.container.XContainerListener。请注意前缀 ContListener_
:
Dim oListener oListener = CreateUnoListener( "ContListener_", "com.sun.star.container.XContainerListener" )
下一步是实现侦听器方法。在该示例中,侦听器接口具有以下方法:
com.sun.star.container.XContainerListener 的方法 | |
---|---|
disposing()
|
侦听器基接口 com.sun.star.lang.XEventListener 中的方法。每个侦听器接口都包含该方法,因为所有侦听器接口必须是由该基接口派生出来的。接受 com.sun.star.lang.EventObject |
elementInserted()
|
接口 com.sun.star.container.XContainerListener 的方法。 接受 com.sun.star.container.ContainerEvent。 |
elementRemoved()
|
接口 com.sun.star.container.XContainerListener 的方法。 接受 com.sun.star.container.ContainerEvent。 |
elementReplaced()
|
接口 com.sun.star.container.XContainerListener 的方法。接受 com.sun.star.container.ContainerEvent。 |
示例中,ContListener_
被指定为名称前缀,因此,必须在 Basic 中实现以下子程序。
-
ContListener_disposing<7code>
- <code>ContListener_elementInserted
-
ContListener_elementRemoved
-
ContListener_elementReplaced
每个侦听器类型都具有一个对应的 Event
结构类型,其中包含事件信息。当调用侦听器方法时,会将该 Event
类型的实例作为参数进行传送。在 Basic 侦听器方法中,通过将适合的 Variant
参数加入到过程标头,可以分析这些 Event
对象。以下代码示意如何实现示例中的侦听器方法:
Sub ContListener_disposing( oEvent ) MsgBox "disposing" MsgBox oEvent.Dbg_Properties End Sub Sub ContListener_elementInserted( oEvent ) MsgBox "elementInserted" MsgBox oEvent.Dbg_Properties End Sub Sub ContListener_elementRemoved( oEvent ) MsgBox "elementRemoved" MsgBox oEvent.Dbg_Properties End Sub Sub ContListener_elementReplaced( oEvent ) MsgBox "elementReplaced" MsgBox oEvent.Dbg_Properties End Sub
必须实现所有的侦听器方法,包括侦听器父接口中的侦听器方法。无论何时事件发生,如果没有找到相应的 Basic sub,就会发生运行时错误,disposing()
尤其如此,因为在执行 Basic 程序之后,广播对象可能早就被析构了。在这种情况下,Basic 会显示 "Method not " found 消息。但不会说明无法找到哪个方法或 Basic 为何查找方法。
我们将要侦听 Basic 程序库容器的事件。我们对 工具 - 宏 - 管理对话框 中用户操作所触发的事件进行的简单实现时会显示两个消息框,一个消息框包含相应的侦听器方法名称,另一个消息框包含事件结构的 Dbg_Properties
。对于 disposing()
方法,事件对象的类型为 com.sun.star.lang.EventObject。其他所有方法都属于 com.sun.star.container.XContainerListener,因此,事件对象的类型为 com.sun.star.container.ContainerEvent。该类型是从 com.sun.star.lang.EventObject 派生出来的,并且包含与容器相关的附加信息。
如果不需要事件对象,实现时可以不考虑其参数。例如,disposing()
方法可以为:
' Minimal implementation of Sub disposing Sub ContListener_disposing End Sub
可以像访问其他结构对象一样,访问传送到侦听器方法的事件对象。以下代码说明 elementRemoved()
方法的增强实现,该方法分析 com.sun.star.container.ContainerEvent,以显示从 Library1
删除的模块名称并显示模块源代码:
sub ContListener_ElementRemoved( oEvent ) MsgBox "Element " + oEvent.Accessor + " removed" MsgBox "Source =" + Chr$(13) + Chr$(13) + oEvent.Element End Sub
用户删除 Module1 时,ContListener_ElementRemoved()
会显示以下消息框:
实现所有必需的侦听器方法时,通过调用相应的 add 方法将侦听器添加到广播对象。为了注册 XContainerListener
,容器中的相应注册方法为 addContainerListener()
:
Dim oLib oLib = BasicLibraries.Library1 ' Library1 must exist! oLib.addContainerListener( oListener ) ' Register the listener
现在已永久注册容器事件的侦听器。容器事件发生时,容器会调用 Basic 代码中相应的 com.sun.star.container.XContainerListener 接口方法。
Content on this page is licensed under the Public Documentation License (PDL). |