Читайте также: |
|
Имя As String
Здоровье As Integer
Оружие As String
End Type
'Затем создаем пользовательский тип игры:
Private Type типИгра
Название As String
Объем As Integer
Графика_хорошая As Boolean
Персонаж(1 To 20) As типПерсонаж 'Не больше 20 персонажей в одной игре
End Type
'Отводим в памяти место под информацию об играх:
Dim Игра(1 To 30) As типИгра
Private Sub Form_Load()
Игра(8).Персонаж(12).Имя = "Солдат"
Игра(8).Персонаж(12).Здоровье = 140
Debug.Print Игра(8).Персонаж(12).Имя, Игра(8).Персонаж(12).Здоровье
End Sub
Если вы захотите более подробно описать оружие, то можете создать еще один пользовательский тип. И так далее. Массивы и пользовательские типы могут вкладываться друг в друга, как матрешки, до бесконечности. Так создаются иерархии данных практически в любой области знаний.
Задание 121: Создайте базу данных о своих родственниках. О каждом родственнике должно быть известно:
· Имя
· Год рождения
· Цвет глаз
Массивы не используйте. Программа должна:
· Распечатать ваш возраст и цвет глаз
· Ответить на вопрос – правда ли, что ваш дядя старше тети.
Задание 122: Создайте базу данных о своих однокашниках. О каждом однокашнике должно быть известно:
· Фамилия
· Имя
· Пол
· Год рождения
Обязательно используйте массив не меньше, чем из 10 записей. Программа должна:
· Вычислить средний возраст ваших однокашников
· Определить, кого среди них больше – дам или кавалеров
· Ответить на вопрос – есть ли в вашей базе тезки (это нелегко).
Базы данных являются настолько распространенным средством хранения информации, что в Visual Basic есть специальные мощные инструменты для работы с ними. Мы рассмотрим их в Глава 22.
Коллекции
Объектные переменные
В предыдущих разделах вы видели, что значением переменной величины может быть сложная структура данных. Но переменная может иметь своим значением и еще более сложную вещь - объект.
Понятие объекта - сложное понятие программирования. Частными случаями объектов в Visual Basic являются формы и элементы управления. Исчерпывающее описание работы объектов выходит за рамки курса для начинающих. В этой главе мы только вскользь знакомимся с ними. В Глава 20 я попытался дать основные понятия об этой области программирования.
В Visual Basic существует несколько типов, к которым может принадлежать объект. Самый общий тип - это Object. Если мы напишем Dim A As Object, то переменная A сможет принимать значения любых объектов. В нижеприведенном примере она сначала принимает значение метки, а затем формы. Для того, чтобы присвоить переменной значение существующего объекта, простой оператор присваивания не подходит, нужно писать так: Set A = 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 можно использовать и при работе с массивами.
Дата добавления: 2015-11-16; просмотров: 50 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Пользовательский тип данных | | | Рамка (Frame) |