Top > OOoBasic > Generic > slotid

スロット ID による作業 Edit

スロット ID による作業というのは,OpenOffice.org のそれぞれの動作,作業に割り当てられたコマンドを実行するためのスロット ID を利用するものです。

この,スロット ID による方法を使用することで, API から実行することのできない作業も行うことができることがあります。

たとえば,コピーや切り取り,貼り付けといった作業は現在のところ API から行うことはできませんが,ここで取り上げるスロット ID を使って作業することで編集メニューからコピー,切り取り,貼り付けを選択した時と同じ動作を行わせることができます。

ID Edit

まず,必要なのは ID を知ることです。

スロット ID は API OpenOffice.org で公開されているファイルに記載されています。http://api.openoffice.org/servlets/ProjectDocumentList にあるファイル一覧の中の slot.sxc ファイルに一覧があります。ダウンロードして Calc で開いてみてください。

以前はこのスロット ID が HTML ファイルで公開されていたのですが,現在はどこへ行ってしまったのでしょうか?

また,このスロット ID は OOo のバージョンによって異なる場合があります。注意してください。

準備 Edit

実際にこのスロット ID を使用して実行するためにはあるオブジェクトのもつメソッドを使用する必要があります。このメソッドはフレームオブジェクトが持つメソッドです。そのため,使用するドキュメントのフレームオブジェクトを取得する必要があります。

OOo Basic ではドキュメントオブジェクトを ThisComponent などで取得します。詳細については,ドキュメントのページを見てください。

さらに,ドキュメントオブジェクトからフレームオブジェクトを取得することが必要です。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 Edit

実際に,このスロット ID によるコマンドを実行するには queryDispatch メソッドを使用します。

このメソッドは,面倒なことに URL struct などを引数にとり,引数が三つあります。API リファレンスマニュアルを参照すると,

queryDispatch( .util.URL URL, string TargetFrameName, SearchFlags )
  • URL: URL struct で実行するスロット ID を与える
  • TargetFrameName: 実行するターゲットのフレーム。特殊な指定を行うほうが簡単。_self など
  • SearchFlags: ターゲットのフレームを探す方法を指定する。.frame.FrameSearchFlag 定数で指定する。0 は自動で検索する。

となっています。

ここでは実行例として 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 Edit

複数のスロット ID を一度に実行するメソッドがあるようです。


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