На этом шаге мы рассмотрим свойства, методы и события класса TList.
Класс TList - универсальный список. Он представляет собой массив нетипизированных указателей и поэтому годится для хранения набора любых, в том числе разнотипных, данных и объектов. При добавлении/удалении в список данные не создаются и не уничтожаются - эта обязанность лежит на программисте. Приведем доступные ему свойства класса.
Перечислим основные методы этого класса.
Методы 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 получает указатели на два элемента списка. Результат сравнения:
Критерий сравнения данных устанавливается программистом и реализуется в функции 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.