Здесь <cr> — конец строки и <lf> — перевод каретки на новую строку. Таким образом, чтобы найти конец первой строки мы должны сканировать весь текст с целью поиска признака конца строки и перевода каретки (<cr> и <lf>). Это очень неудобно. А если у вас файл имеет размер в 100 строк и вам нужно получить доступ к 75-й строке? Как вы думаете, долго мы будем искать нужную строку? Нет, точнее сказать, что не долго, а неудобно.
Тут на помощь приходит объект TStrings, который является простым контейнером (хранилищем) для строк. Можно еще пользоваться более продвинутым вариантом этого объекта TStringList. Если посмотреть на иерархию объекта TStringList (рис. 10.3), то мы увидим, что он происходит от TStrings. Это значит, что TStringList наследует себе все возможности объекта TStrings и добавляет в него новые.
Для работы с объектом надо объявлять переменную типа объект:
var
f:TStringList; //Переменная типа объект TStringList.
Hierarchy
TObject
I
TP ersi stent l
TStrings I
TStringList
Иерархия объекта TStringList (снимок из файла помощи Delphi):
Инициализируется эта переменная как всегда методом create. Никаких параметров не надо. Чтобы освободить память объекта и уничтожить его, применяется метод Free. Метод использования объекта показан в листинге:
var
f:TStringList; //Переменная типа объект TStringList. begin
f:= TStringList.Create(); // здесь можно использовать класс f.Free; end;
В этом примере только создан новый объект и сразу произведено его уничтожение, без использования.
Давайте снова ВСПОМНИМ, ЧТО TStringList происходит ОТ TStrings. Использовать TStrings напрямую нельзя, потому что это абстрактный объект. Абстрактный объект— объект, который представляет собой пустой шаблон. Он может даже ничего не уметь делать, а только описывать какой-то вид или шаблон, на основе которого можно выводить полноценные объекты. Вот так TStringList добавляет в TStrings свои функции так, что он становится полноценным объектом.
В результате получается, что мы не можем объявлять переменные типа TStrings и использовать этот объект, потому что это всего лишь шаблон. Это и так и не так. Переменную мы можем объявлять, но использовать сам объект не можем. Зато мы можем объявить переменную типа TStrings, но использовать эту переменную как объект TStringList, потому что он происходит от первого. Это значит, что код, представленный в листинге 10.9, идентичен предыдущему.
var
f:TStrings; //Переменная типа объект TStringList. begin
f:= TStringList.Create(); f.Free; end;
В этом примере мы объявили переменную типа TStrings, но при создании про- инициализировали ее объектом TStringList. Это вполне законная запись, потому что объект TStringList происходит от TStrings. Новая переменная f будет работать как объект TStringList, хотя и объявлена как TStrings. Главное— каким объектом переменная проинициализирована.
Такие трюки можно проводить только с родственными объектами. Они не будут рассматриваться в этой книге, хотя знать их нужно, потому что вам может встретиться что-то подобное в чужом коде.
В разд. 7.6 мы уже познакомились с классом TStrings и его основными функциями, а сейчас оказывается, что это абстрактный класс и его нельзя создавать. Как же так получается? На самом деле, большинство компонентов используют именно TStringList.
Итак, давайте рассмотрим, как можно работать с помощью TStringList, с целью обработки текстовых файлов. Все очень просто. У него есть метод LoadFromFile, для которого нужно указать имя текстового файла. После этого через свойство strings можно получить доступ к любой строке, а в свойстве count находится число, указывающее на количество строк в файле. В листинге 10.10 показан пример загрузки файла и работа с первыми двумя строками. Обратите внимание, что строки нумеруются с нуля.
var
f:TStrings; //Переменная типа объект TStringList. begin
f:= TStringList.Create();
f.LoadFromFile('с:\filename.txt');// Загрузка текстового файла f.Strings[0]; II Здесь находится первая строка файла f.Strings[1]; // Здесь находится вторая строка файла
f.Free; end;
Давайте напишем пример, который будет искать в файле строку "Привет, Вася". Программный код, реализующий этот пример, приведен в листинге:
var
f:TStrings; //Переменная типа объект TStringList. i: Integer; // Счетчик begin
f:= TStringList.Create();
f.LoadFromFile('c:\filename.txt'); // Загружаем текстовый файл
for i:=0 to f.Count-1 do // Запускаем цикл begin // Начало для цикла
if f.Strings = 'Привет, Вася1 then //Если i-я строка равна нужной, то
Application.MessageBox('Строка найдена', 'Поиск закончен', MB_OKCANCEL)
end; 11 Конец для цикла f.Free; end;
Точно так же можно изменять данные в файле. Например, если вам надо изменить 5-ю строку на "Прощай, станция Мир", то следует внести изменения, как показано в листинге:
var
f:TStrings; //Переменная типа объект TStringList. i: Integer; // Счетчик begin
f:= TStringList.Create();
f.LoadFromFile(г с:\filename.txt'); II Загружаем текстовый файл
if f.Count>=5 then 11 Если в файле есть 5 строк, то изменить f.Strings[5] = 'Прощай, станция Мир';
f.Add('Прощай');// Добавляем новую строку
f.SaveToFile(*с:\filename.txt'); // Сохраняю результат f.Free; end;
В приведенном в листинге коде, прежде чем изменить 5-ю строку, происходит проверка, есть ли в файле эти пять строк. Если окажется меньше пяти, то при попытке изменения данных произойдет ошибка, ведь у объекта просто не выделено достаточно памяти.
В этом же примере в конец файла добавляется новая строка с помощью вызова метода Add. После этого результат сохраняется в том же файле с помощью метода SaveToFile. Если не вызывать метод сохранения, то все изменения пропадут, потому что данные изменяются в объекте, а не в файле. Именно поэтому объект надо сохранять обратно в файл.
На этом можно закончить рассмотрение. Помните, все, что мы говорили про TStrings ранее, В равной степени ОТНОСИТСЯ И К TStringList.