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 メソッドを使用して、アプリケーションの動作を再作成するコードを追加する必要があります。