TopPicLogo TopPicText

Как обратиться к полю формы или подчиненной формы

Автор: Geo, Владимир Саныч
По материалам: http://www.sql.ru/faq/faq_topic.aspx?fid=156

Вопросы

Q1: Как обратиться к объекту формы?
Q2: Как обратиться к объекту формы, имя которого вычисляется на лету или содержит специальные символы?
Q3: Как обратиться к объекту подчиненной формы?
Q4: Обращение к объекту формы из контекста этой формы.

Ответы

Чтобы прочитать или изменить содержимое или свойство объекта формы, в первую очередь надо составить выражение, позволяющее однозначно определить ссылку именно на этот объект.

Q1. Обращение к объекту формы

Выражение, определяющее ссылку на свойство .Value (значение) объекта формы, в общем виде выглядит так:

Forms![Форма1].Controls![Поле1].Value(1)

Обратите внимание, что операторы "!" и "." идут через один. Чередуются имена коллекций и их элементов, причем оператор "!" означает, что справа от него указан элемент коллекции, а оператор "." служит для обращения к свойству этого элемента (см. пп. 3.5 и 3.6).

Квадратные скобки ([] - в русифицированной версии Access они называются "прямыми") следует использовать, если имя элемента содержит внутренние пробелы или другие специальные символы (кроме, соответственно, "]" и "["), иначе их наличие не обязательно.

Серым цветом здесь и далее выделены коллекции и свойства, используемые Access'ом по умолчанию. Их также можно опускать, если при этом не возникнет двусмысленности. То есть выражение (1) может быть записано по-другому:

Forms![Форма1]![Поле1]



Будьте внимательны, если пользуетесь подобными сокращениями. В случае, когда форма содержит одноименные элементы различных коллекций, пропуск идентификатора коллекции может повлечь за собой неверную работу вашей программы (см. п. 3.6). Хороший способ избегать подобных "совпадений" - использовать префиксы в именах, например, поле "Поле1" в форме переименовать в "пфПоле1" и т.п.

Q2. Обращение к объектам, имена которых вычисляются "на лету" или не соответствуют "соглашению об именах"

В выражении (1), разделенные оператором ".", перечисляются связки типа

Коллекция![Имя элемента]

(2)


Любую из этих связок можно переписать в виде

Коллекция.Item("Строка - имя элемента")

(3)


где в качестве аргумента может быть указано любое выражение, возвращающее значение типа String, соответствующее имени существующего элемента коллекции, а также

Коллекция.Item(ПорядковыйНомерЭлементаВКоллекции) (4)


где ПорядковыйНомерЭлементаВКоллекции - выражение, возвращающее целое число (нумерация элементов в коллекции начинается с 0). При изменении состава коллекции (например, при удалении или добавлении поля в форму) нумерация элементов может измениться. Поэтому, прежде чем использовать выражение (4), следует убедиться, что элемент с данным порядковым номером действительно является тем элементом, к которому вы хотите обратиться. Выражение (4) можно использовать, например, если требуется в цикле перебрать все элементы коллекции.

Q3. Обращение к объекту подчиненной формы

Корректная ссылка на свойство подчиненной формы или отчета требует указания полного идентификатора формы 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

), строятся выражения для подчиненных форм третьего и далее уровней вложености.

Q4. Обращение к объекту формы из контекста этой формы

Для ссылки на текущий экземпляр объекта, в котором в данное время выполняется программа, рекомендуется использовать ключевое слово 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. Отличия . и ! .

Из системы помощи Microsoft Access 97
Операторы ! и . (точка) в идентификаторах указывают тип элемента, стоящего справа от оператора.
Оператор ! указывает, что следующий за ним элемент является элементом, определяемым пользователем (элементом семейства). Например, с помощью оператора ! определяют ссылку на открытую форму, отчет или элемент управления в открытой форме или отчете. (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

Назад ToTop
L.E. 22.11.2017
Рейтинг@Mail.ru