Форма «РедактированиеТоваров»

Форма «РедактированиеТоваров» демонстрирует способы создания формы, в которой допускается изменение существующих записей, но не разрешается вводить новые записи. Работу формы «РедактированиеТоваров» обеспечивают следующие приемы:

•	ограничение значений в поле со списком «ВыборТовара» на основании значения, выбранного в поле со списком «ВыборТипа»;

•	поиск записи для товара, выбранного в поле со списком «ВыборТовара»;

•	обновление списка в поле со списком «ВыборТовара» после перехода на новую запись;

•	создание панели инструментов и меню, содержащих кнопки и команды только для задач редактирования.

Для расширения функциональных возможностей формы «РедактированиеТоваров» используются следующие приемы:

•	изменение цвета поля «НаСкладе» и вывод сообщения, если запасы конкретного товара опускаются ниже минимального уровня.


Ограничение значений в списке на основании значения, выбранного в другом списке

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

Задачи

Создание процедуры обработки события После обновления (AfterUpdate) поля со списком «ВыборТипа», в которой с помощью метода Requery обновляется поле со списком «ВыборТовара». Включение поля «КодТипа» в базовый запрос поля со списком «ВыборТовара». Указание условий отбора для поля с помощью выражения, ограничивающего список товарами, у которых значение поля «КодТипа» совпадает со значением «КодТипа» в поле со списком «ВыборТипа».

Используемые объекты

Объект	Имя
Таблица	«Типы», «Товары»
Запрос	«СписокТипов», «ОграничениеСпискаТоваров»
Форма	«РедактированиеТоваров»
Модуль	«ВключениеЭлементовУправления»
Действия

1	Создание запроса «СписокТипов».

Таблица	Поле
Типы	Категория (По возрастанию)
	КодТипа
2	Создание запроса «ОграничениеСпискаТоваров».

a)	Выберите следующие поля из таблицы «Товары».

Поле	Сортировка
Марка	По возрастанию
КодТовара	—
КодТипа	—
б)	В ячейку строки «Условие отбора» для поля «КодТипа» введите выражение:

Forms![РедактированиеТоваров]![ВыборТипа]

3	Создание в модуле «ВключениеЭлементовУправления» функции EnableControls.

4	Создание формы «РедактированиеТоваров».

a)	Задайте следующие значения для свойств формы.

Свойство	Значение
Источник записей (RecordSource)	Товары
Подпись (Caption)	Редактирование товаров
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Форма
Разрешить изменение (AllowEdits)	Да
Разрешить удаление (AllowDeletions)	Да
Разрешить добавление (AllowAdditions)	Нет
Ввод данных (DataEntry)	Нет
Полосы прокрутки (ScrollBars)	Отсутствуют
Область выделения (RecordSelectors)	Нет
Поле номера записи (NavigationButtons)	Нет
Выравнивание по центру (AutoCenter)	Да
Контекстные меню (ShortcutMenu)	Нет
б)	Добавьте поля из таблицы «Товары» в область данных. Создайте поля со списком для полей «КодПоставщика» и «КодТипа», флажок для поля «ПоставкиПрекращены» и элементы управления-поля для остальных полей.

в)	Задайте значение «Нет» для свойства Доступ (Enabled) всех элементов управления в области данных. Для того чтобы предотвратить мерцание подписей при отключении и активизации элементов управления в области данных, отделите присоединенные надписи от элементов управления, удалив в буфер и заново вставив из буфера каждую надпись.

г)	Добавьте в форму заголовок и примечание. Для свойства Высота (Height) примечания формы задайте значение 0см.

д)	Создайте в области заголовка формы поле со списком «ВыборТипа» и определите его свойства следующим образом.

Свойство	Значение
Имя (Name)	ВыборТипа
Тип источника строк (RowSourceType)	Таблица/запрос
Источник строк (RowSource)	СписокТипов
Число столбцов (ColumnCount)	2
Ширина столбцов (ColumnWidths)	;0см
Присоединенный столбец (BoundColumn)	2
Ограничиться списком (LimitToList)	Да
После обновления (AfterUpdate)	[Процедура обработки событий]
е)	Создайте в области заголовка формы поле со списком «ВыборТовара». Отделите присоединенную надпись, удалив ее в буфер и заново вставив ее из буфера (при этом подпись не будет мерцать при включении и отключении поля со списком «ВыборТовара»). Задайте для свойств поля со списком «ВыборТовара» следующие значения.

Свойство	Значение
Имя (Name)	ВыборТовара
Тип источника строк (RowSourceType)	Таблица/запрос
Источник строк (RowSource)	ОграничениеСпискаТоваров
Число столбцов (ColumnCount)	2
Ширина столбцов (ColumnWidths)	;0см
Присоединенный столбец (BoundColumn)	2
Ограничиться списком (LimitToList)	Да
Доступ (Enabled)	Нет
Совет.   В форме, предназначенной только для редактирования, разработчик имеет возможность запретить пользователям вносить изменения в неверную запись. Отключайте элементы управления в области данных на время, когда пользователи вводят условия отбора записей, и включайте их только после завершения поиска записи.

Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»
Работа с формами	Глава 3 «Применение форм для ввода, вывода и отбора данных»


Функция EnableControls

Function EnableControls(frm As Form, intSection As Integer, intState As Boolean) As Boolean

' Включает и отключает элементы управления в указанных разделах формы.

' Использует объект Form, константу выбора и аргументы,

' вставленные в процедуру EnableControls.

Dim ctl As Control

' Присваивает значение аргумента intState всем

 	' элементам управления в указанном разделе.

For Each ctl In frm.Controls

If ctl.Section = intSection Then

On Error Resume Next

ctl.Enabled = intState

Err = 0

End If

Next ctl

EnableControls = True

End Function


Процедура обработки события «После обновления» (AfterUpdate) поля со списком «ВыборТипа»

Private Sub ВыборТипа_AfterUpdate()

' Включает и обновляет поле со списком «ВыборТовара».

' Отключает элементы управления в области данных.

Me!ВыборТовара.Enabled = True

Me!ВыборТовара.Requery

EnableControls Me, acDetail, False

End Sub


Поиск записи по значению, выбранному в списке

Выбор значения в списке позволяет быстро выбрать соответствующую запись. Например, в форме «РедактированиеТоваров» осуществляется поиск записи о товаре, выбранном в поле со списком «ВыборТовара».

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

Задачи

Создание процедуры обработки события для свойства После обновления (AfterUpdate) поля со списком «ВыборТовара», в которой используются макрокоманда Применить фильтр (ApplyFilter) для поиска записи и специальная функция, активизирующая каждый элемент управления в области данных.

Используемые объекты

Объект	Имя
Таблица	Товары
Форма	РедактированиеТоваров
Модуль	ВключениеЭлементовУправления
Действия

1	Создание полей со списком «ВыборТипа» и «ВыборТовара». Создание этих элементов управления описано в разделе Ограничение значений в списке на основании значения, выбранного другом списке.

2	Создание в модуле «ВключениеЭлементовУправления» функции EnableControls.

3	Создание процедуры обработки события После обновления (AfterUpdate) поля со списком «ВыборТовара».

Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»
Работа с формами	Глава 3 «Применение форм для ввода, вывода и отбора данных»


Процедура обработки события «После обновления» (AfterUpdate) поля со списком «ВыборТовара»

Private Sub ВыборТовара_AfterUpdate()

' Находит запись о товаре, выбранном в поле со списком

' «ВыборТовара». Включает элементы управления в области данных

' и отключает поле «КодТовара». Переходит на поле «КодПоставщика».

DoCmd.ApplyFilter , "КодТовара = Forms!РедактированиеТоваров!ВыборТовара"

EnableControls Me, acDetail, True

Me!КодТовара.Enabled = False

Me!КодПоставщика.SetFocus

End Sub


Обновление списка после перехода на другую запись

Когда пользователь изменяет значение в поле, которое определяет значения в списке, необходимо привести список в соответствие с новым значением. Например, при переходе на новую запись в форме «РедактированиеТоваров» производится обновление поля со списком «ВыборТовара».

Задачи

Создание процедуры обработки события формы После обновления (AfterUpdate), в которой с помощью метода Requery обновляется поле со списком «ВыборТовара».

Используемые объекты

Объект	Имя
Форма	РедактированиеТоваров
Действия

•	Создание для формы «РедактированиеТоваров» процедуры обработки события свойства «После обновления» (AfterUpdate).

Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Процедура обработки события «После обновления» (AfterUpdate) формы «РедактированиеТоваров»

Private Sub Form_AfterUpdate()

' Обновляет поле со списком «ВыборТовара».

Me!ВыборТовара.Requery

End Sub


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

Разработчик имеет возможность ограничивать задачи, доступные для пользователей, создавая специальные панели инструментов и меню. Например, в форме «РедактированиеТоваров» специальная панель инструментов и меню содержат только кнопки и команды для выполнения задач редактирования.

Задачи

Создание специальной панели инструментов и специальной строки меню. Указание в свойстве Панель инструментов (Toolbar) формы «РедактированиеТоваров» имен специальных панелей инструментов. Указание в свойстве формы Строка меню (MenuBar) имен специальных панелей инструментов, используемых в качестве строк меню.

Используемые объекты

Объект	Имя
Форма	РедактированиеТоваров
Панель инструментов	МенюРедактированиеТоваров, ПанельРедактированиеТоваров
Действия

1	Создание формы «РедактированиеТоваров». Создание данной формы описано в разделе Ограничение значений в списке на основании значения, выбранного в другом списке.

2	Создание специальной панели инструментов.

а)	При помощи методов, описанных в разделе Создание специальной панели инструментов и строки меню, создайте панель инструментов и присвойте ей имя «Редактирование товаров».

б)	Добавьте на панель инструментов следующие встроенные кнопки:

Вырезать	Копировать	Вставить	Отменить
Примечание.   Специальные панели инструментов в приложении «Решения» содержат также кнопки Конструктор и Режим формы, позволяющие легко переключаться между этими режимами во время работы с примерами. В большинстве случаев разработчики не добавляют эти кнопки на специальные панели инструментов в создаваемых приложениях.

в)	Чтобы вывести специальную панель инструментов формы задайте для свойства Панель инструментов (Toolbar) значение «ПанельРедактированиеТоваров».

3	Создание специального меню.

а)	Создайте строку меню с именем «МенюРедактированиеТоваров». Удалите из нее все меню и команды, кроме перечисленных в следующей таблице.

Меню	Команда
Файл	Закрыть
Правка	Отменить Вырезать Копировать Вставить Удалить Удалить запись Выделить запись
Примечание.   Специальная строка меню в форме «РедактированиеТоваров» содержит также меню Вид, Сервис, Окно и ?, позволяющие легко переключаться между режимами и использовать стандартные команды меню окна формы.

б)	Укажите в свойстве формы Строка меню (MenuBar) имя специальной панели инструментов, «МенюРедактированиеТоваров».

Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание меню и панелей инструментов	Глава 1 «Создание приложений»
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Изменение цвета элемента и вывод сообщения на основании значения элемента управления

Если значение элемента управления удовлетворяет некоторому условию, удобно отметить это, изменив его цвет и выводя рядом соответствующее сообщение. В форме «РедактированиеТоваров», например, текст в поле «НаСкладе» приобретает красный цвет, и рядом с полем выводится сообщение, если уровень запасов товара опускается ниже минимального, и при этом отсутствует заказ на этот товар.

Задачи

Создание надписи для вывода сообщения. Создание процедуры обработки события формы Текущая запись (OnCurrent), в которой задается значение свойства надписи Цвет текста (ForeColor) и значение свойства надписи Вывод на экарн (Visible). Создание процедур обработки событий, которые запускают процедуру обработки события Form_Current в процедурах обработки события После обновления (AfterUpdate) элементов управления «НаСкладе», «Ожидается» и «МинимальныйЗапас».

Используемый объект

Объект	Имя
Форма	РедактированиеТоваров
Действия

1	Создание надписи рядом с полем «НаСкладе» и задание следующих значений ее свойств.

Свойство	Значение
Имя (Name)	НедостаточныйЗапас
Подпись (Caption)	Запасы ниже минимального уровня.
Вывод на экран (Visible)	Нет
2	Создание процедур обработки событий для формы и элементов управления.

Форма/Элемент управления	Свойство	Значение
Форма «Редактирование Товаров»	Текущая запись (OnCurrent)	[Процедура обработки событий]
Поле «НаСкладе»	После обновления (AfterUpdate)	[Процедура обработки событий]
Поле «Ожидается»	После обновления (AfterUpdate)	[Процедура обработки событий]
Поле «Минимальный Запас»	После обновления (AfterUpdate)	[Процедура обработки событий]
Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»
Работа с формами	Глава 3 «Применение форм для ввода, вывода и отбора данных»


Процедура обработки события «Текущая запись» (Current) формы «РедактированиеТоваров»

Private Sub Form_Current()

' Если значение в поле «НаСкладе» меньше чем значение в поле

' «МинимальныйЗапас», а значение поля «Ожидается» равняется 0,

' задается красный цвет текста в поле «НаСкладе» и выводится

' надпись «НедостаточныйЗапас».

If (Me!НаСкладе + Me!Ожидается) <= Me!МинимальныйЗапас Then

Me!НаСкладе.ForeColor = 255

Me!НедостаточныйЗапас.Visible = True

' В противном случае текст в поле "НаСкладе" выводится с черным

' цветом, а надпись "НедостаточныйЗапас" скрывается.

Else

Me!НаСкладе.ForeColor = 0

Me!НедостаточныйЗапас.Visible = False

End If

End Sub


Процедура обработки события «После обновления» (AfterUpdate) поля «НаСкладе»

Private Sub НаСкладе_AfterUpdate()

' Запускает процедуру обработки события Form_Current.

Form_Current

End Sub


Процедура обработки события «После обновления» (AfterUpdate) поля «Ожидается»

Private Sub Ожидается_AfterUpdate()

' Запускает процедуру обработки события Form_Current.

Form_Current

End Sub


Процедура обработки события «После обновления» (AfterUpdate) поля «МинимальныйЗапас»

Private Sub МинимальныйЗапас_AfterUpdate()

' Запускает процедуру обработки события Form_Current.

Form_Current

End Sub


Отчет «ВыработкаСотрудников»

Отчет «ВыработкаСотрудников» служит примером перекрестного отчета с динамическими заголовками столбцов. Работу отчета «ВыработкаСотрудников» обеспечивают следующие приемы:

•	создание перекрестного отчета с динамическими заголовками столбцов;

•	ввод в отчет условий отбора через диалоговое окно.

Для расширения функциональных характеристик отчета используется следующий прием:

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


Создание перекрестного отчета с динамическими заголовками столбцов

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

Задачи

Создание перекрестного запроса, служащего источником записей для отчета. Создание в макете отчета свободных полей в верхнем колонтитуле (для заголовков столбцов), в области данных (для заголовков строк и значений перекрестного отчета) и в примечании отчета (для итоговых значений по столбцам). Определение в свойстве Форматирование (OnFormat) верхнего колонтитула и области данных процедур обработки события, которые заполняют поля заголовков и значений и скрывают неиспользуемые поля. Определение в свойстве Печать (OnPrint) области данных процедуры обработки события, в которой рассчитывается сумма по строке, которая затем добавляется в массив итоговых значений по столбцам. Определение в свойстве Печать (OnPrint) примечания отчета процедуры обработки события, которая заполняет поля итоговыми значениями по столбцам.

Используемые объекты

Объект	Имя
Таблица	«Сотрудники», «Заказы», «Заказано», «Товары»
Запрос	«ВыработкаСотрудников», «ОтпускныеЦены»
Отчет	«ВыработкаСотрудников»
Действия

1	Импорт запроса «ОтпускныеЦены», таблиц «Сотрудники», «Заказы», «Заказано» и «Товары» из базы данных «Борей».

2	Создание перекрестного запроса «ВыработкаСотрудников».

Таблица/Запрос	Поле	Значение
Таблица «Сотрудники»	Фамилия	Групповая операция: Группировка Перекрестная таблица: Заголовки столбцов
Таблица «Товары»	Марка	Групповая операция: Группировка Перекрестная таблица: Заголовки строк
Запрос «ОтпускныеЦены»	ОбъемЗаказа: ОтпускнаяЦена	Групповая операция: Sum Перекрестная таблица: Значение
Таблица «Заказы»	ДатаИсполнения	Групповая операция: Условие Условие отбора: Between #1/2/95# And #1/16/95#
Примечание.   В данном запросе для примера используется интервал от 2 января 1995 г. до 16 января 1995 г., однако, существует возможность вывести приглашение пользователю указать условия отбора при выполнении запроса. В запросе «ВыработкаСотрудников» условие отбора для поля «ДатаИсполнения» содержит ссылку на элементы управления в форме «ОкноДиалогаВыработкаСотрудников». Изменения, которые необходимо внести в запрос для ввода условий через диалоговое окно описаны в разделе Ввод в отчет условий отбора через диалоговое окно.

3	Создание отчета «ВыработкаСотрудников».

а)	Задайте для свойства отчета Источник записей (RecordSource) значение «ВыработкаСотрудников».

б)	Добавьте в отчет области заголовка и примечаний. Создайте заголовок отчета в области заголовка.

в)	Создайте 11 свободных полей в области заголовка отчета. В этих полях будут выводиться заголовки столбцов. Задайте для свойства Имя (Name) крайнего левого поля значение «Заголовок1», для свойства Имя (Name) следующего поля «Заголовок2» и т.д. до «Заголовок11».

г)	Создайте 11 свободных полей в области данных. (Одно поле для заголовков строк, девять для максимального выводящегося числа сотрудников компании «Борей» и одно поле для итоговых значений по строкам). Задайте для свойства Имя (Name) крайнего левого поля значение «Столбец1», для свойства Имя (Name) следующего поля «Столбец2» и т.д. до «Столбец11». Задайте для свойства Формат (Format) полей от «Столбец2» до «Столбец11» значение «С разделителями разрядов».

д)	Создайте 11 полей в примечании отчета. Задайте для свойства Имя (Name) крайнего левого поля значение «Итого1». В ячейку свойства Данные (ControlSource) этого поля введите выражение ="Итого:".

В свойстве Имя (Name) остальных полей, в которых будут выводиться итоговые значения по столбцам, укажите имена от «Итого2» до «Итого11». В свойстве Формат поля (Format) этих полей выберите «С разделителями разрядов».

е)	В общей области модуля «Report_ВыработкаСотрудников» опишите переменные и создайте процедуру Sub InitVars и функцию xtabCNulls.

ж)	Создайте процедуры обработки событий и задайте свойства следующим образом.

Отчет/Раздел	Свойство	Значение
Отчет	Открытие (OnOpen)	[Процедура обработки событий]
	Закрытие (OnClose)	[Процедура обработки событий]
	Отсутствие данных (OnNoData)	[Процедура обработки событий]
Заголовок отчета	Форматирование (OnFormat)	[Процедура обработки событий]
Верхний колонтитул	Форматирование (OnFormat	[Процедура обработки событий]
Область данных	Не разрывать (KeepTogether)	Да
	Форматирование (OnFormat)	[Процедура обработки событий]
	Печать (OnPrint)	[Процедура обработки событий]
	Возврат (OnRetreat)	[Процедура обработки событий]
Примечание отчета	Печать (OnPrint)	[Процедура обработки событий]
Литература

Дополнительные сведения см. в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Раздел описаний модуля Report_ВыработкаСотрудников

Option Compare Database	' Способ сравнения строк задается в базе данных.

Option Explicit

' Константа для максимального числа столбцов, которые создает

' запрос «ВыработкаСотрудников» плюс 1 для столбца «Всего».

Const conTotalColumns = 11

' Объектные переменные для базы данных и набора записей.

Dim dbsReport As Database

Dim rstReport As Recordset

' Переменные для числа столбцов, строк и итоговых значений.

Dim intColumnCount As Integer

Dim lngRgColumnTotal(1 To conTotalColumns) As Long

Dim lngReportTotal As Long


Процедура Sub InitVars

Private Sub InitVars()

Dim intX As Integer

' Инициализирует переменную lngReportTotal.

lngReportTotal = 0

' Инициализирует массив для сохранения итоговых значений по столбцам.

For intX = 1 To conTotalColumns

lngRgColumnTotal(intX) = 0

Next intX

End Sub


Функция xtabCnulls

Private Function xtabCnulls(varX As Variant)

' Проверка на пустые значения.

If IsNull(varX) Then

' Если переменная varX пуста, задает для varX значение 0.

xtabCnulls = 0

Else

' В противном случае возвращает varX.

xtabCnulls = varX

End If

End Function


Процедура обработки события «Открытие» (Open) отчета «ВыработкаСотрудников»

Private Sub Report_Open(Cancel As Integer)

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

' введенных в форму «ОкноВыработкаСотрудников».

Dim intX As Integer

Dim qdf As QueryDef

' Не открывает отчет, если не загружена форма «ОкноВыработкаСотрудников».

If Not (IsLoaded("ОкноВыработкаСотрудников")) Then

Cancel = True

MsgBox " Для просмотра или печати отчета необходимо открыть " _

& форму "ОкноВыработкаСотрудников в режиме формы.", vbExclamation, _

"Необходимо открыть диалоговое окно"

Exit Sub

End If

' Связывает переменную с текущей базой данных.

Set dbsReport = CurrentDb

' Открывает запрос (объект QueryDef).

Set qdf = dbsReport.QueryDefs("ВыработкаСотрудников")

' Задает параметры запроса с помощью значений,

' введенных в форму «ОкноВыработкаСотрудников».

qdf.Parameters("Forms!ОкноВыработкаСотрудников!НачальнаяДата") _

= Forms!ОкноВыработкаСотрудников!НачальнаяДата

qdf.Parameters("Forms!ОкноВыработкаСотрудников!КонечнаяДата") _

= Forms!ОкноВыработкаСотрудников!КонечнаяДата

' Открывает набор записей.

Set rstReport = qdf.OpenRecordset()

' Определяет переменную для сохранения числа столбцов в перекрестном запросе.

intColumnCount = rstReport.Fields.Count

End Sub


Процедура обработки события «Закрытие» (Close) отчета «ВыработкаСотрудников»

Private Sub Report_Close()

On Error Resume Next

' Закрывает набор записей.

rstReport.Close

End Sub


Процедура обработки события «Отсутствие данных» (NoData) отчета «ВыработкаСотрудников»

Private Sub Report_NoData(Cancel As Integer)

MsgBox "Не найдены записи, удовлетворяющие указанным условиям.", vbExclamation, "Записи не найдены"

rstReport.Close

Cancel = True

End Sub


Процедура обработки события «Форматирование» (Format) заголовка отчета

Private Sub ReportHeader3_Format(Cancel As Integer, FormatCount As Integer)

' Переходит на первую запись набора записей в начале отчета

' или при повторном пуске отчета. (Повторный пуск осуществляется

' при печати отчета из окна предварительного просмотра или при

' возвращении на предыдущую страницу при просмотре.)

rstReport.MoveFirst

' Инициализирует переменные.

InitVars

End Sub


Процедура обработки события «Форматирование» (Format) верхнего колонтитула

Private Sub PageHeader0_Format(Cancel As Integer, FormatCount As Integer)

Dim intX As Integer

' Помещает заголовки столбцов в поля в верхнем колонтитуле.

For intX = 1 To intColumnCount

Me("Head" + Format$(intX)) = rstReport(intX - 1).Name

Next intX

' Вводит в ближайшее свободное поле заголовок «Итого».

Me("Head" + Format$(intColumnCount + 1)) = "Итого"

' Скрывает пустые поля в верхнем колонтитуле.

For intX = (intColumnCount + 2) To conTotalColumns

Me("Head" + Format$(intX)).Visible = False

Next intX

End Sub


Процедура обработки события «Форматирование» (Format) области данных

Private Sub Detail1_Format(Cancel As Integer, FormatCount As Integer)

' Вводит значения в поля и скрывает пустые поля.

Dim intX As Integer

' Проверяет, что не достигнут конец набора записей.

If Not rstReport.EOF Then

' Если свойство FormatCount имеет значение 1, помещает значения

' из набора записей в поля в области данных.

If Me.FormatCount = 1 Then

For intX = 1 To intColumnCount

' Преобразует пустые значения в 0.

Me("Col" + Format$(intX)) = xtabCnulls(rstReport(intX - 1))

Next intX

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

For intX = intColumnCount + 2 To conTotalColumns

Me("Col" + Format$(intX)).Visible = False

Next intX

' Переходит на следующую запись в наборе записей.

rstReport.MoveNext

End If

End If

End Sub


Процедура обработки события «Печать» (Print) области данных

Private Sub Detail1_Print(Cancel As Integer, PrintCount As Integer)

Dim intX As Integer

Dim lngRowTotal As Long

' Если свойство PrintCount имеет значение 1, инициализирует

' переменную rowTotal. Добавляет в столбец суммарные значения.

If Me.PrintCount = 1 Then

lngRowTotal = 0

For intX = 2 To intColumnCount

' Начиная со столбца 2 (первый столбец с перекрестными

' значениями), рассчитывает сумму по строке в области данных.

lngRowTotal = lngRowTotal + Me("Столбец" + Format$(intX))

' Добавляет итоговое значение для текущего столбца.

lngRgColumnTotal(intX) = lngRgColumnTotal(intX) + _

Me("Col" + Format$(intX))

Next intX

' Заносит сумму по строке в поле в области данных.

Me("Col" + Format$(intColumnCount + 1)) = lngRowTotal

' Прибавляет сумму по строке к общему итогу.

lngReportTotal = lngReportTotal + lngRowTotal

End If

End Sub


Процедура обработки события «Возврат» (Retreat) области данных

Private Sub Detail1_Retreat()

' При возврате в области данных всегда возвращается на предыдущую запись.

rstReport.MovePrevious

End Sub


Процедура обработки события «Печать» (Print) для примечания отчета

Private Sub ReportFooter4_Print(Cancel As Integer, PrintCount As Integer)

Dim intX As Integer

' Помещает суммы по столбцам в поля в примечании отчета.

' Начинает со столбца 2 (первый столбец с перекрестными данными).

For intX = 2 To intColumnCount

Me("Tot" + Format$(intX)) = lngRgColumnTotal(intX)

Next intX

' Помещает общий итог в поле в примечании отчета.

Me("Tot" + Format$(intColumnCount + 1)) = lngReportTotal

' Скрывает неиспользуемые поля в примечании отчета.

For intX = intColumnCount + 2 To conTotalColumns

Me("Tot" + Format$(intX)).Visible = False

Next intX

End Sub


Форма «ОкноВыработкаСотрудников»

Форма «ОкноВыработкаСотрудников» демонстрирует вывод приглашения ввести условия отбора для отчета «ВыработкаСотрудников» и указание дат с помощью специального элемента ActiveX - календаря Microsoft Access. Работу формы «ОкноВыработкаСотрудников» обеспечивают следующие приемы:

•	ввод в отчет условий выбора через диалоговое окно.


Ввод в отчет условий отбора через диалоговое окно

Вместо того чтобы каждый раз определять условия отбора в базовом запросе, удобно вывести диалоговое окно с приглашением пользователю задать условия перед выводом отчета на печать. Отчет становится более гибким, так как пользователи получают возможность изменять условия во время выполнения. В форме «ОкноВыработкаСотрудников» пользователь должен указать в качестве условий отбора начальную и конечную даты диапазона дат. Выбор осуществляется путем выбора дат в календаре.

Задачи

Создание окна диалога, содержащего специальный элемент ActiveX - календарь и поля для ввода условий отбора в отчет. Добавление кнопок «Просмотр», «Печать», «Отмена» и «Задать дату». Определение в базовом запросе отчета параметров и условий отбора для поля даты с помощью выражения, которое включает семейство Forms, имя формы и имена элементов управления. Задание параметров для запроса в процедуре обработки события, определенной для свойства запроса Открытие (OnOpen).

Используемые объекты

Объект	Имя
Форма	ОкноВыработкаСотрудников
Отчет	ВыработкаСотрудников
Модуль	ПроверкаЗагрузки
Действия

1	Создание отчета «ВыработкаСотрудников».

2	Создание формы «ОкноВыработкаСотрудников».

а)	Создайте свободную форму и задайте для нее следующие значения свойств.

Свойство	Значение
Подпись (Caption)	Выработка сотрудников
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Форма
Полосы прокрутки (ScrollBars)	Отсутствуют
Область выделения (RecordSelectors)	Нет
Поле номера записи (NavigationButtons)	Нет
Выравнивание по центру (AutoCenter)	Да
Модальное окно (Modal)	Да
Тип границы (BorderStyle)	Тонкая
Кнопки размеров окна (MinMaxButtons)	Отсутствуют
Контекстные меню (ShortcutMenu)	Нет
Загрузка (OnLoad)	[Процедура обработки событий]
б)	Добавьте календарь и задайте для него следующие значения свойств.

Свойство	Значение
Имя (Name)	ВыборДаты
Команда (Verb)	0
в)	Создайте два свободных поля. Укажите для их свойства Формат поля (Format) значения «Краткий формат даты», а также следующие значения для свойства присоединенных надписей Подпись (Caption) и свойства Имя (Name) поля.

Подпись	Имя поля
Начальная дата:	НачальнаяДата
Конечная дата:	КонечнаяДата
г)	Создайте кнопки и определите для них следующие значения свойств Имя (Name), Подпись (Caption) и Нажатие кнопки (OnClick). Задайте значение «Да» для свойства По умолчанию (Default).

Имя (Name)	Подпись (Caption)	Нажатие кнопки (OnClick)
Просмотр	Просмотр	[Процедура обработки событий]
Печать	Печать	[Процедура обработки событий]
Отмена	Отмена	[Процедура обработки событий]
ЗадатьДату	Задать начальную дату	[Процедура обработки событий]
д)	В раздел описаний модуля Form_ОкноВыработкаСотрудников введите инструкцию:

Const ConErrRptCanceled = 2501

3	Изменение запроса «ВыработкаСотрудников».

а)	В строку «Условие отбора» для поля «ДатаИсполнения» введите:

Between [Forms]![ОкноВыработкаСотрудников]![НачальнаяДата] And [Forms]![ОкноВыработкаСотрудников]![КонечнаяДата]

б)	Определите следующие параметры запроса:

Forms!ОкноВыработкаСотрудников!НачальнаяДата
Forms!ОкноВыработкаСотрудников!КонечнаяДата

в)	Задайте для параметров запроса тип «Дата/время».

4	Создание модуля «ПроверкаЗагрузки».

•	Создайте функцию IsLoaded.

5	Создание процедуры обработки события «Открытие» (Open) отчета «ВыработкаСотрудников».

Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»
Работа с формами	Глава 3 «Применение форм для ввода, вывода и отбора данных»


Процедура обработки события «Загрузка» (Load) формы «ОкноВыработкаСотрудников»

Private Sub Form_Load()

' Используется в приложении для возвращения записей для примера.

' Ввод параметров в поля «НачальнаяДата» и «КонечнаяДата»

' при загрузке формы.

Me!ВыборДаты = Now()

Me!НачальнаяДата = #4/1/95#

Me!КонечнаяДата = #4/30/95#

End Sub


Процедура обработки события «Нажатие кнопки» (Click) кнопки «Просмотр»

Private Sub Просмотр_Click()

' Просмотр отчета.

Dim strDocName As String

On Error GoTo Err_Просмотр_Click

' Проверяет, что начальная дата имеет место не позднее конечной даты.

If IsDate(НачальнаяДата) And IsDate(КонечнаяДата) Then

If КонечнаяДата < НачальнаяДата Then

MsgBox " Начальная дата должна предшествовать конечной дате."

ЗадатьДату.Сaption = "Задать конечную дату"

ВыборДаты.SetFocus

Exit Sub

End If

Else

MsgBox "Введите допустимые значения начальной и конечной даты."

Exit Sub

End If

strDocName = "ВыработкаСотрудников"

DoCmd.OpenReport strDocName, acViewPreview

' Если в форме «КаталогПримеров» установлен флажок «ShowМe»,

' открывает раздел встроенной справки.

If IsLoaded("КаталогПримеров") Then

If Forms!КаталогПримеров!ShowMe Then

ShowHelpAPI

End If

End If

Exit_Просмотр_Click:

Exit Sub

Err_Просмотр_Click:

If Err = ConErrRptCanceled Then

Resume Exit_Просмотр_Click

Else

MsgBox Err.Description

Resume Exit_Просмотр_Click

End If

End Sub


Процедура обработки события «Нажатие кнопки» (Click) кнопки «Печать»

Private Sub Печать_Click()

' Печать отчета.

Dim strDocName As String

On Error GoTo Err_Печать_Click

' Проверяет, что начальная дата имеет место не позднее конечной даты.

If КонечнаяДата < НачальнаяДата Then

MsgBox " Начальная дата должна предшествовать конечной дате."

ЗадатьДату.Caption = "Задать конечную дату"

ВыборДаты.SetFocus

Exit Sub

End If

strDocName = "ВыработкаСотрудников"

DoCmd.OpenReport strDocName, acViewNormal

Exit_Печать_Click:

Exit Sub

Err_Печать_Click:

If Err = ConErrRptCanceled Then

Resume Exit_Печать_Click

Else

MsgBox Err.Description

Resume Exit_Печать_Click

End If

End Sub


Процедура обработки события «Нажатие кнопки» (Click) кнопки «Отмена»

Private Sub Отмена_Click()

' Закрытие формы. (Эта программа создается мастером кнопок.)

On Error GoTo Err_Отмена_Click

DoCmd.Close

Exit_Отмена_Click:

Exit Sub

Err_Отмена_Click:

MsgBox Err.Description

Resume Exit_Отмена_Click

End Sub


Процедура обработки события «Нажатие кнопки» (Click) кнопки «ЗадатьДату»

Private Sub ЗадатьДату_Click()

On Error GoTo ЗадатьДату_Error

If ЗадатьДату.Caption = "Задать начальную дату" Then

НачальнаяДата = ВыборДаты.Value

ЗадатьДату.Caption = "Задать конечную дату"

Else

КонечнаяДата = ВыборДаты.Value

ЗадатьДату.Caption = "Задать начальную дату"

End If

Exit Sub

ЗадатьДату_Error:

MsgBox Err.Description

Exit Sub

End Sub


Функция IsLoaded

Function IsLoaded(strfrmName As String) As Integer

' Проверяет, загружена ли форма.

Const conFormDesign = 0

Dim intX As Integer

IsLoaded = False

For intX = 0 To Forms.Count - 1

If Forms(intX).FormName = strfrmName Then

If Forms(intX).CurrentView <> conFormDesign Then

IsLoaded = True

Exit Function	' Выход из функции при обнаружении формы.

End If

End If

Next

End Function


Печать условий отбора, введенных в отчет через диалоговое окно

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

Задачи

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

Используемые объекты

Объект	Имя
Форма	ОкноВыработкаСотрудников
Отчет	ВыработкаСотрудников
Действия

1	Создание отчета «ВыработкаСотрудников».

2	Создание формы «ОкноВыработкаСотрудников».

3	Изменение отчета «ВыработкаСотрудников». Создайте свободное поле в заголовке отчета. Задайте для его свойства Имя (Name) значение «Диапазон» и введите в ячейку свойства Данные (ControlSource) выражение:

="From " & Format([Forms]![ОкноВыработкаСотрудников]![НачальнаяДата], "dd-mmm-yy") & " through " & Format([Forms]![ОкноВыработкаСотрудников]![КонечнаяДата], "dd-mmm-yy")


Форма «Ввод товаров»

Форма «ВводТоваров» демонстрирует возможность использования одной формы для ввода и изменения записей. Работу формы «ВводТоваров» обеспечивают следующие приемы:

•	создание формы, в которой выводятся разные панели инструментов при переключении между режимами ввода новых записей и изменения существующих;

•	обновление списка в поле со списком «ВыборТовара» при переходе на новую запись (этот же прием используется в форме «РедактированиеТоваров»).

Следующие приемы расширяют функциональные возможности формы:

•	добавление нового типа в список типов товаров;

•	автоматический перевод первой буквы в названии товара на верхний регистр.


Создание формы, допускающей ввод и изменение данных

Удобный доступ к данным обеспечивается в форме, позволяющей быстро переключаться между режимами ввода новых записей и изменения существующих. Например, форма «ВводТоваров» открывается в режиме ввода данных. Для перехода в режим редактирования записей следует нажать на панели инструментов кнопку Изменение данных. Для возвращения в режим ввода записей следует нажать на панели инструментов кнопку Ввод данных.

Задачи

Создание формы, открывающейся в режиме ввода новых данных. Добавление в область заголовка формы полей со списками, в которые пользователь вводит данные при поиске записей, и отключение этих полей. Создание функций для двух кнопок специальной панели инструментов, Изменение данных и Ввод данных. Эти функции задают значения свойства формы Разрешить изменение (AllowEdits), используемые в событии формы Включение (Activate) как переключатели для вывода и скрытия панелей инструментов. Создание двух панелей инструментов, одна из которых содержит кнопку Изменение данных и выводится, когда форма находится в режиме ввода данных, а вторая содержит кнопку Ввод данных и выводится в режиме редактирования.

Используемые объекты

Объект	Имя
Таблица	Товары
Форма	ВводТоваров
Макрос	ВводТоваров
Модуль	ВключениеЭлементовУправления, КнопкиВводПравка
Действия

1	Создание формы «ВводТоваров».

а)	Задайте следующие значения для свойств формы.

Свойство	Значение
Источник записей (RecordSource)	Товары
Подпись (Caption)	Ввод товаров
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Форма
Ввод данных (DataEntry)	Да
Полосы прокрутки (ScrollBars)	Отсутствуют
Область выделения (RecordSelectors)	Нет
Контекстные меню (ShortcutMenu)	Нет
б)	Добавьте поля из таблицы «Товары» в область данных. Создайте поля со списком для полей «КодПоставщика» и «КодТипа», флажок для поля «ПоставкиПрекращены» и элементы управления-поля для остальных полей.

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

г)	Поскольку поле «КодТовара» является полем счетчика, сделайте его доступным только для чтения, задав для свойства Доступ (Enabled) значение «Нет».

2	Добавление заголовка формы и создание полей со списками «ВыборТипа» и «ВыборТовара». Создание этих полей со списками обсуждается в разделе Ограничение значений в списке на основании значения, выбранного в другом списке. Описывается создание элементов управления для формы «РедактированиеТоваров», поэтому описанные действия необходимо дополнить следующими.

a)	Определите свойство Источник строк (RowSource) поля со списком «ВыборТовара» с помощью запроса:

SELECT DISTINCTROW Товары.Марка, Товары.КодТовара, Товары.КодТипа
FROM Товары
WHERE (((Товары.КодТипа)=[Forms]![ВводТоваров]![ВыборТипа]))
ORDER BY Товары.Марка;

б)	Создайте процедуру обработки события После обновления (AfterUpdate) поля со списком «ВыборТовара».

в)	Задайте для свойства Доступ (Enabled) обоих полей со списками значение «Нет».

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

3	Создание в модуле «ВключениеЭлементовУправления» функции EnableControls.

4	Создание модуля «КнопкиВводПравка».

а)	Создайте функцию EditData.

б)	Создайте функцию EnterData.

5	Создание специальных панелей инструментов.

а)	Создайте при помощи методов, описанных в разделе Создание специальных панелей инструментов и строк меню, специальную панель инструментов и присвойте ей имя «ВводТоваров1».

б)	Добавьте на специальную панель инструментов следующие встроенные кнопки:

Режим формы	Конструктор	Вырезать	Копировать	Вставить	Отменить	Удалить запись
в)	Добавьте на панель кнопку «Ввод данных», запускающую функцию EnterData. Для выполнения данной функции задайте для свойства кнопки OnAction значение =EnterData().

г)	Создайте специальную панель инструментов и присвойте ей имя «ВводТоваров2».

д)	Добавьте на специальную панель инструментов следующие встроенные кнопки: Конструктор, Режим формы, Вырезать, Копировать, Вставить и Отменить.

е)	Добавьте на панель кнопку «Изменение данных», запускающую функцию EditData. Для выполнения данной функции задайте для свойства кнопки OnAction значение =EditData().

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

6	Создание процедур обработки событий для следующих свойств формы.

Свойство	Значение
Открытие (OnOpen)	[Процедура обработки событий]
Включение (OnActivate)	[Процедура обработки событий]
Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»
Работа с формами	Глава 3 «Применение форм для ввода, вывода и отбора данных»


Процедура обработки события «После обновления» (AfterUpdate) поля со списком «ВыборТовара»

Private Sub ВыборТовара_AfterUpdate()

' Находит запись о товаре, выбранном в поле со списком

' «ВыборТовара». Включает элементы управления в области данных

' и отключает поле «КодТовара». Переходит на поле «КодПоставщика».

DoCmd.ApplyFilter , "КодТовара = Forms! РедактированиеТоваров!ВыборТовара"

EnableControls Me, acDetail, True

Me!КодТовара.Enabled = False

Me!КодПоставщика.SetFocus

End Sub


Функция EditData

Function EditData() As Integer

' Программа для кнопки «Изменение данных» на панели «ВводТоваров2».

Dim frm As Form

Dim ctlCombo1 As Control

Dim ctlCombo2 As Control

On Error GoTo EditData_Err

Set frm = Forms!ВводТоваров

Set ctlCombo1 = Forms! ВводТоваров!ВыборТипа

Set ctlCombo2 = Forms! ВводТоваров!ВыборТовара

' Включает режим ввода записей с помощью свойства

' "Разрешить изменение" (AllowEdits).

frm.AllowEdits = True

' Переключает панели инструментов.

DoCmd.ShowToolbar "ВводТоваров1", acToolbarYes

DoCmd.ShowToolbar "ВводТоваров2", acToolbarNo

' Включает первое поле со списком и переходит на него.

ctlCombo1.Enabled = True

ctlCombo1.SetFocus

' Отключает элементы управления в области данных.

EnableControls frm, acDetail, False

Exit Function

EditData_Err:

MsgBox Err.Description

Exit Function

End Function


Функция EnterData

Function EnterData() As Integer

' Программа для кнопки «Ввод данных» на панели «ВводТоваров1».

Dim frm As Form

Dim ctlCombo1 As Control

Dim ctlCombo2 As Control

On Error GoTo EnterData_Err

Set frm = Forms!ВводТоваров

Set ctlCombo1 = Forms!ВводТоваров!ВыборТипа

Set ctlCombo2 = Forms!ВводТоваров!ВыборТовара

' Отключает режим ввода записей с помощью свойства

' «Разрешить изменение» (AllowEdits).

frm.AllowEdits = False

'  Включает элементы в области данных и отключает поле «КодТовара».

EnableControls frm, acDetail, True

frm!КодТовара.Enabled = False

'  Переходит на поле со списком «КодПоставщика» в новой записи.

DoCmd.GoToRecord , , acNewRec

frm!КодПоставщика.SetFocus

'  Переключает панели инструментов.

DoCmd.ShowToolbar "ВводТоваров1", acToolbarNo

DoCmd.ShowToolbar "ВводТоваров2", acToolbarYes

'  Отключает поля со списками в области заголовка формы.

ctlCombo1.Enabled = False

ctlCombo2.Enabled = False

Exit Function

EnterData_Err:

MsgBox Err.Description

Exit Function

End Function


Процедура обработки события «Открытие» (Open) формы «ВводТоваров»

Private Sub Form_Open(Cancel As Integer)

' Включает свойство «Разрешить изменение» (AllowEdits) при открытии формы.

Me.AllowEdits = True

End Sub


Процедура обработки события «Включение» (Activate) формы «ВводТоваров»

Private Sub Form_Activate()

' Скрывает панель инструментов «Режим формы».

DoCmd.ShowToolbar "Режим формы", acToolbarNo

' С помощью свойства «Разрешить изменение» (AllowEdits) определяет

' выводящуюся панель инструментов.

If Me.AllowEdits = True Then

DoCmd.ShowToolbar "ВводТоваров2", acToolbarYes

Else

DoCmd.ShowToolbar "ВводТоваров1", acToolbarYes

End If

End Sub


Форма «ДобавлениеТипа»

Форма «ДобавлениеТипа» открывается из формы «ВводТоваров» при добавлении нового типа в поле со списком «КодТипа». Работу формы «ДобавлениеТипа» обеспечивают следующие приемы:

•	добавление нового типа в список типов.


Добавление новой записи в список

При вводе или изменении записей может возникнуть необходимость добавления нового элемента в список поля со списком. Например, в форме «ВводТоваров» разрешается добавлять новый тип в список типов товаров, вводя название типа в поле. Форма выводит окно сообщения с приглашением подтвердить ввод новой записи. Если пользователь нажимает кнопку «Да», открывается форма, в которую следует ввести информацию о новом типе.

Задачи

Создание процедуры обработки события Отсутствие в списке (OnNotInList) поля со списком «КодТипа» в форме «ВводТоваров». (Эта процедура открывает диалоговое окно с приглашением подтвердить добавление нового типа; при нажатии кнопки «Да» открывается форма «ДобавлениеТипа».) Создание процедуры обработки события Закрытие (OnClose) формы «ДобавлениеТипа», использующей метод Requery для обновления поля со списком «КодТипа» в форме «ВводТоваров».

Используемые объекты

Объект	Имя
Таблица	«Товары», «Типы»
Форма	«ВводТоваров», «ДобавлениеТипа»
Модуль	«ПроверкаЗагрузки»
Действия

1	Создание процедуры обработки события «Отсутствие в списке» (OnNotInList) поля со списком «КодТипа» в форме «ВводТоваров».

2	Создание модуля «ПроверкаЗагрузки».

а)	Создайте функцию IsLoaded.

3	Создание формы «ДобавлениеТипа».

а)	Определите свойства формы и создайте процедуры обработки событий следующим образом.

Свойство	Значение
Источник записей (RecordSource)	Типы
Подпись (Caption)	Добавление типа
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Форма
Ввод данных (DataEntry)	Да
Полосы прокрутки (ScrollBars)	Отсутствуют
Область выполнения (RecordSelectors)	Нет
Поле номера записи (NavigationButtons)	Нет
Автоматический размер (AutoResize)	Да
Выравнивание по центру (AutoCenter)	Да
Включение (OnActivate)	[Процедура обработки событий]
б)	Добавьте в область данных поля «Категория», «Описание» и «Изображение» из таблицы «Типы».

Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»
Работа с формами	Глава 3 «Применение форм для ввода, вывода и отбора данных»


Процедура обработки события «Отсутствие в списке» (NotInList) поля «КодТипа»

Private Sub КодТипа_NotInList(NewData As String, Response As Integer)

' Добавляет новый тип при вводе с клавиатуры

' в поле со списком «КодТипа».

Dim intNewCategory As Integer, intTruncateName As Integer, strTitle As String, intMsgDialog As Integer

' Выводит окно сообщения с приглашением подтвердить

' добавление нового типа.

strTitle = "Тип отсутствует в списке "

intMsgDialog = vbYesNo + vbQuestion + vbDefaultButton1

intNewCategory = MsgBox("Добавить новый тип?", intMsgDialog, strTitle)

If intNewCategory = vbYes Then

' Удаляет новое имя из поля «КодТипа», позволяя выполнить

' обновление элемента управления при возвращении в форму.

DoCmd.RunCommand acCmdUndo

' Выводит сообщение и уменьшает длину значения

' введенного в поле со списком «КодТипа».

strTitle = "Слишком длинное имя"

intMsgDialog = vbOKOnly + vbExclamation

If Len(NewData) > 15 Then

intTruncateName = MsgBox("Название типа не может содержать " _

& "больше 15 символов. Введенное название будет " _

& "обрезано.", _

intMsgDialog, strTitle)

NewData = Left$(NewData, 15)

End If

' Открывает форму «ДобавлениеТипа».

DoCmd.OpenForm "ДобавлениеТипа", acNormal, , , acAdd, acDialog, NewData

' Продолжение без вывода стандартного сообщения об ошибке.

Response = acDataErrAdded

End If

End Sub


Процедура обработки события «Включение» (Activate) формы «ДобавлениеТипа»

Private Sub Form_Activate()

' Скрывает панель инструментов «Режим формы».

DoCmd.ShowToolbar "Режим формы", acToolbarNo

' Выводит панель инструментов формы «ДобавлениеТипа».

DoCmd.ShowToolbar "Специальный режим формы", acToolbarYes

' Если загружена форма «ВводТоваров», скрывает

' ее текущую панель инструментов.

If IsLoaded("ВводТоваров") Then

If Forms!ВводТоваров.AllowEdits = True Then

DoCmd.ShowToolbar "Ввод товаров 1", acToolbarNo

Else

DoCmd.ShowToolbar "Ввод товаров 2", acToolbarNo

End If

End If

End Sub


Перевод на верхний регистр первой буквы в поле

Чтение форм облегчается, а отчеты выглядят более профессионально, если данные представляются согласованным образом. Например, в базе данных «Борей» все названия товаров должны начинаться с прописной буквы. Поскольку название товара может содержать несколько слов, некоторые из которых не следует начинать с прописной буквы, требуется определить функцию, которая при вводе данных переводит на верхний регистр только первую букву в первом слове названия товара, оставляя остальные слова без изменений.

Задачи

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

Используемые объекты

Объект	Имя
Таблица	Товары
Форма	ВводТоваров
Действия

1	Создание функции CapitalizeFirst в модуле Form_ВводТоваров формы «ВводТоваров».

2	Создание в форме «ВводТоваров» процедуры обработки события «После обновления» (AfterUpdate) для поля «Марка».

Совет.   Перевести на верхний регистр первую букву каждого слова в поле позволяет функция Visual Basic для приложений StrConv.

Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Функция CapitalizeFirst в модуле Form_ВводТоваров

Function CapitalizeFirst(Str)

' Переводит первую букву в поле на верхний регистр;

' оставляет остальные символы не измененными.

Dim strTemp As String

strTemp = Trim(Str)

CapitalizeFirst = UCase(Left(strTemp, 1)) & Mid(strTemp, 2)

End Function


Процедура обработки события «После обновления» (AfterUpdate) поля «Марка»

Private Sub Марка_AfterUpdate()

' Переводит на верхний регистр первую букву в названии товара.

If Not (IsNull(Me!Марка)) Then

Me!Марка = CapitalizeFirst((Me!Марка))

End If

End Sub


Отчет «Счет»

Отчет «Счет» демонстрирует способ создания составного документа, предназначенного для подсчета суммы продаж, выполненных каждым сотрудником. Работу отчета «Счет» обеспечивают следующие приемы:

•	создание отчета, предназначенного для печати на готовом бланке.

Для расширения функциональных характеристик отчета используется следующий прием:

•	если размер отчета превышает одну страницу, внизу страницы печатается «Продолжение на следующей странице».


Создание отчета, предназначенного для печати на готовом бланке

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

Задачи

Размещение в верхнем колонтитуле элементов управления, предназначенных для вывода имени, адреса клиента и других сведений. Размещение в нижнем колонтитуле элементов управления для вывода суммарной стоимости товаров, стоимости доставки и общей суммы заказа. Создание свободного поля в примечании группы «КодЗаказа». Создание процедуры обработки события примечания группы Форматирование (OnFormat) задающей для этого поля значение True. Создание процедуры обработки события примечания группы Форматирование (OnFormat), которая выводит примечание группы на печать только после вывода на печать всех записей из области данных группы (т.е. когда свободное поле имеет значение True).

Используемые объекты

Объект	Имя
Таблица	Клиенты, Сотрудники, Заказы
Запрос	Счет, ОтпускныеЦены
Отчет	Счет
Действия

1	Импорт запроса «ОтпускныеЦены» из базы данных «Борей».

2	Создание запроса «Счет».

a)	Используйте поля из следующих таблиц и запросов.

Таблица/запрос	Поле
Таблица «Клиенты»	Название, Адрес, Город, Область, Индекс, Страна
Таблица «Сотрудники»	Фамилия, Имя
Таблица «Заказы»	КодЗаказа, КодКлиента, ДатаРазмещения, ДатаНазначения, ДатаИсполнения, Доставка, СтоимостьДоставки, НазваниеПолучателя, АдресПолучателя, ГородПолучателя, ОбластьПолучателя, ИндексПолучателя, СтранаПолучателя
Запрос «ОтпускныеЦены»	Марка, КодТовара, Цена, Количество, Скидка, ОтпускнаяЦена
б)	В строку Условие отбора для поля «ДатаРазмещения» введите выражение:

Between #01.05.95# And #31.05.95#

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

3	Создание отчета «Счет».

a)	В окне Сортировка и группировка определите следующие свойства.

Поле/выражение	Порядок сортировки	Свойства группы
КодЗаказа	По убыванию	Заголовок группы (GroupHeader): Да Примечание группы (GroupFooter): Да Группировка (GroupOn): По каждому значению Интервал (GroupInterval): 1 Не разрывать (KeepTogether): Нет
КодТовара	По возрастанию	(Стандартные настройки)
Примечание. Заказ, который требует нескольких страниц, имеет код 11077, это последний размещенный заказ в базе данных. Для того чтобы вывести этот заказ первым, для поля «КодЗаказа» задается сортировка по убыванию.

б)	В окне диалога Параметры страницы выберите вкладку «Поля» и введите в поля «Слева», «Справа», «Сверху» и «Снизу» значение 20мм.

в)	Задайте следующие значения для свойства Высота (Height) разделов.

Раздел	Высота
Верхний колонтитул	7.831см
Область данных	0.635см
Нижний колонтитул	2.54см
Заголовок и примечание группы «КодЗаказа» не выводятся в печатном отчете, поэтому нет необходимости задавать для них значения свойства Высота (Height).

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

д)	В области данных создайте поля и определите их свойства следующим образом.

Имя (Name)	Данные (ControlSource)
КодТовара	КодТовара
Марка	Марка
Количество	Количество
Цена	Цена
Скидка	Скидка
ОтпускнаяЦена	ОтпускнаяЦена
е)	В примечании группы «КодЗаказа» создайте свободное поле. Задайте для его свойства Имя (Name) значение «ПечатьНижнегоКолонтитула».

ж)	В примечании группы «КодЗаказа» создайте поле для расчета суммарной стоимости товаров в заказе и определите его свойства следующим образом.

Свойство	Значение
Имя (Name)	СуммаЗаказа
Данные (ControlSource)	=Sum([Отпускная цена])
з)	Создайте поля в нижнем колонтитуле и определите его свойства следующим образом.

Имя (Name)	Данные (ControlSource)
СуммаЗаказаСчет	=[СуммаЗаказа]
СтоимостьДоставки	СтоимостьДоставки
ИтогоСчет	=[СуммаЗаказаСчет] + [СтоимостьДоставки]
и)	Задайте значения свойств и создайте процедуры обработки событий для следующих разделов.

Раздел	Свойство	Значение
Заголовок группы «КодЗаказа»	Вывод на экран (Visible)	Нет
	Форматирование (OnFormat)	[Процедура обработки событий]
Примечание группы «КодЗаказа»	Конец страницы (ForceNewPage)	После раздела
	Вывод на экран (Visible)	Нет
	Форматирование (OnFormat)	[Процедура обработки событий]
Нижний колонтитул	Форматирование (OnFormat)	[Процедура обработки событий]
Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Процедура обработки события «Форматирование» (Format) заголовка группы «КодЗаказа»

Private Sub ЗаголовокГруппы1_Format(Cancel As Integer, FormatCount As Integer)

' Задает для поля "Строка" значение 1, чтобы отметить

' начало группы для текущего заказа.

' Задает для поля "СтраницаЗаказа" значение 1, чтобы

' отметить первую страницу заказа.

Me!Строка = 1

Me!СтраницаЗаказа = 1

' Скрывает элементы управления "Продолжение" и "КонецСтраницыДанных".

Me!Продолжение.Visible = False

Me!КонецСтраницыДанных.Visible = False

End Sub


Процедура обработки события «Форматирование» (Format) примечания группы «КодЗаказа»

Private Sub ПримечаниеГруппы3_Format(Cancel As Integer, FormatCount As Integer)

' Сбрасывает значение поля "ПечатьНижнегоКолонтитула", показывая,

' что для текущего заказа напечатаны все записи в области данных.

' Нижний колонтитул печатается в отчете, когда поле

 	' "ПечатьНижнегоКолонтитула" имеет значение True.

Me!ПечатьНижнегоКолонтитула = True

End Sub


Процедура обработки события «Форматирование» (Format) нижнего колонтитула

Private Sub НижнийКолонтитул4_Format(Cancel As Integer, FormatCount As Integer)

' Определяет, следует ли печатать нижний колонтитул.

' Печатает нижний колонтитул, если напечатаны все записи

' из области данных текущего заказа.

If Me!ПечатьНижнегоКолонтитула = True Then

Me.PrintSection = True

Me!ПечатьНижнегоКолонтитула = False

Else

' Не печатает нижний колонтитул, пока не напечатаны все

' записи текущего заказа.

Me.PrintSection = False

End If

End Sub


Процедура обработки события отчета «ДеловоеПисьмо»
Процедура обработки события «Страница» (Page) отчета «ДеловоеПисьмо»

Private Sub Report_Page()

' Проводит рамку вокруг страницы отчета.

Me.Line (0, 0)-(Me.ScaleWidth, Me.ScaleHeight), , B

End Sub


Печать фразы «Продолжение на следующей странице» внизу страницы

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

Задачи

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

Используемые объекты

Объект	Имя
Таблица	Клиенты, Сотрудники, Заказы
Запрос	Счет, ОтпускныеЦены
Отчет	Счет
Действия

1	Создание отчета для печати на готовом бланке.

2	Создание в верхнем колонтитуле свободного поля и определение для него следующих свойств.

Свойство	Значение
Имя (Name)	СтрокНаСтранице
Данные (ControlSource)	=17
Вывод на экран (Visible)	Нет
3	Создание в заголовке группы «КодЗаказа» двух свободных полей.

а)	Для первого поля задайте для свойства Имя (Name) значение «ПодсчетСтрок» и введите в ячейку свойства Данные (ControlSource) выражение:

=Count([КодТовара])

б)	Для второго поля укажите в свойстве Имя (Name) «СтраницаЗаказа» и оставьте свойство Данные (ControlSource) пустым.

Совет. В отчете «Счет» заголовок группы «КодЗаказа» является невидимым. Если создается отчет с видимым заголовком группы, не забудьте задать для свойства Вывод на экран (Visible) этих элементов управления значение «Нет».

4	Изменения в области данных.

а)	Создайте в центре области данных свободное поле позади других элементов управления и определите его свойства следующим образом.

Свойство	Значение
Имя (Name)	Continued
Данные (ControlSource)	="Продолжение на следующей странице..."
Курсив (FontItalic)	Да
б)	Создайте свободное поле у правого края области данных и определите его свойства следующим образом.

Свойство	Значение
Имя (Name)	Строка
Вывод на экран (Visible)	Нет
в)	Создайте разрыв страницы у нижнего края этого раздела и укажите в его свойстве Имя (Name) «КонецСтраницыДанных».

5	Создание процедур обработки событий для следующих разделов.

Раздел	Свойство	Значение
Верхний колонтитул	Форматирование (OnFormat)	[Процедура обработки событий]
Заголовок группы «КодЗаказа»	Форматирование (OnFormat)	[Процедура обработки событий]
Область данных	Форматирование (OnFormat)	[Процедура обработки событий]
Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Процедура обработки события «Форматирование» (Format) верхнего колонтитула

Private Sub ВерхнийКолонтитул0_Format(Cancel As Integer, FormatCount As Integer)

' В начале страницы инициализирует элементы управления в области данных.

' Задает для поля "Строка" значение 0.

' Включает свойство "Вывод на экран" (Visible) элементов управления

' в записи в области данных и скрывает поля "Продолжение"

 	' и "КонецСтраницыДанных".

With Me

!Строка = 0

!Продолжение.Visible = False

!КонецСтраницыДанных.Visible = False

!КодТовара.Visible = True

!Марка.Visible = True

!Количество.Visible = True

!Цена.Visible = True

!Скидка.Visible = True

!ОтпускнаяЦена.Visible = True

End With

End Sub


Процедура обработки события «Форматирование» (Format) области данных

Private Sub Detail2_Format(Cancel As Integer, FormatCount As Integer)

' Определяет печать области данных или слова "Продолжение..."

' Делает видимым поле "Продолжение", если достигнуто максимальное

' число записей в области данных.

If (Me!Строка = Me!СтраницаЗаказа * (Me!СтрокНаСтранице - 1) + 1) And Me!Строка <> Me!ПодсчетСтрок Then

Me!Продолжение.Visible = True

End If

' Делает видимым конец страницы и скрывает элементы управления

 	' в записи в области данных.

With Me

If !Продолжение.Visible Then

!КонецСтраницыДанных.Visible = True

!КодТовара.Visible = False

!Марка.Visible = False

!Количество.Visible = False

!Цена.Visible = False

!Скидка.Visible = False

!Отпускная цена.Visible = False

' Увеличивает номер страницы заказа.

.NextRecord = False

!СтраницаЗаказа = Me!СтраницаЗаказа + 1

Else

' Увеличивает номер строки при печати записи.

!Строка = Me!Строка + 1

End If

End With

End Sub


Процедура обработки события «Форматирование» (Format) заголовка группы «КодЗаказа»

Private Sub ЗаголовокГруппы1_Format(Cancel As Integer, FormatCount As Integer)

' Задает для поля "Строка" значение 1, чтобы отметить

' начало группы для текущего заказа.

' Задает для поля "СтраницаЗаказа" значение 1, чтобы

' показать, что данная страница является первой в заказе.

Me!Строка = 1

Me!СтраницаЗаказа = 1

' Скрывает элементы управления "Продолжение" и "КонецСтраницыДанных".

Me!Продолжение.Visible = False

Me!КонецСтраницыДанных.Visible = False

End Sub


Отчет «ЖурналОтгрузкиТоваров»

Отчет «ЖурналОтгрузкиТоваров» демонстрирует представление данных в формате продолжающихся колонок, т.е. в стиле телефонного справочника. Работу отчета «ЖурналОтгрузкиТоваров» обеспечивают следующие приемы:

•	создание отчета, печатающегося в несколько столбцов.

Для расширения функциональных характеристик отчета используется следующий прием:

•	скрытие примечания группы в начале страницы или столбца.


Создание отчета, печатающегося в несколько столбцов

Одним из часто используемых форматов отчета является формат печати в продолжающихся колонках. Например, отчет «ЖурналОтгрузкиТоваров» печатается в две колонки.

Задачи

Согласование ширины отчета с шириной области печати на странице (т.е. с областью страницы внутри полей). Указание числа и ширины столбцов на странице отчета в окне диалога Параметры страницы.

Используемые объекты

Объект	Имя
Таблица	Заказы
Запрос	СуммыЗаказов, ЖурналОтгрузкиТоваров
Отчет	ЖурналОтгрузкиТоваров
Действия

1	Импорт запроса «СуммыЗаказов» из базы данных «Борей».

2	Создание запроса «ЖурналОтгрузкиТоваров».

Таблица/запрос	Поле	Условие отбора
Таблица «Заказы»	ДатаИсполнения	Between #2/1/95# And #3/31/95#
	КодЗаказа	—
Запрос «СуммыЗаказов»	СуммаЗаказа	—
Совет.   При разработке приложений обычно удобнее вывести приглашение пользователю перед просмотром или печатью отчета ввести даты в условия отбора вместо того, чтобы  задавать даты в отчете. Пример задания условий отбора при выполнении отчета см. в отчете ВыработкаСотрудников.

3	Создание отчета «ЖурналОтгрузкиТоваров».

а)	В окне диалога Сортировка и группировка определите следующие свойства.

Поле/выражение	Порядок сортировки	Свойства группы
ДатаИсполнения	По убыванию	Заголовок группы (GroupHeader): Да Примечание группы (GroupFooter): Да Группировка (GroupOn):  По каждому значению Интервал (GroupInterval): 1 Не разрывать (KeepTogether): Первую область данных
КодЗаказа	По возрастанию	(Стандартные настройки)
б)	Задайте в свойстве Ширина (Width) значение 22.857см.

в)	Задайте следующие значения ширины полей в окне диалога Параметры страницы.

Вкладка	Параметр	Значение
Страница	Ориентация	Альбомная
Поля	Поля	Слева: 25мм Справа: 25мм Сверху: 25мм Снизу: 25мм
Столбцы	Параметры сетки	Число столбцов: 2
		Интервал: 1,6см
	Размер столбца	Ширина: 8см Высота: 0,5см
	Макет столбца	Сверху вниз,  слева направо
г)	Поместите в верхний колонтитул надписи со следующим содержимым: «Исполнение», «Код заказа» и «Сумма заказа».

д)	Поместите следующие поля в разделы отчета и определите их свойства Имя (Name) и Данные (ControlSource) следующим образом.

Раздел	Имя (Name)	Данные (ControlSource)
Заголовок группы «ДатаИсполнения»	ДатаИсполнения	ДатаИсполнения
Область данных	КодЗаказа СуммаЗаказа	КодЗаказа СуммаЗаказа
е)	Скопируйте надписи «Дата исполнения», «Код заказа» и «Сумма заказа» в верхнем колонтитуле и поместите их справа от первого набора. (Для свойства От левого края (Left) второй надписи «Дата исполнения» следует задать значение 10см.)


Отказ от печати раздела в начале страницы или столбца

Пустую область примечаний группы удобно использовать для разделения групп. Однако отчет выглядит некрасиво, если эта область попадает в начало страницы или столбца. В отчете «ЖурналОтгрузкиТоваров» пустая область примечаний группы «ДатаИсполнения» не печатается, если она оказывается наверху страницы или столбца.

Задачи

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

Используемые объекты

Объект	Имя (Name)
Таблица	Заказы
Запрос	СуммыЗаказов, ЖурналОтгрузкиТоваров
Отчет	ЖурналОтгрузкиТоваров
Действия

1	Создание отчета, печатающегося в несколько столбцов.

2	Создание в заголовке группы «ДатаИсполнения» свободного поля со следующими свойствами.

Свойство	Значение
Имя (Name)	Сверху1
Вывод на экран (Visible)	Нет
3	Создание процедур обработки событий для следующих разделов.

Раздел	Свойство	Значение
Верхний колонтитул	Форматирование (OnFormat)	[Процедура обработки событий]
Примечание группы «ДатаИсполнения»	Форматирование (OnFormat)	[Процедура обработки событий]
Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Процедура обработки события для верхнего колонтитула
Процедура обработки события «Форматирование» (Format) верхнего колонтитула

Private Sub ВерхнийКолонтитул1_Format(Cancel As Integer, FormatCount As Integer)

' В начале страницы задает для поля "Сверху1" значение 0.

Me!Сверху1 = 0

End Sub


Процедура обработки события «Форматирование» (OnFormat) примечания группы «ДатаИсполнения»
Процедура обработки события «Форматирование» (Format) примечания группы «ДатаИсполнения»

Private Sub ПримечаниеГруппы4_Format(Cancel As Integer, FormatCount As Integer)

' Проверяет, является ли примечание группы первым разделом,

' форматируемым на странице или в столбце.

' В обоих случаях не печатает раздел.

If Me!Сверху1 = 0 Or Me.Top = Me!Сверху1 Then Cancel = True

End Sub


Отчет «ДеловоеПисьмо»

Отчет «ДеловоеПисьмо» представляет составной документ, в котором суммируются результаты продаж, выполненных отдельными сотрудниками, частично основанный на результатах перекрестного запроса. Работу отчета «ДеловоеПисьмо» обеспечивают следующие приемы:

•	создание делового письма с рамкой вокруг страницы.

Для расширения функциональных характеристик отчета используется следующий прием:

•	выделение данных с помощью кругов и эллипсов.


Создание делового письма с рамкой вокруг страницы

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

Задачи

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

Используемые объекты

Объект	Имя
Таблица	Сотрудники, Заказы, Планы
Запрос	СуммыЗаказов, ДеловоеПисьмо1, ДеловоеПисьмо2
Отчет	ДеловоеПисьмо, ДеловоеПисьмоПодчиненный
Действия

1	Импорт запроса «СуммыЗаказов» из базы данных «Борей».

2	Создание перекрестного запроса «ДеловоеПисьмо1».

а)	Используйте следующие поля и выражения из перечисленных таблиц и запросов.

Таблица/запрос	Поле/выражение	Значение
Таблица «Сотрудники»	КодСотрудника	Групповая операция: Группировка Перекрестная таблица: Заголовки строк
	ФИО: [Фамилия] & ", " & [Имя]	Групповая операция: Группировка  Перекрестная таблица: Заголовки строк
Поля из таблицы «Заказы»	Год: DatePart("yyyy", [ДатаИсполнения])	Групповая операция: Группировка  Перекрестная таблица: Заголовки строк
	Выражение1: "Кв" & DatePart("q", [ДатаИсполнения])	Групповая операция: Группировка  Перекрестная таблица: Заголовки столбцов
	DatePart("yyyy", [ДатаИсполнения])	Групповая операция: Условие Условие отбора: 1993
Запрос «СуммыЗаказов»	СуммаЗаказа	Групповая операция: Sum Перекрестная таблица: Значение
Совет.   При разработке приложений обычно удобнее вывести приглашение пользователю перед просмотром или печатью отчета ввести даты в условия отбора вместо того, чтобы  задавать даты в отчете. Пример задания условий отбора при выполнении отчета приведен в отчете ВыработкаСотрудников.

б)	Задайте для свойства запроса Заголовки столбцов (ColumnHeadings) значение:

"Кв1,Кв2,Кв3,Кв4".

3	Создание запроса «ДеловоеПисьмо2».

Таблица/запрос	Поле/выражение	Значение
Таблица «Сотрудники»	Фамилия	Сортировка:  По возрастанию
	Продавец: [Имя] & " " & [Фамилия]	—
	КодСотрудника, Адрес, Город, Область, Индекс, Страна	—
Таблица «Планы»	План	—
	Плановый год: DatePart("yyyy", [Планы].[Год])	Условие отбора: [ДеловоеПисьмо1].[Год]
Запрос «ДеловоеПисьмо1»	Кв1, Кв2, Кв3, Кв4	—
4	Создание отчета «ДеловоеПисьмо».

а)	Укажите в свойстве отчета Источник записей (RecordSource) запрос «ДеловоеПисьмо2».

б)	Удалите колонтитулы. (В этом отчете используется только область данных.)

в)	В окне диалога Сортировка и группировка выберите «Фамилия» в столбце Поле/выражение и «По возрастанию» в столбце Порядок сортировки.

г)	Задайте для свойства Конец страницы (ForceNewPage) области данных значение «После раздела».

д)	Создайте поля для имени, адреса, обращения и текста письма. Для обращения используйте выражение типа следующего:

="Г-н/Г-жа " & [Продавец] & ":"

Для объединения текста и данных используйте выражение типа следующего:

=" Примите наши поздравления! Вы выполнили или перевыполнили поквартальный план продаж " & Format([План],"$#,##0") & " в " & [ПлановыйГод] & "г. В приведенной сводке результатов Вашей работы каждый квартал, итоги за который лежат в пределах 90% от плана обведен эллипсом."

Если поле должно содержать один или несколько абзацев, задайте для поля высоту одной строки текста и укажите для свойства Расширение (CanGrow) значение «Да».

е)	Для создания рамки вокруг страницы укажите в свойстве отчета «ДеловоеПисьмо» Страница (OnPage) элемент [Процедура обработки событий].

5	Создание отчета «ДеловоеПисьмоПодчиненный».

а)	Укажите в свойстве отчета Источник записей (RecordSource) запрос «ДеловоеПисьмо2».

б)	Удалите колонтитулы. (В этом отчете используется только область данных.)

в)	Создайте поля для поквартальных результатов и годового плана. Задайте для всех полей одинаковую ширину и высоту и разместите их с равными интервалами. Например, задайте для свойства Ширина (Width) каждого поля значение 2.54см, а для свойства Высота (Height) значение 0.5см. Оставьте интервалы 0,3см между полями.

г)	Сохраните отчет.

6	Добавление подчиненного отчета в главный отчет.

а)	Выберите отчет «ДеловоеПисьмоПодчиненный» в окне базы данных и перетащите его в область данных отчета «ДеловоеПисьмо».

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

в)	Проверьте, что свойства Подчиненные поля (LinkChildFields) и Основные поля (LinkMasterFields) элемента управления подчиненного отчета содержат значение «КодСотрудника».

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


Проведение эллипсов вокруг данных

Для того чтобы привлечь внимание к определенным данным, удобно их выделить тем или иным способом. Например, в отчете «ДеловоеПисьмо» итоговые данные о продажах, превышающие 90 процентов от плановых, обводятся эллипсами.

Задачи

Проведение с помощью метода Circle кругов или эллипсов вокруг элементов управления, удовлетворяющих определенному условию.

Используемые объекты

Объект	Имя
Таблица	Сотрудники, Заказы, Планы
Запрос	СуммыЗаказов, ДеловоеПисьмо1, ДеловоеПисьмо2
Отчет	ДеловоеПисьмо, ДеловоеПисьмоПодчиненный
Действия

1	Создание отчета ДеловоеПисьмо.

2	В подчиненном отчете «ДеловоеПисьмоПодчиненный» создание процедуры обработки события «Печать» (OnPrint) области данных.

Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Процедура обработки события «Печать» (Print) области данных

Private Sub Detail0_Print(Cancel As Integer, PrintCount As Integer)

' Проводит эллипсы вокруг элементов при выполнении условия.

Dim ctl As Control

Dim intPrintCircle As Integer

Dim sngAspect As Single, sngYOffset As Single

Dim intEllipseHeight As Integer, intElipseWidth As Integer

Dim sngXCoord As Single, sngYCoord As Single

Dim intI As Integer

' Для создания эллипса нужных размеров задает размеры эллипса,

' sngAspect и sngYOffset, соответствующие размерам и положению

' полей в подчиненном отчете.

sngAspect = 0.23

sngYOffset = 200

' Определяет высоту и ширину эллипса.

intEllipseHeight = Me!План.Height * 1.1

intElipseWidth = Me!План.Width * 1.04

sngYCoord = (Me!План.Top + Me!План.Height) \ 2 + sngYOffset

' Проверяет элементы управления.

' Если элемент ctl не пуст, сравнивает его значение

' с 90% от значения в поле "План".

For intI = 1 To 4

Set ctl = Me("Кв" & intI)

If Not IsNull(ctl) Then

intPrintCircle = (ctl >= 0.9 * Me!План)

' Определяет координаты элемента и проводит эллипс.

If intPrintCircle Then

sngXCoord = ctl.Left + (ctl.Width \ 2)

Me.Circle (sngXCoord, sngYCoord), intElipseWidth \ 2, , , , sngAspect

End If

End If

Next intI

End Sub


Форма «ОбъемыПродаж»

Форма «ОбъемыПродаж» демонстрирует вывод дополнительных данных о продажах, выполненных каждым сотрудником. Работу формы «ОбъемыПродаж» обеспечивают следующие приемы:

•	создание формы для отношения «один-ко-многим-ко-многим».


Создание формы для отношения «один-ко-многим-ко-многим»

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

Задачи

Создание одной подчиненной формы, в которой отображаются итоговые результаты по годам, и второй подчиненной формы для отображения поквартальных результатов. Создание главной формы, присоединенной к таблице «Сотрудники». Создание в области заголовка главной формы свободного поля со списком, позволяющего отбирать записи для выбранного сотрудника. Создание в области данных главной формы свободного поля, по которому вторая подчиненная форма связывается с первой подчиненной формой. Определение свойства Данные (ControlSource) поля с помощью выражения, которое выводит значение из поля «В-Год», служащего полем связи в первой подчиненной форме. Указание в свойствах Подчиненные поля (LinkChildFields) и Основные поля (LinkMasterFields) второй подчиненной формы имен полей, определяющих сотрудника и выбранный год — «КодСотрудника» и «В-Год».

Используемые объекты

Объект	Имя
Таблица	Сотрудники, Заказано, Заказы
Запрос	Продавцы, ОбъемыПродажЗаКвартал, ОбъемыПродажЗаГод
Форма	ОбъемыПродаж, ОбъемыПродажПодчиненная1, ОбъемыПродажПодчиненная2
Модуль	СлужебныеПрограммы
Действия

1	Создание запроса «Продавцы».

a)	Включите в запрос поля и выражения из следующих таблиц.

Таблица	Поле/Выражение
Сотрудники	КодСотрудника
Поля из таблицы «Сотрудники»	Продавец: [Фамилия] & ", " & [Имя]
Заказы	—
б)	В ячейке строки «Сортировка» для поля «Продавец» выберите «По возрастанию».

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

2	Создание запроса «ОбъемыПродажЗаГод».

Таблица	Поле/Выражение	Групповая операция	Условие отбора
Заказы	КодСотрудника	Группировка	—
	В-Год: Year([ДатаИсполнения])	Группировка	Is Not Null
Поля  из таблицы «Заказано»	Итого: CCur(Sum(CLng([Цена] * [Количество] * (1-[Скидка]) * 100)/100))	Выражение	—
3	Создание запроса «ОбъемыПродажЗаКвартал».

Таблица	Поле/Выражение	Групповая операция	Условие отбора
Заказы	КодСотрудника	Группировка	—
	В-Год: Year([ДатаИсполнения])	Группировка	Is Not Null
	Квартал: DatePart("q",[ДатаИсполнения])	Группировка	Is Not Null
Поля  из таблицы «Заказано»	СуммаЗаказа: CCur(Sum(CLng([Цена] * [Количество] * (1-[Скика]) * 100)/100))	Выражение	—
4	Создание формы «ОбъемыПродажПодчиненная1».

а)	Задайте следующие значения для свойств формы.

Свойство	Значение
Источник записей (RecordSource)	ОбъемыПродажЗаГод
Режим по умолчанию (DefaultView)	Таблица
б)	Создайте два поля в области данных и определяите их свойства Имя (Name) и Данные (ControlSource) следующим образом.

Имя (Name)	Данные (ControlSource)
В-Год	В-Год
Итого	Итого
в)	Переключитесь в режим таблицы. Подберите ширину столбцов и сохраните форму.

5	Создание формы «ОбъемыПродажПодчиненная2».

a)	Задайте следующие значения для свойств формы.

Свойство	Значение
Источник записей (RecordSource)	ОбъемыПродажЗаКвартал
Режим по умолчанию (DefaultView)	Таблица
б)	Создайте два поля в области данных и определяите их свойства Имя (Name) и Данные (ControlSource) следующим образом.

Имя (Name)	Данные (ControlSource)
Квартал	Квартал
СуммаЗаказа	СуммаЗаказа
в)	Переключитесь в режим таблицы. Подберите ширину столбцов и сохраните форму.

6	Создание в модуле «СлужебныеПрограммы» функции EnableControls.

7	Создание формы «ОбъемыПродаж».

a)	Задайте следующие значения для свойств формы.

Свойство	Значение
Источник записей (RecordSource)	Сотрудники
Подпись (Caption)	Объемы продаж
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Форма
Полосы прокрутки (ScrollBars)	Отсутствуют
Область выделения (RecordSelectors)	Нет
Поле номера записи (NavigationButtons)	Нет
Выравнивание по центру (AutoCenter)	Да
Контекстные меню (ShortcutMenu)	Нет
б)	Добавьте в форму заголовок и примечания. Задайте для свойства Высота (Height) примечания формы значение 0см.

в)	В области заголовка формы создайте свободное поле со списком и определите его свойства следующим образом.

Свойство	Значение
Имя (Name)	ВыборПродавца
Тип источника строк (RowSourceType)	Таблица/запрос
Источник строк (RowSource)	Продавцы
Число столбцов (ColumnCount)	2
Ширина столбцов (ColumnWidths)	5,08см;0см
Присоединенный столбец (BoundColumn)	2
Ограничиться списком (LimitToList)	Да
После обновления (AfterUpdate)	[Процедура обработки событий]
г)	В области данных создайте поле, отсоедините от него подпись, а затем определите свойства поля следующим образом.

Свойство	Значение
Имя (Name)	Продавец
Данные (ControlSource)	=[Фамилия] & ", " & [Имя]
Доступ (Enabled)	Нет
Переход по Tab (TabStop)	Нет
д)	В области данных создайте скрытое поле и определите свойства поля следующим образом.

Свойство	Значение
Имя (Name)	В-Год
Данные (ControlSource)	=[ОбъемыПродажПодчиненная1]![В-Год]
Вывод на экран (Visible)	Нет
Переход по Tab (TabStop)	Нет
Примечание. Microsoft Access использует значение этого поля для связи значений, выводящихся в форме «ОбъемыПродажПодчиненная2» с выбранной строкой в форме «ОбъемыПродажПодчиненная1».

8	Добавление формы «ОбъемыПродажПодчиненная1» в форму «ОбъемыПродаж».

а)	Выберите в окне базы данных форму «ОбъемыПродажПодчиненная1» и перетащите ее в область данных формы «ОбъемыПродаж».

б)	Замените текст подписи элемента управления подчиненной формы на Выбор года: и подберите подходящий размер элемента управления подчиненной формы.

в)	Проверьте, что свойства Подчиненные поля (LinkChildFields) и Основные поля (LinkMasterFields) элемента управления «ОбъемыПродажПодчиненная1» имеют значение «КодСотрудника».

г)	Задайте для свойства Доступ (Enabled) элемента управления «ОбъемыПродажПодчиненная1» значение «Нет».

9	Добавление формы «ОбъемыПродажПодчиненная2» в форму «ОбъемыПродаж».

а)	Выберите в окне базы данных форму «ОбъемыПродажПодчиненная2» и перетащите ее в область данных формы «ОбъемыПродаж».

б)	Замените текст подписи элемента управления подчиненной формы на По кварталам за выбранный год: и подберите подходящий размер элемента управления подчиненной формы.

в)	В ячейке свойств Подчиненные поля (LinkChildFields) и Основные поля (LinkMasterFields) элемента управления «ОбъемыПродажПодчиненная2» введите значения В-Год;КодСотрудника.

г)	Задайте для свойства Доступ (Enabled) элемента управления «ОбъемыПродажПодчиненная2» значение «Нет».

Литература

Дополнительные сведения см. в книге Разработка приложений Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»
Работа с формами	Глава 3 «Применение форм для ввода, вывода и отбора данных»


Процедура обработки события «После обновления» (AfterUpdate) поля со списком «ВыборПродавца»

Private Sub ВыборПродавца_AfterUpdate()

' Ищет записи, соответствующие фамилии, выбранной в поле со списком

' "ВыборПродавца". Активизирует элементы управления в области данных.

' Переходит в форму "ОбъемыПродажПодчиненная1".

DoCmd.ApplyFilter , "КодСотрудника = Forms!ОбъемыПродаж!ВыборПродавца"

EnableControls Me, acDetail, True

Me!ОбъемыПродажПодчиненная.SetFocus

End Sub


Форма «Продажи»

Форма «Продажи» демонстрирует использование полей и группы переключателей для указания условий отбора для запроса. Работу формы «Продажи» обеспечивают следующие приемы:

•	использование специальной функции в инструкции SQL SELECT.


Использование специальной функции в инструкции SELECT (SQL) в форме

В форме, предназначенной для ввода условий отбора в запрос, удобно предложить пользователям выбор одного параметра из ограниченного набора. Например, в форме «Продажи» можно указать диапазон дат, а также определить, следует ли показывать все записи из этого диапазона или только записи с суммой продаж большей или меньшей 1000.

Задачи

Создание формы, в которой условия отбора вводятся в поля и выбираются в группе переключателей в заголовке главной формы, а записи выводятся в подчиненной форме в области данных. Создание функции, возвращающей значение, выбранное в группе переключателей. Создание кнопки в заголовке главной формы. Определение для свойства Нажатие кнопки (OnClick) кнопки процедуры обработки события, создающей инструкцию SQL SELECT, в которой специальная функция возвращает введенные пользователем условия и задает значение свойства Источник записей (RecordSource) подчиненной формы с помощью инструкции SELECT.

Используемые объекты

Объект	Имя
Таблица	Клиенты, Заказы
Запрос	СуммыЗаказов, Продажи
Форма	Продажи, ПродажиПодчиненная
Модуль	ВключениеЭлементовУправления
Действия

1	Создание формы «ПродажиПодчиненная».

а)	Задайте следующие значения для свойств формы.

Свойство	Значение
Источник записей (RecordSource)	SELECT [Название] FROM Клиенты WHERE False
Режим по умолчанию (DefaultView)	Таблица
Допустимые режимы (ViewsAllowed)	Таблица
Контекстные меню (ShortcutMenu)	Нет
Примечание.   Заданная в свойстве Источник записей (RecordSource) инструкция SQL приведет к отображению пустой подчиненной формы при открытии формы «Продажи».

б)	В области данных создайте элементы управления-поля для полей «Название», «КодЗаказа» и «СуммаЗаказа».

в)	Переключитесь в режим таблицы, задайте ширину столбцов и сохраните форму.

2	Создание формы «Продажи».

а)	Задайте следующие значения для свойств формы.

Свойство	Значение
Источник записей (RecordSource)	—
Подпись (Caption)	Продажи
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Форма
Полосы прокрутки (ScrollBars)	Отсутствуют
Область выделения (RecordSelectors)	Нет
Поле номера записи (NavigationButtons)	Нет
Выравнивание по центру (AutoCenter)	Да
Контекстные меню (ShortcutMenu)	Нет
Открытие (OnOpen)	[Процедура обработки событий]
б)	В окне базы данных выберите форму «ПродажиПодчиненная» и перетащите ее в область данных формы «Продажи». Определите размеры и положение элемента управления подчиненной формы и удалите присоединенную к нему подпись. (Оставьте свойства Подчиненные поля (LinkChildFields) и Основные поля (LinkMasterFields) пустыми.)

в)	Добавьте в форму заголовок и примечание. Задайте для свойства Высота (Height) примечания формы значение 0см.

г)	В области заголовка формы создайте два свободных поля и определите их свойства Имя (Name) и Формат поля (Format) следующим образом.

Имя	Формат поля
НачальнаяДата	Средний формат даты
КонечнаяДата	Средний формат даты
д)	Введите имя каждого поля в свойство Подпись (Caption) присоединенной надписи.

е)	В заголовке формы создайте свободную группу переключателей и определите ее свойства следующим образом.

Свойство	Значение
Имя (Name)	УсловияПродажи
Значение по умолчанию (DefaultValue)	1
ж)	Введите текст Условия продажи (Sales) в качестве значения свойства Подпись (Caption) надписи, присоединенной к группе.

з)	Создайте в группе «УсловияПродажи» три переключателя и определите их свойства Имя (Name) и Значение параметра (OptionValue) следующим образом.

Имя	Значение параметра
Меньше 1000	1
Больше 1000	2
Все	3
и)	Укажите имя каждого переключателя в свойстве Подпись (Caption) присоединенной надписи.

3	Импорт запроса «СуммыЗаказов» из демонстрационной базы данных «Борей».

4	Создание запроса «Продажи».

а)	Включите в запрос поля из следующих таблиц и запроса.

Таблица/Запрос	Поле
Таблица «Клиенты»	Название
Таблица «Заказы»	ДатаИсполнения
Запрос «СуммыЗаказов»	КодЗаказа
	СуммаЗаказа (По убыванию)
б)	В ячейку строки Условие отбора для поля «ДатаИсполнения» введите выражение:

Between Forms![Продажи]![НачальнаяДата] And Forms![Продажи]![КонечнаяДата]

Совет.   Скопируйте инструкцию SQL из окна запроса в режиме SQL для ее использования в процедуре обработки события кнопки, создаваемой на шаге 7.

5	Создание функции ShowSalesValue в общей области модуля Form_Продажи.

6	Создание модуля «ВключениеЭлементовУправления».

•	Создайте функцию EnableControls .

7	Создание в заголовке формы «Продажи» кнопки со следующими свойствами.

Свойство	Значение
Имя (Name)	КнопкаПродажи
Подпись (Caption)	Продажи
По умолчанию (Default)	Да
Всплывающая подсказка (ControlTipText)	Выводит сведения о продажах, удовлетворяющих указанным условиям.
Нажатие кнопки (OnClick)	[Процедура обработки событий]
Литература

Дополнительные сведения см. в книге Разработка приложений Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2, «Введение в Visual Basic»
Работа с формами	Глава 3, «Применение форм для ввода, вывода и отбора данных»


Процедура обработки события «Открытие» (Open) формы «Продажи»

Private Sub Form_Open(Cancel As Integer)

' Переводит курсор в поле «НачальнаяДата».

Me! НачальнаяДата.SetFocus

' Используется при вызове примера из формы «КаталогПримеров».

Me! НачальнаяДата = #4/1/95#

Me!КонечнаяДата = #4/30/95#

ShowSales_Click

End Sub


Функция ShowSalesValue

Private Function ShowSalesValue(lngOptionGroupValue As Long) As String

' Возвращает значение, выбранное в группе «УсловияПродажи».

' Описывает константы для значений переключателей в группе.

Const conSalesUnder1000 = 1

Const conSalesOver1000 = 2

Const conAllSales = 3

' Создает условия отбора, соответствующие значениям переключателей.

Select Case lngOptionGroupValue

Case conSalesUnder1000:

ShowSalesValue = "СуммыЗаказов.СуммаЗаказа < 1000"

Case conSalesOver1000:

ShowSalesValue = "СуммыЗаказов.СуммаЗаказа >= 1000"

Case Else

ShowSalesValue = "СуммыЗаказов.СуммаЗаказа = True"

End Select

End Function


Процедура обработки события «Нажатие кнопки» (Click) кнопки «КнопкаПродажи»

Private Sub Продажи_Click()

' Проверяет, что КонечнаяДата позже, чем НачальнаяДата.

If КонечнаяДата < НачальнаяДата Then

MsgBox "Необходимо, чтобы КонечнаяДата была позже, чем НачальнаяДата."

НачальнаяДата.SetFocus

Exit Sub

End If

' Создает инструкцию SQL, соответствующую выбранным условиям,

' и определяет свойство «Источник записей (RecordSource)»

' формы «ПродажиПодчиненная».

Dim strSQL As String, strRestrict As String

Dim lngX As Long

lngX = Forms!Продажи!Sales.Value

strRestrict = ShowSalesValue(lngX)

' Создает инструкцию SELECT.

strSQL = "SELECT DISTINCTROW Клиенты.Название, СуммыЗаказов.КодЗаказа, "

strSQL = strSQL & "СуммыЗаказов.СуммаЗаказа , Заказы.ДатаИсполнения "

strSQL = strSQL & "FROM Клиенты INNER JOIN (СуммыЗаказов INNER JOIN Заказы ON "

strSQL = strSQL & "СуммыЗаказов.КодЗаказа = Заказы.КодЗаказа) ON "

strSQL = strSQL & "Клиенты.КодКлиента = Заказы.КодКлиента "

strSQL = strSQL & "WHERE (Заказы.ДатаИсполнения Between Forms!Продажи!НачальнаяДата "

strSQL = strSQL & "And Forms!Продажи!КонечнаяДата) "

strSQL = strSQL & "And " & strRestrict

strSQL = strSQL & " ORDER BY СуммыЗаказов.СуммаЗаказа DESC;"

' Задает значение свойства "Источник записей" формы "ПродажиПодчиненная".

Me!ПродажиПодчиненная.Form.RecordSource = strSQL

' Если нет записей, удовлетворяющих условиям, сбрасывает свойство

' «Источник записей» подчиненной формы, выводит сообщение

' и переводит фокус на поле «НачальнаяДата».

If Me!ПродажиПодчиненная.Form.RecordsetClone.RecordCount = 0 Then

Me!ПродажиПодчиненная.Form.RecordSource = "SELECT Название FROM Клиенты WHERE False;"

MsgBox " Нет записей, удовлетворяющих введенным условиям.", 48, " Записи не найдены."

Me!НачальнаяДата.SetFocus

Else

' Активизирует элементы управления в области данных.

EnableControls Me, acDetail, True

' Переводит курсор в подчиненную форму.

Me!ПродажиПодчиненная!Название.SetFocus

End If

End Sub


Форма «ТелефоныКлиентов»

Форма «ТелефоныКлиентов» демонстрирует вывод записи в форме с последующим выводом другой записи во втором экземпляре формы. Работу формы «ТелефоныКлиентов» обеспечивают следующие приемы:

•	Открытие нескольких экземпляров формы.

Для расширения функциональных характеристик формы «ТелефоныКлиентов» используется следующий прием:

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


Открытие нескольких экземпляров формы

В форме, предназначенной для вывода списка из нескольких записей, например, в телефонном справочнике, удобно обеспечить возможность одновременного просмотра дополнительных данных, относящихся к разным записям. В форме «ТелефоныКлиентов» имеется кнопка, при нажатии которой открывается вторая форма, содержащая дополнительные сведения о клиентах. Различные экземпляры этой формы могут одновременно открываться для разных записей в первой форме.

Задачи

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

Используемые объекты

Объект	Имя
Таблица	Клиенты
Форма	ТелефоныКлиентов, Клиенты
Действия

1	Создание формы «ТелефоныКлиентов».

а)	Задайте следующие значения для свойств формы.

Свойство	Значение
Источник записей (RecordSource)	Клиенты
Подпись (Caption)	Телефоны клиентов
Режим по умолчанию (DefaultView)	Ленточная форма
Допустимые режимы (ViewsAllowed)	Все
Разрешить изменение (AllowEdits)	Нет
Разрешить удаление (AllowDeletions)	Нет
Разрешить добавление (AllowAdditions)	Нет
Автоматический размер (AutoResize)	Да
Выравнивание по центру (AutoCenter)	Да
б)	В заголовке формы создайте надписи «Организация», «Сотрудник», «Страна» и «Телефон».

в)	В область данных добавьте поля «Название», «ОбращатьсяК», «Страна» и «Телефон» из таблицы «Клиенты». Удалите автоматически создаваемые присоединенные надписи.

2	Создание формы «Клиенты».

a)	Задайте следующие значения для свойств формы.

Свойство	Значение
Источник записей (RecordSource)	Клиенты
Подпись (Caption)	Клиенты
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Все
Разрешить изменение (AllowEdits)	Нет
Разрешить удаление (AllowDeletions)	Нет
Разрешить добавление (AllowAdditions)	Нет
Область выделения (RecordSelectors)	Нет
Автоматический размер (AutoResize)	Да
Выравнивание по центру (AutoCenter)	Да
б)	В заголовке формы создайте надпись «Клиенты».

в)	В область данных добавьте поля из таблицы «Клиенты».

3	Описание переменных в разделе описаний модуля Form_ТелефоныКлиентов.

4	Описание переменных в разделе описаний модуля Form_Клиенты.

5	Добавление на уровне модуля Form_Клиенты инструкций Property Get и Property Let для описания специального свойства, с помощью которого осуществляется работа с экземплярами формы.

6	Создание на уровне модуля Form_ТелефоныКлиентов специальной процедуры Sub для управления экземплярами формы.

7	Создание процедур обработки событий для формы «ТелефоныКлиентов».

Свойство	Значение
Закрытие (OnClose)	[Процедура обработки событий]
8	Создание процедур обработки событий для формы «Клиенты».

Свойство	Значение
Закрытие (OnClose)	[Процедура обработки событий]
Открытие (OnOpen)	[Процедура обработки событий]
9	Создание в области данных формы «ТелефоныКлиентов» кнопки «Сведения» со следующими свойствами.

Свойство	Значение
Имя (Name)	Сведения
Подпись (Caption)	Сведения...
Всплывающая подсказка (ControlTipText)	Выводит дополнительные сведения о текущем клиенте.
Нажатие кнопки (OnClick)	[Процедура обработки событий]
Литература

Дополнительные сведения см. в книге Разработка приложений Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2, «Введение в Visual Basic»
Работа с формами	Глава 3, «Применение форм для ввода, вывода и отбора данных»
Работа с объектами и семействами	Глава 5, «Объекты и семейства»


Раздел описаний модуля Form_ТелефоныКлиентов

Option Compare Database

Option Explicit

' Семейство, содержащее экземпляры формы «Клиенты».

Dim colCustomerForms As New Collection


Раздел описаний модуля Form_Клиенты

Option Compare Database

Option Explicit

' Общие переменные для управления экземплярами формы.

Dim strНесколькоЭкземпляров As String

Dim frmCustomers As Form_Клиенты


Инструкция Property Get в модуле Form_Клиенты

Public Property Get НесколькоЭкземпляров() As String

' Описывает специальное свойство «НесколькоЭкземпляров».

НесколькоЭкземпляров= strНесколькоЭкземпляров

End Property


Инструкция Property Let в модуле Form_Клиенты

Public Property Let НесколькоЭкземпляров(strVal As String)

' Описывает специальное свойство «НесколькоЭкземпляров».

strНесколькоЭкземпляров = strVal

End Property


Процедура Sub RemoveFormInstances в модуле Form_ТелефоныКлиентов

Public Sub RemoveFormInstance(strWhich As String)

' Удаляет из семейства экземпляр формы «Клиенты»,

' определяемый переменной strWhich.

colCustomerForms.Remove strWhich

End Sub


Процедура обработки события «Закрытие» (Close) формы «ТелефоныКлиентов»

Private Sub Form_Close()

Dim intIndex As Integer

Dim frm As Form_Клиенты

' Открывает форму «ОкноВыборКлиента» с приглашением указать

 	' форму, которую следует оставить открытой.

If colCustomerForms.Count > 0 Then

DoCmd.OpenForm "ОкноВыборКлиента", , , , , acDialog

End If

' Закрывает все формы в семействе, делая невозможными вызовы из них

' данной формы. Обратите внимание, что данная форма закрывается

' раньше остальных и выводит семейство из области определения.

' Это освобождает все объектные переменные форм и приводит

' к закрытию всех экземпляров формы «Клиенты».

For Each frm In colCustomerForms

frm.НесколькоЭкземпляров= ""

Next

End Sub


Процедура обработки события «Закрытие» (Close) формы «Клиенты»

Private Sub Form_Close()

' Удаляет данный экземпляр формы из семейства, управляемого

' формой «ТелефоныКлиентов».

' Форма «ТелефоныКлиентов» определяет для данной формы определяемое

' пользователем свойство, показывающее, что форма существует

' в нескольких экземплярах.

' Данная процедура проверяет это свойство, чтобы узнать,

' следует ли удалять экземпляр из семейства.

If strНесколькоЭкземпляров <> "" Then

Forms! ТелефоныКлиентов.RemoveFormInstance strНесколькоЭкземпляров

End If

End Sub


Процедура обработки события «Открытие» (Open) формы «Клиенты»

Private Sub Form_Open(Cancel As Integer)

' Инициализирует переменную strНесколькоЭкземпляров.

strНесколькоЭкземпляров = ""

End Sub


Процедура обработки события «Нажатие кнопки» (Click) кнопки «Сведения»

Private Sub Сведения_Click()

Dim frmNewInst As Form_Клиенты

Const conFormDoesNotExist = 5

On Error Resume Next

' Проверяет, существует ли экземпляр данной формы в семействе.

Set frmNewInst = colCustomerForms(Me!КодКлиента)

If Err = conFormDoesNotExist Then

' Форма не существует.

Set frmNewInst = New Form_Клиенты

' Определяет свойства формы, в том числе специальное

 	' свойство «НесколькоЭкземпляров».

With frmNewInst

.НесколькоЭкземпляров= Me!КодКлиента

.AllowAdditions = False

.AllowDeletions = False

.NavigationButtons = False

.RecordSelectors = False

.RecordSource = "Select * from Клиенты Where Клиенты.КодКлиента = """ & Me!КодКлиента & """;"

.Requery

.Visible = True

End With

colCustomerForms.Add Item:=frmNewInst, Key:=Me!КодКлиента

Else

' Форма существует. Переводит на нее фокус.

frmNewInst.SetFocus

DoCmd.Restore

End If

End Sub


Форма «ОкноВыборКлиента»

Форма «ОкноВыборКлиента» демонстрирует заполнение списка, допускающего многосвязный выбор, с помощью программы Visual Basic для приложений.

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

Работу формы «ОкноВыборКлиента» обеспечивают следующие приемы:

•	использование функции для создания списка, допускающего выбор нескольких элементов.


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

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

Задачи

Создание формы «ОкноВыборКлиента», выводящей список открытых записей о клиентах. Создание функции, заполняющей список. Добавление в форму кнопки, которая закрывает форму «ОкноВыборКлиента», но оставляет выбранные записи открытыми в форме «Клиенты».

Используемые объекты

Объект	Имя (Name)
Таблица	Клиенты
Форма	ТелефоныКлиентов, Клиенты, ОкноВыборКлиента
Действия

1	Создание формы «ОкноВыборКлиента».

а)	Задайте следующие значения для свойств формы.

Свойство	Значение
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Все
Область выделения (RecordSelectors)	Нет
Поле номера записи (NavigationButtons)	Нет
Автоматический размер (AutoResize)	Да
Выравнивание по центру (AutoCenter)	Да
Всплывающее окно (PopUp)	Да
Модальное окно (Modal)	Да
Тип границы (BorderStyle)	Окно диалога
б)	В области данных создайте надпись, содержащую инструкции по использованию окна диалога.

в)	В области данных создайте список «СписокФорм» и кнопку «КнопкаOK».

2	Создание функции ReturnCollection в модуле Form_ТелефоныКлиентов.

3	Создание процедуры Sub НеЗакрыватьФорму в модуле Form_Клиенты.

4	Ввод в раздел описаний модуля Form_ОкноВыборКлиента инструкции:

Dim colCustomerForms As Collection

5	Создание функции СписокФорм_Fill в модуле Form_ОкноВыборКлиента.

6	Указание в свойстве «Тип источника строк» (RowSourceType) списка «СписокФорм» имени функции СписокФорм_Fill.

7	Определение свойства «Нажатие кнопки» (OnClick) для кнопки «КнопкаOK» с помощью элемента [Процедура обработки событий].

Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2, «Введение в Visual Basic»
Работа с формами	Глава 3, «Применение форм для ввода, вывода и отбора данных»


Функция ReturnCollection в модуле Form_ТелефоныКлиентов

Public Function ReturnCollection() As Collection

' Возвращает семейство открытых форм «Клиенты».

Set ReturnCollection = colCustomerForms

End Function


Процедура Sub НеЗакрыватьФорму в модуле Form_Клиенты

Public Sub НеЗакрыватьФорму(frmWhoAmI As Form_Клиенты)

' Указывает, что данную форму следует оставить открытой

' при закрытии формы «ОкноВыборКлиента».

Set frmCustomers = frmWhoAmI

End Sub


Функция СписокФорм_Fill

Function СписокФорм_Fill(ctl As Control, lngID As Long, lngRow As Long, lngCol As Long, intCode As Integer) As Variant

Dim frm As Form_Клиенты

' Ошибка, если форма «ТелефоныКлиентов» не открыта.

Const conFormNotOpen = 2450

On Error GoTo Fill_Error

Select Case intCode

Case acLBInitialize	' Инициализирует список.

Set colCustomerForms = Forms![ТелефоныКлиентов].ReturnCollection

СписокФорм_Fill = True

Case acLBOpen	' Открытие.

СписокФорм_Fill = Timer

Case acLBGetRowCount	' Определяет число строк.

СписокФорм_Fill = colCustomerForms.Count

Case acLBGetColumnCount	' Определяет число столбцов.

СписокФорм_Fill = 1

Case acLBGetColumnWidth	' Определяет ширину столбца.

СписокФорм_Fill = -1	' Использует стандартную ширину.

Case acLBGetValue	' Принимает данные.

Set frm = colCustomerForms(lngRow + 1)

СписокФорм_Fill = frm![Название]

End Select

Exit Function

Fill_Error:

If Err = conFormNotOpen Then

Exit Function

Else

MsgBox Err.Description

Exit Function

End If

End Function


Процедура обработки события «Нажатие кнопки» (Click) кнопки «КнопкаOK»

Private Sub КнопкаОК_Click()

Dim intIndex As Variant

Dim frm As Form_Клиенты

Const conObjectRequired = 424

On Error GoTo Close_Error

' Если список пуст, то закрывает форму и выходит из процедуры.

If Me!СписокФорм.ListIndex = 0 And IsNull(Me!СписокФорм.ItemData(0)) Then

DoCmd.Close acForm, "ОкноВыборКлиента"

Exit Sub

End If

' Задает значение определяемого пользователем свойства «НеЗакрыватьФорму»

' для форм, которые следует оставить открытыми.

intIndex = 1

' Определяет выбранные элементы списка.

For Each intIndex In СписокФорм.ItemsSelected

Set frm = colCustomerForms(intIndex + 1)

frm.НеЗакрыватьФорму frm

Next intIndex

DoCmd.Close acForm, "ОкноВыборКлиента"

Exit Sub

Close_Error:

If Err = conObjectRequired Then

DoCmd.Close acForm, "ОкноВыборКлиента"

Exit Sub

Else

MsgBox Err.Description

Exit Sub

End If

End Sub


Общие сведения об учебном приложении «Решения»

«Решения» являются полностью документированным приложением, содержащим набор форм, отчетов и элементов интерфейса, обычно используемых при создании приложений. Во многих примерах используются новые средства последней версии Microsoft Access.

Требования к пользователям

Примеры, содержащиеся в приложении, окажутся полезными для пользователей, умеющих создавать запросы, формы, отчеты и макросы и ознакомившихся с руководством Разработка приложений Microsoft Access 97.

Советы по использованию приложения «Решения»

Все примеры в данном приложении доступны из главной формы приложения, «КаталогПримеров», которая открывается при открытии базы данных «Решения». Для того чтобы открыть демонстрационную форму или отчет, вначале выберите тему примеров в верхнем списке в форме «КаталогПримеров», а затем установите указатель на название конкретного примера в нижнем списке и дважды нажмите кнопку мыши или выберите пример и нажмите кнопку OK. «Решения» автоматически открывают созданные для данного примера форму или отчет и соответствующий раздел собственной встроенной справки приложения.

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

Советы по использованию подсказки

Раздел подсказки формы или отчета автоматически выводится на экран, если установлен флажок у нижнего края окна формы «КаталогПримеров». Для того чтобы вывести этот раздел для формы в режиме формы или для отчета в режиме предварительного просмотра, нажмите клавишу F1 или нажмите кнопку Справка на панели инструментов.

Основные средства подсказки приложения аналогичны средствам встроенной справки Microsoft Access.

•	Для поиска раздела по ключевому слову или фразе нажмите кнопку Разделы в окне справки, а затем выберите вкладку Предметный указатель или Поиск.

•	Для печати раздела справки нажмите кнопку Параметры и выберите команду Печать раздела.

•	Чтобы скопировать из раздела справки текст или программу Visual Basic, выделите копируемый блок с помощью правой кнопки мыши и выберите в контекстном меню команду Копировать.

•	Чтобы всегда удерживать окно справки на экране, нажмите кнопку Параметры и выберите команду Размещение окна с подкомандой Поверх остальных.


Форма «ОграничениеСписка»

Форма «ОграничениеСписка» демонстрирует способ отбора товаров определенного типа. Работу формы «ОграничениеСписка» обеспечивает следующий прием:

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


Ограничение списка с помощью значения, выбранного в группе переключателей

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

Задачи

Включение поля «КодТипа» в запрос, являющийся источником для списка «ВыборТовара». Указание условия отбора для поля «КодТипа» с помощью выражения, требующего, чтобы значение в поле «КодТипа» совпадало со значением, выбранным в группе переключателей «ВыборТипа». Обновление списка товаров после выбора типа товаров.

Используемые объекты

Объект	Имя
Таблица	Товары
Запрос	ОграничениеСпискаТоваров2
Форма	ОграничениеСписка
Действия

1	Создание запроса «ОграничениеСпискаТоваров2».

а)	Включите следующие поля из таблицы «Товары».

Поле	Сортировка
Марка	По возрастанию
КодТовара	—
КодТипа	—
б)	В ячейку строки «Условие отбора» для поля «КодТипа» введите выражение:

Forms!ОграничениеСписка!ВыборТипа

2	Создание формы «ОграничениеСписка».

а)	Задайте следующие значения для свойств формы.

Свойство	Значение
Источник записей (RecordSource)	Товары
Подпись (Caption)	Ограничение содержимого списка
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Форма
Полосы прокрутка (ScrollBars)	Отсутствуют
Область выделения (RecordSelectors)	Нет
Поле номера записи (NavigationButtons)	Нет
Выравнивание по центру (AutoCenter)	Да
Контекстные меню (ShortcutMenu)	Нет
б)	Создайте свободную группу и задайте для ее свойства Имя (Name) значение «ВыборТипа».

в)	Для каждого типа товаров добавьте переключатель в группу и введите название типа в подпись переключателя.

г)	Задайте для свойства Значение параметра (OptionValue) каждого переключателя значение, совпадающее со значением «КодТипа» соответствующего типа. Например, для напитков «КодТипа» имеет значение 1, поэтому свойство Значение параметра (OptionValue) переключателя «Напитки» должно иметь значение 1.

д)	Задайте значение 1 для свойства Значение по умолчанию (DefaultValue) группы переключателей.

е)	Создайте процедуру обработки события группы переключателей После обновления (AfterUpdate).

ж)	Создайте свободный список и определите его свойства следующим образом.

Свойство	Значение
Имя (Name)	ВыборТовара
Тип источника строк (RowSourceType)	Таблица/Запрос
Источник строк (RowSource)	ОграничениеСпискаТоваров2
Число столбцов (ColumnCount)	2
Ширина столбцов (ColumnWidths)	;0см
Присоединенный столбец (BoundColumn)	2
Литература

Дополнительные сведения приведены в книге Разработка приложений Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Процедура обработки события «После обновления» (AfterUpdate) группы «ВыборТипа»

Private Sub ВыборТипа_AfterUpdate()

' Обновляет поле со списком "ВыборТовара".

Me!ВыборТовара.Requery

End Sub


Форма «ДобавлениеВсеВСписок»

Форма «ДобавлениеВсеВСписок» демонстрирует добавление пункта «(Все)» в список или в поле со списком. Работу формы «ДобавлениеВсеВСписок» обеспечивает следующий прием:

•	добавление пункта «(Все)» в список.


Добавление пункта «(Все)» в список

При использовании списка или поля со списком для ввода условий отбора иногда возникает необходимость указать отбор всех записей. В форме «ДобавлениеВсеВСписок» список в поле со списком «ВыборКлиента» включает пункт «(Все)».

Задачи

Создание функции, добавляющей пункт «(Все)» в список или в поле со списком. Создание списка или поля со списком, которые содержат имя функции в свойстве Тип источника строк (RowSourceType).

Используемые объекты

Объект	Имя
Форма	ДобавлениеВсеВСписок
Модуль	СлужебныеПрограммы
Действия

1	Создание функции «ДобавлениеВсеВСписок» в модуле «СлужебныеПрограммы».

а)	Создайте функцию ДобавлениеВсеВСписок.

2	Создание формы «ДобавлениеВсеВСписок».

а)	Задайте следующие значения для свойств формы.

Свойство	Значение
Источник записей (RecordSource)	Клиенты
Подпись (Caption)	Добавление пункта «(Все)» в список
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Форма
Полосы прокрутки (ScrollBars)	Отсутствуют
Область выделения (RecordSelectors)	Нет
Выравнивание по центру (AutoCenter)	Да
Контекстные меню (ShortcutMenu)	Нет
б)	Добавьте в форму заголовок и примечание. Задайте значение 0см для свойства Высота (Height) примечания формы.

в)	Создайте в области заголовка формы поле со списком и определите его свойства следующим образом.

Свойство	Значение
Имя (Name)	ВыборКлиента
Тип источника строк (RowSourceType)	ДобавлениеВсеВСписок
Источник строк (RowSource)	СписокКлиентов
Число столбцов (ColumnCount)	2
Ширина столбцов (ColumnWidths)	7,62см;0см
Присоединенный столбец (BoundColumn)	2
Ограничиться списком (LimitToList)	Да
Дополнительные сведения (Tag)	1
После обновления (AfterUpdate)	[Процедура обработки событий]
г)	В области данных формы создайте элементы управления-поля для полей «КодКлиента», «Название», «ОбращатьсяК», «Телефон» и «Факс».

Литература

Дополнительные сведения приведены в книге Разработка приложений Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Функция «ДобавлениеВсеВСписок»

Function ДобавлениеВсеВСписок(ctl As Control, lngID As Long, lngRow As Long, _

lngCol As Long, intCode As Integer) As Variant

' Добавляет "(Все)" как первый элемент списка.

' Чтобы ввести "(Все)" в различные столбцы списка,

' следует указать другой номер столбца в свойстве

' "Дополнительные сведения" (Tag) элемента

' управления или ввести текст, отличный от "(Все)",

' добавляя символ точки с запятой (;) и

' отображаемый текст. Например, если задать для

' свойства "Дополнительные сведения"(Tag) значение

' "2;<Отсутствует>", то во втором столбце появится

' "<Отсутствует>".

Static dbs As Database, rst As Recordset

Static lngDisplayID As Long

Static intDisplayCol As Integer

Static strDisplayText As String

Dim intSemiColon As Integer

On Error GoTo Err_ДобавлениеВсеВСписок

Select Case intCode

Case acLBInitialize

' Проверяет, не используется ли функция.

If lngDisplayID <> 0 Then

MsgBox " Функция ДобавлениеВсеВСписок уже используется в другом элементе управления!"

ДобавлениеВсеВСписок = False

Exit Function

End If

' Проверяет отображаемый столбец и выводит текст,

' заданный в свойстве "Дополнительные сведения" (Tag).

intDisplayCol = 1

strDisplayText = "(Все)"

If Not IsNull(ctl.Tag) Then

intSemiColon = InStr(ctl.Tag, ";")

If intSemiColon = 0 Then

intDisplayCol = Val(ctl.Tag)

Else

intDisplayCol = Val(Left(ctl.Tag, intSemiColon - 1))

strDisplayText = Mid(ctl.Tag, intSemiColon + 1)

End If

End If

' Открывает набор записей, заданный

' в свойстве "Источник строк" (RowSource).

Set dbs = CurrentDb

Set rst = dbs.OpenRecordset(ctl.RowSource, dbOpenSnapshot)

' Записывает и возвращает значение lngID для функции.

lngDisplayID = Timer

ДобавлениеВсеВСписок = lngDisplayID

Case acLBOpen

ДобавлениеВсеВСписок = lngDisplayID

Case acLBGetRowCount

' Возвращает число строк в наборе записей.

On Error Resume Next

rst.MoveLast

ДобавлениеВсеВСписок = rst.RecordCount + 1

Case acLBGetColumnCount

' Возвращает число полей (столбцов) в наборе записей.

ДобавлениеВсеВСписок = rst.Fields.Count

Case acLBGetColumnWidth

ДобавлениеВсеВСписок = -1

Case acLBGetValue

If lngRow = 0 Then

If lngCol = intDisplayCol - 1 Then

ДобавлениеВсеВСписок = strDisplayText

Else

ДобавлениеВсеВСписок = Null

End If

Else

rst.MoveFirst

rst.Move lngRow - 1

ДобавлениеВсеВСписок = rst(lngCol)

End If

Case acLBEnd

lngDisplayID = 0

rst.Close

End Select

Bye_ ДобавлениеВсеВСписок:

Exit Function

Err_ ДобавлениеВсеВСписок:

MsgBox Err.Description, vbOKOnly + vbCritical, "ДобавлениеВсеВСписок"

ДобавлениеВсеВСписок = False

Resume Bye_ ДобавлениеВсеВСписок

End Function


Процедура обработки события «После обновления» (AfterUpdate) поля со списком «ВыборКлиента»

Private Sub ВыборКлиента_AfterUpdate()

' Возвращает записи, соответствующие значению,

' выбранному в поле со списком "ВыборКлиента".

If Len(Me!ВыборКлиента.Column(1)) = 0 Then

DoCmd.ShowAllRecords

Else

DoCmd.ApplyFilter , "КодКлиента = Forms!ДобавлениеВсеВСписок!ВыборКлиента"

End If

End Sub


Форма «Введение»

Форма «Введение» демонстрирует создание формы, вывод которой пользователи могут отключить, когда она станет ненужной. Работу формы «Введение» обеспечивает следующий прием:

•	создание формы, допускающей отключение пользователями.


Создание формы, допускающей отключение пользователями

Форма, содержащая вводные сведения о приложении, выводится при запуске приложения. Ознакомившись с этими сведениями, пользователи могут отключить вывод такой формы. Например, при запуске приложения «Решения» сразу после формы «Заставка» и перед главной формой «КаталогПримеров» открывается форма «Введение». Чтобы отключить вывод этой формы в дальнейшем, достаточно установить в ее нижней части соответствующий флажок.

Задачи

Создание специального свойства базы данных, указывающего, следует ли выводить форму на экран. Создание формы, включающей следующие элементы управления: надписи, содержащие сведения об использовании приложения, свободный флажок и кнопку, закрывающую форму. Создание главной формы. Определение в свойстве кнопки Нажатие кнопки (OnClick) процедуры обработки события, которая задает для специального свойства значение False, если флажок установлен. Определение для свойства формы Загрузка (OnLoad) процедуры обработки события, которая закрывает данную форму и открывает главную форму, если специальное свойство имеет значение False.

Используемый объект

Объект	Имя
Форма	КаталогПримеров, Введение
Действия

1	Создание специального свойства базы данных «ВыводФормыВведение».

а)	Откройте базу данных и выберите в меню Файл команду Свойства базы данных.

б)	Выберите вкладку Прочие.

в)	В поле Название введите ВыводФормыВведение.

г)	В поле Тип введите Да или Нет.

д)	В поле Значение введите Да.

2	Создание формы «Введение».

а)	Задайте следующие значения для свойств формы.

Свойство	Значение
Подпись (Caption)	Введение
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Форма
Разрешить изменение (AllowEdits)	Да
Разрешить удаление (AllowDeletions)	Да
Разрешить добавление (AllowAdditions)	Нет
Ввод данных (DataEntry)	Нет
Полосы прокрутки (ScrollBars)	Отсутствуют
Область выделения (RecordSelectors)	Нет
Поле номера записи (NavigationButtons)	Нет
Выравнивание по центру (AutoCenter)	Да
Тип границы (BorderStyle)	Тонкая
Кнопки размеров окна (MinMaxButtons)	Отсутствуют
Кнопка закрытия (CloseButton)	Да
Загрузка (OnLoad)	[Процедура обработки событий]
б)	Создайте надписи, поясняющие работу приложения.

в)	Создайте флажок. В качестве значения свойства Подпись (Caption) присоединенной к нему надписи введите:

Больше не открывать эту форму.

Определите следующие свойства флажка.

Свойство	Значение
Имя (Name)	СкрытьВведение
Текст строки состояния (StatusBarText)	Отменяет вывод формы.
г)	Создайте кнопку и определите следующие свойства.

Свойство	Значение
Имя (Name)	OK
Подпись (Caption)	OK
По умолчанию (Default)	Да
Всплывающая подсказка (ControlTipText)	Закрывает форму.
Нажатие кнопки (OnClick)	[Процедура обработки событий]
3	Создание формы «КаталогПримеров».

Литература

Дополнительные сведения приведены в книге Разработка приложений Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Процедура обработки события «Загрузка» (Load) формы «Введение»

В случае, когда база данных является репликой, для отмены вывода формы «Введение» на экран процедура обработки события From_Load использует процедуру IsItAReplica. Это необходимо, так как данная форма позволяет пользователю вносить изменения в специальное свойство базы данных, которые вызовут возникновение ошибки в реплике. Приведенный ниже текст процедуры IsItAReplica также содержится в стандартном модуле «СлужебныеПрограммы» базы данных «Решения».

Private Sub Form_Load()

' Проверяет специальное свойство базы данных для определения того,

' должна ли форма выводиться на экран. Форма не выводится в случае,

' когда специальное свойство базы данных ВыводФормыВведение

' отключено, или если она является репликой базы данных.

Dim dbs As Database

Dim doc As Document

Set dbs = CurrentDb

Set doc = dbs.Containers("Databases")!UserDefined

' Продолжает работу при возникновении ошибки.

On Error Resume Next

If IsItAReplica(dbs) = True Then

' Не показывать данную форму.

DoCmd.Close

Exit Sub

Else

' Проверяет специальное свойство базы данных 'ВыводФормыВведение'.

' Если оно установлено, снимает флажок СкрытьВведение, иначе

' устанавливает его.

If doc.Properties!ВыводФормыВведение = False Then

СкрытьВведение = True

Else

СкрытьВведение = False

End If

' Если база данных доступна только для чтения,

' отключает флажок "СкрытьВведение".

If dbs.Updatable = False Then

СкрытьВведение.Enabled = False

End If

End If

End Sub

Function IsItAReplica(dbs As Database) As Boolean

On Error Resume Next

If dbs.Properties("Реплицируемая") = "T" Then

If Err = 3270 Then

' Это не реплика. Разрешает вывод формы.

IsItAReplica = False

Else

' База данных является основной или репликой.

' Запрещает вывод формы.

IsItAReplica = True

End If

End If

End Function


Процедура обработки события «Нажатие кнопки» (Click) кнопки «OK»

Private Sub OK_Click()

' Открывает форму "КаталогПримеров" и закрывает данную форму.

Dim dbs As Database

Dim doc As Document

On Error GoTo Err_OK_Click

Set dbs = CurrentDb

Set doc = dbs.Containers("Databases")!UserDefined

If СкрытьВведение = True Then

' Если пользователь установил флажок, задает для специального

' свойства базы данных ВыводФормыВведение значение False.

doc.Properties!ВыводФормыВведение = False

Else

' В противном случае задает для специального свойства базы

' данных ВыводФормыВведение значение True.

doc.Properties!ВыводФормыВведение = True

End If

' Закрывает данную форму и открывает форму "КаталогПримеров".

DoCmd.Close acForm, "Введение"

DoCmd.OpenForm "КаталогПримеров"

Exit_OK_Click:

Exit Sub

Err_OK_Click:

MsgBox Err.Description

CloseCurrentDatabase

Resume Exit_OK_Click

End Sub


Отчет «СтатистикаПродаж»

В отчете «Статистика продаж» демонстрируется представление нескольких факторов в каждой строке перекрестного отчета. Работу отчета «Статистика продаж» обеспечивают следующие приемы:

•	создание многофакторного перекрестного отчета.


Создание многофакторного перекрестного отчета

Перекрестные отчеты позволяют отображать для каждого заголовка строки несколько факторов. Например, в отчете «СтатистикаПродаж» выводятся минимальное, среднее и максимальное значения доходов для каждого сотрудника.

Задачи

Создание отчета из нескольких столбцов с перекрестным макетом, в котором в качестве источника записей используется запрос на выборку. Создание свободного поля в заголовке группы «Фамилия», которое используется для определения печатающейся строки. Создание в свойстве Форматирование (OnFormat) заголовка группы «Фамилия» процедуры обработки события, в которой для печати заголовков строк в двух столбцах используется свойство NextRecord. Создание в свойстве Форматирование (OnFormat) заголовка группы «ДатаИсполнения» процедуры обработки события, проверяющей с помощью функции Month и свойства От левого края (Left) дату, печатающуюся в каждом столбце. При отсутствии даты использование свойства NextRecord для отмены перехода на следующую запись и использование свойства PrintSection для отмены печати следующего раздела.

Используемые объекты

Объект	Имя
Таблица	Сотрудники, Заказы
Запрос	СуммыЗаказов, СтатистикаПродаж
Отчет	СтатистикаПродаж
Действия

1	Импорт отчета «СуммыЗаказов» из базы данных «Борей», если это не было сделано ранее.

2	Создание запроса «СтатистикаПродаж».

a)	Используйте поля из следующих таблиц и запросов.

Таблица/Запрос	Поле/Выражение	Групповая операция
Таблица «Сотрудники»	Фамилия Имя	Группировка Группировка
Таблица «Заказы»	КодЗаказа ДатаИсполнения ГодУсреднения: Year([ДатаИсполнения])	Группировка Группировка Группировка
Запрос «СуммыЗаказов»	СуммаЗаказа	Группировка
б)	В ячейку строки «Условие отбора» поля «ГодУсреднения» введите выражение «1995».

3	Создание отчета «СтатистикаПродаж».

a)	В окне диалога Сортировка и группировка определите следующие свойства.

Поле/Выражение	Порядок сортировки	Свойства группы
Фамилия	По возрастанию	Заголовок группы (GroupHeader): Да Примечание группы (GroupFooter): Да Группировка (GroupOn): По каждому значению Интервал (GroupInterval): 1 Не разрывать (KeepTogether): Нет
ДатаИсполнения	По возрастанию	Заголовок группы (GroupHeader): Да Примечание группы (GroupFooter): Да Группировка (GroupOn): По каждому значению Интервал (GroupInterval): 1 Не разрывать (KeepTogether): Нет
б)	Для свойства отчета Ширина (Width) задайте значение 24,841см.

в)	В окне диалога Параметры страницы задайте следующие значения параметров.

Вкладка	Параметр	Значение
Вкладка	Ориентация	Альбомная
Поля	Поля	Слева: 10,15мм Справа: 10,15мм Сверху: 25,4мм Снизу: 25,4мм
Столбцы	Параметры сетки	Число столбцов: 14 Интервал: 0,25см
	Размер столбца	Ширина: 1,5см Высота: 0см
	Макет столбца	Сверху вниз, Слева направо
г)	Вставьте в верхний колонтитул надписи для денежной единицы и названий месяцев.

д)	В заголовке группы «Фамилия» создайте следующие поля, одно под другим.

Имя (Name)	Данные (ControlSource)
ФамилияПродавца	=[Фамилия] & ","
Имя	Имя
е)	В заголовке группы «Фамилия» создайте следующие надписи поверх полей, созданных на шаге 3д.

Имя (Name)	Подпись (Caption)
Минимум	Минимум:
Среднее	Среднее:
Максимум	Максимум:
ж)	В заголовке группы «Фамилия» создайте поля и определите их свойства следующим образом.

Имя	Свойство
Печать	Вывод на экран (Visible): Нет
ШиринаСтолбца	Данные (ControlSource): =(0.6+0.1)*1440 Формат поля (Format): Основной Вывод на экран (Visible): Нет
ЛевоеПоле	Данные (ControlSource): =0.4*1440 Формат поля (Format): Основной Вывод на экран (Visible): Нет
з)	В заголовке группы «ДатаИсполнения» создайте следующие поля, одно под другим. Для всех трех полей задайте для свойства Формат поля (Format) значение «С разделителями разрядов», для свойства Число десятичных знаков (DecimalPlaces) значение 0, а свойство Данные (СontrolSource) определите с помощью следующих выражений.

Имя (Name)	Данные (ControlSource)
МесяцМин	=Min([СуммаЗаказа])
МесяцСреднее	=Avg([СуммаЗаказа])
МесяцМакс	=Max([СуммаЗаказа])
и)	Задайте следующие значения свойств разделов.

Раздел	Свойство	Значение
Верхний колонтитул	Форматирование (OnFormat)	[Процедура обработки событий]
Заголовок группы «Фамилия»	Не разрывать (KeepTogether) Форматирование (OnFormat)	Да [Процедура обработки событий]
Заголовок группы «ДатаИсполнения»	Не разрывать (KeepTogether) Форматирование (OnFormat)	Да [Процедура обработки событий]
Область данных	Высота (Height)	0см
Примечание группы «Фамилия»	Новая строка или столбец (NewRowOrCol) Высота (Height)	После раздела 0"
Примечание отчета	Высота (Height)	0"
Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Процедура обработки события «Форматирование» (Format) верхнего колонтитула

Private Sub PageHeader1_Format(Cancel As Integer, FormatCount As Integer)

' Вводит в начале страницы значение 0 в поле "Печать".

Me!Печать = 0

End Sub


Процедура обработки события «Форматирование» (Format) заголовка группы «Фамилия»

Private Sub GroupHeader2_Format(Cancel As Integer, FormatCount As Integer)

' Печатает данные в заголовках строк в правильном порядке.

' Печатает поля "ФамилияПродавца" и "Имя", скрывает надписи

' "Минимум", "Среднее" и "Максимум", задает для поля "Печатать"

' значение -1 и не переходит на следующую запись.

With Me

If !Печать = 0 Then

!ФамилияПродавца.Visible = True

!Имя.Visible = True

!Минимум.Visible = False

!Среднее.Visible = False

!Максимум.Visible = False

!Печать = -1

.NextRecord = False

' Скрывает поля "ФамилияПродавца" и "Имя",

' печатает надписи "Минимум", "Среднее" и "Максимум",

' задает для поля "Печатать" значение 0.

Else

!ФамилияПродавца.Visible = False

!Имя.Visible = False

!Минимум.Visible = True

!Среднее.Visible = True

!Максимум.Visible = True

!Печать = 0

End If

End With

End Sub


Процедура обработки события «Форматирование» (Format) заголовка группы «ДатаИсполнения»

Private Sub GroupHeader3_Format(Cancel As Integer, FormatCount As Integer)

' Печатает данные в правильном столбце.

' Не переходит на следующую запись или к печати следующего раздела.

If Me.Left < Me!ЛевоеПоле + (Month(Me!ДатаИсполнения) + 1) _

* Me!ШиринаСтолбца Then

Me.NextRecord = False

Me.PrintSection = False

End If

End Sub


Отчет «ТелефоныКлиентов»

Отчет «ТелефоныКлиентов» демонстрирует способ, с помощью которого отмечают названия первой и последней организации на каждой странице телефонного справочника. Работу отчета «ТелефоныКлиентов» обеспечивает следующий прием:

•	печать первого и последнего вхождения на странице в верхнем колонтитуле.


Печать первого и последнего вхождения на странице в верхнем колонтитуле

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

Задачи

Создание отчета с сортировкой организаций по названиям. Создание в нижнем колонтитуле поля для нумерации страниц с использованием свойства Pages (для форматирования отчета в два прохода). Создание процедуры обработки события для свойства Форматирование (OnFormat) нижнего колонтитула, в которой на первом проходе название клиента из последней записи помещается в глобальный массив. Создание процедуры обработки события для свойства Форматирование (OnFormat) примечания отчета, в которой на первом проходе последняя запись в наборе записей помещается в массив. Создание процедуры обработки события для свойства Форматирование (OnFormat) верхнего колонтитула, в которой на втором проходе заполняются поля «ПервыйЭлемент» и «ПоследнийЭлемент».

Используемые объекты

Объект	Имя
Таблица	Клиенты
Отчет	ТелефоныКлиентов
Действия

1	Создание отчета «ТелефоныКлиентов».

а)	Задайте для свойства отчета Источник записей (RecordSource) значение «Клиенты».

б)	Добавьте в отчет заголовок и примечание. Задайте для свойства Высота (Height) обоих разделов значение 0см.

в)	В окне Сортировка и группировка выберите «Название» в столбце «Поле/выражение» и «По возрастанию» в столбце «Порядок сортировки».

г)	Создайте в области данных поля «Название», «ОбращатьсяК» и «Телефон». Вырежьте присоединенные к этим полям подписи и поместите их в верхний колонтитул.

д)	Задайте для свойства Не разрывать (KeepTogether) области данных значение «Да».

е)	Создайте в следующих разделах такие поля и удалите присоединенные к ним подписи:

Раздел	Имя (Name)	Данные (ControlSource)
Верхний колонтитул	ПервыйЭлемент	--
	ПоследнийЭлемент	--
Нижний колонтитул	НомерСтраницы	="Стр. " & Page & " из " & Pages
ж)	В разделе описаний модуля «Report_ТелефоныКлиентов» опишите переменные.

з)	Создайте процедуры обработки событий для следующих разделов.

Раздел	Свойство	Значение
Верхний колонтитул	Форматирование (OnFormat)	[Процедура обработки событий]
Нижний колонтитул	Форматирование (OnFormat)	[Процедура обработки событий]
Примечание отчета	Форматирование (OnFormat)	[Процедура обработки событий]
Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Раздел описаний модуля «Report_ТелефоныКлиентов»

Option Compare Database   ' Способ сравнения строк задается в базе данных.

Option Explicit

' Массив для последней записи на каждой странице

' и последней записи в наборе записей.

Dim gLast() As String

' Для регистрации числа проходов по отчету.

Dim gLastPage As Integer


Процедура обработки события «Форматирование» (Format) верхнего колонтитула

Private Sub PageHeader0_Format(Cancel As Integer, FormatCount As Integer)

' На втором проходе заполняет поля "ПервыйЭлемент"

' и "ПоследнийЭлемент".

If gLastPage = True Then

Reports!ТелефоныКлиентов!ПервыйЭлемент = _

Reports!ТелефоныКлиентов!Название

Reports!ТелефоныКлиентов!ПоследнийЭлемент = _

gLast(Reports!ТелефоныКлиентов.Page)

End If

End Sub


Процедура обработки события «Форматирование» (Format) нижнего колонтитула

Private Sub PageFooter2_Format(Cancel As Integer, FormatCount As Integer)

' На первом проходе увеличивает размер массива

' и вводит в массив последнюю запись на странице.

If Not gLastPage Then

ReDim Preserve gLast(Reports!ТелефоныКлиентов.Page + 1)

gLast(Reports!ТелефоныКлиентов.Page) = _

Reports!ТелефоныКлиентов!Название

End If

End Sub


Процедура обработки события «Форматирование» (Format) примечания отчета

Private Sub ReportFooter4_Format(Cancel As Integer, FormatCount As Integer)

Dim dbs As Database

Dim rst As Recordset

' Устанавливает флаг после завершения первого прохода.

gLastPage = True

' Открывает набор записей для отчета.

Set dbs = CurrentDb

Set rst = dbs.OpenRecordset("Customers")

' Переходит на последнюю запись в наборе.

rst.MoveLast

' Вводит последнюю запись в массив.

ReDim Preserve gLast(Reports!ТелефоныКлиентов.Page + 1)

gLast(Reports!ТелефоныКлиентов.Page) = rst!Название

End Sub


Создание специальной панели инструментов или строки меню

В Microsoft Access 97 предусмотрены панели команд трех видов: строки меню, панели инструментов и контекстные (всплывающие) меню.

Постоянно доступная панель команд называется строкой меню. Например, встроенная строка меню Microsoft Access 97 является совокупностью раскрывающихся меню, в том числе меню Файл, Правка, Вид, Сервис, Окно и ?. Если не создана специальная строка меню, заменяющая встроенную, в приложении пользователя используется именно она. Для замены встроенной строки меню Microsoft Access на специальную строку меню необходимо указать ее имя в свойстве StartupMenuBar. Другим способом назначения специальной строки меню форме или отчету является установка свойства Строка меню (MenuBar) данной формы или отчета. В форме «РедактированиеТоваров» учебного приложения «Решения» используется специальная строка меню «МенюРедактированиеТоваров».

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

Специальная всплывающая панель команд помогает при создании контекстных меню форм или отчетов, вызываемых нажатием правой кнопки мыши на объекте, свойство Контекстное меню (ShortcutMenuBar) которого содержит имя специального всплывающего контекстного меню. В учебном приложении «Решения» специальные контекстные меню не используются. Для получения дополнительных сведений о создании специальных контекстных меню введите «контекстные меню» в предметном указателе справки Microsoft Access.

Задачи

Создание специальных строки меню и панели инструментов, появляющихся при открытии формы. Добавление в специальные строку меню и панель инструментов встроенных элементов управления, необходимых при работе с формой. Добавление в специальные строку меню и панель инструментов специальных кнопок для запуска макросов или специальных процедур Visual Basic.

Используемые объекты

Объект	Имя
Форма	РедактированиеТоваров
Строка меню	МенюРедактированиеТоваров
Панель инструментов	ПанельРедактированиеТоваров
Макрос	Закрыть
Макрос	ВыделитьЗапись
Макрос	СправкаОПрограмме
Макрос	ПанелиИнструментов
Макрос	СервисПараметры
Модуль	ПанелиИнструментов
Действия — создание строки меню

1	Создание сроки меню «МенюРедактированиеТоваров».

а)	Подведите указатель мыши к элементу Панели инструментов из меню Вид, выберите команду Настройка и, после этого, команду Создать. В появившемся окне введите имя «МенюРедактированиеТоваров».

б)	Установите в списке Панели инструментов окна диалога Настройка флажок «МенюРедактированиеТоваров» и нажмите кнопку Свойства.

в)	В диалоговом окне Свойства панели инструментов установите для свойства Type новой панели значение Строка меню и закройте окно, нажав кнопку Закрыть.

2	Добавление в строку меню «МенюРедактированиеТоваров» элементов управления.

а)	Установите в списке Панели инструментов диалогового окна Настройка флажок «МенюРедактированиеТоваров».

б)	Выберите вкладку Команды и прокрутите список команд до конца вниз. Укажите категорию Новое меню. В списке Команды появится объект «Новое меню».

в)	Перетащите с помощью мыши объект «Новое меню» в строку меню «МенюРедактированиеТоваров».

г)	Щелкните правой кнопкой мыши команду Новое меню и в поле Имя появившегося контекстного меню введите &Файл.

д)	Повторите операции по перетаскиванию и переименованию объектов «Новое меню» до получения строки меню с пунктами «&Файл», «&Правка», «&Вид», «&Сервис» и «&?».

е)	Из списка Категории выберите Встроенные меню и прокрутите список Команды до нахождения встроенного меню Окно. Перетащите его мышкой в новую строку меню и поместите между элементами «Сервис» и «?».

3	Создание макроса «Закрыть». Для запуска макроса «Закрыть» служит одноименная кнопка.

а)	Откройте новый макрос. В поле «Макрокоманда» введите ВыполнитьКоманду, а в поле «Команда» набора аргументов – Close.

б)	Закройте макрос и сохраните его под именем «Закрыть».

4	Добавление команды «Закрыть» в меню «Файл».

а)	Щелкните элемент «Файл» строки меню «МенюРедактированиеТоваров». Появится пустое раскрывающееся меню.

б)	Перейдите на вкладку Команды окна диалога Настройка, выберите категорию Все макросы и перетащите макрос «Закрыть» в пустое раскрывающееся меню.

в)	Щелкните правой кнопкой мыши команду Закрыть и из появившегося контекстного меню выберите Только текст (Всегда).

г)	Еще раз щелкните правой кнопкой мыши команду Закрыть, выберите из появившегося контекстного меню команду Свойства и в окне свойства OnAction введите макрос «Закрыть».

5	Создание макроса «ВыделитьЗапись». Для запуска макроса «ВыделитьЗапись» служит команда Выделить запись.

а)	Откройте новый макрос. В поле «Макрокоманда» введите ВыполнитьКоманду, а в поле «Команда» набора аргументов – SelectRecord.

б)	Закройте макрос и сохраните его под именем «ВыделитьЗапись».

6	Добавление команд в специальное меню «Правка» строки меню «МенюРедактированиеТоваров».

а)	Щелкните элемент Правка строки меню «МенюРедактированиеТоваров». Появится пустое раскрывающееся меню.

б)	Перейдите на вкладку Команды окна диалога Настройка, выберите категорию Правка и перетащите при помощи мыши в раскрывающееся меню Правка команды Отменить, Вырезать, Копировать и Вставить.

в)	Выберите категорию Записи и перетащите при помощи мыши в раскрывающееся меню Правка команду Удалить запись.

г)	Выберите категорию Все макросы и перетащите при помощи мыши в раскрывающееся меню Правка макрос «ВыделитьЗапись».

д)	Щелкните правой кнопкой мыши команду Выделить запись, подведите указатель мыши к пункту Изменить рисунок кнопки появившегося контекстного меню и выберите для команды Выделить запись новый рисунок.

е)	Еще раз щелкните правой кнопкой мыши команду Выделить запись, выберите из появившегося контекстного меню команду Свойства и в окне свойства OnAction введите макрос «ВыделитьЗапись».

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

7	Повторите описанные выше действия для добавления всех пунктов в раскрывающиеся меню строки меню «МенюРедактированиеТоваров». Добавление элементов управления в меню «Окно» не требуется, так как в строке меню «МенюРедактированиеТоваров» для этого используется встроенная группа. Необходимо обратить внимание на то, что в качестве значения свойства OnAction для команды О программе из меню «?» будет использоваться макрос «СправкаОПрограмме», а для команд Панели инструментов из меню Вид и Параметры из меню «Сервис» – макросы «ПанелиИнструментов» и «СервисПараметры» соответственно.

8	Откройте форму «РедактированиеТоваров» и в окне свойств установите для свойства «Строка меню» (MenuBar) значение «МенюРедактированиеТоваров».

Действия — создание панели инструментов

1	Создание панели инструментов «ПанельРедактированиеТоваров».

•	Подведите указатель мыши к элементу Панели инструментов из меню Вид, выберите команду Настройка и, после этого, команду Создать. В появившемся окне введите имя «ПанельРедактированиеТоваров».

Примечание.   Значением по умолчанию свойства Type для панелей команд является Панель инструментов, поэтому изменения данного значения не требуется.

2	Перейдите на вкладку «Команды» окна диалога «Настройка» и выберите категорию «Вид».

•	При помощи мыши перетащите на панель инструментов «ПанельРедактированиеТоваров» команды Конструктор и Режим формы.

3	Выберите категорию «Правка» и перетащите на панель инструментов «ПанельРедактированиеТоваров» команды «Вырезать», «Копировать», «Вставить» и «Отменить».

•	Для вставки между кнопками Отменить и Вставить разделительной линии щелкните правой кнопкой мыши кнопку Отменить и в появившемся контекстном меню выберите Начать группу.

4	Создание специальной кнопки «Справка» панели инструментов.

а)	Перейдите на вкладку Команды окна диалога Настройка и выберите из списка Категории категорию Файл.

б)	При помощи мыши перетащите на панель инструментов «ПанельРедактированиеТоваров» команду Специальные из списка Команды.

в)	Щелкните правой кнопкой мыши кнопку Специальные и в поле Имя появившегося контекстного меню введите Справка.

г)	Щелкните правой кнопкой мыши кнопку Справка, выберите из появившегося контекстного меню команду Свойства и введите с клавиатуры текст =ShowHelpAPI(), чтобы задать для свойства OnAction значение, равное функции ShowHelpAPI из модуля «ПанелиИнструментов».

5	Откройте форму «РедактированиеТоваров» и в окне свойств установите для ее свойства «Панель инструментов» (Toolbar) значение «ПанельРедактированиеТоваров».


Форма «Помощник»

Форма «Помощник» демонстрирует способы использования свойств и методов объекта Assistant для управления помощником. Элементы управления, относящиеся к свойствам, анимации и управлению объектом Balloon помощника, размещены на различных вкладках набора.

Примечание.   Для получения возможности изменения свойств и методов объекта Assistant из программы Visual Basic необходимо сначала создать ссылку на библиотеку объектов Microsoft Office 8.0.

Работу формы «Помощник» обеспечивают следующие приемы:

•	определение свойств помощника;

•	анимация помощника;.

•	использование в помощнике объекта Balloon.


Определение свойств помощника

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

Задачи

Создание свободной формы, содержащей свойства объекта Assistant. Добавление в форму набора вкладок, состоящего из трех вкладок. Задание для свойства Подпись (Caption) первой вкладки этого набора значения «Свойства». Добавление на вкладку «Свойства» одного поля и пяти флажков. Добавление в процедуру обработки события Открытие (Open) текста программы, устанавливающего флажки в соответствии со значениями свойств помощника. Добавление в процедуру обработки события После обновления (AfterUpdate) каждого флажка текста программы, изменяющего значение соответствующего свойства помощника.

Используемый объект

Объект	Имя
Форма	Помощник
Действия

1	Создание формы «Помощник». Установите значения свойств формы следующим образом.

Свойство	Значение
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Форма
Полосы прокрутки (ScrollBars)	Отсутствуют
Область выделения (RecordSelectors)	Нет
Поле номера записи (NavigationButtons)	Нет
Выравнивание по центру (AutoCenter)	Да
Тип границы (BorderStyle)	Окно диалога
Контекстные меню (ShortcutMenu)	Нет
Открытие (OnOpen)	[Процедура обработки событий]
2	Добавление в форму «Помощник» набора вкладок «Вкладка0». Набор вкладок должен состоять из трех вкладок: «Свойства», «Анимации» и «Сообщение».

3	Добавление на вкладку «Свойства» следующих элементов управления и установка для каждого из них свойства «Дополнительные сведения» (Tag) следующим образом.

Имя элемента управления	Свойство «Дополнительные сведения» (Tag)
txtFilename	Filename
флажокАнимация	Animation
флажокЗвук	Sounds
флажокМалоеОкно	SmallWindow
флажокВидимый	Visible
флажокЗакрытие	MoveWhenInTheWay
Процедура обработки события формы «Помощник» Открытие (Open) для распознания каждого из элементов управления и соответствующего свойства использует свойство Дополнительные сведения (Tag) каждого из них.

4	Добавление текста процедуры обработки события «После обновления» (AfterUpdate) для каждого флажка для задания в качестве соответствующего свойства помощника его значения.

5	Добавление в раздел описания модуля класса «Form_Помощник» общей переменной gAsstVisible. Данная переменная служит для хранения значения свойства Вывод на экран (Visible) объекта Assistant во время выполнения процедуры обработки события Открытие (Open) и позволяет восстановить это значение в процедуре обработки события Выгрузка (Unload) формы.

6	Создание для формы процедуры обработки события «Открытие» (Open). Данная процедура для определения созданных на шаге 3 значений свойства Дополнительные сведения (Tag) проверяет все элементы управления семейства Controls вкладки «Свойства».


Процедура обработки события «Открытие» (Open) помощника

Private Sub Form_Open(Cancel As Integer)

Dim ctlPage As Control, ctl As Control

Set ctlPage = TabCtl0.Pages("Свойства")

' Устанавливает флажки на вкладке 'Свойства' в соответствии

' с текущими значениями свойств объекта Assistant.

For Each ctl In ctlPage.Controls

Select Case ctl.Tag

Case "Filename"

ctl.Value = Assistant.Item

Case "Animation"

ctl.Value = Assistant.Animation

Case "Sounds"

ctl.Value = Assistant.Sounds

Case "SmallWindow"

ctl.Value = Assistant.Reduced

Case "Visible"

ctl.Value = Assistant.Visible

Case "MoveWhenInTheWay"

ctl.Value = Assistant.MoveWhenInTheWay

End Select

Next ctl

' Сохраняет значение свойства Visible объекта Assistant.

gAsstVisible = Assistant.Visible

End Sub


Процедуры обработки событий «После обновления» (AfterUpdate) флажков на вкладке свойств помощника

Private Sub флажокАнимация_AfterUpdate()

' Использует значение флажка для включения или отключения

' элементов управления на вкладке «Анимации».

Me!Вкладка0.Pages("Анимации").Enabled = флажокАнимация.Value

End Sub

Private Sub флажокЗакрытие_AfterUpdate()

' Использует значение флажка для задания свойства MoveWhenInTheWay.

Assistant.MoveWhenInTheWay = Me!флажокЗакрытие.Value

End Sub

Private Sub флажокМалоеОкно_AfterUpdate()

' Использует значение флажка для задания свойства Reduced.

Assistant.Reduced = Me!флажокМалоеОкно.Value

End Sub

Private Sub флажокЗвук_AfterUpdate()

' Использует значение флажка для задания свойства Sounds.

Assistant.Sounds = Me!флажокЗвук.Value

End Sub

Private Sub флажокВидимый_AfterUpdate()

' Использует значение флажка для задания свойства Visible.

Assistant.Visible = Me!флажокВидимый.Value

End Sub


Анимация помощника

Для анимации помощника из программы Visual Basic необходимо задать в качестве значения свойства Animation объекта Assistant одну из констант анимации, или значение, которое эта константа представляет. Хотя все такие константы применимы ко всем помощникам, не для всех помощников определены сооветствующие им действия. Кроме того, некоторые помощники имеют несколько типов действий, соответствующих одной и той же константе.

Задачи

Создание свободной формы для вывода свойств объекта Assistant. Добавление в форму элемента управления «набор вкладок», состоящего из трех вкладок. Задание для свойства Подпись (Caption) второй вкладки значения «Анимации». Добавление на эту вкладку поля со списком. Добавление текста процедуры обработки события После обновления (AfterUpdate) поля со списком для оживления помощника способом, выбранным в этом поле. Добавление таблицы, содержащей описание каждого движения и значение соответствующей константы.

Используемые объекты

Объект	Имя
Форма	Помощник
Таблица	Анимации
Запрос	СортировкаАнимаций
Действия

1	Создайте форму «Помощник», как описано в разделе Определение свойств помощника.

2	Добавьте в форму «Помощник» элемент управления набор вкладок «Вкладка0». Этот набор вкладок должен содержать три вкладки: «Свойства», «Анимации» и «Сообщение».

3	Создайте таблицу «Анимации». В приложении «Решения» для создания таблицы «Анимации» использовались сведения из окна просмотра объектов. Для просмотра доступных движений необходимо открыть окно просмотра объектов и в поле Проект/библиотека выбрать Office. После этого ввести msoAnimationType в поле Образец поиска и нажать кнопку Поиск на панели инструментов. На правой нижней панели будут выведены члены класса msoAnimationType. Таблица «Анимации» состоит из полей «Описание» и «КодАнимации». Поле «Описание» содержит имена констант анимации без приставки «msoAnimation», а поле «КодАнимации» содержит их значения.

4	На основе следующих полей таблицы «Анимации» создайте запрос «СортировкаАнимаций».

Поле	Порядок сортировки
КодАнимации	—
Описание	По возрастанию
5	Добавьте на вкладку «Анимации» поле со списком и установите следующие значения для его свойств.

Свойство	Значение
Имя (Name)	ВыборАнимации
Тип источника строк (RowSourceType)	Таблица/запрос
Источник строк (RowSource)	СортировкаАнимаций
Число столбцов (ColumnCount)	2
Ширина столбцов (ColumnWidths)	0см;5.08см
Присоединенный столбец (BoundColumn)	1
Ограничиться списком (LimitToList)	Да
После обновления (AfterUpdate)	[Процедура обработки событий]


Процедура обработки события «После обновления» (AfterUpdate) поля со списком «ВыборАнимации»

Private Sub ВыборАнимации_AfterUpdate()

Dim ctlTab As TabControl

On Error Resume Next

' Определяет объектную переменную для набора вкладок.

Set ctlTab = Me!Вкладка0

' Делает объект Assistant видимым.

If Assistant.Visible = False Then Assistant.Visible = True

' Устанавливает флажок "Видимый" на вкладке "Свойства"

Me!флажокВидимый = True

' Вызывает анимацию объекта Assistant для значения, выбранного в поле со списком.

Assistant.Animation = Me!ВыборАнимации.Value

End Sub


Использование с помощником объекта Balloon

Объект Balloon позволяет выдавать пользователю сведения в основном также, как и при помощи функции MsgBox. Кроме того, объект Balloon позволяет получать данные от пользователя путем управления его свойствами и методами. Форма «Помощник» демонстрирует способ предоставления данных для пользователя и получения сведений при помощи переключателей или флажков.

Задачи

Создание свободной формы для вывода свойств объекта Assistant. Добавление в форму набора вкладок, содержащего три вкладки. Задание для свойства Подпись (Caption) третьей вкладки значения «Сообщение». Помещение указанных элементов управления на вкладку «Сообщение». Добавление текста процедуры обработки события Нажатие кнопки (Click) кнопки «ВывестиСообщение» для создания и вывода на экран объекта Balloon, позволяющего вести диалог с пользователем.

Используемый объект

Объект	Имя
Форма	Помощник
Действия

1	Создайте форму «Помощник», как описано в разделе Определение свойств помощника.

2	Добавьте в форму «Помощник» элемент управления набор вкладок «Вкладка0». Этот набор вкладок должен содержать три вкладки: «Свойства», «Анимации» и «Сообщение».

3	Добавьте на вкладку «Сообщение» следующие поля и установите свойство «Значение по умолчанию» (DefaultValue) каждого из них следующим образом.

Элемент управления	Свойство «Значение по умолчанию» (DefaultValue)
текстЗаголовок	«Ваш возраст?»
текстПараметр1	«До 30»
текстПараметр2	«До 40»
текстПараметр3	«За 40»
текстПараметр4	«Секрет!»
4	Добавьте на вкладку «Сообщение» следующие элементы управления и задайте свойство «Имя» (Name) и текст надписи для каждого из них следующим образом.

Тип элемента управления	Свойство «Имя» (Name)	Текст надписи
Группа	СтильПараметров	Стиль:
Переключатель	пркНадписи	Переключатели
Переключатель	пркФлажки	Флажки
5	Добавьте на вкладку «Сообщение» следующие кнопки и установите их свойства следующим образом.

Свойство	Значение
Имя (Name)	ВывестиСообщение
Подпись (Caption)	Вывести сообщение
Нажатие кнопки (OnClick)	[Процедура обработки событий]


Процедура обработки события «Нажатие кнопки» (Click) кнопки «ВывестиСообщение»

Private Sub ВывестиСообщение_Click()

Dim objBal As Balloon, intRetval As Integer, strChoice As String

Dim blnAsstVisible As Boolean, intI As Integer

On Error GoTo ShowBalloon_Err

' Определяет объектную переменную для объекта Balloon.

Set objBal = Assistant.NewBalloon

' Сохраняет текущее значение свойства Visible объекта Assistant

' для его восстановления после завершения процедуры.

blnAsstVisible = Assistant.Visible

' Делает объект Assistant видимым.

If Assistant.Visible = False Then Assistant.Visible = True

' Проверяет тип параметров, выбранный пользователем.

Select Case Me!СтильПараметров

Case 1	' Выбраны переключатели.

With objBal

.Button = msoButtonSetNone

.Heading = Me!текстЗаголовок

.Labels(1).Text = Me!текстПараметр1

.Labels(2).Text = Me!текстПараметр2

.Labels(3).Text = Me!текстПараметр3

.Labels(4).Text = Me!текстПараметр4

.Text = "Выберите один из следующих" _

& .Labels.Count & " параметров."

' Сохраняет параметр, выбранный пользователем.

intRetval = .Show

If intRetval > 0 Then

strChoice = .Labels(intRetval).Text

Else

strChoice = ""

End If

End With

Case 2	' Выбраны флажки.

With objBal

.Button = msoButtonSetOK

.Heading = Me!текстЗаголовок

.Checkboxes(1).Text = Me!текстПараметр1

.Checkboxes(2).Text = Me!текстПараметр2

.Checkboxes(3).Text = Me!текстПараметр3

.Checkboxes(4).Text = Me!текстПараметр4

.Text = "Выберите любые из следующих " _

& .Checkboxes.Count & " параметров."

' Сохраняет параметры, выбранные пользователем.

intRetval = .Show

' Создает строку сообщения на основе

' выбранных параметров.

For intI = 1 To .Checkboxes.Count

If .Checkboxes(intI).Checked = True Then

strChoice = strChoice & .Checkboxes(intI).Text & "' и '"

End If

Next intI

' Удаляет из строки strChoice последнее "' и '".

If Len(strChoice) <> 0 Then

strChoice = Left(strChoice, Len(strChoice) - 7)

End If

End With

End Select

' Создает новый объект Balloon и отображает выбор пользователя.

Set objBal = Assistant.NewBalloon

With objBal

If intRetval > 0 Or Len(strChoice) > 0 Then

.Text = "Вы выбрали '" & strChoice & "'"

Else

.Text = "Вы не выбрали параметр!"

End If

.Show

End With

' Восстанавливает исходное значение свойства Visible объекта Assistant.

Assistant.Visible = blnAsstVisible

ShowBalloon_Bye:

Exit Sub

ShowBalloon_Err:

MsgBox Err.Description

Resume ShowBalloon_Bye

End Sub


Форма «ФормаПанельКоманд»

Форма «ФормаПанельКоманд» демонстрирует способ использования в Microsoft Access 97 свойств и методов панелей команд и элемента управления «панель команд» для создания объекта CommandBar и управления им.

Работу формы «ФормаПанельКоманд» обеспечивают следующие приемы:

•	просмотр панелей команд и элементов управления;

•	создание кнопок панели команд, вызывающих специальные процедуры Visual Basic для получения данных из таблиц.


Просмотр панелей команд и элементов управления

Вкладка «Элементы управления» формы «ФормаПанельКоманд» содержит элементы управления, позволяющие просматривать и копировать встроенные и специальные панели команд базы данных «Решения». Панели команд, стилем которых является строка меню, содержат элементы управления, раскрывающиеся для вывода на экран дополнительных элементов управления. В форме «ФормаПанельКоманд» эти дополнительные элементы управления выводятся в подчиненную форму. При щелчке записи элемента управления, соответствующий ему значок помещается в главную строку меню.

Задачи

Добавление в свободную форму набора вкладок. Задание для свойства Подпись (Caption) вкладки значения «Элементы управления». Добавление группы из трех переключателей и прочих элементов управления, представленных в следующей таблице. Добавление текста процедуры обработки события группы переключателей После обновления (AfterUpdate) для заполнения поля со списком «cmboCommandBars». Добавление текста процедуры обработки события поля со списком «ФормаПанельКоманд» После обновления (AfterUpdate) для заполнения списка «lstCmdBarControls». Соединение элемента управления подчиненной формы и скрытого поля, содержащего значение «MemberControlID» для элементов списка «lstCmdBarControls».

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

Используемые объекты

Объект	Имя
Форма	ФормаПанельКоманд
Запрос	ЗаполнениеПоляСоСписком
Запрос	ЗаполениеСписка
Запрос	QryDeleteCommandBarMembersTableData
Запрос	QryDeleteCommandBarTableData
Запрос	QryDeleteMemberControlsTableData
Таблица (скрытая)	Tbl_CommandBarMembers
Таблица (скрытая)	Tbl_CommandBars
Таблица (скрытая)	Tbl_ControlTypes
Таблица (скрытая)	Tbl_MemberControls
Модуль	ПанелиКоманд
Действия

1	Создание скрытой таблицы «tbl_ControlTypes».

•	Создайте новую таблицу, содержащую следующие поля, и назовите ее «tbl_ControlTypes».

Имя поля	Тип данных
ControlID	Счетчик
Description	Текстовый
В приложении «Решения» таблица «tbl_ControlTypes» была создана на основе данных окна просмотра объектов. Для просмотра доступных типов панелей команд откройте окно просмотра объектов и выберите в поле Проект/библиотека строку Office. После этого введите в поле Образец поиска класс msoControlType и нажмите кнопку Поиск на панели инструментов. На правой нижней панели будут выведены члены класса «msoControlType». Таблица «tbl_ControlTypes» состоит из полей «Description» и «ControlID». Поле «Description» содержит тип константы элемента управления без приставки «msoControl», а поле «ControlID» содержит их значения.

2	Создание запросов, используемых элементами управления формы «ФормаПанельКоманд».

а)	Создайте запрос «ЗаполнениеПоляСоСписком», используемый для заполнения поля со списком «cmboCommandBars» формы «ФормаПанельКоманд».

Таблица	Поле
tbl_CommandBars	CommandBarID CommandBarName CommandBarType
б)	В ячейке Условие отбора поля «CommandBarType» введите:

[Forms]![CommandBarsForm]![ctlCmdBarType]

в)	Создайте запрос «ЗаполнениеСписка» для заполнения поля со списком «lstCmdBarControls» формы «ФормаПанельКоманд».

Таблица	Поле	Порядок сортировки
tbl_CommandBarMembers	MemberControlID CommandBarID MemberControlName MemberControlType Visible ID	—   —  По возрастанию  —   —   —
г)	В ячейке Условие отбора поля «CommandBarID» введите:

[Forms]![CommandBarsForm]![cmboCommandBars]

д)	Создайте следующие запросы на удаление записей, используемые для удаления скрытых таблиц из панелей команд и элемента управления «панель команд».

Запрос	Инструкция SQL
qryDeleteCommandBarMembersTableData	DELETE tbl_CommandBarMembers.* FROM tbl_CommandBarMembers;
qryDeleteCommandBarTableData	DELETE tbl_CommandBars.* FROM tbl_CommandBars;
qryDeleteMemberControlsTableData	DELETE tbl_MemberControls.* FROM tbl_MemberControls;
3	Создание формы «ФормаПанельКоманд» и добавление в нее набора вкладок «Вкладка0», содержащего по крайней мере две вкладки.

а)	Задайте для свойства Подпись (Caption) одной из вкладок значение «Элементы управления».

б)	Добавьте на эту вкладку следующие элементы управления и задайте для свойств Имя (Name) и После обновления (AfterUpdate) следующие значения.

Элемент управления	Свойство «Имя» (Name)	Свойство После обновления» (AfterUpdate)
Группа	ctlCmdBarType	[Процедура обработки событий]
Поле со списком	cmboCommandBars	[Процедура обработки событий]
Список	lstCmdBarControls	—
в)	В группе «ctlCmdBarType» создайте следующие кнопки и задайте текст их надписей и значения свойства Значение параметра (OptionValue) следующим образом.

Переключатель	Текст надписи	Свойство «Значение параметра» (OptionValue)
Option4	Строка меню	1
Option6	Панель инструментов	0
Option8	Контекстное меню	2
Примечание.   Значения свойства Значение параметра (OptionValue) этих переключателей соответствуют значениям свойства Type для строки меню, панели инструментов и контекстных меню.

г)	Установите следующие свойства для поля со списком «cmboCommandBars» и списка «lstCmdBarControls».

Свойство	Значение
Тип источника строк (RowSourceType)	Таблица/запрос
Источник строк (RowSource)	ЗаполнениеПоляСоСписком (для «cmboCommandBars») ЗаполнениеСписка (для «lstCmdBarControls»)
д)	Добавьте на вкладку «Элементы управления» следующие кнопки.

Свойство «Имя» (Name)	Свойство «Нажатие кнопки» (OnClick)
cmdCopyCommandBar	[Процедура обработки событий]
cmdShowPopup	[Процедура обработки событий]
cmdRebuildTables	[Процедура обработки событий]
Примечание.   В форме «CommandBarsForm» для хранения сведений о панелях команд и элементах управления «панель команд» используются четыре скрытые таблицы. Для просмотра в Microsoft Access скрытых объектов установите флажки Скрытые объекты и Системные объекты на вкладке Вид диалогового окна Параметры (меню Сервис). Таблица «tbl_ControlTypes» была создана в соответствии с инструкцией шага 1. Три другие таблицы были созданы процедурой обработки события Нажатие кнопки (Click) кнопки «cmdRebuildTables». Для создания этих скрытых таблиц в другой базе данных импортируйте модуль «ПанелиКоманд» и запустите процедуру CreateTables. Чтобы использовать модуль «ПанелиКоманд» для обновления панелей команд и данных элемента управления «панель команд», необходимо также импортировать следующие запросы:

qryDeleteCommandBarMembersTableData
qryDeleteCommandBarTableData
qryDeleteMemberControlsTableData

е)	Создайте два свободных поля, назовите их «txtMemberControlID» и «txtControlType» и установите для их свойств Вывод на экран (Visible) значение «Нет». Эти поля используются функцией GetControlType для синхронизации подчиненной и главной формы.

4	Создание подчиненной формы «ФормаПанельКомандПодчиненная».

а)	Создайте подчиненную форму и установите ее свойства следующим образом.

Свойство	Значение
Источник записей (RecordSource)	tbl_MemberControls
Режим по умолчанию (DefaultView)	Таблица
Допустимые режимы (ViewsAllowed)	Таблица
б)	В модуле класса «Form_ФормаПанельКомандПодчиненная» создайте процедуру обработки события Form_Current, вызывающую функцию ShowButtonImage, которая вставляет значки элементов управления в основное меню.

в)	Создайте в форме «ФормаПанельКоманд» элемент управления «подчиненная форма» и установите его свойства следующим образом.

Свойство	Значение
Имя (Name)	ФормаПанельКомандПодчиненная
Объект-источник (SourceObject)	ФормаПанельКомандПодчиненная
Подчиненные поля (LinkChildFields)	MemberControlID
Основные поля (LinkMasterFields)	txtMemberControlID
5	Создание в модуле «ПанелиКоманд» функции «ShowButtonImage».


Процедура обработки события «Нажатие кнопки» (Click) кнопки «cmdRebuildTables»

Фактически, вся работа в данной процедуре выполняется процедурой CreateTables, показанной ниже. Процедура CreateTables (хранящаяся в модуле «ПанелиКоманд») проверяет существование всех необходимых таблиц и, если это так, заполняет их панелями команд и данными элемента управления «панель команд». В противном случае вызываются процедуры, создающие отсутствующие таблицы. Текст программы, осуществляющей эту операцию, содержится в следующих процедурах модуля «ПанелиКоманд»: MakeMemberControlsTable, MakeCommandBarMembersTable, MakeCommandBarsTable и CreateRelation.

Текст программы, заполняющей скрытые таблицы данными о панелях команд и об элементах управления «панель команд», содержится в следующих процедурах модуля «ПанелиКоманд»: FillCommandBarsTable, FillCommandBarMembersTable и FillMembersControlsTable.

Private Sub cmdRebuildTables_Click()

' Восстанавливает скрытые таблицы «tbl_CommandBars», «tbl_CommandBarMembers» и

' «tbl_MemberControls», используемые при заполнении

' элементов управления в форме.

CreateTables

' Обновляет отображаемые данные.

Me!lstCmdBarControls.Requery

' Восстанавливает выбор в группе параметра «Строка меню».

Me!ctlCmdBarType = 1

' Очищает поле со списком.

Me!cmboCommandBars = ""

Me!cmboCommandBars.Requery

End Sub

Sub CreateTables()

' Обновляет сведения о панелях команд в скрытых таблицах.

' Если таблицы отсутствуют, они создаются заново.

DoCmd.Hourglass True

Dim varReturn As Variant, intCount As Integer

' Выводит индикатор выполнения в строке состояния.

varReturn = SysCmd(acSysCmdInitMeter, "Создание таблиц...", 10)

' Если таблицы отсутствуют, они создаются заново. В противном случае выполняется запрос на удаление для очистки имеющихся данных.

If TableExists("tbl_MemberControls") = False Then

MakeMemberControlsTable

Else

CurrentDb.QueryDefs("qryDeleteMemberControlsTableData").Execute

End If

' Обновляет индикатор выполнения в строке состояния.

varReturn = SysCmd(acSysCmdUpdateMeter, intCount + 2)

' Если таблицы отсутствуют, они создаются заново. В противном случае выполняется запрос на удаление для очистки имеющихся данных.

If TableExists("tbl_CommandBarMembers") = False Then

MakeCommandBarMembersTable

Else

CurrentDb.QueryDefs("qryDeleteCommandBarMembersTableData").Execute

End If

' Обновляет индикатор выполнения.

varReturn = SysCmd(acSysCmdUpdateMeter, intCount + 4)

' Если таблицы отсутствуют, они создаются заново. В противном случае выполняется запрос на удаление для очистки имеющихся данных.

If TableExists("tbl_CommandBars") = False Then

MakeCommandBarsTable

Else

CurrentDb.QueryDefs("qryDeleteCommandBarTableData").Execute

End If

' Обновляет индикатор выполнения.

varReturn = SysCmd(acSysCmdUpdateMeter, intCount + 6)

On Error Resume Next

Dim relTemp As Relation

Set relTemp = CurrentDb.Relations("CommandBarControls")

If Err <> 0 Then

' Если связи отсутствуют, они создаются заново.

CreateRelation

End If

' Обновляет индикатор выполнения.

varReturn = SysCmd(acSysCmdClearStatus)

' Заполняет таблицы новыми данными.

FillCommandBarsTable "tbl_CommandBars"

' Переоткрывает главную форму.

DoCmd.OpenForm "ФормаПанельКоманд"

DoCmd.Hourglass False

End Sub


Процедура обработки события «Нажатие кнопки» (Click) кнопки «cmdShowPopup»

Процедура обработки события cmdShowPopup_Click() выполняет функцию ShowPopupBar для панели команд, имя которой получено из второго столбца запроса, заполняющего поле со списком «cmboCommandBars». Метод ShowPopup поля со списком используется для вывода контекстной панели команд в текущей позиции курсора. Для ее просмотра возможно указание координат x и y желаемого положения при помощи метода ShowPopup.

Private Sub cmdShowPopup_Click()

' С помощью метода ShowPopUpBar объекта CommandBars открывает

' всплывающую панель в текущей позиции указателя.

ShowPopUpBar Me!cmboCommandBars.Column(1)

End Sub

Function ShowPopUpBar(strBarName As String)

' Вызывается кнопкой "Всплывающее меню" в форме

' "ФормаПанельКоманд" для отображения всплывающей панели команд,

' выбранной пользователем.

Dim cbr As CommandBar

On Error Resume Next

Set cbr = CommandBars(strBarName)

If cbr.Type <> msoBarTypePopup Then

MsgBox "Это не всплывающая панель команд."

Exit Function

End If

cbr.ShowPopup

End Function


Процедура обработки события «Нажатие кнопки» (Click) кнопки «cmdCopyCommandBar»

Private Sub cmdCopyCommandBar_Click()

Dim strOrigCB As String, strNewCB As String, strTemp As String

If Len(Me!cmboCommandBars) <> 0 Then

' Задает исходное имя панели команд.

strOrigCB = Me!cmboCommandBars.Column(1)

' Задает новое имя панели команд.

strNewCB = InputBox("Новое имя панели команд", "Новое имя", "Новая панель " & strOrigCB)

' Если новое имя не указано или пользователь нажал кнопку "Отмена", выходим из процедуры.

If Len(strNewCB) = 0 Then Exit Sub

On Error Resume Next

' Попытка задать имя для панели команд

' и проверка на наличие ошибки.

strNewCB = CommandBars(strNewCB).NameLocal

If Err = 0 Then

MsgBox "Панель команд '" & strNewCB & "' уже существует "

Else

Err = 0

' Проверка существования исходной панели команд.

strTemp = CommandBars(strOrigCB).NameLocal

If Err = 0 Then

' Копирует панель команд.

CopyCommandBar strOrigCB, strNewCB

Else

MsgBox " Указанная панель команд '" & strOrigCB & "' не существует. Восстановите таблицу панелей команд по текущим данным."

End If

End If

End If

End Sub


Функция «ShowButtonImage», вызываемая процедурой обработки события «Current» подчиненной формы «ФормаПанельКомандПодчиненная»
Функция ShowButtonImage, вызываемая процедурой обработки события «Current» подчиненной формы «ФормаПанельКомандПодчиненная»

Function ShowButtonImage()

' Вызывается из процедуры «Текущая запись» (Current) формы

' «ФормаПанельКомандПодчиненная» для отображения рисунка,

' связанного с указанной кнопкой панели команд.

Dim cmdBar As CommandBar, cmdBarButton As CommandBarButton

Dim cmdBarButtonDest As CommandBarButton

On Error Resume Next

Set cmdBar = CommandBars("Menu Bar")

Set cmdBarButtonDest = cmdBar.Controls("<- Рисунок кнопки")

If Err <> 0 Then

' Данная ошибка возникает, если кнопка не существует.

' Кнопка добавляется.

Set cmdBarButtonDest = cmdBar.Controls.Add(msoControlButton)

Err = 0

End If

With cmdBarButtonDest

.Caption = "<- Рисунок кнопки"

.BeginGroup = True

.Style = msoButtonIconAndCaption

.TooltipText = "Рисунок, связанный с кнопкой панели инструментов"

End With

Set cmdBarButton = CommandBars.FindControl(msoControlButton, Forms!ФормаПанельКоманд!ФормаПанельКомандПодчиненная!ID)

cmdBarButton.CopyFace

If Err > 0 Then

' Для элементов управления, содержащих другие элементы,

' рисунка нет. Изменяем значение свойства Style, чтобы не

' выводить рисунок, иначе будет отображаться рисунок ранее выбранного элемента.

cmdBarButtonDest.Style = msoButtonCaption

Else

cmdBarButtonDest.Style = msoButtonIconAndCaption

cmdBarButtonDest.PasteFace

End If

End Function


Процедура обработки события «После обновления» (AfterUpdate) поля со списком «cmboCommandBars»

Следующая процедура вызывает функцию GetControlType, поставляющую данные для скрытого элемента управления, связывающего элемент управления «подчиненная форма» с данными главной формы, когда они соответствуют записям подчиненной формы «ФормаПанельКомандПодчиненная». Текст процедуры GetControlType представлен ниже.

Private Sub cmboCommandBars_AfterUpdate()

' Если элемент управления содержит имя панели команд,

' активизирует кнопку "Копировать", в противном случае отключает ее.

If Len(Me!cmboCommandBars.Text) > 0 Then

Me!cmdCopyCommandBar.Enabled = True

Else

Me!cmdCopyCommandBar.Enabled = False

End If

' Обновляет список элементов управления.

Me!lstCmdBarControls.Requery

' Определяет тип элемента управления.

GetControlType

If Me!ctlCmdBarType = 2 Then

Me!cmdShowPopup.Enabled = True

Else

Me!cmdShowPopup.Enabled = False

End If

End Sub

Function GetControlType()

' Задает значения двух скрытых элементов управления в форме

' «ФормаПанельКоманд» для синхронизации главной и подчиненной форм.

Dim lst As ListBox, txtType As TextBox

Dim txtMemberID As TextBox, frm As Form

Set frm = Me!ФормаПанельКомандПодчиненная.Form

Set lst = Me!lstCmdBarControls

Set txtType = Me!txtControlType

Set txtMemberID = Me!txtMemberControlID

' Если в списке выбран элемент, задает значения

' скрытых элементов управления.

If Len(lst) <> 0 Then

txtType = lst.Column(3)

txtMemberID = lst.Column(0)

End If

End Function


Процедура обработки события «После обновления» (AfterUpdate) группы «ctlCmdBarType»

Private Sub ctlCmdBarType_AfterUpdate()

' Обновляет поле со списком в соответствии с

' параметром, выбранным в группе.

Me!cmboCommandBars.Value = Null

txtMemberControlID = Null

cmdCopyCommandBar.Enabled = False

cmdShowPopup.Enabled = False

Me!cmboCommandBars.Requery

Me!lstCmdBarControls.Requery

End Sub


Создание кнопки панели команд, вызывающей специальные процедуры Viusal Basic

Вкладка «Добавление кнопки» формы «ФормаПанельКоманд» содержит кнопку «cmdCreateButton» и поле со списком «cmboCompanyName». Кнопка добавляет новую кнопку специальной панели команд в строку меню и устанавливает в качестве значения свойства OnAction имя процедуры, получающей данные из таблицы «Клиенты», в зависимости от элемента, выбранного в поле со списком «cmboCompanyName».

Задачи

Добавление в свободную форму набора вкладок. Задание для свойства Подпись (Caption) вкладки значения «Добавление кнопки». Добавление в форму кнопки и поля со списком. Создание процедуры обработки события Нажатие кнопки (Click) кнопки «cmdCreateButton», добавляющей специальную кнопку в строку меню. Создание процедуры, выводящей при нажатии кнопки контактные сведения о клиенте.

Используемые объекты

Объект	Имя
Форма	ФормаПанельКоманд
Таблица	Клиенты
Действия

1	Создание формы «ФормаПанельКоманд» и добавление в нее набора вкладок «Вкладка0», содержащего по крайней мере две вкладки.

а)	Задайте для свойства Подпись (Caption) одной из вкладок значение «Добавление кнопки».

б)	Добавьте на вкладку «Добавление кнопки» следующие элементы управления и задайте их свойства Имя (Name) и тексты подписей следующим образом.

Тип элемента управления	Свойство «Имя» (Name)	Текст подписи
Кнопка	cmdCreateButton	Создание кнопки панели инструментов
Поле со списком	cmboCompanyName	Компании:
2	Установка для свойства «Нажатие кнопки» (OnClick) кнопки «cmdCreateButton» значения [Процедура обработки событий] и создание процедуры обработки события «Нажатие кнопки» (Click). Данная процедура вызывает функцию CreateCustomButton в модуле класса «Form_ФормаПанельКоманд».


Процедура обработки события «Нажатие кнопки» (Click) кнопки «cmdCreateButton»

Процедура обработки события cmdCreateButton_Click() вызывает функцию CreateCustomButton, добавляющую в строку меню кнопку с подписью «Контактные сведения» и устанавливающую несколько свойств, позволяющих после нажатия кнопки вызывать функцию GetContactInfo. После создания кнопки ее повторного создания не требуется, поэтому кнопка «cmdCreateButton» выключается. Необходимо заметить, что программа в процедуре обработки события Изменение (Change) набора вкладок проверяет наличие специальной кнопки в строке меню. Если она отсутствует, кнопка «cmdCreateButton» снова включается, давая возможность снова создать ее, если необходимо.

Private Sub cmdCreateButton_Click()

' Создает специальную кнопку панели команд.

CreateCustomButton

' Переводит фокус на элемент управления cmboCompanyName.

Me!cmboCompanyName.SetFocus

' После создания кнопки отключает элемент управления.

Me!cmdCreateButton.Enabled = False

End Sub

Function CreateCustomButton() As Integer

' Добавляет кнопку панели команд в строку меню и задает в ее

' свойствах вывод подписи и запуск процедуры GetContactInfo().

Dim cmdBarMain As CommandBar, cmdBarCustomButton As CommandBarButton

Set cmdBarMain = CommandBars("Menu Bar")

' Выводит на экран главную строку меню, если она не выведена.

If cmdBarMain.Visible = False Then cmdBarMain.Visible = True

On Error Resume Next

Set cmdBarCustomButton = cmdBarMain.Controls("Контакт")

If Err <> 0 Then

' Так как специальная кнопка не существует, создает ее.

Set cmdBarCustomButton = cmdBarMain.Controls.Add(msoControlButton, , , , True)

End If

With cmdBarCustomButton

.Caption = "Контакт"

.BeginGroup = True

.OnAction = "=msgbox(GetContactInfo())"

.Style = msoButtonCaption

End With

End Function


Форма «ФормаГиперссылокРешения»

Форма «ФормаГиперссылокРешения» демонстрирует способ использования гиперссылок для перемещения к другим объектам учебного приложения «Решения». Данная форма дублирует возможности формы «КаталогПримеров» с несколькими изменениями. Во-первых, сама форма является обычной, то есть не имеет присоединенного программного модуля. Для вызова из этой формы любого события или свойства используются значения свойств. Во-вторых, данная форма использует набор вкладок, содержащий четыре вкладки, каждой из которых соответствует список, содержащий основные типы примеров. В-третьих, любое перемещение к объектам базы данных производится по гиперссылке. Гиперссылки на объекты базы данных создаются на основе маршрута, выбранного пользователем.

Работу формы «ФормаГиперссылокРешения» обеспечивают следующие приемы:

•	использование гиперссылок для просмотра объектов базы данных.


Использование гиперссылок для просмотра объектов базы данных

Применение гиперссылок в формах и таблицах позволяет переходить к объектам одной и той же или другой базы данных Microsoft Access, к документам, созданным в Microsoft Word, Microsoft Excel и Microsoft PowerPoint, а также к документам Интернета или сети интранет. Форма «ФормаГиперссылокРешения» приложения «Решения» демонстрирует способ перехода к объектам одной и той же базы данных. Перемещение между объектами базы данных Microsoft Access осуществляется при помощи адресной части данных, хранящихся в поле с типом «гиперссылка» или при помощи свойства Дополнительный адрес (HyperlinkSubAddress) кнопки, надписи или рисунка. Форма «ФормаГиперссылокРешения» устанавливает свойство Дополнительный адрес (HyperlinkSubAddress) для кнопки «cmdOK» для вывода объекта.

Задачи

Создание свободной формы для просмотра типов примеров и их разделов. Добавление в форму набора вкладок с вкладками «Общие», «Формы», «Отчеты» и «Запросы». Добавление программы процедур обработки событий Загрузка (Load) для формы и Изменение (Change) для набора вкладок для заполнения различных типов вкладок. Добавление процедуры для заполнения списка примеров. Добавление процедуры обработки события Нажатие кнопки (Click) кнопки OK для создания значения свойства Дополнительный адрес (HyperlinkSubAddress). Добавление процедуры для перемещения к объекту, указанному свойством Дополнительный адрес (HyperlinkSubAddress).

Допустимое значение свойства Дополнительный адрес (HyperlinkSubAddress) состоит из типа и имени объекта, разделенных пробелом. Например, для того, чтобы открыть таблицу «Клиенты» при помощи кнопки, можно задать в качестве значения свойства Дополнительный адрес (HyperlinkSubAddress) этой кнопки строку «Таблица «Клиенты». В форме «ФормаГиперссылокРешения» данный механизм используется для перемещения к объектам учебного приложения «Решения».

Для динамического создания свойства Дополнительный адрес (HyperlinkSubAddress) кнопки «OK» используются функции GetExampleObject и CreateHyperlink. Необходимо рассмотреть два механизма, использованных в этом примере. Во-первых, при переходе по адресу гиперссылки Microsoft Access автоматически выводит на экран панель инструментов Web. Однако в этом примере эта панель не нужна и отключается функцией GetExampleObject непосредственно перед переходом к свойству Дополнительный адрес (HyperlinkSubAddress). Во-вторых, при помещении указателя мыши на элемент управления со значением свойства Адрес гиперссылки (HyperlinkAddress) или Дополнительный адрес (HyperlinkSubAddress) он принимает вид руки с вытянутым указательным пальцем. В форме «ФормаГиперссылокРешения» это также необязательно. Чтобы избежать этого, в качестве значения свойства Дополнительный адрес (HyperlinkSubAddress) кнопки «OK» задается пустая строка сразу после использования метода Follow для перемещения к указанному объекту.

Используемые объекты

Объект	Имя
Форма	ФормаГиперссылокРешения
Запрос	СписокВкладкаОбщие
Запрос	СписокВкладкаФормы
Запрос	СписокВкладкаОтчеты
Запрос	СписокВкладкаЗапросы
Модуль	ПрограммыГиперссылок
Действия

1	Создайте запросы, используемые для заполнения списков формы «ФормаГиперссылокРешения».

Запрос	Таблица	Поле	Условие
СписокВкладкаОбщие	Темы	Тип	«Общие»
СписокВкладкаФормы	Темы	Тип	«Форма»
СписокВкладкаОтчеты	Темы	Тип	«Отчет»
СписокВкладкаЗапросы	Темы	Тип	«Запрос»
2	Создайте форму «ФормаГиперссылокРешения».

а)	Установите свойства формы следующим образом.

Свойство	Значение
Режим по умолчанию (DefaultView)	Простая форма
Тип границы (BorderStyle)	Диалоговое окно
Открытие (OnOpen)	=GetExampleList()
б)	В область данных добавьте набор вкладок «ctlTab» и в ячейку свойства Изменение (OnChange) окна свойств вкладки введите =CheckIndex().

в)	В наборе вкладок «ctlTab» создайте четыре вкладки и задайте для свойства Подпись (Caption) значения «Общие», «Формы», «Отчеты» и «Запросы».

г)	На каждой вкладке создайте свободный список. Назовите эти списки «списокОбщие», «списокФормы», «списокОтчеты», «списокЗапросы» соответственно, и установите их свойства следующим образом.

Свойство	Значение
Тип источника строк (RowSourceType)	Таблица/запрос
Источник строк (RowSource)	СписокВкладкаОбщие (для «списокОбщие») СписокВкладкаФормы (для «списокФормы») СписокВкладкаОтчеты (для «списокОтчеты») СписокВкладкаЗапросы (для «списокЗапросы»)
Нажатие кнопки (OnClick)	=GetExampleList()
д)	Добавьте в форму свободный список и установите его свойства следующим образом.

Свойство	Значение
Имя (Name)	списокПримеры
Двойное нажатие кнопки (OnDblClick)	=GetExampleObject()
е)	Добавьте в форму кнопку и установите ее свойства следующим образом.

Свойство	Значение
Имя (Name)	cmdOK
Подпись (Caption)	&OK
Нажатие кнопки (OnClick)	=GetExampleObject()
3	Создайте в модуле «ПрограммыГиперссылок» следующие функции:

•	GetExampleList;

•	CheckIndex;

•	GetExampleObject;

•	CreateHyperlink.

Примечание.   Функция CreateHyperlink вызывается функцией GetExampleObject.


Функция CreateHyperlink

Private Function CreateHyperlink(ctl As Control, strSubAddress As String)

' Задает свойство «Дополнительный адрес» (HyperlinkSubAddress)

' кнопки «OK» в форме «ФормаГиперссылокРешения». Дополнительный

' адрес отслеживается с помощью метода Follow и получает

' значение пустой строки, чтобы предотвратить изменение вида

' указателя при его попадании на кнопку «ОК».

Dim hyp As HyperLink

Select Case ctl.ControlType

Case acLabel, acImage, acCommandButton

Set hyp = ctl.HyperLink

With hyp

.Address = Null

.SubAddress = strSubAddress

.Follow True, True

.SubAddress = ""

End With

Case Else

MsgBox "Элемент управления " & ctl.Name & " не поддерживает гиперссылки."

End Select

End Function


Функция GetExampleObject

Function GetExampleObject() As Integer

' Вызывается в свойстве «Нажатие кнопки» (OnClick) кнопки «OK»

' в форме «ФормаГиперссылокРешения» для считывания данных,

' необходимых для вызова процедуры CreateHyperlink.

Dim frm As Form

Dim ctlList As ListBox, cmdOk As CommandButton

Dim objName As String, objType As String, strSubAddress As String

Set frm = Forms!SolutionsHyperForm

Set ctlList = frm!lstExamples

Set cmdOk = frm!cmdOk

If IsNull(ctlList.Column(2)) Then

MsgBox "Выберите пример из списка."

Exit Function

Else

objName = ctlList.Column(2)

objType = ctlList.Column(3)

If objType = "Окно" Then objType = "Форма"

strSubAddress = objType & " " & objName

End If

' Отключается панель инструментов «Web»; иначе она будет

' автоматически появляться при вызове метода Follow

' в процедуре CreateHyperlink.

DoCmd.ShowToolbar "Web", acToolbarNo

CreateHyperlink cmdOk, strSubAddress

End Function


Функция CheckIndex

Function CheckIndex()

' Вызывается в свойстве «Изменение» (OnChange) формы

' «ФормаГиперссылокРешения». Задает выбор первого элемента

' в списке на каждой вкладке, если отсутствует текущий выбор.

Dim ctlList As Control

Set ctlList = Screen.ActiveControl

If ctlList.Properties("ListIndex") = -1 Then

ctlList.Properties("ListIndex") = 0

End If

' Заполняет список примеров.

GetExampleList

End Function


Функция GetExampleList

Function GetExampleObject() As Integer

' Вызывается в свойстве «Нажатие кнопки» (OnClick) кнопки «OK»

' в форме «ФормаГиперссылокРешения» для считывания данных,

' необходимых для вызова процедуры CreateHyperlink.

Dim frm As Form

Dim ctlList As ListBox, cmdOk As CommandButton

Dim objName As String, objType As String, strSubAddress As String

Set frm = Forms!ФормаГиперссылокРешения

Set ctlList = frm!списокПримеры

Set cmdOk = frm!cmdOk

If IsNull(ctlList.Column(2)) Then

MsgBox "Выберите пример из списка."

Exit Function

Else

objName = ctlList.Column(2)

objType = ctlList.Column(3)

If objType = "Окно" Then objType = "Форма"

strSubAddress = objType & " " & objName

End If

' Отключается панель инструментов «Web»; иначе она будет

' автоматически появляться при вызове метода Follow

' в процедуре CreateHyperlink.

DoCmd.ShowToolbar "Web", acToolbarNo

CreateHyperlink cmdOk, strSubAddress

End Function


Форма «WebТаблицаПросмотра»

Форма «WebТаблицаПросмотра» демонстрирует способ просмотра гиперссылок, хранящихся в таблице.

Примечание.   Для вывода содержимого Web формы Microsoft Access в форме «WebТаблицаПросмотра» используется элемент управления средства просмотра Web, устанавливаемый на компьютере вместе с Microsoft Internet Explorer 3.0 или более поздней версией. Если подходящая версия Internet Explorer не установлена, запуск формы «WebТаблицаПросмотра» будет невозможен.

Кроме того, при открытии формы «WebТаблицаПросмотра» осуществляется попытка соединения с Интернет через поставщика услуг Интернет. Установка связи может занять несколько минут.

Работу формы «WebТаблицаПросмотра» обеспечивает следующий прием:

•	просмотр гиперссылок, хранящихся в таблицах.


Просмотр гиперссылок, хранящихся в таблицах

Форма «WebТаблицаПросмотра» демонстрирует способ просмотра гиперссылок, хранящихся в таблице, с помощью элемента средства просмотра Web формы Microsoft Access . В учебном приложении «Решения» гиперссылки хранятся в таблице «Связи». Для добавления в запись этой таблицы новых гиперссылок необходимо выбрать из меню Вставка команду Гиперссылка или ввести ее непосредственно в таблицу. Для сохранения введенных гиперссылок в таблице «Связи» служит кнопка «Сохранение ссылки» в форме «WebСредствоПросмотра».

Задачи

Создание формы и установка в качестве значения ее свойства Источник строк (RecordSource) таблицы «Связи». Добавить в заголовок формы поле, присоединенное к полям «Описание» и «Гиперссылка» этой таблицы. В область данных формы добавить элемент управления средство просмотра Web. Добавить текст программы в процедуру обработки события Текущая запись (Current) для перехода к объекту назначения гиперссылки в поле «Гиперссылка» текущей записи.

Используемые объекты

Объект	Имя
Форма	WebТаблицаПросмотра
Таблицы	Связи
Действия

1	Создайте таблицу «Связи».

а)	Добавьте поле «Описание», установите для него текстовый тип данных и задайте значение 255 для его свойства Размер поля (FieldSize).

б)	Добавьте поле «Гиперссылка» и установите для него тип данных «Гиперссылка».

2	Создайте форму «WebТаблицаПросмотра».

а)	Установите ее свойства следующим образом.

Свойство	Значение
Источник строк (RecordSource)	Связи
Подпись (Caption)	Просмотр сохраненных гиперссылок
Текущая запись (OnCurrent)	[Процедура обработки событий]
Открытие (OnOpen)	[Процедура обработки событий]
б)	В области заголовка формы добавьте поля для полей «Описание» и «Гиперссылка» таблицы «Связи», перетащив их мышкой из списка полей в форму.

в)	В область данных добавьте элемент ActiveX средства просмотра Web и назовите его «ActiveXCtl1». Для вставки этого элемента выберите из меню Вставка команду Элемент ActiveX и после этого – Элемент средства просмотра Web Microsoft.

Примечание.   Если элемент средства просмотра Web не появился в списке диалогового окна Вставка элемента ActiveX, выберите из меню Сервис команду Элементы ActiveX и нажмите кнопку Подключить. Файл Shdocvw.dll должен быть расположен в каталоге Windows\System.

3	В разделе описаний модуля класса «Form_WebТаблицаПросмотра» создайте общую переменную gvarBookmark. В этой переменной будут храниться данные, используемые в случае сбоя при обнаружении неправильного адреса для перемещения на последнюю запись, содержащую правильную гиперссылку.


Процедура обработки события «Текущая запись» (Current) формы «WebТаблицаПросмотра»

Private Sub Form_Current()

' Использует метод Navigate средства просмотра Web для перехода на следующую гиперссылку.

' Функция HyperlinkPart извлекает компонент адреса в сохраненной гиперссылке.

' Если переход выполнен успешно, свойство формы Bookmark сохраняется в общей переменной.

' Эта переменная возвращает последнюю запись при неудачном переходе.

Dim varFull As Variant, varDescription As Variant

Dim HyperlinkAddress As String, HyperlinkSubAddress As String

Dim msg As String, rst As Recordset, strDisplay As String

On Error Resume Next

Set rst = Me.RecordsetClone

rst.Bookmark = Me.Bookmark

varFull = rst!Гиперссылка

If IsNull(varFull) Then GoTo Current_Err

varDescription = rst!Описание

Me!ActiveXCtl1.Navigate HyperlinkPart(varFull, acAddress)

If Err = 438 Then Exit Sub

gvarBookMark = Me.Bookmark

Current_Bye:

Exit Sub

Current_Err:

MsgBox "Неверная гиперссылка. Вы можете удалить запись '" & rst!Описание & "' из таблицы 'Связи' или указать в гиперссылке допустимый адрес."

Me.Bookmark = gvarBookMark

Exit Sub

End Sub


Процедура обработки события «Открытие» (Open) формы «WebТаблицаПросмотра»

Private Sub Form_Open(Cancel As Integer)

' Определяет гиперссылку, сохраненную в первой записи

' таблицы «Связи» и использует метод Navigate средства просмотра

' Web для перехода на эту гиперссылку

' Элемент средства просмотра Web устанавливается и

' регистрируется при установке Microsoft Internet Explorer версии 3.0 (или более поздней).

Dim dbs As Database, rst As Recordset

On Error Resume Next

Set dbs = CurrentDb

Set rst = dbs.OpenRecordset("Связи", dbOpenDynaset)

rst.MoveFirst

Me!ActiveXCtl1.Navigate HyperlinkPart(rst!Гиперссылка, acAddress)

If Err = 438 Then

' Если элемент средства просмотра Web не установлен, возникает ошибка.

MsgBox "Просмотр этой формы возможен только на компьютере, на котором установлен Microsoft Internet Explorer версии 3.0 или более позднее.", vbCritical, "Ошибка загрузки средства просмотра"

DoCmd.Close acForm, Me.Name

Exit Sub

End If

' Сохраняет закладку текущей записи в общей переменной для использования

' при необходимости, в процедуре обработки события формы "Текущая запись" (Current).

gvarBookMark = Me.Bookmark

End Sub


Форма «WebСредствоПросмотра»

Форма «WebСредствоПросмотра» демонстрирует способ просмотра World Wide Web из формы Microsoft Access.

Примечание.   В форме «WebСредствоПросмотра» для просмотра содержимого Web в форме Microsoft Access используется элемент средства просмотра Web, устанавливаемый на компьютере вместе с Microsoft Internet Explorer 3.0 или более поздней версией. Если подходящая версия Internet Explorer не установлена, запуск формы «WebСредствоПросмотра» будет невозможен.

Кроме того, при открытии формы «WebСредствоПросмотра» происходит попытка связи с Интернетом, поэтому, возможно, придется подождать несколько минут, пока связь будет установлена.

Работу формы «WebСредствоПросмотра» обеспечивают следующие приемы:

•	создание анимации для индикации передачи данных элементом управления средство просмотра Web;

•	создание диалогового окна для сбора от пользователей заказов на сохранение данных в таблице «Связи»;

•	добавление в форму «WebСредствоПросмотра» элементов управления и процедур обработки событий, позволяющих исследовать World Wide Web.


Создание анимации для отображения передачи данных элементом средства просмотра Web

Все средства просмотра Web используют некоторые визуальные эффекты для индикации занятости. Для их получения допустимо использование в форме простых средств анимации Visual Basic. В форме «WebСредствоПросмотра» для эмуляции вращения луны используются восемь рисунков и один рисунок Земли, показывающий, что элемент средства просмотра Web не занят. Процедура обработки события Таймер (Timer) помогает управлять рисунками при создании видимости движения.

Задачи

Создание формы и добавление в ее область заголовка нескольких рисунков. Добавление программы в процедуры обработки событий DownloadBegin и DownloadComplete элемента средства просмотра Web для запуска и прекращения эффекта движения. Добавление программы в процедуру обработки события Таймер (Timer) для анимации изображения.

Используемые объекты

Объект	Имя
Форма	WebСредствоПросмотра
Таблица	Связи
Действия

1	Создайте таблицу «Связи», как описано в разделе Просмотр гиперссылок, хранящихся в таблице.

2	Создайте форму «WebСредствоПросмотра».

а)	Установите ее свойства следующим образом.

Свойство	Значение
Источник записей (RecordSource)	Связи
Подпись (Caption)	Специальная форма просмотра
Таймер (OnTimer)	[Процедура обработки событий]
б)	В область заголовка формы добавьте девять рисунков, называющихся «moon1» –«moon8» и «earth1». Все девять рисунков должны находиться в одном месте, один на другом.

в)	В области заголовка формы создайте свободное поле и установите его свойства следующим образом.

Свойство	Значение
Имя (Name)	txtLinks
Значение по умолчанию (DefaultValue)	"http://www.microsoft.com"
После обновления (AfterUpdate)	[Процедура обработки событий]
г)	В область данных добавьте элемент ActiveX средства просмотра Web, как описано в разделе Просмотр гиперссылок, хранящихся в таблице.

3	В модуле класса Form_WebСредствоПросмотра создайте процедуру RotateIcons. Процедура обработки события RotateIcons устанавливает свойство формы Интервал таймера (TimerInterval) для начала и завершения анимации в зависимости от значения аргумента blnState.

4	В модуле класса Form_WebСредствоПросмотра создайте процедуры обработки событий DownloadBegin и DownloadComplete элемента средства просмотра Web. В процедуре обработки события DownloadBegin добавьте вызов процедуры RotateIcons для начала вращения. В процедуре обработки события DownloadComplete добавьте вызов процедуры RotateIcons для завершения вращения.


Процедура обработки события «Таймер» (Timer) формы «WebСредствоПросмотра»

Private Sub Form_Timer()

' Анимация значка вращающейся луны. Форма содержит 8 рисунков

' луны и один значок с рисунком Земли, который выводится по

' умолчанию. Во время работы средства просмотра процедура

' RotateIcons задает свойство TimerInterval, определяющее

' «вращение» луны.

Select Case gCurrentMoon

Case 1

Me!moon2.Visible = True

Me!moon1.Visible = False

Case 2

Me!moon3.Visible = True

Me!moon2.Visible = False

Case 3

Me!moon4.Visible = True

Me!moon3.Visible = False

Case 4

Me!moon5.Visible = True

Me!moon4.Visible = False

Case 5

Me!moon6.Visible = True

Me!moon5.Visible = False

Case 6

Me!moon7.Visible = True

Me!moon6.Visible = False

Case 7

Me!moon8.Visible = True

Me!moon7.Visible = False

Case 8

Me!moon1.Visible = True

Me!moon8.Visible = False

End Select

If gCurrentMoon < 8 Then

gCurrentMoon = gCurrentMoon + 1

Else

gCurrentMoon = 1

End If

End Sub


Процедура RotateIcons

Sub RotateIcons(blnState As Boolean)

If blnState = True Then

' Задает свойство (TimerInterval).

Me.TimerInterval = 100

' Если blnState имеет значение True, скрывает рисунок earth1

' и демонстрирует рисунки от moon1 до moon8.

Me!earth1.Visible = False

Else

' Если blnState имеет значение False, скрывает все рисунки кроме earth1.

Me!earth1.Visible = True

' Задает значение 0 для свойства TimerInterval, чтобы исключить мерцание элемента.

Me.TimerInterval = 0

End If

End Sub

Private Sub ActiveXCtl1_DownloadBegin()

' Запускает анимацию, пока элемент управления занят.

RotateIcons True

End Sub

Private Sub ActiveXCtl1_DownloadComplete()

' Останавливает анимацию.

RotateIcons False

End Sub


Создание диалогового окна для сбора заказов пользователей на сохранение данных в таблице «Связи»

При просмотре страниц World Wide Web из формы WebСредствоПросмотра кнопка «Сохранение ссылки» позволяет сохранить текущий адрес в таблице «Связи». (Для просмотра сохраненных гиперссылок используется форма «WebТаблицаПросмотра».) После нажатия кнопки «Сохранение ссылки» процедура обработки события Нажатие кнопки (Click) осуществляет в таблице «Связи» поиск текущей гиперссылки. В случае успешного поиска открывается форма «ОкноСохранениеАдресаURL», позволяющая ввести дополнительные сведения, относящиеся к сохраненной ранее гиперссылке. Нажатие кнопки «OK» в форме «ОкноСохранениеАдресаURL» сохраняет указанные данные в таблице «Связи».

Задачи

Создание свободной формы «ОкноСохранениеАдресаURL». Добавление двух полей для описания и адреса сохраняемой гиперссылки. Добавление в область заголовка формы «WebСредствоПросмотра» кнопки «Сохранение ссылки», проверяющей ранее сохраненные гиперссылки и позволяющей записать новую гиперссылку в таблицу «Связи».

Используемые объекты

Объект	Имя
Форма	ОкноСохранениеАдресаURL
Форма	WebСредствоПросмотра
Таблица	Связи
Действия

1	Создайте форму «ОкноСохранениеАдресаURL».

а)	Установите ее свойства следующим образом.

Свойство	Значение
Подпись (Caption)	Сохранение гиперссылки в таблице
Загрузка (OnLoad)	[Процедура обработки событий]
б)	В область данных добавьте поля описания и адреса и назовите их соответственно «txtSavedDescription» и «txtSavedAddress».

в)	В область данных добавьте кнопки «OK» и «Отмена» (соответственно называющиеся «cmdOK» и «cmdCancel») под полями «txtSavedDescription» и «txtSavedAddress».

2	Создайте таблицу «Связи», как описано в разделе Просмотр гиперссылок, хранящихся в таблице.

3	Создайте форму «WebСредствоПросмотра», как описано в разделе Создание анимации для индикации передачи данных элементом средства просмотра Web.

•	В области заголовка формы создайте кнопку «Сохранение ссылки» и установите ее свойства следующим образом.

Свойство	Значение
Имя (Name)	cmdSaveLocation
Подпись (Caption)	Сохранение ссылки
Нажатие кнопки (OnClick)	[Процедура обработки событий]
Процедура обработки события Нажатие кнопки (Click) кнопки «Сохранение ссылки» сохраняет сведения о гиперссылке, если пользователь нажал кнопку «OK» формы «ОкноСохранениеАдресаURL». Процедура обработки события Нажатие кнопки (Click) кнопки «OK» скрывает форму «ОкноСохранениеАдресаURL», устанавливая для ее свойства Вывод на экран (Visible) значение False. При возвращении к программе, выполнявшейся после нажатия кнопки «Сохранение ссылки», текущая гиперссылка заносится в таблицу «Связи», только если форма «ОкноСохранениеАдресаURL» остается открытой, хотя и невидимой.

4	В модуле класса Form_WebСредствоПросмотра создайте процедуру обработки события «Нажатие кнопки» (Click) кнопки «Сохранение ссылки» и функции RecordExists, используемой для определения попытки пользователя сохранить гиперссылку, уже записанную в таблице «Связи». Необходимо заметить, что процедура обработки события Нажатие кнопки (Click) использует для передачи в форму «ОкноСохранениеАдресаURL» данных о текущей гиперссылке аргумент «OpenArgs» макрокоманды. Процедура обработки события Загрузка (Load) формы «ОкноСохранениеАдресаURL» использует эти данные для заполнения двух полей. Также заметим, макрокоманда ОткрытьФорму (OpenForm) открывает форму «ОкноСохранениеАдресаURL» без аргумента «acDialog». Поэтому процедура обработки события Нажатие кнопки (Click) кнопки «Сохранение ссылки» не выполняется до нажатия пользователем кнопки «OK» или «Отмена» формы «ОкноСохранениеАдресаURL».


Процедура обработки события «Загрузка» (Load) формы «ОкноСохранениеАдресаURL»

Private Sub Form_Load()

If Len(Me.OpenArgs) > 0 Then

' Считывает данные из свойства OpenArgs.

Me!txtSavedDescription = Left(Me.OpenArgs, InStr _

(Me.OpenArgs, ";") - 1)

Me!txtSavedAddress = Mid(Me.OpenArgs, InStr _

(Me.OpenArgs, ";") + 1)

End If

End Sub


Процедура обработки события «Нажатие кнопки» (Click) кнопки «cmdSaveLocation»

Процедура обработки события Нажатие кнопки (Click) кнопки «cmdSaveLocation» вызывает функцию RecordExists (описанную ниже), определяющую попытку пользователя сохранить гиперссылку, уже записанную в таблице «Связи».

Private Sub cmdSaveLocation_Click()

' Сохраняет текущую гиперссылку в таблице «Связи».

Dim dbs As Database, rst As Recordset

Dim ctlHyper As Control, frmDialog As Form

Dim strHyperlink As String

Set dbs = CurrentDb

Set rst = dbs.OpenRecordset("Связи", dbOpenDynaset)

Set ctlHyper = Me!ActiveXCtl1

strHyperlink = "#" & ctlHyper.LocationURL & "#"

' Проверяет, была ли данная страница сохранена в таблице «Связи».

If RecordExists(rst, strHyperlink) = True Then

MsgBox "Страница уже сохранена в таблице"

DoCmd.Hourglass False

Exit Sub

End If

' Открывает форму «ОкноСохранениеАдресаURL».

DoCmd.OpenForm "ОкноСохранениеАдресаURL", acNormal, , , acEdit, _

 acDialog, ctlHyper.LocationName & ";" & ctlHyper.LocationURL

If IsLoaded("ОкноСохранениеАдресаURL") = False Then

' Пользователь нажал кнопку «Отмена» для выхода из процедуры.

DoCmd.Hourglass False

Exit Sub

End If

' Добавляет новую запись и закрывает форму «ОкноСохранениеАдресаURL».

With rst

.AddNew

!Описание = Forms!SaveURLDialog!txtSavedDescription

!Гиперссылка = strHyperlink

.Update

End With

DoCmd.Close acForm, "ОкноСохранениеАдресаURL", acSaveNo

DoCmd.Hourglass False

End Sub

Function RecordExists(rst As Recordset, strLocation As String) As Boolean

' Вызывается процедурой cmdSaveLocation_Click() для проверки

' наличия сохраняемой пользователем ссылки в таблице «Связи».

On Error Resume Next

DoCmd.Hourglass True

With rst

.MoveLast

If Err = 3021 Or .RecordCount = 0 Then

' В таблице нет записей.

RecordExists = False

Else

.MoveFirst

.FindFirst "Гиперссылка = '" & strLocation & "'"

If .NoMatch Then

' В таблице нет подходящих записей.

RecordExists = False

Else

' Подходящая запись найдена.

RecordExists = True

End If

End If

End With

DoCmd.Hourglass False

End Function


Добавление в форму «WebСредствоПросмотра» элементов управления и процедур обработки событий, позволяющих просматривать Web

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

Задачи

Создание формы «WebСредствоПросмотра» и добавление в ее область данных элемента управления средства просмотра Web. Добавление в область данных формы кнопок для перемещения вперед и назад по посещенным гиперссылкам, для обновления текущей гиперссылки и для доступа к странице поиска в Интернете. Добавление в область заголовка формы поля для вывода сведений о текущем адресе и добавление программы в процедуру обработки события После обновления (AfterUpdate) элемента управления для перехода на адрес, введенный в это поле. Эти особенности формы «WebСредствоПросмотра» и элементов управления, описанных выше, достигаются при помощи множества методов элемента управления средства просмотра Web.

Используемые объекты

Объект	Имя
Форма	WebСредствоПросмотра
Таблица	Связи
Действия

1	Создайте таблицу «Связи», как описано в разделе Просмотр гиперссылок, хранящихся в таблицах.

2	Создайте форму «WebСредствоПросмотра», как описано в разделе Создание анимации для индикации передачи данных элементом управления средства просмотра Web.

а)	Добавьте в форму заголовок и примечание. Задайте для свойства Высота (Height) раздела примечание значение 0см.

б)	В область данных добавьте элемент ActiveX средства просмотра Web, как описано в разделе Просмотр гиперссылок, хранящихся в таблице.

в)	В разделе заголовка формы добавьте шесть кнопок и установите их свойства Подпись (Caption) следующим образом.

Имя элемента управления	Свойство «Подпись» (Caption)
cmdSaveLocation	Сохранение ссылки
cmdHome	Основная страница
cmdBack	Назад
cmdForward	Вперед
cmdRefresh	Обновить
cmdSearch	Поиск
г)	Создайте процедуру обработки события Нажатие кнопки (Click) для кнопки «Сохранение ссылки» и процедуры обработки события Нажатие кнопки (Click) для всех остальных кнопок.

Примечание.   Кнопка «Сохранение ссылки» и ее процедура обработки события Нажатие кнопки (Click) описаны в разделе Создание диалогового окна для сбора от пользователей заказов на сохранение данных в таблице «Связи».

д)	В области заголовка формы создайте свободное поле «txtLinks», как описано в разделе Создание анимации для индикации передачи данных элементом средства просмотра Web.

3	В модуле класса «WebСредствоПросмотра» создайте процедуру «CheckURL», применяющуюся для включения кнопок «Назад» и «Вперед».


Процедура обработки события «После обновления» (AfterUpdate) поля «txtLinks»

Private Sub txtLinks_AfterUpdate()

On Error Resume Next

' Если пользователь ввел адрес (URL) в этот элемент,

' делается попытка перейти на этот адрес.

If Len(Me!txtLinks) > 0 Then

Me!ActiveXCtl1.Navigate Me!txtLinks

End If

End Sub


Процедура CheckURL

Sub CheckURL()

' Обеспечивает активное состояние кнопки «Назад»,

' пока пользователь не вернулся на начальный адрес URL.

If gBackFlag = True And gFirstURL <> Me!ActiveXCtl1.LocationURL Then

Me!cmdBack.Enabled = True

Else

Me!ActiveXCtl1.SetFocus

Me!cmdBack.Enabled = False

End If

End Sub


Процедура обработки события «Нажатие кнопки» (Click) кнопок заголовка формы «WebСредствоПросмотра»

Private Sub cmdHome_Click()

On Error Resume Next

' Переход на основную страницу.

Me.ActiveXCtl1.GoHome

End Sub

Private Sub cmdBack_Click()

On Error Resume Next

' Переход на предыдущий адрес URL.

Me.ActiveXCtl1.GoBack

' Вызывает процедуру, проверяющую свойство Enabled кнопки "Назад".

CheckURL

' Активизирует кнопку "Вперед".

gForwardFlag = True

Me!cmdForward.Enabled = True

End Sub

Private Sub cmdForward_Click()

On Error Resume Next

' Переход вперед.

Me.ActiveXCtl1.GoForward

End Sub

Private Sub cmdRefresh_Click()

On Error Resume Next

' Принудительная перезагрузка текущего адреса URL.

Me.ActiveXCtl1.Refresh

End Sub

Private Sub cmdSearch_Click()

On Error Resume Next

' Переход на страницу поиска.

Me.ActiveXCtl1.GoSearch

End Sub


Форма «КаталогПримеров»

Форма «КаталогПримеров» обеспечивает доступ ко всем примерам в учебном приложении «Решения». Работу формы «КаталогПримеров» обеспечивают следующие приемы:

•	связывание таблиц при запуске;

•	открытие формы или отчета из главной формы.

Кроме того, в этой форме используется следующий прием:

•	закрытие всех объектов базы данных при выходе из приложения.


Связывание таблиц при запуске

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

Задачи

Создание функций, проверяющих связи с внешними таблицами и при необходимости восстанавливающих эти связи. Создание функции RelinkTables, проводящей поиск базы данных «Борей» в папке «Samples», вложенной в папку Microsoft Access. Создание функции FindNorthwind, которая выводит на экран диалоговое окно Открытие файла базы данных для поиска базы данных «Борей», если эта база данных не найдена. Вызов функций в процедуре обработки события Form_Load формы «КаталогПримеров».

Используемые объекты

Объект	Имя
Форма	КаталогПримеров
Модуль	ОбновлениеСвязейТаблиц
Действия

1	Создание модуля «ОбновлениеСвязейТаблиц».

а)	Создание функции CheckLinks.

б)	Создание функции RelinkTables.

в)	Создание функции RefreshLinks.

г)	Добавление в раздел описаний модуля программы, позволяющей использовать диалоговое окно Открытие Microsoft Windows для поиска учебной базы данных «Борей».

д)	Создание функции FindNorthwind.

е)	Создание функции MSA_CreateFilterString.

ж)	Создание функции MSA_GetOpenFileName.

з)	Создание процедуры Sub MSAOF_to_OF.

и)	Создание процедуры Sub OF_to_MSAOF.

2	Определение свойства «Загрузка» (OnLoad) формы «КаталогПримеров» с помощью элемента [Процедура обработки событий].

Литература

Дополнительные сведения приведены в книге Разработка приложений для Microsoft Access 97.

Тема	Глава
Создание процедур обработки событий	Глава 2 «Введение в Visual Basic»


Функция Chec
Функция CheckLinks

Public Function CheckLinks() As Boolean

' Проверяет связи с базой данных «Борей»; При успехе возвращает True.

Dim dbs As Database, rst As Recordset

Set dbs = CurrentDb

' Открывает связанную таблицу для проверки сведений о подключении.

On Error Resume Next

Set rst = dbs.OpenRecordset("Товары")

' Если нет ошибки, возврат True.

If Err = 0 Then

CheckLinks = True

Else

CheckLinks = False

End If

End Function


Функция RelinkTables

Public Function RelinkTables() As Boolean

' Попытка обновления связи с базой данных «Борей».

' При успешном выполнении возвращает значение True.

Dim strAccDir As String

Dim strSearchPath As String

Dim strFileName As String

Dim intError As Integer

Dim strError As String

Const conMaxTables = 8

Const conNonExistentTable = 3011

Const conNotNorthwind = 3078

Const conNorthwindNotFound = 3024

Const conAccessDenied = 3051

Const conReadOnlyDatabase = 3027

Const conAppTitle = "Решения"

' Определяет имя каталога, в котором находится файл Msaccess.exe.

strAccDir = SysCmd(acSysCmdAccessDir)

' Задает стандартный путь к каталогу примеров.

If Dir(strAccDir & "Samples\.") = "" Then

strSearchPath = strAccDir

Else

strSearchPath = strAccDir & "Samples\"

End If

' Ищет базу данных Борей.

If (Dir(strSearchPath & "Борей.mdb") <> "") Then

strFileName = strSearchPath & "Борей.mdb"

Else

' Если база не найдена, выводится окно «Открытие».

MsgBox " Не найдены связанные таблицы в базе данных Борей. " _

& " Необходимо найти Борей для работы с приложением " _

& conAppTitle & ".", vbExclamation

strFileName = FindNorthwind(strSearchPath)

If strFileName = "" Then

strError = "Необходимо найти Борей, чтобы открыть " _

& conAppTitle & "."

GoTo Exit_Failed

End If

End If

' Фиксация связей.

If RefreshLinks(strFileName) Then

RelinkTables = True

Exit Function

End If

' При неудаче выводится сообщение об ошибке.

Select Case Err

Case conNonExistentTable, conNotNorthwind

strError = "Указан неверный файл '" & strFileName

Case Err = conNorthwindNotFound

strError = "Невозможно запустить " & conAppTitle & _

", пока не найдена база данных Борей."

Case Err = conAccessDenied

strError = "Невозможно открыть " & strFileName & _

"; файл доступен только для чтения."

Case Err = conReadOnlyDatabase

strError = " Невозможно восстановить связи таблиц. Приложение " & conAppTitle & _

" доступно только для чтения."

Case Else

strError = Err.Description

End Select

Exit_Failed:

MsgBox strError, vbCritical

RelinkTables = False

End Function


Функция RefreshLinks

Private Function RefreshLinks(strFileName As String) As Boolean

' Обновляет связи с указанной базой данных.

' При успешном выполнении возвращает True.

Dim dbs As Database

Dim tdf As TableDef

' Цикл по всем таблицам в базе данных.

Set dbs = CurrentDb

For Each tdf In dbs.TableDefs

' Если таблица имеет строку подключения, она является связанной.

If Len(tdf.Connect) > 0 Then

tdf.Connect = ";DATABASE=" & strFileName

Err = 0

On Error Resume Next

tdf.RefreshLink	' Обновляет связь.

If Err <> 0 Then

RefreshLinks = False

Exit Function

End If

End If

Next tdf

RefreshLinks = True	' Обновление связей завершено.

End Function


Раздел описаний модуля «ОбновлениеСвязейТаблиц»

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'                   ОбновлениеСвязейТаблиц                          '

'                                                              '

'      Данный модуль содержит функции, обновляющие связи с таблицами'

'      базы данных Борей, если таблицы недоступны.     '

'                                                              '

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Option Explicit	' Для использования обязательно

' предварительное объявление переменных.

Option Compare Database	' Использует порядок базы данных для сравнения строк.

Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _

"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Boolean

Declare Function GetSaveFileName Lib "comdlg32.dll" Alias _

"GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Boolean

Type MSA_OPENFILENAME

' Отбор строк, используемых в фильтрах окне диалога «Открытие».

' Для создания фильтров вызывает MSA_CreateFilterString().

' Значение по умолчанию = Все файлы, *.*

strFilter As String

' Исходный фильтр.

' Значение по умолчанию = 1

lngFilterIndex As Long

' Исходный каталог, для которого открывается диалоговое окно.

' Значение по умолчанию = текущий рабочий каталог.

strInitialDir As String

' Исходное имя файлов, выводящихся в окне диалога.

' Значение по умолчанию = "".

strInitialFile As String

strDialogTitle As String

' Стандартное расширение имени файла, если не указано пользователем.

' Значение по умолчанию = системные значения (Открыть, Сохранить).

strDefaultExtension As String

' Используемые флаги (см. список констант).

' Значение по умолчанию = отсутствие флагов.

lngFlags As Long

' Полный путь к выбранному файлу. Если пользователь указал

' несуществующий файл, по команде «Открыть» возвращается

' только текст из поля «Имя файла».

strFullPathReturned As String

' Имя выбранного файла.

strFileNameReturned As String

' Позиция в полном пути (strFullPathReturned), с которой

' начинается имя файла (strFileNameReturned).

intFileOffset As Integer

' Позиция в полном пути (strFullPathReturned), с которой

' начинается расширение имени файла.

intFileExtension As Integer

End Type

Const ALLFILES = "Все файлы"

Type OPENFILENAME

lStructSize As Long

hwndOwner As Long

hInstance As Long

lpstrFilter As String

lpstrCustomFilter As String

nMaxCustrFilter As Long

nFilterIndex As Long

lpstrFile As String

nMaxFile As Long

lpstrFileTitle As String

nMaxFileTitle As Long

lpstrInitialDir As String

lpstrTitle As String

Flags As Long

nFileOffset As Integer

nFileExtension As Integer

lpstrDefExt As String

lCustrData As Long

lpfnHook As Long

lpTemplateName As Long

End Type

Const OFN_ALLOWMULTISELECT = &H200

Const OFN_CREATEPROMPT = &H2000

Const OFN_EXPLORER = &H80000

Const OFN_FILEMUSTEXIST = &H1000

Const OFN_HIDEREADONLY = &H4

Const OFN_NOCHANGEDIR = &H8

Const OFN_NODEREFERENCELINKS = &H100000

Const OFN_NONETWORKBUTTON = &H20000

Const OFN_NOREADONLYRETURN = &H8000

Const OFN_NOVALIDATE = &H100

Const OFN_OVERWRITEPROMPT = &H2

Const OFN_PATHMUSTEXIST = &H800

Const OFN_READONLY = &H1

Const OFN_SHOWHELP = &H10


Функция FindNorthwind

Private Function FindNorthwind(strSearchPath) As String

' Открывает диалоговое окно для поиска базы данных «Борей»

' пользователем. Возвращает полный путь к файлу «Борей».

Dim msaof As MSA_OPENFILENAME

' Задает параметры диалогового окна.

msaof.strDialogTitle = "Поиск файла Борей"

msaof.strInitialDir = strSearchPath

msaof.strFilter = MSA_CreateFilterString("Базы данных", "*.mdb")

' Вызывает подпрограмму диалогового окна «Открытие».

MSA_GetOpenFileName msaof

' Возвращает путь и имя файла.

FindNorthwind = Trim(msaof.strFullPathReturned)

End Function


Функция MSA_CreateFilterString

Private Function MSA_CreateFilterString(ParamArray varFilt() As Variant) As String

' Создает из переданных аргументов строку фильтра.

' Возвращает "", если аргументы не переданы.

' Ожидается четное число аргументов (имя фильтра, расширение).

' Если передано нечетное число аргументов, добавляется "*.*"

Dim strFilter As String

Dim intRet As Integer

Dim intNum As Integer

intNum = UBound(varFilt)

If (intNum <> -1) Then

For intRet = 0 To intNum

strFilter = strFilter & varFilt(intRet) & vbNullChar

Next

If intNum Mod 2 = 0 Then

strFilter = strFilter & "*.*" & vbNullChar

End If

strFilter = strFilter & vbNullChar

Else

strFilter = ""

End If

MSA_CreateFilterString = strFilter

End Function


Функция MSA_GetOpenFilename

Private Function MSA_GetOpenFileName(msaof As MSA_OPENFILENAME) As Integer

' Открывает диалоговое окно «Открытие».

Dim of As OPENFILENAME

Dim intRet As Integer

MSAOF_to_OF msaof, of

intRet = GetOpenFileName(of)

If intRet Then

OF_to_MSAOF of, msaof

End If

MSA_GetOpenFileName = intRet

End Function


Процедура Sub MSAOF_to_OF

Private Sub MSAOF_to_OF(msaof As MSA_OPENFILENAME, of As OPENFILENAME)

' Данная процедура осуществляет преобразование данных из формата

' Microsoft Access в формат Win32.

Dim strFile As String * 512

' Инициализирует некоторые компоненты структуры.

of.hwndOwner = Application.hWndAccessApp

of.hInstance = 0

of.lpstrCustomFilter = 0

of.nMaxCustrFilter = 0

of.lpfnHook = 0

of.lpTemplateName = 0

of.lCustrData = 0

If msaof.strFilter = "" Then

of.lpstrFilter = MSA_CreateFilterString(ALLFILES)

Else

of.lpstrFilter = msaof.strFilter

End If

of.nFilterIndex = msaof.lngFilterIndex

of.lpstrFile = msaof.strInitialFile _

& String$(512 - Len(msaof.strInitialFile), 0)

of.nMaxFile = 511

of.lpstrFileTitle = String$(512, 0)

of.nMaxFileTitle = 511

of.lpstrTitle = msaof.strDialogTitle

of.lpstrInitialDir = msaof.strInitialDir

of.lpstrDefExt = msaof.strDefaultExtension

of.Flags = msaof.lngFlags

of.lStructSize = Len(of)

End Sub


Процедура Sub OF_to_MSAOF

Private Sub OF_to_MSAOF(of As OPENFILENAME, msaof As MSA_OPENFILENAME)

' Данная процедура осуществляет преобразование данных из формата Win32

' в формат Microsoft Access.

msaof.strFullPathReturned = _

Left$(of.lpstrFile, InStr(of.lpstrFile, vbNullChar) -1)

msaof.strFileNameReturned = of.lpstrFileTitle

msaof.intFileOffset = of.nFileOffset

msaof.intFileExtension = of.nFileExtension

End Sub


Процедура обработки события «Загрузка» (Load) формы «КаталогПримеров»

Private Sub Form_Load()

' Проверяет связи с таблицами в базе данных Борей.

On Error GoTo Form_Load_Error

' Проверяет доступность файла Борей.

If CheckLinks() = False Then

' Пытается обновить связи; при неудаче закрывает форму.

If RelinkTables() = False Then

DoCmd.Close acForm, "Заставка"

CloseCurrentDatabase

End If

End If

Form_Load_Exit:

Exit Sub

Form_Load_Error:

MsgBox Err.Description

CloseCurrentDatabase

Resume Form_Load_Exit

End Sub


Открытие формы или отчета из главной формы

Если в приложении имеется много форм и отчетов, удобно создать главную форму, позволяющую организовать работу в соответствие с выполняемыми задачами. Форма «КаталогПримеров» является главной формой приложения «Решения». В ней примеры группируются по темам, представляющим различные аспекты разработки приложений.

Задачи

Создание свободной формы. Создание первого списка с перечислением тем. Создание второго списка с перечислением примеров, относящихся к выбранной теме. Создание кнопки «OK», открывающей формы или отчеты, соответствующие выбранному примеру. Создание кнопки «Выход», закрывающей приложение «Решения».

Используемые объекты

Объект	Имя
Таблица	Объекты, Примеры, Темы
Запрос	СписокПримеров, СписокТем
Форма	КаталогПримеров
Действия

1	Создание запроса «СписокТем».

Таблица	Поле	Вывод на экран
Темы	КодТемы Описание ПорядокСортировки (По возрастанию)	Да Да Нет
2	Создание запроса «СписокПримеров».

а)	Используются поля из следующих таблиц.

Таблица	Поле	Вывод на экран
Примеры	Описание (По возрастанию)	Да
Объекты	ИмяОбъекта	Да
Объекты	ТипОбъекта	Да
Примеры	КодТемы	Да
б)	В строку Условие отбора для поля «КодТемы» следует ввести выражение:

[Forms]![КаталогПримеров]![ВыборТемы]

3	Создание формы «КаталогПримеров».

а)	Создайте свободную форму и определите ее свойства следующим образом.

Свойство	Значение
Подпись (Caption)	Каталог примеров
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Форма
Полосы прокрутки (ScrollBars)	Отсутствуют
Область выделения (RecordSelectors)	Нет
Поле номера записи (NavigationButtons)	Нет
Выравнивание по центру (AutoCenter)	Да
Контекстное меню (ShortcutMenu)	Нет
б)	Создайте свободный список и определите его свойства следующим образом.

Свойство	Значение
Имя (Name)	ВыборТемы
Тип источника строк (RowSourceType)	Таблица/Запрос
Источник строк (RowSource)	СписокТем
Число столбцов (ColumnCount)	2
Ширина столбцов (ColumnWidths)	0см;12,7см
Присоединенный столбец (BoundColumn)	1
Текст строки состояния (StatusBarText)	Выбор темы примеров.
После обновления (AfterUpdate)	[Процедура обработки событий]
в)	Создайте второй свободный список и определите его свойства следующим образом.

Свойство	Значение
Имя (Name)	ВыборПримера
Тип источника строк (RowSourceType)	Таблица/запрос
Источник строк (RowSource)	СписокПримеров
Число столбцов (ColumnCount)	3
Ширина столбцов (ColumnWidths)	12,7см;0см;0см
Присоединенный столбец (BoundColumn)	2
Текст строки состояния (StatusBarText)	Выбор примера.
Двойное нажатие кнопки (OnDblClick)	[Процедура обработки событий]
г)	Создайте кнопку и определите ее свойства следующим образом.

Свойство	Значение
Имя (Name)	OK
Подпись (Caption)	&OK
По умолчанию (Default)	Да
Всплывающая подсказка (ControlTipText)	Открывает форму или отчет для выбранного примера.
Нажатие кнопки (OnClick)	[Процедура обработки событий]
4	Создание функции ShowHelpAPI.

Литература

Дополнительные сведения приведены в книге Разработка приложений Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»
Работа с формами	Глава 3 «Применение форм для ввода, вывода и отбора данных»


Процедура обработки события «После обновления» (AfterUpdate) списка «ВыборТемы»

Private Sub ВыборТемы_AfterUpdate()

' Обновление списка "ВыборПримера".

Me!ВыборПримера.Requery

End Sub


Функция ShowHelpAPI

Вставьте следующий текст в раздел описаний нового модуля. Сохраните модуль под именем «ПанелиИнструментов».

Option Compare Database

Option Explicit

Declare Function WinHelp Lib "user32" Alias "WinHelpA" _

(ByVal hWnd As Long, ByVal lpHelpFile As String, _

ByVal wCommand As Long, ByVal dwData As Long) As Long

Создайте в модуле «ПанелиИнструментов» функцию ShowHelpAPI.

Function ShowHelpAPI() As Boolean

' Эта процедура используется кнопкой «Справка» на различных

' панелях команд «Решения». Функция WinHelp API обеспечивает

' вызов контекстной справки вне зависимости от текущего

' состояния объекта. Файл справки должен находиться

' в одном каталоге с файлом базы данных «Решения».

Dim lnghWnd As Long, strHelpFile As String, lngContext As Long

Dim lngRetVal As Long, obj As Object

On Error Resume Next

Const conHelpContext = &H1

Set obj = Screen.ActiveForm

If Err = 2475 Then

' Активный объект не является формой.

' Обнуляет Err и проверяет объект Report.

Err = 0

Set obj = Screen.ActiveReport

If Err = 2475 Then

' Текущий объект не является формой или отчетом.

MsgBox "Перед вызовом справки выберите форму или объект."

ShowHelpAPI = False

Exit Function

End If

End If

With obj

' Задает свойства hWnd, "Файл справки" и "Идентификатор справки" текущего объекта.

lnghWnd = .hWnd

strHelpFile = .HelpFile

lngContext = .HelpContextId

End With

lngRetVal = WinHelp(lnghWnd, strHelpFile, conHelpContext, lngContext)

ShowHelpAPI = True

End Function


Процедура обработки события «Двойное нажатие кнопки» (DblClick) списка «ВыборПримера»

Private Sub ВыборПримера_DblClick(Cancel As Integer)

' Вызывает процедуру обработки события OK_Click.

OK_Click

End Sub


Процедура обработки события «Нажатие кнопки» (Click) кнопки «OK»

Private Sub OK_Click()

' Открывает форму или отчет для выбранного примера.

' При установленном флажке кнопка «Справка» выводит на экран раздел справки приложения.

' Открывает форму выбранного примера.

If Me!ВыборПримера.Column(2) = "Форма" Then

' Используется приложением «Решения» для открытия формы и вывода

' на экран раздела подсказки.

DoCmd.OpenForm Me!ВыборПримера.Column(1)

If Me!Справка = True Then

ShowHelpAPI

End If

' Открывает отчет для выбранного примера.

ElseIf Me!ВыборПримера.Column(2) = "Отчет" Then

' Используется приложением "Решения" для открытия

' отчета и вывода на экран раздела справки приложения.

DoCmd.OpenReport Forms!КаталогПримеров!ВыборПримера.Column(1), acViewPreview

If Me!Справка = True Then

ShowHelpAPI

End If

' Используется приложением Решения для вывода на экран окна

' диалога для отчета ВыработкаСотрудников.

ElseIf Me!ВыборПримера.Column(2) = "Окно" Then

DoCmd.OpenForm "ОкноВыработкаСотрудников"

End If

End Sub


Закрытие всех объектов базы данных при выходе из приложения

При выходе из приложения пользователь имеет возможность автоматически закрыть все открытые объекты базы данных. Если в каких-либо объектах имеются несохраненные изменения, имеется возможность вывести в приложении приглашения сохранить объект или отказаться от изменений. Например, при нажатии кнопки «Выход» в форме «КаталогПримеров», приложение «Решения» пытается закрыть все открытые объекты. Если был изменен макет объекта, Microsoft Access выводит приглашение сохранить объект или отменить изменения. При нажатии пользователем кнопки «Отмена» форма «КаталогПримеров» выводит сообщение о том, что надо сохранить изменения или отказаться от изменений.

Задачи

Создание функции, закрывающей все открытые объекты. Добавление кнопки в форму. Создание процедуры обработки события Нажатие кнопки (OnClick), которая закрывает объекты базы данных всех типов, а затем закрывает базу данных.

Используемые объекты

Объект	Имя
Форма	КаталогПримеров
Модуль	СлужебныеПрограммы
Действия

1	Создание функции CloseObject в основном разделе модуля «СлужебныеПрограммы».

2	Добавление кнопки в форму «КаталогПримеров» и определение свойств кнопки.

Свойство	Значение
Имя (Name)	Выход
Подпись (Caption)	Выход
Всплывающая подсказка (ControlTipText)	Выход из приложения «Решения».
Нажатие кнопки (OnClick)	[Процедура обработки событий]
Примечание.   Процедура обработки события Нажатие кнопки (Click) кнопки «Выход» не работает, когда пользователь отказывается от изменений в модуле. Если пользователь отказывается сохранять изменения в модуле, Microsoft Access закрывает окно модуля и останавливает процедуру обработки события Нажатие кнопки (Click) кнопки «Выход». В этом случае пользователь должен закрыть базу данных самостоятельно.

Литература

Дополнительные сведения приведены в книге Разработка приложений Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»
Работа с объектами	Глава 5 «Объекты и семейства»


Функция CloseObject

Public Function CloseObject(strContainerName As String, intContainerType As Integer)

' Закрывает открытые объекты базы данных.

Dim dbs As Database, ctr As Container

Dim intX As Integer

Set dbs = CurrentDb

Set ctr = dbs.Containers(strContainerName)

For intX = 0 To ctr.Documents.Count - 1

DoCmd.Close intContainerType, ctr.Documents(intX).Name

Next intX

End Function


Процедура обработки события «Нажатие кнопки» (Click) кнопки «Выход»

Private Sub Выход_Click()

' Закрывает все открытые объекты базы данных

' и осуществляет выход из приложения.

' Включает перехват ошибок.

On Error Resume Next

CloseObject "Tables", acTable

CloseObject "Tables", acQuery

CloseObject "Forms", acForm

CloseObject "Reports", acReport

CloseObject "Scripts", acMacro

CloseObject "Modules", acModule

' Выход из приложения.

CloseCurrentDatabase

End Sub


Диалоговое окно «ОПрограмме»

Форма «ОПрограмме» демонстрирует вывод диалогового окна с названием, сведениями об авторских правах и эмблемой приложения. Работу формы «ОПрограмме» обеспечивает следующий прием:

•	создание диалогового окна «ОПрограмме».


Создание диалогового окна «ОПрограмме»

Сведения о приложении обычно выводятся в диалоговом окне, которое вызывается специальной командой меню. Диалоговое окно «ОПрограмме» вызывается командой меню Справка в форме «РедактированиеТоваров».

Задачи

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

Используемые объекты

Объект	Имя
Форма	ОПрограмме
Макрос	СправкаОПрограмме
Действия

1	Создание формы «ОПрограмме».

а)	Задайте следующие значения для свойств формы.

Свойство	Значение
Подпись (Caption)	О программе «Решения»
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Форма
Разрешить изменение (AllowEdits)	Нет
Разрешить удаление (AllowDeletions)	Нет
Разрешить добавление (AllowAdditions)	Нет
Полосы прокрутки (ScrollBars)	Отсутствуют
Область выделения (RecordSelectors)	Нет
Поле номера записи (NavigationButtons)	Нет
Выравнивание по центру (AutoCenter)	Да
Тип границы (BorderStyle)	Окно диалога
Кнопки размеров окна (MinMaxButtons)	Отсутствуют
Контекстные меню (ShortcutMenu)	Нет
б)	В области данных создайте надписи, в которых будут отображаться название приложения, номер версии и сведения об авторских правах. Кроме того, создайте свободную рамку объекта для вывода эмблемы приложения.

в)	Создайте кнопку. Задайте значения ее свойств и определите процедуру обработки Закрытие (CloseForm) события Нажатие кнопки (OnClick) следующим образом.

Свойство	Значение
Имя (Name)	OK
Подпись (Caption)	OK
Всплывающая подсказка (ControlTipText)	Закрывает диалоговое окно «ОПрограмме».
Нажатие кнопки (OnClick)	=CloseForm()
2	Создание макроса «СправкаОПрограмме», открывающего форму «ОПрограмме» со следующими аргументами макрокоманды «ОткрытьФорму» (OpenForm).

Аргумент	Значение
Имя формы Режим Режим данных Режим окна	ОПрограмме Форма Только чтение Окно диалога
3	Добавление свойства OnAction команды «ОПрограмме» с панели инструментов «МенюРедактированиеТоваров» в макрос «О программе '&Решения'» при помощи приемов, описанных в разделе Создание специальной панели инструментов и строки меню. Для получения дополнительных сведений о создании специального меню см. раздел Создание панели инструментов и меню, содержащих только команды редактирования.

Совет.   В приложении «Решения» специальная строка меню используется только в форме «РедактированиеТоваров». Поэтому форма «ОПрограмме» вызывается из меню Справка только для формы «РедактированиеТоваров», открытой в режиме формы. Если предполагается использовать специальные меню в различных компонентах создаваемого приложения, следует добавить макрос «О программе '&Решения'» в каждую панель инструментов этого приложения.

Литература

Дополнительные сведения приведены в книге Разработка приложений Microsoft Access 97.

Тема	Глава
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Процедура обработки события «Закрытие формы» (CloseForm) кнопки «OK»

Function CloseForm() As Integer

' Закрывает форму.

DoCmd.Close

End Function


Форма «Заставка»

Форма «Заставка» демонстрирует автоматическое открытие формы на несколько секунд при запуске приложения. Работу формы «Заставка» обеспечивает следующий прием:

•	создание формы «Заставка».


Создание формы «Заставка»

При запуске приложения полезно вывести на экран в течение нескольких секунд название приложения, сведения об авторских правах и эмблему. При запуске демонстрационного приложения «Решения» на экран автоматически выводится форма «Заставка».

Задачи

Создание свободной формы, в которой выводятся сведения о приложении. Создание для свойства Открытие (OnOpen) процедуры обработки события, которая задает (в миллисекундах) значение свойства формы Интервал таймера (TimerInterval). Создание для свойства Таймер (OnTimer) процедуры обработки события, которая закрывает форму. Указание имени формы «Заставка» в диалоговом окне Параметры запуска.

Используемый объект

Объект	Имя
Форма	Заставка
Действия

1	Создание формы «Заставка».

а)	Задайте следующие значения для свойств формы.

Свойство	Значение
Режим по умолчанию (DefaultView)	Простая форма
Допустимые режимы (ViewsAllowed)	Форма
Полосы прокрутки (ScrollBars)	Отсутствуют
Область выделения (RecordSelectors)	Нет
Поле номера записи (NavigationButtons)	Нет
Выравнивание по центру (AutoCenter)	Да
Тип границы (BorderStyle)	Отсутствует
Контекстные меню (ShortcutMenu)	Нет
Открытие (OnOpen)	[Процедура обработки событий]
Таймер (OnTimer)	[Процедура обработки событий]
Примечание.   Чтобы пользователи могли рассмотреть заставку, в приложении «Решения» свойство Интервал таймера (TimerInterval) получает значение 5000 миллисекунд (т.е. 5 секунд) в процедуре обработки события Открытие (OnOpen) и сбрасывается до 0 в процедуре обработки события Таймер (OnTimer).

б)	В области данных создайте надписи для названия приложения и сведений об авторских правах. Создайте также свободную рамку объекта, в которую помещается эмблема приложения.

2	Добавление в форму «ОПрограмме» кнопки.

а)	Задайте следующие значения для свойств элемента управления-кнопки.

Свойство	Значение
Имя (Name)	ЗакрытьФорму
Подпись (Caption)	&Закрыть
Вывод на экран (Visible)	Нет
Нажатие кнопки (OnClick)	[Процедура обработки событий]
3	Указание имени формы в параметре «Заставка».

а)	В окне базы данных выберите в меню Сервис команду Параметры запуска.

б)	Введите имя Заставка в поле Форма.

Литература

Дополнительные сведения приведены в книге Разработка приложений Microsoft Access 97.

Тема	Глава
Указание параметров запуска	Глава 1 «Создание приложений»
Создание процедуры обработки события	Глава 2 «Введение в Visual Basic»


Процедура обработки события «Открытие» (Open) формы «Заставка»

Private Sub Form_Open(Cancel As Integer)

If IsLoaded("КаталогПримеров") Then

' Если открыта главная форма "КаталогПримеров",

' Значит данная форма была открыта в качестве примера.

' Выводит в форму кнопку закрытия.

cmdCloseForm.Visible = True

Else

' Форма открыта в качестве приложения.

' Скрывает кнопку и задает для интервала таймера

' (TimerInterval) 5 секунд.

cmdCloseForm.Visible = False

Me.TimerInterval = 5000

End If

End Sub


Процедура обработки события «Нажатие кнопки» (Click) для кнопки «ЗакрытьФорму»

Private Sub ЗакрытьФорму_Click()

' Закрывает окно заставки.

DoCmd.Close

End Sub


Процедура обработки события «Таймер» (Timer) формы «Заставка»

Процедура обработки события Таймер (Timer) выполняется в период времени, заданный для свойства формы Интервал таймера (TimerInterval) событием Загрузка (Load). Данная процедура сначала задает для свойства Интервал таймера (TimerInterval) значение 0, запрещая таким образом возникновения события Таймер (Timer) во время загрузки формы. После этого вызывается процедура DisplayStartup для определения следующей открываемой формы.

Private Sub Form_Timer()

' Конструкция If используется для сброса значения

' свойства "Интервал таймера" (TimerInterval).

If Me.TimerInterval <> 0 Then

Me.TimerInterval = 0

End If

' Вызывает процедуру DisplayStartup для задания параметров

' специального свойства базы данных "ВыводФормыВведение".

If DisplayStartup = True Then

DoCmd.OpenForm "Введение"

Else

DoCmd.OpenForm "КаталогПримеров", , , , acNormal

End If

DoCmd.Close acForm, "Заставка"

End Sub

Для создания процедуры формы «Заставка» вставьте следующий текст в раздел описаний стандартного модуля.

Function Заставка() As Boolean

' Проверяет значение специального свойства базы данных

' "ВыводФормыВведение". При отсутствии данного свойства создает его и

' задает для него значение True.

On Error GoTo Заставка_Error

Dim dbs As Database

Dim doc As Document

Dim prp As Property

Const conPropertyNotFound = 3270

Set dbs = CurrentDb

Set doc = dbs.Containers("Базы Данных")!UserDefined

If doc.Properties!ВыводФормыВведение = False Then

' В случае отключения пользователем формы Введение

' задает функции значение False.

Заставка = False

Else

' В противном случае задает функции значение True.

Заставка = True

End If

Заставка_Exit:

Exit Function

Заставка_Error:

' При отсутствии свойства «ВыводФормыВведение» создает его.

If Err = conPropertyNotFound And CurrentDb().Updatable Then

Set prp = doc.CreateProperty("ВыводФормыВведение", dbBoolean, True)

doc.Properties.Append prp

Err = 0

Resume

Else

' Неизвестная ошибка.

MsgBox Err.Description, vbCritical

CloseCurrentDatabase

Resume Заставка_Exit

End If

End Function