Класс списка строк TStringList и его связь с INI-файлами [TStringList, TIniFile]

Класс TStringList является потомком класса TStrings, используемого в некоторых компонентах VCL, оперирующих текстом. Однако для использования вне объектов класс TStrings не подходит, поскольку не имеет собственного конструктора. Для этих целей используется TStringList, расширяющий функциональность предка.

Вот пример кода, оперируюшего с TStringList:

void OperateStrings()
{
TStringList* slist=new TStringList;
slist->LoadFromFile("mystrings.txt") ; //загружает строки из файла (разделение по CR LF)
slist->Sort(); //сортирует строки
if(slist->IndexOf("Gonna return from here")==-1)
return; //метод, возвращающий индекс искомой строки, начиная с 0
slist->Add("Walked through first"); //добавляет строку в конец списка
slist->AddObject(Edit1->Text,Edit1); //добавляет строку и указатель в список
((TEdit*)slist->Objects[0])->Text=slist->Strings[0]; //соответственно по индексу указатели и строки
slist->SaveToFile("mynewstrings.txt"); //сохраняет список в файл
slist->Clear(); //очищает список
delete slist;
}

Остальные методы довольно типичны. Однако для этого класса есть свойства, позволяющие эффективно использовать этот класс для манипулирования ini-файлами - файлами программных настроек. Это Values и Names. Они используются, если список состоит из пар вида Name=Value. Первое возвращает значение-строку по параметру строке, второй - Name по индексу (естественно, от 0). В предкомпиляционном файле inifiles.hpp (включаемом через #include) описан класс TIniFile. Один из его методов - ReadSectionValues, переписывает строки из выбранной секции в заданный объект TStringList. В принципе, можно напрямую пользоваться TIniFile, но так короче и эффективней с точки зрения скорости.

Вот код, считывающий записанные в файле prog.ini настройки размера окна и приводящий их в исполнение:

void __fastcall TForm1::LoadClick(TObject *Sender)
{
TIniFile* file=new TIniFile("prog.ini");
TStringList* lst=new TStringList;
file->ReadSectionValues("Size",lst);
Top=StrToInt(lst->Values["Top"]);
Left=StrToInt(lst->Values["Left"]);
Width=StrToInt(lst->Values["Width"]);
Height=StrToInt(lst->Values["Height"]);
delete lst,file;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SaveClick(TObject *Sender)
{
TIniFile* file=new TIniFile("prog.ini");
file->WriteString("Size","Top",Top);
file->WriteString("Size","Left",Left);
file->WriteString("Size","Height",Height);
file->WriteString("Size","Width",Width);
delete file;
}

В принципе это все, что умеет TIniFile. Еще несколько методов:

  • TIniFile - конструктор с параметром - именем ини-файла. Если файл не существует, то создается. По умолчанию смотрится Windows-директория
  • ReadSection - считывает имена всех параметров заданной секции
  • ReadSections - считывает имена секций данного ини-файла
  • EraseSection - удаляет секцию. Логично ;)
  • SectionExists, ValueExists - соответственно существует ли секция или параметр
  • ReadString, ReadBool, ReadDate, ReadDateTime, ReadFloat, ReadInteger, ReadTime - считывание соответственных значений из указанной секции
  • WriteString, WriteBool, WriteDate, WriteDateTime, WriteFloat, WriteInteger, WriteTime - то же самое наоборот

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

Классы TStack и TObjectList

Эти классы не являются чем-то особенным, но на них стоит обратить внимание. Класс TObjectList отличается от TList тем, что хранит не void указатели, а TObject* указатели. Впрочем, преобразование типа в большинстве практических случаев производить все равно придется. Напомню, что TObject является прародителем всех объектных классов VCL. Еще одной интересной особенностью TObjectList является свойство OwnsObject, которое при true значении дает возможность объекту TObjectList контролировать выделение памяти для индексированных объектов - при удалении объекта из списка или при удалении самого списка овтоматически освобождается память, отведенная под указанные объекты. Большинство остальных методов унаследованы от TList, я их рассматривать не буду.

TStack - заготовка для стека. Я говорю заготовка, потому что этот класс содержит минимум полезных методов. Свойств у него вообще нет. Методы Peek, Pop, Push соответственно считывают элемент, не удаляя, считывают, удаляя, и записывают в вверх. Классика.

Читайте также:
  • Класс TFileStream. Понятие потока VCL.
    Сначала я бы хотел бы дать некоторое вступление по поводу поточных классов VCL. Эти классы есть некоторое подобие альтернативы поточным классам C++. Как обычно в таких случаях с VCL, основной TStream класс никто впрямую не использует, от него можно только наследовать. Прямым потомком TStream явл...
  • Файловый ввод-вывод.
    fstream Инкапсулирует стандартный ввод-вывод. Я не буду рассматривать расширения этого класса под UNIX, ведь все равно программируем под Windows. Эти самые расширения касаются в основном прав доступа, по умолчанию 666 - allow all. В общем техника работы с этим классом такова. Сначала создается эк...
  • Таблицы откликов [MESSAGE_MAP, MESSAGE_HANDLER]
    В VCL определены некоторые стандартные события для компонентов. Можно заметить, что эти события похожи на стандартные сообщения Windows. Однако не все сообщения Windows можно найти в VCL, и не все сообщения VCL реализованы в WinAPI. Например, в WinAPI нет сообщения, аналогичному OnClick, с другой...
  • TRegistry
    Чтобы легче было разбираться с Хелпом, скажу, что понятие Key означает не параметр, как можно было подумать, а раздел. Каждый раздел является подразделом главного раздела, которые мы рассмотрели в предыдущем Шаге. Чтобы понятней было, скажу, что иерархия напоминает файловую систему, где HKEY_* - ...
  • Списочные классы [TList, оператор dynamic_cast]
    Списочные классы C++ Builder хранят указатели типа void*, которые могут адресовать любые объекты. Для того, чтобы воспользоваться таким указателем, необходимо выполнить преобразование типа. Преобразования можно выполнить двумя способами - статическим в стиле обычного C++ и динамическим (расширен...