Dim Игра(1 To 30) As типИгра 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Dim Игра(1 To 30) As типИгра



Теперь можно использовать операторы:

Игра(16).Название = "StarCraft" 'название 16-й игры

Игра(8).Персонаж(12) = "Солдат" 'двенадцатый персонаж восьмой игры

Debug.Print Игра(16).Название, Игра(8).Персонаж(12)

 

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

'Сначала создаем пользовательский тип персонажа,

'так как без него нельзя определить пользовательский тип игры:

Private Type типПерсонаж

Имя 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 можно использовать и при работе с массивами.

Рамка (Frame)

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

Поместите на форму элемент управления Frame, придав ему довольно большие размеры. Затем возьмите из Toolbox и поместите внутрь этой рамки несколько других элементов управления, в том числе еще один Frame. А теперь передвиньте рамку по форме. Вы видите, что объекты внутри рамки передвинулись вместе с ней. Посмотрите на значения свойств Top и Left любого объекта внутри рамки. Теперь это координаты не относительно формы, а относительно рамки.

Если вы захотите мышкой переместить в рамку уже размещенный на форме объект, у вас ничего не получится. Оказавшись внутри границ рамки, он не стал "своим". Убедитесь в этом, сдвинув рамку в сторону. Все уехали, объект остался на месте. Чтобы добиться желаемого, вырежьте (Cut) объект со старого места и наклейте (Paste) в рамку. Аналогичная ситуация, когда вы попытаетесь обнять новой или старой рамкой уже существующие объекты.

 

Рамка является удобным средством объединения элементов управления по смыслу. Пример:

 

 

В программе вы можете изменять значения свойств рамки Top, Left. Объекты, объединенные в рамке, будут при этом перемещаться вместе с ней. Вы можете изменять значения свойств рамки Visible, Enabled. При этом точно так же будут меняться значения этих свойств всех объектов, объединенных в рамке. Это полезно тогда, когда у вас на форме слишком много объектов и все они свободно не умещаются на ней. Вас может выручить то, что не все они нужны одновременно. Разделите их между наложенными друг на друга рамками и в каждый момент времени делайте видимой только одну из них.

 

Поэкспериментируйте с цветами, границей, шрифтом рамки.

 

Способностями, аналогичными рамке, обладает и объект PictureBox. Проверьте - в нем точно так же можно размещать элементы управления. Мы знаем и еще один такой объект. Это, конечно же, сама форма. Все подобные объекты называются контейнерами.



Поделиться:


Последнее изменение этой страницы: 2016-08-12; просмотров: 221; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.147.89.85 (0.031 с.)