Технические приемы работы с формами

Закрытие формы из другой формы:

Из одной формы частенько необходимо закрывать другую форму. Можно, конечно, перенести точку ввода на нее и выполнить команду и потом перенести точку ввода обратно на нашу форму:

Forms!frmПример.SetFocus

DoCmd.Close ' закрываем форму frmПример

Forms!frmНашаФорма.SetFocus

Приходилось встречать такой наворот - и он нормально работает :)

закрыть любую открытую форму, на вопрос о возможном сохранении изменений отвечая "да", не перенося на нее фокус ввода - 

        DoCmd.Close acForm, "frmПример", acSaveYes

вообще-то, правильно было бы сделать вот так:

    If IsLoaded("frmПример") Then DoCmd.Close acForm, "frmПример", acSaveYes

но для этого надо держать в отдельном модуле функцию IsLoaded:

Public Function IsLoaded(strName As String, Optional lngType As Long = acForm) As Boolean
    ' Is the specified form loaded?
    IsLoaded = (SysCmd(acSysCmdGetObjectState, lngType, strName) <> 0)
End Function
крайне рекомендую к включению этой функции во все Ваши проекты, кстати, она поставляется с учебной базой Борей (NorthWind ). Еще не раз пригодится. Сравните стандартную и опубликованные мною функции IsLoaded - оказывается, можно даже и здесь оптимизировать ;). Код взят с англоязычного ресурса....

' а вот и стандартная майкрософтовская функция

Function IsLoaded(strFormName As String) As Boolean

' IsLoaded = (SysCmd(acSysCmdGetObjectState, acForm, strFrmName) = acObjStateOpen)

' Возвращает значения True, если форма открыта в режиме формы или таблицы

Const conObjStateClosed = 0

Const conDesignView = 0

If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then

    If Forms(strFormName).CurrentView <> conDesignView Then

        IsLoaded = True

    End If

End If

End Function

Обращение к форме, контролам на ней и процедурам событий в модуле формы из других форм:

Тут необходимо сказать пару вступительных слов слов про коллекцию объектов форм Forms. Все открытые формы автоматически добавляются Access'ом в эту коллекцию. Обратите внимание, в этой коллекции присутствуют только открытые на момент выполнения кода формы. Если форма еще не открыта, произойдет ошибка. Поэтому при любых обращениях к формам используйте для проверки функцию IsLoaded ( см.выше ).

Также используйте префикс форм frm.  Потом в коде удобно ориентироваться, также в окнах различных построителей видно - где форма (frm), где таблица (tbl), а где запрос (qry). Если форма подчиненная используйте префикс (fsub). Лично у меня во всех примерах так.

Различные варианты обращения к формам:

Forms!frmПример ' стандартная форма обращения - наиболее широко распространена

Forms![Форма Заказа]  ' если есть пробелы в названии формы - необходимо имя брать в кавычки. 

Категорически не рекомендую использовать пробелы в именах при именовании любых объектов!

Forms("frmПример") ' можно и так обращаться, это уже кому как нравится

Forms(0) ' можно обращаться и по индексу формы (это же все-таки коллекция).

Правда необходимо точно знать индекс открытой формы, а он постоянно меняется, в зависимости от последовательности открывания форм. Возможно, его удобно использовать для обработки всех открытых форм в циклах.

Особенно рьяные фанаты программирования ;) не рекомендуют использовать русские имена объектов, но у меня за несколько лет проблем в Access не было. Я вот использую такие смешанные англо-русские имена.

Например, открыта текущая форма frmSimple и из нее установим фокус ввода на другую форму

Forms!frmПример.SetFocus

но учтите, что если в коде потом идет, например, DoCmd.Close, то закроется именно форма frmПример, так как команды программного кода исполняются уже в ней (где установлен фокус). Внимательно следите за переводом фокуса из формы в форму. 

Forms!frmПример.Requery ' обновим набор данных формы, находясь в форме frmSimple.

Чтобы получить список всех свойств и методов для работы с "удаленными" формами, напишите Me. (с точкой), выберите из выпадающего списка (Me. это обращение формы к самой себе) необходимый метод или свойство и перенесите его в обращение к удаленной форме.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=7336