金宏 和實(かねひろ かずみ)

 イーザー(http://www.easier.co.jp/)副社長。昭和58年関西学院大学文学部仏文科卒業。昭和62年第一種情報処理技術者試験合格。昭和63年長男こうしろう誕生。
 タバコ,フォークソング,ジョニ赤(ジョニ黒は高かった),夜行列車,合コン,オフコン,松田聖子──昭和は遠くなったけど,おじさんたちよ,元気かい? 若者たちよ,ソフト開発は大変だけど,楽しいぞ。

 Visual Basic(VB)の醍醐味は,フォームを追加して,ツールボックスからコントロール部品をぺちゃぺちゃと貼り付けて,貼り付けたコントロールをダブルクリックしてちょこちょこっとコードを書くとやりたいことが大体できるという点にあります。事前に十分な設計作業をしないで,すぐフォームを作ってしまい,後で作り直しになってしまうということもないわけではありませんが,スクラップ&ビルドが簡単にできるのも良いところです。

 そうしたVBの良さを支えているのが,あらかじめ作られたソフトウエア部品=コントロールの存在です。ちょっと想像してみてください。何もないところからプログラム・コードでテキストボックスやコンボボックスを作成しなければならないとしたら,どんなに大変なことでしょう。

 今回は,VB 2005のRAD(Rapid Application Development)としての機能を支える便利なコントロール部品を見ていきましょう。

入力系コントロールの充実ぶりに目を見張る

 VB 6.0(図1)とVB 2005(図2)のツールボックスを比べると,VB 2005では大幅にコントロールが追加されていることがわかります。また,CheckBoxなどの従来からあるコントロールも新機能が追加されています。

図1●VB 6.0のツールボックス
図1●VB 6.0のツールボックス

図2●VB 2005のツールボックス
図2●VB 2005のツールボックス

 VB 6.0以前では,顧客に提供する製品としてアプリケーションを作成する場合,VB標準付属のコントロールでは機能が物足らず,サードベンダー製のコントロールを利用することも多かったように思います。VB 2005では付属の豊富なコントロールを使い分けることで,きめ細やかな機能を持つ使いやすいフォームが作れるでしょう。

CheckBoxとCheckedListBoxの使い方を考えよう

 最初にお断りしておきますが,CheckBoxとCheckedListBoxはVB 2005の新機能ではありません。CheckBoxはVB 6.0以前からありますし,CheckedListBoxはVB.NETでも利用できます。でも,CheckBoxがトグルボタンとして使えることはご存じですか? また,CheckedListBoxはどんなときに利用されていますか? 今回はこんなところから,解説を始めたいと思います。

 図3は,あるサンプル・アプリケーションのフォームです。ラジオボタンがグループボックスに配置されており,「オプション」というラベルの下にCheckedListBoxがあります。「メッセージ」というラベルの下と,「お会計」というラベルの右にはテキストボックス(またはラベル)が見えます。その他には,ボタンが二つ(「クーポン券あり」と「注文」)あるだけのように見えます。しかし,実はそうではありません。

図3●CheckBoxとCheckedListBoxを使ったサンプル
図3●CheckBoxとCheckedListBoxを使ったサンプル

 「クーポン券あり」と表示されているコントロールはCheckBoxなのです。CheckBoxのAppearance(外観)プロパティをButtonに設定すると,一度押すとくぼみ,もう一度押すと出っ張るトグルボタンのような外観になります。

 さて,図3のプログラムの動きを大まかに説明しましょう。

 基本メニューのラジオボタンをクリックして「醤油ラーメン」「塩ラーメン」「味噌ラーメン」のいずれかを選ぶと「お会計」ラベル(lblPrice)に値段を表示します(lblPriceのTextAlignプロパティにはMiddleRightを指定しています。TextAlignの設定は図4のようにビジュアルに設定することができます)。

図4●ラベルのTextAlignプロパティ
図4●ラベルのTextAlignプロパティ

 オプションを指定するCheckedListBoxは,ListBoxのようにItem(項目)を選択することができ,かつ,CheckBoxのようにチェックを付けることができるので,項目を選択したときは「メッセージ」ラベル(lblMess)にメッセージを表示します。例えば,醤油ラーメンを選んだ状態で「のり」の上にカーソルをおくと,図5のように表示されます(反転している項目が選択されている項目です)。

図5●オプションの項目を選択するとメッセージを表示
図5●オプションの項目を選択するとメッセージを表示

 オプションの項目にチェックを付けると値段を計算します。チェックは,図6のように複数選択が可能です。

図6●オプションの項目は複数選択可能
図6●オプションの項目は複数選択可能

 「クーポン券あり」(これはCheckBoxなのでクリックするとチェックあり/なしの状態が変化します)を押すと,100円引きになります(図7)。

図7●「クーポン券あり」で100円引き
図7●「クーポン券あり」で100円引き

 CheckBoxのAppearanceをButtonにすると,チェック状態の場合,ボタン全体が押し込まれた状態になるので視覚的な効果が高いと言えるでしょう。また,CheckedListBoxは項目を選択状態にしてから,チェックをオン/オフするので,チェックする前に利用者にその項目についての情報を伝えることができます(マウスによる操作は,クリックして選択,もう一度クリックしてチェックです。キーボードで操作す場合は,矢印キーで選択し,スペースキーでチェックをオン/オフします)。

 例えば,味噌ラーメンにカレーをかけることを筆者は勧めませんが,個人の趣味ですから止めはしません。でも,ある商品にこのオプションは付けられないというメッセージを,チェックを付ける前に伝えることができれば,チェックしたあとにエラー・メッセージが出るよりも利用者は便利に感じるはずです。

 リスト1は選択されている項目が変わったら,lblMessにメッセージを表示するコードです。メッセージの内容は多分におちゃらけですので気にしないでください。

Private Sub CheckedListBox1_SelectedIndexChanged( _
  ByVal sender As System.Object, _
  ByVal e As System.EventArgs) _
  Handles CheckedListBox1.SelectedIndexChanged

  lblMess.Text = ""
  If CheckedListBox1.SelectedIndex = 0 Then
    If RadioButton1.Checked = True Then
      lblMess.Text = "のりは醤油に良く合います。"
    End If
  End If
  If CheckedListBox1.SelectedIndex = 1 Then
    lblMess.Text = _
      "人と合う約束はありませんか?かなり匂いますよ。"
  End If
  If CheckedListBox1.SelectedIndex = 2 Then
    lblMess.Text = "味玉おいしいですよ。"
  End If
  If CheckedListBox1.SelectedIndex = 3 Then
    If RadioButton1.Checked = True Then
      lblMess.Text = "シナチクは醤油に良く合います。"
    End If
  End If
  If CheckedListBox1.SelectedIndex = 4 Then
    If RadioButton1.Checked = False Then
      lblMess.Text = "カレーは塩と味噌には合いません。"
    End If
  End If
  If CheckedListBox1.SelectedIndex = 5 Then
    lblMess.Text = _
      "体脂肪が気になる方はチャーシューはご遠慮ください。"
  End If
End Sub
リスト1●選択したオプションの項目に応じてメッセージを表示する

 リスト2は,チェック状態が変更されるときの処理です。ItemCheckEventArgs(ItemCheckEventの引数)であるeは,現在の値(CurrentValue),新しい値(NewValue),インデックス(Index)を持っているので,NewValueとIndexを使ってオプションの値段(price2)を加減算しています。

Private Sub CheckedListBox1_ItemCheck( _
  ByVal sender As System.Object, _
  ByVal e As System.Windows.Forms.ItemCheckEventArgs) _
  Handles CheckedListBox1.ItemCheck

  Dim sgn As Integer
  If e.NewValue = CheckState.Checked Then
    sgn = 1
  Else
    sgn = -1
  End If
  Select Case e.Index
    Case 0, 1
      price2 += 50 * sgn
    Case 2, 3, 4
      price2 += 100 * sgn
    Case 5
      price2 += 200 * sgn
  End Select
  dispPrice()
End Sub

Private Sub ChkCoupon_CheckedChanged( _
  ByVal sender As System.Object, _
  ByVal e As System.EventArgs) _
  Handles ChkCoupon.CheckedChanged

  dispPrice()
End Sub

~ 略 ~
Private Sub dispPrice()
  totalPrice = price1 + price2
  If ChkCoupon.Checked Then
    totalPrice -= 100
  End If
  lblPrice.Text = Format(totalPrice, "#,##0") + "円"
End Sub
リスト2●チェック状態が変更されるときの処理

 リスト3は,「注文」ボタンが押されたときの処理です。注文完了という意味で,(1)でCheckedListBox1のチェック状態をオフに,(2)で選択状態をオフにしています。

Private Sub Button1_Click( _
  ByVal sender As System.Object, 
  ByVal e As System.EventArgs) Handles Button1.Click

  Dim i As Integer
  MessageBox.Show("ご注文ありがとうございました")
  RadioButton1.Checked = True
  For i = 0 To CheckedListBox1.Items.Count - 1
    CheckedListBox1.SetItemChecked(i, False)  '------(1)
    CheckedListBox1.SetSelected(i, False)     '------(2)
  Next

  ChkCoupon.Checked = False
  dispPrice()
  lblMess.Text = ""
End Sub

~ 略 ~
Dim price1 As Integer
Private Sub Option1_Click(Index As Integer)
  If Option1(0) = True Then
    price1 = 550
  ElseIf Option1(1) = True Then
    price1 = 500
  Else
    price1 = 600
  End If
  MsgBox price1
End Sub
リスト3●「注文」ボタンが押されたときの処理