Проект с несколькими формами
Все приложения Windows, которые мы до этой главы создавали, после запуска работали в одном окне. Окном этим служила форма, на которой мы и собирали проект. Однако, вы вполне можете создать приложение, которое работает в двух или нескольких окнах. В этом случае для каждого окна вам понадобится в проекте своя форма.
Зачем это нужно? Вот зачем. Пусть, например, вы создали игру в шахматы. Игра идет, как обычно, в одном окне. Пока компьютер обдумывает свой ход, вы, чтобы не скучать, щелчком по кнопке запускаете новое окно, в котором играете с компьютером в созданный вами же тетрис. Теперь у вас на экране два окна. Когда компьютер сделает ход, вы можете поставить тетрис на паузу и продолжить игру в шахматы. При создании этого проекта вам нужно иметь в проекте две формы, одну для шахмат, другую – для тетриса.
Как. Посмотрим, как создать в проекте вторую форму и как наладить взаимодействие между двумя формами.
Создадим новый проект. При этом, как обычно, будет автоматически создана форма Form1. Чтобы добавить в проект еще одну форму, поступаем так же, как при добавлении модуля: Project ® Add New Item ® в возникшем окне Add New Item (Рис. 21.1) выбираем Windows Form ® Open. Вы видите, что в окне Solution Explorer появился значок Form2.vb, а в проект добавилась форма Form2, которую мы видим в окне Form2.vb[design]. Щелкните по значку Form1.vb в окне Solution Explorer, затем View ® Code, затем проделайте то же для другой формы – и вот у вас в проекте уже 4 окна: окно кода и окно конструктора для каждой из форм. Таким образом VB предоставляет удобную возможность программировать все происходящее в каждой форме в окне кода, принадлежащем именно этой форме.
Запустите проект. На экране появилась первая форма, а вторая – нет. Зайдите в Project ® WindowsApplication1 Properties и в качестве стартового объекта выберите Form2. Теперь на экране появилась вторая форма, а первая – нет. Снова выберите Form1.
Разместите на формах элементы управления согласно Рис. 21.6 и Рис. 21.7.

Рис. 21.6

Рис. 21.7
Добавьте в проект стандартный модуль. Поместите в окна кода модуля и обеих форм следующий текст:
Модуль:
Module Module1
Public F1 As Form1
Public F2 As Form2
End Module
Первая форма:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.BackColor = Color.Blue
F2.BackColor = Color.Yellow
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
TextBox1.Text = "Форма Form1 приветствует саму себя!"
F2.TextBox1.Text = "Привет форме 2 от формы 1!"
F2.Focus()
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
F1 = Me
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
F2 = New Form2
F2.Show()
End Sub
Вторая форма:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.BackColor = Color.White
F1.BackColor = Color.Tomato
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
TextBox1.Text = "Форма Form2 приветствует саму себя!"
F1.TextBox1.Text = "Привет форме 1 от формы 2!"
F1.Focus()
End Sub
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.Text = "Я родилась!"
End Sub
Пояснения: Прежде всего, несколько слов о том, видны ли модульные переменные из других модулей. Если они объявлены как обычно словом Dim, то не видны, а если словом Public – то видны. Более подробно об этом написано в 21.9.
Модули обычно используются в качестве общедоступного склада для переменных, констант, процедур, функций и других элементов VB. Возьмите, например, модули Strings и DateAndTime пространства имен Microsoft. VisualBasic.
В нашем случае модуль понадобился для объявления двух общедоступных переменных: F1 и F2. Зачем они нужны? Почему именно модуль? Ограничусь «полуобъяснением», отложив объяснение до более поздних времен. Переменная F1 объявляется, как объект класса Form1. Это значит, что после загрузки формы Form1 мы хотим к ней обращаться по имени F1. Но этого мало. С этой же целью в процедуру Form1_Load вставлен оператор
F1 = Me
чтобы «все» знали, что F1 ссылается именно на этот «экземпляр» формы.
После запуска проекта форма Form1 появляется на экране. Чтобы появилась и форма Form2, нажимаем кнопку Button3. Оператор
F2 = New Form2
порождает эту форму как объект класса Form2. А чтобы форма стала видна, выполняется оператор
F2.Show()
Теперь у вас на экране обе формы и вы можете работать с каждой из них, нажимая кнопки и вводя текст в текстовые поля (Рис. 21.8).

Рис. 21.8
Я понимаю, что после такого «полуобъяснения» у вас возникло множество «почему». Отложите их на потом. К концу книги они должны рассеяться.
Посмотрите на содержимое процедур Button1_Click в обоих окнах кода. Вы видите, что первая строка обеих процедур красит своего хозяина, вторая – соседа. Таким образом, в каждом окне кода можно, как и обычно, писать операторы, приказывающие что-то сделать в форме-хозяине данного окна, а можно с таким же успехом писать операторы, приказывающие что-то сделать в любой другой форме проекта. Чтобы VB понимал, о какой форме идет речь, перед именем свойства, принадлежащего чужой форме, нужно писать имя этой формы (в нашем случае F1 или F2) с точкой. Если же форма своя, то вместо имени хозяина можно писать слово Me или вообще ничего не писать. Так в процедуре Button1_Click первой формы вместо
Me.BackColor = Color.Blue
можно написать
F1.BackColor = Color.Blue
или просто
BackColor = Color.Blue
Теперь посмотрите на содержимое процедур Button2_Click в обоих окнах кода. Вы видите, что первая строка обеих процедур выводит текст в текстовое поле TextBox1 своего хозяина, вторая – в текстовое поле TextBox1 соседа. Третья строка обеих процедур при помощи метода Focus, принадлежащего соседу, переводит фокус на соседа. Таким образом, мы можем обращаться не только к свойствам чужой формы, но и к ее элементам управления, и к методам. К ним тоже применимо соглашение об имени хозяина с точкой.
Чуть позже вы увидите, что из одной формы можно обращаться не только к свойствам, объектам и методам, принадлежащим другой форме, но и к переменным, процедурам и другим элементам. Правило везде одно:
Перед именем элемента, принадлежащего другой форме, нужно ставить имя формы-хозяина с точкой.