- •Пояснительная записка к курсовой работе
- •Лист задания
- •Аннотация
- •Оглавление
- •1Классы общего назначения Tlist, tStrings, tStringList 5
- •Классы общего назначения Tlist, tStrings, tStringList
- •1.1 Назначение
- •Описание
- •2 Реализация практического задания
- •2.1 Описание структуры базы данных
- •2.2 Блок-схема реализации поставленной задачи
- •2.3 Техническое описание программы
- •2.4 Основные компоненты приложения
- •Список литературы
-
Описание
Списочные классы 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 - то же самое наоборот.
