Top > OOobbs > 17

OOobbs/17

  • サマリ: コマンドボタン・コントロールにマウスのダブルクリック・イベントを認識させることはできますか?
  • 環境: Calc
  • 状態: 解決
  • 投稿者: suou?
  • 投稿日: 2004-06-01 (火) 21:32:58

質問

コマンド・ボタンのようなDialog上のコントロールにマウスのダブルクリック・イベントに対してマクロを登録したいと思っています。しかし、PropertiesのEventsタブをアクティブにしてもそのなかにダブルクリック・イベントが見当たりません。

ダブルクリックに応じたマクロを登録する方法があったら教えていただけませんか?

なければ、もうひとつ、別のボタンを設けてそちらにダブルクリック・イベントに応じたマクロを割当てるしかありません。しかし、Dialogをすっきりさせておくために、コントロールをなるべく増やさないためにダブルクリック・イベントを認識する方法を知りたいのです。

回答

  • とりあえず,次のファイルに例を作成しました。

ファイル filedoubleclick.sxw

このファイルを見ながら説明します。このファイルのマクロには,Module1 と Dialog1 が含まれています。実行するには,Standard.Module1 の Main を実行してください。

まず,Dialog1 です。

doubleclick_image.png

Button をクリックすることで,下にある数字が増えていきます。それぞれ,シングルクリックの時には Single の数字が,ダブルクリックの時には Double の数字が増えていきます。

それでは,Module1 の中を見ていきます。

REM  *****  BASIC  *****

Dim oDialog As Object, oMDialog As Object
Dim oMouseListener As Object
Dim oButton As Object
Dim nSingle As Long, nDouble As Long

とりあえず,変数の定義です。

Sub Main はすこしずつ説明していきます。

Sub Main
  DialogLibraries.LoadLibrary("Standard")
  oDialog = createUnoDialog(DialogLibraries.Standard.Dialog1)
  oMDialog = oDialog.getModel()

ダイアログを読み込んで,ダイアログを作成しています。ダイアログのモデルオブジェクトも oMDialog 変数に保存しています。

  oMouseListener = CreateUnoListener("MouseListener_", "com.sun.star.awt.XMouseListener")

この oMouseListener がこのマクロの中で一番,重要です。CreateUnoListener 関数でリスナーを作成します。この関数は OOoBasic の runtime 関数です。

CreateUnoListener の二つの引数の一つ目は,そのリスナーに割り振る文字列です。この文字列は,形式が決まっています。

文字列_

の形式とします。(文字列にアンダースコアを繋げる)

つぎに,二つ目の引数は作成するリスナーです。これは,用途に応じたリスナーを選択してやります。リスナーはさまざまにありますので, API Reference を参照します。

まず,oMouseListener にマウスのクリックなどを監視?するためのリスナーを作成しました。

  'DbgInfo2sheet(oMouseListener)
  oButton = oDialog.getControl("ButtonCB")
  oButton.addMouseListener(oMouseListener)

ダイアログにあるボタン (ボタンの名前は ButtonCB) のオブジェクトを取得しておきます。取得したボタンのオブジェクトに,先ほど作成したマウスリスナーを追加しています。

  nSingle = 0
  nDouble = 0
  oMDialog.SingleL.Label = nSingle
  oMDialog.DoubleL.Label = nDouble

シングルクリックとダブルクリックを数えて保存しておくための変数を初期化して,それぞれのラベルに初めの値を表示します。

  oDialog.execute()

ダイアログを表示します。

  oButton.removeMouseListener(oMouseListener)
  oDialog.dispose()
End Sub

マクロを終了する前に,追加したマウスリスナーを削除しておきます。

リスナーの削除は重要なことです。メインのウィンドウの選択変更リスナーを追加したままでマクロを終了すると大変なことになったことがあります。マクロを終了する前に,開放されない可能性のあるオブジェクトのリスナーは削除しておきましょう。

次の部分は,マウスでシングルクリックがクリックされたときと,ダブルクリックされたときに実行される Sub routine を用意しておきます。

Sub SingleClicked
  nSingle = nSingle + 1
  oMDialog.SingleL.Label = nSingle
End Sub
Sub DoubleClicked
  nDouble = nDouble + 1
  oMDialog.DoubleL.Label = nDouble
End Sub

ともに,回数をカウントしている変数の値を 1 だけ増やしてやってから,ラベルに数字を表示しなおします。

最後の部分はまたまた重要な部分になります。先ほど作成したマウスリスナー oMouseListener に関する部分です。

リスナーは,呼び出されたときにその呼び出しに応じたメソッドが実行されます。その呼び出しがかかるイベントはリスナーそれぞれで決まっています。マウスリスナーの場合には,「マウスのボタンが押されたとき」,「マウスのボタンがリリースされたとき」,「マウスのカーソルが入ってきたとき」,「マウスのカーソルが出て行ったとき」にそのマウスリスナーが呼び出されます。

それぞれの呼び出しのために一つずつ Sub routine を作成,準備しておきます。リスナーが呼び出されたときにはその Sub が実行されます。

ここで,用意する Sub routine の名前は,決まった形式で名前を付ける必要があります。使用するマウスリスナーを作成したときの CreateUnoListener 関数の一つ目の引数の文字列を使って名前を付けます。形式は,一つ目の引数の文字列にメソッド名を繋げる形式です。

'-- Part of MouseListener's Methods. --
Sub MouseListener_disposing() 'Must necessary.

End Sub

Sub MouseListener_mousePressed(oEvent)
Dim nC As Long
  nC = oEvent.ClickCount
  If nC = 1 Then
    SingleClicked
  Elseif nC > 2 Then
    DoubleClicked
  End If
End Sub

Sub MouseListener_mouseReleased(oEvent)

End Sub

Sub MouseListener_mouseEntered(oEvent)

End Sub

Sub MouseListener_mouseExited(oEvent)

End Sub

5 つの Sub routine をマウスリスナーのために用意しました。空の Sub routine もありました。はじめの MouseListener_disposing() はリスナーが作成されたときに実行されるもので,すべてのリスナーが disposing メソッドを持っていて,これはどのリスナーでも同じメソッド名で作成します。

ほかの 4 つのメソッドを利用するもののうち,MouseListener_mousePressed(oEvent) がマウスのボタンがクリックされたときに実行されるます。

この MouseListener_mousePressed の引数 oEvent はイベントを参照するための引数です。この変数 oEvent を通じてリスナーが呼び出されたときの情報を参照することができます。マクロの中の,次の部分でマウスのボタンがクリックされた回数を取得しています。ClickCount プロパティーでマウスがクリックされた回数を参照します。

Dim nC As Long
  nC = oEvent.ClickCount

この回数でシングルクリックされたか,ダブルクリックされたかを判断します。ダブルクリックを 2 回クリックされたときにするか, 2 回以上クリックされたときにするかは,人それぞれでしょう。

空の Sub routine がありますが,これらのイベントが生じた際にリスナーが呼び出されると対応する Sub がないことによるエラーが発生するので,一応作成しておきます。

これで完成。

補足ですが,

Methods of object "com.sun.star.awt.XMouseListener"
SbxEMPTY queryInterface (
SbxOBJECT )
SbxVOID disposing (
SbxOBJECT )
リスナーが作成されたとき
SbxVOID mousePressed (
SbxOBJECT )
マウスのボタンが押されたとき
SbxVOID mouseReleased (
SbxOBJECT )
マウスのボタンがリリースされたとき
SbxVOID mouseEntered (
SbxOBJECT )
マウスのカーソルが入ってきたとき
SbxVOID mouseExited (
SbxOBJECT )
マウスのカーソルが出て行ったとき
Properties of object "com.sun.star.awt.MouseEvent"
SbxOBJECT Source呼び出したリスナーの属するオブジェクト
SbxINTEGER Modifiersマウスクリック時に押されていたボタン
SbxINTEGER Buttonsクリックされたマウスのボタン
SbxLONG Xマウスカーソルの位置 X
SbxLONG Yマウスカーソルの位置 Y
SbxLONG ClickCountクリックされた回数
SbxBOOL PopupTriggerイベントがポップアップメニューのトリガーとするかどうか
SbxSTRING Dbg_SupportedInterfaces
SbxSTRING Dbg_Properties
SbxSTRING Dbg_Methods
  • はにゃ?? 2004-06-02 (水) 01:50:04
  • 詳細なご説明に感謝します。早速試し旨くいきました。解決です。私の場合、二つのボタンでダブルクリックを認識させる必要がありましたが、どちらのボタンがダブルクリックされたかは、oEvent.Source.Model.Nameで区別することができ、それに応じてプロシジャを割り当てて旨くいきました。これでまた先に進めます。ありがとうございました。 -- suou? 2004-06-02 (水) 13:00:33


Attach file: filedoubleclick.sxw 1127 download [Information] filedoubleclick_image.png 702 download [Information]

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