Связывание интерфейса с моделью

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 – Работа с таблицей в режиме автоформы