コントロール配列 (Visual Basic 6.0 ユーザー向け)

更新 : 2007 年 11 月

コントロール配列は Visual Basic 2008 ではサポートされなくなりましたが、イベント モデルを使うことで、コントロール配列に近い機能を実現したり、さらにそれ以上の機能に拡張したりできます。

概念の違い

Visual Basic 6.0 では、コントロール配列は、フォーム上のコントロールを管理するために使用できました。コントロール配列には、イベント ハンドラの共有、コントロールのグループへの反復処理、および実行時のコントロールの追加という機能がありました。

Visual Basic 2008 では、コントロール配列はサポートされていません。イベント モデルが変更されたため、コントロール配列は不要になりました。.NET Framework には、コントロールを扱うためにコントロール配列と同じ機能が用意されています。

イベント ハンドラの共有

Visual Basic 6.0 では、複数のイベントを共有するコントロールのグループを指定する場合は、コントロール配列が使用されていました。これらのコントロールは、同じ型と名前を持つ必要がありました。

Visual Basic 2008 では、複数のコントロールからのイベントを 1 つのイベント ハンドラで処理できます。名前や型が異なるコントロールも処理できます。

たとえば、2 つの Button コントロール (Button1 と Button2) と 1 つの CheckBox コントロール (CheckBox1) をフォームに追加し、3 つすべてのコントロールの Click イベントを処理するイベント ハンドラを作成できます。

Private Sub MixedControls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, CheckBox1.Click

コントロールの反復処理

Visual Basic 6.0 コントロール配列の別の機能として、Index プロパティを使ってコントロールのグループを反復処理する機能がありました。たとえば、コントロール配列内のすべての TextBox コントロールのテキストをクリアするには、Index プロパティをループ変数として使って、コントロール配列をループ処理できます。

Visual Basic 2008 のコントロールには Index プロパティはありませんが、Control クラスの Control.ControlCollection を使うと、フォーム上またはコンテナ上のコントロールを反復処理できます。

Visual Basic 6.0 では、同じコントロール配列に含まれるコントロールが複数のコンテナに配置されている場合がありました。たとえば、別々の Frame 上に配置された 2 つの TextBox コントロールを同じコントロール配列に格納できます。

Visual Basic 2008 では、Controls コレクションは、同じコンテナに配置されたコントロールを常に返します。反復処理は、各コンテナ コントロールのコントロールに個別に行う必要があります。この処理は、再帰関数を使って実行できます。

実行時のコントロールの追加

Visual Basic 6.0 では、Load ステートメントを使って、実行時にコントロールをコントロール配列に追加できました。コントロールはコントロール配列と同じ型であることが必要で、デザイン時には少なくとも 1 つの要素を格納してコントロール配列を作成する必要があります。コントロールを追加した後で、Visible プロパティを True に設定する必要があります。

Visual Basic 2008 でコントロールを実行時に追加するには、Dim ステートメントで New キーワードを使用してから、コントロールを追加するコンテナの Add メソッドを使用します。

実行時のイベント ハンドラの追加

Visual Basic 6.0 では、実行時にコントロールをコントロール配列に追加すると、新しいコントロールのイベントはコントロール配列のイベントで自動的に処理されました。

Visual Basic 2008 では、実行時に追加するコントロールにはイベント ハンドラを定義する必要があります。これは、AddHandler ステートメントを使って行うことができます。

コントロール配列を扱うコードの変更

次のコード例は、Visual Basic 6.0 と Visual Basic 2008 でのコーディング テクニックの違いを示しています。

イベント ハンドラの共有

次のコード例は、3 つの TextBox コントロールの Change イベント ハンドラ (Visual Basic 2008 では TextChanged) を共有する方法を示します。Visual Basic 2008 では、イベント ハンドラの Handles 句を使って、イベントがどのコントロールを処理するのかを指定します。イベント ハンドラは、汎用の Object を返すので、DirectCast メソッドを使って処理対象のオブジェクト型 (この例では TextBox) にキャストする必要があります。

' Visual Basic 6.0

Private Sub Text1_Change(Index As Integer)

Select Case Index

Case 0

MsgBox("The text in the first TextBox has changed")

Case 1

MsgBox("The text in the second TextBox has changed")

Case 2

MsgBox("The text in the third TextBox has changed")

End Select

End Sub

' Visual Basic
Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles TextBox1.TextChanged, _
TextBox2.TextChanged, TextBox3.TextChanged
    Select Case DirectCast(sender, TextBox).Name
        Case TextBox1.Name
            MsgBox("The text in the first TextBox has changed")
        Case TextBox2.Name
            MsgBox("The text in the second TextBox has changed")
        Case TextBox3.Name
            MsgBox("The text in the third TextBox has changed")
    End Select
End Sub
メモ :

Visual Basic 2008 では、イベントの動作が少し変更されています。コントロールが (たとえば Form_Load イベント内で) 初期化されたときや、テキストが実行時に変更されたときに、TextChanged イベントが生成されます。Visual Basic 6.0 では、Change イベントが生成されるのはテキストが変更されたときだけでした。

コントロールの反復処理

次のコード例は、テキスト ボックス コントロールのグループを反復処理し、それらのテキストをクリアするための関数を示します。Visual Basic 6.0 のコード例では、コントロール配列の Index プロパティをループ変数として使用します。

Visual Basic 2008 では、Control オブジェクトを引数として渡します。このオブジェクトには Control.ControlCollection コレクションがあり、このコントロール上に配置されているすべてのコントロールがこのコレクションに含まれています。Typeof 演算子を使って、各コントロールが TextBox 型かどうかを確認します。

メモ :

Form オブジェクトは、Control 型です。Form を引数として渡すこともできます。

入れ子になったコントロールは Control.ControlCollection コレクションに格納されないので、HasChildren メソッドを使って、コントロールに他のコントロールが含まれているかどうかを確認し、含まれている場合は ClearText 関数を再帰的に呼び出します。

' Visual Basic 6.0

Private Sub ClearText()

For i = 0 To Text1().UBound

Text1(i).Text = ""

Next

End Sub

' Visual Basic
Private Sub ClearText(ByVal container As Control)
    Dim ctrl As Control
    For Each ctrl In container.Controls
        If TypeOf (ctrl) Is TextBox Then
            ctrl.Text = ""
        End If
        If ctrl.HasChildren Then
             ClearText(ctrl)
        End If
    Next
End Sub

実行時のコントロールの追加

次のコード例は、実行時にフォームにテキスト ボックス コントロールを追加する方法を示します。Visual Basic 6.0 では、コントロールはコントロール配列に追加されます。Visual Basic 2008 では、コントロールが Control.ControlCollection コレクションに追加されます。Visual Basic 6.0 では、新しい TextBox のイベントは、自動的にコントロール配列で処理されました。Visual Basic 2008 では、AddHandler ステートメントを使ってイベント処理を設定する必要があります。

どちらのコード例も、テキスト ボックス コントロールがデザイン時にフォームに追加されると仮定し、Visual Basic 6.0 のコード例は、要素が 1 つあるコントロール配列が作成されたと仮定します。また、Visual Basic 2008 のコード例では、TextChangedHandler という名前のイベント ハンドラが最初の TextBox コントロールにあると仮定します。

' Visual Basic 6.0

Private Sub AddControl()

' Add a TextBox as the second element of a control array.

Load Text1(1)

' Set the location below the first TextBox.

Text1(1).Move Text1(0).Left, Text1(0).Top + 500

' Make the new TextBox visible

Text1(1).Visible = True

' Visual Basic
' Declare a new TextBox.
Dim TextBox2 As New TextBox
' Set the location below the first TextBox
TextBox2.Left = TextBox1.Left
TextBox2.Top = TextBox1.Top + 30
' Add the TextBox to the form's Controls collection.
Me.Controls.Add(TextBox2)
AddHandler TextBox2.TextChanged, AddressOf TextChangedHandler

アップグレード メモ

Visual Basic 6.0 で作成したアプリケーションを Visual Basic 2008 にアップグレードすると、コントロール配列は特別なコントロール固有のコントロール配列クラスにアップグレードされます。このようなクラスは、Microsoft.VisualBasic.Compatibility.VB6 名前空間に格納され、Visual Basic 6.0 のコントロール配列の動作をエミュレートするためにアップグレード ツールで使用されます。

これらのコントロール配列クラスを新しい Visual Basic 2008 開発に利用することは可能ですが、.NET Framework のイベント モデルと関数を使うことをお勧めします。

参照

概念

イベントおよびイベント処理 (Visual Basic 6.0 ユーザー向け)

その他の技術情報

Windows フォーム コントロール (Visual Basic 6.0 ユーザー向け)