
- •Объекты и события в turbo vision.
- •Глава 1. Объекты TurboVision.
- •Глава 2. События.
- •Глава 3. Взаимодействие видимых элементов.
- •Введение
- •Глава 1. Объекты turbo vision.
- •Иерархия объектов TurboVision. Принципы построения иерархии.
- •Примитивные типы объектов. Система координат TurboVision.
- •Видимые элементы.
- •Взаимосвязи между видимыми элементами.
- •Поля State и Options.
- •Выбор и активизация видимых элементов.
- •Глава 2. События.
- •Чтение ввода пользователя.
- •Виды событий.
- •События-сообщения. Команды. Разрешение и запрещение команд.
- •Запись события. Тип tEvent.
- •Цикл событий. Функция Execute.
- •Методы GetEvent и PutEvent. Централизация сбора событий.
- •Обработка событий. Метод HandleEvent.
- •Маршрутизация событий. Переменные FocusedEvents и PositionalEvents. Поле EventMask.
- •Глава 3. Взаимодействие видимых элементов.
- •Посредники.
- •Сообщения между видимыми элементами.
- •3. Кто обрабатывает общие сообщения.
- •4. Вызов процедуры HandleEvent.
Взаимосвязи между видимыми элементами.
Между видимыми элементами программы существуют два вида связей: связь в иерархии объектов и связь по принадлежности объектов в программе.
Объекты, действующие в программе, образуют «дерево принадлежности» - дерево видимых элементов, отражающее связи владельцев-групп и их подэлементов. На рис.7 изображено дерево принадлежности программы с двумя открытыми окнами на панели экрана.
Связи в иерархии и по принадлежности могут не совпадать (TFrame не является потомком TWindow, но принадлежит TWindow).
Управление программой на TurboVision происходит по дереву видимых элементов. Например, если отмечена мышкой полоса скроллинга, объект TApplication обнаруживает это событие и направляет его вниз по дереву видимых элементов в объект полосы скроллинга для обработки.
В процессе работы программы объекты создаются, вставляются в дерево видимых элементов, удаляются из него и уничтожаются. Дерево принадлежности растет при вставке элементов и уменьшается при их удалении.
Рис.7. Дерево видимых элементов программы (дерево принадлежности).
Поля State и Options.
Поле State (состояние) содержит информацию о состоянии видимого элемента. Поле State интерпретируется как битовое поле, в котором каждому биту соответствует некоторый флаг состояния, и установка бита в 1 или 0 означает наличие или отсутствие у видимого элемента соответствующего флага состояния. Для доступа к битам поля State по соглашению TurboVision используются константы с именами sfXXXX (state flag), где XXXX – имя флага состояния. В Таблице 1 приведены определенные в TurboVision константы sfXXXX.
Начальная установка флагов состояния происходит в конструкторе Init объекта, затем поле State изменяется, отображая текущее состояние видимого элемента.
Поле State никогда не должно изменяться напрямую, для этого следует использовать наследуемый от TView виртуальный метод SetState(AState: Word; Enable: Boolean), который устанавливает (если Enable=True) или очищает (Enable=False) биты, заданные параметром AState. Кроме установки битов, TView.SetState выполняет некоторые действия для отображения нового состояния, такие, как перерисовка других видимых элементов при скрытии данного (при очищении флага sfVisible) или перепрограммирование аппаратуры при изменении формы курсора (изменение флагов sfCursorVis и sfCursorIns). Потомки TView могут перекрывать SetState для реализации действий, основанных на изменении флагов состояния, но должны всегда вызывать наследуемый метод для изменения битов поля State.
На рис.8 приведен пример дерева программы с установленными флагами состояния элементов.
Рис.8. Дерево видимых элементов с установленными флагами состояния (V, E, M, S, F, A обозначают соответственно флаги sfVisible, sfExposed, sfModal, sfSelected, sfFocused, sfActive). Цветом выделена цепочка сфокусированных элементов.
Таблица 1. Константы sfXXXX.
Константа |
Значение |
Назначение флага |
sfVisible
sfCursorVis
sfCursorIns
sfShadow
sfActive
sfSelected
sfFocused
sfDragging
sfDisabled
sfModal
sfExposed
|
$0001
$0002
$0004
$0008
$0010
$0020
$0040
$0080
$0100
$0200
$0800
|
Установлен, ecли видимый элемент виден в своем владельце. Методы TView.Show и TView.Hide могут использоваться для модификации sfVisible. При установленном sfVisible видимый элемент необязательно видим на экране, поскольку его владелец может быть невидим. (По умолчанию установлен.) Установлен, ecли курсор видимого элемента видим, в противном случае очищен. Методы TView.ShowCursor и TView.HideCursor могут использоваться для модификации sfCursorVis. (По умолчанию очищен.) Установлен, если курсор видимого элемента – сплошной блок, очищен, если курсор – линия. По умолчанию очищен. Методы TView.BlockCursor и TView.NormalCursor могут использо-ваться для модификации sfCursorIns. Установлен, если видимый элемент имеет тень, в противном случае очищен. Установлен, если видимый элемент – активное окно или подэлемент активного окна. Установлен, если видимый элемент – текущий выбранный подэлемент внутри своего владельца. Каждый объект-группа имеет поле Current, которое указывает на текущий выбранный подэлемент (или nil, ecли подэлементов не выбрано). Может быть только один выбранный подэлемент в группе. Установлен, если видимый элемент сфокусированный. Видимый элемент – сфокусированный, если он выбран и все владельцы выше его также выбраны, т.е. если видимый элемент находится в цепи, oбpaзованной указателями Current всех групп, начиная с TApplicalion (самый верхний видимый элемент в дереве видимых элементов). Последний види-мый элемент этой цепи — конечное назначение для всех сфокусированных событий. Установлен, если видимый элемент перемещается, иначе очищен. Установлен, если видимый элемент запрещен; очищен, если разрешен. Установлен, если видимый элемент – модальный. Модальный видимый элемент представляет вершину (корень) активного дерева событий, получая события и управляя ими до тех пор, пока не будет вызван его метод EndModal. Модальным видимый элемент становится, когда происходит его вставка в группу посредством метода TGroup.ExecView (например, при вставке диалогового окна). Установлен, если у видимого элемента прямой или косвенный владелец - объект TApplication и, следовательно, элемент может быть виден на экране. |
Поле Options (опции) содержит набор атрибутов, определяющих различия в поведении видимых элементов. Это также битовое поле: установка позиции бита в 1 указывает, что видимый элемент имеет отдельный атрибут, очистка битовой позиции означает, что атрибут отключен или запрещен. Для ссылок на битовые позиции поля Options определены константы ofXXXX (option flag), приведенные в Таблице 2.
Атрибуты Options устанавливаются в конструкторе объекта Init и не изменяются в процессе функционирования объекта.
Таблица 2. Константы ofXXXX.
Константа |
Значение |
Назначение атрибута |
ofSelectable
ofTopSelect
ofFirstClick
ofFramed
ofPreProcess
ofPostProcess
ofBuffered
ofTileable
ofCenterX
ofCenterY |
$0001
$0002
$0004
$0008
$0010
$0020
$0040
$0080
$0100
$0200 |
Уcтановлен, ecли видимый элемент может быть выбран внутри своего владельца, иначе – очищен. Установлен, если видимый элемент помещается перед всеми другими равными видимыми элементами, когда он выбран. Окна (TWindow и его потомки) по умолчанию имеют этот бит установленным, что заставляет их располагаться перед всеми другими окнами на панели экрана. Если очищен, отметка мышкой невыбранного элемента только выбирает его. Если установлен, такая отметка мышкой выбирает видимый элемент и может далее обрабатываться как обычная отметка мышкой в выбранном элементе. Не имеет эффекта, если ofSelectable не установлен. Установлен, если видимый элемент имеет рамку. TWindow и его потомки имеют TFrame, как свой последний подэлемент. Установлен, если видимый элeмент получает активные события до того, как они были переданы сфокусированному элементу. Установлен, если видимый элемент получает активное событие в случае, когда сфокусированный элемент не обработал его. Используется только для потомков TGroup. Установлен, если группа может иметь свой кэш-буфер. Кэш-буфер содержит видео-образ всей группы, увеличивая скорость перерисов-ки. При отсутствии буфера, TGroup.Draw вызывает методы каждого подэлемента DrawView. Если впоследствии New и GetMem не могут получить достаточнo памяти, буфера групп будут освобождать память. Установлен, если панель экрана может расположить этот видимый элемент заполнением (или каскадом). Обычно используется только с объектами TWindow. Установлен, если видимый элемент центрируется по оси Х своего владельца при вставке в группу с использованием ТGroup.Insert. Аналогично для Y. |