Лекция: Коллекции

Объектные переменные

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

Понятие объекта — сложное понятие программирования. Частными случаями объектов в Visual Basic являются формы и элементы управления. Исчерпывающее описание работы объектов выходит за рамки курса для начинающих. В этой главе мы только вскользь знакомимся с ними. В Глава 20 я попытался дать основные понятия об этой области программирования.

В Visual Basic существует несколько типов, к которым может принадлежать объект. Самый общий тип — это Object. Если мы напишем Dim A As Object, то переменная A сможет принимать значения любых объектов. В нижеприведенном примере она сначала принимает значение метки, а затем формы. Для того, чтобы присвоить переменной значение существующего объекта, простой оператор присваивания не подходит, нужно писать так: SetA = Label1.

Создайте проект с меткой.

Private Sub Command1_Click()

Dim A As Object

Set A = Label1

A.FontSize = 20

A.Caption = «Привет!» 'Меняется надпись на метке

Set A = Form1

A.Caption = «Еще один привет!» 'Меняется надпись на форме

End Sub

Вы видите, что как только мы присвоили переменной A значение метки Label1, мы смогли вместо Label1.FontSize = 20 писать A.FontSize = 20.

Объектный тип Control — это тип элементов управления. Если мы напишем Dim A As Control, то переменная A сможет принимать значения не любых объектов, а только элементов управления.

Зачем все это нужно? Один из примеров применения объектной переменной вы найдете чуть ниже в этом же разделе, где объектная переменная в цикле пробегает значения элементов управления на форме. Другой пример, когда объект является параметром процедуры, вы найдете в 17.7.

Коллекции

Коллекции так же относятся к пользовательским типам данных, как массивы элементов управления к массивам переменных величин. Коллекция- это набор элементов разного типа, таких как элементы управления, другие объекты. Коллекция и сама является объектом (а почему бы и нет? — коробки в коробке). Коллекции всеядны, они позволяют иметь в одном наборе и кнопку и метку и переменную величину типа Integer. Я ограничусь распространенным случаем, когда в коллекцию входят только элементы управления.

Задача: На вашей форме имеется несколько десятков кнопок, меток и текстовых полей, которые делают свое дело, скажем, помогают обрабатывать банковскую информацию — кто принес деньги, сколько принес, в долларах или рублях, да сколько денег у него стало, да сколько всего в банке денег и т.д. Вам нужно, чтобы в некоторый момент выполнения программы такие-то и такие-то кнопки, метки и текстовые поля из самых разных мест формы (всего, скажем, дюжина объектов) поменяли размер шрифта. Ну, скажем, для того, чтобы привлечь к себе внимание. А в какой-нибудь другой момент эта же дюжина должна сделать что-нибудь другое, например, кнопки из этой дюжины должны быть деактивированы, чтобы на них случайно не нажали. И так далее.

Решение: Создадим проект. Для простоты разместим на форме только шесть элементов управления: Label1, Text1, Command1, Label2, Text2, Command2. Пусть в нашу «дюжину» входят из них только Label2, Text2, Command2. Программным путем создадим коллекцию из этих объектов. Для этого сначала придумаем ей имя Моя_коллекция и объявим ее так:

Dim Моя_коллекция As New Collection

Слово Collectionозначает коллекцию. Слово Newмы пишем тогда, когда создаем новый объект (а коллекция — объект).

Коллекция объявлена, но пока она пуста. Теперь будем по очереди добавлять объекты в коллекцию подобно тому, как в 13.6 мы добавляли объекты в массив. Но здесь другая грамматика. Смотрим программу:

Dim Моя_коллекция As New Collection 'Объявляем коллекцию

 

Private Sub Command1_Click()

Моя_коллекция.Add Label2 'Добавляем в коллекцию 1-й элемент

Моя_коллекция.Add Text2, «Текстик» 'Добавляем в коллекцию 2-й элемент

Моя_коллекция.Add Command2, «Кнопочка» 'Добавляем в коллекцию 3-й элемент

 

Debug.Print Моя_коллекция.Count 'Печатается 3 — число элементов в коллекции

Debug.Print Моя_коллекция (1).Caption 'Печатается «Label2»

Моя_коллекция (3).Height = 800 'Задается высота кнопки Command2

Моя_коллекция («Текстик»).BackColor = vbYellow 'Задается цвет поля Text2

 

For Each Мой_объект InМоя_коллекция 'ДЛЯ КАЖДОГО объекта В коллекции

Мой_объект.FontSize = 18 'задается размер шрифта

Next

 

For Each Мой_объект In Моя_коллекция 'ДЛЯ КАЖДОГО объекта В коллекции

If TypeName(Мой_объект) = «CommandButton» Then 'если имя типа объекта — CommandButton, то

Мой_объект.Enabled = False 'деактивировать ее

End If

Next

 

Моя_коллекция.Remove 2 'Удаляем из коллекции второй элемент

Моя_коллекция.Remove «Кнопочка» 'Удаляем из коллекции кнопку

End Sub

Пояснения: У коллекций есть несколько методов, три из них (Add, Remove, Count) я сейчас поясню:

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

Метод Countпросто сообщает число элементов в коллекции:

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

Чтобы удалить отдельный элемент из коллекции (не с формы), используется метод Removeс указанием индекса или ключа элемента.

 

Для коллекций удобно применять специальную разновидность оператора цикла — For Each. Для этого необходимо придумать имя переменной величине, значение которой будет пробегать все элементы коллекции. Мы придумали имя Мой_объект. Когда цикл выполняется в первый раз, Мой_объект «равняется» 1-му элементу коллекции, во второй раз — 2-му и т.д., пока элементы не будут исчерпаны. В остальном синтаксис и порядок выполнения оператора For Each такой же, как и у привычного нам For. Здесь я не объвлял переменную Мой_объект, а мог бы и объявить — Dim Мой_объект As Control.

Здесь мы использовали функцию TypeName, чтобы выбрать из всех элементов коллекции только элементы данного типа. Пояснять ее я не буду, используйте дальше по аналогии. Вообще, вы чувствуете, что с этими коллекциями мы ступили на зыбкую для нас почву работы с объектами? Зыбкая она потому, что мы пока про работу с объектами почти ничего не знаем. Ну что ж, получше узнаем мы ее в Глава 20, а пока вам хватит того, что вы уже узнали.

 

Кстати, оператор For Each можно использовать и при работе с массивами.

еще рефераты
Еще работы по информатике