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:

Переходим в окно макросов базы данных, создаем новый макрос, который нужно назвать как AutoExec:

 

 

 

Из команд макроса первой будет, например, запуск функции fun_Startup. Для этого в колонке Action выбираем RunCode, внизу Function Name указываем fun_Startup():

 

 

После запуска функции fun_Startup(), например запускаем команду открытия главной формы. Для этого следующей командой в макросе AutoExec указываем – OpenForm. Имя формы выбираем из комбо-бокса Form Name, например Switchboard:

 

 

 

Отмену запуска макроса AutoExec можно предусмотреть удерживанием клавиши Shift при открытии базы данных.

 

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

 



© 2018 | Анна Петросян | pashelp@yandex.ru