Как код связывается с событиями
Все дело в имени - в имени процедуры. Когда вы открываетеформу, в которой есть соответствующий программный код, программа Access ищет процедуры с определенными именами.
Если она находит процедуру, названную MyButton Click, то, прежде всего, проверяет элемент управления с именем MyButtonи наличие у него события с именем Click (нажатие кнопки). Если обе детали обнаружены, эта программная процедура становится обработчиком данного события, что на своеобразном жаргоне программистов означает связывание вашего кода с событием. Когда возникает событие (например, когда кнопку щелкнули мышью), Access выполняет код из вашей процедуры.
Если программа Access находит процедуру, названную MyButton_Click, а на форме нет элемента управления с именем MyButton,не стоит паниковать. Access просто предполагает, что вы создали процедуру для собственных внутренних нужд. Поскольку эта процедура не является обработчиком события, программа Access не запускает ее автоматически в ответ на возникновение события. Но она все же при необходимости может обращаться к вашему коду, как описано на этой странице.
У описанной системы два возможных камня преткновения. Во-первых, не меняйте имя обработчика события по своему усмотрению — если вы сделаете это, разорвется связь между формой и программным кодом, и обработчик события не будет выполняться, когда событие произойдет. Во-вторых, не меняйте имя элемента управления с помощью Окна свойств,поскольку это действие тоже разорвет связь. Если же на самом деле нужно исправить неудачное имя, убедитесь в том, что вы изменили имя процедуры так, что оно соответствует новому имени элемента управления.
В обоих случаях (при переименовании процедуры или элемента управления) Access не предупреждает о возможных последствиях. Поэтому помните эти рекомендации, чтобы избежать нежелательных неожиданностей.
Вызов кода в модуле
Полученные знания могут вызвать вопрос: в каких ситуациях вообще может возникнуть необходимость в создании стандартного модуля вручную? Помимо всего прочего нет удобного способа выполнения программного кода и возможности связать его с событием элемента управления на форме.
Стандартные модули полезны, если создан удивительно удачный фрагмент программного кода, который хочется применять в разных местах. Скажем, вы разработали отличную процедуру поиска и хотели бы использовать ее в двух, трех или четырех десятках различных форм. Этот код можно вырезать и вставить во все процедуры, которые в нем нуждаются. Помимо того, что дублирование кода — всегда плохой выбор (как и дублирование данных). Почему? Подумайте, что произойдет, если вам придется исправлять ошибку или вносить корректировку. Из-за дублирующегося кода придется найти все его копии и повторить в них одно и то же изменение. Это надежный способ потратить свои выходные дни.
Правильное решение — взять вашу полезную, многоразовую процедуру и поместить ее в модуль. Затем вы можете вызвать ее, когда понадобится, и редактировать ее только один раз, когда необходимо обновить процедуру или устранить ошибку. Для вызова программной процедуры в другом модуле используется имя модуля с последующей точкой ( . ), за которой указывается имя процедуры. Вот пример:
Private Sub ButtonOfPower_Click( )
MyModule.MyCodeRoutine End Sub
Далее приведен оперативный отчет о происходящем в процессе применения данного кода.
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 общедоступная или частная — ваш код все равно может вызывать ее.
Подсказка
Если вы хотите повторно использовать код в нескольких местах одной и той же формы (например, в ответ на нажатие разных кнопок), подумайте о создании собственной процедуры и размещении кода в ней. Если же предполагается использование одного фрагмента кода в нескольких формах, лучше поместить его в процедуру, хранящуюся в отдельном модуле.