Delphi для професіоналів. Списки і колекції
property Strings [Index: Integer]: string read Get write Put; default;
Для роботи з властивістю використовуються внутрішні методи Get і Put. в яких застосовується внутрішня змінна FList.
TStringltem = record FString: string;
TStringltemList = array [0..MaxListSize] of TStringltem;
Максимальний розмір списку обмежений константою
MaxListSize = Maxint div 16;
значення якої після нехитрих обчислень складе 134 217 727. Таким чином, видно, що строковий список Delphi теоретично кінцевий, хоча на практиці набагато частіше розмір списку обмежується розміром доступної пам'яті.
Звернення до окремого елементу списку може здійснюватися через властивість strings таким чином:
Обидва способи рівноцінні.
За допомогою простого присвоювання можна задавати нові значення тільки тоді, коли елемент вже створений. Для додавання нового елемента використовуються методи Add І AddStrings.
function Add (const S: string): Integer;
додає в кінець списку новий елемент, привласнюючи йому значення s і повертаючи індекс нового елементу в списку.
procedure Append (const S: string);
просто викликає функцію Add. Єдина відмінність полягає в тому, що метод не повертає індекс нового елементу.
procedure AddStrings (Strings: TStrings);
додає до списку цілий набір нових елементів, які повинні бути задані іншим списком, переданим в параметрі strings.
При необхідності можна додати новий елемент в довільне місце списку. Для цього застосовується метод
procedure Insert (Index: Integer; const S: string);
який вставляє елемент s на місце елемента з індексом index. При цьому всі зазначені елементи зміщуються на одну позицію вниз.
Для видалення елемента списку використовується метод
procedure Delete (Index: Integer);
procedure Move (Curlndex, Newlndex: Integer);
переміщує елемент, заданий індексом curindex. на нову позицію, задану індексом Newlndex.
procedure Exchange (Indexl, Index2: Integer);
міняє місцями елементи з індексами index1 і index2.
Досить часто в списках размешается строкова інформація наступного вигляду:
Як приклад можна навести рядки з файлів INI або системного реєстру. Спеціально для таких випадків у списку передбачено представлення рядків в двох властивостях. У властивості Names міститься текст до знаку рівності. У властивості values міститься текст після знаку рівності за замовчуванням. Однак символ-роздільник можна замінити на будь-який інший, використавши властивість
property NameValueSeparator: Char;
Доступ до значень властивості values здійснюється за значенням. Наприклад, якщо в списку є рядок
то значення властивості value дорівнюватиме
Крім цього, значення властивості value можна отримати, якщо відомий його індекс:
property ValueFormlndex [Index: Integer]: string;
property Objects [Index: Integer]: TObject;
Властивість strings елементу і властивість objects пов'язаного з ним об'єкта мають однакові індекси. Якщо рядок не має зв'язаного об'єкту, то властивість objects одно Nil. Один об'єкт може бути пов'язаний з декількома рядками списку одночасно.
Найчастіше об'єкти потрібні для того, щоб зберігати для кожного елемента додаткову інформацію. Наприклад, в списку міст для кожного елемента можна додатково зберігати населення, площа, адміністративний статус і т. Д. Для цього можна створити приблизно такий клас:
Для того щоб додати до рядка зі списку об'єкт, використовується метод AddObject.
function AddObject (const S: string; AObject: TObject): Integer; virtual;
Зверніть увагу, що в параметрі AObject необхідно передавати покажчик на об'єкт. Найпростіше це зробити таким чином: