Закрытие формы из обработки события текущей записи

T_Alex_G
Дата: 03.11.2009 12:06:16
Здравствуйте.
Есть необходимость в обработке перехода на текущую запись по некоторому условию выдавать пользователю сообщение и закрывать форму.
Есть ли какой нибудь нормальный способ это провернуть?
mds_world
Дата: 03.11.2009 12:32:30
Если нет каких-то, не упомянутых вами особенностей, то прямо там, на Form_Current писать
If [условие] Then DoCmd.Close acForm, "ИмяФормы"
olga zobkov
Дата: 03.11.2009 12:32:55
T_Alex_G,

msgbox "ffhghfgjhjh"
docmd.closeform
T_Alex_G
Дата: 03.11.2009 12:48:26
если бы все было так просто ...

"Run-time error '2585':
Невозможен запуск этой макрокоманды при обработке события формы"

(для проверки создал тестовую таблицу,а по ней автоформу с обработкой Form_Current)
T_Alex_G
Дата: 03.11.2009 12:50:33
прошу прощения, не указал сразу что закрывать надо ту же форму для которой обработка текущей записи
mds_world
Дата: 03.11.2009 13:36:21
T_Alex_G
прошу прощения, не указал сразу что закрывать надо ту же форму для которой обработка текущей записи
Это другой коленкор. Да, не сможете закрывать форму через ее же событие Current. Дело в том, что возникает цикл обращений к этому событию и вырабатывается ошибка. Попробуйте иначе сформулировать условие выхода. Или напишите его здесь, может кто-нибудь подскажет.
отакота
Дата: 03.11.2009 15:09:32
T_Alex_G
если бы все было так просто ...

"Run-time error '2585':
Невозможен запуск этой макрокоманды при обработке события формы"

(для проверки создал тестовую таблицу,а по ней автоформу с обработкой Form_Current)

можно как-то так, например
Private Sub Form_Current()
    If <ваше условие> Then
        MsgBox "Закрываемся"
        Me.TimerInterval = 100 '<-заводим будильник
    End If
End Sub
Private Sub Form_Timer()
    DoCmd.Close acForm, Me.Name '<- закрываем по будильнику
End Sub
это если таймер в форме изначально не используется. если он уже зачем-то используется, то в Form_Current вместо TimerInterval можно взводить флаг, а в Form_Timer его анализировать.
T_Alex_G
Дата: 03.11.2009 15:31:45
Timer на мой взгляд не является нормальным способом решения этой задачи
Что если за 100 мс код внутри on_current_record не успеет завершиться (там довольно сложный
расчет)
а если повышать этот интервал то после завершения on_current_record пользователь может успеть тыкнуть какую нибудь кнопку на интефейсе.
Конечно можно в конце on_current_record поставить переменную on_current_record_finished=true и в обработчике таймера через каждые 10 мс анализировать ее. Но как то все это через ...
Папа Игорь
Дата: 03.11.2009 15:42:38
T_Alex_G
...Есть необходимость в обработке перехода на текущую запись по некоторому условию выдавать пользователю сообщение и закрывать форму.


Странное проектирование. Вообще это событие используется для других целей. Если Вам надо запретить пользователю что-либо делать с конкретной записью (не изменять, не видеть и т.п.), то для этого есть другие методы.

А то какая-то игра "Сапер" получается. Иду, значитца, по записям и тут: "Ага, попался! Game over!" и форма брык и закрылась. Весело...
отакота
Дата: 03.11.2009 15:57:26
T_Alex_G
Timer на мой взгляд не является нормальным способом решения этой задачи
Что если за 100 мс код внутри on_current_record не успеет завершиться (там довольно сложный
расчет)
а если повышать этот интервал то после завершения on_current_record пользователь может успеть тыкнуть какую нибудь кнопку на интефейсе.
так надо наоборот, понижать этот интервал, чтоб не успел никуда ткнуть. Насчет "on_current_record не успеет завершиться" - вы же таймер заводите самым последним действием в этой обработке - чтоб у вас там все сначала завершилось, а потом только Timer ставите и следом сразу должен быть Exit Sub. Так что там никаких больших задержек не надо, с сотней это я вам просто общий смысл показывал, нужно просто формально стартануть таймер, где стоит закрытие формы - поставьте хоть единицу.