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

Методами, общими для всех классов главных виртуальных машин, являются: авторизация; открытие наборов данных; сохранение данных; смена текущего экземпляра базы данных; выход из приложения. Виртуальные методы с общим интерфейсом, но различной реализацией, обеспечивают синхронизацию данных и их редактирование. Виртуальная машина, таким образом, взаимодействует как с интерфейсными элементами окна, так и с реестрами данных, как показано на рисунке 8.

Рисунок 8 – Объектная структура приложения

Специфическими для приложения методами виртуальной машины являются методы выполнения подзадач (редактирования реестров, формирования отчетов и др.) Эти методы создают и объекты – виртуальные машины подзадач. Каждый такой объект взаимодействует с окном подзадачи и с диспетчером данных.

Взаимодействие виртуальной машины с окном осуществляется следующим образом: обработчики сообщений от интерфейсных элементов окна вызывают соответствующие функции виртуальной машины, а состояние элементов окна (в том числе при отображении данных) изменяется виртуальной машиной. Это позволило в максимальной степени разделить интерфейс и вычислительную часть программы.

Взаимодействие виртуальной машины с диспетчером данных осуществляется вызовом методов диспетчера из методов виртуальной машины.

Диспетчер данных является центральным объектом приложения, обеспечивающим доступ ко всем информационным таблицам (реестрам). Он представляет собой агрегат самостоятельных объектов – реестров, хранит адреса этих объектов и отслеживает, изменялись ли данные в реестрах после загрузки; тогда перед закрытием подзадачи эти данные необходимо сохранить. Виртуальная машина перед закрытием подзадачи запрашивает у диспетчера, изменились ли данные, и при необходимости делает запрос пользователю: сохранить данные или выйти без сохранения.

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

3.3. Иерархия реестров

Основной структурной единицей данных, доступной с помощью диспетчера, является реестр. С точки зрения объектной структуры программы реестр является полиморфным объектом, производным от базового класса, реализующего общие для всех реестров функции и свойства. Реестр отвечает за хранение, загрузку, выгрузку и изменение одной или нескольких информационных таблиц.

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

3.4.Базовый реестр

Базовый реестр образует верхний уровень иерархии классов реестров. Его поля данных, методы и свойства наследуются производными от него реестрами.

Объектная структура реестра имеет следующий вид  (рисунок 9).

Рисунок 9 – Схема взаимодействия объектов TBasicRegister и TBasicFixedRecord

Разработаны два класса: TBasicFixedRecord – это отдельная запись, и TBasicRegister – список записей. В классе TBasicFixedRecord, поскольку это базовый класс, содержатся минимальное число переменных для хранения полей записи и предусмотрены виртуальные функции для обработки переменных. Интерфейс класса приведен ниже.

class TBasicFixedRecord // запись фиксированной длины, имеющая ключ и

// идентификатор

{     protected:

TBasicRegister* Owner;

AnsiString Id;

       AnsiString GetId() { return Id; }

       void ModifyId(AnsiString);

bool ismodify;          // флаг изменений (не хранится в файле)

        bool GetModify() { return ismodify; }