Файл: Е.А. Бессонов Access. Объекты и события.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 31.05.2024

Просмотров: 65

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

10

В паре функций участвуют 2 формы. На первой находится кнопка, с помощью которой запускается функция ОткрытьСкрыть.

Переменная Открывающая получает имя (свойство Name) открытой формы благодаря ссылающемуся на нее объекту Screen. После сохранения имени открывающей формы в данной переменной процедура ОткрытьСкрыть скрывает ее. Для этого свойству Visible (Вывод на экран) присваивается значение False. Затем процедура открывает форму, заданную аргументом Ф, и устанавливает свойство Tag (дополнительные сведения) открытой формы, присваивая ей имя формы, которая ее открыла.

Когда щелчком мышью по командной кнопке закрывается вторая форма, процедура ЗакрытьПоказать отменяет скрытое состояние открытой первой формы. Сначала процедура ЗакрытьПоказать проверяет свойство Tag второй активной формы, которое либо содержит имя первой формы, либо пусто, если вторая форма была открыта не из первой формы, и свойство Tag не установлено. В последнем случае метод Close закрывает вторую форму. На этом функция ЗакрытьПоказать завершает свою работу.

Если вторая форма открыта из первой, то свойство Tag содержит имя первой формы. Выполняется ветвь Else инструкции If. Переменной Скрытая присваивается имя первой формы, содержащееся в свойстве Tag второй формы, которая в данный момент активна. Метод Close закрывает активную форму. Затем метод SelectObject (ВыделитьОбъект) с аргументами Тип объекта, Имя объекта и “В окне БД” (необязательный) переводит первую форму из скрытого состояния в активное.

Синхронизация форм

Нередко при открытии формы необходимо синхронизировать ее записи с записями в ранее открытой форме. Например, при открытии формы Преподаватели из формы Расписание экзаменов можно использовать метод OpenForm (ОткрытьФорму), установив нужным образом аргументы Имя фильтра и Условие отбора.

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

Условие отбора – строка, являющаяся допустимым оператором SQL WHERE без слова WHERE.

Обычно можно ограничиться одним из этих аргументов. Sub Кнопка_Click()

11

Dim ИмяФормы As String Dim Условие As String

ИмяФормы = “Список товаров” Условие=“[КодПоставщика]=Forms![ Поставщики]! [КодПоставщика]" DoCmd.OpenForm ИмяФормы, , , Условие

End Sub

Процедура обработки события Кнопка_Click запускается при нажатии кнопки, расположенной на форме Поставщики. Метод OpenForm открывает форму “Список товаров”, причем выбранной (текущей) будет запись, удовлетворяющая условию. Обратим внимание, что в левой части условия указано только имя поля КодПоставщика. Имя формы не указано. Подразумевается, что это имя открываемой формы. В правой части условия необходим полный синтаксис, включающий

Forms - семейство открытых форм; Имя формы - Поставщики; Имя поля - КодПоставщика.

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

Поддержание синхронизации форм

Для поддержания синхронизации двух открытых форм удобно использовать свойство события Current (от записи к записи). Установим для примера процедуру обработки события для свойства “От записи к записи” формы Расписание экзаменов:

Sub Form_Current()

Dim ИмяФормы As String Dim Условие As String

ИмяФормы = “Преподаватели”

Условие = “Преподаватель = Forms![Расписание экзаменов]!Преподаватель”

If IsLoaded (ИмяФормы) Then DoCmd.OpenForm ИмяФормы , , , Условие

End If

End Sub

Процедура обработки события Form_Current расположена в модуле формы “Расписание экзаменов”. Она запускается всякий раз, когда в этой форме выбирается тем или иным способом другая запись и восста-


12

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

Function IsLoaded(ByVal strFormName As String) As Boolean ' Возвра-

щает значения True, если форма открыта в режиме формы или таблицы. Const conObjStateClosed = 0

Const conDesignView = 0

If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then

If Forms(strFormName).CurrentView <> conDesignView Then IsLoaded = True

End If End If

End Function

Переменная IsLoaded при инициализации получает значение False. Метод SysCmd выполняет действие, заданное первым параметром acSysCmdGetObjectState – определяет состояние объекта. В данном случае объектом является форма (acForm) с именем strFormName, заданным параметром функции IsLoaded. Если форма закрыта, метод SysCmd возвращает 0. Происходит выход из функции IsLoaded с инициализированным значением False. Если форма открыта, метод возвращает –1. Выполняется внутренняя инструкция If. Проверяется режим (CurrentViev) формы. Если это режим конструктора (conDesignView), происходит выход из функции с значением False. Если форма открыта в режиме формы или таблицы, результату функции присваивается значение True.

При описании аргумента функции использовано слово ByVal (по значению). Это значит, что в процедуру передается копия аргумента. Сам аргумент в процедуре недоступен и его изменить нельзя. Результат представляется логическим значением. При инициализации он получает значение False.

Если форма Преподаватели загружена, в процедуре Form_Current выполняется метод OpenForm. Форма открыта, и метод только устанавливает текущую запись в ней в соответствии с условием. Если форма не загружена, то с ней ничего не происходит (метод OpenForm не выполняется).

Если при закрытии формы “Расписание экзаменов” должна автоматически закрываться форма Преподаватели, то в первой форме надо ис-

13

пользовать процедуру обработки события Закрытие (Close). Sub Form_Close()

Dim S As String

S = “Преподаватели”

DoCmd.Close A_Form, S End Sub

Если форма Преподаватели закрыта, то ничего не происходит.

Перемещение между элементами управления

При интерактивной работе для перемещения по элементам управления форм применяются клавиши, команды меню и мышь. В программах VBA для этой цели можно использовать метод объекта DoCmd GoToControl c форматом:

DoCmd.GoToControl ИмяЭу

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

Метод GoToControl (КЭлементуУправления) передает фокус указанному элементу управления в открытой форме в режиме формы или таблицы.

Аргумент ИмяЭу нужно задавать только именем элемента управления без указания имени формы.

Метод GoToControl можно использовать для передачи фокуса определенному элементу управления. Затем этот ЭУ можно использовать для сравнения или выполнения метода FindRecord. Кроме того, этот метод можно использовать для автоматического перемещения по форме в соответствии с некоторыми условиями. Например, если оператор введет “Да” в поле “Холост”, то поле “Супруг” будет пропущено автоматически, а фокус будет передан следующему ЭУ. С помощью метода GoToControl можно передать фокус подчиненной форме, которая является одним из ЭУ. Затем можно еще одной командой перейти к ЭУ в подчиненной форме.

Пример

DoCmd.GoToControl Подчиненная

DoCmd.GoToControl Поле ‘Поле находится в подчиненной форме Другой метод активизации конкретного элемента управления пре-

дусматривает применение метода SetFocus соответствующего объекта (формы или элемента управления). Метод SetFocus перемещает фокус


14

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

ИмяОбъекта.SetFocus

ИмяОбъекта - имя формы или ЭУ активной формы или таблицы. Фокус можно перемещать только на видимый ЭУ или форму. Так,

нельзя использовать метод SetFocus в процедуре обработки события Load (загрузка) для формы, так как форма и ее ЭУ не являются видимыми до завершения выполнения события Load.

На ЭУ нельзя переместить фокус, если свойство Enabled (доступный) его имеет значение False. Однако на ЭУ можно поместить фокус, если свойство Locked (блокировка) имеет значение True. Кроме этого, нельзя перенести фокус на форму, содержащую доступные и видимые ЭУ. В этом случае фокус можно переместить на один из ЭУ формы. При использовании метода SetFocus для перемещения фокуса на форму фокус будет установлен на ЭУ, на котором фокус находился последний раз в данной форме.

SetFocus можно применить для переноса фокуса на подчиненную форму. Затем можно поместить фокус на нужный ЭУ.

Пример

Forms![Преподаватели].SetFocus Forms![Преподаватели].[ФИО].SetFocus

Возможно несколько вариантов в зависимости от исходного состояния формы “Преподаватели”.

1.Форма не загружена. Выдается сообщение “Приложение “Деканат” не удается найти форму ‘Преподаватели‘, указанную в выражении макроса или в программе Visual Basic”.

2.Форма открыта в режиме конструктора. Выдается сообщение “Приложение “Деканат” не позволяет использовать этот метод в текущем режиме”.

3.Форма загружена, но скрыта. Форма остается в скрытом состоянии. После развертывания окна формы видно, что она активна и ФИО - активный элемент на ней.

4.Форма открыта. Если она неактивна, ее окно выходит на передний план. В любом случае фокус устанавливается на элемент ФИО.

Поиск записи

При работе в интерактивном режиме поиск нужной записи осуще-

15

ствляется вводом необходимых данных в диалоговое окно Поиск. Автоматизация процесса поиска с помощью программирования на языке VBA позволяет избежать вывода диалога Поиск и упростить работу с приложением. Для поиска конкретной записи в соответствии с заданным образцом поиска можно использовать разные методы

Удобным способом поиска записи является использование поля со списком. Процедура обработки события поля со списком запускается, когда пользователь изменяет значение (выбирает элемент списка), и возникает событие AfterUpdate (после обновления).

Sub Список_AfterUpdate() Application.Echo False [ФИО].Enabled = True [ФИО].SetFocus DoCmd.FindRecord Список Список.SetFocus [ФИО].Enabled = False Application.Echo True

End Sub

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

чение False.

К элементу ФИО разрешается доступ. Для этого свойству Enabled (доступный) присваивается значение True.

Следующая инструкция устанавливает фокус на этот элемент. Центральную роль в процедуре играет метод FindRecord (НайтиЗа-

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

Совпадение – {acEntire (поля целиком)| acAnyWhere (с любой частью поля)| acStart (с начала поля)}.

С учетом регистра - { False|True, }.

Направление - { acSearchAll (с первой записи)|acDown (вперед)| acUp (назад)}.

С учетом формата поля – {False|True}

Область поиска - { acCurrent (текущее поле)|acAll (все поля)}.

С первой записи - {True| False}. В варианте False поиск начинается с первой записи после текущей.


16

Команда FindRecord в процедуре Список_AfterUpdate разыскивает запись, в которой активный ЭУ (поле ФИО) имеет то же значение, что и выбранное в списке. Затем снова активизируется поле со списком и запрещается доступ к полю ФИО. Перед завершением процедуры включается вывод на экран.

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

Другой эффективный метод выбора записи - применение фильтра для выбора записи непосредственно из набора записей формы. Метод ApplyFilter (применить фильтр) позволяет применить фильтр к таблице, форме или отчету. Он используется для ограничения числа получаемых записей или их сортировки. В качестве фильтра можно задать также хранимый запрос, либо задать оператор SQL WHERE без слова WHERE. Хранимые запросы видны в окне БД.

Метод ApplyFilter имеет необязательные аргументы Имя фильтра, Условие отбора и Тип фильтра.

Рассмотрим пример, когда в заголовке или примечании формы установлены переключатели, значения параметров которых соответствуют буквам русского алфавита (Б-193, В-194 и т.д.). Переключатели образуют группу с именем Первая

буква. Свойства Данные и Значение по умолчанию остаются пустыми. Sub ПерваяБуква_AfterUpdate()

Dim k As String K = “”””

DoCmd.ApplyFilter, “[Студент] Like “ & k & Chr$([ПерваяБуква]) _ & “*” & k

End Sub

В методе ApplyFilter первый аргумент (имя фильтра) отсутствует и заменен запятой. Второй аргумент задан выражением и используется после вычисления. Если выбран переключатель А, то после вычисления второй аргумент должен иметь вид:

[Студент] Like “A*”

Для представления кавычек внутри текстовой константы нужно задать пару кавычек, так что ”””” преобразуется в “. В выражении исполь-

17

зуется встроенная функция Chr$, преобразующая номер символа (например, 192) в соответствующий символ (А). В результате к форме будет применен фильтр, и в источнике записей останутся только те студенты, фамилии которых начинаются с А.

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

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

Для примера рассмотрим форму “Список преподавателей”.

Свойства поля со списком ФИО:

Тип источника записей

Таблица/запрос

Источник записей

SELECT [Преподаватель],[Фамилия]

 

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

Число столбцов

2

Связанный столбец

1

Ширина столбцов

0см; 3см

Sub Фио_AfterUpdate()

Me.RecordsetClone.FindFirst “[Преподаватель] = ” & Me![ФИО] Me.BookMark = Me.RecordsetClone.BookMark

End Sub