» Класс TStringList Borland Delphi. . . Блог программистов


Блог программистов




20077 Май

Класс TStringList

   Сегодня я расскажу про класс TStringList, который является заменой массивам из элементов типа string и предоставляет набор функций для работы с массивом строк. Этот тип так же позволяет сохранять список строк в текстовый файл, и загружать список из текстового файла. Этот класс является полной заменой старым функциям по работе с текстовыми файлами Read(Ln) и Write(Ln). Эта статья в первую очередь для чайников — всем чайникам не отрываться от экрана, и не отвлекаться на другие вещи! Но профессионалам не помешает «читануть» эту статью. Фактически эта статья это почти полный мануал по классу TStringList.

   Начнём сначала. Сначала «родословную» класса:

TStringList = class(TStrings)
TStrings = class(TPersistent)
TPersistent = class(TObject)

   Класс TStrings является абстрактным классом, все ключевые свойства и методы абстрактны, т.е. объявлены как abstract, и требуют обязательного переобъявления классах потомках, что и сделано в классе TStringList.
   Для того чтобы можно было работать с этим классом, надо создать экземпляр этого
класса — объект. Создание объекта TStringList:

Var
 STR: TStringList;
Begin
 STR:= TStringList.Create;

   Итак, объект создан. Для добавления строки используется метод Add единственным параметром, которого является добавляемая строка. Строка будет добавлена после самой последней строки. Тоже самое делает метод Append. Для того чтобы вставить строку в определённую позицию надо использовать функцию Insert.
procedure Insert(Index: Integer; const S: string); override;
параметр Index задаёт позицию добавляемой строки, если указать 0, то строка будет самой первой, если 1, то строка будет второй. Разумеется нумерация с нуля. Строка, которая стоит на этой позиции будет сдвинута вперёд. Нельзя указывать индекс строки больше чем строк в списке, произойдёт исключение. Ну и для удаления строки используется функция Delete, в качестве единственного параметра которой надо указывать индекс строки для удаления. Весь список строк предоставляется свойством-массивом Strings. Оно доступно как для чтения так и для изменения. Используется это свойство так:
ShowMessage(STR.Strings[1]);
выведется вторая строка в массиве. Описание свойства

property Strings[Index: Integer]: string read Get write Put;
default;

Отсюда видно, что оно свойство по умолчанию. Поэтому его можно не указывать можно просто:
ShowMessage(STR[5]);
   Для получения количества элементов используется функция Count, которая возвращает количество элементов в списке. Весь список очищается с помощью метода Clear.
   Для получения индекса строки используется функция IndexOf, которая принимает строку, и возвращает индекс строки, если результат -1, строка не найдена. Свойство CaseSensitive задаёт чувствительность к регистру символов при поиске, если False, то заглавные и строчные буквы это одно и то же при поиске и других операциях.
   Для того чтобы поменять местами две строки есть метод Exchange, которой надо передать два числа которые задают индексы строк. Для перемещения строки на новую позицию используется функция Move, передав ей индекс строки для перемещения и индекс новой позиции.
   TStringList позволяет сортировать список в алфавитном порядке. Для сортирования всего списка в алфавитном порядке надо вызвать метод Sort или присвоить свойству Sorted значение True. После сортировки обратно вернуть строки на свои места невозможно. Различие между этими методами сортировки в том, что метод Sort просто сортирует список, а при присваивании свойству значения True, каждое добавляемое значение будет сортироваться, и воспользоваться методом Insert будет невозможно – будет генерироваться исключение. Так же нельзя использовать функции Exchange и Move. Для отсортированных списков рекомендуется использовать функцию Find для поиска строки. Эта функция возвращает True, если строка найдена. Пример:

if str.Find(‘222’,i) then
 ShowMessage(IntToStr(i));

Вторым параметром надо передавать переменную, в которую функция сохранит индекс найденной строки. Для контроля добавляемых значений в отсортированный список используется свойство Duplicates.

TDuplicates = (dupIgnore, dupAccept, dupError);

Если указано dupAccept, то контроля нет. Если указано dupError, то при добавлении строки которая уже есть, будет генерироваться исключение. Если указано dupIgnore, то при добавлении строки, которая уже есть, она не будет добавляться.
   Для добавления группы строк используется функция AddStrings, которая принимает объект TStrings или TStringList. Примеры:

Memo1.Lines.AddStrings(STR);
Memo1.Lines.AddStrings(Memo2.Lines);

   Для того чтобы сохранить список в файл используется функция SaveToFile, которая принимает путь к файлу. Соответственно для загрузки из текстового файла надо вызвать функцию LoadFromFile с таким же параметром.
   Для сравнения списка с другим списком надо вызвать функцию Equals и передать ей в качестве единственного параметра объект типа TStrings или TStringList. Пример:

if Memo1.Lines.Equals(Memo2.Lines) then
 ShowMessage(‘Совпадают’);

Или
if STR.Equals(STR1) then
 ShowMessage(‘Совпадают’);

   Функция GetText возвращает весь список в виде единого текста в качестве своего результата (результат имеет тип PChar). Что делает функция SetText я думаю уже понятно. Свойство Text доступно как для чтения, так и для записи позволяет работать со всем списком в виде единого текста как с одной строкой.
   Свойство DelimitedText позволяет конвертировать список в единый текст с разделителями. Распинаться не буду, приведу пример. Например, есть список:

Stri,ng 1
Stri"ng 2
String 3
String4

Свойство CommaText будет иметь значение:
"Stri,ng 1","Stri""ng 2","String 3",String4
Символ разделитель задаётся символом свойством Delimiter, а символ кавычек задаётся свойством QuoteChar. Свойство CommaText позволяет конвертировать список в SDF — System Data Format. Это тоже самое что использовать свойство DelimitedText, со свойством Delimiter равным ‘,’ и QuoteChar равным ‘"’. При присваивании значения этим свойствам они ведут себя одинаково. Например,
присваивается:

"Stri,ng 1", "Stri""ng 2" , String 3,String4
получится:
Stri,ng 1
Stri"ng 2
String
3
String4

   Под конец я расскажу наиболее примечательную возможность этого класса. Это возможность работы со списками типа имя-значение.
Например, есть список
First=12222
Second=4444
Third=3333

Тогда свойство STR.Names[1] возвратит ‘Second’. Свойство STR.Values[‘Second’] будет иметь значение ‘4444’. Ну как, смысл уловили? Символ разделителя задаёт свойство NameValueSeparator, можно использовать списки с любыми разделителями. Если в строке два разделителя, то именем является подстрока до первого разделителя. Также есть свойства ValueFromIndex, IndexOfName с ними я думаю, вы сами разберётесь.
   Вот и конец. Я думаю, что вы ощутили силу. Класс TStringList упрощает многие операции при работе со строками.
 

Комментарии

  1. Aluk
    Сентябрь 1st, 2007 | 19:23

    а для с++ билдера как будет выглядеть эта строка:
    Var
    STR: TStringList;

  2. Ergius
    Июнь 21st, 2008 | 14:37

    ГЕНИАЛЬНО! Просто гениально! Спасибо большое! я влюбился просто! Это самая классная вещь которую я читал про делфи!!! особенно с последним методом который там описан!!!

  3. astako
    Июнь 30th, 2008 | 11:29

    Свойства dupIgnore и dupAccept описаны не верно, все с точность до наоборот.

  4. rpy3uH
    Январь 29th, 2009 | 10:03

    Да, точно. наоборот. исправил.

  5. Шораана
    Март 31st, 2009 | 07:39

    а вы можете показать программу на Delphi сортировки списка?

  6. rpy3uH
    Апрель 12th, 2009 | 19:57

    Для сортировки списка есть свойство Sorted и метод Sort

  7. Азамат
    Май 6th, 2009 | 07:56

    А вот в Java много подобных классов.

  8. SerG
    Март 17th, 2010 | 18:16

    Как здорово! То, что нужно. А я, не зная об этом классе, хотел было уж использовать memo с visible:=false для работы с текстовым файлом.

  9. Sveta
    Октябрь 7th, 2010 | 16:00

    ❗ Спасибо,очень хорошо описан класс,я часто с ним работаю и такую справку всегда полезно прочесть

  10. Oleg
    Март 15th, 2012 | 14:36

    Удивили! ) «возможность работы со списками типа имя-значение» присутствовало в языке С++ лет эдак 20 назад… Урра!….наконец-то стало возможно работать с ним в Дельфи и для школьников/студентов…))

  11. rpy3uH
    Апрель 20th, 2012 | 14:44

    в Delphi тоже всегда было