Delphi. Урок 14. Работа со списками строк TStringList или «сложные» типы

Уроки для начинающих   4 Май 2012  Автор статьи: admin 

В этом уроке мы рассмотрим новый тип данных TStringList, который содержит в себе список строк типа string.

Что такое TStringList и что такое «сложные» типы

Другими словами, TStringList — это массив строк, который имеет целый ряд различных возможностей, позволяющих производить различные операции над строками.
TStringList представляет собой не просто переменную, которые мы с вами разбирали в предыдущих уроках (integer, string и т.п.). Переменная типа TStringList — это объект, который непосредственно внутри себя снабжен определенными функциями, процедурами и параметрами. Фактически, выглядит это все как и у обычного компонента (присутствуют «встроенные» функции, процедуры, параметры), а если забежать немного вперед, то компоненты — это и есть такие же переменные (прямо как и TStringList и даже integer), хотя будет гораздо более грамотней их называть именно объектами. Но, пока мы еще не полностью осознаем структуру объектов в Delphi, забегать вперед я больше не буду. Скажу лишь, что не стоит этого пугаться, и пока принимать все так как оно есть. В дальнейшем этой теме будут посвящены целые статьи. Давайте лучше перейдем к изучению типа TStringList.
В разделе var объявляется он следующим образом, впрочем как и обычные переменные:

1
2
var
  s: TStringList;

Однако использовать весь функционал типа TStringList мы еще не можем. Это еще одна особенность этих «сложных» типов. Запомните, прежде чем работать с объектами таких типов (т.е. прежде чем работать с переменной s (в нашем случае)), необходимо сначала их создать. В разделе Var мы только объявляем переменные, но не создаем. А вот создать переменную (объект) — это значит присвоить ей какое-либо начальное значение и подготовить ее к работе. Если создание переменной типа integer осуществляется обыкновенным присвоением ей числа, то создание объекта (переменной) типа TStringList будет выглядеть следующим образом:

1
2
3
4
5
var
  s: TStringList;
begin
  s := TStringList.Create;
end;

«TStringList.Create» — это конструктор типа TStringList. Грубо говоря, это то, что нужно присвоить в качестве изначального значения новому экземпляру типа TStringList. И вот теперь уже доступны все возможности TStringList.
[help]Хотите узнать, что будет если не создавать TStringList, да в общем-то и любой другой сложный объект, содержащий в себе параметры, процедуры, функции? Как только вы попробуете обратиться к любому свойству, параметру, процедуре или функции этого объекта, появится ошибка Access Violation. Поэтому не забывайте создавать объекты, прежде чем работать с ними.[/help]

Методы и параметры объектов типа TStringList

Методами объектов будем называть все процедуры и функции рассматриваемого типа объектов.
TStringList позволяет хранить строки как в отсортированном виде, так и в неотсортированном. Хоть сортировка строк в TStringList и не является востребованной возможностью, однако рассмотреть ее все-таки стоит. По умолчанию, сортировка в объекте TStringList выключена. Включить ее можно следующим образом:

1
s.Sorted:=True;

Как вы видите, у объекта типа TStringList существуют вложенные параметры и методы, и работать с последними можно также как и с параметрами и методами у обычных компонентов. На самом деле, разницы в устройстве между TButton (кнопкой) и TStringList нет. Их объединяет одно — что та кнопка, что TStringList являются обыкновенными объектами, просто эти объекты являются экземплярами разных типов (классов). Такие «сложные» типы, как TButton или TStringList грамотнее называть классами. Т.е. типы объектов, имеющие вложенные в них методы и параметры будем называть классами.
Продолжим изучение класса TStringList.

Для того, чтобы добавить строку в TStringList существует метод Add. В качестве единственного параметра ему необходимо передать переменную типа string:

1
s.Add('This is a string');

При этом создается новая строка, которая помещается сразу после предыдущих (если сортировка выключена).

Как я уже и говорил, TStringList — это массив строк. И действительно — к каждой строке TStringList можно обратиться по индексу (исчисляются эти индексы с нуля):

1
2
3
4
5
s.Add('This is a test');
s.Add('This is a second line');
showmessage(s[0]);
showmessage(s[1]);
s[0]:=s[0] + '123';

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

Для удаления одной строки с определенными индексом можно использовать метод Delete. В качестве единственного параметра ему необходимо передать индекс удаляемой строки.

1
s.Delete(1);

Метод Clear позволяет полностью удалять все строки. Параметров у него нет.

Метод Count возвращает количество строк в объекте типа TStringList. Параметров ему тоже передавать не нужно.
Чтобы узнать индекс последней строки в TStringList, можно использовать метод count:

1
Last := s.count - 1;

Метод Find позволяет находить индекс Index указанной строки S. Возвращает в качестве результата True, если такая строка существует, или False, если такая строка не существует.

1
function TStringList.Find(const S: string; var Index: Integer): Boolean;

Метод IndexOf аналогичен методу Find, возвращает индекс искомой строки, или -1, если такой строки не существует.

Метод Insert вставляет определенную строку с определенным индексом. Выглядит он следующим образом:

1
procedure TStringList.Insert(Index: Integer; const S: string);

Метод Text не имеет никаких параметров. Он возвращает все строки целиком — в виде одной строки. В таком случае переводы между строками будут осуществляться символами с кодом #13, которые отображаются как переход на новую строку.

1
showmessage(s.text);

Метод LoadFromFile позволяет загрузить содержимое TStringList из файла. При этом каждая строка будет загружена по отдельности. Прежде чем загружать файл в TStringList, рекомендуется узнать существует ли он вообще. Делается это при помощи функции FileExists, которая возвращает true, если файл существует.

1
2
if FileExists('C:\textfile.txt') then
  s.LoadFromFile('C:\textfile.txt');

Для сохранения содержимого TStringList в файл используется функция SaveToFile, которой нужно передать путь сохранения файла. Если такой файл уже существует, то он будет автоматически перезаписан.

Ну и напоследок, расскажу о методе Free. Служит этот метод для удаления самого объекта TStringList. При этом удалении происходит очистка оперативной памяти от содержимого удаляемого объекта. После такого удаления мы уже не сможем работать с самим объектом — только после того, как вновь его создадим.

  • Alex Verzh

    «TStringList позволяет хранить строки как в отсортированном виде, так и в отсортированном.» отрицание пропустил.

    • Alex Verzh

      «Он возвращает все строки целеком». Целиком.

  • Alex Verzh

    «TStringList позволяет хранить строки как в отсортированном виде, так и в отсортированном.» отрицание пропустил.

    • Alex Verzh

      «Он возвращает все строки целеком». Целиком.

  • Kudi

    привет! можешь мне помочь? у меня такой задания.

    Фермер занимается разведением овечек.

    На ферме – 4 загона, в которых содержаться овечки. Овечки размножаются
    каким-то случайным образом (полностью на ваше усмотрение, например: одна овечка
    за каждые 10 секунд, а для отсчета можно использовать время последнего
    обновления страницы), но есть одно правило: если в загоне остается одна овца,
    то размножаться она не может.

    Любых овечек в загонах можно выбрать и пустить на мясо. Количество
    зарубленных овец должно подсчитываться.

    Все данные, кроме конфигурационных, хранить в базе данных. Тип базы данных
    не важен.

    Программа должна иметь интерфейс для управления и контроля поголовья
    мелкого рогатого скота.

    ХОТЬ ОДНУ ФЕРМУ ПОКАЖИ PLZ(((

    если Вопросы я на это Kudayberdi@mail.ru

  • Денис

    Помогите разобраться пожалуйста. Все вроде правильно написал — выдает ошибку. Почему — то ему не нравится строка s:=TStringList.create;. Я уже и в знакомых спрашивал, которые проходили курс по Delphi, они не знают в чем проблема.

    Пробовал еще перед begin в процедуре писать, всё равно не то. Я не могу работать с TStringList, если он даже не создается.

Научиться программировать

  • на Delphi

  • на Java

  • на C++