Команды-триггеры для удобства можно привязать к пользовательским элементам управления. Создадим в текущем проекте контекстное меню с помощью компонента ContextMenu из категории Components. Пусть в нем будет три пункта: Выбрать, Назначить и Отклонить. Их необходимо связать с соответствующими триггерами.
1) Добавим на форму компонент ContextMenu, дадим ему имя cmSubject.
2) В свойстве меню RootHandle задается корневой идентификатор ehSubject.
3) Объект управления (таблица Дисциплины), для которого вызывается данное меню, выбирается в свойстве BindingContext.
4) В свойстве EcoListAction выбирается тип действия ЕСО, выполняемого при выборе данного пункта. Введем значение ExecuteAction (исполняемое выражение OCL).
5) Само выражение OCL следует ввести в свойство ActionExpression. Это выражение формируется с помощью раздела Triggers в редакторе выражений OCL. Так, для пункта Выбрать дисциплину это выражении записывается как строка self.Choose.
6) В свойстве EnabledOCL с помощью этого же редактора формируется выражение OCL – триггерный запрос, который определяет, доступен ли пользователю соответствующий элемент управления (в нашем случае – пункт меню). Если триггер недоступен, то и пункт меню автоматически блокируется. Запрос выбирается в разделе редактора Trigger queries. Например, для пункта меню Назначить он записывается строкой self.Appoint? (см. Рисунок 9.8).
7) Выделим таблицу dgSubject. В ее свойстве ContextMenu выберем ссылку на настроенный компонент cmSubject. Привязка и настройка контекстного меню для объектов таблицы Дисциплины закончена.
Рисунок 9.8 – Связывание команд-триггеров с компонентом ContextMenu
8) Запустим приложение. Видно, что контекстное меню каждой строки (доступные в ней пункты) автоматически меняется в зависимости от состояния текущей дисциплины (см. Рисунок 9.9).
Рисунок 9.9 – Применение контекстного меню в приложении
Задания
1) Продумать, какой объект из предметной области можно представить в виде последовательности определенных состояний.
2) Расширить модель UML: создать машину состояний для выбранного объекта (или объектов) и модифицировать диаграмму классов.
3) Обновить базу данных, модифицировать пользовательский интерфейс и связать его с моделью.
4) Применить автоформы или контекстное меню.
Контрольные вопросы
1) Что такое автомат?
2) Назовите базовые правила работы автоматов в языке UML?
3) Для чего предназначены диаграммы состояний?
4) Как строятся диаграммы машин состояний?
5) Как настраиваются триггеры в диаграммах состояний?
6) Как задаются правила перехода на языке OCL для триггеров?
7) Как связать триггеры с элементами пользовательского интерфейса?