Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Закрытие формы при помощи API / 12 сообщений из 12, страница 1 из 1
25.07.2018, 12:46
    #39678850
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие формы при помощи API
Закрыть форму можно двумя способами.

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
25.07.2018, 13:21
    #39678880
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие формы при помощи API
Joss,
А какая разница происходит Unload или нет. (если событие не обрабатывать то глыбоко фиолетово произошло оно или нет)
...
Рейтинг: 0 / 0
25.07.2018, 13:57
    #39678922
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие формы при помощи API
Ну, например
Код: 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
25.07.2018, 14:07
    #39678928
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие формы при помощи API
Joss,
msgBox,с тремя кнопками,должен быть таким:"Так закрывать форму?" кнопки: "ДА","НЕТ","САМ НЕ ЗНАЮ"
...
Рейтинг: 0 / 0
25.07.2018, 14:20
    #39678934
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие формы при помощи API
Шутка? Да-а-а?...
...
Рейтинг: 0 / 0
25.07.2018, 15:39
    #39679023
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие формы при помощи API
Joss,
шутка с намеком
...
Рейтинг: 0 / 0
26.07.2018, 23:34
    #39679939
zimkon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие формы при помощи API
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
27.07.2018, 00:14
    #39679944
Вакшуль Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие формы при помощи API
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
27.07.2018, 00:24
    #39679946
Predeclared
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие формы при помощи API
.
изврашенцы
:)
...
Рейтинг: 0 / 0
27.07.2018, 01:33
    #39679952
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрытие формы при помощи API
Predeclared,

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

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


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