📘

VB6から.NETへの自動変換時の問題がある変換内容

2023/12/05に公開

概要

  • 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. 参考

https://qiita.com/tfukumori/items/090928a1794bcbe35e71
https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.compatibility.vb6.support.setitemdata?view=netframework-4.8
https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.compatibility.vb6.support.getitemdata?view=netframework-4.8
https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.compatibility.vb6.support.setitemstring?view=netframework-4.8
https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.compatibility.vb6.support.getitemstring?view=netframework-4.8

2. WinFormsで変換されセットされる色が異なることがある

2.1. 問題の内容

確認できている限りではLabelのForeColorで発生した。

  • VB6のデザイナーでは次のようにRGBで設定(&H0000FF00&)されている。
    image.png

  • 変換後の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.DataTypeEnumADOX.DataTypeEnumと列挙型の数値に互換性がある
    • ADODB.DataTypeEnumADOX.DataTypeEnumを包含している(1個多い)
  • ADOXを参照から外すならば、ADOX.DataTypeEnumADODB.DataTypeEnumに置換する

Discussion