Последовательности событий Access


При написании процедур обработки событий очень важно понимать, в каком порядке они происходят, т. к. приложение Access управляется событиями и результат работы зависит от того, в каком порядке эти процедуры будут выполняться. В данном разделе мы опишем порядок возникновения событий в формах и отчетах.
 
Последовательность событий фокуса для элементов управления в формах
При установке фокуса на элемент управления щелчком мыши, при нажатии клавиши <Таb> или при открытии формы происходят события: Вход (Enter) => Получение фокуса (GotFocus).
Когда элемент теряет фокус, например при закрытии формы или переносе фокуса на другой элемент управления той же формы, происходят события: Выход (Exit) => Потеря фокуса (LostFocus).
При переносе фокуса в другую форму элемент первой формы теряет фокус, но не возникает события Выход (Exit). Соответственно, когда фокус переносится обратно, т. е. к элементу, который уже имел фокус, когда форма последний раз была активной, то не происходит события Вход (Enter), а только событие Получение фокуса (GotFocus).
Замечание
В дальнейшем при описании последовательностей событий мы не будем приводить английские эквиваленты названий событий, дабы не загромождать представление. Кроме того, вводятся сокращения для обозначения объектов, к которым относится событие, например: э — элемент, ф — форма.
При переносе фокуса из элемента управления в главной форме на элемент управления в подчиненной форме события происходят в следующем порядке: Выход (г.ф., т.ф.) => Потеря фокуса (г.ф., т.ф.) => Вход (г.ф., э.п.) => Выход (п.ф., т.ф.) => Потеря фокуса (п.ф., т.ф.) => Вход "(п.ф., п.ф.) => Получение фокуса (п.ф., п.ф.) Это самая сложная цепочка событий, в которой задействованы сразу четыре элемента управления: г.ф., т.ф. — элемент главной формы, теряющий фокус; г.ф., э.п. — элемент главной формы, содержащий подформу; п.ф., т.ф. — элемент подформы, теряющий фокус (если мы переносим фокус на тот элемент подформы, который до этого фокуса не имел); п.ф., п.ф. — элемент подформы, принимающий фокус. Если перенос фокуса выполняется на элемент подчиненной формы, который имел фокус, когда она последний раз была активной, то в цепочке отсутствуют события: Выход (п.ф., т.ф.) => Потеря фокуса (п.ф., т.ф.) => Вход (п.ф., п.ф.).
Последовательность событий изменения данных в элементе управления
Когда вводят или изменяют данные в элементе управления, а затем переходят к следующему элементу управления, возникает следующая цепочка событий: {Клавиша вниз => Нажатие клавиши => Внесены изменения ==> Изменение => Клавиша вверх}=> До обновления После обновления => Выход => Потеря фокуса
Фигурные скобки в приведенном выражении означают, что выделенная цепочка событий возникает при каждом нажатии клавиши на клавиатуре.
Еcли ввод выполняется в поле со списком, то в конец последней цепочки, после события Клавиша вверх, могут добавиться события Отсутствие в списке (NotlnList) и Ошибка (Error), и цепочка будет выглядеть следующим образом: Клавиша вниз => Нажатие клавиши => Внесены изменения => Изменение => Клавиша вверх} => Отсутствие в списке => Ошибка => До обновления => После обновления => Выход => Потеря фокуса
Последовательность событий в форме, связанных с записями
Если просто просматриваются записи в форме, то при переходе к каждой новой записи выполняются событие Текущая запись (Current) для формы и все события, связанные с установкой фокуса в элементах формы. Если данные в записи меняются, то сохранение изменений происходит только при переходе к следующей записи или при закрытии формы (если нашли нужную запись, изменили и закрыли форму). Поскольку все изменения в записи происходят в элементах управления формы, одновременно будут возникать соответствующие события в элементах формы. Рас-смотрим типичную ситуацию, когда в форме выводится запись, в ней перемещаются по элементам управления до нужного элемента, изменяют в нем данные и переходят к следующей записи. В этом случае последовательность возникновения событий будет выглядеть так: Текущая запись (ф) => {Вход (э) => Получение фокуса (э) => Выход (э) => Потеря фокуса (э)} => Вход (э) => Получение фокуса (э) => До обновления (э) => После обновления (э) => До обновления (ф) => После обновления (ф) => Выход (э) => Потеря фокуса (э) => RecordExit => Текущая запись (ф) => Вход (э) => Получение фокуса (э)
В этой цепочке для упрощения опущены все события клавиатуры, а фигурные скобки выделяют цепочки событий, которые возникают при переходе между элементами управления формы. При изменении данных события До обновления (BeforeUpdate) и После обновления (AfterUpdate) происходят сначала для элемента, а затем для формы. Затем последний элемент (в данном случае тот, в котором происходили изменения) теряет фокус, происходит событие RecordExit (Выход из записи), выводится следующая запись, и фокус устанавливается на первый элемент в этой записи. События До обновления (BeforeUpdate) и После обновления (AfterUpdate) всегда возникают непосредственно перед переходом к следующей записи. После этого запись (элемент управления, в котором перед этим находился фокус) теряет фокус.
Замечание
Если запись сохраняется с помощью команды меню Записи, Сохранить запись (Records, Save Record), то последних событий Выход (Exit) и Потеря фокуса (LostFocus) не происходит. Это полезно знать, т. к. иногда требуется обойти эти события.
При удалении записи происходят события: Удаление => До подтверждения Del => После подтверждения Del => Текущая запись => Вход => Получение фокуса
Если событие Удаление (Delete) отменяется, то остальные события не возникают. После удаления записи фокус переходит на следующую запись, поэтому происходят события Текущая запись (Current) формы и Вход (Enter) и Получение фокуса (GetFocus) первого элемента в этой записи.
Добавление новой записи осуществляется после того, как пользователь вводит первый символ новой (пустой) записи. При этом события происходят в следующем порядке: Текущая запись (ф) => Вход (э) => Получение фокуса (э) => До вставки (ф) => Изменение (э) => До обновления (ф) => После обновления (ф) => После вставки (ф)

В этой цепочке пропущены все события клавиатуры и До обновления (BeforeUpdate) и После обновления (AfterUpdate) для элементов формы, т. к. они описаны выше. Событие Изменение (Change) происходит, если первый символ новой записи вводится в текстовое поле.