Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kursovaya_Abdrahmanov_Marat.docx
Скачиваний:
30
Добавлен:
17.12.2018
Размер:
938.82 Кб
Скачать
    1. Описание

Списочные классы C++ Builder хранят указатели типа void*, которые могут адресовать любые объекты. Для того, чтобы воспользоваться таким указателем, необходимо выполнить преобразование типа. Преобразования можно выполнить двумя способами - статическим в стиле обычного C++ и динамическим (расширенным ANSI). Последний предпочтительнее по ряду причин. Почему станет понятно из примеров:

void __fastcall TForm1::Edit1Change(TObject *Sender)

{

TEdit* tmpedit=(TEdit*)Sender;

Label1->Caption=tmpedit->Text;

}

Данный код выполняет статическое преобразование из TObject к TEdit. Этот обработчик можно назначить сразу нескольким компонентам TEdit, но только TEdit! При попытке преобразования другого класса программа выдаст исключение на преобразование типов. На практике бывает часто необходимо выполнить преобразование из неизвестного класса. Конечно, можно поставить ловушки - инструкции try...catch, но проще воспользоваться динамическим преобразованием - оператором dynamic_cast. Вот пример его использования, аналогичный предыдущему:

void __fastcall TForm1::Edit1Change(TObject *Sender)

{

TEdit* tmpedit=dynamic_cast<TEdit*>(Sender);

if (tmpedit==NULL) return;

Label1->Caption=tmpedit->Text;

}

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

После этого теоретического введения можно приступить к рассмотрению одного из представителей списочных классов VCL - класса TList. Вот его свойства и методы:

Capacity() - определяет емкость контейнера. Предпочтительнее заранее задавать емкость, чтобы каждый раз при вызове метода Add() не перераспределять память.

Count() - количество элементов.

Items[] - индексированный массив указателей на объекты списка. Нумерация с 0.

Add() - добавляет указатель-аргумент к списку.

Delete() - удаляет элемент по номеру.

Pack() - удаляет все указатели, равные NULL.

Move() - перемещение указателя.

Exchange() - обмен местами двух указателей.

Приведем пример:

TList* list;

void __fastcall Button1Click(TObject* Sender)

{

const count=10;

list=new TList;

list->Capacity=count;

for (int i=0;i<count;i++)

{

TImage* img=new TImage(this);

img->Picture->LoadFromFile(IntToStr(i)+".bmp");

list->Add(img);

} }

void __fastcall Button2Click(TObject* Sender)

{

Image1=dynamic_cast<TImage*>(list->Items[Edit1->Text->ToIntDef(0)]);

}

Этот пример создает список изображений и загружает их из файлов "0.bmp"..."9.bmp". Здесь показаны основные манипуляции.

Класс TStrings содержит методы и свойства, позволяющие манипулировать со списками строк:

  • Добавлять и удалять строки в указанных позициях

  • Перестраивать и упорядочивать последовательность строк

  • Получать доступ к конкретным строкам

  • Читать и записывать списки строк в файлы и потоки

  • Связывать с каждой строкой некоторый объект

Свойства

Ниже приведен список основных свойств, определенных в TStrings.

Свойство

Тип

Описание

Count

int

Число строк в списке. Свойство только для чтения.

DelimitedText

AnsiString

Возвращает текст, в котором отдельные строки выделены кавычками, определенными свойством QuoteChar, и, кроме того, отделены друг от друга символом, указанным в свойстве Delimiter.

Delimiter

char

Символ разделителя, используемый в свойстве DelimitedText.

Names

[int Index]

System::

AnsiString

Применяется для списков, имеющих структуру "Имя = Значение". Такую структуру имеют, например, файлы .ini. Свойство Names

возвращает Имя, использованное в строке с указанным индексом. Если строка не имеет форму "Имя = Значение", возвращается пустая строка. Свойство только для чтения.

Objects

[int Index]

TObject

Возвращает объект, связанный с указанной строкой свойства Strings. В классе TStrings свойство Objects не используется, но может использоваться в некоторых классах, производных от TStrings.

Strings

[int Index]

System::

AnsiString

Текст строки с указанным индексом. Индекс первой строки — 0.

Text

System::

AnsiString

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

Values

[System::

AnsiString Name]

System::

AnsiString

Применяется для списков, имеющих структуру "Имя = Значение". Такую структуру имеют, например, файлы .ini. Свойство Values

возвращает Значение, в строке с указанным именем Name. Если заданное имя Name не найдено, возвращается пустая строка.

Методы

Ниже приведены основные методы, объявленные в классе TStrings.

Метод

Описание

int Add (const System::AnsiString S)

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

intAddObject(const System::AnsiString S,

System::TObject* AObject)

Добавляет в список строку S и связанный с ней объект AObject. Возвращает индекс добавленной строки и объекта.

void AddStrings(TStrings* Strings)

Добавляет в список группу строк Strings

типа TStrings.

void Append(

const System::AnsiString S)

Добавляет строку в конец списка. Метод аналогичен Add, но не возвращает индекс строки.

void Clear(void)

Очищает список.

void Delete(int Index)

Удаляет из списка указанную строку с индексом Index.

bool Equals(

TStrings* Strings)

Сравнивает данный список с заданным списком Strings. Возвращает true при идентичности списков.

void Exchange(

int Index1, int Index2)

Переставляет местами строки списка с индексами Index1 и Index2.

char * GetText (void)

Возвращает буфер, под который выделяет память, и заполняет его значением свойства Text.

int IndexOf(

const System::AnsiString S)

Возвращает индекс указанной строки S.

Если такой строки нет в списке, возвращается -1.

int IndexOfObject(

System::TObject* AObject)

Возвращает индекс первой строки, связанной с заданным объектом AObject. Если такой строки нет в списке, возвращается -1.

void Insert( int Index,

const System::AnsiString S)

Вставляет указанную строку S в заданную

позицию Index. Если Index = 0, строка вставляется в первую позицию.

void InsertObject(int Index,

const System::AnsiString S,

System::TObject* AObject)

Вставляет указанную строку S в заданную

позицию Index и связывает с ней объект

AObject. Если Index = 0, строка вставляется на первую позицию.

void LoadFromFile(const

System::AnsiString

FileName)

Заполняет список строками текста из указанного файла FileName.

void LoadFromStream(

TStream* Stream)

Заполняет список строками текста из указанного потока Stream.

void Move(int CurIndex,

int NewIndex)

Изменяет позицию строки с индексом

CurIndex, давая ей индекс NewIndex.

void SaveToFile(

const System::

AnsiString FileName)

Сохраняет строки списка в файле с указан-

ным именем FileName.

void SaveToStream(

TStream* Stream)

Сохраняет значение свойства Text в указан-

ном потоке Stream.

void SetText(char * Text)

Задает значение свойства Text.

Описание

Класс TStringList наследует классу TStrings, реализуя многие его абстракт-свойства и методы и вводя некоторые новые возможности:

  • сортировку строк в списке

  • запрещение хранения дубликатов строк

  • реакцию на изменения содержания списка

Свойства

Ниже приведен список основных свойств, определенных в TStringList.

Свойство

Тип

Описание

Capacity

int

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

CaseSensitive

bool

Опредляет, учитывается ли регистр при поиске строки, сортировке, определении дубликатов строк.

Count

int

Число строк в списке. Свойство только для чтения.

Duplicates

Enum TDuplicates

{dupIgnore,dupAccept,

dupError }

Указывает, могут ли добавляться в сортированный список дубликаты строк. Значение dupIgnore — игнорирование добавления дубликата, dupAccept — разрешение добавления дубликата, dupError — генерация исключения EListError при попытке добавления дубликата строки. Значения dupAccept и dupError никак не реагируют на уже имеющиеся в списке дубликаты. На несортированный список свойство Duplicates не оказывает никакого влияния.

Sorted

bool

Указывает, должны ли строки в списке автома-

тически сортироваться по алфавиту.

Strings

[int Index]

System::

AnsiString

Текст строки с указанным индексом. Индекс первой строки — 0.

Методы:

Класс TStringList наследует от TStrings такие свойства, Add, Clear, Delete,Exchange, IndexOf, Insert и много других. Кроме того в классе TStringList объявлены методы:

Метод

Описание

bool Find(const System::

AnsiString S, int &Index)

Определяет, имеется ли заданная строка S в сортированном списке, и, если имеется, то возвращает в параметр Index индекс этой строки. Для не сортированных списков следует использовать метод IndexOf.

Sort

Сортирует строки списка, свойство Sorted которого установлено в false, в возрастающей алфавитной последовательности. Если Sorted = true, то список сортируется автоматически.

Класс 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 - то же самое наоборот.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]