イベント

From Apache OpenOffice Wiki
Jump to: navigation, search
doc OOo


Book.png


Apache OpenOffice のダイアログとフォームは、イベント指向型のプログラミングモデルを基に構築されているため、各コントロール要素に対してはイベントハンドラを指定できます。イベントハンドラは、特定のアクションが発生すると、定義済みの手順を実行します。イベントハンドラを利用して、ドキュメントの編集やデータベースのオープンをはじめ、他のコントロール要素へのアクセスもできます。

Apache OpenOffice のコントロール要素は、様々な状況で発生する各種のイベントに対応しています。これらのイベントは、4 つのグループに分かれます。

  • マウス制御: マウスの動作に関係するイベント (たとえば単なるマウスポインタの移動や、画面上の特定部分のクリックなど)
  • キーボード制御: キーボードのキーストロークで発生するイベント
  • フォーカス変更: コントロール要素が有効化または無効化されている場合に、Apache OpenOffice が実行するイベント。
  • コントロール要素固有のイベント: 特定のコントロール要素のみに発生するイベント。

イベントを利用した処理を行う場合は、Apache OpenOffice の開発環境で関連するダイアログを構築して、必要なコントロール要素やドキュメント (イベントをフォームに適用する場合) を用意しておく必要があります。

OpenOffice.org Basic の開発環境

上の図は Apache OpenOffice Basic の開発環境を示したもので、このダイアログウィンドウには 2 つのリストボックスが配置されています。2 つのリストボックスの間に配置されたボタンを使って、リスト内の各項目を相互に移動できます。

このレイアウトを画面に表示させる場合は、イベントハンドラからの呼び出し用の手続きを Apache OpenOffice Basic のコード内に作成するようにしてください。このような手続きは、任意のモジュール内に記述できますが、使用するモジュールは 2 つまでにすることが推奨されます。またプログラムコードの可読性を高める観点からも、これらの手続き名には、その機能を簡潔に示す名前をつけておくべきです。マクロから汎用プログラムの手続きに直接ジャンプさせると、プログラムコードが不明瞭になる可能性があります。バグ修正も含めたプログラムコード全体の管理性を高めておくには、たとえそれがターゲットとなる手続きを呼び出すだけの処理であっても、イベントハンドル用のエントリポイントとして利用する手続きを 1 つ別途作成するようにしてください。

次のサンプルコードは、ダイアログ上に配置された左側のリストボックス内の項目の 1 つを、右側のリストボックスへ移動します。

Sub cmdSelect_Initiated
 
   Dim lstEntries As Object
   Dim lstSelection As Object
 
   lstEntries = Dlg.getControl("lstEntries")
   lstSelection = Dlg.getControl("lstSelection")
 
   If lstEntries.SelectedItem > 0 Then
     lstSelection.AddItem(lstEntries.SelectedItem, 0)
     lstEntries.removeItems(lstEntries.SelectItemPos, 1)
   Else
     Beep
   End If
 
End Sub

この手続きを Apache OpenOffice Basic で記述したら、ダイアログエディタの属性ウィンドウを表示して、該当するイベントへの割り当てを行います。

Assign Macro ダイアログ

このダイアログには、Apache OpenOffice Basic に記述したすべての手続きが表示されます。該当するイベントに手続きを割り当てるには、手続きを選択して、割り当てボタンをクリックします。

パラメータ

特定のイベントの発生だけでは、どのような処理を行うかの判定ができない場合もあります。そのようなケースでは、何らかの追加情報が必要となります。たとえばマウスクリックに関する処理では、どの位置でマウスボタンが押されたかの情報が必要になることもあります。

Apache OpenOffice Basic では、次に示すように、オブジェクトパラメータを使用して、イベントについての詳細情報を手続きに渡すことができます。

Sub ProcessEvent(Event As Object)
 
End Sub

Event オブジェクトの構造と属性は、手続き呼び出しを発生させるイベントタイプにより異なります。

いずれのイベントタイプにせよ、すべてのオブジェクトは、関連するコントロール要素およびモデルへのアクセスを提供します。コントロール要素には、Event.Source および Event.Source.Model を使用したそのモデルでアクセスできます。

これらの属性は、イベントハンドラ内で特定のイベントをトリガーする際に使用します。

マウスイベント

Apache OpenOffice Basic では次のマウスイベントを利用できます。

Mouse moved
ユーザーによるマウスポインタの移動。
Mouse moved while key pressed
ユーザーによるキーを押しながらのマウスによるドラッグ。
Mouse button pressed
ユーザーによるマウスボタンの押し下げ。
Mouse button released
ユーザーによるマウスボタンの解放。
Mouse outside
ユーザーによるマウスポインタの現在のウィンドウ外への移動。

これらのイベントを扱うためのイベントオブジェクトは com.sun.star.awt.MouseEvent 構造体として定義されており、次の情報を取り扱うことができます。

Buttons (short)
押されたボタン ( com.sun.star.awt.MouseButton に定められた 1 つ以上の定数)。
X (long)
ピクセル単位で指定した、コントロール要素の左上隅を原点とするマウスポインタの X 座標。
Y (long)
ピクセル単位で指定した、コントロール要素の左上隅を原点とするマウスポインタの Y 座標。
ClickCount (long)
マウスイベントに関係したクリック数 (ダブルクリックは、Apache OpenOffice が十分高速に反応できる場合、1 つのイベントを開始するだけなので、ClickCount によるカウントも 1 となる)。

com.sun.star.awt.MouseButton に定義されているマウスボタン関連の定数は、次のものです。

LEFT
マウスの左ボタン。
RIGHT
マウスの右ボタン。
MIDDLE
中央マウスボタン。

次のサンプルコードでは、マウスボタンのクリック位置と押されたボタンを表示します。

Sub MouseUp(Event As Object)
 
   Dim Msg As String
 
   Msg = "Keys: "
   If Event.Buttons AND com.sun.star.awt.MouseButton.LEFT Then
     Msg = Msg & "LEFT "
   End If
 
   If Event.Buttons AND com.sun.star.awt.MouseButton.RIGHT Then
     Msg = Msg & "RIGHT "
   End If
 
   If Event.Buttons AND com.sun.star.awt.MouseButton.MIDDLE Then
     Msg = Msg & "MIDDLE "
   End If
 
   Msg = Msg & Chr(13) & "Position: "
   Msg = Msg & Event.X & "/" & Event.Y
   MsgBox Msg
 
End Sub
Documentation note.png VBA に用意されている Click および Doubleclick イベントは Apache OpenOffice Basic では利用できません。Apache OpenOffice Basic では MouseUp イベントの代わりに click イベントを使用し、Doubleclick イベントについてはアプリケーションロジックの変更で対処します。

キーボードイベント

Apache OpenOffice Basic では次のキーボードイベントを利用できます。

Key pressed
ユーザーによるキーの押し下げ。
Key released
ユーザーによるキーの解放。

どちらのイベントも、論理的 なキーアクションに対するもので、物理的 なキーアクションに直接対応するものではありません。つまり、1 つの文字の入力に複数キーのコンビネーションが必要な場合 (たとえば欧文のアクセント記号など)、これに対して Apache OpenOffice Basic が発生させるイベントは 1 つだけです。

また Shift キー や Alt キーなどの修飾キーを単独で押しても、それだけでは独立したイベントは発生しません。

Apache OpenOffice Basic は、押されたキーに関する情報を、イベントオブジェクトによりイベントハンドル用手続きに渡します。この場合は、次の属性を利用できます。

KeyCode (short)
押されたキーのコード (com.sun.star.awt.Key に定められたデフォルト値)。
KeyChar (String)
入力された文字 (修飾キーによる効果も含めた結果)。

次のサンプルコードでは、KeyCode 属性を利用して、Enter キーや Tab キーなどの制御用キーのうち何が押されたかを判定します。これらの制御用キーが押されていた場合は、該当するキーの名前を表示し、それ以外の場合は、入力された文字を表示します。

Sub KeyPressed(Event As Object)
 
   Dim Msg As String
 
   Select Case Event.KeyCode
   Case com.sun.star.awt.Key.RETURN
     Msg = "Return pressed"
   Case com.sun.star.awt.Key.TAB
     Msg = "Tab pressed"
   Case com.sun.star.awt.Key.DELETE
     Msg = "Delete pressed"
   Case com.sun.star.awt.Key.ESCAPE
     Msg = "Escape pressed"
   Case com.sun.star.awt.Key.DOWN
     Msg = "Down pressed"
   Case com.sun.star.awt.Key.UP
     Msg = "Up pressed"
   Case com.sun.star.awt.Key.LEFT
     Msg = "Left pressed"
   Case com.sun.star.awt.Key.RIGHT
     Msg = "Right pressed"
   Case Else
     Msg = "Character " & Event.KeyChar & " entered"
   End Select
   MsgBox Msg
 
End Sub

キーボード処理に使用するその他の定数については、『API Reference』の com.sun.star.awt.Key グループの定数値を参照してください。

フォーカスイベント

フォーカスイベントは、コントロール要素へのフォーカス移動を判定するためのものです。たとえばユーザーが特定のコントロール要素での処理を終えたかを判定してから、ダイアログ上にある他のコントロール要素を更新するような場合、このイベントが利用できます。以下に、利用できるフォーカスイベントを示します。

When receiving focus
要素がフォーカスを受け取ったとき。
When losing focus
要素がフォーカスを失ったとき。

フォーカスイベント関係の Event オブジェクトは、次のように構成されています。

FocusFlags (short)
フォーカスが変わります (com.sun.star.awt.FocusChangeReason に定められたデフォルト値)。
NextFocus (Object)
フォーカスを受け取るオブジェクト (When losing focus イベントのみ)。
Temporary (Boolean)
一時的に失われたフォーカス。

コントロール要素の固有イベント

これまで説明したイベントは、すべてのコントロール要素でサポートされていますが、その他にも特定のコントロール要素についてのみ定義された固有なイベントが存在します。これらのうち特に重要なものは次のイベントです。

When Item Changed
コントロール要素の値の変更。
Item Status Changed
コントロール要素の変更のステータス。
Text modified
コントロール要素の変更のテキスト。
When initiating
コントロール要素を動作させるアクションの実行 (ボタンの押し下げなど)。

イベントを処理する場合、作動時のイベント When initiating などは、単にコントロール要素をクリックするだけで発生することがあるため、その扱いには注意が必要です (たとえばラジオボタンのクリック)。このような場合、コントロール要素のステータスが実際に変更されたかについてはチェックされません。このような「ブラインドイベント」による混乱を避けるには、変更前のコントロール要素の値を広域変数に保存しておき、イベント実行時にそうした値に変化があったかを確認するという手法が使えます。

Item Status Changed イベントには、次の属性を使用できます。

Selected (long)
現在選択されているエントリ。
Highlighted (long)
強調表示されているエントリ。
ItemId (long)
エントリの ID。


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