Access 2007
.pdf
Далее приведен оперативный отчет о происходящем в процессе применения данного кода.
1.Нажимается кнопка ButtonOfPower.
2.Программа Access находит процедуру ButtonOf Power_Click и выполняет ее.
3.Код процедуры запускает другую процедуру, MyCodeRoutine в модуле MyModule. Этот код отображает на экране сообщение, которое вы видели раньше (см. рис. 16.3).
4.После того как процедура MyCodeRoutine завершила работу, Access выполняет оставшийся код в процедуре ButtonOf Power_Click. В данном примере в процедуре нет никаких операторов, поэтому процесс завершается в этот момент.
Вы можете вставить одну задачу в любое число процедур. Можно также вызывать процедуры, которые в свою очередь вызывают другие процедуры, также вызывающие дополнительные процедуры и т. д.
Примечание
Подобный прием можно использовать только в случае общедоступных процедур. Частные (Private) не доступны для программного кода, находящегося за пределами модуля, в котором эти процедуры хранятся. Автоматически всем процедурам назначается режим доступа Public до тех пор, пока вы не вставили слово Private перед словом Sub. Таким образом, процедура MyCodeRoutine в разд. "Написание процедуры с простейшим программным кодом" ранее в этой главе общедоступна.
Если обе процедуры, ButtonOf Power_Click и MyCodeRoutine, хранятся в одном моду-, ле, можно применить некоторую рационализацию. Не нужно включать имя модуля в имя процедуры MyCodeRoutine. Вы можете использовать приведенный далее код:
Private Sub ButtonOfPower_Click( ) MyCodeRoutine End
Sub
Теперь программа Access полагает, что процедура MyCodeRoutine должна быть в том же модуле и ищет ее в нем. В данном случае неважно, процедура MyCodeRoutine общедоступная или частная — ваш код все равно может вызывать ее.
Подсказка
Если вы хотите повторно использовать код в нескольких местах одной и той же формы (например, в ответ на нажатие разных кнопок), подумайте о создании собственной процедуры и размещении кода в ней. Если же предполагается использование одного фрагмента кода в нескольких формах, лучше поместить его в процедуру, хранящуюся в отдельном модуле.
Чтение и запись полей на форме
Как вы узнали в главе 15, самые замечательные макросы — те, которые контролируют ваши формы и элементы управления. Код VB справляется с этой задачей потрясающе легко. Вам просто нужно знать имена всех элементов управления, с которыми вы хотите работать.
Предположим, что вы разрабатываете (нечто опасное) программную процедуру, очищающую текстовое поле. Вы планируете применять ее для сбрасывания текста в поле Description (описание). Далее приведена строка кода, выполняющая эту работу:
Description = ""
551
В этой строке приведен основной оператор присваивания языка Visual Basic (строка кода, изменяющая порцию данных), и вся строка сосредоточена вокруг знака равенства (=). Когда Access выполняет эту строку кода, программа берет содержимое справа от знака равенства (в данном случае пустую строку со знаками кавычек, представляющими текст) и вставляет его во вместилище, расположенное слева от знака равенства (в данном случае поле Description). В результате содержимое поля Description стерто.
Примечание
Можно также использовать знакомые квадратные скобки, т. е. [Description] вместо Description. Скобки не обязательны, если вы не настолько самонадеянны, чтобы пренебрегать правилами именования, с которыми познакомились в разд. "Правило 1. Выбирайте подходящие имена полей" главы 2.
Если у вас есть имя текстового поля с пробелом, такое имя нужно обязательно заключать в квадратные скобки.
Конечно же, можно использовать, конкретный текстовый фрагмент: Description = "Введите сюда что-нибудь, пожалуйста"
Результат выполнения этого кода аналогичен вашему собственноручному вводу текста (за исключением того, что происходит все гораздо быстрее). Как известно, при корректировке любого поля текущая запись переводится в режим редактирования. Как только вы переходите к другой записи или закрываете форму, программа Access фиксирует изменения
исохраняет новые значения в БД.
Спомощью фиксированных значений можно решить только ограниченный круг задач.
Врезультате, когда используется фиксированное текстовое значение, вначале нужно решить, что именно вы хотите использовать. Когда вы щелкните кнопку мышью и запустите код, возможно, ваши желания изменятся. По этой причине программисты редко используют фиксированные значения в подобном случае. Вместо этого они предпочитают более сложные выражения, очень похожие на выражения Access, которые применялись в вычислениях запросов (см. разд. "Вычисляемые поля" главы 7) и условий на значения (см. разд. "Правила верификации или условия на значения" главы 4).
Стекстом можно использовать оператор слияния & для создания длинного фрагмента текста из нескольких более коротких фрагментов. Далее приведен пример, в котором берется текущее описание, и к нему в конец добавляется предложение, идентифицирующее товар по названию.
Description = Description & " This is a description for " & ProductName & "."
Если начальное значение Description равно "Enjoy delectable waves of fudge." ("Насладитесь упоительными волнами сладости."), в результате оно может стать таким "Enjoy delectable waves of fudge. This is a description for Fudge Tsunami." ("Насладитесь упоительными волнами сладости. Это описание Fudge Tsunami.").
Малоизвестная или недооцененная возможность Разбиение длинных строк кода
Если вы имеете дело с чрезмерно длинными строками кода, самое время применить символ продолжения строки языка Visual Basic, таково необычное название символа подчеркивания (_).
552
Заканчивайте любую строку пробелом и знаком подчеркивания и можете продолжить программный код сразу в следующей строке:
Description = Description & _
"This is a description for " & _ ProductName & "."
Если вы собираетесь применить этот прием, стоит задать отступ во всех строках, кроме первой, так вы сможете сразу увидеть, что это часть одного оператора кода.
Гораздо чаще в выражениях используются числовые значения или даты. Далее приведен код для кнопки IncreasePrice (повышение цены), которая повышает цену на 10% при каждом нажатии кнопки (и самое замечательное в том, что вы сможете щелкать кнопку мышью столько раз, сколько захотите):
Private Sub IncreasePrice_Click
Price = Price * 1.10
End Sub
Обзор разных операций, которые можно применять в выражениях для выполнения вычислений различных типов (например, сложения, умножения, деления и т. д.), приведен в табл. 7.1.
Примечание
Язык Visual Basic трактует поля Да/Нет как поля True/False (Истина/Ложь). Конечный результат такой же, а синтаксис немного отличается. Для задания значения поля Да/Нет используется одно из двух встроенных ключевых слов Visual Basic: True или False.
Что такое объекты
На самом деле с элементами управления можно делать гораздо больше. Вместо простого изменения их содержимого у вас есть возможность изменять их цвет, шрифт, местоположение, видимость и множество других характеристик. Для того чтобы стать волшебником, следует усвоить, что все элементы управления — программируемые объекты.
В мире программирования объект — это не что иное, как удобный способ собрать вместе некоторые связанные параметры. Поле Description — не просто одно значение, это целый объект "поле ввода", а это значит, что у него есть все виды встроенных параметров. Если понять, как действует поле ввода, можно добраться до всех остальных параметров элемента.
Примечание
Программа Access создает некоторую путаницу, потому что применяет слово объект в двух разных смыслах. На протяжении всей книги вы называли объектами БД все компоненты вашей БД (такие как таблицы, запросы и формы). Программисты пользуются словом "объект" в более строгом смысле для обозначения программной структуры, собирающей вместе связанные параметры и функциональные возможности (и в данной главе этот термин применяется именно в этом смысле).
553
Взаимодействовать с объектами можно тремя способами.
■С помощью свойств. Свойства — это порции данных, относящихся к объекту. У объекта Поле ввода есть свойство Fontsize (Размер шрифта), которое управляет размером его текста.
•С помощью методов. Методы — это действия, которые можно выполнять с помощью объекта. Например, у всех форм есть метод Requery (обновление), позволяющий повторно выполнить запрос, с помощью которого получены данные формы.
■С помощью событий. События — это сообщения, которые посылает объект, и на которые вы можете откликнуться с помощью вашего программного кода. Вы можете отреагировать на нажатие кнопки мышью, используя событие кнопки On Click (нажатие кнопки).
Вследующих разделах все три эти характеристики объекта рассматриваются более подробно.
Свойства
Свойства не должны быть для вас новостью. В конце концов, вы потратили достаточно времени на их настройку в Окне свойств, добиваясь подходящего форматирования и поведения. Но свойства предстают совсем в ином свете, когда вы получаете возможность изменять их средствами программного кода. С помощью кода свойства можно динамически изменять в ответ на различные действия (например, нажатие кнопки или редактирование текста в поле ввода). Этот подход открывает целый мир новых возможностей.
Секретный ключ к встроенным свойствам объекта — скромная точка (которую фанаты программирования называют операцией "точка"). Предположим, что вы хотите изменить цвет фона поля Description. Это можно сделать с помощью задания значения в свойстве BackColor (цвет фона) соответствующего объекта "поле ввода". Вот как это делается:
Description.BackColor = vbYellow
Вэтой строке программного кода берется объект Description и затем применяется операция "точка" для выбора его свойства BackColor. Задается значение свойства BackColor с помощью специально созданного ключевого слова vbYellow. Имя свойства в программном коде, как вы видели в случае событий, не всегда совпадает с его именем в Окне свойств.
Впрограммном коде имена свойств никогда не содержат пробелы.
Эту строку кода можно использовать в любой процедуре модуля формы до тех пор, пока у этой формы на самом деле есть элемент управления Поле, названный Description.
Примечание
Цвета в Access задаются числовыми кодами. VB упрощает жизнь для большинства широко распространенных цветов, предлагая использовать заранее определенные имена, начинающиеся с букв vb. Эти имена — рациональный способ ссылки на соответствующий числовой код цвета. За кадром vbYellow — это 65 535. (Если поискать в справке Access слово "vbYellow", можно найти полный список восьми основных цветовых констант. В примечании "Практические занятия для опытных пользователей. Получение нужного цвета" разд. "Обозначение измененной записи" далее в этой главе вы узнаете, как выбирать дополнительные цвета.)
Если не применять операцию "точка", вы будете использовать свойство но умолчанию. Для поля ввода свойство по умолчанию — Value (значение), предоставляющее содержимое
554
поля. Вот почему можно написать не содержащую операции "точка" строку, подобную приведенной далее:
Description = "Действительно чудесный товар."
Теперь, когда вы узнали, что все элементы управления на ваших формах — это объекты с целым набором полезных параметров, которые можно изменять, возникает важный вопрос: как узнать, какие свойства есть у объекта и как найти нужные вам? Несколько рекомендаций окажут необходимую помощь.
■У идентичных элементов управления одинаковые свойства. Несмотря на то, что каждое поле ввода на вашей форме представлено отдельным объектом "поле ввода", у всех объектов "поле ввода" одни и те же свойства. Очевидно, что значения свойств могут отличаться, но вы можете быть уверены в том, что если вы нашли свойство BackColor в одном поле ввода, это же свойство вы найдете и у всех остальных полей ввода.
■У похожих элементов управления похожие свойства. У них у всех есть свойство BackColor, будь то поле ввода, кнопка или скромная подпись. Даже объекты, представляющие разные части формы (например, Detail (область данных), FormHeader (заголовок формы), FormFooter (примечание формы)) содержат свойство BackColor для задания цвета их фона. Этот вид стандартизации позволяет применить знания об одном элементе управления к другому элементу.
■Свойство можно найти в Окне свойств. Имена свойств, применяемые в программном коде, обычно соответствуют именам свойств, которые вы видите в Окне свойств (в англоязычной версии программы). Существует одно отличие — у имен свойств, используемых в коде, нет пробелов, поэтому свойство Back Color (Цвет фона) в Окне свойств в программе превращается в свойство BackColor.
Рис. 16.6. Когда вводится имя объекта и затем точка, Visual Basic выводит список вариантов. Если ввести несколько букв, Visual Basic перейдет к соответствующему участку списка. Если вы увидели нужное свойство, его можно вставить щелчком кнопки мыши или нажатием клавиши <Пробел>
555
■Свойство можно найти с помощью средства Visual Basic IntelliSense. Редактор Visual Basic предлагает замечательный инструмент, способный помочь найти нужное свойство. Как только вы ввели точку после имени объекта, редактор выводит на экран список всех свойств и методов, которые можно применять к данному объекту (рис. 16.6).
Примечание
Список IntelliSense содержит два вида элементов: свойства (отдельные характеристики, касающиеся объекта) и методы (действия, которые можно выполнять с объектом). Свойств больше и они помечены пиктограммой руки, держащей почтовую открытку. Методы снабжены пиктограммой парящего зеленого ластика. Вы узнаете, как пользоваться методами в следующем разделе.
На профессиональном уровне. Взаимодействие с другими формами
Как вы узнали в главе 15, можно извлекать и задавать значения свойств полей и элементов управления на текущей форме или других открытых в данный момент формах. Хитрость заключается в том, что нужно явно указать программе Access, какую форму вы пытаетесь использовать.
Предположим, что вы хотите изменить цвет элемента управления Price (цена) на форме Product (товар) при щелчке мышью кнопки, находящейся на форме PriceChanger (преобразователь цен). Приведенный далее код не работает, поскольку Access ищет несуществующий элемент управления Price на форме PriceChanger:
Price.BackColor = vbRed
Следующий код отлично использует описанную хитрость и направляет программу Access к правильной форме:
Forms("Product").Price.BackColor = vbRed
Технически приведенный код заставляет программу Access заглянуть в коллекцию Forms (формы), отслеживающую все открытые в данный момент формы. (Если в настоящий момент форма Product не открыта, этот оператор даст сбой.) Он извлекает из коллекции форму Product, переходит к форме для доступа к элементу управления Price и затем углубляется в него для поиска свойства BackColor (Цвет фона).
Логически равноценную строку кода можно записать двумя способами. Программисты Access старого образца применяют причудливый синтаксис с восклицательными знаками, который выглядит следующим образом:
Forms!Product!Price!BackColor = vbRed
Программа Access интерпретирует обе строки одинаково. Это просто дело вкуса. Но вы должны знать оба варианта, на случай, если столкнетесь со странным кодом с восклицательными знаками.
Если вас огорчает, что этот подход приводит к ошибке в случае закрытой нужной формы, оба описанных метода не смогут выручить вас. В главе 17 вы узнаете, как открывать форму, когда захочется.
В табл. 16.1 перечислены некоторые свойства элементов управления, которые могут вам понадобиться в программном коде на языке Visual Basic.
556
Таблица 16.1. Полезные свойства элементов управления
Свойство |
Тип данных |
Описание |
|
|
|
Value (значение) |
Зависит от конкрет- |
Хранит значение элемента управления. Обычно |
|
ного элемента |
все элементы связаны с полями, поэтому свой- |
|
|
ство Value позволяет считывать или изменять |
|
|
значение из текущей записи. В зависимости от |
|
|
типа данных поля свойство может быть тексто- |
|
|
|
Enabled (включено или |
True (истина) или |
Определяет возможность корректировки значе- |
доступно) |
False (ложь) |
ния элемента управления. Если задать в свойст- |
|
|
ве значение False, элемент управления блоки- |
|
|
руется и пользователь, работающий с формой, |
|
|
не сможет редактировать поле (несмотря на то, |
|
|
что ваш код может все еще пытаться изменять |
|
|
значение Value). Отключенные элементы |
|
|
управления выглядят не так, как включенные |
|
|
элементы управления — обычно у них подерну- |
|
|
|
Visible (видимый) |
True (истина) или |
Определяет, может ли пользователь, |
|
False (ложь) |
работающий с формой, видеть элемент |
|
|
управления. Если у свойства значение False |
|
|
(ложь), элемент исчезает с формы. Это свойство |
|
|
— удобный способ скрыть неиспользуемые |
|
|
поля. Если клиент живет в Замбии, можно |
|
|
скрыть поле State (штат) |
ForeColor (цвет текста) |
Число |
Определяет цвет для вывода текста (цвет текста) |
и BackColor (цвет фона) |
|
и цвет, отображаемый за текстом (цвет фона) |
|
|
|
Left (слева) и Тор |
Число |
Определяет местоположение элемента управле- |
(сверху) |
|
ния на форме. Свойство Left (слева) определяет |
|
|
расстояние от левого края формы до левого края |
|
|
элемента. Свойство Тор (сверху) задает |
|
|
расстояние от верхнего края формы до верхнего |
|
|
края элемента управления. Оба значения зада- |
|
|
|
Width (ширина) и |
Число |
Определяет размер элемента управления в пик- |
Height (высота) |
|
селах |
|
|
|
FontName (шрифт) и |
Текстовая строка и |
Определяет шрифт, который применяется для |
FontSize (размер |
число |
отображения текста в элементе управления. |
шрифта) |
(соответственно) |
FontName — это название гарнитуры шрифта |
|
|
(например, "Arial"), a FontSize — его размер в |
|
|
пунктах (например, 10) |
FontBold (жирное |
True (истина) или |
Определяет способ начертания текста (жирный |
начертание) и FontI- |
False (ложь) |
или наклонный) |
talic (курсив) |
|
|
Picture* (рисунок) |
Текстовая строка |
Позволяет отображать фоновое изображение на |
|
|
части формы, на вкладке или кнопке. Вы задаете |
|
|
путь к файлу с рисунком |
557
Таблица 16.1 (окончание)
Свойство |
Тип данных |
Описание |
|
|
|
Text* (текст) |
Текстовая строка |
Задает текущий текст в текстовом поле. В боль- |
|
|
шинстве случаев это свойство содержит те же |
|
|
данные, что и свойство Value. Но если кто-то |
|
|
редактирует текст и еще не перешел к другому |
|
|
элементу управления, содержимое этих двух |
|
|
свойств разное. Свойство Value содержит текст, |
|
|
хранящийся в таблице, а свойство Text — |
|
|
отредактированные данные, которые еще не |
Caption* (подпись) |
Текстовая строка |
Задает текст подписи или кнопки или заголовок |
|
|
формы. Это свойство важно, когда создаются |
|
|
подписи, не связанные с полями таблицы. Эле- |
|
|
мент управления Подпись можно применять для |
|
|
отображения сообщения о состоянии или статусе |
IternsSelected* |
Объект-коллекция |
Представляет собой коллекцию, объект специ- |
(выбранные элементы) |
|
ального типа, содержащий ноль или больше |
|
|
подобъектов. Данная коллекция содержит |
|
|
значения всех выбранных в данный момент в |
|
|
списке элементов. Свойство ItemsSelected |
|
|
полезно, только если создан список, |
|
|
поддерживающий многочисленные выделения, В |
|
|
|
* Это более специальные свойства и в большинстве элементов управления они не используются.
Методы
Методы позволяют выполнять действия с объектом. Во многих случаях вызов метода дает больше, чем просто задание свойства. В самом деле, один метод может выполнить комплексную операцию, которая повлияет на многие свойства. Метод Requery (обновление) заставляет вашу форму получить самые свежие данные из БД и затем обновить содержимое всех ее элементов управления.
Подсказка
Если применяются элементы управления, большая часть времени тратится на работу со свойствами. Действительно, у элементов управления огромное множество свойств и лишь несколько добавочных методов.
Для применения метода вводится имя объекта с последующей точкой, за которой набирается имя метода. Но вам не нужен знак равенства, т. к. вы не задаете значение метода. Вы просто вызываете его для выполнения или активизируете.
Далее приведен пример обновления текущей записи формы с помощью метода Refresh (обновить объект):
Form.Refresh
558
Иногда методу требуется дополнительная информация. Если у вас как раз тот случай, вы узнаете об этом, т. к. средство Visual Basic IntelliSense даст знать в процессе написания программного кода (рис. 16.7).
Рис. 16.7. Редко применяемый метод Move позволяет одним махом изменить местоположение и размер элемента управления. Как только вы введете имя метода, редактор Visual Basic отобразит четыре значения, которые нужно задать. В данном примере только первое значение (Left) обязательно — остальные заключены в квадратные скобки, что свидетельствует о возможности их пропуска
Если в методе нужно задать дополнительные данные, следует добавить пробел после имени метода и дальше указать соответствующее значение. Если требуется ввести несколько значений, каждое из них следует отделять запятой. Далее приведен пример, перемещающий элемент управления в левый верхний угол формы:
Description.Move 0, 0
В табл. 16.2 перечислены наиболее важные методы элементов управления.
Таблица 16.2. Полезные методы элементов управления
Метод |
Описание |
|
|
SetFocus (установить фокус) |
Переносит курсор внутрь элемента управления, делая |
|
его, таким образом, действующим элементом. Этот |
|
метод полезен при выполнении проверки условий на |
|
значения. Если в поле найдена ошибка, можно вернуть |
|
пользователя к элементу управления с ошибкой |
Undo (отмена) |
Аннулирует самые последние (незафиксированные) |
|
изменения в элементе управления. Этот метод можно |
|
вызвать в форме для отмены всех изменений и возврата |
|
к исходным значениям. Если в данный момент форма не |
|
в режиме редактирования, метод не делает ничего |
559
Таблица 16.2 (окончание)
Метод |
Описание |
|
|
Recalc (повторное вычисление) |
Пересчитывает любые выражения в элементах |
|
управления формы |
Refresh* (обновить объект) |
Получает из таблицы самые свежие значения для данной |
|
записи и, соответственно, обновляет форму. Этот метод |
|
полезен, если вы только что выполнили другую задачу, |
|
которая могла изменить запись, или работаете с |
|
многопользовательской БД (см. главу 18), в которой |
|
|
Requery* (обновление) |
Повторно выполняет запрос, применяемый для |
|
получения данных формы, и затем отображает |
|
полученные данные, начиная с первой записи. Этот |
|
метод подобен методу Refresh, но воздействует не на |
|
текущую запись, а на все записи. Этот метод можно |
|
применять к списку подстановки для обновления его |
* Эти методы применяются только к объектам формы, а не отдельным элементам управления.
События
Как вы знаете, события — это сообщения, которые объекты используют для передачи в ваш программный код сведений о том, что только что произошло нечто важное. Вы уже управляли событиями и применяли их в данной главе для реагирования на щелчки мышью кнопок. Список самых распространенных событий элементов управления приведен в табл. 15.4.
До сих пор не рассматривался один аспект: как события могут предоставлять дополнительные биты данных. Как вы, наверное, уже заметили, у каждой процедуры есть пара скобок. Посмотрим на них еще раз:
Private Sub ButtonOfPower_Click ()
В предыдущих примерах в этих скобках не было ничего. Но они введены не просто так. Некоторые события передают в ваш код дополнительную информацию о событии, и она вставляется в этот сэндвич из двух скобок.
Рассмотрим событие Нажатие клавиши (On Key Press) поля ввода, которое возникает каждый раз, когда кто-то нажимает символ на клавиатуре. Оно предоставляет специальный числовой код, обозначающий нажатую клавишу (программисты называют его кодом ASCII.)
Если добавить процедуру, реагирующую на событие Нажатие клавиши (On Key Press), программа Access сгенерирует код, подобный приведенному далее:
Private Sub MyTextBox_KeyPress(KeyAscii As Integer) End Sub
Этот код означает, что событие Нажатие клавиши (On Key Press) снабжает ваш код новой порцией информации. Это целое число, названное KeyAscii, его можно использовать в вашем коде.
560
