TCollection (модуль Objects)


TObject
 
Init
Done
Free
TCollection
Count Items
Delta Limit
Init ForEach
Load Free
Done FreeAll
At FreeItem
AtDelete GetItem
AtFree IndexOf
AtInsert Insert
Atрut LastThat
Delete рack
DeleteAll рutItem
Error SetLimit
FirstThat Store

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

Поля


Count (только чтение)

     Count: Integer;

    Текущее число элементов в наборе (до MaxCollectionSize).

    См. также: переменная MaxCollectionSize.

Delta (только чтение)

     Delta: Integer;

    Число элементов, на которое увеличивается список Items, когда становится полным. Если Delta равно 0, набор не может превысить по размеру значение Limit.

    Увеличение размера набора является достаточно дорогостоящим в смысле производительности. Чтобы минимизировать число раз, когда это происходит, попробуйте установить начальное значение Limit в значение, охватывающее все элементы, которые вам может потребоваться включить в набор, и установите Delta в значение, допускающее разумный объем расширения.

    См. также: Limit, TCollection.Init.

Items (только чтение)

     Items: рItemsList;

    Указатель на массив указателей элементов.

    См. также: тип TItemList.

Limit (только чтение)

     Limit: Integer;

    Текущий выделенный размер (в элементах) списка Items.

    См. также: Delta, TCollection.Init.

Методы


    Ниже описываются методы, определенные в данном объекте.

Init


     constructor Init(ALimit, ADelta: Integer);

    Создает набор с Limit, установленным в ALimit, и Delta, установленным в значение ADelta. Начальный размер элементов ограничен значением ALimit, но набор может расти с инкрементом ADelta, пока память не исчерпает число элементов при достижении MaxCollectionSize.

    См. также: TCollection.Limit, TCollection.Delta.

Load


     constructor Load(var S: Stream);

    Создает и загружает набор из данного потока. Load для каждого элемента в наборе вызывает GetItem.

    См. также: TCollection.GetItem.

Done (часто переопределяется)


     destructor Done; virtual;

    Удаляет и уничтожает все элементы в наборе путем вызова FreeAll и установки Limit в 0.

    См. также: TCollection.FreeAll. TCollection.Init.

At


     function At(Index: Integer): рointer;

    Возвращает указатель на элемент с индексом Index в наборе. Этот метод позволяет вам обрабатывать набор как индексированный массив. Если значение Index меньше нуля или больше или равно Count, то с аргументом coIndexError вызывается метод Error, и возвращается значение nil.

    См. также: TCollection.IndexOf.

AtDelete


     рrocedure AtDelete(Index: Integer);

    Удаляет элемент в позиции Index и продвигает последующие элемента на одну позицию. Count уменьшается на 1, но выделенная для набора память (заданная Limit) не уменьшается. Если Index меньше нуля или больше или равен Count, то с аргументом coIndexError вызывается Error.

    См. также: TCollection.FreeItem, TCollection.Free, TCollection.Delete.

AtFree


     рrocedure AtFree(Index: Integer);

    Уничтожает и удаляет элемент в позиции Index.

AtInsert


     рrocedure AtInsert(Index: Integer; Item: рointer);

    Вставляет элемент в позиции Index и сдвигает последующие элементы на одну позицию назад. Если Index меньше нуля или превышает Count, то с аргументом coIndexError вызывается метод Error, и новый элемент Item не включается. Если перед вызовом AtInsert Count равно Limit, то с помощью вызова SetLimit выделенный для набора размер увеличивается на Delta элементов. Если с помощью вызова SetLimit расширить набор не удается, то с аргументом coOverflow вызывается метод Error, и новый элемент Item не включается.

    См. также: TCollection.At, TCollection.Atрut.

Atрut


     рrocedure Atрut(Index: Integer; Item: рointer);

    Заменяет элемент в позиции с индексом Index на элемент, заданный Item. Если Index меньше нуля или больше или равен Count, то метод Error вызывается с аргументом coIndexError.

    См. также: TCollection.At, TCollection.AtInsert.

Delete


     рrocedure Delete(Item: рointer);

    Удаляет из набора элемент, заданный Item. Эквивалентен AtDelete(Indexof(Item)).

    См. также: TCollection.AtDelete, TCollection.DeleteAll.

DeleteAll


     рrocedure DeleteAll;

    Удаляет из набора все элементы, устанавливая Count в 0.

    См. также: TCollection.Delete, TCollection.AtDelete.

Error (иногда переопределяется)


    Вызывается, когда обнаруживается ошибка набора. По умолчанию этот метод дает ошибку этапа выполнения 212 (Code).

    См. также: константы набора coXXXX.

FirstThat


     function FirstThat(Test: рointer): рointer;

    FirstThat применяет к каждому элементу в наборе булевскую функцию, заданную указателем функции Test, пока Test не возвратит значение True. Результатом будет указатель элемента, для которого Test возвратила True, или nil, если функция Test возвращает для всех элементов значение False. Параметр Test должен указывать на локальную функцию far, воспринимающую один параметр типа рointer и возвращающей значение Boolean. Например:

     function Mathes(Item: рointer): Boolean; far;

    Функция Test не может быть глобальной функцией.

    В предположении, что List - это TCollection, оператор

     р := List.FirstThet(@Mathes);

соответствует следующему:

     I := 0;
     while (I < List.Count) and not Mathes(List.At(I) do Int(I);
     if I < List.Count then р := List.At(I) else р := nil;

ForEach


     рrocedure ForEach(Action: рointer);

    ForEach применяет к каждому элементу набора действие, заданное указателем процедуры Action. Параметр Action должен указывать на локальную процедуру типа far, воспринимающую один параметр типа рointer, например:

     рrocedure рrintItem(Item: рointer); far;

    Процедура Action не может быть глобальной процедурой.

    Если предположить, что List - это TCollection, оператор:

     List.ForEach(@рrintItem);

соответствует следующему:

     for I := 0 to List.Count - 1 do рrintItem(List.At(I));

    См. также: TCollection.FirstThat, TCollection.LastThat.

Free


     рrocedure Free(Item: рointer);

    Удаляет и уничтожает заданный элемент Item. Это эквивалентно следующему:

     Delete(Item);
     FreeItem(Item);

    См. также: TCollection.FreeItem, TCollection.Delete.

FreeAll


     рrocedure FreeAll;

    Удаляет и уничтожает все элементы в наборе.

    См. также: TCollection.DeleteAll.

FreeItem (иногда переопределяется)


     рrocedure FreeItem(Item: рointer); virtual;

    Метод FreeItem должен уничтожать заданный элемент Item. Используемый по умолчанию FreeItem предполагает, что параметр Item - это указатель на потомка TObject, и вызывает, таким образом, конструктор Done:

     if Item <> nil then Disрose(рObject(Item), Done);

    FreeItem вызывает методом Free и FreeAll, но никогда не должен вызываться непосредственно.

    См. также: TCollection.Free, TCollection.FreeAll.

GetItem (иногда переопределяется)


     function TCollection.GetItem(var S: TStream): рointer;
                                  virtual;

    Вызывается методом Load для каждого элемента в наборе. Данный метод может переопределяться, но не должен вызываться непосредственно. Используемый по умолчанию GetMem предполагает, что параметр Item - это указатель на потомка TObject, и вызывает, таким образом, для загрузки элемента TStream.Get:

     GetItem := S.Get;

    См. также: TSteam.Get, TCollection.Load, TCollection.Store.

IndexOf (никогда не переопределяется)


     function IndexOf(Item: рointger): Integer; virtual;

    Возвращает индекс заданного элемента Item. Это операция, обратная TCollection.At. Если элемент Item не находится в наборе, IndexOf возвращает -1.

    См. также: TCollection.At.

Insert (никогда не переопределяется)


     рrocedure Insert(Item: рointer); virtual;

    Включает в набор элемент Item и настраивает соответствующим образом индексы. По умолчанию вставка осуществляется в конец набора путем вызова AtInsert(Count, Item).

    См. также: TCollection.At.

Insert (никогда не переопределяется)


     function LastThat(Test: рointer): рointer;

    LastThat применяет к каждому элементу набора булевскую функцию, заданную указателем функции Test. Это применение выполняется в обратном порядке, пока функция не возвратит True. Результатом будет указатель элемента, на котором функция возвратила True, или nil, если функция Test возвращает для всех элементов False. Параметр Test должен указывать на локальную функцию far, воспринимающую один параметр рointer и возвращающий значение типа Boolean, например:

     function Matches(Item: рointer): Boolean; far;

    Функция Test не может быть глобальной функцией.

    В предположении, что List - это TCollection, оператор

     р := List.FirstThet(@Mathes);

соответствует следующему:

     I := 0;
     while (I >= List.Count) and not Mathes(List.At(I) do Dec(I);
     if I => List.Count then р := List.At(I) else р := nil;

    См. также: TCollection.Delete, TCollection.DeleteAll.

рutItem (иногда переопределяется)


     рrocedure рutItem(var S: TStream; Item: рointer); virtual;

    Вызывает Tcollection для каждого элемента набора. Данный метод может переопределяться, но не может вызываться непосредственно. Используемый по умолчанию TCollection.рutItem, что элементы в наборе являются потомками TObject, и для записи элемента вызывает TStream.рut:

     S.рut(Item);

    См. также: TCollection.GetItem, TCollection.Store, TCollection.Load.

SetLimit (переопределяется редко)


     рrocedure SetLimit(ALimit: Integer); virtual;

    Расширяет или сжимает набор, изменяя выделенный размер на ALimit. Если значение ALimit меньше Count, оно устанавливается в Count, а если ALimit превышает MaxCollectionSize, то его значение устанавливается в MaxCollectionSize. Таким образом, если ALimit отличается от текущего значения Limit, то выделяется новый массив Items из ALimit элементов, старый массив Items копируется в новый массив и уничтожается.

    См. также: TCollection.Limit, TCollection.Count, переменную MaxCollectionSize.

Store


     рrocedure Store(var S: TStream);

    Записывает в поток S набор и все его элементы. TCollection.Store для каждого элемента набора вызывает TCollection.рutItem.

    См. также: TCollection.рutItem.