Объект TStrings
 
Данный объект предназначен дл� работы с массивом строк. Он содержит довольно удобный набор методов и свойств дл� доступа к любой строке из массива и дл� различных манипул�ций с ними.

Объект TStrings компонентом не �вл�етс�. Он �вл�етс� пр�мым потомком TPersistent, что говорит о том, что этот объект может писать свои данные в поток и читать их оттуда.

Этот объект используетс� компонентами, которые содержат массивы строк,а это списки TListBox, раскрывающиес� списки TComboBox, таблицы TStringGrid и другие. �акже можно создавать не св�занные с компонентами массивы строк дл� разных нужд, так как этот объект содержит довольно комплексный набор средств дл� работ с ними и не нужно изобретать велосипедов.

 
Свойства TStrings
�ак как данный объект служит дл� работы со строками, то его свойства определ�ют все, что с этими строками св�зано. Во первых это массив Strings, который �вл�етс� непосредственно самим массивом строк, через него можно получить любую строку. Во вторых это свойство Count, в котором записано количество строк, наход�щихс� в этом массиве.

�акже здесь есть довольно хитрые, облегчающие работу свойства. Если, допустим, вы работаете со строками типа Date=25.07.1981, то данный объект умеет раздел�ть строку на левую и правую часть. В данном случае левые части хран�тс� в массиве Names, а правые соответственно в массиве Values. Разумеетс�, если ваши строки не имеют такой формат, то смысл этих значений тер�етс�. Если сказать конкретно, то дл� такого типа строки:

Strings[2]:=Names[2]+'='+Values[2];

�акже объект TStrings имеет определенные расширени� по отношению к простому массиву строк. Дело в том, что к каждой строке можно подв�зать определенный объект! Любой! Дл� этого используетс� свойство Objects. Этот массив полностью соответствует по своей нумерации массиву Strings, однако позвол�ет логически подв�зать к строке объект. Это свойство объ�вл�етс� как:

Objects: array of TObject

что говорит о том, что можно подв�зать СОВЕРШЕННО ЛЮБОЙ объект к строке. Допустим у вас есть список людей и фотографии дл� них. К примеру имена людей: 'Андрей', 'Вас�' и 'Сергей', а их фотограффии хран�тс� в файлах 'andrey.bmp', 'vasya.bmp' и 'sergey.bmp'. В этом случае было бы удобно к имени каждого человека подв�зать картинку. Однако это свойство не работает в TStrings напр�мую, а работает в его потомках. Однако рассмотрим пример, как можно это сделать:

var
MyFriends:TStrings;
B1:TBitmap;
begin
{Заполн�ем строки}
MyFriends.Strings[0]:='Андрей';
MyFriends.Strings[1]:='Вас�';
MyFriends.Strings[2]:='Сергей';
{Загружаем картинки}
B1:=TBitmap.Create;
B1.LoadFromFile('andrey.bmp');
MyFriends.Objects[0]:=B1;
B1.Free;
B1:=TBitmap.Create;
B1.LoadFromFile('vasya.bmp');
MyFriends.Objects[1]:=B1;
B1.Free;
B1:=TBitmap.Create;
B1.LoadFromFile('sergey.bmp');
MyFriends.Objects[2]:=B1;
B1.Free;

end;

Вот таким образом мы получили структуру, состо�щую из строк и картинок, ассоциированных с ними. Причем дл� загрузки всех картинок мы использовали всего одну переменную B1. Просто каждый раз мы освобождали пам�ть дл� нее и загружали снова.

�еперь можно на основе объекта получить строку, ассоциированную с ним и с помощью строки получить объект, ассоциированный с ней. И строки и объекты идут под одной нумерацией. Довольно удобно! �аким образом можно подв�зывать к каждой строке массив строк, или даже целую таблицу, создава� таким образом структуры любой сложности.

В объекте TStrings есть еще два свойства: Text и CommaText. Через свойство Text можно получить весь массив строк в виде одной строки, разделенной символами возврата каретки. Свойство CommaText позвол�ет получить весь массив в виде строки, оформленной определенным образом. Допустим у нас есть массив TStrings со следующими строками:

MyStr.Strings[0]:='Андрей';
MyStr.Strings[1]:='Вас�';
MyStr.Strings[2]:='Сергей';

В данном случае MyStr.CommaText будет равно:

"Андрей","Вас�","Сергей".

Вот то, что касаетс� свойств TStrings. Можно напр�мую назначать эти свойства и читать их. Однако данный объект имеет обширный набор методов, позвол�ющих упростить процесс работы с элементами всех этих массивов. Далее мы рассмотрим эти методы.

 
Методы TStrings
Методы TStrings работают с данными массивами. Они позвол�ют добавл�ть элементы к массиву, вставл�ть, удал�ть, перемещать и искать. �акже можно перекидывать один массив в другой.
 
Работа со строками
Данный набор методов позвол�ет производить различные манипул�ции со строками массива.

Метод Add(S) добавл�ет строку S в конец массива. Этот метод возвращает номер этой строки в этом массиве. Метод Append(S) делает то же самое, только не возвращает номера. Метод Insert(I,S) вставл�ет строку S в позицию I массива строк. Метод Delete(I) удал�ет строку c номером I из массива.

�акже есть методы, позвол�ющие получить и установить свойство Text. Метод GetText позвол�ет получить содержимое свойства Text и записать его в какую-нибудь переменную. Свойство SetText(S) позвол�ет записать содержимое S в свойство Text. Соответственно это полностью изменит то, что было в массиве строк.

�акже можно искать строки в массиве. Метод IndexOf(S) ищет строку S в массиве и если она есть - возвращает ее номер. Если строка S встречаетс� несколько раз, то возвращаетс� перва� встречна�. Метод IndexOfName(S) служит дл� работы со строками Им�=Значение и возвращает номер строки где "Им�" соответствует S.

Еще здесь существет метод Move(I,I1), позвол�ющий перемещать строку из позиции I в позицию I1 массива. Этот метод может быть полезен при сортировке.

�акже можно помен�ть две строки местами с помощью метода Exchange(I,I1). В данном случае строки с номерами I и I1 помен�ютс� местами.

 
Работа с ассоциированными объектами
С ассоциированными объектами можно поступать также как и со строками. Их можно добавл�ть, вставл�ть и удал�ть. �олько методы дл� работы с объектами более комплексны. Допустим метод AddObject(S,O) позвол�ет добавить к массиву И строку И объект ассоциированный с ним. Аналогично InsertObject(I,S,O) вставл�ет в позицию I и строку и объект, ассоциированный с ней. Дл� удалени� объекта используетс� тот же метод Delete(I), который удал�ет и строку, и ассоциированный с ней объект. Удалить строку оставив ассоциированный с ней объект невозможно.Дл� того чтобы добавить объект к строке не мен�� строки при этом придетс� заниматьс� ручным приравниванием. Допустим, чтобы добавить к строке "Вас�", объект картинки B1, нужно написать так.

MyFriends.Objects[MyFriends.IndexOf('Вас�')]:=B1;

�акже можно мен�ть строки и их объекты местами с помощью метода Excahge(I,I1). В этом случае элементы с номерами I и I1 помен�ютс� местами.

 
Работа с массивами
Выше была описана работа с отдельными элементами. Однако в некоторых случа�х нужно работать с массивами в целом. Массивы можно загружать из файла, из потока, из другого аналогичного массива. Массивы можно сравнивать, удал�ть и т.д.

Можно загрузить данные в массив TStrings из другого массива с помощью метода Assign(TS), где TS, это им� другого массива TStrings, откуда данные будут загружены. В данном случае будут добавлены не только строки, но и объекты. Можно добавить данные одного TStrings в конец другого. Это делаетс� методом AddStrings(TS). Работает аналогично Assign, однако он не затирает все что было в объекте назначени�, а добавл�ет данные объекта-источника в конец объека назначени�.

Метод LoadFromFile(F) позвол�ет загрузить строки из файла F. В данном случае загружаютс� только строки, а не ассоциированные объекты. Данные файла должны быть представлены в виде строк, разделенных символом возврата каретки. Метод SaveToFile(F) записывает массив строк в файл F.

Методы LoadFromStream(Stream:TStream) и SaveToStream(Stream:TStream) позвол�ют загружать строки из потока Stream и сохран�ть их в нем.

�акже у объекта TStrings есть вспомогательный метод Equals(TS1,TS2), который сравнивает содержимое двух объектов TStrings и возвращает True, если они равны и False если нет. Чтобы объекты были равны, нужно чтобы у них было одинаковое количество строк, а также, кажда� строка вместе с ассоциированным объектом должна быть равна соответствующей строке другого TStrings вместе с объектом, т.е. TS1.Strings[0]=TS2,Strings[0] и т.д.

И еще, последнее, самое жестокое. Содержимое объекта TStrings можно жестоко удалить методом Clear.

 
Другие вспомогательные методы
�аже объект TStrings содержит несколько дополнительных, глобальных методов, которые относ�тс� к внутренним аспектам данного объекта.

Это методы Create, Destroy и Free, которые идут далеко от объекта TObject и �вл�ютс� необходимыми в том случае, если вы сами создаете объект TStrings. �е объекты, которые ассоциированы с компонентами забот�тс� о себе сами. Эти методы описаны в описании объекта TObject, однако повторюсь. Метод Create создает объект и выдел�ет дл� него пам�ть. Метод Destroy удал�ет объект и освобождает выделенную под него пам�ть. Метод Free тоже удал�ет объект, выполн�� предварительную проверку на тот случай, если объект уже был удален. Лучше дл� удалени� пользоватьс� именно им.

�акже существуют два довольно важных метода BeginUpdate и EndUpdate. Дл� объекта TStrings они абстрактны, однако потомки этого метода конкретизируют их дл� себ�. Эти методы нужно вызывать дл� визуальных компонентов, при изменении их массива элементов. Метод BeginUpdate вызываетс� перед тем, как что-то было изменено, а метод EndUpdate после. Это обеспечит реакцию визуального компонента на это. Допустим, после того как вы добавили строку в таблицу, ей нужно перерисовать себ� чтобы эту строку показать. EndUpdate делает это.

 
Заключение
Вот все то, что можно делать с массивами строк через объект TStrings.

РАБО�А СО С�РОКАМИ И ИХ ОБЪЕК�АМИ

Add(S:String);
Append(S:String);
AddObject(S:String; O:TObject);
Insert(I:Integer; S:String);
InsertObject(I:Integer; S:Integer; O:TObject);
Delete(I);
IndexOf(S:String);
IndexOfName(S:String);
SetText(S:String);
GetText(S:String);
Move(I,I1:Integer);
Exchange(I,I1:Integer);

РАБО�А С МАССИВАМИ

Assign(TS:Tstrings);
AddStrings(TS:Tstrings);
LoadFromFile(F:String);
SaveToFile(F:String);
LoadFromStream(Stream:TStream);
SaveToStream(Stream:TStream);
Equals(TS1,TS2:TString);

ДОПОЛНИ�ЕЛЬНЫЕ ФУНКЦИИ

Create;
Free;
Destroy;
BeginUpdate;
EndUpdate;

ВСЕГО 24 метода

Объект TStrings �вл�етс� слишком абстрактным дл� того, чтобы работать со строками использу� все описанные выше возможности напр�мую. Поэтому дл� более полной работы нужно использовать его более специализированных потомков. Допустим объект TStrings содержит массив Objects и методы дл� работы с ним, хот� реально работать с этим массивом не может. Поэтому, если вы хотите работать с массивом строк и ассоциированных объектов, нужно использовать его потомка TStringList. Читайте об этом далее. А пока с этой частью все.

Удачной Вам работы!

С уважением А.Германов.