Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб3Объекты.doc
Скачиваний:
6
Добавлен:
17.09.2019
Размер:
190.98 Кб
Скачать

Работа с коллекциями

Несколько объектов можно объединить в коллекции. Коллекцией называют объект специального типа, который содержит другие объекты. К примеру, Access создает собственную коллекцию открытых форм, и ее можно использовать в коде VBA. Коллекции наиболее полезны в операциях поиска конкретных экземпляров объектов, в них содержащихся.

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

Private Sub Form_Load()

End Sub

В панели проектов должен присутствовать список форм.

Вот один из способов перечисления объектов в коллекции:

Эта процедура начинает свою работу с открытия трех форм. Далее используется специальная конструкция, созданная именно для этих целей. Цикл For. . .Each проходит по всему содержимому коллекции, присваивая переменной ф ссылку на каждый из объектов, в нем содержащийся. При использовании конструкции For. . .Each переменная счетчика цикла должна иметь тип объекта соответствующего типа.

Объектная модель

Коллекции и все элементы, которые они содержат, организуются в объектную модель. Объектной моделью называют диаграмму, показывающую связь между отдельными объектами в приложении. Например, коллекция Forms содержит отдельные объекты Form. В свою очередь, каждый из объектов Form содержит коллекцию Controls (Элементы управления), в которой хранится набор объектов Control.

Вот небольшая процедура, использующая показанный выше фрагмент объектной модели:

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

События

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

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

Создайте кнопку на форме фКлиент для перехода на форму фСклад с помощью мастера. Зайдите в свойства кнопки и задайте имя кнСклад и подпись Склад. Найдите событие «Нажатие кнопки» и справа щелкните на кнопке с тремя точками. Вставьте в процедуру инструкцию открытия формы фСклад. Проверьте работу кнопки.

В качестве имени события используется конструкция имяОбъекта_имяСобытия. Задать тело процедуры можно и в окне редактора VBE.

Для выявления ошибок, возникающих при обработке событий, можно использовать такой код. При возникновении ошибки будет выводиться сообщение: Ошибка Номер ошибки Описание ошибки в кнСклад_Click.

Область видимости и время жизни переменных

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

Выделяют три уровня области видимости переменных:

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

Уровень модуля. Переменные доступны всем процедурам модуля, в котором объявлены.

Глобальный уровень. Переменные доступны в пределах всего приложения.

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

Создайте новый модуль и введите две функции.

Установив курсор в пределах процедуры Переменная1, нажмите клавишу <F5>. В данной процедуре переменной str присваивается строка "Переменная уровня процедуры", после чего данное значение выводится в окно Immediate. В процедуре Переменная2 интерпретатор вернет сообщение об ошибке. Причиной ошибки стало то, что переменная str не определена. Щелкните на кнопке ОК, после чего щелкните на кнопке Reset панели инструментов.

Есть дпа способа исправления этой ошибки:

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

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

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

После изменения объявления переменной на общий уровень видимости создайте новый модуль и введите процедуру.

Переменная str стала общей.

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

При выполнении процедуры интерпретатор VBA присваивает всем переменным по умолчанию некоторое значение.

Тип данных

Значение, присваиваемое при инициализации

Числовой

0

Строка переменной длины

" " (строка нулевой длины)

Строка фиксированной длины

Результат функции Chr (0) — непечатный символ

Тип Variant

Empty

Объект

Nothing

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

Протестируем время жизни уровня модуля. В модуле введите две процедуры. Установите курсор в пределах функции ПерМодуля1, после чего нажмите клавишу <F5>. В окне Immediate будет выведено число 0.

Выполните функцию ПерМодуля2, и в окно Immediate будет выведено число 300, затем на ПерМодуля1. Будет выведено число 300 а не нуль. Переменная уровня модуля не только доступна в обеих процедурах — она сохраняет свое значение между их вызовами. Данная переменная не исчезает между отдельными вызовами процедур модуля, как это делает переменная уровня процедуры.

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

После этого введем в другой модуль следующую функцию:

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

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

Static имя_переменной As тип_данных

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

В следующей процедуре продемонстрирован пример использования статической переменной:

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

Теперь изменим ключевое слово Dim на Static и снова запустим процедуру. При первом запуске она, как и раньше, вернет значение 1. Запустим процедуру еще раз — теперь она вернет уже значение 2. Это происходит потому, что теперь между отдельными вызовами переменная сохраняет свое текущее значение. Если запустить процедуру еще раз, в окно Immediate будет выведено значение 3 и т.д.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]