MS Access | Блокировать кнопку закрытия окна приложения |
Мы можем блокировать кнопку закрытия окна приложения всякий раз, когда нам нужно на событие выхода из приложения запустить ряд дополнительных команд, например очистку временных таблиц.
На примере блокируем стандартную возможность закрывать приложение (через крестик в правом верхнем углу), а для пользователя предоставляем некий интерфейс с кнопкой типа EXIT, на событие которой отрабатывает задуманный код.
Напишем функцию fun_Startup, которая блокирует стандартный выход из приложения. Для этой функции обязательна декларация библиотек и необходимых констант, потому перед декларацией объявляем Option Explicit:
Option Compare Database Option Explicit
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long Private Const SC_Close = &HF060 Private Const SC_MOVE = &HF010 Private Const SC_SIZE = &HF000 Private Const MF_BYCOMMAND = &H0& Private Const WM_NCACTIVATE = &H86
Function fun_Startup() Dim hMenu As Long, Success As Long RunCommand acCmdWindowHide hMenu = GetSystemMenu(Application.hWndAccessApp, 0) 'спрятать все меню и окна базы данных 'блокировать кнопку закрытия для Access Window Success = DeleteMenu(hMenu, SC_SIZE, MF_BYCOMMAND) Success = DeleteMenu(hMenu, SC_MOVE, MF_BYCOMMAND) Success = DeleteMenu(hMenu, SC_Close, MF_BYCOMMAND) SendMessage Application.hWndAccessApp, WM_NCACTIVATE, 0&, 0& SendMessage Application.hWndAccessApp, WM_NCACTIVATE, 1&, 0& End Function
Функция не возвращает значений, потому могла бы быть и обычной процедурой, но процедуры нельзя назначать в макросах (а мы в примере хотим запускать эту функцию с помощью макроса).
Если функцию fun_Startup() запустить (в Immediate или обычным способом F5), то после ее отработки пропадает окно базы данных, а также запрещается кнопка закрытия окна Access. Выйти из такого "положения" (а также и для закрытия подвисшего приложения MS Access) можно только с помощью снятия задачи приложения: Ctrl+Alt+Delete, далее Task Manager, выделить приложение, задача которого подлежит закрытию (в данном случае MS Access) и нажать End Task. Соответственно, если когда-либо подобная функция будет запущена, для пользователя должен иметь место быть какой-нибудь интерфейс, через который можно будет выйти из программы.
Назначим функцию fun_Startup() на автоматическое срабатывание при открытии программы, с помощью макроса AutoExec.
Переходим в окно макросов базы данных, создаем новый макрос, который нужно назвать как AutoExec:
Из команд макроса первой будет, например, запуск функции fun_Startup. Для этого в колонке Action выбираем RunCode, внизу Function Name указываем fun_Startup():
После запуска функции fun_Startup(), например запускаем команду открытия главной формы. Для этого следующей командой в макросе AutoExec указываем – OpenForm. Имя формы выбираем из комбо-бокса Form Name, например Switchboard:
Отмену запуска макроса AutoExec можно предусмотреть удерживанием клавиши Shift при открытии базы данных.
См. также: Создать кнопку выхода из приложения
|