📘
VB6から.NETへの自動変換時の問題がある変換内容
概要
- VB6からVB.NETへの変換では、Visual Basic 2008 ExpressでVB6プロジェクトをコンバートする手順がある。この中のVB6から.NETへの自動変換で何点か問題がある
.NET バージョン
- .NETFx 4.X
1. CheckedListBoxに関する変換結果で動作しないコードが生成される
1.1. 問題の内容
Microsoft.VisualBasic.Compatibility.Support名前空間内の関数はドキュメントによれば、ListBox、ComboBoxへの対応で、CheckedListBoxには対応していない。
しかし、Visual Basic 2008 Expressを利用したコンバートではCheckedListBoxもこれらの関数を利用した形にコンバートされてしまうため、正常に動作しない。
:::note
ListBox、ComboBoxでは正常に動作する。
CheckedListBoxでこれらの関数を利用した場合の問題だが、自動変換されるため気づきにくい。
:::
関数名 | 関数説明 | CheckedListBoxでの動作 |
---|---|---|
SetItemData | 指定したリストの位置にItemData(整数)を関連付ける |
無効なプロパティ配列のインデックスです というエラーが表示される |
GetItemData | 指定したリストの位置に関連付けたItemData(整数)を取得する | そもそもSetItemDataが失敗するので意味がない |
SetItemString | 指定したリストの位置の表示文字列を設定(上書き)する |
無効なプロパティ配列のインデックスです というエラーが表示される |
GetItemString | 指定したリストの位置の表示文字列を取得する | 空文字列が返却される |
1.2. 対応方法
1.2.1 SetItemData、GetItemData
- ItemDataとは整数であるため、例えば通常設定する文字列(
CheckedListBox.Items.Add()
)を<ItemDataとして設定予定の数値>:表示文字
として、取得時にSplit
で分割して取得するという方法が考えられる。 - 表示文字列を変えられないならば、通常の.NETの手法(クラスを関連付け)での対応となる(変更量は少し多くなる)
1.2.2 SetItemString、GetItemString
-
SetItemString
:通常の.NETの手法(例えばCheckedListBox.Items(~)
にセットなど)となる -
GetItemString
:通常の.NETの手法(CheckedListBox.Items(~)
を取得)となる
1.3. 参考
2. WinFormsで変換されセットされる色が異なることがある
2.1. 問題の内容
確認できている限りではLabelのForeColorで発生した。
-
VB6のデザイナーでは次のようにRGBで設定(
&H0000FF00&
)されている。
-
変換後のDesigner.vbでは、Greenと色名で設定されている。
しかし、このSystem.Drawing.Color.Green
は#00ff00
ではないため異なる色となる。正確には#00ff00
に当たる色はSystem.Drawing.Color.Lime
となるMe.Label1.ForeColor = System.Drawing.Color.Green
2.2. 対応方法
デザイナーにて手作業で#00ff00
、またはLime
を入力して修正
3. ADODB.Parameterで指定されるDataTypeが異なることがある
3.1. 問題の内容
確認できている限りでは次のようにADODB.Command
に対してパラメーターを指定する際のDataTypeが、想定されるADODB.DataTypeEnum
ではなくADOX.DataTypeEnum
となった。
ADODB、ADOXどちらも参照していることが原因の可能性もあるが不明。
Dim cmd1 As ADODB.Command
cmd1.Parameters.Append(cmd1..CreateParameter("列1", ADOX.DataTypeEnum.adSmallInt, ADODB.ParameterDirectionEnum.adParamInput))
3.2. 対応方法
- ADOXを別の個所でも使っており使い続けるならば次の点からそのままでも問題はない
-
ADODB.DataTypeEnum
はADOX.DataTypeEnum
と列挙型の数値に互換性がある -
ADODB.DataTypeEnum
はADOX.DataTypeEnum
を包含している(1個多い)
-
- ADOXを参照から外すならば、
ADOX.DataTypeEnum
をADODB.DataTypeEnum
に置換する
Discussion