Работа с коллекцией

Lenivec

допустим у нас есть коллекция значений с ключами: oColбейсик позволяет обращаться к значению по ключу следующим образом:oCol.Item("ключ")
14 ответов

Lenivec

блин случайно запостил...итак:oCol.Item("ключ")или сокращенный вариантoCol("ключ") так как Item это метод по умолчаниюно есть еще третий вариантoCol![ключ]что за конструкция?


Lenivec

Устаревшая конструкция, отход от которой рекомендовался, ЕМНИП, ещё во времена VB 4.0, но продолжающая спокойно работать. Означает почти то же самое - обращение к элементу коллекции, являющейся свойством по умолчанию. "Почти" потому, что нельзя в таком синтаксисе использовать численный ключ.


Lenivec

Про устаревшую не знал, спасибо!Про то что это обращение к элементу коллекции это понятно. Невозможность использовать числовой индекс это понятно. Как и невозможность использовать в качестве ключа строковую переменную в которой храниться имя ключа.Хотелось просто понять, это просто другой синтаксис или что то еще.


Lenivec

Да, это другой синтаксис. Нет, это стандартнй синтаксис. Этот синтаксис работает в VB и VBA, но не работает в VBScript.


Lenivec

> Автор: Antonariy> Да, это другой синтаксис. Нет, это стандартнй синтаксис. Этот синтаксис работает в VB и VBA, но не работает в > VBScript.Почему-то этот синтаксис чаще всего употребляют при работе с рекордсетом - RS![имя поля]


Lenivec

Скорее всего потому что люди считают, что это фишка именно рекордсета. Когда-то я тоже так считал.


Lenivec

да не только с рекордсетомв документации часто вижу строчки кода обращения к коллекциям типа Forms или Controls именно через восклицательный знак, а обращение к коллекциям созданным пользователем, через методв общем странно это все и загадочно :)


Lenivec

Lenivec,возможно, потому, что не всегда у коллекции, созданной пользователем, метод/свойство обращения к элементу имеет атрибут "по умолчанию" (в частности, в VBA IDE диалог свойств процедуры урезан настолько, что в нём нельзя выставить атрибуты, в отличие от VB; при этом, если модуль экспортировать в текстовый файл, добавить, что нужно, в текстовом редакторе, и импортировать назад, атрибуты "подхватываются"). Поэтому для надёжности используют синтаксис с именем метода.


Lenivec

да, верно, но использование восклицательного знака это не объясняет :)


Lenivec

А вам какое объяснение нужно? Лично я использую такую запись потому что она лаконичней.


Lenivec

да, верно, но использование восклицательного знака это не объясняет :)
There are three ways to refer to an object in a collection. The fastest way is to provide the name of the collection followed by the name of the object to which you are referring, as shown in the following examples:Forms!EmployeesQueryDefs![Current Product List]Use the ! operator to separate the name of the collection from the name of the particular object within it. Also, if the name of the object contains spaces, you must enclose it in brackets. In most cases, you’ll know the name of the object to which you’re referring, and you should use this syntax. Occasionally, however, you may not know the name of the object until the procedure is running. In this case, you can use a string variable to represent the name of the object. In the following examples, strFormName and strQueryDefName are string variables that contain the name of a Form object and a QueryDef object.Forms(strFormName)QueryDefs(strQueryDefName)If the value of strFormName is "Employees" and the value of strQueryDefName is "Current Product Name", then the previous example is equivalent to the following lines of code:Forms("Employees")QueryDefs("Current Product Name")You can also refer to an object in a collection by its index number. Like the elements of an array, each object in a collection has an index number that refers to its position in the collection. The following examples use the index number to refer to a particular object in a collection.Forms(0)QueryDefs(1)
MSDN


Lenivec

да, верно, но использование восклицательного знака это не объясняет :)
О как :) Можно понять двояко, по меньшей мере: 1) почему используется восклицательный знак вообще? 2) почему используется восклицательный знак для обращения к объектам стандартных библиотек?На первый вопрос ответ указал qwrqwr: наличие элемента языка определяется синтаксисом языка, а объяснение использования даётся в описании языка/руководстве программиста.На второй вопрос ответ мне видится таким (как бы недописанной половиной моего предыдущего поста): потому что достоверно известно, что в стандартных библиотеках у соответствующих методов атрибут "по умолчанию" выставлен, следовательно, можно без опаски использовать восклицательный знак, а что в конкретном месте безопасного использования писателю в голову стукнуло в голову - традиции, Copy-Paste, лень, стремление к выразительности(?) или к лаконичности, и т. д. - да хто шь яво знаить. "Голова - предмет тёмный, и исследованию не подлежит" (с).


Lenivec

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


Lenivec

по поводу ответа qwrqwr ну в общем вопрос изначально так и задавался, что существует несколько вариантов обращения, то есть информация приведенная вами и содержалась в моем первом посте, то есть я в курсе того что написано в руководствеto 13-й квартал меня скорее интересовал первый вопрос чем второйно что конкретно я хотел услышать я сам точно не знаю, так чет неделя тяжелая была, много работы и меня тупо переклинило :)наверно наиболее близкий ответ к тому что я ожидал услышать это то что вы ответили сразу, так сложилось исторически :)