UNOとBasic型のマッピング
原文「Mapping of UNO and Basic Types」
BasicとUNOは、別の型システムを使用しています。OpenOffice.org Basicは、Visual Basicと互換性がありますが、そして、その型システム、UNO型は、IDL仕様に対応しています。(データ型を参照して下さい)、その結果、これらの2つの型システムをマッピングすることが、必要です。 この章では、異なるUNO型のために、どのBasic型を使用する必要があるかを説明します。
単純な型のマッピング
一般に、OpenOffice.org Basicの型システムは、厳格でありません。C ++やJavaとは異なり、OpenOffice.org Basicは、宣言を強制するOption Explicitコマンドが使用されない限り、変数の宣言を必要としません。変数を宣言するために、Dimコマンドが、使用されます。また、OpenOffice.org Basic型は、Dimコマンドによって、必要に応じて指定することができます。一般的な構文は以下の通りです:
Dim VarName [As Type][, VarName [As Type]]...
型を指定せずに宣言された変数は、すべてVariant型です。Variant型の変数には、任意のBasic型の値を割り当てることができます。それらの名前で、型接尾辞が使用されていない限り、宣言されていない変数は、Variantです。接尾辞は、Dimコマンドでも使用することができます。次の表には、Basicとそれに対応する接尾辞によってサポートされる、型の完全なリストが含まれています。:
型 | 接尾辞 | 領域 |
---|---|---|
Boolean | Trueまたはfalse。 |
|
Integer | % | -32768 to 32767 |
Long | & | -2147483648 to 2147483647 |
Single | ! | 浮動小数点数 負: -3.402823E38 to -1.401298E-45 正: 1.401298E-45 to 3.402823E38 |
Double | # | 倍精度浮動小数点数 負: -1.79769313486232E308 to -4.94065645841247E-324 正: 4.94065645841247E-324 to 1.79769313486232E308 |
Currency | @ | 小数点以下4桁の固定小数点数 -922,337,203,685,477.5808 to 922,337,203,685,477.5807 |
Date | 01/01/100 to 12/31/9999 | |
Object | Basicオブジェクト | |
String | $ | 文字列 |
Variant | 任意のBasic型 |
次のDim例を考えます。
Dim a, b ' Type of a and b is Variant aとbの型は、Variantです
Dim c as Variant ' Type of c is Variant cの型は、Variantです
Dim d as Integer ' Type of d is Integer (16 bit!) dの型は、整数(16 bit!)です
' The type only refers to the preceding variable 型は、前述の変数だけを参照します
Dim e, f as Double ' ATTENTION! Type of e is Variant! 注意!eの型は、Variantです
' Only the type of f is Double fの型だけがDoubleです
Dim g as String ' Type of g is String gの型は、Stringです
Dim h as Date ' Type of h is Date hの型は、Dateです
' Usage of Postfixes接尾辞の使いかた
Dim i% ' is the same as 以下と同じです
Dim i as Integer
Dim d# ' is the same as 以下と同じです
Dim d as Double
Dim s$ ' is the same as 以下と同じです
Dim s as String
以下の相関関係は、UNOから、Basicに型をマッピングするために使用され、逆もまた同様です。
単純なUNO型は、型特定の情報を取得するcom.sun.star.reflection.XIdlClassインターフェイスにマッピングされています。 詳細については、UNO Reflection APIを参照してください。
UNOメソッドやプロパティが呼び出される、そして、対象とするUNO型が既知のとき、Basicは、適切な型を自動的に選択をします。:
' The UNO object oExample1 has a property "Count" of type short
' UNOオブジェクトoExample1は、short型のプロパティ"Count"を持っています。
a% = 42
oExample1.Count = a% ' a% has the right type (Integer)
' a%は、正しい型(Integer)を持っています。
pi = 3,141593
oExample1.Count = pi ' pi will be converted to short, so Count will become 3
' piは、shortに変換されるので、Countは、3になります
s$ = "111"
oExample1.Count = s$ ' s$ will be converted to short, so Count will become 111
' s$は、shortに変換されるので、Countは、111になります
時折、特に、インターフェイス・メソッドやプロパティのパラメータがany型を持っている場合、OpenOffice.org Basicは、必要とするターゲット型を理解できません。この状況では、別の型が期待されるかもしれませんが、OpenOffice.org Basicは、機械的に、OpenOffice.org Basic型を、この上の表で示されるUNO型に変換します。OpenOffice.org Basicにより提供されるただ一つの仕組みは、数値の自動ダウンキャストです。:
LongとInteger値は、常に、可能な限り短い整数型に変換されます。:
- to byte if -128 <= Value <= 127
- to short if -32768 <= Value <= 32767
Single/Double値は、同様に、小数点以下の桁を持っていない場合、整数まで変換されます。
この仕組みは、OpenOffice.orgでは、UNO機能を実装するために使用するいくつかの内部のC++ツールが、ダウンキャスト以外の自動アップキャストを提供しないため、使用されます。その結果、long値に期待しているインターフェイスに、byte値を渡すことは、成功することがあります。しかし、逆はできません。
次の例では、oNameContは、com.sun.star.container.XNameContainerと含まれるshort型の要素をサポートしているオブジェクトです。FirstValueが、有効な入力であるを想定します。
a% = 42
oNameCount.replaceByName( "FirstValue", a% ) ' Ok, a% is downcasted to type byte
'Ok、a%は、byte型へのダウンキャストです
b% = 123456
oNameCount.replaceByName( "FirstValue", b% ) ' Fails, b% is outside the short range
'Fails、b%は、shortの範囲外にあります。
メソッド呼び出しは、失敗します。その結果、実装は、適切な例外を投げる必要があります。それは、OpenOffice.org Basic RTLで、OpenOffice.org Basicエラーに変換されます。また、実装が、不適当な型を扱い、例外を投げない場合があります。 使用する値が、対象とする領域を越えない数値を使用して、それらのUNOターゲットのために、適切か確認します。あるいは、 それらを、UNOに適用する前に、正しいBasic型に変換します。
常に、UNO Basicオブジェクトのための変数を宣言するために、型オブジェクトではなく、Variant型を使用します。OpenOffice.org Basic型オブジェクトは、純粋なOpenOffice.org Basicオブジェクトに合わせて調整されます。そして、 UNO OpenOffice.org Basicオブジェクトではなく、Variant変数は、UNO Basicオブジェクトの問題を避けるために、最適です。それは、OpenOffice.org Basicに固有の型オブジェクトの動作から、結果として生じることがあります。:
Dim oService1 ' Ok
oService1 = CreateUnoService( "com.sun.star.anywhere.Something" )
Dim oService2 as Object ' NOT recommended 推奨されません
oService2 = CreateUnoService( "com.sun.star.anywhere.SomethingElse" )
配列(sequences)と配列(arrays)のマッピング
原文「Mapping of Sequences and Arrays」
多くのUNOインターフェイスは、単純な型と同様に、配列(sequences)を使用しています。OpenOffice.org Basicで、配列(sequences)に対応する物は、配列(arrays)です。配列(arrays)は、Basic言語の標準的な要素です。下記の例は、それらが宣言される方法を示しています。:
Dim a1( 100 ) ' Variant array, index range: 0-100 -> 101 elements
' Variant配列(array)、範囲にインデックスを付けます:0-100→101の要素
Dim a2%( 5 ) ' Integer array, index range: 0-5 -> 6 elements
' Integer配列(array)、範囲にインデックスを付けます:0-5→6つの要素
Dim a3$( 0 ) ' String array, index range: 0-0 -> 1 element
' String配列(array)、範囲にインデックスを付けます:0-0→1つの要素
Dim a4&( 9, 19 ) ' Long array, index range: (0-9) x (0-19) -> 200 elements
' Long配列(array)、範囲にインデックスを付けます:(0-9)x(0-19)→200の要素
Basicは、C ++やJavaでの[]ような、特別なインデックス演算子を持っていません。配列(array)要素は、通常の括弧()を使用して呼び出されます。:
Dim i%, a%( 10 )
for i% = 0 to 10 ' this loop initializes the array
' この繰り返しは、配列(array)を初期化します。
a%(i%) = i%
next i%
dim s$
for i% = 0 to 10 ' this loop adds all array elements to a string
' この繰り返しは、文字列に、すべての配列(array)要素を追加します。
s$ = s$ + " " + a%(i%)
next i%
msgbox s$ ' Displays the string containing all array elements
' すべての配列要素(array)が含まれている文字列を表示します
Dim b( 2, 3 )
b( 2, 3 ) = 23
b( 0, 0 ) = 0
b( 2, 4 ) = 24 ' Error ”Subscript out of range”
' エラー「添字が範囲外です」
例が表示するように、Dimコマンドのインデックスは、C ++やJavaの配列宣言(array)とは異なります。要素の数は、記述されていませんが、可能な最大のインデックスです。与えられたインデックスに比べて、1つ多い配列要素(array)があります。これは、UNO配列(sequences)が、意味の点では、C++/Java配列(array)に準拠しているため、OpenOffice.org Basic配列(arrays)をUNO配列(sequences)にマッピングする場合に重要です。
UNO APIで、配列(sequence)が必要な場合、Basicプログラマーは、適切な配列(array)を使用します。次の例では、
oSequenceContainerは、sequence
Dim i%, a%( 9 ) ' Maximum index 9 -> 10 elements
' 最大インデックス9→10の要素
for i% = 0 to 9 ' this loop initializes the array
' この繰り返しは、配列(array)を初期化します。
a%(i%) = i%
next i%
oSequenceContainer.TheSequence = a%()
' If “TheSequence” is based on XPropertySet alternatively
' "TheSequence"が、XPropertySetに基づいている場合、代わりに、
oSequenceContainer.setPropertyValue( “TheSequence”, a%() )
Basicプログラマーは、プログラミング中に、異なるインデックス・セマンティクスを認識している必要があります。次の例では、 プログラマーは、1つの要素を持つ配列(sequence)を渡しましたが、実際に、2つの要素を渡しました。:
' Pass a sequence of length 1 to the TheSequence property:
' TheSequenceプロパティに長さ1の配列(sequence)を渡します。:
Dim a%( 1 ) ' WRONG: The array has 2 elements, not only 1!
' 誤り:配列(elements)には、2つの要素があり、1だけではありません。
a%( 0 ) = 3 ' Only Element 0 is initialized,
' 要素0だけが、初期化されます。
' Element 1 remains 0 as initialized by Dim
' 要素1は、Dimで初期化され、0のままです。
' Now a sequence with two values (3,0) is passed what
' may result in an error or an unexpected behavior!
' 次に、2つの値(3,0)を持つ配列(sequence)が渡され、
' エラーや予期しない動作が発生する可能性があります。
oSequenceContainer.setPropertyValue( “TheSequence”, a%() )
全体として、パラメータやプロパティ・アクセスのために、Basic配列(arrays)を使用するとき、Basicコードには、常に '()'が、続く必要があります。それ以外の場合には、エラーが発生することがあります。
それは、OpenOffice.org Basic RTL関数がArray()を呼び出すとき、役に立つことがあります。特に、小さな配列(sequences)を一つの手順で、それをVariant変数に初期化して、割り当てます。:
Dim a ' should be declared as Variant
' Variantと宣言する必要があります。
a = Array( 1, 2, 3 )
' is the same as
Dim a(2)
a( 0 ) = 1
a( 1 ) = 2
a( 2 ) = 3
ときどき、UNOインタフェースに、空の配列(sequence)を渡す必要があります。Basicでは、Dimコマンドから、インデックスを省略すると、空のシーケンスを宣言できます。:
Dim a%() ' empty array/sequence of type Integer
' Integer型の空のarray/sequence
Dim b$() ' empty array/sequence of String
' Stringの空のarray/sequence
また、UNOによって返される配列(sequences)は、Basicでも配列(arrays)として表現されますが、これらの配列(arrays)は、前もって配列(arrays)と宣言する必要はありません。配列(sequence)を受け入れるために使用する変数は、Variantと宣言する必要があります。UNOによって返される配列(array)にアクセスするために、Basic RTL関数のLBound()とUBound()が、含まれている要素の数に関する情報を、取得する必要があります。
関数LBound()は、小さいインデックスを返し、UBound()は、大きいインデックスを返します。次のコードは、返された配列(sequence)のすべての要素を調べる繰り返しを示します。:
Dim aResultArray ' should be declared as Variant
' Variantと宣言する必要があります。
aResultArray = oSequenceContainer.TheSequence
dim i%, iFrom%, iTo%
iFrom% = LBound( aResultArray() )
iTo% = UBound( aResultArray() )
for i% = iFrom% to iTo% ' this loop displays all array elements
' このループは、すべての配列(array)要素を表示します
msgbox aResultArray(i%)
next i%
関数LBound()は標準のBasic関数で、UNOコンテキストに固有でありません。Basic配列(arrays)が、必ずしも、インデックス0から開始するわけではありません。なぜなら、次のようなものを書くことができます:
Dim a (3 to 5 )
これにより、配列(array)のインデックスは3になります。しかしながら、UNOによって返される配列(sequences)は、常に、開始インデックス0を持っています。通常、UBound()だけが、使用されます。そして、上記の例は、以下のように簡素化することができます。:
Dim aResultArray ' should be declared as Variant
' Variantと宣言する必要があります。
aResultArray = oSequenceContainer.TheSequence
Dim i%, iTo%
iTo% = UBound( aResultArray() )
For i% = 0 To iTo% ' this loop displays all array elements
' このループは、すべての配列(array)要素を表示します
MsgBox aResultArray(i%)
Next i%
sequence/arrayの要素の計算は、簡単に計算することができます。:
u% = UBound( aResultArray() )
ElementCount% = u% + 1
空の配列(arrays)/配列(sequences)のUBoundは、-1を返します。この方法では、要素の計算が、続いて、適切に計算されるため、UBoundの意味は、同一のままになります:
ElementCount% = u% + 1' = -1 + 1 = 0
UNO配列(sequences)とBasic配列(arrays)の間のマッピングは、両方ともゼロスタートのインディックス・システムを使用している事実に依存しています。構文の問題を避けるために、
Dim a ( IndexMin to IndexMin )
あるいは、BasicコマンドOption Base 1は、使用しないでください。両方とも、0以外のインデックスで、開始するBasic配列をもたらします。
また、UNOは、配列(sequences)の配列(sequences)をサポートします。Basicでは、これは、配列(arrays)の配列(arrays)として対応します。多次元配列(arrays)と配列(sequences)の配列(sequences)を混同してはいけません。多次元配列(arrays)では、 すべてのサブ配列(arrays)は、常に、同じ数の要素を持っています。ところが、配列(sequences)の配列(sequences)では、すべての要素配列(sequence)は、別の大きさを持つことができます。 例:
Dim aArrayOfArrays ' should be declared as Variant
' Variantと宣言する必要があります。
aArrayOfArrays = oExample.ShortSequences ' returns a sequence of sequences of short
' shortの配列(sequence)の配列(sequences)を返します
Dim i%, NumberOfSequences%
Dim j%, NumberOfElements%
Dim aElementArray
NumberOfSequences% = UBound( aArrayOfArrays() ) + 1
For i% = 0 to NumberOfSequences% - 1' loop over all sequences
' すべての配列(sequences)に渡って繰り返します。
aElementArray = aArrayOfArrays( i% )
NumberOfElements% = UBound( aElementArray() ) + 1
For j% = 0 to NumberOfElements% - 1 ' loop over all elements
' すべての要素に渡って繰り返します。
MsgBox aElementArray( j% )
Next j%
Next i%
Basicの配列(arrays)のarrayを作成するために、サブ配列(array)は、マスター配列(array)の要素として使用されます:
' Declare master array
' マスター配列(array)を宣言します
Dim aArrayOfArrays( 2 )
' Declare sub arrays
' サブ配列(array)を宣言します
Dim aArray0( 3 )
Dim aArray1( 2 )
Dim aArray2( 0 )
' Initialise sub arrays
' サブ配列(arrays)を初期化します
aArray0( 0 ) = 0
aArray0( 1 ) = 1
aArray0( 2 ) = 2
aArray0( 3 ) = 3
aArray1( 0 ) = 42
aArray1( 1 ) = 0
aArray1( 2 ) = -42
aArray2( 0 ) = 1
' Assign sub arrays to the master array
' マスター配列(array)にサブ配列(arrays)を割り当てます。
aArrayOfArrays( 0 ) = aArray0()
aArrayOfArrays( 1 ) = aArray1()
aArrayOfArrays( 2 ) = aArray2()
' Assign the master array to the array property
' 配列(array)プロパティに、マスター配列(array)を割り当てます。
oExample.ShortSequences = aArrayOfArrays()
この状況では、実行時関数Array()が、役に立ちます。サンプルコードは、もっと短く記述することができます。:
' Declare master array
' マスター配列(array)を宣言します
Dim aArrayOfArrays( 2 )
' Create and assign sub arrays
' サブ配列(arrays)を作成して、割り当てます
aArrayOfArrays( 0 ) = Array( 0, 1, 2, 3 )
aArrayOfArrays( 1 ) = Array( 42, 0, -42 )
aArrayOfArrays( 2 ) = Array( 1 )
' Assign the master array to the array property
' 配列(array)プロパティに、マスター配列(array)を割り当てます。
oExample.ShortSequences = aArrayOfArrays()
あなたが、Array()を入れ子にする場合、もっと小さくコードを記述することができます。しかし、結果として、配列(arrays)を理解することが、困難になります。:
' Declare master array variable as variant
' マスター配列(array)変数をvariantとして宣言する
Dim aArrayOfArrays
' Create and assign master array and sub arrays
' マスター配列(array)とサブ配列(arrays)を作成して、割り当てます
aArrayOfArrays = Array( Array( 0, 1, 2, 3 ), Array( 42, 0, -42 ), Array( 1 ) )
' Assign the master array to the array property
' 配列(array)プロパティに、マスター配列(array)を割り当てます。
oExample.ShortSequences = aArrayOfArrays()
高次の配列(sequences)は、それに応じて処理することができます。
構造体のマッピング
UNO構造体の型は、シングル・インスタンスと配列(array)として、Dim As Newコマンドでインスタンス化できます。
' Instantiate a Property struct
' プロパティ構造体をインスタンス化します
Dim aProperty As New com.sun.star.beans.Property
' Instantiate an array of Locale structs
' Locale構造体の配列(array)をインスタンス化します
Dim Locales(10) As New com.sun.star.lang.Locale
構造体型のために、名前の代わりに文字列リテラルとして、その型を与えるDim As Newコマンドの特別な構文があります。:
Dim o As New "com.sun.star.beans.Optional<long>"
UNO名を表す文字列リテラルは、次の規則に従って作成されます。:
- それぞれ、関連した単純なUNO型を表現している文字列は、"boolean"、"byte"、"short"、"long"、"hyper"、"float"、"double"、"char"、"string"、"type"と"any"です。
- UNOシーケンス型を表す文字列は、コンポーネント型を表す文字列に "[]"が、続きます。
- UNO列挙型、簡単な構造体やインターフェイス型を表現している文字列は、その型の名前です。
- インスタンス化されたポリモーフィック構造体型を表現している文字列は、ポリモーフィック構造体型テンプレートの名前です。"<" が続き、型引数の表現が後に続き、("," で区切られた)、">" が続きます。
これらの文字列表記には、偽のスペースや他の文字を導入することはできません。
UNO構造体インスタンスは、UNOオブジェクトのように扱われます。構造体のメンバは、. 演算子を使用して呼び出されます。 Dbg_Propertiesプロパティは、サポートされています。プロパティDbg_SupportedInterfacesとDbg_Methodsは、構造体には適用されないため、サポートされていません。インスペクタのX線ツールやMRIツールは、UNO構造体のインスタンスを表示することができます。
' Instantiate a Locale struct
' Locale構造体をインスタンス化します
Dim aLocale As New com.sun.star.lang.Locale
' Display properties
' プロパティを表示します
MsgBox aLocale.Dbg_Properties
' Access “Language” property
' "Language" プロパティにアクセスします。
aLocale.Language = "en"
オブジェクトと構造体は、異なります。オブジェクトは、参照として、構造体は、値として扱われます。構造体が、変数に割り当てられるとき、構造体はコピーされます。これは、構造体であるオブジェクト・プロパティを修正するとき、重要です。なぜなら、 構造体プロパティは、それを読み込んで、修正した後に、オブジェクトに再割り当てする必要があります。
次の例では、oExampleは、プロパティMyObjectとMyStructを持つオブジェクトです。
- MyObjectにより提供されるオブジェクトは、文字列プロパティObjectNameをサポートします。
- MyStructにより提供される構造体は、文字列プロパティStructNameをサポートします。
oExample.MyObject.ObjectNameとoExample.MyStruct.StructNameは、修正する必要があります。次のコードは、これが、オブジェクトのために、どのように実行するかを示します。:
' Accessing the object
' オブジェクトにアクセスする
Dim oObject
oObject = oExample.MyObject
oObject.ObjectName = “Tim” ' Ok!
' or shorter
' あるいは、より短く
oExample.MyObject.ObjectName = “Tim” ' Ok!
次のコードは、構造体(そして、可能性のある間違い)のために、それを、どのように、適切に実行するかを示します。:
' Accessing the struct
' 構造体にアクセスする
Dim aStruct
aStruct = oExample.MyStruct ' aStruct is a copy of oExample.MyStruct!
' aStructは、oExample.MyStructのコピーです!
aStruct.StructName = “Tim” ' Affects only the property of the copy!
' コピーのプロパティだけに影響を及ぼします!
' If the code ended here, oExample.MyStruct wouldn't be modified!
' コードが、ここで終了した場合、oExample.MyStructは、修正されません!
oExample.MyStruct = aStruct ' Copy back the complete struct! Now it's ok!
' 完全な構造体のコピーを戻します!現在、それはokです!
' Here the other variant does NOT work at all, because
' only a temporary copy of the struct is modified!
' ここでは、他のバリアントは、構造体の一時的なコピーだけが、修正されるため、まったく動作しません!
oExample.MyStruct.StructName = “Tim” ' WRONG! oExample.MyStruct is not modified!
' 誤り!oExample.MyStructは、修正されていません!
列挙型と定数グループのマッピング
原文「Mapping of Enums and Constant Groups」
名前で列挙型の値を指定するには、完全修飾名を使用します。次の例では、oExampleとoExample2が、enum型com.sun.star.beans.PropertyStateのプロパティStatusを持つcom.sun.star.beans.XPropertySetをサポートしていると想定しています。
Dim EnumValue
EnumValue = com.sun.star.beans.PropertyState.DEFAULT_VALUE
MsgBox EnumValue ' displays 1
eExample.Status = com.sun.star.beans.PropertyState.DEFAULT_VALUE
Basicは、列挙型をサポートしていません。Basicでは、UNOからやって来るenum値は、Long値に変換されます。プロパティやインターフェイス・メソッド・パラメータに、enum型が必要かどうかをBasicが認識している限り、続いて、Long値は、正しいenum型に、内部的に変換されます。インターフェイス・アクセス・メソッドが、Anyに期待するとき、問題は、Basicで表示されます。:
Dim EnumValue
EnumValue = oExample.Status ' EnumValue is of type Long
' EnumValueは、Long型です
' Accessing the property implicitly
' 暗黙的にプロパティにアクセスする
oExample2.Status = EnumValue ' Ok! EnumValue is converted to the right enum type
' Ok! EnumValueは、正しい列挙型に変換されます。
' Accessing the property explicitly using XPropertySet methods
' XPropertySetメソッドを使用して、明確にプロパティを呼び出します。
oExample2.setPropertyValue( "Status", EnumValue ) ' WRONG! Will probably fail!
' 誤り!おそらく失敗するでしょう!
明示的なアクセスは、失敗する可能性があります。なぜなら、EnumValueは、setPropertyValue()に、Any型のパラメータとして渡されます。その結果、PropertyState型の値が、期待されることをBasicは知りません。まだ、問題が、あります。なぜなら、 com.sun.star.beans.PropertyStateのためのBasic型は、Longです。この問題は、com.sun.star.beans.XPropertySetインターフェイスの実装で解決されます。列挙型のために、Basicプロパティ構文Object.Propertyを使用する暗黙のプロパティ・アクセスは、Any型を使用している一般的なメソッドを呼び出すことへの好ましいです。この状況では、ジェネリック・インターフェイス・メソッドだけが、Basicには、解決策がない、Anyのための列挙型を期待します。
定数グループは、IDLで定数値を指定するために使用されます。Basicでは、これらの定数は、それらの完全修飾名を使用して呼び出すことができます。次のコードは、com.sun.star.beans.PropertyConceptから、いくつかの定数を表示します。
MsgBox com.sun.star.beans.PropertyConcept.DANGEROUS ' Displays 1
MsgBox com.sun.star.beans.PropertyConcept.PROPERTYSET ' Displays 2
定数グループや列挙型は、オブジェクトに割り当てることができます。 1つ以上の列挙型、あるいは、定数値を、アクセスする必要がある場合、このメソッドは、コードを短くするために使用されます。:
Dim oPropConcept
oPropConcept = com.sun.star.beans.PropertyConcept
msgbox oPropConcept.DANGEROUS ' Displays 1
msgbox oPropConcept.PROPERTYSET ' Displays 2
