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

       

Проект с несколькими формами


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

Чуть позже вы увидите, что из одной формы можно обращаться не только к свойствам, объектам и методам, принадлежащим другой форме, но и к переменным, процедурам и другим элементам. Правило везде одно:

Перед именем элемента, принадлежащего другой форме, нужно ставить имя формы-хозяина с точкой.


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