侦听器

From Apache OpenOffice Wiki
Jump to: navigation, search



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() 会显示以下消息框:

ContListener_ElementRemoved 消息
ContListener_ElementRemoved 事件回调


实现所有必需的侦听器方法时,通过调用相应的 add 方法将侦听器添加到广播对象。为了注册 XContainerListener,容器中的相应注册方法为 addContainerListener()

 Dim oLib
 oLib = BasicLibraries.Library1 ' Library1 must exist!
 oLib.addContainerListener( oListener ) ' Register the listener
Tip.png 整个 OpenOffice.org API 中使用的命名模式为 XSomeEventListener <> addSomeEventListener()


现在已永久注册容器事件的侦听器。容器事件发生时,容器会调用 Basic 代码中相应的 com.sun.star.container.XContainerListener 接口方法。

Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages