Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Форма не закрывается по инструкции DoCmd.Close  [new]
Игорь С
Member

Откуда: Iндепендна Юкрейна
Сообщений: 515
Общий модуль читает URL и при некоторых условиях должен подождать.
В этот момент окрывается информирующая "формочка" с полем, где по умолчанию указано время открытия формы и две кнопки: "Продолжить" и "Завершить"

В общем модуле цикл:

 If NErrxxx > 3 Then
                NErrxxx = 0
                Dim t0 As Long, t1 As Long: t0 = Timer: DoCmd.OpenForm "Xpause"
                Do
                  t1 = Timer
                  If t1 > t0 + 1800 Or t1 < t0 Then DoCmd.Close acForm, "Xpause": Exit Do
                  DoEvents
                  If log2 > 0 Then DoCmd.Close acForm, "Xpause": Exit Do
                Loop
                If log > 0 Then log = 0: DoCmd.Close acForm, "Xpause": GoTo 90
            End If

Последняя инструкция
.Close
даже лишняя.
Log, Log2 - глобальные управляющие переменные
Вот модуль формы:
Private Sub Form_Close()
log2 = 1
End Sub

Private Sub Кнопка2_Click()
log2 = 1
DoCmd.Close
End Sub

Private Sub Кнопка3_Click()
log = 1
log2 = 1
DoCmd.Close

End Sub

Почему форма не закрывается?
24 янв 19, 06:09    [21792792]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4908
Не ясна постановка вопроса. По подробнее можно? Не закрывается... Когда? По кнопке на форме? Из основного модуля? А пример базы? А под отладчиком прошли? Может программа в этот IF и не попадает?
24 янв 19, 08:30    [21792831]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
ROI
Member

Откуда: г. Тюмень
Сообщений: 1789
Joss,

Я так думаю останавливается таймер на форме когда вызывается другая форма
24 янв 19, 09:25    [21792878]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
ROI
Member

Откуда: г. Тюмень
Сообщений: 1789
DoEvents должно помочь
24 янв 19, 09:26    [21792882]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Игорь С
Member

Откуда: Iндепендна Юкрейна
Сообщений: 515
Joss, спасибо за внимание.
Поподробнее
If NErrxxx > 3 Then  ' Условие начала ожидания
                NErrxxx = 0
                Dim t0 As Long, t1 As Long: t0 = Timer: DoCmd.OpenForm "Xpause" ' Форма открыта в момент t0
                Do
                  t1 = Timer
                 ' Если прошло полчаса, то форма закрывается и общий модуль продолжает работать
                  If t1 > t0 + 1800 Or t1 < t0 Then DoCmd.Close acForm, "Xpause": Exit Do 
                  DoEvents
                  ' Если нажали кнопку продолжить в форме "Xpause", выйти из цикла и продолжить работу
                  If log2 > 0 Then DoCmd.Close acForm, "Xpause": Exit Do
                Loop
                                                ' Это дубляж закрытия формы
                If log > 0 Then log = 0: DoCmd.Close acForm, "Xpause": GoTo 90
            End If


Пример "базы", полагаю не нужен, т.к. это однотабличная база (читаем URL, что-то выбираем и записываем в единственную таблицу).
Но форма не закрывается. Да, забыл, Акссесс 2010, но файл .mdb созданный в Аксессе 2003.
24 янв 19, 09:33    [21792890]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Игорь С
Member

Откуда: Iндепендна Юкрейна
Сообщений: 515
ROI
Joss,
Я так думаю останавливается таймер на форме когда вызывается другая форма


Да нет, программа через положенное время выходит из цикла и нормально продолжает работу. А эта форма висит. Закрываю "руками" все нормально продолжается. Отладчиком пробовал с остановкой на инструкции Close. Остановилось, продолжил, процесс продолжился, форма открыта. Где-то что-то очень простое ...
24 янв 19, 09:36    [21792894]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
ROI
Member

Откуда: г. Тюмень
Сообщений: 1789
Игорь С
ROI
Joss,
Я так думаю останавливается таймер на форме когда вызывается другая форма


Да нет, программа через положенное время выходит из цикла и нормально продолжает работу. А эта форма висит. Закрываю "руками" все нормально продолжается. Отладчиком пробовал с остановкой на инструкции Close. Остановилось, продолжил, процесс продолжился, форма открыта. Где-то что-то очень простое ...

Хмм Может активировать форму хотя.....
24 янв 19, 10:36    [21792995]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Кривцов Анатолий
Member

Откуда:
Сообщений: 328
Не понял вашу логику. В log2 пишется 1 перед перед DoCmd.Close по нажатию любой кнопки и даже на событии Form_Close. Т.е. форма уже закрывается, а в цикле снова команда DoCmd.Close. Может она лишняя и такой эффект? Если дождаться 30 мин., форма закроется?
Если форму просто открыть и нажать кнопку - закрывается?

Я бы в цикл добавил проверку - открыта ли форма.
24 янв 19, 10:54    [21793029]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6259
Игорь С,
if t1>t0+1800 or t1<t0... а будет ли это TRUE
t0=timer,t1=timer-до присвоения значения t1 может пройти,от начала выполнения (а при пошаговом выполнении в окне отладки это условие выполнится) менее 1800 милисек,а t1 никогда не будет меньше t0
24 янв 19, 10:56    [21793035]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Кривцов Анатолий
Member

Откуда:
Сообщений: 328
Игорь С, а почему бы вам не открыть форму в режиме acDialog? Тогда и никакого цикла не надо.
24 янв 19, 11:12    [21793056]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Игорь С
Member

Откуда: Iндепендна Юкрейна
Сообщений: 515
Кривцов Анатолий
В log2 пишется 1 перед перед DoCmd.Close по нажатию любой кнопки и даже на событии Form_Close. Т.е. форма уже закрывается, а в цикле снова команда DoCmd.Close. Может она лишняя и такой эффект? Если дождаться 30 мин., форма закроется?
Если форму просто открыть и нажать кнопку - закрывается?

Я бы в цикл добавил проверку - открыта ли форма.


Все лишние Close - это результать попыток все-таки ее закрыть.

Форма не закрывается по истечении 1800 сек. Но алгоритм из цикла выходит и нормально продолжает работу. По нажатиям кнопок форма закрывается и тоже происходит все штатно.
24 янв 19, 14:37    [21793389]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Игорь С
Member

Откуда: Iндепендна Юкрейна
Сообщений: 515
Кривцов Анатолий

Цикл нужен, т.к. это основной режим работы. Программа подождет 30 мин и должна без вмешательства продолжить работу, что она и делает. Но форма висит и "немного мешает". Хотя можно закрыть руками.
Попробую в режиме диалога.
24 янв 19, 14:42    [21793395]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Кривцов Анатолий
Member

Откуда:
Сообщений: 328
Вместо
If t1 > t0 + 1800
укажите
If t1 > (t0 + 1800)

Но режим диалога - лучшее решение. Если вам нужно организовать таймаут, то в форме укажите TimerInterval и закрывайте на событии Form_Timer.
24 янв 19, 15:31    [21793513]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 551
Игорь С, если форму закрыть нельзя, значит метод docmd её не находит в коллекции Forms. попробуйте forms("Xpause").requery, goto control "Xpause"-вдруг поможет?
24 янв 19, 17:16    [21793666]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Игорь С
Member

Откуда: Iндепендна Юкрейна
Сообщений: 515
alecko,
Спасибо
25 янв 19, 09:23    [21793928]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Игорь С
Member

Откуда: Iндепендна Юкрейна
Сообщений: 515
alecko,
 DoCmd.OpenForm "Xpause"
 Задержка_секунд(5)
 DoCmd.Close acForm, "Xpause"

Форма открылась, но не закрылась, без всяких таймеров и логики, с паузой по времени 5 секунд.
25 янв 19, 09:37    [21793939]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Игорь С
Member

Откуда: Iндепендна Юкрейна
Сообщений: 515
alecko,
Сейчас попробую как Вы посоветовали.
25 янв 19, 09:38    [21793941]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
ROI
Member

Откуда: г. Тюмень
Сообщений: 1789
Игорь С
alecko,
 DoCmd.OpenForm "Xpause"
 Задержка_секунд(5)
 DoCmd.Close acForm, "Xpause"


Форма открылась, но не закрылась, без всяких таймеров и логики, с паузой по времени 5 секунд.

Переведите фокус на форму и сделайте активной должно сработать.
25 янв 19, 10:21    [21793977]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Кривцов Анатолий
Member

Откуда:
Сообщений: 328
Игорь С
DoCmd.OpenForm "Xpause"
Задержка_секунд(5)
DoCmd.Close acForm, "Xpause"
[/src]
Форма открылась, но не закрылась, без всяких таймеров и логики, с паузой по времени 5 секунд.
Это какая-то аномалия. А любая другая форма? Если закрывается, то сделайте дубль формы "Xpause" и попробуйте с ним.
25 янв 19, 12:25    [21794134]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Joss
Member

Откуда: г. Минск
Сообщений: 4908
Из статьи http://am.rusimport.ru/MSAccess/topic.aspx?ID=728

...
3. Использовать функцию SendMessage (API)
'Разместите на форме CommandButton и вставьте следующий код:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, _
    ByVal msg As Long, _
    ByVal Param1 As Long, _
    Param2 As Any) As Long
    
Private Const GetClose = &H10

	Private Sub Command_Click()
               SendMessage Me.hwnd, GetClose, 0, vbNullString
	End Sub

Закрывается форма стандартно. происходят события Unload и Close.
Заменив определение Private на Public описание функции и константы можно поместить в общий модуль.

4. Использовать функцию DestroyWindow (API) - не рекомендуется
'Разместите на форме CommandButton и вставьте следующий код:
	Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long


	Private Sub Command_Click()
              DestroyWindow Me.hwnd
	End Sub

Описание функции можно поместить и в общем модуле как Public.
Особенности. При использовании функции DestroyWindow не происходит событие Unload. Событие Close происходит. Никакие изменения на форме не сохраняются. Запрос на сохранение изменений не выдаётся. По-этому и не рекомендуется использовать эту функцию для закрытия форм в Access.

---
Попробуйте
25 янв 19, 12:43    [21794162]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Игорь С
Member

Откуда: Iндепендна Юкрейна
Сообщений: 515
Joss, ой, спасибо.
25 янв 19, 15:37    [21794383]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
Игорь С
Member

Откуда: Iндепендна Юкрейна
Сообщений: 515
Кривцов Анатолий
Игорь С
DoCmd.OpenForm "Xpause"
Задержка_секунд(5)
DoCmd.Close acForm, "Xpause"
[/src]
Форма открылась, но не закрылась, без всяких таймеров и логики, с паузой по времени 5 секунд.
Это какая-то аномалия. А любая другая форма? Если закрывается, то сделайте дубль формы "Xpause" и попробуйте с ним.

Сделал форму "Всплывающее окно" - уже открыть, подождать, закрыть (вне цикла с таймером) сработало.
25 янв 19, 18:06    [21794511]     Ответить | Цитировать Сообщить модератору
 Re: Форма не закрывается по инструкции DoCmd.Close  [new]
alecko
Member

Откуда: Башкирия
Сообщений: 551
есть ещё открытие формы как модуля класса-в этом случае о таких проблемах можно забыть
Dim frm as form
 If NErrxxx > 3 Then
set frm = new form_Xpause
frm.visible=true
' ...
set frm=nothing
end if
26 янв 19, 13:21    [21794766]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить