LOTUSSCRIPT 言語


ユーザー定義のデータ型
ユーザー定義のデータ型は BASIC プログラミングでは一般的な機能で、データベース、ファイルの読み込みと書き込み、印刷操作などをサポートするために使われています。 ユーザー定義のデータ型を使うと、異なるデータ型のデータを 1 つの変数にグループ化できます。このユーザー定義のデータ型には、人事情報、企業の財務情報、在庫情報、顧客および販売レコードなど一緒に格納して使用する性質の情報を含められます。ユーザー定義のデータ型の変数は、データへのポインタではなく、実際のデータを保持します。

構文は次のとおりです。

[ Public | Private ] Type typeName


End Type
構成要素説明
Public、PrivatePublic を指定すると、このデータ型は定義されたモジュールの外でも使用できます。Private (既定) を指定すると、データ型は定義されたモジュール内のみで使用できます
typeNameデータ型の名前です。
member variable declarations型のメンバを宣言します。メンバ変数はスカラー値、Variant 型、固定長配列、またはその他のユーザー定義のデータ型を保持できます。Variant 型として宣言されたメンバ変数は、任意のスカラー値の他にも固定長配列、動的配列、リスト、またはオブジェクト参照を保持できます。宣言には Const ステートメントを含めることはできません

メンバ変数宣言は関数内で宣言されたローカル変数の宣言と似ていますが、アプリケーションがユーザー定義のデータ型を作成したときにのみ、スペースが割り当てられます。この場合、すべてのメンバ変数にスペースが同時に割り当てられます。

ユーザー定義のデータ型にはプロシージャ (プロパティとメソッド) を含めることはできません。また、ユーザー定義のデータ型は拡張することもできません。

次の例は、従業員情報についてのデータベースレコードを保持するために、3 つのメンバ変数 (ID、lastName、firstName) を含む Employee データ型を作成する方法を示しています。

ユーザー定義のデータ型の変数を宣言するユーザー定義のデータ型を定義した後、メンバ変数を宣言できます。
例えば、次のようになります。

Dim President As Employee ' Create a single employee record.

多くのデータベースレコードからのデータを入れる場合、メンバ変数の配列を宣言できます。

次に例を示します。

Dim Staff(10) As Employee ' Create an array of ten employee ' records.

メンバ変数を参照するメンバ変数を参照するには、ドット表記法 (object.memberVariable) を使います。値を割り当てるには代入ステートメントを使います。
President.ID = 42
President.lastName = "Wilkinson"
President.firstName = "May"

配列またはリストのメンバ変数の要素を参照することもできます。

Staff(1).ID = 1134
Staff(1).lastName = "Robinson"
Staff(1).firstName = "Bill"

Staff(2).ID = 2297
Staff(2).lastName = "Perez"
Staff(2).firstName = "Anna"

メンバ変数の値を変数に代入するかメンバ変数の値を出力することにより、メンバ変数からデータを取り出せます。

Dim X As String
X$ = Staff(2).lastName
Print X$ ' Prints Perez.

メンバ変数の宣言時にメモリを節約するユーザー定義のデータ型のメンバは、必ずしも連続したメモリ領域に格納されるとは限りません。最初は最も大きい境界を持つメンバを宣言し、最後に最も小さい境界を持つメンバを宣言することにより、データスペースを効率的に使用できます。定義で無駄になったスペースは、そのユーザー定義のデータ型を持つすべての変数でも無駄なスペースになります。
次の例は、適切に位置合わせされた変数を示しています。

Type T1
m1 As Variant ' 16 bytes
m2 As Double ' 8 bytes
m3 As Long ' 4 bytes
m4 As String ' 4 bytes
m5 As Integer ' 2 bytes
m6(10) As Integer ' 2 bytes
m7 As String * 30 ' 1 byte
End Type

ユーザー定義のデータ型の変数は、その変数の中で最大メンバのサイズと等しい境界で格納されます。

次の例は、上の例の続きで、ユーザー定義のデータ型 T1 の各変数が 16 バイト境界で整列される様子を示しています。

Type T2
m1 As T1'16-byte boundary;T1's largest member boundary is 16.
m2(3) As Long ' 4 bytes.
End Type

メンバ変数を宣言する場合、次のことを考慮してください。


ファイルに格納されたデータを操作するファイルに格納されたデータを扱うために、ユーザー定義のデータ型を作成することがあります。たとえば、次のスクリプトは、ユーザー定義のデータ型の配列に従業員の駐車スペース情報を含んだサンプル ASCII ファイルを読み込みます。

Type RecType
empID As Double ' Employee ID
employee As String ' Employee name
theSection As Integer ' Car parking section
theSpace As Integer ' Designated parking space
theFloor As Integer ' Car parking level


End Type

' Dynamic array sizes to fit the lines in the file.
Dim arrayOfRecs() As RecType

Dim txt As String
Dim fileNum As Integer
Dim counter As Integer
Dim countRec As Integer
Dim found As Boolean

fileNum% = FreeFile ' Get a file number to open a file.
counter% = 0
Open "c:\myfile.txt" For Input As fileNum%
Do While Not EOF(fileNum%)
Line Input #fileNum%, txt$ ' Read each line of the file.
counter% = counter% + 1 ' Increment the line count.
Loop
Seek fileNum%, 1 ' Pointer to beginning of file
' Since file has counter% number of lines, define arrayOfRecs ' to have that number of elements.
ReDim arrayOfRecs(1 To counter%)
' Read the file contents into arrayOfRecs.
For countRec% = 1 to counter%
Input #fileNum%, arrayOfRecs(countrec%).empID, _
arrayOfRecs(countRec%).employee, _
arrayOfRecs(countrec%).theSection, _
arrayOfRecs(countrec%).theSpace, _
arrayOfRecs(countrec%).theFloor
Next
Close fileNum%
' Elicit an employee's name and look for it in arrayOfRecs.
ans$ = InputBox$("What's your name?")
found = False
For x% = 1 To counter%
If arrayOfRecs(x%).employee = ans$ Then
found = True
Print "Greetings, " & ans$ & "."
Exit For
End If
Next
If found = False Then Print "No such employee.

関連項目