Расширение пользовательского интерфейса

Команды-триггеры для удобства можно привязать к пользовательским элементам управ­ления. Создадим в текущем проекте контекстное меню с помощью компонента 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) Как связать триггеры с элементами пользовательского интерфейса?