Класс 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.



    Вы можете оставить комментарий, или Трекбэк с вашего сайта.

    Оставить комментарий