Связывание интерфейса с моделью. 1) Связь пользовательского интерфейса с моделями ЕСО обычно происходит через компонент ExpressionHandle
1) Связь пользовательского интерфейса с моделями ЕСО обычно происходит через компонент ExpressionHandle. Он доступен в категории палитры инструментов Enterprise Core Objects. Через подобные идентификаторы (дескрипторы) организуется доступ к объектам модели и пространства ЕСО во время работы программы.
Идентификаторы ЕСО связываются друг с другом в цепочки. Во главе такой цепочки расположен корневой идентификатор. Он задает общий контекст работы (доступ к объектному пространству) для всех остальных идентификаторов ЕСО в программе.
Корневой идентификатор добавляется к проекту автоматически (по умолчанию он называется rhRoot). Все остальные идентификаторы ЕСО добавляются и настраиваются вручную, что связывает пространство ЕСО с элементами пользовательского интерфейса с помощью типовых механизмов связывания .NET.
Будем работать с формой Преподаватели. Добавим компонент ExpressionHandle. Он отображается в нижней части окна Проектировщика, под формой, где уже имеется набор компонентов ЕСО. Назовем его ehChair, введем это имя в свойство Name категории Design.
2) В свойстве RootHandle этого дескриптора выберем значение RHRoot – ссылку на родительский, автоматически созданный корневой идентификатор. Так задают место данного идентификатора в цепочке доступа к объектному пространству ЕСО.
3) В свойстве DataSource таблицы dgChair выберем имя ehChair в списке доступных идентификаторов ЕСО.
4) Настроим таблицу Преподаватель так, чтобы она отражала список преподавателей, принадлежащих выбранной кафедре в первой таблице. Для начала добавим в проект дескриптор CurrencyManagerHandle (из категории Enterprise Core Objects) и дадим ему имя cmhChair, так как этот компонент будет указывать на текущую строку таблицы Кафедры. Свяжем дескриптор cmhChair с таблицей dgChair через свойство BindingContext. Теперь он отслеживает выделенную строку этой таблицы.
5) Зададим ссылку на объект ehChair в свойстве RootHanler, определяющим корневой идентификатор ECO.
6) Добавим к проекту еще один компонент ExpressionHandle. Назовем его ehLecturer. Дескриптор ehLecturer будет обращаться к экземплярам класса Преподаватель.
7) Зададим ссылку на объект cmhChair в свойстве RootHanler.
8) Потребителем объектов, предоставляемых дескриптором ehLecturer, будет вторая таблица. В ее свойстве DataSource выберем ссылку на объект ehLecturer.
9) Приступим к настройке элементов пользовательского интерфейса. Организуем с помощью визуальных средств Delphi создание новых экземпляров класса Кафедра и добавление их в таблицу. Выделим в окне Проектировщика кнопку Button1. В свойстве EcoListAction (Список стандартных действий ЕСО) выберем значение Add (Добавить объект).
10) Кнопка Button1 автоматически получила название Add. Переименуем кнопку. Для этого воспользуемся компонентом EcoListActions (он добавляется в проект по умолчанию и находится в нижней части окна Проектировщика), в его свойстве CaptionAdd введем Добавить.
11) Объект ЕСО, который мы хотим добавить к проекту (сделать доступным через элементы управления на форме), задается в свойстве RootHandle. В нем надо выбрать подходящий поставщик объектов ЕСО, в нашем случае — идентификатор ehChair.
12) Свяжем результат действия кнопки (созданный экземпляр класса Кафедра) с визуальным элементом, отображающим этот экземпляр, в нашем случае — с таблицей dgChair. Для этого в свойстве BindingContext (контекст связывания) выберем имя dgChair (см. Рисунок 8.13).
Рисунок 8.13 – Настройка кнопки добавления экземпляра класса Кафедра
13) Теперь добавим операцию удаления экземпляров класса Кафедра. Реализуем это действие по аналогии с операцией добавления. Выделим в окне Проектировщика кнопку Button2. В свойстве EcoListAction выберем значение Delete. Зададим идентификатор ehChair в свойстве RootHandle. Свяжем результат действия кнопки с визуальным элементом — таблицей dgChair. Для этого в свойстве BindingContext у кнопки Delete выберем имя dgChair. Перейдем к компоненту EcoListActions и в его свойстве Caption Delete введем Удалить.
14) Настройка кнопки Button3 (будет отвечать за добавление экземпляра класса Преподаватель). Значения свойств кнопки: EcoListAction – Add; RootHandle – ehLecturer; BindingContext – dgLecturer. Перейдем к компоненту EcoListActions и в его свойстве Caption Add введем Добавить.
15) Настройка кнопки Button4 (будет отвечать за удаление экземпляра класса Преподаватель). Значения свойств кнопки: EcoListAction –Delete; RootHandle – ehLecturer; BindingContext – dgLecturer. Перейдем к компоненту EcoListActions и в его свойстве Caption Delete введем Удалить.
16) Кнопка Button5 будет отвечать за обновление БД. Назовем ее Сохранить. В свойстве EcoAction (категория ECO|GUI) выберем UpdateDatabase. Таким образом, по нажатию этой кнопки выполняется синхронизация содержимого пространства ECO в оперативной памяти и его копии в базе данных. После каждого нажатия кнопки Сохранить содержимое таблицы сохраняется в БД. После нового запуска программы в таблицу пользовательского интерфейса автоматически загружается содержимое модели, сохраненное при последнем выполнении команды UpdateDatabase.
На данном этапе связывание интерфейса с моделью закончено (см. Рисунок 8.14).
Рисунок 8.14 – Настроенный пользовательский интерфейс приложения
Создание логики на OCL
1) Действия, которые выполняет дескриптор в программе, определяются значением свойства Expression. В это свойство вводится выражение языка OCL, которое определяет схему создания объектов модели ЕСО.
Используем дескриптор ehChair для обращения к экземплярам класса Кафедра. Введем в свойство Expression объекта ehChair строку clChair.allinstances. Иначе это можно сделать с помощью редактора OCL выражений. Введенное выражение задает доступ ко всем текущим экземплярам класса Кафедра в объектном пространстве. В таблице, показанной на форме в окне Проектировщика, сразу же отобразятся поля класса Кафедра (ChairHeadSNP, ChairSecrSNP и ChairName) (в том числе поля родительского класса, если он имеется). Дескриптор ehChair становится поставщиком данных нашей модели ЕСО для первой таблицы.
2) В качестве выражения OCL объекта ehLecturer введем строку self.roleLecturers в свойство Expression. Здесь roleLecturers — это введенное нами при построении модели имя роли класса Преподаватель (clLecturer) в его ассоциативной связи с классом Кафедра (clChair). Это выражение определяет группу преподавателей, принадлежащих кафедре, которая выбрана в первой таблице. Дескриптор ehLecturer становится поставщиком данных для второй таблицы (см. Рисунок 8.15).
Рисунок 8.15 – Настройка OCL-выражений для взаимосвязанных таблиц
3) Дадим заголовкам полей таблиц русскоязычные названия. Выберем на форме таблицу dgChair. Щелчком на кнопке с многоточием в строке свойства TableStyles откроем окно редактора коллекции стилей таблицы DataGridTableStyle Collection Editor. Создадим новый стиль таблицы, нажав на кнопку Add (см. Рисунок 8.16).
Рисунок 8.16 – Коллекция таблиц компонента gdChair
Щелкнем по кнопке с многоточием в строке свойства GridColumnStyles. Откроется окно редактора стиля поля таблицы. Нажмем кнопку Add 3 раза, так как нужно переименовать три поля (создать три стиля для имеющихся полей таблицы). Выберем свойство HeaderText первого элемента коллекции и введем в него стоку Название кафедры. Затем в свойстве Width установим ширину поля – 150. И в свойстве MapingName выберем ChairName. То есть первый столбец настраиваемой таблицы будет содержать информацию атрибута ChairName класса Кафедра (см. Рисунок 8.17).
Теперь настроим оставшиеся два элемента коллекции. Эти столбцы будут называться ФИО зав кафедрой и ФИО секретаря кафедры. Нажмем кнопку ОК в обоих открытых окнах и убедимся, что поля таблицы получили новые названия.
4) По аналогии настроим стиль таблицы Преподаватели. В ней отобразим два поля: LecturerSNP и LectAcadDegree. Назовем их ФИО преподавателя и Ученая степень.
5) Запустим программу и убедимся, что при нажатии кнопки Добавить в таблице автоматически формируются новые строки, отражающие содержимое новых экземпляров класса из объектного пространства ЕСО. В них можно ввести нужные значения. Проверим корректное функционирование остальных настроенных операций над объектным пространством (см. Рисунок 8.18).
Рисунок 8.17 – Настройка элемента коллекции столбцов
Рисунок 8.18 – Работа с базой данных в режиме таблицы
Задания
1) Сформировать модель UML. Создать классы, описать их атрибуты. Настроить взаимосвязи между классами.
2) Связать пространство ЕСО с базой данных.
3) Создать пользовательский интерфейс.
4) Связать интерфейс с моделью UML.
5) Элементы управления связать с выражениями OCL для выполнения типичных стандартных действий (добавление, удаление объектов ECO и сохранение их в базу данных).
Контрольные вопросы
1) Технология MDA.
2) Что такое технология ECO?
3) Зачем нужны дескрипторы ECO?
4) Зачем нужен язык OCL?
5) Из каких этапов складывается процесс построения приложения ECO?
6) Как создаются классы в рамках модели приложения ECO?
7) Как представители класса PersistenceMapper настраиваются на конкретные СУБД?
8) Как автоматически сгенерировать схему базы данных на основе модели ECO?
9) Как элементы пользовательского интерфейса связываются с моделью ECO?
10) Как работает визуальный редактор выражений OCL?