ПОНЯТНО О Visual Basic NET (том 3)

         

Бесконечность форм


Недоступные формы. Создайте проект. В режиме проектирования добавьте в проект еще одну форму (как это делается, написано в 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


Содержание раздела