type TList;
Класс TList очень полезный универсальный контейнер списков. Он отличается от массивов, в которых он обеспечивает более богатые функциональные возможности.
В частности объекты TList могут быть отсортированы. Эта сортировка может быть с использованием любых выбранных критериев. Например, список может содержать набор объектов, которые имеют строку и численные поля. Вы можете отсортировать список по строке, по числу, по обоим, с возрастанием или убыванием, как Вы желаете. И пересортировать позже по другим критериям.
Показанный пример кода показывает такую сортировку.
Ключевые свойства и методы упомянуты ниже.
Свойство Capacity
Используется для установления размера (число указателей на объекты) списка. Предварительно установив в разумное значение, можно избежать множественных перераспределений памяти.
Свойство Count
Число элементов (указателей) в списке. Может быть прочитано или записано. Если размер уменьшен в результате изменения значения Count, то удаляются элементы в конце списка.
Свойство Items
Позволяет обращаться к элементам в списке. Например, myList.Items[2] ; возвращает 3-ий элемент в списке. Это свойство, заданное по умолчанию, вышеупомянутое может быть упрощено до myList[2];.
Свойство List
Возвращает элементы в массиве.
Метод Add
Добавляет элемент в конец списока.
Метод Assign
Заменяет список содержанием другого списка.
Метод Clear
Удаляет все элементы списка, устанавливая Count в 0.
Метод Delete
Удаляет элемент из списка по его позиции в списке.
Метод Remove
Удаляет элемент из списка по его объектному указателю.
Метод Exchange
Меняет позиции двух элементов
Метод Move
Перемещает элемент в новую позицию списка.
Метод Insert
Вставляет новый элемент в список в данную позицию.
Метод First
Получает первый элемент в списке.
Метод Last
Получает последний элемент в списке.
Метод Sort
Сортирует список в соответствии с вашими указанными критериями. Сортировка списка проводится внутри TList, но каждая пара элемента сравнивается, вызывая функцию, которую вы указали для этого метода.
Метод IndexOf
Выдает позицию указанного объекта в списке.
|
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
// Определение класса клиента
TCustomer = class
private
// Поля данных этого нового класса
CustomerName : String;
CustomerNumber : Integer;
public
// Свойства для чтения значений этих данных
property Name : String
read CustomerName;
property Number : Integer
read CustomerNumber;
// Коструктрор
constructor Create(const CustomerName : String;
const CustomerNumber : Integer);
end;
// Определение класса формы
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
// TList объект мы использует в этом коде
myList : TList;
// Метод для показа содержимого нашего объекта списка
procedure ShowListContents;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// Конструктор Customer
// --------------------------------------------------------------------------
constructor TCustomer.Create(const CustomerName : String;
const CustomerNumber : Integer);
begin
// Сохранение переданных параметров
self.CustomerName := CustomerName;
self.CustomerNumber := CustomerNumber;
end;
// Программа сортировки TList : сравните клиентов по имени
// --------------------------------------------------------------------------
// Возвращенное целое число имеет следующее значение :
//
// > 0 : (положительное) Item1 является меньше чем Item2
// 0 : Item1 равно Item2
// <0 : (negative) больше чем item2
function compareByName(Item1 : Pointer; Item2 : Pointer) : Integer;
var
customer1, customer2 : TCustomer;
begin
customer1 := TCustomer(Item1);
customer2 := TCustomer(Item2);
// Теперь сравнение строк
if customer1.Name > customer2.Name
then Result := 1
else if customer1.Name = customer2.Name
then Result := 0
else Result := -1;
end;
// Подпрограмма для показа содержимого нашего списка
// --------------------------------------------------------------------------
procedure TForm1.ShowListContents;
var
i : Integer;
begin
// И повторный показ списка
for i := 0 to myList.Count-1 do
begin
ShowMessage(TCustomer(myList[i]).Name+' is customer number '+
IntToStr(TCustomer(myList[i]).Number));
end;
end;
// Конструктор формы
// --------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
var
customer : TCustomer;
begin
// Создание объекта TList для хранения набора объектов клиент
myList := TList.Create;
// Создание нескольких объектов клиентов и добавление их в наш объект список
customer := TCustomer.Create('Neil Moffatt', 123);
myList.Add(customer);
customer := TCustomer.Create('Bill Gates', 64);
myList.Add(customer);
// Мы можем добавить объект, не присваивая в промежуточную переменную
myList.Add(TCustomer.Create('Henry Cooper', 999));
myList.Add(TCustomer.Create('Alan Sugar', 2));
// Теперь показываем список
ShowListContents;
// Теперь мы сортируем список в последовательность имён и повторяем показ
myList.Sort(compareByName);
ShowListContents;
// Теперь удаляем и вставляем некоторые объекты
// Обратите внимание, что индексы начинаются с 0
myList.Insert(2, TCustomer.Create('Added as item 3', 33));
myList.Delete(4);
// И повторно показываем список
ShowListContents;
end;
end.
|