Вы можете использовать коллекции с тем, чтобы группировать наборы связанных элементов, обычно - объектов, которые могут быть любого типа. Коллекции предоставляют механизм для работы с хранящимися в контейнерах объектами и включают в себя стандартные способы доступа и перебора объектов коллекции. Класс Collection функционирует как истинный контейнерный класс, хотя он и не включает себя метода AddObject, что используется в контейнерных классах типа Form и PageFrame.

Класс Collection представляет собой базовый класс, так что вы можете субклассировать его в программах (.prg) или файлах библиотек визуальных классов (.vcx).

Collection

Примечания

При изменениях, происходящих в коллекции, позиция конкретного элемента может также изменяться.

Коллекции поддерживают перебор элементов, производимый с помощью команды FOREACH, основанный на позиции элемента в коллекции. Вы можете управлять позицией этих элементов, используя должным образом параметры eBeforeItem и eAfterItem, связанные с методом Add для объектов коллекции. Вы можете использовать индексное значение 1, или перечисление, основанное на индексе, начинающимся с 1, для ссылки на первый объект в коллекции, или вы можете использовать значение ключа, путем соответствующей установки значения свойства KeySort. Индексы коллекций основаны на начальном значении равным 1, в отличие от 0-based, принятых во многих других языках, для согласованности и совместимости с другими внутренними коллекциями Visual FoxPro.

Убедитесь в том, что либо все элементы в коллекции имеют ключи или ни один из них не имеет ключей (выделено переводчиком). Решение дилеммы - либо все элементы коллекции будут иметь ключи, либо ни один не будет иметь их, приведет к повышению эффективности поиска элементов, при использовании метода Item в отношении элементов коллекции и использования команды FOR EACH.

Вы можете использовать коллекцию в серверах Visual FoxPro Component Object Model (COM), для того, чтобы прочие COM серверы могли иметь к ним доступ.

Вы можете спрятать методы Add и Remove, применямые в отношении элементов объектов коллекций, от глобального использования, путем субклассирования объектов коллекций и маркировки субклассированных членов, как Hidden или Protected. Если вы выполните эту рекомендацию, то вы сможете добавлять членов коллекции в методе, ассоциированном с событием Init или через какие-то другие методы.

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

Поскольку объекты Collection поддерживают методы, определенные по умолчанию, например, Item (Collection Class), вам необходимо быть осведомленным о порядке поиска для этих методов. Метод объекта Collection имеет преимущество перед стандартными вызовами функций, определенных пользователем (UDF). Ниже приведено перечисление, показывающее порядок, в котором Visual FoxPro производит поиск для имени функции:

  • Visual FoxPro native функции

  • Метод объекта Collection, используемый по умолчанию

  • UDF, определенная в файле локальной программы (.prg)

  • UDF, определенная в файле вызывающей программы (.prg)

  • Именованная программа в файле приложения (.app или .exe)

  • Именованная программа, располагающая в списке поиска, определенном SET PATH

Когда Visual FoxPro избавляется от коллекции, содержащей объектные ссылки, он, кроме того, избавляется от любых объектов, имеющихся в коллекции, если они не имеют ссылок где-нибудь еще. Убедитесь, что удалили объекты и любые ссылки на эти объекты из коллекции, до того, как полностью удалить коллекции из памяти.

Visual FoxPro не поддерживает истинный тип безопасности. Поэтому для обеспечения безопасности при работе с коллекциями, вы должны обеспечить ее для класса.

Родные коллекции Visual FoxPro разработаны таким образом, чтобы метод Item сделал  их доступным для размещения и исполнения пользовательского кода. Visual FoxPro Debugger не поддерживает оценки (вычисления) для членов объекта, которые внедрены, как вызовы методов. Поэтому, вы не сможете вычислять какие-либо значения для элементов коллекции.

Замечание:
Для помощи в отладке коллекций, вы можете написать код, подобный коду в приведенных ниже примерах, который добавляет в качестве члена коллекции массив, названный "Items", для ссылки на каждый элемент коллекции:

  Скопировать код
LOCAL oCol AS Collection

oCol=CREATEOBJECT("collection")
oCol.Add(123)
oCol.Add("AAA")
oCol.Add(CREATEOBJECT("custom"))
oCol.Add(CREATEOBJECT("session"))
oCol.Add(CREATEOBJECT("collection"))
oCol.Item(5).Add(456)
oCol.Item(5).Add("BBB")
oCol.Item(5).Add(CREATEOBJECT("session"))
oCol.Item(5).Add(CREATEOBJECT("collection"))
oCol.Item(5).Item(4).Add(789)
oCol.Item(5).Item(4).Add("CCC")
oCol.Item(5).Item(4).Add(CREATEOBJECT("session"))
oCol.Item(5).Item(4).Add(CREATEOBJECT("Collection"))

DebugCollection(oCol)

DEBUG
SUSPEND

PROCEDURE DebugCollection(oCollection)
IF oCollection.Count=0
RETURN
ENDIF
oCollection.AddProperty("Items[1]")
DIMENSION oCollection.Items[oCollection.Count]
FOR i = 1 TO oCollection.Count
oCollection.Items[m.i]=oCollection.Item[m.i]
IF VARTYPE(oCollection.Item[m.i])="O" AND ;
oCollection.Item[m.i].BaseClass="Collection"
IF oCollection=oCollection.Item[m.i]
LOOP
ENDIF
DebugCollection(oCollection.Item[m.i])
ENDIF
ENDFOR
ENDPROC

Пример

В run time, приведенный ниже пример создает формы и коллекцию, добавляет формы в коллекцию, используя метод Add объекта класса Collection, отображает имя каждой формы в коллекции, и отображает число форм в коллекции:

  Скопировать код
loForm1 = CREATEOBJECT("Form")
loForm2 = CREATEOBJECT("Form")
loCol = CREATEOBJECT("Collection")
loCol.Add(loForm1)
loCol.Add(loForm2)
FOR EACH loObj IN loCol
? loObj.Name
ENDFOR
? loCol.Count

Следующий пример определяет класс Form, который добавляет в форму текст-боксы, объекты командных кнопок и коллекцию. Класс коллекции, будучи добавленный в форму в run time, добавляет в себя все объекты, имеющиеся на форме. Пример затем проходит по коллекции, устанавливая позиции элементов формы и печатает их имена на экране.

  Скопировать код
LOCAL loForm, loItem, lnTop
loForm = CREATEOBJECT("myForm")
lnTop=0
FOR EACH loItem IN loForm.myCollection
TRY
loItem.Top = lnTop
lnTop=lnTop+20
? loItem.Name
CATCH
ENDTRY
ENDFOR
loForm.Show(1)

DEFINE CLASS myForm AS Form
AllowOutput=.F.
AutoCenter=.T.
ADD OBJECT myTextBox1 AS TextBox
ADD OBJECT myTextBox2 AS TextBox
ADD OBJECT myButton1 AS CommandButton
ADD OBJECT myButton2 AS CommandButton
ADD OBJECT myCollection AS col1
ENDDEFINE

DEFINE CLASS col1 AS Collection
PROCEDURE Init
FOR i = 1 TO THISFORM.Objects.Count
THIS.Add(THISFORM.Objects(m.i))
ENDFOR
ENDPROC
ENDDEFINE

Для просмотра других примеров, использующих методы Add, Remove и Item класса Collection, смотри статьи Add Method (Collection Class), Remove Method (Collection Class), и Item Method (Collection Class).

Смотрите также