次の方法で共有


Controls コレクション (Visual Basic 6.0 ユーザー向け)

更新 : 2007 年 11 月

The Visual Basic 6.0 の Controls コレクションは、Visual Basic 2008 では Control.ControlCollection クラスに置き換えられています。

概念の違い

Visual Basic 6.0 の Controls コレクションは、フォームまたはコンテナ コントロール上のコントロールを表す要素を持つコレクションです。

Visual Basic 2008 では、Controls コレクションは Control.ControlCollection クラスに置き換えられています。フォームには、Me.Controls という構文でアクセスできる既定の Control.ControlCollection クラスがあります。

Add メソッド

Visual Basic 6.0 では、Controls コレクションの Add メソッドは遅延バインディングです。Control クラスを引数として渡すことにより、Add メソッドでコントロールが作成されます。

Visual Basic 2008 では、Control.ControlCollection クラスの Add メソッドを使ってコレクションに追加するコントロールは、New キーワードを使って前もって作成されている必要があります。

Remove メソッド

Visual Basic 6.0 の Controls コレクションの Remove メソッドは、Add メソッドで追加されたコントロールに対してしか使用できませんでした。Visual Basic 2008 の Control.ControlCollection クラスにはこのような制限はありません。

Timer コントロールおよび Menu コントロール

Visual Basic 6.0 では、Timer コントロールと Menu コントロールは Controls コレクションのメンバです。Visual Basic 2008 では、これらのコントロールは Timer コンポーネントおよび MainMenu または ContextMenu コンポーネントで置き換えられています。コンポーネントは、Control.ControlCollection クラスのメンバではありません。

コンテナ内のコントロール

Visual Basic 6.0 の Controls コレクションには、コンテナ コントロールの子であるコントロール (Frame コントロール上にあるコントロールなど) が含まれます。Visual Basic 2008 の Control.ControlCollection クラスには、これらは含まれません。フォーム上のすべてのコントロールを反復処理するには、各コンテナ コントロールの Controls クラスを再帰的に反復処理する必要があります。

Controls コレクションを扱うコードの変更

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

コントロールの追加や削除を行うコードの変更

次のコード例は、Visual Basic 6.0 の Controls コレクションと Visual Basic 2008 の Control.ControlCollection クラスの相違点を示しています。

' Visual Basic 6.0
Private Sub Command1_Click()
    ' Declare a new Control variable.
    Dim c As Control
    ' Create and add the new control.
    Set c = Controls.Add("VB.TextBox", "Text1")
    ' Make the new control visible.
    c.Visible = True
    ' Set the initial text.
    c.Text = "Hello"
    ' Retrieve the text from the new TextBox.
    If Controls.Count > 1 Then
        MsgBox (Controls("Text1").Text)
    End If
    ' Remove the new control.
    Controls.Remove (Text1)
    ' The following line causes a compilation error.
    ' You cannot remove controls added at design time.
    Controls.Remove (Command1)
End Sub
' Visual Basic
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    ' Create a new TextBox control.
    Dim TextBox1 As New System.Windows.Forms.TextBox
    TextBox1.Name = "TextBox1"
    ' Add the new control to the form's Controls collection.
    Me.Controls.Add(TextBox1)
    ' No need to set Visible property.
    ' Set the initial text.
    TextBox1.Text = "Hello"
    ' Retrieve the text from the new TextBox.
    If Me.Controls.Count > 1 Then
        MsgBox(Me.Controls("TextBox1").Text)
    End If
    ' Remove the new control.
    Me.Controls.Remove(TextBox1)
    ' Remove the control added at design time.
    Me.Controls.Remove(Button1)
End Sub

Controls コレクションを反復処理するコードの変更

次のコード例は、フォーム上のすべてのコントロールを反復処理してからすべての CheckBox コントロールをオフにする関数を示しています。この例では、CheckBox コントロールがフォームではなく GroupBox コントロールまたは Panel コントロールの上にあると仮定します。Visual Basic 2008 のコード例では、フォームの Controls コレクションに含まれるのはフォーム上に直接配置されたコントロールだけなので、関数は子のあるコントロールに対して自分自身を再帰的に呼び出します。

' Visual Basic 6.0
Private Sub ClearChecks()
    For Each Control in Me.Controls
        If TypeOf Control Is CheckBox Then
            Control.Value = vbUnchecked
        End If
    Next
End Sub
' Visual Basic
Private Sub ClearChecks(ByVal Container As Control)
    Dim ctl As Control
    Dim chk As CheckBox
    For Each ctl In Container.Controls
        If TypeOf ctl Is CheckBox Then
            chk = ctl
            chk.Checked = False
        End If
        ' Recursively call this function for any container controls.
        If ctl.HasChildren Then
            ClearChecks(ctl)
        End If
    Next
End Sub

アップグレード メモ

Visual Basic 6.0 と Visual Basic 2008 では Controls コレクションに相違点があるので、Add メソッドの呼び出しはアップグレードされません。新しい Add メソッドを使用して、アプリケーションの動作を再作成するコードを追加する必要があります。

参照

参照

Control.Controls

Form.ControlCollection