Как обратиться к полю формы или подчиненной формы
Автор: Geo, Владимир Саныч
По материалам: http://www.sql.ru/faq/faq_topic.aspx?fid=156
Q1: Как обратиться к объекту формы?
Q2: Как обратиться к объекту формы, имя которого вычисляется на лету или содержит специальные символы?
Q3: Как обратиться к объекту подчиненной формы?
Q4: Обращение к объекту формы из контекста этой формы.
Ответы
Чтобы прочитать или изменить содержимое или свойство объекта формы, в
первую очередь надо составить выражение, позволяющее однозначно
определить ссылку именно на этот объект.
Выражение, определяющее ссылку на свойство .Value (значение) объекта формы, в общем виде выглядит так:
Forms![Форма1].Controls![Поле1].Value(1)
Обратите внимание, что операторы "!" и "."
идут через один. Чередуются имена коллекций и их элементов, причем
оператор "!" означает, что справа от него указан элемент коллекции, а
оператор "." служит для обращения к свойству этого элемента (см. пп. 3.5
и 3.6).
Квадратные скобки ([] - в русифицированной версии Access они называются
"прямыми") следует использовать, если имя элемента содержит внутренние
пробелы или другие специальные символы (кроме, соответственно, "]" и
"["), иначе их наличие не обязательно.
Серым цветом здесь и далее выделены коллекции и свойства, используемые
Access'ом по умолчанию. Их также можно опускать, если при этом не
возникнет двусмысленности. То есть выражение (1) может быть записано
по-другому:
Forms![Форма1]![Поле1]
Будьте внимательны, если пользуетесь подобными сокращениями. В случае,
когда форма содержит одноименные элементы различных коллекций, пропуск
идентификатора коллекции может повлечь за собой неверную работу вашей
программы (см. п. 3.6). Хороший способ избегать подобных "совпадений" -
использовать префиксы в именах, например, поле "Поле1" в форме
переименовать в "пфПоле1" и т.п.
В выражении (1), разделенные оператором ".", перечисляются связки типа
Коллекция![Имя элемента]
(2)
Любую из этих связок можно переписать в виде
Коллекция.Item("Строка - имя элемента")
(3)
где в качестве аргумента может быть указано любое выражение,
возвращающее значение типа String, соответствующее имени существующего
элемента коллекции, а также
Коллекция.Item(ПорядковыйНомерЭлементаВКоллекции) (4)
где ПорядковыйНомерЭлементаВКоллекции - выражение, возвращающее целое
число (нумерация элементов в коллекции начинается с 0). При изменении
состава коллекции (например, при удалении или добавлении поля в форму)
нумерация элементов может измениться. Поэтому, прежде чем использовать
выражение (4), следует убедиться, что элемент с данным порядковым
номером действительно является тем элементом, к которому вы хотите
обратиться. Выражение (4) можно использовать, например, если требуется в
цикле перебрать все элементы коллекции.
Корректная ссылка на свойство подчиненной формы или отчета требует
указания полного идентификатора формы c использованием свойства Form
элемента управления - подчиненная форма:
Forms![Форма1].Controls![Форма2].Form.Controls![Поле1].Value
В данном примере:
Forms![Форма1].Controls![Форма2]
является ссылкой на элемент управления, в котором выводится подчиненная форма. А
Forms![Форма1].Controls![Форма2].Form
является ссылкой на саму подчиненную форму.
Указание свойства Form для ссылки на подчиненную форму или на ее
свойства является обязательным для MS Access версии 97 и желательным для
версий 2000-2003.
Аналогичным образом, с помощью вставки выражений типа
.Controls![Форма2].Form
(или
.Controls("Форма2").Form
), строятся выражения для подчиненных форм третьего и далее уровней вложености.
Для ссылки на текущий экземпляр объекта, в котором в данное время
выполняется программа, рекомендуется использовать ключевое слово Me. Все
процедуры, связанные с текущим объектом, имеют доступ к объекту,
указываемому с помощью слова Me. Пример использования слова Me в модуле
формы, содержащей поле Поле1:
Me.Controls![Поле1].Value
Примечания
1. Построитель выражений некоторых русифицированных версий Microsoft
Access автоматически ставит несуществующую инструкцию [Форма] вместо
[Form]. Для корректной работы программы следует вручную исправить
полученное выражение.
2. Некоторые построители выражений обособляют все названия полей и форм,
а также ключевые слова квадратными скобками, например так:
[Forms]![Форма1]![Форма2].[Form]![Поле1].[Value]
В принципе, их использование необходимо только для элементов, чьи имена
содержат внутренние пробелы или другие специальные символы (за
исключением самих квадратных скобок - тогда надо пользоваться
выражениями типа (3) или (4)).
3. В Соглашении об именах полей, элементов управления и объектов
сказано, что имя может включать любую комбинацию букв, цифр, пробелов и
специальных символов за исключением точки (.), восклицательного знака
(!), надстрочного символа (`), квадратных скобок ([ ]) и управляющих
символов (с кодами ASCII от 0 до 31), а также не должно начинаться с
символа пробела. Однако вы легко сможете создать объект, имя которого
нарушает эти правила. Если вы решили спорить с программистами Microsoft,
то следует быть готовым к тому, что, например, Пробелы в именах могут
при некоторых обстоятельствах вызывать конфликты в программах Visual
Basic .
4. Обратите внимание: название формы, под которым она хранится в файле
базы данных, и имя (Name) объекта .Control, содержащего эту подчиненную
форму, которое и следует использовать в ссылках, не одно и то же!
5. Отличия . и ! .
Операторы ! и . (точка) в идентификаторах указывают тип элемента, стоящего справа от оператора.
Оператор ! указывает, что следующий за ним элемент является элементом,
определяемым пользователем (элементом семейства). Например, с помощью
оператора ! определяют ссылку на открытую форму, отчет или элемент
управления в открытой форме или отчете. (Forms![Заказы]![КодЗаказа])
Оператор . (точка) обычно указывает, что следующий за ним элемент
определен в Microsoft Access. Например, оператор . (точка) используется
для ссылок на свойства форм, отчетов и элементов управления. Допускается
также использование оператора . (точка) для ссылок на значение поля в
инструкции SQL, метод Visual Basic for Application или семейство.
Например, идентификатор Forms![Заказы].Controls представляет ссылку на
семейство Controls формы Заказы.
6. Совпадающие наименования полей, переменных, полей данных.
В системе помощи Microsoft Access описаны довольно обширные правила
наименования объектов, суть которых сводится к рекомендации давать
уникальные имена полям таблиц, самим таблицам, формам, переменным,
функциям и пр. Причем имена не должны совпадать с длинным перечнем
зарезервированных слов. Эти правила можно нарушить, но тогда вы будете
действовать на свой страх и риск.
Несмотря на вышеуказанные правила, встроенные мастера создания форм
создают поля с именами, совпадающими с именами соответствующих полей
таблицы - источника данных. В этом случае следует использовать полный
синтаксис обращения к объектам.
7. Ускорение работы программ.
При построении выражений, определяющих ссылки на объект, следует иметь в виду, что:
программа, использующая ключевое слово Me, выполняется быстрее, чем
использующая полный синтаксис имени объекта. Причем чем больше уровень
вложенности подчиненной формы, тем больший выигрыш в скорости вы
получите, используя слово Me.
если вам требуется обратиться к свойству .Value (значение) объекта, ключевое слово .Value лучше опустить.
выражение типа (3) выполняется медленнее, чем (2) и (4).
Кроме того, если в некотором фрагменте кода встречаются две и более
ссылок на некоторый объект, присвойте его объектной переменной или
используйте блок With. Каждый раз, когда вы ссылаетесь на объект,
Access'у приходится выяснять, к какому объекту относится ссылка, что
приводит к выполнению лишней работы. Но если, например, присвоить ссылку
на объект переменной, Access ищет объект всего один раз и кэширует
ссылку на него в памяти.
Имейте в виду, что в случае с объектной переменной после окончания использования ее следует очистить:
Set objVar = nothing
8. Вместо инструкции .Value, использованной в большинстве примеров,
может быть указано любое доступное свойство или метод объекта формы,
например, .Name, .Width, .Enabled, .Tag и т.д. Если требуется прочитать
или изменить именно содержимое объекта, то инструкцию .Value можно не
использовать.
9. Все вышесказанное в равной мере относится и к отчетам, если заменить
все вхождения ключевых слов Form и Forms на Report и Reports.
10. Некоторые программисты предпочитают обращаться к форме не как
Forms![Форма1], а как Form_Форма1. При использовании этого способа надо
иметь в виду, что Form_Форма1 - это обращение не к форме, а к ее классу.
Если экземпляр этой формы уже создан (форма открыта), то Access
обращается к нему. Если же форма не имеет модуля, то такое обращение
приведет к ошибке. Более подробную информацию о работе с экземплярами
форм и об этом способе обращения к формам см. в
http://www.sql.ru/faq/faq_topic.aspx?fid=240.
Примеры
Допустим, есть форма [Главная], содержащая подчиненную форму
[Подчиненная]. Приведу несколько способов обращений к полям и свойствам
подчиненной формы.
Еще раз напомню, что название контрола главной формы может отличаться от
имени формы (которое видно в окне базы данных). Узнать название
контрола можно, один раз щелкнув по нему в конструкторе главной формы
правой кнопкой мыши (при этом должна выделиться вся подформа, а не
какой-либо из ее элементов, как может делать Access 2000 и более поздних
версий), и выбрав пункт меню свойства - имя контрола будет показано в
заголовке появившегося окна свойств, а имя формы в поле
"Объект-источник" вкладки "Данные". Обращаться к объектам подчиненной
формы можно только по названию контрола, содержащего ее в главной форме.
1. Значение поля [Поле1]
Forms![Главная].Controls![Подчиненная].Form.Controls![Поле1].Value
Forms![Главная]![Подчиненная].Form![Поле1]
Forms("Главная").Controls("Подчиненная").Form.Controls("Поле1").Value
Forms("Главная")("Подчиненная").Form("Поле1").Value
Forms(i)(j).Form(k).Value ' Где i, j, k - числовые переменные типа integer с заранее известными и заполненными значениями
2. Свойство .Enabled поля [Поле1]
Forms![Главная].Controls![Подчиненная].Form.Controls![Поле1].Enabled
Forms![Главная]![Подчиненная].Form![Поле1].Enabled
Forms("Главная").Controls("Подчиненная").Form.Controls("Поле1").Enabled
Forms("Главная")("Подчиненная").Form("Поле1").Enabled
Forms(i)(j).Form(k).Enabled
3. Вызов метода .SetFocus поля [Поле1]
Forms![Главная].Controls![Подчиненная].Form.Controls![Поле1].SetFocus
Forms![Главная]![Подчиненная].Form![Поле1].SetFocus
Forms("Главная").Controls("Подчиненная").Form.Controls("Поле1").SetFocus
Forms("Главная")("Подчиненная").Form("Поле1").SetFocus
Forms(i)(j).Form(k).SetFocus
4. Свойство .RecordsetClone формы [Подчиненная]
Forms![Главная].Controls![Подчиненная].Form.RecordsetClone
Forms![Главная]![Подчиненная].Form.RecordsetClone
Forms("Главная").Controls("Подчиненная").Form.RecordsetClone
Forms("Главная")("Подчиненная").Form.RecordsetClone
Forms(i)(j).Form.RecordsetClone