Опубликовано: 05 июл 03
Рейтинг:
Рейтинг:
Автор: Geo, Владимир Саныч
Прислал: Георгий
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. Ускорение работы программ.
При построении выражений, определяющих ссылки на объект, следует иметь в виду, что:
Кроме того, если в некотором фрагменте кода встречаются две и более ссылок на некоторый объект, присвойте его объектной переменной или используйте блок 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 обращается к нему. Если же форма не имеет модуля, то такое обращение приведет к ошибке. Более подробную информацию о работе с экземплярами форм и об этом способе обращения к формам см. в https://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
Комментарии
заказать продвижение сайта 4 гейм логин в скайпе SEO PRO1
дай бог автору здоровья, очень помог!
Спасибо автору, еще вопрос, если он актуален можно и в тему дописать: Как получить/назначить значение, если элемент управления - поле со списком содержит несколько столбцов, как сослаться на конкретный столбец или на присоединенный?
Большое спасибо!! Очень помогло!!!
Прошу прощения, ранее я заблуждался.
Способ "Form_название_формы.Поле" работает для случая, когда каждая форма запускается в единственном экземпляре. Теперь пользуюсь только рецептами данного топика.
Хотя FAQ очень полезный, но я сразу начинал пользоваться доступом через имя модуля:
Form_название_формы.Поле и проблем не знаю. Очень удобный и простой способ. И не парьтесь синтаксисом древнего 97 Аксесса!
Большое спасибо! Очень пригодилось!
Спасибо )
"но в тогда вы будете действовать"
Лишняя буква "в".
если б так книги по аксессу писали)
мне помогло
ЗАЖИБИСЯ. по сути
Кратко, сжато и полезно
очень доступно
то что нужно!
Надо книгу издать.
вот так бы весь ассесс
Владимир Саныч ты молодец
Благодарю за прекрасное изложение. Очень помогло!
А как ссылаться на поля в Таблице? Не в форме..
Есть ли отличия в случае отчетов и подотчетов?
Ликбез для начинающих ИМХО. Грейт респект.
полно и по сути