Вы уже должны быть знакомы с технологией построения двусвязных списков, хотя бы из предыдущих шагов или из раздела про теорию. Поэтому не буду подробно рассказывать о управляющем классе. Как и любой другой он должен содержать конструктор создающий список и деструктор правильно удаляющий список из памяти, и конечно процедуры и функции для добавления элемента, поиска и т.д.
Описание класса
class DBFRecordType {
DBFRecordTypeField *List;
public:
DBFRecordType();
~DBFRecordType();
void Add(DBFRecordTypeField *New);
DBFRecordTypeField *FindField(char *name_);
unsigned int Length();
};
Конструктор черезвычайно прост :-)
DBFRecordType::DBFRecordType(){
List=NULL;
};
Деструктор также практически стандартный. Интересно сколькими способами можно осуществить его удаление :-) При рисовании этого деструктора у меня вертелось в голове два и я выбрал наиболее простой.
DBFRecordType::~DBFRecordType(){
DBFRecordTypeField *temp;
temp=List->Next;
while (List!=NULL){
delete List;
List=temp;
temp=temp->Next;
};
};
Теперь процедура добавления элемента. В данном случае у нас получится список типа очередь.
void DBFRecordType::Add(DBFRecordTypeField *New){
DBFRecordTypeField *temp=List;
if (List==NULL){
List=New;
New->Position=1;
return;
};
while (temp->Next!=NULL) {
temp=temp->Next;
};
temp->Next=New;
New->Pred=temp;
New->Position=temp->Position+temp->TotalLen;
};
Прочитав данную процедурку Вы должны были заметить строчки для подсчета позиции поля в записи. Это считаю хорошее свойство файлов DBF, которое позволяет достаточно быстро найти требуемую запись и поле в ней.
Теперь процедурка обеспечивающая поиск в списке поля c именем name_.
DBFRecordTypeField *DBFRecordType::FindField(char *name_){
DBFRecordTypeField *temp;
temp=List;
while (temp!=NULL){
if (stricmp(temp->Name,name_)==0){
return temp;
};
temp=temp->Next;
};
return NULL;
};
Эта функция подсчитывает общий размер записи в байтах. Она потребуется нам в дальнейшем.
unsigned int DBFRecordType::Length(){
DBFRecordTypeField *temp;
unsigned int c=0;
temp=List;
while (temp!=NULL){
c+=temp->TotalLen;
temp=temp->Next;
};
return c;
};
Пока пожалуй все. На данном этапе я думаю нам хватит возможностей этого класса, а если что будем наращивать на него новое "мясо" :-).