■ 構造体の中の配列と固定長文字列
構造体の宣言時
配列の要素数は指定できない
固定長文字列は使えない
Visual Basic 6.0 では、ユーザー定義型の要素として、配列を宣言するとき、その要素数を指定できました。また、固定長文字列も指定できました。
ユーザー定義型は、Visual Basic .NET では構造体 (Structure) といいます。この構造体の宣言時に、配列の要素数の指定や、固定長文字列を使うことはできなくなりました。
アップグレードウィザードは、これらの変更ポイントを自動で変更してくれます。
次のような Visual Basic 6.0 で作ったユーザー定義型をアップグレードすると、
[ Visual Basic 6.0 のコード]
Private Type MyType
MyArray(5) As Integer
MyString As String * 100
End Type
次のような、構造体になります。
[ Visual Basic .NET にアップグレード]
Private Structure MyType
Dim MyArray() As Short
<VBFixedString(100), System.Runtime.InteropServices.Marshal As _
System.InteropServices.UnmanagedType.ByValTStr, SizeConst:=100)>
Dim MyString As String
Public Sub Initialize()
ReDim MyArray(5)
End Sub
End Structure
この構造体には、配列の要素数を初期化するためのユーザー定義関数 (Initialize) が含まれています。この関数を利用して配列の要素を初期化するよう、TODO コメントも追加されるので、このコメントを参考に、配列の要素数を初期化します。
また、固定長文字列については、可変長文字列に変更されていますが、固定配列やマーシャリングのための属性が追加されているので、固定長文字列のように利用できます。
この文法の変更に対処する方法はふたつあります。
たとえば、Visual Basic .NET での変化に備えて、あらかじめ固定長文字列を利用しないようにすることです。たとえば、以下のように可変長文字列にしておき、必要に応じて配列の要素数を指定する初期化処理を行ないます。
Private Type MyType
MyArray() As Integer
MyFixedString As String
End Type
Sub Bar()
Dim MyVariable As MyType
ReDim MyVariable.MyArray(5) As Integer
MyVariable.MyFixedString = String$(100, " ")
End Sub
あるいは、初期化のための関数を作成し、それを利用して要素数を指定してもよいでしょう。
そして、もうひとつの対処法は、Visual Basic .NET になってからアップグレードウィザードでできる限り変換後、必要に応じて手動で修正するという方法です。
このいずれかの選択になります。