Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЯВУ.docx
Скачиваний:
2
Добавлен:
23.04.2019
Размер:
210.36 Кб
Скачать

42. Класс tList.

Класс ТList позволяет создать набор из произвольного количества элементов и организовать индексный способ доступа к ним, как это делается при работе с массивом. ТList реализует список значений, но с некоторыми оговорками, которые становятся очевидными при рассмотрении реализации класса.

Cписки отличаются от массивов двумя важными обстоятельствами. Во-первых, их размер может изменяться в ходе работы программы, фактически ограничиваясь лишь свободной оперативной памятью. Во-вторых, в списках могут храниться элементы разных типов.

Класс TList происходит непосредственно от ТОbject.

TList=class(TObject)

End;

Технически класс ТList реализуется в виде динамического массива безтиповых указателей РРоinterList, каждый из элементов массива указывает на область памяти, где расположен элемент списка.

Количество элементов динамического массива определяется свойством Сарасitу, количество реальных элементов в списке равно Соunt.Если при добавлении очередного элемента в список TList Соunt становится равным Сарасitу, автоматически происходит расширение динамического массива (для Соunt <5 на 4 элемента, для 4<Соunt<8— на 8 элементов, для Соunt>7— на 16 элементов). При этом сначала резервируется место для размещения расширенного массива указателей, потом происходит копирование текущего массива, затем его удаление. Поэтому, чтобы снизить накладные расходы, в случае если заранее известно приблизительное количество элементов, следует инициализировать свойство Сарасitу соответствующим значением. Основные свойства класса TList:

1Property capacity:integer read FCapacity write SetCapacity;-содержит кол-во элементов массива указателя списка.всегда больше Count.

2Property Count: integer read FCount write SetCount;-количество элементов списка изменяется при добавлении и удалении элемента.

3Property Items [index:integer]:pointer read Get write Put;default;-возвращает указатель на элемент списка по его индексу. Индекс первого элемента 0.

Основные методы класса TList:

Function Add(item:pointer):Integer;-добавляет элемент Items в конец списка и взвращает его индекс;

Procedure clear;virtual;-очищает список,не очищает память,связанную с каждым элементом. Устанавливает Count и Capacity в 0.

Procedure delete(index:Integer);-удаляет из списка элемент с индексом Index. Все элменты,расположенные за удаляемым смещаются на одну позицию вверх.

Function first:pointer;-возвращает указатель на 1-ый элемент списка.

Function Last:pointer;-возвращает указатель на последний элемент.

Function remove(item:pointer):integer;-отыскивает в списке элемент item и удаляет его.

Procedure sort(compare:TListSortCompare);-сортирует коллекцию с помощью ф-ии compare/

Для того чтобы воспользоваться методами Add, Insert необходимо разместить в оперативной памяти динамические переменные, а в указанные методы передавать полученные указатели. Соответственно методы Delete, Extract, Remove, Clear не освобождают динамическую память, а только очищают ссылки на эти данные. Поэтому, необходимо очищать динамическую память программно. Например:

Var

List: TList;

Item: ^Integer;

Begin

List:=TList.Create; //создаем список

New(Item); //создаем динамическую переменную

List.Add(Item); //добавляем в список значение-указатель на созданную переменную

List.Remove(Item); //удаляем из списка указатель на динамическую переменную

Dispose(Item); //Очищаем динамическую память от динамической переменной

List.Free; //Очищаем память от списка

End;

Метод Sort сортирует список по критерию, устанавливаемому функцией Compare. Тип TListSortCompare определен так:

TListSortCompare=function(Item1,Item2: Pointer): integer;

Таким образом, функция Соmраrе получает указатели на два элемента списка. Результат сравнения.

• любое отрицательное число, если Item1^<Item2^;

• 0, если Item1^=Item2^;

• любое положительное число, если Item1^>Item2^.

Критерий сравнения данных устанавливается программистом и реализуется в функции Compare.

43. Классы TStrings и TStringList.Класс TStrings происходит от класса ТРеrsistent.

TStrings=class(TPersistant).Класс TStrings является абстрактным, он инкапсулирует поля и методы для работы с наборами строк. От него порождены многочисленные специализированные потомки, обслуживающие наборы строк в таких компонентах как TComboВох, TListBox, TRichЕdit и др. Эти классы (TComboBoxString, TListBoxStrings и др.) объявляются в разделе implementation соответствующих модулей и поэтому скрыты от броузера Delphi и не включены в справочную службу. Единственным доступным наследником класса TStrings является класс ТStringList - полнофункциональный класс общего назначения для работы с набором строк.

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

Property capacity:integer read Getcapacity write Setcapacity;-текущая емкость набора строк. Всегда больше count.

Proptery count: :integer read Getcount write Setcount;текущее количество строк в наборе. Технически класс TStrings реализует в виде динамического массива указателей.

Основные методы класса:

Function add(const:s:string);integer:virtual;-добавляет строку в набор данных и возвращает ее индекс.

Procedure apperied(const s:string;AObject:TObject):integer;virtual;-добавляет строку в набор данных.

Procedure clear;virtual;abstract;-очищает набор данных и освобождает связанную с ним память.

Procedure delete(index:integer); virtual;abstract;-удаляет элемент набора с индексом index и освобождает связанную с ним память.

Методы Add, Append, Insert, Clear и т.п. – абстрактные, т.е. они объявлены в классе TStrings, и таким образом определены во всех потомках. Но каждый потомок самостоятельно реализует то, как располагаются в памяти объекты и строки. В то же время наличие, например, метода Assign позволяет с его помощью копировать наборы данных из одного потомка класса TStrings в другой.

Класс TStringList происходит от класса TString и является уже не абстрактным, а полнофункциональным классом общего назначения для работы с наборами строк. Для этого в нем перекрыты все абстрактные методы класса TString, а кроме этого добавлены свойства и методы:

Property duplicates:Tduplicates read Fduplicates write FDupduplicates;-управление возможностью размещения в набор двух и более идентичных строк.

Property sorted:Boolean read Fsorted write setsorted;-признак необходимости сортировки строк в алфавитном порядке.