Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Delphi_02_06 [2012].doc
Скачиваний:
2
Добавлен:
28.08.2019
Размер:
89.09 Кб
Скачать

Лабораторная работа № 6

Списки Delphi

Теоретическая часть

Из материалов лабораторных работ № 4 и № 5 известно, что списки бывают разными, и применяются они разными способами. Различаются списки и по способу создания и по содержанию. Одни списки способны содержать разнородные данные, а другие ограничены определенным типом. Списки различаются по способу извлечения данных, а также по способу перебора их содержимого. Стандартная библиотека Delphi предлагает программистам набор готовых классов списков. В первую очередь к этим классам относятся списки (list), очереди (queue), стеки (stack), хэш-таблицы (bucket). Базовым классом для всех списков является класс TList из модуля Classes. Производные классы, такие как: TBucketList, TClassList, TComponentList, TCustomBucketList, TObjectBucketList, TObjectList, TObjectQueue, TObjectStack, TOrderedList, TQueue, TStack объявлены в модуле Contnrs. В лабораторной работе подробно рассматривается класс TObjectList.

Члены класса TObjectList

Методы класса TObjectList

constructor Create; overload;

constructor Create(AOwnsObjects: Boolean); overload;

Создает экземпляр класса TObjectList. Параметр AOwnsObjects определяет, как будут уничтожаться объекты в случае их удаления из списка. Если AOwnsObjects установлен в true, это будет происходить автоматически, если false – надо будет делать все самостоятельно.

function First: TObject;

Возвращает первый элемент списка, т. е. Items[0].

function Last: TObject);

Возвращает последний элемент списка.

function Add(AObject: TObject): Integer;

Добавляет объект в конец списка, даже если список пуст, и возвращает индекс добавленного объект. (Первый объект в списке имеет индекс 0.) Значение Count увеличивается на 1.

procedure Insert(Index: Integer; AObject: TObject);

Вставляет объект AObject на указанную позицию Index, сдвигая стоящий на этом месте элемент, а также все следующие за ним элементы. Свойство Count увеличивается на единицу.

function Extract(Item: TObject): TObject;

Удаляет объект Item из списка, не уничтожая его (даже если OwnsObjects равен true!), и возвращает только что удаленный из списка объект. Индекс элементов, которые стояли после удаленного, автоматически уменьшается на единицу, а также уменьшается на единицу свойство Count.

function Remove(AObject: TObject): Integer;

Удаляет и уничтожает (если OwnsObjects равен true) объект AObject из списка. Возвращает индекс элемента до того, как он был удален. Если указанный объект не найден в списке, Remove возвращает -1. Если объект появляется в списке более одного раза, Remove удаляет только первое его появление. После удаления все объекты, следующие за удаленным, перемещаются, и свойство  Count уменьшается на единицу.

function IndexOf(AObject: TObject): Integer;

Возвращает индекс объекта AObject в списке. Если объект не находится в списке, IndexOf возвращает -1. Если объект появляется более одного раза, IndexOf возвращает индекс первого появления.

function FindInstanceOf(AClass: TClass; AExact: Boolean = True; AStartAt: Integer = 0): Integer;

Возвращает индекс первого найденного объекта, который относится к классу, указанному в AClass. Поиск начинается с индекса, указанного в AStartAt. Если AExact равен false, то будет производиться поиск не только объектов класса AClass, но и его потомков. Если экземпляр указанного класса не найден, FindInstanceOf возвращает -1.

Методы наследуемые от класса tList

procedure Assign(ListA: TList; AOperator: TListAssignOp = laCopy; ListB: TList = nil);

Копирует элементы из одного списка в другой. Если ListB=nil, то элементы перемещаются из ListA в данный список, при этом используется оператор, указанный в AOperator. Если ListB указан, то сначала все элементы данного списка копируются в ListA, а затем объекты из ListB перемещаются в данный список, при этом используется оператор, указанный в AOperator. Комментарии к операторам:

  • laAnd – удаляет из списка-получателя все элементы, которых нет в исходном списке.

  • laCopy – очищает список-получатель и полностью копирует в него исходный список (по умолчанию выбран этот вариант).

  • laDestUnique – удаляет из списка-получателя все элементы, которые присутствуют в исходном списке.

  • laOr – добавляет из исходного списка все элементы, которых нет в списке-получателе.

  • laSrcUnique – копирует из исходного списка все элементы, которых нет в списке-получателе, предварительно очистив список-получатель.

  • laXor – удаляет из списка-получателя те элементы, которые есть в исходном списке, затем добавляет туда из исходного списка элементы, которых изначально не было в списке-получателе.

procedure Clear; virtual;

Удаляет все элементы из списка и освобождает память, используемую для хранения объектов. Свойства Count и Capacity принимают значение 0.

procedure Delete(Index: Integer);

Удаляет объект в позиции Index. Отличается от Extract тем, что в качестве параметра передается не объект, а индекс. Если OwnsObjects равен true, то сразу же вызывается метод Free. Чтобы вручную освободить память, которая использовалась для хранения объекта, достаточно уменьшить параметр Capacity. Индексы элементов и Count изменяются так же, как в методе Extract.

destructor Destroy; override;

Не вызывайте деструктор непосредственно. Вместо этого вызывайте метод Free, который проверяет, то TList ссылка не ноль, и только затем вызывает Destroy. В результате этого уничтожается освобождает память, используемую для хранения списка элементов. Примечание: Уничтожить не освобождает память, на которую указывает элементы списка.

procedure Exchange(Index1, Index2: Integer);

Меняет местами два элемента списка.

function Expand: TList;

Увеличивает значение свойства Capacity (вместимость). Работает только в том случае, если количество элементов в списке равно вместимости списка. Если Capacity > 8, Expand увеличивает Capacity до 16. Если Capacity > 4, но Capacity < 9, Expand увеличивается Capacity до 8. Если Capacity < 4, Expand увеличивает Capacity до 4. Функция возвращает сам список.

procedure Move(CurIndex, NewIndex: Integer);

Перемещает элемент списка на другую позицию. CurIndex – текущий номер объекта, NewIndex – его новый номер.

procedure Pack; Удаляет из списка все элементы, равные nil, при этом Count присваивается значение, равное количеству используемых элементов (т. е. не равных nil). Память, занимаемая ими, не освобождается. Чтобы очистить ее, надо произвести такое действие: ObjectList.Capacity := ObjectList.Count;

procedure Sort(Compare: TListSortCompare);

Сортирует элементы списка. TListSortCompare – это процедурный тип следующего вида: TListSortCompare = function (Item1, Item2: Pointer): Integer;

Методы наследуемые от класса TObject

procedure Free;

Destroys an object and frees its associated memory, if necessary.

Свойства класса TObjectList

property Items[Index: Integer]: TObject; default;

С помощью свойства Items можно получить доступ к объектам, хранящимся в списке. Items является свойством по умолчанию, а значит следующие две строки равносильны:

ObjectList.Items[1] := Button1;

ObjectList[1] := Button1;

property OwnsObjects: Boolean;

Позволяет TObjectList самостоятельно контролировать память, занимаемую объектами. Если его значение равно true, то:

  • Вызов методов Delete или Remove уничтожает объект, который был удален из списка

  • Процедура Clear не только удаляет объекты из списка, но и уничтожает их

  • Вызов деструктора уничтожает все элементы списка, а не только сам ObjectList

  • При добавлении нового объекта на определенную позицию уничтожается находившийся там ранее объект

Метод Extract будет в любом случае удалять объект из списка без его уничтожения.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]