![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Sunr1se |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 1.5.2006 Репутация: 6 Всего: 13 |
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: пожалуйста, закрепите тему. --------------------
IRC-канал Винграда |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Основное назначение TObjectList - работа с неопределенным количеством объектов.
В принципе для этого подходит и TList, но TObjectList специально предназначен именно для объектов. Замечание: Не рассмотрена работа с набором разнородных объектов, и разнородных объектов - наследников общего предка. Например TWinControl. Например, необязательно затачивать под TEdit. Достаточно под TWinControl. После этого можно добавлять в список любые контролы и единообразно управлять ими. И чтобы вот так не делать, стоит воспользоваться свойством Height контрола + фиксированный интервал.
Есть над чем поработать. Ждем продолжения. Пока это топик для WiKi. До статьи не дотягивает. Нужно еще поработать. Я не могу фиксировать все темы. Шапка не резиновая. Там и так много топиков. Если заметили, я не крепил не свою статью, ни Quadr0. |
|||
|
||||
Sunr1se |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 1.5.2006 Репутация: 6 Всего: 13 |
Snowy, огромное спасибо за критику. Обязательно рассмотрю те моменты, которые ты указал, и исправлю ошибки.
Постараюсь, чтобы получилось что-то полезное... Еще раз спасибо! --------------------
IRC-канал Винграда |
|||
|
||||
Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
Sunr1se |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 1.5.2006 Репутация: 6 Всего: 13 |
Еще один вариант - создать одну фиксированную тему и в ней оставлять ссылки на статьи раздела. Тогда статьи теряться не будут...
--------------------
IRC-канал Винграда |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |