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

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


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

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

Первая форма:

Public Class Form1

    Inherits System.Windows.Forms.Form

Windows Form Designer generated code

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

        Debug.WriteLine(M2)

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

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

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

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

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



        Форма2.Show()

    End Sub

End Class

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

Module Module1

    Public Форма2 As New Form2

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

End Module

Вторая форма:

Public Class Form2

    Inherits System.Windows.Forms.Form

Windows Form Designer generated code

    Public F2 As String = "F2"

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

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

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

    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 = "Объект  изменил переменную M2 из модуля 2"

        Debug.WriteLine(M2)

    End Sub

End Class

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

M2

C1

F2

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

    Public Форма2 As New Form2

а второе – оператор

        Форма2.Show()

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

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

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

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



    Public Форма2 As New Form2

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

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

        Форма2.Show()

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

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

вы порождаете из этого класса объект Объект, как экземпляр класса Класс.

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

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

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

Если переменная или процедура объявлены с помощью слова Public, то они видны и доступны не только из своего модуля, но и из других модулей проекта.

Внимательно просмотрите код процедуры Button1_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 M2 As String = "M2"

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

        Debug.WriteLine(M2)

        Debug.WriteLine(Module2.M2)

    End Sub

Класс:

    Public C1 As String = "C1"

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

        Debug.WriteLine(C1)

        Debug.WriteLine(Me.C1)

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

    End Sub

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


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