Obx/Docu/ru/Lines.odc

Описание системы примерами: ObxLines

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

Реализация ObxLines достаточно проста: есть отображение, модель и структура данных линии. Модель представляет линейный список линий. Линия описывается двумя ее концами (x0,y0) и (x1,y1). У каждого отображения есть свой текущий цвет рисования. Существует операция для добавления линии (операция над моделью) и операция для смены цвета рисования (операция над отображением).

Когда линия добавлена (или отменена), ее окаймляющий прямоугольник перерисовывается. Для этого, определено подходящее сообщение.

Есть два интересных аспекта реализации ObxLines:

Содержимое графика, т.е. линейный список линий, не изменяется. Это означает, что линия, занесенная в график никогда не будет изменена. Список может становиться длинее за счет добавления других линий при помощи мыши, но существующий список линий сам по себе остается неизменным. Например, операция отмены просто меняет рисунок, чтобы показывать не все линии из списка, а операция восстановления приводит к отображению более полной версии рисунка.

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

Вторая интересная особенность ObxLines - это метод построения "резиновой нити". "Резиновая нить" осуществляет обратную связь при рисовании новой линии, пока нажата кнопка мыши. Процедура HandleCtrlMsg показывает типичную реализацию такого механизма: она состоит из цикла запросов, который повторно запрашивает состояние кнопки мыши. При передвижении мыши старая "резиновая нить" должна быть стерта, а новая - нарисована.    

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

С помощью процедуры HandlePropMsg, отображение сообщает, что оно может принимать фокус ввода, чтобы его можно было редактировать.

Данное отображение имеет общую модель. Поэтому оно реализует "модельный протокол" отображения, т.е. методы CopyFromModelView, ThisModel, и HandleModelMsg. CopyFromModelView - модельно-ориентированное улучшение процедуры CopyFrom; оно должно быть реализовано вместо CopyFrom. ThisModel  просто возвращает модель отображения. HandleModelMsg получает сообщения об обновлении модели и обновляет видимую область, что в конечном итоге приводит к перерисовке соответствующей области экрана.

ObxLinessources

 "ObxLines.Deposit; StdCmds.Open"

Перевел студент группы 08-302 Забелин И.С.