Top > OOobbs > 37
  • The added line is THIS COLOR.
  • The deleted line is THIS COLOR.
  • Go to OOobbs/37.

** [[OOobbs/37]] [#t8743d58]
-''サマリ'': EventListenerの使い方
-''環境'': Calc
-''状態'': 解決
-''投稿者'': [[suou]]
-''投稿日'': 2004-11-01 (月) 06:42:07

*** 質問 [#n5b5682e]
次のような一連のプログラムによって、ファイルを閉じるとき、印刷するときなどをとらえて、ある命令を実行させたいと思っています。しかし、RegisterListener()をrunさせた後、セーブしたり、印刷させたりしてもうんともすんとも言ってくれません。どこがいけないのでしょうか。教えて頂ければうれしいです。
 Global oListener as object
 Sub RegisterListener()
	oListener = CreateUnoListener("DL_", "com.sun.star.document.XEventListener")
	ThisComponent.addEventListener(oListener)
 End Sub	
 Sub UnRegisterListener()
	ThisComponent.removeEventListener(oListener)
 End Sub	
 Sub DL_notifyEvent(oEvent)
	Select Case oEvent.EventName
		Case "OnUnLoad"
			msgbox "OnUnLoad"
		Case "OnPrint"
			msgbox "OnPrint"
		Case "OnSaveDone"
			msgbox "OnSaveDone"
	End Select	
 End Sub
 Sub DL_disposing(oEvent)
	'Do Nothing
 End Sub	

*** 回答 [#le9e902d]
-やっと分かりました。

うまくいったコードを示します。問題点は addEventListener メソッドの部分でした。普通に使用していると分からないような事情です。

 Global oListener as object
 
 Sub RegisterListener()
 	oListener = CreateUnoListener("DL_", "com.sun.star.document.XEventListener")
 	ThisComponent.com_sun_star_document_XEventBroadcaster_addEventListener(oListener)
 End Sub	
 Sub UnRegisterListener()
 	ThisComponent.com_sun_star_document_XEventBroadcaster_removeEventListener(oListener)
 End Sub
 Sub Dl_notifyEvent(oEvent)'oListen As Object)
 	Select Case oEvent.EventName
 		Case "OnUnLoad"
 			msgbox "OnUnLoad"
 		Case "OnPrint"
 			msgbox "OnPrint"
 		Case "OnSaveDone"
 			msgbox "OnSaveDone"
 	End Select	
 End Sub
 Sub Dl_disposing(oEvent)
 	'Do Nothing
 End Sub

Developer's Guide の 6.2.6 Document Events の部分をみるとドキュメントイベントについての記述があります。

addEventListener と removeEventListener メソッドは他にもあり,それはドキュメントで問題を引き起こしているようです。普通に ThisComponent.addEventListener(...) として呼び出すと com.sun.star.lang.XComponent のメソッドが呼ばれるようです。そこで,確実に com.sun.star.document.XEventBroadcaster の方のメソッドを呼び出すために上記のような記述を行います。

あとで別ページを作成しようと思います。

-- [[はにゃ?]] &new{2004-11-01 (月) 18:51:05};
-addEventListenerを厳密に指定しないとだめなのですね。これでやってみたらOnPrintとOnSaveDoneはうまくいきました。感激です!ありがとうございました。
 しかし、OnUnloadはうまくいっていないようです。Case文にoEvent.Nameが"OnPrepareUnload"の場合を付け加えてみましたがやはり反応してくれないようでした。実はファイルを閉じるまでEventListenerに目を覚ましておいて貰い、ファイルを閉じるときにDocument EventListenerだけでなく、他のEventListenerもあわせてremoveするsubを実行させてきれいに終わりたいなと思っていたのです。75%解決ということにさせて下さい。-- [[suou]] &new{2004-11-01 (月) 19:59:16};
-75% 解決といわずに,"OnUnLoad" を "OnUnload" にしてみてください。"エル" は小文字です。 -- [[はにゃ?]] &new{2004-11-01 (月) 21:46:49};
-OOoBasicは大文字小文字を区別しないと思っていたのですが、Case Sensitiveなこともあるのですね。小文字に変えたら、OnUnloadもOnPrepareUnloadも反応してくれました。こりゃ、すごいわ!ありがとうございます。100%解決です。 -- [[suou]] &new{2004-11-02 (火) 06:30:57};
-OOoBasic の If や Case 文などは別です。また,API のメソッドや enum ,const などでも大文字と小文字には注意したほうがいいと思います。 -- [[はにゃ?]] &new{2004-11-02 (火) 11:31:49};
-OOoBasicはとても懐が深いと思うのですが、それはOOoBasicがJavaでできることをお裾分けしているところからきていると理解したらいいのでしょうか?それならば、いずれJavaも学習しなければと思います。でも、今は、OOoBasicにやって貰いたいことをやらせるようになるだけで精一杯です。はにゃさんのようにDeveloper's Guideを読んでどうすればいいか判断できるようになれればすごいなと思います。 -- [[suou]] &new{2004-11-02 (火) 20:43:04};

#comment

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