Шаг 11 - Класс списка строк 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. Еще несколько методов:

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

Классы TStack и TObjectList

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

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

В следующем шаге будет рассмотрен реестр и способы взаимодействия с ним.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Аванесов Самвел - 5.11.2001