VB6ユーザー必見！ActiveX版InputManコンボボックスで一歩先のUIを実現！

## ごあいさつ
こんにちは、「エイジ＠フジワーランド」です
フリーでパッケージシステムのOEM供給やってます、最近暇なので時給でSESもやってます
パッケージはVB6でがっつり作り込んでしまっているので未だにVB6をガリガリ使ってます

さて今回はActiveX版InputMan7.0 コンボボックスの話です

## ActiveX版InputManコンボボックスとは
InputManはVB2のVBX時代から人気のあるサードパーティコンポーネントですが、コンボボックスはActiveX版InputManの最終バージョンである7.0より追加されたocxのようです

それまでのバージョンになかったocxなので コンボボックスについては独自で機能拡張した自作ocxなどで使用してしまって、このocxを使用している人は少ないようです

プロパティも豊富にあるので使い込めば良さげなコントロールですが、なんせ情報が少ない…標準と使い勝手が違うためリストを作成するのもなかなか時間がかかりました

私のようにいまだにVB6使っている人は少ないとは思いますが、その少ない同志たちのお役にたてればと思い記事を書いてみました

## この記事でわかること
標準コンボボックスの代替としてActiveX版InputMan7.0 コンボボックスを使う方法を簡単に解説します
豊富な機能についてはこれから使い込んで別記事を書く予定です…

## 標準コンボボックスの弱点
テキスト入力はInputManを使用してコンボボックスは標準のものを使っていましたが、スマホっぽい画面を作り込む必要があったので標準コンボではどうしても対応できないところがありました

### 1. フォントの大きさによって高さが自動で決まってしまう

フォントを指定すると高さを自動で合わせてもらえるのは便利なのですが、調整はできないです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/5c970055-3401-eb52-7c23-44d44b80938b.png)

プロパティウィンドウで設定するとエラーになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/4b4fbcf2-2039-6fe0-d9a7-ba5d1bfe352e.png)

他のコントロールと高さが合わないのでコンボボックスに合わせたデザインにするしかないですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/f4b45e48-93d1-6448-3db6-771c297196b3.png)


### 2. フラットデザインにできない

高さ合わせてフォームの色変えても 3Dは固定なのでフラットデザインにできないです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/3d627638-d399-cd05-2830-33433e6043c7.png)
※画像に検索ボタンとして使用しているコマンドボタンもフラットにできないですがイメージコントロール代用すればいいので問題ではないです

## InputManのコンボボックスを使用すると…
### 1. フォントの大きさに関わりなく高さ設定可能
画像は AlignVerticalプロパティを 2-中央揃え に設定していますが、しっかりかゆいところに手が届いてる感じです
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/29fe2e86-91e9-292d-c495-d11e5ce6aff1.png)

### 2. フラットデザインにできる
右のリスト開くボタンは3Dままですが…まあ入力域がフラットになるだけで画面デザインが統一感出てスッキリします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/65ab9190-6050-ff66-d6fd-db1b629a6802.png)

## 標準コンボボックスとのコーディングの違い

### 1. 標準コンボボックスの場合
新規フォームにコンボボックスを貼り付けます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/f6a3de9d-4968-64a8-2d9a-03c22a03c8f9.png)


コード例
```vb
Option Explicit

Private Sub Form_Load()

    With Combo1
        .FontName = "Meiryo UI"
        .FontSize = 24

        .Clear
        .AddItem "仕入先0001": .ItemData(.NewIndex) = 1
        .AddItem "仕入先0002": .ItemData(.NewIndex) = 2
        .AddItem "仕入先0003": .ItemData(.NewIndex) = 3
    End With
    
End Sub
```
実行結果
フォントサイズをコードで大きくしたので高さが自動で大きくなっています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/e932988e-a5ec-36b7-4add-06f12347772c.png)

選択リストも指定フォントで自動調整されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/22234691-a837-17cb-c23f-3f9d2263e95d.png)

### InputManのコンボボックスの場合
新規フォームにInputManのコンボボックスを貼り付けます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/199b3f0d-3a6f-9719-3ca3-5b53efc55d32.png)

コード例
```vb
Option Explicit

Private Sub Form_Load()

    With imCombo1
        With .Font
            .Name = "Meiryo UI"
            .Size = 24
        End With
        With .Items
            .Clear
            Dim ipc As Object
            .AddItem ipc, "仕入先0001", "0001"
            .AddItem ipc, "仕入先0002", "0002"
            .AddItem ipc, "仕入先0003", "0003"
        End With
        .AlignVertical = imAlignVCenter
        .Text = ""
    End With
    
End Sub
```

実行結果
フォントサイズ変更しましたが高さは変わらずです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/6f86a6e2-e40b-0d09-6dbc-a6219b2ae8c5.png)

選択リストは自動調整されてました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/11cb3307-0aab-36aa-863d-499216f18eac.png)

## サンプル
仕入先マスタをリストに設定し、選択されたらテキストボックスに選択コードをセットするサンプルです
仕入先コードを入力してEnterキーでコンボボックスをコードにあわせるコードも実装してみました

InputManのテキストボックスとコンボボックスを貼り付けます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/6fe7f526-17be-5773-f6c5-b2f28daceff6.png)

フォームコードに以下を貼り付けてください
```vb
Option Explicit

Private Sub Form_Load()

    With imText1
        With .Font
            .Name = "Meiryo UI"
            .Size = 24
        End With
        .AlignHorizontal = imAlignHCenter
        .AlignVertical = imAlignVCenter
        .MaxLength = 4
        .HighlightText = True
        .Text = ""
    End With

    With imCombo1
        With .Font
            .Name = "Meiryo UI"
            .Size = 24
        End With
        With .Items
            .Clear
            Dim ipc As Object
            .AddItem ipc, "山川商事", "0001"
            .AddItem ipc, "毎朝新聞社", "0002"
            .AddItem ipc, "帝都エレクトロニクス", "0003"
        End With
        .AlignVertical = imAlignVCenter
        .Style = imDropDownList
    End With
    
End Sub


Private Sub imCombo1_SelectedIndexChanged()
    
    With imCombo1
        If .SelectedIndex >= 0 Then
            imText1.Text = .SelectedItem.Description
        End If
    End With


End Sub

Private Sub imText1_KeyDown(KeyCode As Integer, Shift As Integer)

    Select Case KeyCode
    Case vbKeyReturn
        Call SetComboFromText(imCombo1, imText1)
    End Select

End Sub

Private Sub SetComboFromText(comboBox As Control, textBox As Control)
    
    With textBox
        Dim L_CD As String
        L_CD = Right(String(.MaxLength, "0") & .Text, .MaxLength)
        .Text = L_CD
        .SelLength = .MaxLength
    End With
    
    With comboBox
        Dim L_i As Integer
        For L_i = 0 To .Items.Count - 1
            If .Items(L_i).Description = L_CD Then
                .SelectedIndex = L_i
                Exit Sub
            End If
        Next
    End With

End Sub
```

実行してみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/2802b3f9-a00c-0f18-0dfb-8955611954fd.png)

「1」を入力して Enter を押すとこうなります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/7e71db59-a56f-04d7-a17a-2abe23de3028.png)

コンボボックスのリストを開いて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/8d3fa6a3-316e-6dbf-12c5-145e6c53e2db.png)

仕入先名を選択すると、テキストボックスにコードが反映されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622018/8d39010e-8d58-9603-7948-abbda727a5e9.png)

## おわりに
どれだけニーズがあるかわかりませんがVB6の知見を少しでも言語化して記事にしていきたいと思います
よければこの記事を参考にしてActiveX版InputManコンボボックスを積極的に活用してみてください
みなさんの作業効率が少しでもあがることを願います


最後まで読んできただきありがとうごいました