| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > TObjectList |
| Автор: Sunr1se 27.5.2006, 15:58 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
TObjectList TObjectList предназначен для динамического хранения потомков класса TObject. У него есть множество преимуществ: контроль за памятью, возможность сортировки, отслеживания пустых элементов. Он имеет очень хорошие возможности по работе с объектами. Все это делает TObjectList наиболее удобным средством для хранения объектов и управления ими. Рассмотрим методы этого класса. Методы класса TObjectList: Create
Создает новый ObjectList. Параметр AOwnsObjects определяет, как будут уничтожаться объекты в случае их удаления из списка. Если AOwnsObjects установлен в true, это будет происходить автоматически, если false – надо будет делать все самостоятельно. По умолчанию он равен true. Add
Добавляет новый объект в конец списка, увеличивает свойство Count на единицу и, если необходимо, выделяет память, увеличивая значение Capacity (мы рассмотрим позже это свойство). Extract
Удаляет объект из списка, не уничтожая его (даже если OwnsObjects равен true!). Item – это имя удаляемого объекта. Индекс элементов, которые стояли после удаленного, автоматически уменьшается на единицу, а также уменьшается свойство Count. Функция возвращает только что удаленный из списка объект. Insert
Вставляет новый объект на указанную позицию, сдвигая стоящий на этом месте элемент, а также все следующие за ним элементы. Index – позиция, на которую вставляется объект, указанный в AObject. При необходимости для нового элемента выделяется память. First
Возвращает первый элемент списка. Last
Возвращает последний элемент списка. FindInstanceOf
Возвращает индекс первого найденного объекта, который относится к классу, указанному в AClass. Поиск начинается с индекса, указанного в AStartAt. Если AExact равен false, то будет производиться поиск не только объектов класса AClass, но и его потомков. IndexOf
Возвращает индекс объекта AObject в списке. Методы класса TList: Remove
Единственное отличие от Extract состоит в том, что удаленный элемент уничтожается, если OwnsObjects равен true. Возвращает индекс элемента до того, как он был удален. Delete
Отличается от Extract тем, что в качестве параметра передается не имя, а индекс. Если OwnsObjects равен true, то сразу же вызывается метод Free. Чтобы вручную освободить память, которая использовалась для хранения объекта, достаточно уменьшить параметр Capacity. Индексы элементов и Count изменяются так же, как и у Extract. Assign
Копирует элементы из одного списка в другой. Если ListB=nil, то элементы перемещаются из ListA в данный список, при этом используется оператор, указанный в AOperator. Если ListB указан, то сначала все элементы данного списка копируются в ListA, а затем объекты из ListB перемещаются в данный список, при этом используется оператор, указанный в AOperator. Теперь немного об этих операторах: laAnd – удаляет из списка-получателя все элементы, которых нет в исходном списке. laCopy – очищает список-получатель и полностью копирует в него исходный список (по умолчанию выбран этот вариант). laDestUnique – удаляет из списка-получателя все элементы, которые присутствуют в исходном списке. laOr – добавляет из исходного списка все элементы, которых нет в списке-получателе. laSrcUnique – копирует из исходного списка все элементы, которых нет в списке-получателе, предварительно очистив список-получатель. laXor – удаляет из списка-получателя те элементы, которые есть в исходном списке, затем добавляет туда из исходного списка элементы, которых изначально не было в списке-получателе. Pack
Удаляет из списка все элементы, равные nil, при этом Count присваивается значение, равное количеству используемых элементов (то есть не равных nil). Память, занимаемая ими, не освобождается. Чтобы очистить ее, надо произвести такое действие:
Expand
Увеличивает значение параметра Capacity (т.е. увеличивает вместимость). Работает только в том случае, если количество элементов в списке равно вместимости листа. Если значение Capacity больше, чем 8, Expand увеличивает вместимость списка до 16. Если значение Capacity больше 4, но меньше 9, Capacity увеличивается до 8. Если Capacity меньше 4, вместимость увеличивается до 4. Функция возвращает сам ObjectList. Clear
Этот метод удаляет все элементы из списка, освобождает память, используемую для хранения объектов, а также присваивает свойству Capacity значение 0. Exchange
Меняет местами два элемента списка. Move
Перемещает элемент списка на другую позицию. CurIndex – текущий номер объекта, NewIndex – его новый номер. Sort
Метод сортирует элементы списка. В функции TListSortCompare должно быть указано, как следует располагать объекты в списке:
Пример: При нажатии на Button1 кнопки, которые перечислены списке, будут расположены в алфавитном порядке (сравнение будет идти по параметру Caption):
А теперь немного о свойствах TObjectList: OwnsObjects
Позволяет TObjectList самостоятельно контролировать память, занимаемую объектами. Если его значение равно true, то:
Однако метод Extract будет в любом случае удалять объект из списка без его уничтожения. Capacity
Определяет размер массива, в котором хранятся объекты. Если при добавлении нового элемента окажется, что список заполнен, то Capacity будет увеличено. Count
Показывает, сколько элементов списка используется в данный момент. Если увеличить значение Count, то в список будут добавлены пустые указатели (nil). При его уменьшении будет удалено необходимое число записей. Items
С помощью Items можно получить доступ к объектам, хранящимся в списке. Items является свойством по умолчанию, а значит следующие две строки равносильны:
Пора перейти от теории к практике. Вот несколько примеров, которые демонстрируют область применения TObjectList. Пример 1. Работа с динамически созданными объектами (а именно с TEdit). Нужно создать свой собственный класс, который будет потомком TObjectList. Для этого требуется перекрыть методы SetItems и GetItems. В интерфейсной части модуля, после слова type, пропишите такой код:
и нажмите Ctrl+Shift+C. В конце модуля сгенерируется:
В GetItems вставьте строку
В SetItems:
Теперь у нас есть класс, предназначенный для хранения TEdit’ов. Приступим к работе с этим классом.
Как вариант:
Теперь можно работать с Edit’ами так же, как с элементами массива:
При использовании второго способа индекс объекта знать не обязательно, нужно только его имя. Для удобства напишем функцию, которая находит Edit по его имени:
Пример 2. Выравнивание компонентов. Представим такую ситуацию: получилось, что динамически созданные компоненты на форме расположены как попало, и их надо выровнять. С помощью TObjectList очень легко решить эту задачу. Этот код выравнивает на форме TEdit’ы (использован класс TEditList из предыдущего примера):
Пример 3.Работа с данными. В этом примере я рассмотрю создание некого подобия адресной книги. Для начала создадим класс, который нужен для хранения данных об отдельном человеке:
Осталось создать класс, который будет потомком TObjectList и будет предназначен для хранения данных типа TInfo:
Нажмите Ctrl+Shift+C. Появятся два метода: GetItems и SetItems. Вот их код:
Программа готова! © Sunr1se To moderators: пожалуйста, закрепите тему. |
| Автор: Sunr1se 27.5.2006, 19:28 |
| Snowy, огромное спасибо за критику. Обязательно рассмотрю те моменты, которые ты указал, и исправлю ошибки. Постараюсь, чтобы получилось что-то полезное... Еще раз спасибо! |
| Автор: Poseidon 27.5.2006, 21:15 |
| Мне кажется статьи и не стоит закреплять. Достаточно их в FAQ добавлять |
| Автор: Sunr1se 28.5.2006, 11:58 |
| Еще один вариант - создать одну фиксированную тему и в ней оставлять ссылки на статьи раздела. Тогда статьи теряться не будут... |