OOobbs/88
質問
OOo2.0.0のcalcで、シート上の任意のセル(例えばセル[D5])をマウスでダブルクリックした時に、クリックしたセルの列番号j=3、行番号i=4、を表示する下記の様なマクロをつくりたいのですが、 Sub DBL_click() MsgBox "列="+Str(j) + " 行="+Str(i) セルに{ESC}信号送信 End Sub (1)ダブルクリックイベントを発生させる方法 (2)クリックしたセルの列/行番号をピックアップする方法。 (3)セルをダブルクリックすると、セルの編集モードに入ってしまうので、それをマクロから{ESC}信号を発生させて編集モード解除する方法。 をご教示頂きたく宜しくお願い致します。 追伸:上記お尋ねの内、(2)の『クリックしたセルの列/行番号を取得する方法』は、この掲示板過去記事から下記のマクロで出来ることが分かりましたので、(1)と(3)についてお教え下さい。 Sub Cell_Row Dim oSelection As Object oSelection=ThisComponent.CurrentController.Selection i=oSelection.CellAddress.Row j=oSelection.CellAddress.Column End Sub 回答
global oMouseClickHandler As Object global oController as Object global oSheet as Object Sub init oSheet=ThisComponent.Sheets(0) oController =ThisComponent.getCurrentController() oMouseClickHandler = CreateUnoListener("Ms_","com.sun.star.awt.XMouseClickHandler") call Main End Sub Sub Main oController.addMouseClickHandler(oMouseClickHandler) End Sub Sub Ms_mousePressed(oEvent) oSelection=oController.Selection rw=oSelection.CellAddress.Row col=oSelection.CellAddress.Column if rw>=0 and rw<=3 then if col>=0 and col<=1 then oCell=oSheet.getCellByPosition(col,rw) oCell.setString("ok") end if end if call Main End Sub この結果、アクティブなセルが[A1:B4]エリア内にある状態で、そのエリア内のセルを初回にクリックした時だけ、OKの文字をセルに記入する事に成功(ただし、クリックして移動したセルではなく、その直前にアクティブだったセルに記入されてしまう)したのですが、続く2回目のクリックからは反応が有りません。 また、初回に[A1:B4]エリアの外でクリックした後、そのエリア内でクリックしても反応が有りません。 私としては『Sub Ms_mousePressed(oEvent)』関数の中の最後に、『Main』関数を呼び出す事で、『Main』関数の中の『oController.addMouseClickHandler(oMouseClickHandler)』を継続動作させ、何度クリックしても反応が続くように様にしたつもりだったのですが、1回しかイベントハンドラが機能してくれません。 どの様にすれば良いのかお分かりになりましたらお教えください。宜しくお願いいたします。-- Kuma? 2006-01-12 (木) 22:18:32
2回目の反応がない件については、ハンドラでの戻り値が設定されていないことが原因のようです。 MouseClickHandler ではmousePressed(),mouseReleased()の戻り値にはBooleanを返すようにします。 以下にサンプルを示します。 Global xMouseHdlr As Object Global oNULL As Object '---SpreadSheetViewにマウスクリックハンドラを登録 Sub Register oController = ThisComponent.getCurrentController xMouseHdlr = CreateUnoListener _ ("Ms_","com.sun.star.awt.XMouseClickHandler") oController.addMouseClickHandler (xMouseHdlr) End Sub '---マウスクリックハンドラを削除 Sub unRegister ( ) ThisComponent.getCurrentController.removeMouseClickHandler (xMouseHdlr) xMouseHdlr = oNULL end Sub '---A1からB4までのセルをダブルクリックした場合"ok"と表示 Sub Ms_mousePressed (oEvent) As Boolean If oEvent.ClickCount >= 2 Then oSelection = ThisComponent.getCurrentController ( ).getSelection ( ) If oSelection.SupportsService ("com.sun.star.sheet.SheetCell") Then addr = oSelection.CellAddress If (addr.Sheet=0) And (addr.Column<=1) And (addr.Row<=3) Then oSelection.setString("ok") Ms_mousePressed = True Exit Sub Endif Endif Endif Ms_mousePressed = False End Sub 上記の例では、特定セルをダブルクリック以上した時のみ True を返しています。これにより本来の View の動作( Cell を編集モードにする)を抑止できるようです。 Sub Ms_mouseReleased (oEvent) As Boolean Ms_mouseReleased = False End Sub Sub Ms_disposing ( ) End Sub mouseReleased()の方は False を返すようにしています。 残念ながら、動かしてみると反応がよくありません。シングルクリック仕様で作成されることをお勧めします。 EnhancedMouseClickHandlerを使うと、セルが選択される前にセル位置を取得することができて便利ですよ。-- Harada? 2006-07-28 (金) 23:22:48
回答が来ているとは思わず、掲示板をしばらく見過ごしていました。お礼が遅くなって申し訳ありません。早速教えて頂いたコードを実行しましたら結果は完璧でした。本当に有難うございました。 |