Опубликован: 31.08.2006 | Доступ: свободный | Студентов: 3925 / 218 | Оценка: 4.14 / 3.89 | Длительность: 39:16:00
ISBN: 978-5-9570-0021-3
Лекция 12:

Использование массивов и коллекций для управления данными

Защита содержимого массива с помощью ReDim Preserve

В предыдущем упражнении для указания размера динамического массива во время выполнения программы использовался оператор ReDim. Однако с оператором ReDim связано одно важное ограничение: если вы изменяете размер массива, который уже содержит данные, все существующие данные будут полностью потеряны. После выполнения оператора ReDim содержимое динамического массива устанавливается на значение по умолчанию, такое, как ноль или null. В зависимости от вашей точки зрения это может рассматриваться либо как полезная функция очистки содержимого массива, либо как досадная функция, которая требует поиска обходных путей решения проблемы.

К счастью Visual Basic .NET предоставляет такую же полезную функцию для изменения размера массива, которую предоставлял и Visual Basic 6: ключевое слово Preserve, которое можно использовать для сохранения данных в массиве при изменении его размера. Синтаксис ключевого слова Preserve имеет следующий вид:

ReDim Preserve Имя_массива(размер1, размер2, ...)

В таком операторе изменения размера массив должен иметь такое же количество измерений и содержать тот же самый тип данных. В дополнение к этому существует дополнительное ограничение, состоящее в том, что вы можете изменить размер только последнего измерения массива. Например, если массив имеет два или более измерений, вы можете изменить размер только последнего измерения и сохранить при этом содержимое массива. (Одномерные массивы автоматически проходят этот тест, так что вы спокойно можете расширять размер таких динамических массивов с помощью ключевого слова Preserve.)

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

Если вы с помощью следующей записи объявили динамический строковый массив с именем Philosophers:

Dim Philosophers() As String

измените его размер и добавьте в него данные с помощью кода, аналогичного следующему:

ReDim Philosophers(200)
Philosophers(200) = "Стив Гаррисон"

Можно увеличить размер массива Philosophers до 301 элемента (0-300) и сохранить существующее содержимое с помощью следующей записи:

ReDim Preserve Philosophers(300)

Более сложный пример, включающий трехмерный массив, использует аналогичный синтаксис. Представьте, что вы используете в вашей программе трехмерный массив с именем myCube для хранения чисел с плавающей точкой одинарной точности. Массив myCube можно объявить с помощью следующей конструкции:

Dim myCube(,,) As Single

Затем можно изменить размер массива и добавить в него данные с помощью следующего кода:

ReDim myCube(25, 25, 25)
myCube(10, 1, 1) = 150.46

после чего увеличить размер третьего измерения массива (сохранив при этом содержимое массива) с помощью следующей записи:

ReDim Preserve myCube(25, 25, 50)

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

Немного поэкспериментируйте с ReDim Preserve и посмотрите, как вы можете его использовать, чтобы сделать ваши собственные массивы более гибкими и удобными.

На этом работа с массивами пока закончена. В остальной части этой лекции речь пойдет о коллекциях.

Работа с коллекциями объектов

В предыдущем разделе вы узнали об использовании массивов для хранения информации при выполнении программы. В этом разделе вы изучите коллекции - еще один метод работы с объектами элементов управления и другими данными в программах на Visual Basic. Вы уже знаете, что объекты в форме хранятся вместе в одном и том же файле. Но знаете ли вы о том, что Visual Basic рассматривает эти объекты как члены одной и той же группы? В терминологии Visual Basic весь набор объектов формы называется коллекцией элементов управления ( Controls ). Коллекция Controls создается автоматически при создании новой формы, и когда вы добавляете в форму новые объекты, они автоматически становятся частью этой коллекции. На самом деле Visual Basic поддерживает несколько стандартных коллекций объектов, которые можно использовать в программах. Далее вы узнаете о базовых приемах работы с любыми попадающимися вам коллекциями.

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

В дополнение к тому, что Visual Studio позволяет вам работать с объектами и коллекциями в ваших собственных программах, она еще позволяет просматривать вашу систему в поисках объектов других приложений и использовать их в ваших программах. Мы снова вернемся к этому вопросу в "Автоматизация приложений Microsoft Office и управление процессами" при изучении Visual Studio Object Browser (Обозревателя объектов).

Ссылка на объекты в коллекции

В коллекции можно ссылаться на объекты или на отдельные члены этих коллекций с помощью указания индекса положения объекта в группе. Visual Basic хранит объекты коллекции в порядке, обратном тому, в котором они создавались. Поэтому вы можете использовать порядок создания объектов для ссылки на эти объекты по одному, или использовать цикл для перебора нескольких из них. Например, чтобы определить последний созданный в форме объект, можно указать индекс 0, как показано в этом примере:

Controls(0).Text = "Бизнес"

Этот оператор устанавливает свойство Text последнего объекта формы на значение "Бизнес". (Второй от конца созданный объект имеет индекс 1, третий от конца объект - индекс 2, и т.д.) Учитывая эту логику важно, чтобы вы никогда не связывали конкретный объект формы со значением индекса - если в коллекцию будет добавлен новый объект, этот новый объект получит индекс 0, а остальные индексы объектов увеличатся на 1.

Следующий цикл For...Next отображает с помощью окна сообщения имена последних четырех добавленных в форму элементов управления:

Dim i As Integer
For i = 0 To 3
  MsgBox(Controls(i).Name)
Next i

Я указал этому циклу перебирать значения от 0 до 3, так как последний добавленный в форму элемент управления находится по индексу "0". В следующем разделе вы изучите более эффективный метод написания такого цикла.

Написание циклов For Each ... Next

Хотя на члены коллекции можно ссылаться индивидуально, наиболее эффективный способ работы с объектами в коллекциях - обрабатывать их как группы. На самом деле причиной существования коллекций является то, что вы, таким образом, можете более эффективно обрабатывать группы объектов: отобразить, переместить, отсортировать или изменить размер целой коллекции объектов одновременно.

Чтобы выполнить эту задачу, вы можете использовать для последовательного перебора объектов в коллекции специальный цикл For Each...Next. Цикл For Each...Next аналогичен циклу For \dots Next. Когда цикл For Each...Next используется вместе с коллекцией Controls, он выглядит так:

Dim CtrlVar As Control
...
For Each CtrlVar In Controls
  обработка объекта
Next CtrlVar

Переменная CtrlVar объявлена как переменная типа Control и представляет текущий объект коллекции. Controls (обратите внимание на конечную "s") - это класс коллекции, который представляет все объекты элементов управления текущей формы. Тело цикла используется для обработки отдельных объектов этой коллекции. Например, можно изменить свойства Enabled, Left, Top, Text или Visible объектов коллекции, или создать список имен всех объектов и поместить его в поле списка.

Переменная CtrlVar представляет текущий объект цикла For Each...Next.

Жанболат Шаймерден
Жанболат Шаймерден

Можно ли выбирать язык для надписей и команд в среде разработки?

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Светлана Ведяева
Светлана Ведяева
Россия, Саратов