Заказные программы. Веб сайты и веб приложения. Среда разработки.

Метаданные и метаклассы

Все ГИС-объекты с точки зрения программиста являются объектами класса TMapObject. Такая реализация во многом облегчает единообразный способ хранения и манипулирования ГИС-объектами и значительно упрощает объектную модель в целом. Однако с точки зрения пользователя ГИС, моделирующего предметную область, система должна иметь многоуровневую и гибкую иерархию классов, а каждый ГИС-объект должен относиться к определенному классу в этой иерархии и иметь характерный для данного класса набор полей и методов. Для решения этой задачи в системе существуют метаклассы (рис.1).

 meta

Рис.1 Структура метакласса.

Метаклассы также являются наследниками omponent и сохраняются во внешнем хранилище аналогично ГИС-объектам. Несмотря на то, что метаклассы в явном виде не наследуются один от другого, они входят в древовидную иерархию метаклассов, определяемую на уровне ядра системы:

ClassTree:TTreeNodes;

Каждый метакласс имеет кроме имени уникальный идентификатор, а указатель на родительский метакласс содержится в свойстве Parent. На уровне ядра системы также определены базовые функции для работы с метаклассами и деревом иерархии:

  • · CreateObject(TypeName: String) : TMapObject; создает объект по имени

метакласса;

  • CreateObjectByID(ID: String) : TMapObject; создает объект по

идентификатору метакласса;

  • Meta(ID: string): TMeta; возвращает метакласс объекта по идентификатору;
  • GetNode(ID: string):TTreeNode; возвращает ветвь дерева иерархии по идентификатору метакласса;
  • SelectNode(Nodes:TTreeNodes; ID: string); выбирает ветвь дерева иерархии по идентификатору метакласса;
  • NodeID(Node:TTreeNode):string; возвращает уникальный идентификатор метакласса в дереве иерархии;
  • ParentList(ID: string):string; возвращает список всех родителей метакласса.

ГИС-объект при создании загружает описания метаполей с помощью функции LoadFromType(Meta: TMeta). Данная функция сначала загружает описания полей из своего метакласса, потом – из метакласса-родителя и далее вверх по дереву иерархии вплоть до базового метакласса. Таким способом в объектной модели реализован механизм наследования.

На уровне метакласса задается и форма редактирования для ГИС-объектов, реализующих данный метакласс. Как правило, ГИС-приложения поддерживают функции редактирования свойств объекта, при этом для ГИС-объекта будет вызываться форма редактирования, определенная в его метаклассе. Элементы управления в такой форме связаны с полями ГИС-объекта и позволяют изменять их значения. Пример формы редактирования приведен на рис.2. Отметим также, что система имеет встроенный визуальный дизайнер форм, который будет рассмотрен ниже.

editform

Рис.2 Форма редактирования ГИС-объекта.

Программно метаклассы, как уже говорилось, реализованы при помощи класса TMeta. На рис. 3 приведена программная структура данного класса и некоторых других базовых классов, связанных с ним.

Основную функциональную нагрузку в классе TMeta несет свойство Fields, представляющее собой список полей метакласса. Для реализации списка полей (как в метаклассах, так и в соответствующих ГИС-объектах) в объектной модели предназначен специальный класс TMetaFields, унаследованный от стандартного класса TCollection. Таким образом, свойство Fields является коллекцией, каждый элемент которой представляет поле метакласса - объект класса TMetaField, являющийся в свою очередь потомком TСollectionItem.

Коллекция - это объект, реализующий список других объектов. Его основное отличие от общего списка TList заключается в том, что, не будучи компонентом, он в design-time допускает работу с собой, как с компонентом. Такая особенность поддерживается как IDE, так и самой коллекцией, что налагает на ее реализацию ряд требований.

Каждый элемент коллекции должен быть унаследован от TСollectionItem, что дает ему возможность реализации базовых свойств и методов:. Класс TMetaFields расширяет функциональность TCollection с помощью методов FieldByName, FieldCount, IndexOf и т.д.

Данный выбор базовых классов для реализации списков полей обусловлен прежде всего тем, что коллекции построены на основе класса TPersistent (в отличие от TList, являющегося прямым потомком TObject) - а это означает, что Delphi умеет запоминать в файле формы все настройки коллекции и ее элементов, которые производятся в режиме конструирования. Со списком TList без его модификации такое невозможно. Применительно к настраиваемой объектной модели это означает, что список полей метакласса или ГИС-объекта со всеми наборами свойств каждого поля будет автоматически сохраняться при сохранении метакласса (ГИС-объекта) в потоке. Следовательно, нам не придется вносить изменения в процедуры сохранения или чтения объекта, если список полей будет модифицирован пользователем.

classes

Рис.3 Структура базовых классов.