*スロット ID による作業 [#bc17a691] スロット ID による作業というのは,OpenOffice.org のそれぞれの動作,作業に割り当てられたコマンドを実行するためのスロット ID を利用するものです。 この,スロット ID による方法を使用することで, API から実行することのできない作業も行うことができることがあります。 たとえば,コピーや切り取り,貼り付けといった作業は現在のところ API から行うことはできませんが,ここで取り上げるスロット ID を使って作業することで編集メニューからコピー,切り取り,貼り付けを選択した時と同じ動作を行わせることができます。 **ID [#h94fdbbf] まず,必要なのは ID を知ることです。 スロット ID は API OpenOffice.org で公開されているファイルに記載されています。http://api.openoffice.org/servlets/ProjectDocumentList にあるファイル一覧の中の slot.sxc ファイルに一覧があります。ダウンロードして Calc で開いてみてください。 以前はこのスロット ID が HTML ファイルで公開されていたのですが,現在はどこへ行ってしまったのでしょうか? また,このスロット ID は OOo のバージョンによって異なる場合があります。注意してください。 **準備 [#m6f71460] 実際にこのスロット ID を使用して実行するためにはあるオブジェクトのもつメソッドを使用する必要があります。このメソッドはフレームオブジェクトが持つメソッドです。そのため,使用するドキュメントのフレームオブジェクトを取得する必要があります。 OOo Basic ではドキュメントオブジェクトを ThisComponent などで取得します。詳細については,[[ドキュメント>OOoBasic/Generic/document]]のページを見てください。 さらに,ドキュメントオブジェクトからフレームオブジェクトを取得することが必要です。CurrentController を取得し,そのオブジェクトからフレームオブジェクトを取得します。 Sub frame Dim oDoc As Object, oCurrentController As Object Dim oFrame As Object oDoc = ThisComponent oCurrentController = oDoc.getCurrentController() oFrame = oCurrentController.getFrame() End Sub フレームオブジェクトにはいくつか面白そうなメソッドがあるので,調べてみるのもいいかもしれません。 Sub frame Dim oDoc As Object, oCurrentController As Object Dim oFrame As Object oDoc = ThisComponent oCurrentController = oDoc.getCurrentController() oFrame = oCurrentController.getFrame() Globalscope.BasicLibraries.LoadLibrary("mytools") DbgInfo2sheet(oFrame) End Sub **queryDispatch [#w554be31] 実際に,このスロット ID によるコマンドを実行するには ''queryDispatch'' メソッドを使用します。 このメソッドは,面倒なことに URL struct などを引数にとり,引数が三つあります。API リファレンスマニュアルを参照すると, queryDispatch( .util.URL URL, string TargetFrameName, SearchFlags ) -URL: URL struct で実行するスロット ID を与える -TargetFrameName: 実行するターゲットのフレーム。特殊な指定を行うほうが簡単。_self など -SearchFlags: ターゲットのフレームを探す方法を指定する。.frame.FrameSearchFlag 定数で指定する。0 は自動で検索する。 となっています。 ここでは実行例として [[ObjExport2>OOoBasic/Macros/ObjExport2]] で使用しているものを紹介します。 Sub SlotCommand( nSlotID As Integer, oLocFrame As Object ) Dim aArg() As New com.sun.star.beans.PropertyValue Dim oURL As New com.sun.star.util.URL Dim oTrans As Object Dim oDisp As Object oTrans = createUnoService( "com.sun.star.util.URLTransformer" ) oURL.Complete = "slot:" & CStr( nSlotID ) oTrans.parsestrict( oURL ) oDisp = oLocFrame.queryDispatch( oURL, "_self", 0 ) oDisp.dispatch( oURL, aArg() ) End Sub このサブルーチンを実行したいスロット ID とコマンドを実行したいフレームオブジェクトを引数として呼び出すことでスロット ID を実行します。 実際の ObjExport2 では oDocFrame をドキュメントのフレームオブジェクトに, nCopy = 5711 'SID_COPY nPaste = 5712 'SID_PASTE nSelect = 5723 'SID_SELECTALL nExport = 5829 'SID_EXPORTDOC SlotCommand( nCopy, oDocFrame ) SlotCommand( nPaste, oDrawFrame ) SlotCommand( nSelect, oDrawFrame ) SlotCommand( nExport, oDrawFrame ) としてそれぞれのスロット ID のコマンドを実行しています。コピー,貼り付け,すべてを選択,エクスポートの順に実行しています。 **queryDispatchs [#y45b2087] 複数のスロット ID を一度に実行するメソッドがあるようです。 |