Связывание интерфейса с моделью
1) Сформируем три дескриптора ЕСО: ehLecturer, ehSubject (экземпляры класса ExpressionHandle) для организации доступа к объектам модели и пространства ЕСО во время работы программы и cmhLecturer (экземпляр класса CurrensyManagerHandle), который будет служить для указания на текущий объект таблицы Преподаватели.
2) Настроим таблицу Дисциплины так, чтобы она отражала список дисциплин, принадлежащих выбранному преподавателю в первой таблице. Свяжем дескриптор cmhLecturer с таблицей dgLecturer через свойство BindingContext. Теперь он отслеживает выделенную строку этой таблицы.
3) Настроим дескриптор cmhLecturer на связь с родительским объектом. Зададим ссылку на объект ehLecturer в свойстве RootHandle, определяющем корневой идентификатор ЕСО.
4) В свойстве RootHandle дескриптора ehSubject выберем значение cmhLecturer. Так задают место данного идентификатора в цепочке доступа к объектному пространству ЕСО.
5) В качестве выражения OCL введем в свойство Expression объекта ehSubject строку self.roleSubjects. Здесь roleSubjects – это имя роли класса Subject в его ассоциативной связи с классом Преподаватель. Это выражение определяет список дисциплин, предложенных и назначенных преподавателю, который выбран в таблице Преподаватели.
6) Свяжем таблицу Преподаватели с дескриптором ehLecturer через ее свойство DataSource, а таблицу Дисциплины – с дескриптором ehSubject. Теперь таблицы отображают поля классов Преподаватель и Дисциплина. Кроме этого, в таблице Дисциплины появилось поле SubjectState, которое будет автоматически отображать текущее состояние дисциплин.
7) Настроим стили таблиц. Воспользуемся свойством таблицы TableStyles. Присвоим полям таблиц русскоязычные названия.
8) Настроим функционирование кнопок. Выделим в окне Проектировщика кнопку Button1. В свойстве EcoListAction выберем значение Add. В свойстве RootHandle выберем подходящий поставщик объектов ЕСО – идентификатор ehSubject. Свяжем результат действия кнопки (созданный экземпляр класса Дисциплина) с визуальным элементом, отображающим этот экземпляр, в нашем случае — с таблицей dgSubject. Для этого в свойстве BindingContext выберем имя dgSubject. Аналогично настроим кнопку Button2 на операцию удаления. Выберем компонент EcoListActions, в его свойстве CaptionAdd введем слово Добавить, а в свойстве CaptionDelete – Удалить. Кнопки автоматически получила название Добавить и Удалить. В свойстве Text кнопки Button3 введем значение Сохранить (см. Рисунок 9.6).
9) Запустим приложение. Добавим несколько объектов в таблицу Дисциплины для выбранного преподавателя. В поле Состояние таблицы Дисциплины все объекты имеют одинаковое значение ChosenLecturer. На данный момент это состояние неизменяемо. Чтобы иметь возможность изменять состояния, произведем следующую модификацию пользовательского интерфейса.
Применение автоформ
Автоформа ЕСО предназначена для модификации в отдельном окне объектов ЕСО, представленных в таблицах. Для вызова автоформы надо задать в свойстве таблицы EcoAutoForm значение True. Если запустить программу и дважды щелкнуть мышью на произвольной строке таблицы, откроется диалоговое окно, содержащее текстовые поля, которые соответствуют столбцам таблицы (атрибутам объекта ЕСО). В этом окне отображается содержимое полей строки, на которой был выполнен щелчок.
Для одной таблицы можно открыть несколько окон автоформы одновременно и редактировать значения разных объектов. При этом модифицированные величины корректно отображаются в таблице и фиксируются в объектном пространстве. Данная возможность, как будет показано далее, особо полезна в случаях, когда между объектами таблицы установлены дополнительные связи.
Рисунок 9.6 – Связывание интерфейса с моделью
1) Таблицу Дисциплины настроим на работу в режиме автоформы. Для этого в свойстве EcoAutoForm зададим значение True.
2) Запустим приложение. Если щелкнуть в начале произвольной строки таблицы, хранящей список дисциплин, откроется автоформа для ее редактирования. В ней на закладке Methods показаны возможные переходы между состояниями, причем в соответствии с последовательностью переходов: в следующее состояние нельзя перейти, не побывав в предыдущем. Если в автоформе нажать кнопку Choose (Подпись кнопки совпадает с именем соответствующего триггера), список доступных переходов автоматически изменяется. Соответствующие изменения отобразятся и в колонке Состояние таблицы Дисциплины. Причем, переход в состояние Назначить дисциплину ограничен условием: количество рабочих часов преподавателя, которого собираются назначить на ведение выбранной дисциплины, в сумме с количеством часов назначаемой дисциплины должно быть меньше или равно максимальному количеству рабочих часов для преподавателя (см. Рисунок 9.7).
Рисунок 9.7 – Работа с таблицей в режиме автоформы