BOLD - инструмент реализации MDA в Delphi


Формирование OCL-запросов к Object Space


Поместим компонент-описатель списка BoldListHandle1 на форму и присвоим ему название ListAllAvtors. Задачи данного описателя — получение из объектного пространства списка всех имеющихся авторов и передача этого списка визуальному компоненту BoldGrid1 для отображения. Описатель списка относится к производным описателям (см. предыдущую часть статьи), то есть обладает свойством <RootHandle> (корневой описатель), указывающим на источник информации. В данном случае таким источником является компонент-описатель всего объектного пространства BoldSystemHandle1. Поэтому в инспекторе объектов назначим свойству RootHandle компонента ListAllAvtors значение DataModule1.BoldSystemHandle1. Теперь сформулируем OCL-запрос, который обеспечит получение нужной нам информации об авторах. Обратимся к свойству <Expression> нашего описателя списка, описывающему выражение на языке OCL, посредством которого реализуется выбор необходимой информации. Это выражение можно ввести вручную, как мы делали раньше, рассматривая пример простого приложения4 , но удобнее воспользоваться OCL-редактором, встроенным в Borland MDA. Для его активации кликнем дважды в инспекторе объектов на свойстве <Expression>, при этом откроется окно редактора (рис. 4).

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

Поскольку нас сейчас интересуют авторы, кликнем дважды в навигационном окне по элементу Avtor — окно редактора изменится (рис. 5): в верхнем окне появилось выражение «Avtor»; нижнее окошко сообщает нам, что синтаксис OCL-выражения корректен, а тип возвращаемого результата — метатип (то есть класс модели); наконец, радикально изменилось содержимое навигационного окна, теперь в нем отображается список возможных OCL-операторов, применимых к нашему выражению (значки с желтой полоской). В самом верху этого списка находится нужный нам оператор <.allInstances> (Все сущности) — в данном случае все объекты типа <Автор>, поскольку мы уже частично задали наше OCL-выражение.

Кликнув дважды по этому элементу, мы увидим картину, представленную на рис. 6. Возвращаемый теперь тип результата — нужная нам коллекция объектов типа <Автор>.

Если обратить внимание на навигационное окно, то можно увидеть характерное разнообразие отображаемых в нем элементов. Здесь присутствуют ассоциации и их роли (значки с зеленой полоской), но не все, а только связанные с классом <Автор>. Также имеются атрибуты класса (значки с синей полоской) — в данном случае единственный атрибут «ФИО» класса <Автор>. И, конечно, по-прежнему присутствуют возможные OCL-операторы, с помощью которых можно «детализировать» наше выражение. Позже мы расскажем, как использовать эти богатые возможности, а сейчас отметим некоторые принципиальные моменты. Во-первых, несмотря на кажущуюся простоту, OCL-редактор является исключительно мощным средством формирования OCL-запросов. Обладая интеллектом и знаниями о модели, он динамически формирует возможные варианты последовательной детализации OCL-выражения и отображает их в навигационном окне. Во-вторых, как мы уже убедились, синтаксис OCL-выражений использует dot-нотацию, то есть его отдельные элементы отделяются точкой.

Выйдем из OCL-редактора и присвоим свойству BoldHandle компонентов BoldGrid1 и BoldNavigator1 значение ListAllAvtors. Далее правой кнопкой мыши на компоненте BoldGrid1 из всплывающего меню выберем пункт Create Default Columns и убедимся, что появился заголовок столбца «ФИО». Таким образом мы подключили визуальный компонент BoldGrid1 к объектному пространству посредством описателя списка ListAllAvtors.

Продолжим создание нашего приложения. По аналогии с настройкой списка всех авторов создадим описатель списка ListAllBook для получения списка всех книг. Это легко можно сделать самостоятельно, единственное отличие будет заключаться только в OCL-выражении, которое в данном случае будет выглядеть как «Kniga.allInstances». Список книг мы будем отображать в BoldGrid3, для чего свяжем уже известным нам способом компоненты BoldGrid3 и BoldNavigator2 c описателем списка ListAllBook.

В начало В начало



- Начало -  - Назад -  - Вперед -