powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Закрытие формы при помощи API
12 сообщений из 12, страница 1 из 1
Закрытие формы при помощи API
    #39678850
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Закрыть форму можно двумя способами.

1. Нажать на кнопку с "Х" в меню формы
2. Выполнить команду VBA по закрытию формы

При закрытии формы последовательно происходят два события Unload и Close . Событие Unload имеет параметр Cancel типа Integer . Если в процессе выполнения кода, расположенного в секции Private Sub Form_Unload(Cancel As Integer ) присвоить переменной Cancel значение True , то процедура закрытия формы будет прервана. Если же оставить переменной Cancel значение False , то закрытие формы будет продолжено.

Но можно закрыть форму и при помощи API. Вот так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
'Разместите на форме CommandButton и вставьте следующий код:
	Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long


	Private Sub Command_Click()
              DestroyWindow Me.hwnd
	End Sub

При этом события Unload не происходит, а сразу выполняется событие Close . Что думаете о таком способе закрытия формы? И на сколько он корректен?
-------------------------------------------------------------
А ты вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?
...
Рейтинг: 0 / 0
Закрытие формы при помощи API
    #39678880
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss,
А какая разница происходит Unload или нет. (если событие не обрабатывать то глыбоко фиолетово произошло оно или нет)
...
Рейтинг: 0 / 0
Закрытие формы при помощи API
    #39678922
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, например
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Form_Unload(Cancel As Integer)
    Select Case MsgBox("Форма закрывается. Продолжить?. ", _
           vbYesNo Or vbQuestion Or vbDefaultButton1, "Закрытие формы")
        Case vbYes
            Cancel = False
        Case vbNo
            Cancel = True
    End Select
End Sub

А интересует, форма выгружается или нет? И не будет ли потом каких-либо проблем с программой?
...
Рейтинг: 0 / 0
Закрытие формы при помощи API
    #39678928
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss,
msgBox,с тремя кнопками,должен быть таким:"Так закрывать форму?" кнопки: "ДА","НЕТ","САМ НЕ ЗНАЮ"
...
Рейтинг: 0 / 0
Закрытие формы при помощи API
    #39678934
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шутка? Да-а-а?...
...
Рейтинг: 0 / 0
Закрытие формы при помощи API
    #39679023
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss,
шутка с намеком
...
Рейтинг: 0 / 0
Закрытие формы при помощи API
    #39679939
zimkon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Joss,

Дим, а зачем так круто с формой - сразу DestroyWindow? Если уж хочется API , то можно аккуратненько обойтись
Это в общий модуль
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Option Compare Database

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, _
    ByVal msg As Long, _
    ByVal Param1 As Long, _
    Param2 As Any) As Long
    
Public Const GetClose = &H10


ну, и на кнопку
Код: vbnet
1.
2.
3.
	Private Sub Command_Click()
               SendMessage Me.hwnd, GetClose, 0, vbNullString
	End Sub
...
Рейтинг: 0 / 0
Закрытие формы при помощи API
    #39679944
Вакшуль Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss, добрый вечер.

Вот тут, 20774213 , я использовал функцию apiCloseForm(чуть доработал функцию Graham Mandeno).

Вот она:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_CLOSE = &H10&


Public Function apiCloseForm(ByRef frm As Access.Form, Optional fQuiet As Boolean) As Long
'Remake of Graham Mandeno's function
'Returns 0 if successful, otherwise an error value
Dim lRet As Long, hWnd As Long, hWndTemp As Long
    
    On Error GoTo ProcErr
    hWnd = frm.hWnd
    Call SendMessage(hWnd, WM_CLOSE, 0&, 0&)
    
    On Error Resume Next
    hWndTemp = frm.hWnd
    If Err = 0 Then
        'A form wasn't closed
        On Error GoTo ProcErr
        Err.Raise vbObjectError + 10000, CurrentProject.Name, "Form " & frm.Name & " with a Caption '" & frm.Caption & "' may not be closed at this time."
    End If
    'A form was closed
    On Error GoTo 0
ProcEnd:
    If lRet = 0 Then Set frm = Nothing
    apiCloseForm = lRet
    Exit Function
ProcErr:
    If Not fQuiet Then MsgBox Err.Description, vbExclamation, "Cannot close form"
    lRet = Err
    Resume ProcEnd
End Function


Сопроводил тогда комментарием:Вакшуль СергейИспользование имени формы, открытой как экземпляр, в качестве ключа создает сложности при обращении к ней для последующего закрытия: DoCmd.Close acForm, "ИмяФормы", вынуждая отказываться в пользу DoCmd.Close, метода, который закрывает не произвольную, а исключительно активную в данный момент форму, навязывая тем самым определенный порядок закрытия форм, а иногда делая закрытие форм невозможным в принципе, если такая форма неактивна в данный момент.

С оглядкой на сказанное был использован альтернативный механизм закрытия форм – функция apiCloseForm. Это remake функции Graham Mandeno. Функция хороша, мне понравилась :). Позволяет закрыть любую форму независимо от того, активна она или нет, открыта ли через DoCmd.OpenForm или как экземпляр. Функция позволяет подавить или, наоборот, выдать корректное сообщение об ошибке, если закрытие невозможно. Рекомендую :).
...
Рейтинг: 0 / 0
Закрытие формы при помощи API
    #39679946
Predeclared
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.
изврашенцы
:)
...
Рейтинг: 0 / 0
Закрытие формы при помощи API
    #39679952
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Predeclared,

нет... бездельники, вместо того чтоб искать и делать новые проекты, осваивать новые продукты...
...
Рейтинг: 0 / 0
Закрытие формы при помощи API
    #39680013
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vmagPredeclared,

нет... бездельники, вместо того чтоб искать и делать новые проекты, осваивать новые продукты...
Ску-у-у-чно-о-о... и лень!
...
Рейтинг: 0 / 0
Закрытие формы при помощи API
    #39680065
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот маленький примерчик использования стандартного закрытия формы и функций API
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Закрытие формы при помощи API
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]