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

Поля и методы объектов ГИС

Структура ГИС-объекта определяется на уровне метакласса как совокупность набора полей и методов. Кроме описания полей и методов метакласс может содержать также графическое изображение (значок) и ресурс формы редактирования.

Каждое поле должно принадлежать к одному из предопределенных типов; среди типов полей различают примитивные типы и объектные типы.

Примитивные типы полей ГИС-объектов

Примитивные типы полей соответствуют базовым типам в большинстве языков программирования. Характеристики этих типов приведены в таблице

Имя типа

Описание типа

Характеристика

INTEGER

целый

целые числа со знаком. (4 байта)

FLOAT

вещественный

вещественные числа. (8 байт)

BOOLEAN

логический

Значения true/false, Y/N, 1/0, Д/Н (1 байт)

STRING

строка

строка переменной длины (до 64 Кбайт)

DATETIME

дата/время

целая часть-дата; дробная-время. (8 байт)

POINT

координатный

координаты точки (X,Y) (8 байт)

VAR

тип-вариант

проверка типа не производится

FUNCTION

метод объекта

указатель на функцию-метод объекта. (4 байта)

Примитивные типы полей ГИС-объектов.

Такие типы, как INTEGER, FLOAT и BOOLEAN полностью совпадают по определению с соответствующими встроенными типами операционной системы. Типы STRING и DATETIME соответствуют спецификациям Borland для средств разработки Delphi и C++ Builder.

Тип POINT (координаты точки на карте) представляет собой структуру из двух полей (X,Y), соответствующих географической широте и долготе точки.

Тип VAR (вариант) подразумевает, что проверка типа поля не производится и поле может хранить значения любого типа в любой момент времени. Ответственность за контроль типов в данном случае возложена на разработчика прикладных задач.

Тип FUNCTION является специфическим и представляет собой реализацию методов объекта через поля объекта. В качестве возможных значений полей этого типа выступают имена зарегистрированных в системе функций-методов. Обычно такие функции группируются в специализированные динамические библиотеки прикладных задач. В результате присваивания полю имени функции программа ищет и записывает во внутреннюю структуру поля указатель на данную функцию.

Объектные типы

Объектные типы предоставляют возможность использования в качестве полей объекта других объектов заданного класса. Поддерживаются два варианта использования объектов: ссылка на существующий объект и включение объекта заданного класса в качестве составной части сложного объекта.

Имена объектных типов должны совпадать с именами классов, определенных на данный момент в системе. То есть, мы должны сначала определить класс объектов, а затем заводить поле, которое будет ссылаться или включать объект данного класса. Если в ГИС заданы предопределенные имена для базовых классов,  эти имена будут доступны всегда.

Объектные типы полей подчиняются иерархии метаклассов, определенной в системе и обеспечивают совместимость «снизу вверх». Полям типа MetaType1 можно присваивать ссылки на все доступные ГИС-объекты, для которых метакласс унаследован от MetaType1.

Свойства полей объекта

Поле объекта как программный компонент также представляет собой объект, обладающий следующими свойствами:

«Имя» - собственно имя поля

«Тип» - один из примитивных или объектных типов, заданных в качестве типа поля.

«Описание» - текстовое описание поля может содержать его назначение и дополнительные характеристики.

«Значение по умолчанию» - здесь можно задать значение, которое будет присваиваться полю при создании объекта, если пользователь не задал его вручную.

«Только для чтения» - пользователь не может изменять значение поля объекта

«Уникальность» - требует, чтобы в пределах активной в данный момент темы все объекты данного класса имели уникальные (неповторяющиеся) значения данного поля

«Массив» - поле может представлять собой одномерный массив элементов заданного типа. Размер массива не задается и может меняться динамически. В качестве типа элементов массива могут использоваться любые как примитивные, так и объектные типы. Многомерные массивы в настоящее время не поддерживаются, однако можно определить тип поля как массив типа Вариант, внутри которого рассматривать каждый элемент как отдельный массив.

«Автоматически создаваемый объект» - применимо только для полей объектных типов. Если это свойство не установлено, полю объектного типа необходимо присвоить ссылку (имя) на другой существующий в настоящий момент объект темы. При этом происходит проверка соответствия типов поля и объекта, на который оно ссылается. Если же данное свойство установлено, то объект заданного типа будет автоматически создаваться при создании основного объекта и удаляться при его удалении. Такой объект считается составной частью основного объекта (включение), его значок не отображается на экране, а координаты имеют нулевые значения по умолчанию.

Через поля объектных типов (и в случае механизма ссылки, и в случае включения) пользователь способен полноценно работать со всеми полями и методами соответствующего объекта. Перекрестные ссылки допускаются и конфликтов не вызывают.

«Список допустимых значений» - ограничивает диапазон значений поля. Тип элементов списка должен соответствовать типу поля.

«Действие» - при каждом изменении значения поля объекта генерируется соответствующее событие. В дополнение к этому, мы можем задать некоторый скрипт на встроенном языке интерпретатора, который будет выполняться каждый раз при изменении этого поля.

Методы объектов

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

Такие функции (обычно размещаемые в подключаемых динамических библиотеках) обязаны декларировать строго определенный интерфейс:

ParserFunc = function(Res: TMetaField;

Params: TMetaFields;

ObjectFields: TMetaFields=nil)

:Boolean;

Первый параметр Res содержит результат, возвращаемый функцией. Поскольку он является объектом типа поле (TMetaField), все свойства поля объекта могут быть получены из этого параметра (тип, значение, описание и т.д.). Следует отметить, что это как бы «поле само по себе», не привязанное к какому-либо объекту и не требующее предварительной декларации.

Второй параметр Params является по сути дела списком (коллекцией) входных параметров функции. Размер списка не ограничен и определяется автоматически. Каждый элемент этого списка является объектом типа поле (TMetaField), так что все дополнительные свойства элемента могут быть заданы в этом параметре (тип, значение, описание и т.д.).

Третий параметр ObjectFields предназначен для предоставления доступа к реальным полям объекта. В действительности это входной параметр и его значение устанавливается в процессе регистрации функции. В случае его равенства nil функция не может оперировать какими-либо полями объекта. Как правило, это характерно для общих функций.

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

Регистрация методов и общих функций

После того, как функция с вышеописанным интерфейсом декларирована и определена, она должна быть зарегистрирована.

Процедура регистрации стандартизована и доступна при подключении модуля Parser:

procedure RegisterUserFunction(const Name:string;

Func: ParserFunc;

FuncHeader: FunctionHeader);

Первый параметр Name представляет собой уникальное имя функции в системе.

Второй параметр Func является указателем на функцию, определенную выше (ParserFunc).

Третий параметр FuncHeader – это структура, описывающая основные свойства регистрируемой функции:

FunctionHeader=record

  Name: String;                     // имя (а также краткое описание)функции на русском языке

  Description: String;                     // подробное описание функции

  Params: String;                            // описание параметров

  Group: String;                    // группа. Для удобства пользователя функции могут группироваться в зависимости от назначения, предметной области и т.д.

  IsObjectMethod: boolean;      //поле определяет, является ли функция методом объекта или общей функцией.

end