#vba #ms-access
Вопрос:
Прежде всего, я хотел бы сказать, что я новичок в доступе, и, пожалуйста, заранее извините меня, если мой вопрос глупый. Тем не менее, я изо всех сил пытаюсь найти способ отделить созданную мной всплывающую форму от доступа. Я добился некоторого прогресса, но я изо всех сил пытаюсь полностью отделить одно от другого. Вот что я сделал до сих пор:
- Я изменил настройку «Всплывающее окно» формы на «Да».
- Я выбрал форму в качестве «Отображаемой формы» в параметрах «Текущая база данных».
- Я нашел функцию, которая минимизировала бы доступ.
Option Compare Database Option Explicit Global Const SW_HIDE = 0 Global Const SW_SHOWNORMAL = 1 Global Const SW_SHOWMINIMIZED = 2 Global Const SW_SHOWMAXIMIZED = 3 Private Declare Function apiShowWindow Lib "user32" _ Alias "ShowWindow" (ByVal hwnd As Long, _ ByVal nCmdShow As Long) As Long Function fSetAccessWindow(nCmdShow As Long) Dim loX As Long Dim loForm As Form On Error Resume Next Set loForm = Screen.ActiveForm If Err lt;gt; 0 Then loX = apiShowWindow(hWndAccessApp, nCmdShow) Err.Clear End If If nCmdShow = SW_SHOWMINIMIZED And loForm.Modal = True Then MsgBox "Cannot minimize Access with " _ amp; (loForm.Caption " ") _ amp; "form on screen" ElseIf nCmdShow = SW_HIDE And loForm.PopUp lt;gt; True Then MsgBox "Cannot hide Access with " _ amp; (loForm.Caption " ") _ amp; "form on screen" Else loX = apiShowWindow(hWndAccessApp, nCmdShow) End If fSetAccessWindow = (loX lt;gt; 0) End Function
- Я вызываю эту функцию в Form_Load, чтобы открыть только форму и свернуть окно доступа.
Однако я заметил, что если по какой-то причине я открою окно доступа, а затем нажму кнопку «свернуть», оно также свернет форму. Мне было интересно, смогу ли я разделить их, поэтому, когда я сверну окно доступа, форма все равно останется на экране?
Любые отзывы или предложения будут высоко оценены. Заранее благодарю вас!
Комментарии:
1. Я в этом сомневаюсь. Тем не менее, существует метод скрытия фрейма приложения Access, при котором все еще видны формы и отчеты. Общая тема.
2. Форма является дочерней по отношению к родительскому приложению, поэтому сведение к минимуму родительского приложения также сводит к минимуму все дочерние формы. Это сделано специально. Было бы лучше использовать что-то вроде . СЕТЬ для создания автономного приложения, которое использует access в качестве своей внутренней базы данных.
Ответ №1:
Мы можем скрыть экземпляр доступа, сохранив форму видимой. Итак, запишите приведенные ниже коды в стандартный модуль.
Option Compare Database Option Explicit Global Const SW_HIDE = 0 Global Const SW_SHOWNORMAL = 1 Global Const SW_SHOWMINIMIZED = 2 Global Const SW_SHOWMAXIMIZED = 3 Private Declare PtrSafe Function apiShowWindow Lib "user32" _ Alias "ShowWindow" (ByVal hWnd As Long, _ ByVal nCmdShow As Long) As Long Function fSetAccessWindow(nCmdShow As Long) ' call fSetAccessWindow(0) for hiding access window ' call fSetAccessWindow(1) for showing access window ' call fSetAccessWindow(2) for minimizing access window ' call fSetAccessWindow(3) for maximizing access window Dim loX As Long Dim loForm As Form On Error Resume Next Set loForm = Screen.ActiveForm If Err lt;gt; 0 Then loX = apiShowWindow(hWndAccessApp, nCmdShow) Err.Clear End If If nCmdShow = SW_SHOWMINIMIZED And loForm.Modal = True Then MsgBox "Cannot minimize Access with " _ amp; (loForm.Caption " ") _ amp; "form on screen" ElseIf nCmdShow = SW_HIDE And loForm.PopUp lt;gt; True Then MsgBox "Cannot hide Access with " _ amp; (loForm.Caption " ") _ amp; "form on screen" Else loX = apiShowWindow(hWndAccessApp, nCmdShow) End If fSetAccessWindow = (loX lt;gt; 0) End Function
Затем вызовите функцию с соответствующим аргументом, чтобы скрыть окно доступа. Нравится-
Private Sub CmdHideAccess_Click() Call fSetAccessWindow(0) End Sub
Внимательно прочитайте комментарии к функциям для получения дополнительных аргументов, если вам нужно.
Комментарии:
1. Прежде всего, спасибо вам за ваш ответ. Однако я не уверен, куда мне следует поместить частную субмарину. Попытался поискать его в Google, но документация по «CmdHideAccess_Click»не была найдена. Я был бы очень признателен, если бы вы дали мне ссылку, чтобы узнать больше об этой функции. Заранее благодарю вас!
2. Сначала (тестовая цель) создайте форму, а затем нажмите командную кнопку. Затем поместите эту строку
Call fSetAccessWindow(0)
в событие On Click . Если это успешно, то попробуйте поместить код в форму при событии загрузки.3. О, теперь я понимаю. Это то, что у меня сейчас есть. Однако это сведет к минимуму доступ только при открытии формы. Если пользователь по какой-либо причине развернет окно доступа и щелкнет значок свернуть в окне доступа, это сведет к минимуму как доступ, так и всплывающую форму. Мне было любопытно, можно ли предотвратить сворачивание формы, когда пользователь вручную сворачивает доступ. PS: На данный момент я создал дополнительную кнопку в форме, которая бы минимизировала доступ, но мне не очень нравится это решение. Я рассматриваю это скорее как предзнаменование, чем как реальное решение.