
ОПИСАНИЕ
Данный
проект
предназначен
для
моделирования,
графического
представления
и
мониторинга
работы
различных
реальных
систем (например:
телекоммуникационной,
транспортной,
market-системы).
На
сегодняшний
день имеет
возможности:
•
Визуальное,
векторное
представление
объектов
моделей(в
виде
топографической
карты),
которое
реализует:
•
легкое
управление
отображение
модели.
Позволяет
плавно
перемещаться,
плавно
менять
масштаб и
поворот
изображения;
•
простое
редактирование
(drag and drop),
добавление,
удаление
изображений.
Возможность
изменения
масштаба и
ориентирования
объектов и
целых
регионов
карты;
•
синхронизация
отображений
всех
клиентов
системы, т.е.
изменения,
сделанные
одним
клиентом
одновременно
отображаются
у других;
•
возможность
использования
в качестве
первоосновы
топографическую
карту
местности (в
виде файла
графического
формата bmp,jpeg и т.д.);
•
возможность
удаленного
доступа
через модем;
•
Представление
объектов в
виде панелей
свойств, т.е.
окна
отображающего
основные
параметры
объекта. Ее
основные
возможности:
•
синхронизация
панелей
свойств, т.е.
изменения
свойств
объекта,
произошедшие
на любом
клиенте,
одновременно
обновляют
панели
свойств
других
клиентов;
•
возможность custom-изации
панели
свойств для
любого
конкретного
объекта, т.е.
возможность
изменения
конфигурации
панели
свойств под
конкретный
объект (элементов
управления
их положение
и размер);
•
Практически
неограниченное
число
объектов
модели (ограничено
лишь
возможностями
сервера и SQL сервера
хранения
информации
системы);
В
настоящее
время проект
используется
для
автоматизации
работы узла
электросвязи(г.
Арзамас ~ 118 тыс.
жителей), где
служит для:
•
хранения
ресурсов
линейного
хозяйства
ГТС:
магистралей,
распределений,
распределительных
шкафов,
колодцев и т.д.(паспортная
группа);
•
хранения
станционных
ресурсов ГТС:
станционного
оборудования,
абонентских
комплектов,
монтированной
емкости и т.д.(КРОСС);
•
ведения
абонентской
картотеки (электронный
аналог
абонентской
карточки ТФ2/2)
(КРОСС);
•
регистрации
и устранения
станционных
и линейных
повреждений (бюро
ремонта 05,
КРОСС);
•
автоматизации
установки
телефонов и
выделения
других
ресурсов
узла
(абонентский
отдел);
•
статистической
обработки
информации о
занятых,
свободных и
поврежденных
ресурсах;
При
разработке
проекта за
основу
принимались
следующие
основные
понятия:
Developer Level
.
•
Представление
-
информация
об объекте
доступная и
понятная
клиенту(разработчику,
пользователю).
По ней клиент
может понять,
что
представляет
собой объект
(примеры:
панель
свойств есть
визуальное
представление
свойств
объекта, Com-
интерфейс
служит
представлением
Com-объекта
в памяти Win32-процесса,
карта это 2D представление
реальных
объектов)
•
Функциональность
-
«InProcess» представление
объекта. Т.е.
представление
объекта в
памяти
процесса
системы
•
Абстрактная
модель
-
некоторое
множество представлений
объектов +
принципы и
логика
взаимодействия
объектов
через эти представления.
(примеры:
файловая
система,
схема
интернет-соединения,
расписание
движения
транспорта и
т.д.)
DATA Storage Level
.
•
Объект
- реальная
сущность,
находящаяся
в носителях
информации (например:
файл, SQL таблица, Com-объект),
видимая и
доступная
только через абстрактные
модели
(примеры: дом,
улица,
телефон,
транспорт,
яблоко и т.д.)
Client(User) Level
.
•
Представитель
модели
-
некоторая
сущность,
реальная
или
виртуальная,
предназначенная
для
отображения представления
модели
клиентам в
понятной для
них форме для
анализа и
изменения(примеры: Reflector(TReflector)
отображает 2D-визуализацию
объектов,
память Win32-процесса
содержит в
себе
интерфейсы Com-модели)
Для
представления
объекта в Win32
процессе,
служит «InProcess»
функциональность, или
просто – функциональность.
Базовой(корневой)
функциональностью
процесса
является
класс TFunctionality(аналог
Com-интерфейса
IUnknown).
TFunctionality служит
для запроса
другой
функциональности
объекта и для
контроля
времени
жизни(описана
в файле TypesDef\Functionality.pas).
Ниже следует
ее описание:
TFunctionality = class
private
RefCount:
integer; //. Счетчик
ссылок на
экземпляр
функциональность
public
Constructor
Create;
function AddRef:
integer; virtual; Stdcall; //. увеличивает число
ссылок
function
Release: integer;
virtual; Stdcall; //.
уменьшает
число ссылок,
если оно
становится = 0,
то удаляет
объект
function QueryFunctionality(RequiredFunctionalityClass:
TFunctionalityClass; out F: TFunctionality):
boolean; virtual;
StdCall; //.
запрашивает
новую
функциональность,
по ее типу
end;
Все
типы
функциональностей
явно
унаследованы
от TFunctionality.
Первичными
моделями, т.е.
моделями на
основе
которых
строятся
другие (вторичные)
модели в
данной
проекте
являются
следующие:
• Идентификационная
модель.
• Компонентная
модель.
• Модель
2D-визуализации.
• Модель
панелей
свойств.
Ниже
дано
описание
реализаций
этих моделей.
Идентификационная
модель
Согласно
этой модели,
каждый
объект имеет идентификатор(id), по
которому
находится
именно этот
объект. ID SQL хранимого
объекта это:
TID = record
idTObj: integer;
//.
идентификатор
типа объекта (ссылка
на таблицу
хранения
объекта);
idObj: integer;
//.
идентификатор
экземпляра (ссылка
на строку
таблицы).
end;
Функциональности
данной
модели
следующие:
• Функциональность
типа(наследует
TFunctionality,
описана в
файле TypesDef\Functionality.pas):
TTypeFunctionality = class (TFunctionality)
private
function
getidType: integer;
function
getTableName: shortstring;
function
getSpace: TProxySpace;
function
getImageList_Index: integer; virtual; stdcall;
public
TypeSystem:
TTypeSystem;
FImage:
TTypeImage;
Constructor
Create; virtual;
Destructor
Destroy; override;
function
_CreateInstance: integer; virtual; stdcall;
//. создает экземпляр типа
function
CreateInstance: integer; stdcall;
//.
создает
экземпляр
типа,
используя
другой
объект
function CreateInstanceUsingObject(const
idTUseObj,idUseObj: integer): integer; virtual; stdcall;
procedure
_DestroyInstance(const idObj: integer); virtual; stdcall;
//. уничтожает экземпляр типа
procedure
DestroyInstance(const idObj: integer); stdcall;
//.
получает
список
экземпляров
данного типа
procedure GetInstanceList(var List:
TList); virtual; stdcall;
//.
создает
компонентную
функциональность(см.
ниже) объекта
с idComponent
function
TComponentFunctionality_Create(const idComponent: integer):
TComponentFunctionality; virtual; stdcall;
function
getName: shortstring; virtual; stdcall;
function
getImage: TTypeImage; virtual; stdcall;
//.
операция
синхронизации
данных всей
модели
procedure DoOnComponentOperation(const
idTObj,idObj: integer; const Operation:
TComponentOperation);
//. id типа
property idType:
integer read getidType;
//.
имя таблицы, в
которой
хранится
данный тип
property TableName: shortstring read
getTableName;
//. пространства данных
проекта
property Space:
TProxySpace read getSpace;
//.
строковое имя типа
property Name:
shortstring read getName;
//. изображение типа
property Image:
TTypeImage read getImage;
//.
индек
изображения
типа в
таблице
изображений
типов
property ImageList_Index: integer
read getImageList_Index;
end;
Компонентная
модель
Согласно
ей
полагается,
что каждый
объект
пространства
является компонентом.
Основные
правила
компонентной
функциональности:
•
Каждый
компонент
имеет
собственника,
которому он
принадлежит.
Если
собственник
компонента = nil,
т.е. пустой, то
это значит,
что
компонент
принадлежит
корневому(Root)
компоненту –
пространству
•
Каждый
компонент
является (или
может
являться)
собственником,
которому
принадлежат
другие
компоненты.
•
Принадлежность
компонента,
означает, что
он доступен и
виден только
через своего
собственника,
которому он
принадлежит.
•
Если
собственник
компонента = nil,
т.е. пустой, то
это значит,
что
компонент
принадлежит
корневому(Root)
компоненту –
пространству.
Функциональности
данной
модели
следующие:
• Функциональность
типа (см. выше).
• Компонентная
функциональность
(наследует TFunctionality,
реализует
базовые
свойства и
методы
компонента,
описана в
файле TypesDef\Functionality.pas):
TComponentFunctionality
= class (TFunctionality)
private
function
getTypeSystem: TTypeSystem;
function
getTableName: string;
public
TypeFunctionality:
TTypeFunctionality;
idObj:
integer; //. id компонента
Constructor
Create(pTypeFunctionality: TTypeFunctionality; const pidObj: integer); virtual;
Destructor
Destroy; override;
//.
проверяет
компонент на
существование
procedure
Check; virtual; stdcall;
//. вставляет компонент
procedure
InsertComponent(const idTComponent,idComponent: integer;
var id: integer); virtual; stdcall;
//. удаляет компонент
procedure
RemoveComponent(const idTComponent,idComponent: integer); virtual; stdcall;
procedure
_ToClone(var idClone: integer); virtual; stdcall;
//. клонирует компонент
procedure
ToClone(var idClone: integer); virtual; stdcall;
//.
клонирует
компонент,
используя
другой
procedure
ToCloneUsingObject(const idTUseObj,idUseObj: integer; var idClone: integer);
virtual; stdcall;
function
CanDestroy(var Reason: shortstring): boolean; virtual; stdcall;
//.
извещает
компонент об
операции над
другим
компонентом
procedure
Notify(const NotifyType: TComponentNotifyType;
const pidTObj,pidObj: integer); virtual; stdcall;
//. получает собственник компонента
function
GetOwner(var idTOwner,idOwner: integer): boolean; virtual; stdcall;
//.
устанавливает
собственные
компоненты,
используя
другой
компонент
function
SetComponentsUsingObject(const idTUseObj,idUseObj: integer): boolean; virtual;
stdcall;
//. уничтожает собственные компоненты
procedure
DestroyComponents; virtual; stdcall;
//.
удаляет себя
как
компонент в
составе
другого, без
уничтожения
procedure
RemoveSelfAsComponent; stdcall;
//.
получает
список
собственных
компонент
procedure
GetComponentsList(var ComponentsList: TComponentsList); virtual; stdcall;
//.
запрашивает
список
собственных
компонент по
классу
функциональности
function
QueryComponents(FunctionalityClass: TFunctionalityClass; out ComponentsList:
TComponentsList): boolean; overload; virtual; stdcall;
//.
запрашивает
список
собственных
компонент по
типу
function
QueryComponents(const idTNeededType: integer; out ComponentsList:
TComponentsList): boolean; overload; virtual; stdcall;
//.
запрашивает
единичный
компонент по
типу
function
QueryComponent(const idTNeededType: integer; out idTComponent,idComponent:
integer): boolean; virtual; stdcall;
//.
запрашивает
функциональность
по типу
function
QueryComponentFunctionality(NeededFunctionalityClass: TFunctionalityClass; out
Functionality: TFunctionality): boolean; virtual; stdcall;
//.
число
собственных компонент
function
ComponentsCount: integer; virtual; stdcall;
//.
получает
корневого
собственника(т.е.
у которого Owner
= nil)
function
GetRootOwner(var idTOwner,idOwner: integer): boolean; virtual; stdcall;
//.
создает
обновитель
представлений
компонента
function
TPresentUpdater_Create(pUpdateProc: TProc; pOffProc: TProc):
TComponentPresentUpdater;
//.
свойства и
методы
панели
свойств(модель
см. ниже)
procedure
CreateNewPanelProps;
procedure
DestroyPanelProps;
function
IsPanelPropsExist: boolean;
function
GetPanelPropsLeftTop(var PanelProps_Left,PanelProps_Top: integer): boolean;
virtual; stdcall;
function
GetPanelPropsWidthHeight(var PanelProps_Width,PanelProps_Height: integer):
boolean; virtual; stdcall;
procedure
SetPanelPropsLeftTop(const PanelProps_OfsX,PanelProps_OfsY: integer); virtual;
stdcall;
procedure
SetPanelPropsWidthHeight(const PanelProps_Width,PanelProps_Height: integer);
virtual; stdcall;
//.
CustomPanelProps routines
function
IsCustomPanelPropsExist: boolean;
function
idCustomPanelProps: integer;
function
CustomPanelProps: TClientBlobStream;
procedure
SetCustomPanelProps(Stream: TStream; const flNewValue: boolean{если = true, то заменяет панелью с новым ID});
procedure
SetCustomPanelPropsByID(const idPanelProps: integer);
procedure
ReleaseCustomPanelProps;
//.
создает
новую панель свойств
function
TPanelProps_Create(pflReadOnly: boolean; pidOwnerObjectProp:
integer;pOwnerPanelsProps: TAbstractSpaceObjPanelsProps; const pProxyObject:
TObjectDescr): TAbstractSpaceObjPanelProps; virtual; stdcall;
function
getName: shortstring; virtual; stdcall;
procedure
setName(Value: shortstring); virtual; stdcall;
function
getHint: shortstring; virtual; stdcall;
function
getidTObj: integer; stdcall;
function
getSpace: TProxySpace;
//.
операция
синхронизации
данных всей
модели на Update компонента
procedure
DoOnComponentUpdate;