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

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

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

Рассмотрим программный код проекта, состоящего из двух стандартных модулей, двух форм и одного класса, представленный на рис. 2.4-1, а также результат его работы на рис. 2.4-2.

Рис. 2.4-1. Программный код проекта из двух стандартных модулей, двух форм и класса

Результаты работы проекта из двух модулей, двух форм и класса

Рис. 2.4-2. Результаты работы проекта из двух модулей, двух форм и класса

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

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

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

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

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

Что же касается класса и нестартовой формы, то для того чтобы они пришли в рабочее состояние, надо создать их экземпляры (объекты). Создание этих объектов с помощью конструктора по умолчанию New происходит в первом стандартном модуле. Напомним: если необходимо использовать нестатические (эк- земплярные) поля и методы класса (а в нашем классе Класс поле и метод именно такие, так как они объявлены без модификатора Shared), то чтобы класс заработал, нам нужно из него создать объект. Что и делает следующий оператор:

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

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

Если форма — стартовый объект, эти заботы берет на себя VB.

Если форма — нестартовый объект, программист должен сам создать ее как объект из ее класса, а затем показать на экране. Это можно реализовать с помощью двух операторов — оператора, который создает форму как объект класса Form2 (в нашем проекте этот оператор записан в первом стандартном модуле):

Public Форма2 As New Form2

и оператора, показывающего форму:

Форма2.Show()

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

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

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

Public Форма2 As New Form2

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

Форма2.Show()

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

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

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

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

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

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

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

Грамматически обращение к переменным и процедурам разных модулей происходит следующим образом:

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

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

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

Пример 2.4-2. Способы обращения к собственной переменной.

Рассмотрим код, представленный на рис. 2.4-3, показывающий разные способы обращения к собственной переменной из формы, стандартного модуля и из класса, дающие один и тот же результат (код стандартного модуля Module 1 такой же, как в Примере 2.4-1, и в нем создаются Форма2 и Объект).

Рис. 2.4-3. Способы обращения к собственной переменной

Из текста процедуры Buttonl_Click (...) первой формы Примера 2.4-1 (рис. 2.4-1) становится также ясно, что с переменными и процедурами формы можно работать еще до того, как форма появилась на экране.

Пример 2.4-3. Создать несколько объектов из одного класса.

Для иллюстрации работы с двумя объектами одного класса создать проект из формы, модуля и класса. На форму поместить кнопку, текстовое поле и ввести программный код, приведенный на рис. 2.4-4.

Рис. 2.4-4. Создание нескольких объектов из одного класса

Результаты создания нескольких объектов одного класса

Рис. 2.4-5. Результаты создания нескольких объектов одного класса

Результат представлен на рис. 2.4-5.

Стандартный модуль Modulel конструктором New создает из класса Класс два объекта: Обгьект1 и Обгьект2. При создании они абсолютно одинаковы и размешаются рядом в оперативной памяти. В каждом объекте выделяется память под переменную (поле класса) С.

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

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

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

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

Создадим проект из двух форм и модуля. На первую форму поместим кнопку, на вторую форму — 3 кнопки. Покажем, что из одного класса формы можно порождать несколько объектов-форм, причем эти объекты ведут себя так же, как и объекты, порождаемые из модуля класса в предыдущем примере, т. е. сначала одинаковы, а затем могут различаться. Это наглядно показывается при работе с цветом фона формы. Введем программный код, приведенный на рис. 2.4-6.

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

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

Основное различие между классами и модулями состоит в том, что классы могут быть инициализированы как объекты, а модули — нет. Классы являются объектно-ориентированными, а модули — нет. Пользователь может создать один или несколько экземпляров класса. Но существует только одна копия данных стандартного модуля, поэтому при изменении одной частью программы общей переменной в стандартном модуле при последующем чтении этой переменной любая другая часть программы получает измененное значение. Напротив, объект данных класса существует отдельно для каждого экземпляра объекта класса. В отличие от стандартных модулей, классы могут реализовывать интерфейсы, которые мы будем рассматривать в Теме 3.

Классы и модули используют различные области действия для своих членов. Члены, определенные внутри класса, находятся в определенном экземпляре класса и существуют только во время существования объекта. Для доступа к членам класса за пределами класса необходимо использовать полные имена в формате Объект. Член. С другой стороны, члены, объявленные в модуле, общедоступны по умолчанию, и доступ к ним может осуществить любой код, имеющий доступ к модулю. Это означает, что переменные в стандартном модуле являются фактически глобальными переменными, так как они видимы из любой части проекта и существуют во время выполнения программы.

Однако если член класса является статическим (когда к нему применяется модификатор Shared), он связан с самим классом непосредственно, а не через экземпляр класса. Непосредственный доступ к члену осуществляется с помощью имени класса. Тем же способом осуществляется доступ к членам модуля.

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >