Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.docx
Скачиваний:
16
Добавлен:
14.11.2019
Размер:
58.48 Кб
Скачать

Решение (Solution). Несколько проектов в решении

При дальнейшей работе с VB у вас могут встретиться ситуации, когда вы разрабатываете одновременно несколько похожих, взаимодействующих или связанных каким-то образом проектов. В этом случае бывает удобно открыть их всех в одной среде VS в пределах так называемого решения (Solution).

Делается это так. Первый проект открывается обычным образом. Наш проект сразу же после создания уже находится внутри решения состоящего из одного этого проекта. Решение это было непрошенным, но таков закон Solution Explorer: любой проект должен находиться внутри решения.

Кстати, когда решение состоит из одного проекта, то все равно, каким файлом запускать проект:

файлом проекта (WindowsApplicationl.vbproj)

или файлом решения (WindowsApplicationl.sin).

Чтобы добавить к решению еще один проект, нельзя использовать, как вы привыкли, File —> Open —> Project (открыть проект), так как при этом уже открытый проект или решение закроется, освободив место для открываемого.

Нужно использовать File —» ->Add Project (добавить проект). Откроется подменю, глядя в которое вы должны решить, хотите ли вы добавить в среду разработки новый проект (New Project) или же один из уже существующих (Existing Project).

В результате в окне Solution Explorer вы увидите решение из двух проектов.

Какой из двух проектов будет запускаться, когда вы привычно нажмете кнопку Start на панели инструментов? Тот, что выделен полужирным шрифтом. Вы сами можете задать, какой проект будет стартовать, щелкнув правой клавишей мыши в окне Solution Explorer по названию нужного проекта, а затем в открывшемся контекстном меню выбрав Set as StartUp Project. Аналогичным образом можно удалить проект из решения (не с диска), выбрав в этом же контекстном меню Remove.

Никаких папок для решения не создается. Проекты остаются в своих папках, несмотря на то, что один и тот же проект может входить в несколько решений.

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

Если вы не знаете, как удобно скопировать код, элементы управления или другие компоненты из одного проекта в другой, просто запустите две среды Visual Studio .NET, в каждой откройте свой проект и копируйте.

Создаем классы и объекты

Философия. Класс - это фундамент современного объектного программирования. Классами библиотеки классов .NET Framework можно пользоваться двояко: без создания объекта и с созданием объекта. В первом случае, чтобы воспользоваться возможностями класса, надо просто написать имя класса, точку и имя нужного нам свойства или метода этого класса.

Во втором случае, чтобы воспользоваться возможностями класса, надо сначала создать объект - экземпляр этого класса, а уж затем писать имя объекта (а не класса), точку и т. д.

Создаем класс. Создается класс совершенно аналогично стандартному модулю.

Ссоздайте новый проект —» Project —» Add New Item —» в возникшем окне Add New Item выбираем Class —» Open.

Вы видите, что в окне Solution Explorer появился значок Classl.vb, а в проект добавилось окно Classl.vb, предназначенное для ввода кода:

Public Class Classl

End Class

Переименуем в окне кода этот класс на Класс и запишем в него такой код:

Public Class Класс

Public С1 As Integer =2281

Public Sub Процедура()

Debug. WriteLine(2004)

End Sub

End Class

При объявлении переменной CI вместо слова Dim написано слово Public. Это означает, что переменная С1 будет видна не только в своем классе, но и изо всех модулей проекта. Это же слово с тем же смыслом употреблено и при объявлении процедуры.

Мы видим, что в простейшем случае класс - не более чем собрание переменных, процедур и других компонентов, т. е. не более чем стандартный модуль. Так же, как и в модуле, в нем нет ничего видимого - ни формы, ни элементов управления. Но ценность и сила его, конечно, в объектах, которые могут быть из него порождены.

Стандартный модуль объекты порождать, не способен.

Создаем объект и пользуемся им.

Поместите на форму кнопку и запишите в окне кода формы такой текст:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttonl.Click

Dim Объект As New Класс

Debug. WriteLine(Оbeicr.C1)

Объект.Процедура()

End Sub

Запустите проект, нажмите кнопку, проект напечатает следующее:

2281

2004

Первая строка процедуры создает объект - экземпляр созданного нами класса. Делается это при помощи слова New. После этого мы можем пользоваться переменными и процедурами объекта из других модулей. Перед именем переменной или процедуры объекта мы обязаны писать имя объекта (а не класса) с точкой.

Обратите внимание, что в списке компонентов объекта, разворачивающемся после ввода точки, вы видите как переменную С1, так и процедуру Процедура.

Взаимодействие форм, модулей и классов в проекте

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

Создайте проект из двух форм, двух модулей и класса.

На первую форму поместите кнопку. В окна кода введите такой текст:

Первая форма

Public Class Forml

Inherits System-Windows. Forms. Form

IWindows Form Designer generated code.

Private Sub Buttonl _Click(ByVal sender As System.Object, ByVal e

As System.EventArgs) _Handles Buttonl.Click

Debug.WriteLine(M2)

Debug. WriteLine(Объект.C1)

Debug,WriteLine(Форма2.F2)

Процедура_модуля2()

Объект.Процедура_класса()

Форма2.Процедура_формы2()

Форма2.Show()

End Sub

End Class

Первый модуль

Module Modulel

Public Форма2 As New Form2

Public Объект As New Класс

End Module

Вторая форма

Public Class Form2

Inherits System.Windows.Forrns.Form

Windows Form Designer generated code

Public F2 As String = "F2"

Public Sub Процедура_формы2()

Объект.С1 = "Форма 2 изменила переменную С1 из Объекта"

Debug. WriteLine( Объект.С1)

End Sub

End Class

Второй модуль

Module Module2

Public M2 As String = "M2"

Public Sub Процедура_модуля2()

Форма2.F2 = "Модуль 2 изменил переменную F2 из формы 2"

Debug.WriteLine(Форма2.F2)

End Sub

End Module

Класс

Public Class Класс

Public C1 As String = "C1"

Public Sub Процедура_класса()

M2 = "Объект изменил переменную М2 из модуля 2"

Debug.WriteLine(M2)

End Sub

End Class

Запустите проект, нажмите кнопку, проект напечатает следующее:

М2

С1

F2

Модуль 2 изменил переменную F2 из формы 2

Объект изменил переменную М2 из модуля 2

Форма 2 изменила переменную С1 из Объекта

Сходство и различия будем прослеживать у трех модулей, а именно у второго стандартного модуля, второй формы и класса. Вы видите, что их код написан почти одинаковым, если не считать, конечно, начальные строки кода у формы. Код всех этих трех модулей содержит объявление переменной и объявление процедуры. И та и другая объявлены как Public, чтобы и той и другой можно было пользоваться из любого модуля проекта.

Когда форма, модуль и класс могут начать работу?

! Если форма - стартовый объект, VB сам, без нашего вмешательства и загружает ее, и показывает на экране.

Стандартные модули тоже безо всяких забот программиста готовы к работе и использованию сразу после запуска проекта.

Это значит, что форма Forml и оба модуля готовы к работе и использованию сразу после запуска проекта.

Что же касается класса и не стартовой формы, здесь дело другое. В нашем проекте забота о том, чтобы они пришли в рабочее состояние, лежит на первом стандартном модуле. Взгляните на две строки его кода.

! Если мы хотим использовать класс как объект, то, чтобы класс заработал, нам нужно из него создать объект.

Что и делает оператор

Public Объект As New Класс,

Теперь о форме. Форма, оказывается, тоже класс. Чтобы убедиться в этом, достаточно взглянуть на первую строку окна ее кода. А раз так, то, чтобы она заработала в проекте, из нее тоже должен быть создан объект и показан на экране.

! Если форма - не стартовый объект, программист должен сам создать ее как объект из ее класса, а затем показать на экране.

Первое делает оператор

Public Форма2 As New Form2

а второе - оператор

Форма2.Show()

Строки стандартного модуля, объявляющие переменные, выполняются автоматически.

Из чего следует, что нам не нужно опасаться, будут ли созданы объекты Объект и Форма2 к тому моменту, когда в них возникнет нужда. Потому и записаны две строки, их создающие, именно в стандартный модуль, потому что он сразу же после запуска проекта готов к работе, чего не скажешь о классе и форме (если она не стартовая, конечно).

Взаимные различия и сходство формы и класса.

Когда вы в режиме проектирования работаете над формой Form2, добавляете в нее элементы управления, пишете код в окно ее кода, вы создаете и видите перед собой класс (не объект) Form2.

Когда же вы запускаете проект и выполняете оператор

Public Форма2 As New Form2

вы создаете из этого класса

объект Форма2,

как экземпляр класса Form2. Форма (объект, а не класс) создана, и вы можете пользоваться ее переменными и процедурами.

Но на экране она не видна. Чтобы ее увидеть и пользоваться ее элементами управления, вы должны выполнить оператор

Форма2.Show().

Аналогично, когда вы в режиме проектирования пишете код в окне модуля класса, вы создаете класс, а когда вы запускаете проект и выполняете оператор

Public Объект As New Класс

вы порождаете из этого класса

объект Объект,

как экземпляр класса Класс.

В чем же отличие формы от класса? В том, что создатели VB для удобства программистов снабдили формы механизмом визуализации. Это значит, что как в режиме проектирования, так и в режиме рабаты мы форму на экране видим. Специальные, скрытые от программиста методы рисуют и перерисовывают как форму, так и все ее элементы управления.

Класс же лишен механизма визуализации. Поэтому объекты, порожденные из него, невидимы. У них не может быть ни кнопок, ни меток, ни других элементов управления. Когда им надо сделать что-то "видимое", они "дергают за ниточки" форму и ее элементы управления, а также рисуют на их поверхности.

Правила обращения к переменным и процедурам.

Ниже под модулем понимается или форма, или класс, или стандартный модуль.

Просмотрите код процедуры Buttonl Click первой формы и коды процедур в остальных модулях и обратите внимание на то, как грамматически происходит обращение к переменным и процедурам. Вы увидите следующее:

Чтобы обратиться к переменной или процедуре, объявленным в стандартном модуле, достаточно написать имя переменной или процедуры без указания имени модуля.

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

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

Перед именем переменной или процедуры, объявленной в стандартном модуле, имя модуля писать не запрещено. Это бывает даже необходимо, когда в нескольких стан­дартных модулях объявлены переменные или процедуры с одинаковыми именами. Иначе их не различишь.

Все вышесказанное касается случая, когда нужно обратиться к переменной или процедуре, объявленным в чужом модуле. Когда же нужно обратиться к переменной или процедуре, объявленным в своем модуле, все просто: пишите имя переменной или процедуры и все. Иногда, правда, бывает удобно или даже необходимо указать имя хозяина или Me. Это не возбраняется (правда, в случае стандартного модуля слово Me писать нельзя).

Ниже для примера приведены разные способы обращения к собственной переменной, дающие один и тот же результат.

Вторая форма

Public F2 As String = "F2"

Public Sub Процедура_формы2()

Debug.WriteLine(F2)

Debug.WriteLine(Me.F2)

Debug.WriteLine(Форма2.F2)

End Sub

Второй модуль

Public М2 As String = "М2"

Public Sub Процедура_модуля2()

Debug.WriteLine(M2)

Debug.WriteLine(Module2.M2)

End Sub

Класс

Public C1 As String = "C1"

Public Sub Процедура_класса()

Debug. WriteLine(CI)

Debug.WriteLine(Me.CI)

Debug. WriteLine(Объект.C1)

End Sub

Из текста процедуры Buttonl Click становится также ясно, что с переменными и процедурами формы можно работать еще до того, как форма появилась на экране.

Создание нескольких объектов из одного класса

Создайте проект из формы, модуля и класса. На форму поместите кнопку. В окна кода введите такой текст:

Модуль

Module Modulel

Public Объект1 As New Класс

Public Объект2 As New Класс

End Module

Класс

Public Class Класс

Public С As Integer =10

Public Sub Процедура()

Объект1.С = 101

Объект2.С = 102

End Sub

End Class

Форма

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles

Buttonl .ClickDebug.WriteLine(Объект.C)

Debug.WriteLine (Объект2.С)

Объект1 .С = 1

Объект2.С = 2

Debug. WriteLine(Объектl.С)

Debug.WriteLine(Объект2.C)

Объект1.Процедура()

Debug. WriteLine(Объектl.С)

Debug.WriteLine(Обект2.C)

End Sub

Запустите проект, нажмите кнопку, проект напечатает следующее:

10; 10; 1; 2; 101; 102.

Мы видим, что модуль создает из класса Класс два объекта: Объект 1 и Объект2. При создании они абсолютно одинаковы и размещаются рядышком в оперативной памяти. Как выглядят они в оперативной памяти? Не нужно представлять себе, что каждый из них является копией программного текста из окна кода класса. Для нас важно знать, что в каждом объекте располагаются ячейки памяти под переменные, объявленные в классе. В нашем случае в каждом объекте располагается ячейка под переменную С.

В коде класса переменная С инициализируется значением 10, а это значит, что она станет такой в обоих объектах, что и подтверждают результаты выполнения первых двух строк процедуры Button1 Click.

После выполнения следующих двух строк процедуры объекты перестают быть близнецами. Теперь в ячейке С у первого объекта единица, а у второго - двойка, что и подтверждается печатью.

Объект может и сам изменять значения переменных, как в себе, так и в своем братце. Убедитесь в этом, просмотрев процедуру в классе.

Создание нескольких объектов-форм из одного класса формы

Создайте проект из двух форм и модуля. На форму 1 поместите кнопку, на форму 2 три кнопки.

В окна кода введите такой текст:

Модуль

Module Modulel

Public Форма1 As New Form2

Public Форма2 As New Form2

End Module

Форма 1 •

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttonl.Click

Форма1,Show()

Форма2.Show()

End Sub

Форма 2

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttonl.Click

Me.BackColor = Color.Blue

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Me.BackColor = Color.Red

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Форма.Text = "Форма”

Форма1.BackColor = Color.Black

Форма2.Техt = "Форма2"

Форма2.ВаскСо1ог = Color.White

End Sub

Запустите проект, нажмите кнопку формы 1, на экране появятся две совершенно одинаковые формы-близнеца. Даже заголовок у них одинако­вый - Form2. При щелчках по первым двум кнопкам близнецов каждый близнец красит себя то в синий, то в красный цвет. Только себя, а не сестру. Потому что в коде написано Me. Таким образом, близнецы очень скоро перестают быть близнецами.

Третья кнопка показывает, что каждая из форм может изменять не только себя, но и сестру.