A. Basic
OpenOffice.org Basic は組み込まれたマクロ用の言語です。コンポーネントを実装することはできませんがリスナーは独自の方法で利用可能です。OOo Basic と短く呼ばれることもあります。
言語の詳細については下記などを参照してください。
- OpenOffice.org BASIC Programming Guide
- http://wiki.services.openoffice.org/wiki/Documentation/BASIC_Guide
- OpenOffice.org Basic
- http://ja.wikibooks.org/wiki/OpenOffice.org_Basic
- OpenOffice.org Basic ヘルプ
- 組込み
OOo Basic ではメソッド名の大文字と小文字を区別することなく記述できますが、他の言語へ移植するときのことなどを考えると IDL の定義どおりのメソッド名で書いたほうがいいでしょう。
マクロを書く
OOo Basic でマクロを書くにはメニューからツール - マクロ - マクロの管理 - OpenOffice.org Basic を選択します。この管理ダイアログからマクロのライブラリやモジュールの管理が行えます。モジュールを選択して編集ボタンを押すと Basic IDE が開いてコードを編集できます。
UNO の値
他の言語で書くよりも各種ランタイム関数がショートカットなどを提供しています。
サービスのインスタンス化
便利なランタイム関数が用意されています。XComponentContext などが不要ですが乱用すると別の言語へ移植するときに複雑化することがあります。
sfa = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
css.lang.XMultiComponentFactory からサービスをインスタンス化する必要があるときには次のようにします。
smgr = GetDefaultServiceManager()
oObj = smgr.createInstanceWithArguments("service_name", Array(oObj))
Desktop にアクセスするランタイム関数も用意されています。この関数名は実際に StarDesktop があった頃の名残です。
desktop = StarDesktop()
Structs
二種類の方法があります。
aSize = CreateUnoStructs("com.sun.star.awt.Size")
もう一つの方法では struct の配列も簡単に作成できます。
Dim aPoint As New com.sun.star.awt.Point ' 配列では Dim aPoints(2) As New com.sun.star.awt.Point
Enums
次のようにモジュール名から順に値までを指定します。文字列にしてはいけません。
oText.FontSlant = com.sun.star.awt.FontSlant.ITALIC
例外
例外はエラーとしてキャッチすることはできますが送出することができません。
Sub main On Error GoTo Handler: ' なにかが例外を発生 Handler: msgbox Error End Sub
例外処理やエラーコードについては OpenOffice.org のヘルプを参照してください。
リスナー
OOo Basic ではクラスを作成できないためインターフェースが必要なリスナーを作ることができないため、特別なランタイム関数 CreateUnoListener が用意されています。関数の最初の引数には "_" で終わる接頭語を指定、二つ目の引数には作成するリスナーのインターフェースを指定します。接頭語は次のように利用されます。
Sub AddListener() DialogLibraries.loadLibrary("Standard") dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1) oListener = CreateUnoListener("Mouse_", "com.sun.star.awt.XMouseListener") dlg.addMouseListener(oListener) dlg.execute() dlg.removeMouseListener(oListener) dlg.dispose() End Sub Sub Mouse_mousePressed(oEv As com.sun.star.awt.MouseEvent) msgbox "Count: " & CStr(oEv.ClickCount) End Sub Sub Mouse_mouseReleased(oEv As com.sun.star.awt.MouseEvent) End Sub Sub Mouse_mouseEntered(oEv As com.sun.star.awt.MouseEvent) End Sub Sub Mouse_mouseExited(oEv As com.sun.star.awt.MouseEvent) End Sub Sub Mouse_disposing(oEv As com.sun.star.lang.EventObject) End Sub
css.awt.XMouseListener インターフェースには四つのメソッドがありますがこれらを接頭語 + メソッド名を組み合わせた名前のプロシージャまたは関数を定義しておきます。必要のないメソッドも内容は空で構わないので定義しておかなければいけません。
disposing メソッドは XMouseListener インターフェースにはありませんがリスナーのベースインターフェースである css.lang.XEventListener のメソッドです。このメソッドはいつも定義するようにして下さい。
色々
よく必要になる色々なこと。
URL - FilePath 変換
ファイルパスから URL。
sURL = ConvertToURL("/home/user/Desktop/Test.ods")
URL からファイルパス。
sPath = ConvertFromURL("file:///home/user/Desktop/Test.ods")
ライブラリ
OOo Basic のライブラリには二種類あります。アプリケーションに所属するものとドキュメントに所属するものです。ライブラリへはショートカットとして BasicLibraries ステートメントが用意されています。このステートメントは特に指定がなければそのコードが所属しているライブラリコンテナを示します。
BasicLibraries.Library1
このコードがドキュメントにあるときにはドキュメントに所属しているライブラリが指定され、コードがアプリケーションにあるときにはアプリケーションに所属しているライブラリが指定されることになります。
一方でドキュメントにあるコードからアプリケーションにあるライブラリが必要なときには GlobalScope キーワードを利用します。
Globalscope.BasicLibraries.Library1
利用したいライブラリが読み込まれていなければ次のようにして読み込む必要があります。
Globalscope.BasicLibraries.loadLibrary("Tools")
モジュール単位での読み込みはできずライブラリ単位になります。
Standard の名前のライブラリは特殊でアプリケーションが起動したときまたはドキュメントが読み込まれたときにロードされています。
ダイアログ
ダイアログライブラリにも二種類ありライブラリと同様にアプリケーションとドキュメントに所属しています。DialogLibrareis ステートメントを利用する以外はライブラリと同様です。
DialogLibrareis.Library1 GlobalScope.DialogLibrareis.Library1 ' いつもアプリケーションのライブラリ
ダイアログを作成するランタイム関数 CreateUnoDialog が用意されています。利用したいダイアログが所属するライブラリを先に読み込んでおく必要があります。
Sub createDialog() DialogLibrareis.loadLibrary("Library1") oDialog = CreateUnoDialog(DialogLibrareis.Library1.Dialog1) oDialog.execute() End Sub
ダイアログライブラリの Standard ライブラリは自動的に読み込まれるわけではないので利用する前に読み込まなければいけません。
Calc 関数
Calc のシート上で利用できる関数を簡単に定義できます。しかし、この関数には問題点があります。シート関数は Standard ライブラリに入っている必要がありますがこのライブラリは拡張機能などから配布することはできません。そのため人に配布しにくいという難点があります。また、実行速度が遅いので注意する必要があります。
Function Increment(v) Increment = v + 1 End Function
=INCREMENT(A1) といったようにセルのアドレスで指定された場合にはセルの内容の種類に応じて値が渡されます。セルオブジェクトが渡されるわけではないので、この関数内ではどのセルから呼び出されたかどうかは判断できません。位置を特定できる引数を与える必要があります。
制限
いくつか知られている制限があります。
ファイル容量
一つのモジュールは 64k 文字数以下にすることが推奨されています。複数のモジュールに分割してください。
バグ
多数のバグがあるので注意が必要です。バージョンに依存します。