Список указателей. Класс TList.
Для хранения списка указателей на размещенные в адресном пространстве структуры (объекты, динамические массивы, переменные) предназначен класс TList. Так же, как и список строк TstringList, список указателей обеспечивает эффективную работу с элементами списка.
Основой класса TList является список указателей. Сам список представляет собой динамический массив указателей, к которому можно обратиться через индексированное свойство:
property Items[Index: Integer]: Pointer;
Нумерация элементов начинается с нуля.
Прямой доступ к элементам массива возможен через свойство:
type PPointerList = ^TPointerList; TPointerList = array[0..MaxListSize-1] of Pointer; property List: PPointerList;
Которое имеет атрибут "только для чтения".
Так как элементы списка являются указателями на некоторые структуры, прямое обращение к составным частям этих структур через свойство items невозможно. Как это можно сделать, рассказывается ниже в примере.
Примечание
В списке могут содержаться указатели на разнородные структуры. Не обязательно хранить в списке только указатели на объекты или указатели на записи.
Реализованные в классе TList операции со списком обеспечивают потребности разработчика и совпадают с операциями списка строк.
Для добавления в конец списка нового указателя используется метод:
function Add(Item: Pointer): Integer;
Прямое присваивание значения элементу, который еще не создан при помощи метода Add, вызовет ошибку времени выполнения.
Новый указатель можно добавить в нужное место списка. Для этого используется метод:
procedure Insert(Index: Integer; Item: Pointer);
В параметре index указывается необходимый порядковый номер в списке.
Перенос существующего элемента на новое места осуществляется методом:
procedure Move(Curlndex, Newlndex: Integer);
Параметр CurIndex определяет старое положение указателя. Параметр NewIndex задает новое его положение.
Также можно поменять местами два элемента, определяемые параметрами Index1 и Index2:
procedure Exchange(Indexl, Index2: Integer);
Для удаления указателей из списка используются два метода. Если известен индекс, применяется метод:
procedure Delete(Index: Integer);
Если известен сам указатель, используется метод:
function Remove(Item: Pointer): Integer;
Эти методы не уменьшают объем памяти, выделенной под список. При необходимости сделать это следует использовать свойство capacity. Также существует метод Expand, который увеличивает отведенную память автоматически в зависимости от текущего размера списка.
function Expand: TList;
Для того чтобы метод сработал, необходимо, чтобы count = Capacity. Алгоритм работы метода представлен в табл. 7.1.