Шаг 21.
Класс TList

    На этом шаге мы рассмотрим свойства, методы и события класса TList.

    Класс TList - универсальный список. Он представляет собой массив нетипизированных указателей и поэтому годится для хранения набора любых, в том числе разнотипных, данных и объектов. При добавлении/удалении в список данные не создаются и не уничтожаются - эта обязанность лежит на программисте. Приведем доступные ему свойства класса.

  1. property Items [Index: Integer]:Pointer; - возвращает указатель на содержимое элемента списка с номером Index.
  2. property Count: Integer; - определяет число элементов в списке.
  3. property Сараcity: Integer; - определяет максимальное число элементов в списке. Оно может изменяться как явно (пользователем), так и при добавлении элементов в список, в том случае, когда Count>=Capacity. Максимальная емкость списка - 16380 элементов.
Остальные свойства наследуются от базового класса TObject.

    Перечислим основные методы этого класса.

  1. function Add (Item:Pointer): Integer; - добавляет в конец списка элемент, который будет равен Item.
  2. function Remоve (Item: Pointer): Integer; - удаляет из списка элемент, который равен Item.
  3. procedure Insert (Index: Integer; Item: Pointer); - вставляет элемент, равный Item, перед элементом с индексом Index.
  4. proocedure Delete (Index: Integer); - удаляет из списка элемент с индексом Index.
  5. procedure Сlear; - очищает список, устанавливая величины Count и Capacity в 0.
  6. procedure Exchange (Index1, Index2: Integer); - меняет местами элементы списка с индексами Index1 и Index2.
  7. function Expand: TList; - при соблюдении равенства Count=Capacity расширяет список. При емкости списка менее пяти элементов, он по умолчанию расширяется на четыре элемента, при пяти-восьми - на восемь, более восьми - на шестнадцать.
  8. function First: Pointer; function Last: Pointer; - возвращают значения первого и последнего (с индексом Count-1) элементов списка.
  9. function IndexOf (Item: Pointer): Integer; - возвращает индекс элемента, равного Item.
  10. procedure Mоve(CurIndex, NewIndex Integer); - перемещает элемент списка с положения CurIndex в положение NewIndex.
  11. 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 получает указатели на два элемента списка. Результат сравнения:

    Критерий сравнения данных устанавливается программистом и реализуется в функции 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.




Предыдущий шаг Содержание Следующий шаг