中央インターフェースの概要

From Apache OpenOffice Wiki
Jump to: navigation, search
doc OOo
Book.png

Apache OpenOffice のインターフェースの中には、Apache OpenOffice API の各所で使用されるものが存在します。これらは、各種の処理に利用可能な抽象的タスクを実行する一連のメソッドを規定しています。ここではこのようなインターフェースのうち、使用頻度の高いものについて、その概要を説明します。

オブジェクトの出所については、このマニュアルの後半で説明します。ここでは単に、Apache OpenOffice API が主要なインターフェースを提供するオブジェクトについて、その抽象的な機能のいくつかを簡単に説明するにとどめておきます。

コンテキスト依存型オブジェクトの作成

Apache OpenOffice API でオブジェクトを作成するには、2 通りの方法が存在します。その 1 つは、この章の初めに説明した createUnoService 関数を使用する方法です。createUnoService 関数は、広域的に使用可能なオブジェクトを作成します。このようなオブジェクトやサービスは、コンテキスト非依存型サービスとも呼びます。

このようなコンテキスト非依存型サービスに対するものとして、コンテキスト依存型サービス も存在し、この場合のオブジェクトは他のオブジェクトと併用することでのみ使用できます。たとえば、ある表計算ドキュメントに配置された図形描画オブジェクトは、このドキュメントと共存することにより存在できます。

com.sun.star.lang.XMultiServiceFactory インターフェース

通常、コンテキスト依存型のオブジェクトを作成するには、そのオブジェクトの依存相手のオブジェクトメソッドを使用します。createInstance メソッドは、XMultiServiceFactory インターフェースで規定されているもので、主としてドキュメントオブジェクトに対して使用します。

たとえば、先に説明した図形描画オブジェクトを作成するには、次のサンプルコードのように、オブジェクトとして表計算ドキュメントを使用します。

Dim RectangleShape As Object
RectangleShape = _
  Spreadsheet.createInstance("com.sun.star.drawing.RectangleShape")

同様に、文書ドキュメントの段落テンプレートは、次のサンプルコードのようにして作成します。

Dim Style as Object
Style = Textdocument.createInstance("com.sun.star.style.ParagraphStyle")

下位オブジェクトへの名前付きアクセス

下位オブジェクトを持つオブジェクトで自然言語名によるアクセスが可能なものに対しては、XNameAccess および XNameContainer インターフェースを使用します。

このうち XNamedAccess は個々のオブジェクトに対してアクセスを行い、XNameContainer は各要素の挿入、変更、削除を行います。

com.sun.star.container.XNameAccess インターフェース

ここでは XNameAccess の使用例として、表計算ドキュメントの表 (シート) オブジェクトを扱う場合を取り上げます。このオブジェクトは表計算ドキュメント内のすべてのページをまとめたものとして扱われます。そのため各ページへのアクセスには、XNameAccessgetByName メソッドを使用します。

Dim Sheets As Object
Dim Sheet As Object
 
Sheets = Spreadsheet.Sheets
Sheet = Sheets.getByName("Sheet1")

すべての要素の名前を取得するには、getElementNames メソッドを使用します。これを実行すると、該当する名前を収めたデータフィールド (配列) が返されます。次のサンプルコードは、ループを使用して表計算ドキュメント内のすべての要素名を取得し、表示します。

Dim Sheets As Object
Dim SheetNames
Dim I As Integer
 
Sheets = Spreadsheet.Sheets
SheetNames = Sheets.getElementNames
 
For I=LBound(SheetNames) To UBound(SheetNames)
  MsgBox SheetNames(I)
Next I

基本オブジェクト内に該当する名前の下位オブジェクトが存在するかを確認するには、XNameAccess インターフェースの hasByName メソッドを使用します。次のサンプルコードは、Spreadsheet オブジェクトに Sheet1 という名前のページがあるかを確認して、その結果をメッセージボックスに表示します。

Dim Sheets As Object
 
Sheets = Spreadsheet.Sheets
If Sheets.HasByName("Sheet1") Then
  MsgBox " Sheet1 available"
Else
  MsgBox "Sheet1 not available"
End If

com.sun.star.container.XNameContainer インターフェース

基本オブジェクトの下位にある要素に対する挿入、削除、変更を行うには、XNameContainer インターフェースを使用します。ここでは、insertByNameremoveByNamereplaceByName の各メソッドを使用できます。

これらは通常、次のサンプルコードのように使用します。この場合は、文書ドキュメントの StyleFamilies オブジェクトを使用して、ドキュメントの段落テンプレート (ParagraphStyles) に対する操作を行なっています。

Dim StyleFamilies As Object
Dim ParagraphStyles As Object
Dim NewStyle As Object   
 
StyleFamilies = Textdoc.StyleFamilies
ParagraphStyles = StyleFamilies.getByName("ParagraphStyles")
ParagraphStyles.insertByName("NewStyle", NewStyle)      
ParagraphStyles.replaceByName("ChangingStyle", NewStyle)   
ParagraphStyles.removeByName("OldStyle")

ここで insertByName の行は、NewStyle というスタイルを ParagraphStyles オブジェクトと同じ名前で挿入しています。その次の replaceByName の行は、ChangingStyle で指定するオブジェクトを、NewStyle に変更しています。最後に、removeByName の行は、OldStyle で指定するオブジェクトを、ParagraphStyles から削除しています。

インデックス方式による下位オブジェクトへのアクセス

下位オブジェクトを持つオブジェクトでインデックスによるアクセスが可能なものに対しては、XIndexAccess および XIndexContainer インターフェースを使用します。

XIndexAccess には、個々のオブジェクトへアクセスするためのメソッドが用意されています。XIndexContainer には、要素を挿入したり削除するためのメソッドが用意されています。

com.sun.star.container.XIndexAccess インターフェース

XIndexAccess を用いて下位オブジェクトへアクセスするには、getByIndex および getCount メソッドを使用します。このうち getByIndex は、指定したインデックスに該当するオブジェクトを返します。同様に getCount は、使用可能なオブジェクト数を返します。

Dim Sheets As Object
Dim Sheet As Object
Dim I As Integer
 
Sheets = Spreadsheet.Sheets
 
For I = 0 to Sheets.getCount() - 1
  Sheet = Sheets.getByIndex(I)
  ' Editing sheet
Next I

このサンプルコードでは、ループを使用して個々の表 (シート) 要素にアクセスし、各要素をオブジェクト変数 Sheet に取得しています。getCount は正味の要素数を返すため、インデックスによるアクセスを行う場合、その扱いには注意が必要です。これは、getByIndex に指定するインデックスは、0 から始まるものとして処理されるためです。このため、ループカウンタの指定は 0 から getCount()-1 などのように記述する必要があります。

com.sun.star.container.XIndexContainer インターフェース

XIndexContainer インターフェースにより、関数 insertByIndex および removeByIndex が使用できます。これらに指定するパラメータは、XNameContainer の該当するメソッドと同様の構成になっています。

下位オブジェクトへの反復アクセス

インスタンスによっては、名前やインデックスではアクセスできない下位オブジェクトを持つオブジェクトが存在します。このような場合は、XEnumeration および XenumerationAccess インターフェースを使用します。これらを用いると、直接アドレスを指定することなく、各オブジェクトに存在するすべての下位要素にアクセスできます。

com.sun.star.container.XEnumeration および XenumerationAccess インターフェース

基本オブジェクトには XEnumerationAccess インターフェースが用意されていますが、このインターフェースからは createEnumeration メソッドのみが使用できます。これを使用して得られる補助オブジェクトには、hasMoreElementsnextElement メソッドを持つ XEnumeration インターフェースが用意されています。下位オブジェクトのアクセスには、これらのメソッドを使用します。

次のサンプルコードは、文書ドキュメント上のすべての段落にアクセスします。

Dim ParagraphEnumeration As Object
Dim Paragraph As Object
 
ParagraphEnumeration = Textdoc.Text.createEnumeration
 
While ParagraphEnumeration.hasMoreElements()
  Paragraph = ParagraphEnumeration.nextElement()
Wend

上記のサンプルコードでは、最初に ParagraphEnumeration という名前で補助オブジェクトを作成しています。そしてループに入り、この補助オブジェクトを用いて、文章中の各段落に順次アクセスします。テキストの末尾に到達すると hasMoreElements メソッドは False 値を返すため、これをループの終了条件に利用します。


Content on this page is licensed under the Public Documentation License (PDL).
Personal tools