Шаг 21.
Класс TList
На этом шаге мы рассмотрим свойства, методы и события класса TList.
Класс TList - универсальный список. Он представляет собой
массив нетипизированных указателей и поэтому
годится для хранения набора любых, в том числе разнотипных, данных и
объектов. При добавлении/удалении
в список данные не создаются и не уничтожаются - эта
обязанность лежит на программисте.
Приведем доступные ему свойства класса.
- property Items [Index: Integer]:Pointer; - возвращает указатель на
содержимое элемента
списка с номером Index.
- property Count: Integer; - определяет число элементов в списке.
- property Сараcity: Integer; - определяет максимальное число
элементов в списке.
Оно может изменяться как явно (пользователем), так и при добавлении
элементов в список, в
том случае, когда Count>=Capacity. Максимальная емкость списка -
16380 элементов.
Остальные свойства наследуются от базового класса
TObject.
Перечислим основные методы этого класса.
- function Add (Item:Pointer): Integer; - добавляет в конец списка
элемент, который будет
равен Item.
- function Remоve (Item: Pointer): Integer; - удаляет из списка элемент,
который равен
Item.
- procedure Insert (Index: Integer; Item: Pointer); - вставляет элемент,
равный
Item, перед элементом с индексом Index.
- proocedure Delete (Index: Integer); - удаляет из списка элемент с
индексом Index.
- procedure Сlear; - очищает список, устанавливая величины
Count и Capacity в 0.
- procedure Exchange (Index1, Index2: Integer); - меняет местами
элементы списка с индексами
Index1 и Index2.
- function Expand: TList; - при соблюдении равенства
Count=Capacity расширяет список.
При емкости списка менее пяти элементов, он по умолчанию расширяется на
четыре элемента, при пяти-восьми -
на восемь, более восьми - на шестнадцать.
- function First: Pointer; function Last: Pointer; - возвращают значения
первого и последнего
(с индексом Count-1) элементов списка.
- function IndexOf (Item: Pointer): Integer; - возвращает индекс элемента,
равного
Item.
- procedure Mоve(CurIndex, NewIndex Integer); - перемещает элемент
списка с положения
CurIndex в положение NewIndex.
- procedure Pack; - упаковывает список., сдвигая элементы к началу
на пустующие места.
Прокомментируем некоторые из приведенных методов.
Методы Add и Insert получают указатель на вставляемый
элемент. Чтобы воспользоваться ими,
программист должен сам разместить в куче данные и получить
соответствующий указатель. Точно так
же методы Delete, Remove и Clear не уничтожают
распределенные в памяти данные,
которые программист должен, если это необходимо, уничтожить сам. Например:
var
List: TList;
Item: Pointer;
Value: AnyType;
begin
List:=TList.Create; // Создадим список.
Item:=New(Value); // Размещаем в куче данные.
List.Add(Item); // Добавляем элемент к списку.
List.Remove(Item); // Удаляем элемент из списка.
Dispose(Item); // Удаляем его из кучи.
List.Free; // Удаляем ненужный список.
end;
Метод Sort сортирует список по критерию, устанавливаемому функцией
Compare. Тип
TListSortCompare определен следующим образом:
TListSortCompare = function (Item1, Item2: Pointer): Integer; .
Таким образом, функция Compare получает указатели на два элемента
списка. Результат сравнения:
- любое отрицательное число, если Item1<Item2;
- 0, ecли Item1=Item2;
- любое положительное число, если Item1>Item2.
Критерий сравнения данных устанавливается программистом и
реализуется в
функции Compare.
В следующем примере в список TList помещается 20 случайных
вещественных чисел из диапазона
от 0 до 1. По нажатию на кнопку TButton список сортируется по
возрастанию чисел и отображается
в компоненте TMemo:

Рис.1. Внешний вид приложения
unit Un_list;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
pDouble=^Double; //Тип "указатель на вещественное число".
//С помощью этой функции реализуется сортировка чисел.
function Comp(Item1,Item2:Pointer):Integer;
begin
if pDouble(Item1)^ < pDouble(Item2)^ then Result:=-1
else
if pDouble(Item1)^ = pDouble(Item2)^ then Result:=0
else
if pDouble(Item1)^ > pDouble(Item2)^ then Result:=1;
end;
//Обработчик нажатия кнопки выполняет основную работу.
procedure TForm1.Button1Click(Sender: TObject);
var
k:Integer;
List: TList;
pD:pDouble;
begin
List:=TList.Create; //Создание списка.
for k:=1 to 20 do //Наполнение списка.
begin
New(pD); //Резервируем память.
pD^:=Random; //Помещаем случайное число.
List.Add(pD); //Добавляем к списку.
end;
List.Sort(Comp); //Сортируем список.
Memo1.Lines.Clear; //Очищаем компонент Memo1.
//Наполняем Memo1 и уничтожаем элементы списка.
for k:=0 to List.Count-1 do
begin
pD:=List[k]; //Берем очередное число.
Memo1.Lines.Add(FloatToStr(pD^)); //Помещаем в Memo1.
Dispose(pD); //Уничтожаем число.
end;
List.Free; //Уничтожаем список.
end;
end.
Текст этого примера можно взять здесь.
На следующем шаге мы рассмотрим состав класса TStrings.
Предыдущий шаг
Содержание
Следующий шаг