Иллюстрированный самоучитель по Delphi 7 для профессионалов

Список указателей. Класс 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.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.