Создаем объекты из класса
Вручную. Создайте проект. Разместите на форме несколько кнопок. Знаете, что вы сейчас сделали? Догадайтесь. Ну конечно же, вы создали несколько объектов из класса! Класс – это Button, вот он – в облике кнопки Button в окне Toolbox. А вот созданные вами объекты в облике кнопок на форме – Button1, Button2, Button3. Это – экземпляры класса Button.
Вы видите, что при своем рождении объекты-кнопки одинаковы. Они во многом являются копиями своего класса. Во многом, но не во всем. После рождения вы можете изменять свойства объектов, например, одну кнопку растянуть и покрасить в желтый цвет, другую – уменьшить и покрасить в синий цвет. Однако, яблочко от яблони недалеко падает, поэтому кнопка останется кнопкой, сколько бы вы ни меняли ее внешний вид.
Аналогично вы можете «отштамповать» сколько угодно объектов из класса TextBox и других.
В коде. Объекты из класса можно создавать не только вручную в режиме проектирования, как мы только что сделали, но и запрограммировав это действие в окне кода. Напишите такой код для кнопки, скажем, Button2:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim Кнопка1 As Button
Кнопка1 = New Button()
Кнопка1.Text = "Кнопка №1"
Debug.WriteLine(Кнопка1.Width)
Me.Controls.Add(Кнопка1)
Dim Кнопка2 = New Button()
Кнопка2.Text = "Кнопка №2"
Me.Controls.Add(Кнопка2)
Кнопка2.Location = New Point(0, 50)
End Sub
Запустите проект. Нажмите кнопку Button2 – у вас на форме появятся еще две кнопки. Теперь выполните проект в пошаговом режиме, одновременно читая пояснения.
Пояснения:
Создаваемый объект нужно объявлять. Так, объявляя числовую переменную, вы придумывали ей имя и указывали, чтобы она принадлежала типу, скажем, Double, поэтому писали оператор
Dim Глубина As Double
Согласно этому оператору VB отводил в памяти место под переменную типа Double.
Объявляя объект, вы тоже придумываете ему имя и указываете, чтобы он принадлежал типу, скажем, Button, поэтому пишете оператор
Dim Кнопка1 As Button
Button – это один из многих типов (классов) объектов – элементов управления.
Глубина – это переменная величина, имеющая тип Double, являющийся числом.
Кнопка1 – это переменная величина, имеющая тип Button, являющийся классом.
Говорят, что переменная Кнопка1 имеет объектный тип. Это значит, что ее значением является не число и не строка, а объект – экземпляр класса. Пусть вас не удивляет, что такая сложная вещь, как объект, может быть значением такой простой вещи, как переменная величина. В конце концов, значением переменной величины Город_где_я_сейчас_нахожусь является такая грандиозная вещь, как Москва.
Итак, после выполнения первой строки в процедуре компьютер знает, что переменная Кнопка1 будет кнопкой, но новая кнопка пока еще не создана. Чтобы убедиться в этом, поставьте мышь в окне кода на слово Кнопка1 – всплывет подсказка Кнопка1=Nothing. Слово Nothing по-английски – «Ничто».
Чтобы создать кнопку, вы выполняете оператор
Кнопка1 = New Button()
Слово New вместе с Button означает, что создается НОВЫЙ объект класса Button. В этот момент и «штампуется тарелка». Чтобы убедиться в этом, поставьте мышь на слово Кнопка1 – всплывет подсказка Кнопка1={System.Windows.Forms.Button}. Это означает, что Кнопка1 стала объектом класса Button пространства имен System.Windows.Forms. VB отводит в памяти место под объект класса Button.
Объект создан, но создан только в памяти компьютера, на поверхности формы он пока не виден. Тем не менее, мы уже можем менять его свойства и узнавать их значение:
Кнопка1.Text = "Кнопка №1"
Debug.WriteLine(Кнопка1.Width)
Чтобы кнопка появилась на форме, форма должна «принять ее в свое лоно», добавить (Add) ее в коллекцию своих элементов управления (Controls):
Me.Controls.Add(Кнопка2)
Подробнее о коллекциях см. в 16.2.
(В пошаговом режиме созданная кнопка будет реально видна только после завершения процедуры.)
Создадим теперь из того же класса Button еще одну кнопку. Для краткости оператор объявления и оператор создания объекта объединяем в один:
Dim Кнопка2 = New Button()
Далее аналогично:
Кнопка2.Text = "Кнопка №2"
Me.Controls.Add(Кнопка2)
По умолчанию все кнопки появляются на форме в ее левом верхнем углу, и чтобы новая кнопка не загородила старую, я сдвину ее на 50 пикселей вниз:
Кнопка2.Location = New Point(0, 50)
Смысл этой строки вы поймете позже, а сейчас не будем отвлекаться.
Наши новые кнопки выглядят вполне прилично, но ничего пока не умеют делать. Как научить их работать, написано в 22.13.
Мы сейчас создавали элементы управления. Однако классов в VB гораздо больше, чем элементов управления. Как создавать объекты из них? Это делается в коде и совершенно аналогично тому, как мы делали это только что.