Top > OOoBasic > Generic > listener

リスナー Edit

リスナーというのは,ある動作が行われるのを監視するものです。動作以外にも変化などを検出するリスナーもあります。リスナーを使うことでその動作や変化の検出に対して何かの処理を割り当てることができます。

リスナーは種類によって監視する動作が異なります。また,オブジェクトに対して使えるリスナーはサポートされているものだけで,使いたいものを勝手に使うといったことはできません。

リスナーの種類 Edit

リスナーはインターフェースとして定義されています。そのため,X...Listener というインターフェース名を持っているのがリスナーです。

リスナーが呼び出されるとき,動作,変化に対応したそのリスナーインターフェースが備えているメソッドが呼ばれます。たとえば,XActionListener には actionPerformed というメソッドがありますが,このメソッドはこのリスナーを割り当てたボタンなどが動作したときに呼び出されます。

リスナーを使用する際には,リスナーを作成してそのリスナーインターフェースの持つメソッドのための動作を記述してやる必要があります。

リスナーの作成 Edit

リスナーを作成する方法です。OOoBasic ではリスナーは CreateUnoListener ランタイム関数を使用して作成します。

CreateUnoListener の使い方は次のとおりです。(具体的な例については下で取り上げます。)

xListener CreateUnoListener( [in]string sName, [in]string sListenerName )
xListener
作成されるリスナー (戻り値)
string sName
作成されるリスナーのためのメソッドの接頭語 ("文字列" + "_" の形式で)
sListenerName
作成するリスナーインターフェース名

この CreateUnoListener を使用すると Object 型 (実際はインターフェース) として xListener が戻されます。ここで,sName はリスナーを作成するときに作成するメソッドのための接頭語です。これについては詳しく後ほど説明します。sListenerName は作成したいリスナーインターフェース名です。

例を挙げてリスナーのための接頭語 sName などについて説明します。

リスナーの作成例 Edit

例として XActionListener を取り上げます。この XActionListener は,ダイアログのコマンドボタンなどでサポートされているインターフェースで,ボタンの動作を検出して呼び出されます。

まず,このリスナーを CreateUnoListener ランタイム関数を使用して作成します。

Dim oActionListener As Object
  oActionListener = CreateUnoListener("ActionListener_", "com.sun.star.awt.XActionListener")

ここで,CreateUnoListener の二つの引数について説明します。まず,一つ目の引数 "ActionListener_" は作成されるリスナーのメソッドが呼び出されるときに実行される Sub を定義する際に使用する接頭語を指定します。これについてはつづいて説明します。二つ目の引数 "com.sun.star.awt.XActionListener" は作成するリスナーのインターフェース名です。

この XActionListener は IDL Reference をみると actionPerformed というメソッドを持っていることが分かります。このメソッドは動作を検出したときに呼び出されるメソッドです。このメソッドが呼び出されたときに実行したい内容を次のようにして定義します。

Sub ActionListener_actionPerformed()
  MsgBox "Action Performed!"
End Sub

ここで重要なことは,Sub の名前を「リスナーのメソッドのための接頭語」+「メソッド名」とすることです。接頭語は "文字列" + "_" という形式になっていました。この形式はここで必要になります。

また,全てのリスナーは共通のメソッド disposing を持っています。これはリスナーが処理されるときに呼び出されます。そのため,全てのリスナーにおいて定義しておく必要があります。ここでの例でも次のように定義しておきます。

Sub ActionListener_disposing()
End Sub

空です。何も動作させたくなければ空で定義しておきます。

また,ここで例として取り上げた ActionListener は一つのメソッドしか持っていませんでしたが,多くのリスナーは複数のメソッドを持っています。そのときには全てのメソッドについて一応定義を記述する (上記の disposing のように「空」でもよい) ことをお勧めします。未定義によるエラーを未然に防ぐことができます。

イベント Edit

リスナーを使用して,リスナーが呼び出されて定義したメソッドが呼び出されたときに,イベントを取得することができます。このイベントからはリスナーを呼び出す結果を生み出したそのオブジェクトを取得することもできます。

イベントを取得するには,リスナーのためのメソッドを定義する際に Sub の引数にイベントのための変数を一つ指定しておきます。たとえば,次のようにします。

Sub ActionListener_actionPerformed(oEvent)
  ...  
  oEvent. ...
  ...
End Sub

指定した変数を使って取得したイベントを使った動作が定義できます。このイベントからリスナーを呼び出したオブジェクトを取得するにはこのイベントオブジェクト (oEvent) の Source プロパティーを使用します。

Sub ActionListener_actionPerformed(oEvent)
  MsgBox oEvent.Source.Dbg_Properties
End Sub

このようにするとリスナーを呼び出したオブジェクトの Dbg_Properties プロパティーを表示できます。

また,イベントは Source 以外のプロパティーを持っている場合もあります。

リスナーの追加と削除 Edit

リスナーの作成で作成したリスナーは,適切なオブジェクトへ追加して使用します。また,使わなくなったリスナーは削除してやることが必要です。

リスナーの追加と削除を正しく行わなければさまざまな弊害を起こします。たとえば,追加が正しくなければうまく動作しません。リスナーの削除はもっと深刻な問題を起こします。削除し忘れたリスナーはいつまでも削除されるまで動作し続けます。同じリスナーを別に実行したマクロで再度追加すれば,追加された回数だけのリスナーが呼び出されます。削除できなくなったリスナーは OpenOffice.org のファイルを閉じることでしか削除できなくなります。リスナーは便利ですが,正しくリスナーの追加と削除を行ってください。

リスナーの追加 Edit

リスナーの追加は対応するオブジェクトの持つ add..xxx..Listener メソッドで行います。このとき,..xxx.. の部分はリスナー名のインターフェースの X を省いた名前です。これらのメソッドの引数は上記の方法で作成されたリスナーオブジェクトです。また,このときリスナーオブジェクトを保持する変数は Global 変数として定義されていなければリスナーの追加と削除を正しく行えません。

リスナーの削除 Edit

リスナーの削除は追加したオブジェクトに対して remove..xxx..Listener メソッドを呼び出してやります。引数として追加したリスナーオブジェクトが必要です。そのため,リスナーオブジェクトを作成するときには Global 変数として定義した変数に保存しておきます。

リスナーたち Edit

IDL Reference に記載されているリスナーを並べてみます。

com.sun.star.beans.

  • XPropertiesChangeListener

com.sun.star.awt.

  • XActionListener
  • XActivateListener
  • XAdjustmentListener
  • XFocusListener
  • XItemListener
  • XKeyListener
  • XMenuListener
  • XMouseListener
  • XMouseMotionListener
  • XPaintListener
  • XSpinListener
  • XTextListener
  • XTopWindowListener
  • XWindowListener

.lang.XEventListener Edit

この com.sun.star.lang.XEventListener インターフェースはイベントリスナーのための基盤となるインターフェースであり,OOoBasic でリスナーとして使用する場合には役に立ちません。

.document.XEventListener Edit

com.sun.star.document.XEventListener リスナーを作成してあとでリスナーをオブジェクトに addEventListener メソッドで追加するときには注意が必要です。

com.sun.star.document.XEventListener インターフェースをサポートしているオブジェクトは com.sun.star.lang.XEventListener インターフェースもサポートしています。この二つのインターフェースを追加するメソッドは同じ名前を持っていて addEventListener です。リスナーを追加するメソッドとリスナーが対応していなければうまく動作しません。そのためメソッドを正確に呼び出す必要があります。

Global oEventListener As Object

Sub Main
Dim oDoc As Object
  oDoc = ThisComponent
  oEventListener = createUnoListener(_
         "EventListener_","com.sun.star.document.XEventListener")
  oDoc.com_sun_star_document_XEventListener_addEventListener(oEventListener)
End Sub

Sub EventListener_disposing()
End Sub

Sub EventListener_notifyEvent(oEvent)
  MsgBox oEvent.EventName
End Sub

まとめ Edit

リスナーは使い慣れないと分かりにくいものなのでまとめておきます。

  • リスナーは CreateUnoListener ランタイム関数を使用して作成する
    • 一つ目の引数は,接頭語で "文字列" + "_" (アンダースコア) の形式
    • 二つ目の引数は,インターフェース名
  • リスナーのメソッドのための定義を行う
    • 定義の Sub 名はリスナーを作成したときの "接頭語" + "メソッド名"
    • 全てのメソッドについて定義を行う (一応,「空」でも)
    • disposing メソッドについても定義する
  • イベント

その他 Edit

com.sun.star.document.XEventBroadcaster
com.sun.star.document.XEventListener
com.sun.star.lang.XComponent
com.sun.star.lang.XEventListener
com.sun.star.accessibility.XAccessibleEventBroadcaster
com.sun.star.accessibility.XAccessibleEventListener

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes