Sources
Delphi Russian Knowledge Base
DRKB - база знаний по Дельфи в рунете, составленная Виталием Невзоровым

TStrings и TStringList

01.01.2007

Класс TStrings

Многофункциональный класс, предназначенный для хранения текстовых строк и связанных с ними объектов (любых потомков TObject). TStrings - абстрактный класс; он только описывает методы работы с наборами строк и сопутствующих им объектов, но как именно они хранятся, на его уровне не определено. Его потомки очень многочисленны; они играют основную роль в компонентах-списках (TListBox, TComboBox), редакторе (TMemo) и других. Так что вам чаще всего придется иметь дело с TStrings как со свойством одного из компонентов. В дальнейшем экземпляры этого класса и порожденных от него классов мы-будем называть наборами строк. Для создания собственных наборов строк вне компонентов предназначен потомок TStrings - TStringList, который будет рассмотрен ниже.

К строкам и объектам соответственно можно получить доступ через свойства:

property Strings[Index: Integer]: string;
property Objects[Index: Integer]: TObject;

Первое из них является векторным свойством, принимаемым по умолчанию. Общее количество пар в списке равно значению свойства:

property Count: Integer;

Класс TStrings также предназначен для хранения пар вида 'параметр=значение', например, в файлах инициализации (.INI). Эту возможность реализует следующее свойство:

property Values[const Name: string]: string;

При обращении к этому свойству для чтения ищется строка, содержащая подстроку (параметр) Name и символ '='. Если она найдена, возвращается то, что находится в этой строке после '='. Если нет, Values[Name] равно пустой строке.

При записи: если строка, содержащая параметр Name, найдена - ее значение после '=' заменяется новым значением, если нет - строка добавляется. Если существующему параметру присваивается пустая строка (Values[Name] := '';), то он удаляется из набора строк.

Методы класса

procedure BeginUpdate;
procedure EndUpdate;
Пара процедур, которые устанавливают и сбрасывают флаг обновления набора. Между ними, для ускорения работы, нужно заключать все операции по копированию, удалению и т. д. большого количества элементов.
procedure Clear;
Осуществляет полную очистку набора.
procedure Insert(Index: Integer; const S: string);
Вставляет строку S под индексом Index.
procedure Delete(Index: Integer);
Удаляет строку с индексом Index.
function IndexOf(const S: string): Integer;
Возвращает индекс (номер в наборе) строки S.
Если она не найдена, функция возвращает -1.
function IndexOfObject(AObject: TObject): Integer;
Возвращает индекс объекта в наборе. В случае неудачи возвращает -1.
function Equals(Strings: TStrings): Boolean;
Сравнивает строки вызвавшего его объекта со строками объекта Strings и возвращает True в случае равенства (сравниваются число строк и все строки попарно).
function Add(const S: string): Integer;
Добавляет строку S в конец набора и в случае успеха возвращает присвоенный ей индекс (он должен быть равен значению Count до добавления строки).
function AddObject(const S: string; AObject: TObject): Integer;
Добавляет строку в паре с объектом. Возвращает то же, что и метод Add.
procedure Exchange(Indexl, Index2: Integer);
Меняет местами пары строка+объект с индексами Indexl и Index2.
procedure Move(Curlndex, Newlndex: Integer);
Перемещает пару строка+объект с позиции Curlndex в позицию Newlndex.
procedure InsertObject(Index: Integer; const S: string; AObject: TObject);
Вставляет объект AObject и соответствующую ему строку S в набор под индексом Index.

Шесть методов предназначены для экспорта/импорта наборов строк:

При этом метод

function GetText: PChar;

выгружает строки в единый массив, где они разделены парами символов CR/LF; в конце такого массива ставится нулевой байт. Размер массива не может превышать 65520 байт; поэтому строки выгружаются до тех пор, пока их суммарная длина не превосходит этого значения.

Метод

procedure SetText(Text: PChar);

читает строки из массива Text. Строки в массиве должны быть отделены друг от друга парой символов CR/LF; допускается и один символ LF (16-ричный код $ОА). Символы с кодами 0, $lA(<Ctrl>+<Z>) воспринимаются как конец текста. При этом прежнее содержимое набора уничтожается.

Класс TStringlist

Этот класс объединяет в себе свойства TStrings и TList простейшим способом - указатель на объект и соответствующая строка объединяются в запись, указатель на которую хранится в списке. В классе переопределены многие виртуальные методы TStrings: Add, Clear, Delete, Exchange, IndexOf, Insert; он является полностью функциональным и вы можете создавать экземпляры TStringList в своей программе для работы с наборами строк и объектов (помимо тех, которые уже есть в компонентах).

Кроме унаследованных от TStrings, определены дополнительно полезные методы и свойства:

function Find(const S: string; var Index: Integer): Boolean;
Метод ищет в наборе строку S и в случае успеха возвращает результат True, а в параметре Index - ее индекс.
property Sorted: Boolean;
Свойство - признак отсортированности элементов (сортировка осуществляется через посимвольное сравнение строк). Установка Sort := True вызывает процедуру сортировки, которую можно вызвать и явно при помощи метода:
procedure Sort;
Попытка добавить или вставить элемент в отсортированный список вызывает исключительную ситуацию EListError; в этом случае до выполнения действия свойству Sorted нужно присвоить значение False.
property Duplicates: TDuplicates; TDuplicates = (duplgnore, dupAccept, dupError);
Свойство определяет, что происходит при попытке добавить в список дубликат уже имеющейся строки:
property OnChange: TNotifyEvent;
property OnChanging: TNotifyEvent;
Два свойства, предусмотренные для определения пользователем своей реакции на изменение данных. Событие OnChanging вызывается во многих рассмотренных выше методах до внесения первого изменения, OnChange - после последнего.

Дополнительные материалы:

Previous page:
Несколько функций для TStream
Top:
DRKB
Next page:
Как самому определить метод сортировки TStringList?