Методами, общими для всех классов главных виртуальных машин, являются: авторизация; открытие наборов данных; сохранение данных; смена текущего экземпляра базы данных; выход из приложения. Виртуальные методы с общим интерфейсом, но различной реализацией, обеспечивают синхронизацию данных и их редактирование. Виртуальная машина, таким образом, взаимодействует как с интерфейсными элементами окна, так и с реестрами данных, как показано на рисунке 8.
Рисунок 8 – Объектная структура приложения
Специфическими для приложения методами виртуальной машины являются методы выполнения подзадач (редактирования реестров, формирования отчетов и др.) Эти методы создают и объекты – виртуальные машины подзадач. Каждый такой объект взаимодействует с окном подзадачи и с диспетчером данных.
Взаимодействие виртуальной машины с окном осуществляется следующим образом: обработчики сообщений от интерфейсных элементов окна вызывают соответствующие функции виртуальной машины, а состояние элементов окна (в том числе при отображении данных) изменяется виртуальной машиной. Это позволило в максимальной степени разделить интерфейс и вычислительную часть программы.
Взаимодействие виртуальной машины с диспетчером данных осуществляется вызовом методов диспетчера из методов виртуальной машины.
Диспетчер данных является центральным объектом приложения, обеспечивающим доступ ко всем информационным таблицам (реестрам). Он представляет собой агрегат самостоятельных объектов – реестров, хранит адреса этих объектов и отслеживает, изменялись ли данные в реестрах после загрузки; тогда перед закрытием подзадачи эти данные необходимо сохранить. Виртуальная машина перед закрытием подзадачи запрашивает у диспетчера, изменились ли данные, и при необходимости делает запрос пользователю: сохранить данные или выйти без сохранения.
Доступ к адресу конкретного реестра можно получить, используя методы диспетчера, возвращающие указатель на объект реестра. Эти методы являются статическими и различаются именами процедур.
Основной структурной единицей данных, доступной с помощью диспетчера, является реестр. С точки зрения объектной структуры программы реестр является полиморфным объектом, производным от базового класса, реализующего общие для всех реестров функции и свойства. Реестр отвечает за хранение, загрузку, выгрузку и изменение одной или нескольких информационных таблиц.
Каждый реестр представляет собой список записей. Например, реестр преподавателей содержит список данных о преподавателях, реестр дисциплин – список дисциплин. Каждой записи одного и того же списка, как правило, соответствует свой уникальный ключ. Реестр, таким образом, определяет соответствие между информационными полями и уникальным ключом записи. Информационные поля одного реестра могут содержать ключи записей из других реестров. Таким образом устанавливается соответствие информационных полей из различных реестров. Например, в реестре поручений преподавателя хранятся ключи читаемых дисциплин, и по ним можно найти записи из реестра дисциплин, чтобы узнать, какие дисциплины читает конкретный преподаватель.
Базовый реестр образует верхний уровень иерархии классов реестров. Его поля данных, методы и свойства наследуются производными от него реестрами.
Объектная структура реестра имеет следующий вид (рисунок 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; }
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.