Основой класса 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 задает новое его положение.
Также можно поменять местами два элемента, определяемые параметрами Indexl и Index2:
procedure Exchange(Indexl, Index2: Integer);
Для удаления указателей из списка используются два метода. Если известен индекс, применяется метод
procedure Delete(Index: Integer);
Если известен сам указатель, используется метод
function Remove(Item: Pointer): Integer;
Эти методы не уменьшают объем памяти, выделенной под список. При необходимости сделать это следует использовать свойство capacity. Также существует метод Expand, который увеличивает отведенную память автоматически в зависимости от текущего размера списка.
function Expand: TList;
Для того чтобы метод сработал, необходимо, чтобы count = Capacity. Алгоритм работы метода представлен в табл. 7.1.
Таблица 7.1. Алгоритм увеличения памяти списка
|
Значение свойства Capacity
|
На сколько увеличится свойство Capacity
|
|
<4 |
4 |
|
4..8 |
8 |
|
>8 |
16 |
|
Объявление
|
Описание
|
|
property Capacity: Integer;
|
Определяет число строк, для которых выделена память |
|
property Count: Integer;
|
Возвращает число строк в списке |
|
property Items [Index: Integer]: Pointer;
|
Список указателей |
|
type
TPointerList = array [0 . .MaxListSize-i ] of Pointer; PPointerList = ATPointerList; property List: PPointerList; |
Динамический массив указателей |
|
function Add (Item: Pointer): Integer;
|
Добавляет к списку новый указатель |
|
procedure Clear; dynamic;
|
Полностью очищает список |
|
procedure Delete (Index: Integer:;
|
Удаляет указатель с индексом Index |
|
class procedure Error (const Ksg: string; Data: Integer); virtual;
|
Генерирует исключительную Ситуацию EListError. Сообщение об ошибке создается из форматирующей строки Msg и числового параметра Data |
|
procedure Exchange (Indexl, Index2: Integer);
|
Меняет местами указатели с индексами Indexl и Index2
|
|
function Expand: TList;
|
Увеличивает размер памяти, отведенной под список |
|
function First: Pointer;
|
Возвращает первый указатель из списка |
|
function IndexOf (Item: Pointer): Integer;
|
Возвращает индекс указателя, заданного параметром Item
|
|
procedure Insert (Index: Integer; Item: Pointer) ;
|
Вставляет новый элемент Items позицию Index
|
|
function Last: Pointer;
|
Возвращает последний указатель в списке |
|
procedure Move (Curlndex, Newlndex: Integer);
|
Перемещает элемент списка на новое место |
procedure Pack;
|
Удаляет из списка все пустые (Nil) указатели |
|
function Remove (Item: Pointer): Integer;
|
Удаляет из списка указатель Item |
|
type TListSortCompare = function (Iteml, Item2 : Pointer): Integer;
procedure Sort (Compare: TListSortCompare); |
Сортирует элементы списка |