Extensions development basic ja
最初のチュートリアル
このページでは OpenOffice.org Basic でマクロを書くための最初のマニュアルを提供します。ある程度のプログラミング経験があることを前提とします。このページをより読みやすいように編集してください。役立つ内容が見つかるといいと思います。
すでに Basic の知識を持っているのであれば、変更して利用するためのラッパーや例が必要でしょう。
コードを書く場所は?
OpenOffice.org Basic のコードはライブラリ内のモジュールに保存されています。ライブラリには次の種類があります。
- 共有 (ネットワークインストール - OOo マクロ & ダイアログ)
- 現在のユーザーのみ (マイマクロ & ダイアログ)
- ドキュメントまたはテンプレート内部。ドキュメント内部に保存したコードはそのドキュメントが開かれたときにのみ利用できます。
ドキュメントまたはテンプレートに保存されていないライブラリ (共有または現在のユーザーのみのライブラリ) は "OpenOffice.org ライブラリ" として参照されます。
OpenOffice.org ライブラリが入っている実際のフォルダをみつけるには次のようにします。
ツール > オプション... > OpenOffice.org > パス > BASIC.
注意 | オペレーティングシステムのコマンドを使用してライブラリをコピーまたは移動しないでください。かわりにマクロの管理またはパッケージマネージャを使用してください。 |
モジュールを含むライブラリの最大サイズは 64 kb です。一つのライブラリに保存できるモジュールは 16,000 までです。
よりくわしい情報はオンラインヘルプのモジュールとライブラリの項目を見てください。
IDE を使用する
最初に IDE を使用するには次のようにします。
OpenOffice.org 1.1.x では次のようにします。 ツール > マクロ > マクロ... >
OpenOffice.org 1.9.x もしくはそれ以上のバージョンでは次のようにします。 ツール > マクロ > マクロの管理 > OpenOffice.org Basic... >
現在のユーザーに保存されている Standard ライブラリの Module1 を使用して始めましょう。
新しいマクロ名を次のように入力します。HelloWorld
リストボックスから 'Standard を選択します。
新規作成をクリックします。
次のような感じで表示されます。
[oobas]
REM ***** BASIC *****
Sub Main
End Sub
Sub HelloWorld
End Sub
カーソルが Sub HelloWorldの行の最初の位置に表示されます。
注意 | こうなると、IDE が表示されているときは OpenOffice.org のウィンドウメニューまたはオペレーティングシステムのタスクパネルから IDE にアクセスできます。 |
コードの入力
つぎの部分を選択、消去してください。
[oobas]
REM ***** BASIC *****
Sub Main
End Sub
以下に示すように、"Sub HelloWorld" の次の行に msgbox "Hello World!" と入力してください。
[oobas]
Sub HelloWorld
msgbox "Hello World!"
End Sub
注意 | IDE はコード補完やコマンド構文を提供しません。しかし、F1 キーを押して Basic コマンドのヘルプを表示できます。 OpenOffice.org Basic のコマンドは大文字と小文字を区別しません。そのため、msgbox、MSGBOX、および Msgbox はどれでも動作します。 文ダブルクォートで囲います。 |
コードの実行
Basic のコードは次のような複数の方法で実行できます。
IDEから直接。マクロバーの実行ボタンで行います (デフォルトでは二番目のツールバーの三番目にあるボタン)。このボタンは現在のモジュールの最初のマクロを実行します。
ツールメニューから実行するには次のようにします。
(Version 1.1.x) ツール > マクロ > マクロ...;
(Version 1.9.x またはそれ以降) ツール > マクロ > マクロの実行...
マクロの実行を キー に割りあてる。
マクロの実行をメニューに割り当てる。
ツールバーのボタンにマクロの実行を割り当てる。
コントロールをドキュメント内に作成する。
イベントにマクロを割り当てる。
とりあえず "HelloWorld" サブルーチンを 実行ボタンを押して実行してみましょう。"soffice" とタイトルの付いたダイアログに "Hello World!" と OK ボタンが表示されたでしょう。
コードの保存
コードのコンテナが保存されるときはいつも Basic のコードは自動的に保存されます。そのため、OpenOffice.org ライブラリ (共有またはユーザー) にあるコードは OpenOffice.org を終了するときに自動的に保存されますドキュメントライブラリにあるコードはドキュメントが保存されるときにいつも保存されます。
IDE の標準のツールバー (デフォルトでは一番上のツールバー) に保存ボタンがありますコードがドキュメントまたはライブラリにある場合は、この保存ボタンでドキュメントまたはテンプレート全体が保存されます。コードが OpenOffice.org ライブラリにある場合は現在のライブラリのみが保存されます。
変数
モジュールの最初に Option Explicit と書くと変数の宣言を強制できます。変数を宣言するべきかどうかについての議論は次をみてください。[[1]]
変数の宣言に関する議論では、この wiki の最初の著者は変数はいつも宣言するべきだと考えました。その議論以来、彼は変数を宣言しない人に変わってしまいました。一言でいうと、変数を宣言するかどうかはたいていは個人的な好みです。いずれにせよ、最初の著者の好みでこの Wiki の例で使用されている変数は次のような慣例にしたがって変数名が付けられています。
次の表 (表は Sun の Tutorial.pdf にもとづく) のように、変数の最初の文字は保持するはずの値の型を示します。
文字 | 意味 |
a | Structure 構造体 |
b | Boolean ブール型 (TRUE または FALSE) |
e | Enumeration 列挙形。この変数は値の制限されたセットのうちの一つのみを保持できます。 |
f | Float 単精度変数 (3.402823 x 1038 から 1.401298 x 10-45 までの値。一つの変数は 4 バイトまでの値をとります) Double 倍精度 (1.79769313486232 x 10308 から 4.94065645841247 x 10-324 までの値倍精度浮動小数点変数は 8 バイトまでの値をとります) Currency 通貨変数 (-922337203685477.5808 から +922337203685477.5807 までの値で、8 バイトのメモリを使用します) |
m | Array 配列 (またの名はシークエンス、マトリックス) |
n | Integer 整数 (-32768 から 32767 まで) もしくは Long ロング整数 (-2147483648 から 2147483647 まで)。 |
o | Object オブジェクト、サービスまたはインターフェース |
s | String 文字列 (文字列変数は 65535 文字のユニコード文字を格納できます)。 |
x | Interface インターフェースオブジェクトの特定のインターフェースの操作のみを示すときに使用します。 |
v | Variant, any. バリアントもしくは任意 |
変数名には大文字と小文字を活用して長い、変数を説明する名前を使用してください。(単語の頭文字を大文字に、他を小文字にして単語をつなげて変数名とする)
注意: | ユーザーが定義した OpenOffice.org Basic の変数は大文字と小文字を区別しません。一方、UNO-API 定数は大文字と小文字を区別します。 |
長い説明のような名前の変数の例外として一般的に i、j または k が使用されるインデックス変数と、一般的に s が使われる組み立て中の文字列があります。
次のように HelloWorld サブルーチンを編集、実行してください。
[oobas]
sub HelloWorld
dim i as integer 'この行は任意で記述します
for i = 0 to 2
'読みやすさのためだけにインデントしてあります
'長生きするためにあなたのコードもこのようにインデントすべきです
msgbox "Hello World " & i
next i
end sub
変数についてのより詳しい情報はオンラインヘルプの "変数の使用法" をみてください。
OpenOffice.org API を理解する
このセクションは次の例からとりかかります。このセクションの残りの目標は例を理解、発展させるための情報を与えることです。
アクティブになっているさまざまな種類のドキュメントでこのコードを実行してください。
[oobas]
sub main
'BasicLibraries.loadLibrary("XrayTool")
'xray thisComponent
msgbox fnWhichComponent(thisComponent)
end sub
function fnWhichComponent(oDoc) as string
if HasUnoInterfaces(oDoc, "com.sun.star.lang.XServiceInfo") then
if thisComponent.supportsService ("com.sun.star.text.GenericTextDocument") then
fnWhichComponent = "Text"
elseif thisComponent.supportsService("com.sun.star.sheet.SpreadsheetDocument") then
fnWhichComponent = "Spreadsheet"
elseif thisComponent.supportsService("com.sun.star.presentation.PresentationDocument") then
fnWhichComponent = "Presentation"
elseif thisComponent.supportsService("com.sun.star.drawing.GenericDrawingDocument") then
fnWhichComponent = "Drawing"
else
fnWhichComponent = "おっと、現在のドキュメントはなにか別の種類のドキュメントです。"
end if
else
fnWhichComponent = "Not a document"
end if
End function
慣習的なサブルーチンの名前のつけ方
前出の例ではユーザー定義関数に "fn" 文字で始まる名前を付けました。これはみんながユーザー定義関数だと分かるようにという最初の著者による取り決めです。同じように、最初の著者はユーザー定義のサブルーチン名を "sub" から始めるように決めました。プログラム言語と API を学ぶとき、なにが組み込み型でどこで定義済みなのか判断に苦しみます。このドキュメント/wiki では関数とサブルーチンの名づけ方を使用していきます。
OpenOffice.org API の紹介
このセクションでは次の用語を導入します。
- Interface インターフェース
- Module モジュール
- Service サービス
- Method メソッド
- Property プロパティ
OpenOffice.org の拡張機能を書けるようになるためにインターフェースとサービスの違い、なにがモジュールかを必ず理解しなければいけないというわけではありませんが、マニュアルの解釈と introspection する目的に特に役に立ちます。よく理解するにはこのセクションを少なくとも二回読まないといけないかもしれません
インターフェース はメソッド (とその引数) の1セットの定義であり、そのインターフェースを実装するのがサービスです。
インターフェースは名前を付ける目的のためモジュールにまとめられています。すべてのインターフェース (とサービス) 名は "com.sun.star" からはじまり、次にモジュールそしてインターフェース (またはサービス) 名が続きます。
たとえば、ほとんどのサービスは com.sun.star.beans.XPropertySet インターフェースを提供します。このインターフェースは "beans" モジュールに格納されていて、サービスのプロパティへのアクセスを提供します。プロパティ は値なのに対して、メソッド はアクションです。
OpenOffice.org のオブジェクトは複数のサービスを保持できます。
ある一つの OpenOffice.org オブジェクトはサービスかもしれませんそして、そのサービスはインターフェースを実装しています。メソッドの説明ではほかの "OpenOffice.org のオブジェクトを返す"となっています。
Introspection
HasUnoInterfaces は introspection のための OpenOffice.org Basic ランタイム関数です。ほかの言語での introspection については [リンク] を参照してください。
指定したすべてのインターフェースが指定されたオブジェクトで使用可能なとき HasUnoInterfaces は true を返します。
ほとんどの OpenOffice.org のオブジェクトは com.sun.star.lang.XServiceInfo インターフェースを持つため supportsService メソッドを提供します。
上記の例では、OpenOffice.org Basic のコマンド HasUnoInterfaces は現在のドキュメントが com.sun.star.lang.XServiceInfo インターフェースを持っているか確認します。もしインターフェースを備えていなければ supportsService メソッドも持っていませんから、オブジェクトが存在しないメソッドにアクセスしようと試みてランタイムエラーが発生するためです。
SupportsService メソッドは指定したサービスが使用可能であれば true を返します。前出の例では、現在アクティブのドキュメントの形式を判定するためにサービスを確認します。
X-Ray tool
HasUnoInterfaces と supportsService を使用して実行時にオブジェクトに関する情報を得ることができますが、習得するためにこのようにオブジェクトを確認するのは悪夢のようです。これを手助けしてくれる X-Ray ツールを作成した Bernard Marcelly に感謝しましょう。X-Ray ツールは [ooomacros] から手に入ります。zip ファイルをダウンロード、ドキュメントを解凍、OpenOffice.org でドキュメントを開き、説明にしたがってインストールとセットアップしてください。
X-Ray ツールの設定でローカルに配置した OpenOffce.org SDK を指定します。OpenOffice.org SDKをダウンロードして解凍しておいてください。
上記の例では次のように最初の二行をコメントアウトしてありました (アポストロフィー以降がコメントです)。
[oobas]
'BasicLibraries.loadLibrary("XrayTool")
'xray thisComponent
X-Ray ツールのインストールが終了したらこれらの二行のコメントを解除して (アポストロフィーを削除します) マクロを実行してください。
BasicLibraries は OpenOffice.org ライブラリにアクセスするためのオブジェクトを返します。 loadLibrary メソッドはライブラリ中のルーチンを利用可能にします。
xray は XrayTool ライブラリにある xray サブルーチンを示しており、thisComponent は introspection のために xray に渡すオブジェクトです。
あなたがやりたいことに使うオブジェクトを頻繁に探し、作成する場合は StarDesktop または thisComponent のどちらかから始めます。
デスクトップ、ドキュメント、現在の選択範囲
StarDesktop および ThisComponent はそれぞれアプリケーションと現在アクティブなドキュメントを参照する OpenOffice.org Basic コマンドです。
Microsoft Office とは違って OpenOffice.org はさまざまなコンポーネントで構成された一つのアプリケーションです。多くのコードを実行するとき、どのコンポーネントが現在アクティブであるかを判断するのに役に立つでしょう。上記のコードはコンポーネントのチェック方法を示します。
StarDesktop が参照するデスクトップ は概念的な (以前は実際に存在していた) もので OpenOffice.org アプリケーションとみなせます。
新規ドキュメントの作成
新規テキスト (Writer) ドキュメントは次のように作成します。
[oobas]
oDoc = StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, Array())
新規表計算 (Calc) ドキュメントは次のように作成します。
[oobas]
oDoc = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, Array())
容易に行えるように次のような簡単な関数を書くといいでしょう。
[oobas]
function fnNewDoc(sDocType as string)
fnNewDoc = StarDesktop.loadComponentFromURL("private:factory/" & sDocType , "_blank", 0, Array())
end function
そうすると、新規ドキュメントの作成は次のように行えます。
[oobas]
oDoc = fnNewDoc("swriter")
oDoc = fnNewDoc("scalc")
oDoc = fnNewDoc("simpress")
oDoc = fnNewDoc("sdraw")
oDoc = fnNewDoc("smath")
http://api.openoffice.org/docs/common/ref/com/sun/star/frame/XComponentLoader.html も参照してください。
ドキュメントを開く
次の例ではファイルの開き方を説明します。OpenOffice.org における URL についての情報は URL の基礎 を参照してください。
[oobas]
sFile = "C:\Documents and Settings\danny\Desktop\MyCalc.sxc" ' Windows
sFile = "/home/danny/Desktop/MyCalc.sxc" ' Linux
sURL = ConvertToURL(sFile)
oDoc = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Array())
この場合も当然、次のような簡単な関数を書くと容易にできます
[oobas]
function fnOpenDoc(sFile)
sURL = ConvertToURL(sFile)
fnOpenDoc = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, Array())
end function
例では次の関数を呼び出しています。
[oobas]
oDoc = fnOpenDoc("C:\Documents and Settings\danny\Desktop\MyCalc.sxc") ' Windows
oDoc = fnOpenDoc("/home/danny/Desktop/MyCalc.sxc") ' Linux
現在の選択範囲
現在の選択範囲に影響のあるコードを実行したいときに共通することです。ThisComponent は getCurrentSelection メソッドを持っています。異なる型のオブジェクトを選択できるので、オブジェクトに適用したいメソッドを含むサービスを現在選択中のオブジェクトが持つことを確認するのが普通です。
main サブルーチンを次のように編集して、テキストドキュメントで異なる範囲を選択してから実行してください。(一つ以上のテキストブロックを選択するにはコントロールキーを押します)。
[oobas]
sub main
BasicLibraries.loadLibrary("XrayTool")
if fnWhichComponent(thisComponent) = "Text" then
oCurSelection = thisComponent.getCurrentSelection()
'xray oCurSelection
if oCurSelection.supportsService("com.sun.star.text.TextRanges") then
msgbox "There are " & oCurSelection.getCount() & _
" selections in the current text document."
end if
end if
end sub
何も選択していないとき選択数は 1 でこれはカーソル位置、一つのテキスト範囲を選択してもまだ選択数は 1 です。しかし、二つのテキスト範囲を選択すると選択数は 3 でこれはカーソル位置および二つの選択テキスト範囲です。
課題 1: 表計算ドキュメントの選択セル範囲で動作するように上記のコードを編集してください。
問 1: 二つのセル範囲を選択するとき選択数はいくつになりますか?
プロパティ
xray を実行できるように 'xray oCurSelection の行のコメントをはずしてください。実行するとオブジェクト oCurSelection が Count と呼ばれる "プロパティ" に "pseudo-prop, read only" という表示を持つことが分かるでしょう。OpenOffice.org Basic では oCurSelection.count と書けますが OpenOffice.org API にアクセスする他のすべての言語ではこのように書けないためこの Wiki ではいつもメソッドを利用するようにします。(メソッドで書くようにするといいましたがそのようにする習慣がないので忘れて使ってしまうかもしれません。)
次の例は現在の選択範囲のプロパティ値を変更してみます。
[oobas]
sub main
BasicLibraries.loadLibrary("XrayTool")
if fnWhichComponent(thisComponent) = "Text" then
oCurSelection = thisComponent.getCurrentSelection()
if oCurSelection.supportsService("com.sun.star.text.TextRanges") then
nCount = oCurSelection.Count
'xray oCurSelection.getByIndex(0)
'注意: カーソルで同じ動作を二回実行する必要があります
'この場合は問題ありませんが、他の場合には問題があるかもしれません for i = 0 to nCount - 1
oCurSelection.getByIndex(i).setPropertyValue("CharStyleName", "Strong Emphasis")
next
end if
end if
end sub
OpenOffice.org Basic では次のように短く書くことができます。
[oobas]
oCurSelection(i).CharStyleName = "Strong Emphasis"
この wiki ではすべてのインデックス利用およびプロパティの指定にメソッドを利用することにします。合理的に言うと、こうすればコードを他の言語に変換しやすくなり、学ぶ人がコードでなにが起こっているのかを知る手助けにもなります。
課題 2: 上記のコードを注意が必要ないように書き換えてください。
現在の選択範囲を参照してください。
順列オブジェクトへのイテレーションアクセス (列挙 Enumeration によるアクセス)
(Iterative Access to Subordinate Objects (Enumeration access)
時々オブジェクトにアクセスするために列挙によるアクセスを必要とします。たとえばドキュメントやセクションに含まれる段落です。
Writer ドキュメントがアクティブで何かテキストが選択されているとき、thisDocument.getText() と thisComponent.getCurrentSelection().getByIndex(i) の両方が com.sun.star.container.XContentEnumerationAccess インターフェースを持つ com.sun.star.text.TextRange サービスを持っており、現在のドキュメントまたは特定の選択範囲にある段落の列挙型を作成できます。
[oobas]
' 列挙型オブジェクトの作成
oTextElementEnum = thisComponent.getText().createEnumeration()
'or thisComponent.getCurrentSelection().getByIndex(i).createEnumeration()
' すべてのテキスト要素に渡って反復します
while oTextElementEnum.hasMoreElements()
oTextElement = oTextElementEnum.nextElement
if oTextElement.supportsService("com.sun.star.text.TextTable") then
MsgBox "現在の範囲が表を含んでいます。"
end if
if oTextElement.supportsService("com.sun.star.text.Paragraph") then
MsgBox "現在の範囲が段落を含んでいます。"
end if
wend
課題 3: 上記の例を太文字のすべてのテキストをメッセージダイアログに表示するように拡張してください。
名前によるアクセス
多くのオブジェクトが特定の型の順列化された子オブジェクトへの名前によるアクセスを提供しています。そのほか多くがインデックスによるアクセスを、また多くのオブジェクトが名前およびインデックスの両方によるアクセスを提供しています。
たとえば、OpenOffice.org の現在のドキュメントが表計算ドキュメントのとき、インデックスアクセスによって特定のシートにアクセスできます。
[oobas]
oSheet = thisComponent.getSheets.getByIndex(0)
また、名前によるアクセスでは次のようにします。
[oobas]
oSheet = thisComponent.getSheets.getByName("Sheet1")
特定の名前のオブジェクトがすでに存在しているかどうかを確認するために hasByName メソッドを利用します。たとえば次のようにします。
[oobas]
if thisComponent.getSheets.hasByName("Sheet1") then
To loop through all the available object names can be done like:
[oobas]
mNames = thisComponent.getSheets.getElementnames
for i = lbound(mNames) to ubound(mNames)
msgbox mNames(i)
next
名前が付けられているサブコンポーネントへのアクセスには com.sun.star.container.XNameContainer インターフェースも提供されています。このインターフェースはオブジェクトが insertByName、replaceByname、removeByName メソッドを持つように規定しています。
例を示します。
[oobas]
thisComponent.getSheets.insertByName("NewSheet")
新たなオブジェクトの作成
多くのオブジェクトは特定の型のオブジェクトを作成するための固有のメソッドを提供するインターフェースを実装するサービスを持っています。
たとえば、現在のドキュメントが Writer ドキュメントのとき thisComponent.getText は createTextCursor および createTextCursorByRange メソッドを定義している com.sun.star.text.XSimpleText インターフェースを実装する com.sun.star.text.Text サービスを提供するオブジェクトです。これらのメソッドは共にドキュメントのテキストにアクセスするためのテキストカーソルを作成します。これらのテキストカーソルはビューカーソルから完全に独立しています。ビューカーソルは画面に表示され、ユーザーにより操作されますが (プログラム制御により操作できる)、テキストカーソルは画面に表示されずもっぱらプログラム制御により利用されます。次のコードはビューカーソルと同じ位置から始まるテキストカーソルの作成とビューカーソルから独立した移動を示します。
[oobas]
oVC = thisComponent.getCurrentController.getViewCursor
oCursor = oVC.getText.createTextCursorByRange(oVC)
oCursor.gotoStartOfSentence(false)
oCursor.gotoEndOfSentence(true)
msgbox oCursor.getString
いくつかのオブジェクトはコンテキストに依存しており com.sun.star.lang.XMultiServiceFactory インターフェースで定義されている createInstance メソッドを利用して作成されたものを取得します。たとえば、ドロードキュメントの最初のページに四角形を追加するには次のようにします。
[oobas]
dim aPoint as new com.sun.star.awt.Point
dim aSize as new com.sun.star.awt.Size
aPoint.x = 1000
aPoint.y = 1000
aSize.Width = 10000
aSize.Height = 10000
oRectangleShape = thisComponent.createInstance("com.sun.star.drawing.RectangleShape")
oRectangleShape.Size = aSize
oRectangleShape.Position = aPoint
thisComponent.getDrawPages.getByIndex(0).add(oRectangleShape)
この例では UNO 構造体も利用しています。UNO 構造体に関する情報は下記の関連項目を参照してください。
いくつかのオブジェクトはコンテキストに依存しておらず OpenOffice.org Basic の createUnoService コマンドを利用してオブジェクトを作成できます。たとえば StarDesktop と等価なオブジェクトを作成します。
[oobas]
oDesktop = createUnoService("com.sun.star.frame.Desktop")
次の手順は著者がオブジェクトにアクセス、作成する方法を判定するために利用するものです。
オブジェクトがすでに存在しているかどうか、もし存在しているのであれば、たとえば thisComponent など、どこからアクセスできるか。
新しいオブジェクトが他のオブジェクトに所属している、そうすると所有するオブジェクトは作成されたオブジェクトへアクセスするためのメソッドを持っています、それを利用します。
新しいオブジェクトが他のオブジェクトに所属している、しかしオブジェクトが作成のためのメソッドを提供していない、すると createInstance がそのオブジェクトを提供します。オブジェクトが createInstance を提供していないとき、正しいオブジェクトを利用していますか、またはオブジェクトがコンテキストに依存していないのでは?
今あるドキュメントからオブジェクトの作成方法の解決策を見つけるのは非常に困難だと思います。なのでこのドキュメント/wiki がいずれ明確にしてくれることを願っています。
UNO 構造体
UNO 構造体は OpenOffice.org Basic のコマンド dim を利用して宣言できます。
[oobas]
dim aPoint as new com.sun.star.awt.Point
または OpenOffice.org Basic のコマンド createUnoStruct を使用して次のようにします。
[oobas]
aPoint = createUnoStruct("com.sun.star.awt.Point")
Note: | UNO 構造体を宣言するときは文字の大文字と小文字が重要になります。構造体の名前まではすべて小文字で、構造体の名前は単語の最初だけが大文字です (TitleCase)。 |
リスナーとハンドラの作成
ユーザーインターフェースを通じてマクロをイベントに割り当てられます。
OpenOffice.org バージョン 1.1.x: ツール > 設定... > イベント。
OpenOffice.org バージョン 1.9.x もしくはそれ以降: ツール > カスタマイズ... > イベント.
OpenOffice.org Basic の CreateUnoListener コマンドを使用してより幅広いイベントにマクロを割り当てることもできます。このコマンドはリスナーとハンドラの両方の作成に使用します。ある一つのリスナーは一つのイベントをチェックし他のリスナーも同様にイベントに対応します。ハンドラはイベントリスンし、任意で他のリスナーが受けとり動作しないようにイベントを消滅させることができます。
次の例はキーハンドラを作成します。
[oobas]
global IannzExampleKeyHandler
sub SetupKeyHandler
oController = thisComponent.currentController
IannzExampleKeyHandler = CreateUnoListener("KeyHandler_","com.sun.star.awt.XKeyHandler")
oController.addKeyHandler(IannzExampleKeyHandler) ' Register the listener
end sub
sub RemoveKeyHandler
thisComponent.currentController.removeKeyHandler(IannzExampleKeyHandler)
end sub
sub KeyHandler_disposing
end sub
function KeyHandler_keyReleased(oKeyEvent as new com.sun.star.awt.KeyHandler) as boolean
KeyHandler_keyReleased = False
end function
function KeyHandler_keyPressed(oKeyEvent as new com.sun.star.awt.KeyHandler) as boolean
KeyHandler_keyPressed = false '他のリスナーがイベントを受け取るようにします
if oKeyEvent.modifiers = com.sun.star.awt.KeyModifier.MOD2 then 'コントロールキーが押されたとき
if oKeyEvent.keyCode = com.sun.star.awt.Key.Q then
msgbox "Alt + Q was pressed"
KeyHandler_keyPressed = true 'このイベントを他のリスナーが処理しないようにします
end if
end if
end function
大域変数での変数を宣言するとマクロが終了した後でも値が保持されます。この場合、ハンドラを後ほど削除するのにこの変数を利用できるようにしたいのです。大域変数としての変数の宣言は他のライブラリでも使用できるように、また衝突を避けるために私のすべての大域変数は OpenOffice.org のウェブサイトに登録されている lannz という名前で始めます。
sub SetupKeyHandlerハンドラを設定します。CreateUnoListener の最初の引数はこの例のイベントの種類が起きるときに呼ばれることになるメソッドの開始名です。例では "KeyHandler_" です。
二つ目の引数はリスナーまたはハンドラのインターフェース名で、ここでは "com.sun.star.awt.XKeyHandler" です。名前は大文字と小文字を区別します。モジュール名までとモジュール名はいつも小文字でインターフェース名はいつも "X" で始まり、残りの部分は単語の最初の文字が大文字です。
インターフェースがどのメソッドを提供すべきか調べるためには SDK を使用してください。使用するつもりがなくともこれらすべてのメソッドにルーチンを割り当てる必要があります。disposing メソッドも同様です。これらのルーチン名は CreateUnoListener の最初の引数に与えた接頭文字列で始めます。この例では "KeyHandler_" です。
したがって、この例では実質的に何もしないが必要な KeyHandler_disposing、KeyHandler_keyReleased と実際に動作する KeyHandler_keyPressedがあります。
sub RemoveKeyHandler はハンドラを削除する方法を示します。
OpenOffice.org の定数
上記の例は OpenOffice.org の定数を使用しています。
たとえば、com.sun.star.awt.KeyModifier.MOD2 です。
OpenOffice.org の定数は大文字と小文字を区別します。モジュール名までとモジュール名はいつもすべて小文字です。定数グループ名は単語の最初を大文字で書きます。実際の定数名はいつも大文字です。
OpenOffice.org Basic を使用していないプログラマはこれらの定数へのアクセス方法が無いかもしれません。
マクロレコーダの利用
API 呼び出しに対する UNO Dispatch コマンドの記録に関してはOpenOffice.org マクロレコーダと UNO dispatch の呼び出し セクションを参照してください。
関連項目
- Programming OOoWriter in C++ OOo Basic で記録されたマクロを C++ で利用する
- XIntrospection インターフェース に関する説明。XRay はこのインターフェースを利用しています。* Bernard Marcelly の XRay OOoBasic tool をダウンロードする。
- The New Object Inspector 参照。