
- •Объекты и события в 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.
Глава 2. События.
Чтение ввода пользователя.
При написании обычных программ на Паскале, для получения ввода пользователя и его обработки часто используются блоки вида:
repeat
B := ReadKey; { чтение ввода пользователя }
case B of { обработка ввода }
‘i’ : InvertArray;
‘e’ : EditArray;
‘g’ : GraphicDisplay;
‘q’ : Quit := True;
end;
until Quit; .
Программа, управляемая событиями, не очень отличается от обычной по принципу. Однако, с точки зрения программиста, различия есть.
В программах на TurboVision ввод пользователя читается самой TurboVision, упаковывается в записи Паскаля, называемые событиями (Event), и передается видимым элементам программы для обработки.
К примеру, если пользователь отметил мышкой неактивное окно, программа обнаруживает это событие, упаковывает его и направляет вниз по дереву видимых элементов. Когда событие достигнет отмеченного окна, окно реагирует на него, становясь активным.
Видимые элементы TurboVision сами могут обрабатывать большую часть ввода: окно знает, как открыться, закрыться, переместиться, изменить размер; меню знает, как открыться, взаимодействовать с пользователем и закрыться; кнопки – как нажиматься и т.д.
Механизм передачи событий уже существует. Программист, в соответствии со своими задачами, определяет новые видимые элементы с новыми функциями, которые должны знать об определенных видах событий, заданных программистом, и реагировать на них.
Виды событий.
События в TurboVision можно разделить на четыре класса:
1). События от мышки:
нажатие или отпускание любой кнопки мыши;
изменение позиции курсора мыши;
«авто»-событие (длительное удерживание кнопки мыши нажатой).
2). События от клавиатуры (нажатия клавиш).
3). События-сообщения – специальный вид событий для обеспечения взаимодействия видимых элементов программы между собой. События-сообщения бывают трех типов: события-команды, общие сообщения и пользовательские сообщения.
4). «Пустые» события, - этот класс событий включает в себя всего один элемент – пустое событие. Пустое событие не несет полезной информации и генерируется объектом, обработавшим «непустое» событие, для указания, что событие уже обработано. Объекты просто игнорируют пустые события.
События-сообщения. Команды. Разрешение и запрещение команд.
События, циркулирующие внутри дерева видимых элементов, можно условно разделить на две группы – события внешние и внутренние. К первым относятся события, воздействующие на объекты программы извне – это события от мышки и клавиатуры; внутренние события генерируются самими объектами программы, к ним и относятся события-сообщения.
События-сообщения служат для передачи информации между взаимодействующими объектами. Необходимость использования сообщений следует из того, что объекты не могут связаться напрямую, т.к. не знают указателей друг на друга.
Событие-сообщение содержит команду, и объект, обнаруживший известную ему команду, реагирует на нее определенным образом. Каждой команде соответствует уникальный код – константа типа Word, имя которой, по соглашению TurboVision, имеет вид cmXXXX (command).
Например, объекты полосы скроллинга TScrollBar и скроллера текста TScroller, принадлежа объекту окна TWindow, оба находятся в списке подэлементов окна. Отметка мышью в полосе скроллинга передается TScrollBar и полоса скроллинга должна сообщить скроллеру, чтобы тот показал другую часть текста. Полоса скроллинга посылает общее сообщение, которое содержит команду cmScrollBarChanged и указатель на себя (т.е. на объект TScrollBar), и, когда TScroller обнаружит это сообщение, он может связаться с TScrollBar для получения новых параметров вывода текста.
Для уже определенных в TurboVision команд зарезервированы два диапазона: от 0 до 99 и от 256 до 999, остальные значения (100 - 255 и 1000 - 65535) программист может использовать для определения своих команд, без конфликтов с предопределенными командами.
Наличие двух диапазонов для команд связано с тем, что команды с кодами от 0 до 255 могут быть запрещены, что означает временную отмену их действия (на запрещенные команды объекты не реагируют). Для этого определена глобальная переменная типа TCommandSet = set of Byte; , в которой хранится набор разрешенных команд. Методы TView EnableCommands, DisableCommands, GetCommands, и SetCommands предназначены для получения и изменения текущего набора разрешенных команд.
Большинство внешних событий транслируется обрабатывающими их объектами в команды. Например, в меню каждому элементу соответствует некоторая команда, и выбор элемента меню приводит к генерации события-сообщения с соответствующей командой. Команды связываются с элементами меню в вызове конструктора объекта меню. Подобным образом объект кнопки (TButton) имеет ассоциированную с кнопкой команду, определяемую параметром ACommand в вызове конструктора TButton.Init:
TButton.Init(var Bounds: TRect; ATitle: TTitleStr; ACommand: Word;
AFlags: Byte); .
В TurboVision события-сообщения разделяются на два типа: события-команды и события-общие сообщения. От типа события-сообщения зави-сит, каким образом оно будет передаваться по дереву видимых элементов. Программист может ввести свой тип событий-сообщений – пользовательские сообщения, и задать способ их передачи.