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

# 概要

- [VB6からVB.NETへの変換](https://qiita.com/tfukumori/items/9eab7be817eb16992c36)では、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](https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.compatibility.vb6.support.setitemdata?view=netframework-4.8)|指定したリストの位置にItemData（整数）を関連付ける|`無効なプロパティ配列のインデックスです`というエラーが表示される|
|[GetItemData](https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.compatibility.vb6.support.getitemdata?view=netframework-4.8)|指定したリストの位置に関連付けたItemData（整数）を取得する|そもそもSetItemDataが失敗するので意味がない|
|[SetItemString](https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.compatibility.vb6.support.setitemstring?view=netframework-4.8)|指定したリストの位置の表示文字列を設定（上書き）する|`無効なプロパティ配列のインデックスです`というエラーが表示される|
|[GetItemString](https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.compatibility.vb6.support.getitemstring?view=netframework-4.8)|指定したリストの位置の表示文字列を取得する|空文字列が返却される|
			
## 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204150/76219060-6b05-2bc8-cad9-9f4360299862.png)

- 変換後のDesigner.vbでは、Greenと色名で設定されている。
  しかし、この`System.Drawing.Color.Green`は`#00ff00`ではないため異なる色となる。正確には`#00ff00`に当たる色は`System.Drawing.Color.Lime`となる
  ```vb
  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どちらも参照していることが原因の可能性もあるが不明。

```vb
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`に置換する