Кузин А.В., Левонисова С.В. Базы данных (5-е издание, 2012) (1084448), страница 23
Текст из файла (страница 23)
Для этого используют описатель Static, т.е.определяют такую переменную как статическую. Эта переменнаясохраняет выделенное ей место в памяти и свое значение дажепосле завершения процедуры, в которой она была описана и использована.Тем не менее статическая переменная не может быть использована в других процедурах. Изменяется лишь время ее жизни, ноне область действия. Если произойдет повторный вызов той жесамой процедуры, в которой была описана статическая переменная, то эта переменная сохранит свое прежнее значение, котороеона имела в момент завершения работы этой процедуры при предыдущем вызове.
Обыкновенные (не статические) переменныевсякий раз инициализируются заново и получают при входе впроцедуру пустые значения.Процедуры и функции имеют только два уровня областей действия: уровень модуля и уровень проекта. По умолчанию используется уровень проекта. Таким образом процедура или функцияможет быть вызвана любой другой процедурой или функцией вэтом проекте.
При описании процедур и функций на уровне проекта может также использоваться необязательное ключевое словоPublic, но никакого воздействия на процедуру наличие или отсутствие этого слова не оказывает.Если требуется описать процедуру, используемую только науровне модуля, применяется ключевое слово Private. Такое описание не только сужает область действия для процедуры, но и запрещает ее использование как самостоятельной, т.
е. эту процедуру можно вызвать только из другой процедуры.Наконец, при описании процедур или функций может использоваться и ключевое слово Static. Оно никак не влияет наобласть действия процедуры, но воздействует на все переменные, описанные внутри этой процедуры или функции. В этомслучае все локальные переменные получают статус Static и темсамым сохраняются в памяти после завершения такой процедуры и при повторном ее вызове сохраняют свои прежние значения.Пример 3.5. Описание модуля:Public A1 As StringPrivate А2 As Integer118Dim A3 As SingleSub Procl ()Dim A4 As IntegerStatic A5 As IntegerA1 = "Текстовая строка 1"A2 = 2АЗ = 3.14A4 = A4+4A5 = A5+5MsgBox A4MsgBox A5End SubSub Proc2() ProclMsgBox A1MsgBox A2MsgBox A3MsgBox A4MsgBox A5ProclEndSubВ этом примере переменная А1 определена на уровне всего проекта(использовано ключевое слово Public), переменные А2 и А1 — на уровнемодуля, переменная А4 — только на уровне процедуры Procl, а переменная А5 хотя и определена в теле процедуры Procl, но описана какстатическая переменная.При вызове процедуры Ргос2 происходит следующее: из этой процедуры, в свою очередь, вызывается процедура Procl, которая присваивает значения всем пяти переменным А1...
А5, а затем показывает текущиезначения переменных А4 и А5 в диалоговом окне.После завершения этой процедуры выводятся текущие значения переменных А1... А5 из процедуры Ргос2. При этом оказывается, что переменные А1...АЗ сохранили свои значения, поскольку они описаны науровне модуля, а переменные А4 и А5 принимают пустые значения, поскольку областью их действия являются процедуры, в которых они используются. Никакие изменения этих переменных внутри одной из процедур не имеют отношения к аналогичным переменным из другой процедуры, так как на самом деле это разные переменные, просто для нихиспользуются совпадающие имена.Затем происходит еще один вызов процедуры Procl, и она вновь начинает изменять и выводить на экран значения переменных А4 и А5. Приэтом переменная А4 вновь получает значение 4, поскольку при новомвызове процедуры для этой переменной заново выделяется память, иона будет инициализирована пустым значением.
В отличие от А4 переменная А5, описанная как статическая переменная, сохраняет свое прежнее значение от предыдущего вызова этой процедуры, и в результатеее значение при повторном вызове оказывается равным 10.1193.2.5. Модули VBAКод VBA в приложении Access собран в модули. Модули являются такими же объектами Access, как таблицы, запросы, формы, отчеты, страницы и макросы, о чем свидетельствует ярлыкна панели объектов в окне База данных (Database). Основное содержание модулей — это процедуры на языке VBA.
Существуетдва типа модулей: стандартные и модули класса.Стандартные модули содержат общие процедуры, которые могут использоваться в разных местах приложения: при обработкесобытий в разных объектах, для вычисления значений в разныхзапросах или формах, а также вызываться из других модулей и т.д.Эти процедуры не связаны с конкретным объектом: формой илиотчетом. Они могут использоваться для объявления глобальных(т.е. доступных из всех окон приложения) переменных, констант,типов, внешних процедур.Если в процедурах модуля нет ссылок на конкретные объектыданного приложения (формы, отчеты, элементы управления), тотакой модуль может с успехом использоваться другими приложениями Access.Список стандартных модулей приложения всегда можно увидеть, нажав кнопку [Модули] (Modules) в окне База данных(Database), в котором обычно и выполняется работа с этими модулями. Если выделить в окне базы данных Борей (Northwind)модуль Служебные функции (Utility Functions) и нажать кнопку[Конструктор] (Design), то откроется окно редактора кода VBA,в котором можно увидеть содержание этого модуля, состоящегоиз двух строк описания и одной процедуры — функции IsLoaded(рис.
3.6). Это пример универсальной функции, проверяющей, загБ ор ей - С л уж ебны е Ф ун кц и и (Code)Option Compare DatabaseOption Explicit___Function IsLoaded(ByVal strFormName As String) As Boolean1 Возвращает значения True, если форма открыта в режиме фаргаЦConst conObjStateClosed = ОConst conDesignView - ОIf SysCittdtacSysCmdGetOfojectState, acForm, strFormNaifie) <>§If Forms (strForrriPJame) .CurrentView <> conDesignView ThrIsLoaded = TrueEnd IfEnd IfРис 3.6. Функция IsLoaded120Рис. 3.7. Диалоговое окно свойств формыружена ли форма, имя которой передается ей в качестве аргумента.
Приведенная функция никак не связана не только с объектом,но и с данным приложением и может использоваться как в немсамом, так и в любом другом приложении.Модуль класса отличается от стандартного модуля тем, что кромепроцедур он содержит описание объекта и используется для создания объектов. Процедуры, определенные в этом модуле, являются методами и свойствами объекта. Примерами модулей классаявляются модули форм и отчетов.Модули форм и отчетов связаны с конкретными формой и отчетом и содержат процедуры обработки событий для этих формыи отчета. Модуль формы не создается сразу при создании новойформы.
Он создается и связывается с формой, как только производится попытка создать первую процедуру обработки событийдля этой формы или одного из элементов управления формы,либо нажимается кнопка [Программа] (Code) в окне конструктора формы. Чтобы убедиться в этом, можно открыть любую формуприложения Борей (Northwind) в режиме конструктора и посмотреть ее свойства. На вкладке Другие (Others) есть свойство Наличиемодуля (Has Module), которое должно иметь значение Нет (No).После нажатия кнопки [Программа] (Code), которая служит дляоткрывания редактора кода VBA, это свойство будет иметь значение Да (Yes) (рис. 3.7).В окне редактора кода VBA отображается объект Форма (Form),а справа от него — поле со списком событий, с которыми могутбыть связаны процедуры VBA (рис.
3.8).Если в модуле для некоторого события существует процедура,то это событие выделяется в списке жирным шрифтом. В данномслучае таких событий нет, так как обработка событий в формеКлиенты (Customers), которую мы открыли, выполняется с помощью макросов. При попытке открытия редактора VBA автоматически создается модуль формы, который будет иметь названиеР о гт Клиенты, и в нем процедура обработки события Load.121|^ д M icro so ft V is u a l B asic!..
-і■- r.j_Б орейBIS .Б[Form К л и е н т ы (C ode)]ЙІІІЖЙ:;: » *І FormKBEit.іі...!SJK*!.. f e i !- о ґ г п _ З а ;< а з ь іЩ FofffiJCwtôHTbiІ...Ш— ІForm_OT4eTbi о Я_JL 3Option Compare Pat abas KeyDownKeyPressKeyUpЩ §n'w m 1. -'v ? JКлиентыРогтКлиентыPrivate Sub Form_Load( LoadEnd SubтіLostFocusMouseDownMouseMoveMouseUpOpenTimerUnload9МНК=" Я ;jAfl-erlnsertjAfterllpdateКлиенты.ОбнîjAllowAdditionsTrueJAllowDeletionsTruejAllowDesignCha FalsejAllowEditsTrue__i± JРис. 3.8. Окно редактора кода VBAОткрыть форму из программы VBA и изменить какие-то свойства этой формы или свойства ее элементов управления можнодвумя методами.1. Использование макрокоманды OpenForm, как метода объекта DoCmd, например:DoCmd.OpenForm "Товары"Forms!Товары.RecordSource = "Товары клиента"2.
Использование ссылки на соответствующий модуль класса,например:Form_ToBapbi. Visible = TrueForm_ToBapbi.RecordSource = "Товары клиента"В обоих случаях при выполнении программы открывается стандартный экземпляр формы Товары (Products) и подменяется источник записей для этой формы.Формы и отчеты являются стандартными классами объектов вAccess, однако можно использовать модули класса и для созданияспециальных объектов. В этом случае имя, под которым сохраняется модуль класса, становится именем специального объекта. Процедуры типа Sub и Function, определенные в модуле класса, приэтом станут методами объекта, а процедуры типа Property Let,Property Get и Property Set — свойствами объекта. Для описанияметода, не возвращающего никакое значение, используется про122цедура Sub, а для описания метода, возвращающего некотороезначение, — процедура Function. Процедура Property Get возвращает значение свойства объекта.