イベント

From Apache OpenOffice Wiki
< JA‎ | Documentation/BASIC Guide
Revision as of 02:09, 13 November 2008 by G11nAutomation (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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 つのリスト\'83\'7bックスの間に配置された\'83\'7bタンを使って、リスト内の各項目を相互に移動できるものとします。

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

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

Sub cmdSelect_Initiated
 
   Dim objList 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 に記述したすべての手続きが表示されます。▼該当するイベントに手続きを割り当てるには、手続きを選択して、割り当て \'83\'7bタンをクリックします。

▼パラメータ

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

Apache OpenOffice Basic では以下のような方法で、イベントから手続きに対してオブジェクトパラメータを渡すことができます。

Sub ProcessEvent(Event As Object)
 
End Sub

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

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

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

▼\'83\'7dウスイベント

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)
マウスイベントに関係したクリック数 (ダブルクリックは 1 つのイベントとして処理されるため、Apache OpenOffice が十分高速に反応できる場合、ClickCount によるカウントも 1 となる)。

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

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

▼以下のサンプルコードでは、\'83\'7dウス\'83\'7bタンのクリック位置と押された\'83\'7bタンを\'95\'5c示します。

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

Template:Documentation/Note

▼キー\'83\'7bードイベント

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