Технические приемы работы с формамиИсточник: Accessboom
Закрытие формы из другой формы: Из одной формы частенько необходимо закрывать другую форму. Можно, конечно, перенести точку ввода на нее и выполнить команду и потом перенести точку ввода обратно на нашу форму: 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 ' а вот и стандартная майкрософтовская функция 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. это обращение формы к самой себе) необходимый метод или свойство и перенесите его в обращение к удаленной форме. |