Информационная поддержка планирования и учета учебной работы по балльно-рейтинговой системе, страница 15

Для последовательного перехода на следующую запись по порядку предусмотрена переменная TBasicFixedRecord* next и функции: для чтения указателя TBasicFixedRecord* GetNext() и для записи значения указателя в поле – void SetNext(TBasicFixedRecord* n). Эта операция требуется при циклическом переборе записей.

Для удобства программирования с автоматическим отслеживанием изменений предусмотрены специальные функции, которые при изменении значения поля данных одновременно устанавливают время последних изменений записи и устанавливают флаг изменений. Это функции ModifyKey и ModifyReg.

Заметим, что перечисленные функции помещены в защищенную секцию, что предотвращает случайное изменение данных. Для доступа к ним извне в открытой секции реализованы свойства класса.

Свойство bool Registered читает или задает значение флага регистрации записи. Свойство TBasicFixedRecord* Next читает или записывает указатель на следующую запись списка. Свойство int Key позволяет читать или задать значение уникального ключа записи. Свойство AnsiString ID позволяет читать или изменять текстовую информацию в поле Id. Использование свойств позволяет разгрузить программиста от необходимости следить за флагом изменений и установкой даты и времени изменений.

Для данного класса предусмотрен конструктор пустого экземпляра записи TBasicFixedRecord(TBasicRegister* owner, int lres = 0). Вместе с конструктором задан и деструктор virtual ~TBasicFixedRecord(). Деструктор задан виртуальным, так как в классах-наследниках состав операций по освобождению памяти иной, чем в базовом классе.

Для загрузки и сохранения полей записи из файла предусмотрены специальные функции. Функция int Load(TFileStream&) загружает поля записи из указанного файла. Функция int Unload(TFileStream&) выгружает содержимое записи в файл, после чего сбрасывает флаг изменений записи.

В потомках текущего класса будет необходимо загружать и сохранять в файл поля записи, разработанные для класса-потомка. Для этого предусмотрены виртуальные функции: для загрузки – virtual int LoadAttrib(TFileStream&) и для сохранения – virtual int UnloadAttrib, которые вызываются в статической функции загрузки и выгрузки. В базовом классе эти функции пустые, в потомках перекрываются так, чтобы обеспечить ввод и вывод атрибутивной информации.

При работе с объектами класса иногда может потребоваться передать информацию между объектами одного класса. Для решения этой задачи предусмотрены функции void CopyFrom и void CopyFromBasicOrig. Функция void CopyFromBasicOrig производит полное копирование из записи того же типа, а void CopyFrom вызывает виртуальную функцию копирования, которая должна перекрываться в классах-потомках.

Как записи описанного типа, так и их потомки могут помещаться в базовый реестр, реализованный в классе TBasicRegister. Класс TBasicRegister содержит функции, необходимые во всех реестрах: загрузка и выгрузка записей реестра в файл, создание и удаление новой записи, редактирование полей записи, поиск в списке записи по ключу или строковому обозначению. Интерфейс класса приведен ниже.

class TBasicRegister

{     protected:

AnsiString Filename;

       AnsiString GetFileName() { return Filename; }

bool ismodify;                  bool GetModify() { return ismodify; }

TBasicFixedRecord* first;

       TBasicFixedRecord* GetFirst() { return first; }

// Атрибутыключейзаписи

int MinRecKey, MaxRecKey, StepRecKey;

// Ключевые записи файла формата NPA_NT

int BEGREGISTERFILE, ENDREGISTERFILE;

int BasicClear(); // освобождениепамятисписка

     public:

void SetModify() { ismodify = true; }

__property bool isModify = { read=GetModify };

__property AnsiString FileName = { read=GetFileName };

__property TBasicFixedRecord* First = { read=GetFirst };

TBasicRegister(AnsiString); // конструкторпустогореестра

virtual ~TBasicRegister() { BasicClear(); }

// Процедуры работы со списком

int Count(); // подсчет числа записей

int CalcIdCount(AnsiString);

int DeleteUnregRecs();//удаление заблокированных записей из реестра

int SortForDecKey(); // сортировка по убыванию ключа

// Процедуры работы с памятью