Бесконечность форм
Недоступные формы. Создайте проект. В режиме проектирования добавьте в проект еще одну форму (как это делается, написано в 21.2). Перечитайте также 21.7. На первую форму (Form1) поместите две кнопки. Введите в ее окно кода такой код:
Dim Ф As Form2
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Ф = New Form2
Ф.Show()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Ф.BackColor = Color.Green
End Sub
Запустите проект. Щелкните несколько раз по первой кнопке, а затем один раз – по второй. Вот что вы увидите (Рис. 27.3).
Рис. 27.3
С каждым щелчком по первой кнопке порождается и показывается на экране очередной объект – экземпляр класса Form2. Спрашивается: почему при щелчке по второй кнопке окрасился только последний экземпляр?
Дело вот в чем. Переменная Ф объявлена классом Form2, значит она имеет ссылочный тип. При первом щелчке по первой кнопке в памяти была создана большая область для объекта класса Form2, в которой предусмотрено место для хранения всех многочисленных свойств формы. Переменная же Ф получила значение ссылки на эту область. При втором щелчке в памяти была создана еще одна область для объекта класса Form2, а переменная Ф получила значение ссылки уже на эту новую область, потеряв, естественно, ссылку на старую. Очевидно, переменная Ф всегда ссылается только на последнюю созданную форму, поэтому при щелчке по второй кнопке обращается только к ней.
Поскольку ссылки на все формы, кроме последней, потеряны, то вы из кода никак не можете к ним обратиться и ничего не можете с ними сделать, даже закрыть. А вот вручную – пожалуйста! Таскайте мышкой, закрывайте и т.п.
Коллекция форм. Как исправить это положение? Пусть вам хочется управлять из кода всеми созданными формами. Создайте коллекцию и каждую созданную форму добавляйте в нее. Тогда к каждой форме можно обращаться, как к члену коллекции, по индексу. Вот код:
Dim Форма As New Collection
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Ф As New Form2
Ф.Show()
Форма.Add(Ф)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Форма(3).BackColor = Color.Green
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim i As Integer
For i = 1 To Форма.Count
Форма(i).Text = "Форма " & i
Next
End Sub
Щелкая по первой кнопке, мы создаем очередную форму, показываем ее на экране и добавляем в коллекцию. Щелкнув раз шесть, щелкните один раз по второй кнопке, которая покрасит третью форму, и один раз по третьей кнопке, которая поменяет заголовки у всех форм (см. Рис. 27.4).
Рис. 27.4
Член нашей коллекции не обладает всем богатством свойств формы Form2. Поэтому, если мы, скажем, добавим на Form2 текстовое поле и захотим покрасить вышеописанным способом текстовые поля на всех экземплярах формы, то нам не удастся этого сделать. Спасает положение следующий код:
Dim Объект As Form2
For Each Объект In Форма
Объект.TextBox1.BackColor = Color.Yellow
Next