Колекції стор
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
Якщо ви вже знайомі з моїми роботами, повинні знати, що для динамічного зберігання списку об'єктів я люблю використовувати компонент TList. Наприклад, якщо при динамічному створенні зображень (див. розділ "Збереження даних проекту") я захотів би зберегти покажчик на зображення з додатковою інформацією у списку, то таким списком був би компонент TL1st. У розділі 4 ми будемо розглядати приклади динамічного збереження списків об'єктів і будемо використовувати TL1st. Чому? Це тільки справа звички, адже у Delphi є ефективніший засіб зберігання списків об'єктів - колекції.
Для зберігання динамічного масиву об'єктів найкращим варіантом є використання компонента TCollection. Він може зберігати об'єкти заздалегідь визначеного типу і автоматично створювати новий об'єкт при додаванні елемента до колекції. Щоб краще збагнути механізм роботи колекцій, розглянемо реальний приклад.
Припустимо, нам потрібно зберігати в пам'яті динамічний список робіт, який буде включати в себе таку інформацію, як прізвище, ім'я і дата народження, стать і т. д. Щоб не ускладнювати приклад, обмежимося тільки цими даними.
Для початку створимо об'єкт, який зберігатиме всі необхідні властивості. При цьому об'єкт повинен бути спадкоємцем від TCollectionltem:
Наслідування від TCollection I ten є обов'язковою умовою. Код зберігання об'єктів такого типу за допомогою колекцій показано у лістингу 2.25.
Лістинг 2.25. Зберігання об'єктів у колекції
procedure TForml.bnTestCollectionCIick(Sender: TObject): var pi. TPersonlnfo: i:Integer: begin PersonCol1ecti on:=TCol1ecti on.Create(TPersonInfо):
//Додаємо один елемент
// Додамо ще елемент, але заповнюватимемо через with. // щоб не заводити окрему змінну with TPersonlnfo(PersonCollection.AddO) do begin Name:='Ірина'. SurName - 'Смирнова'; Pol:='"': Age.=24: end:
Для створення нової колекції використовується метод Create, котрий викликає конструктор об'єкта. В якості параметра йому необхідно передати клас об'єкта, що зберігається в колекції. У нашому випадку - це TPersonlnfo.
Для додавання нового елемента колекцію використовується метод Add. Йому не треба передавати жодних параметрів, метод сам створює новий об'єкт, додає його в колекцію, а як результат повертає покажчик на створений об'єкт. У нашому випадку результат зберігається в змінній pi типу TPersonlnfo:
Метод Add повертає тип TCollectlonltem, і щоб привласнити цей результат змінної р1, результат наводиться до типу TPersonlnfo. Як колекція дізнається, який тип об'єкта потрібно створити? Пам'ятаєте, при створенні колекції ми передали конструктору тин TPersonlnfo? Завдяки цьому все працює як слід і без нашого втручання.
У цьому прикладі ми створюємо два елементи колекції та заповнюємо їх даними. Після цього запускається цикл, у якому перебираються всі елементи і екран виводиться інформація про об'єктах.
Як бачите, все простіше і навіть зручніше, ніж при використанні компонента ТИ st. Насамкінець коротко розглянемо властивості та методи колекцій. Почнемо з властивостей:
У Items – список елементів у колекції; для доступу до певного елемента індексу використовується запис: Items[індекс]
У NextIO - унікальний ідентифікатор, який присвоюється новому елементу при додаванні його до колекції (кожен елемент колекції має унікальний ідентифікатор, і ціідентифікатори можна використовувати у своїй програмі).
Методів у об'єкта більше, ніж властивостей:
В Insert - створити новий елемент і вставити його в колекцію йод певним індексом (наприклад, якщо ви хочете, щоб новий елемент був першим, і щоб ви могли звертатися до нього як ltems[0], використовуєте метод Insert, вказавши як параметр індекс 0 ).
Це основні методи та властивості, які вам знадобляться під час розробки власних додатків.
Крім самої колекції необхідно добре розбиратися в усіх елементах, які є спадкоємцями класу TCollectlonltem, а значить, успадковують його властивості та методи. Давайте розглянемо основні властивості та методи:
Changed - цей метод повертає true, якщо елемент змінено.
Хоча колекції пропонують дуже зручний спосіб зберігання об'єктів (структур даних, які можна реалізувати у вигляді об'єкта, спадкоємця від TCollectlonltem), я все ж таки звик до структур і об'єкта TLi st, тому в цій книзі використовуватиму саме цей метод. Але це не означає, що колекції погані, навпаки, вони хороші, просто діє звичка.
ПРИМІТКА Вихідний код розглянутого прикладу знаходиться на компакт-диску в каталозі Sources\ch02\MenuXP.