Смекни!
smekni.com

сивными.Если выделить меню, то рабочая область становится пассивной,и

уже не будет возможности работать с окнами рабочей области до тех пор,

пока рабочая область опять не станет выделенной.

Выделенные объекты образуют цепочку выделенных объектов (в нашем

примере : программа - рабочая область - диалоговое окно - строка вво-

да).Последний объект такой цепочки называется сфокусированным объек-

том.В нашем примере это строка ввода - именно в эту строку ввода будут

помещаться набираемые на клавиатуре символы.На экране сфокусированный

объект обычно выделяется особым цветом (или он весь изменяет цвет, или

его отдельные детали).В некоторых случаях у него меняются отдельные

детали, так у окна изменяется вид рамки вокруг этого окна.

Если выделенным объектом является окно или его потомок, то такой

объект и его подэлементы называются активными.

Отображаемые объекты могут находиться в одном из двух режимов :

обычном и модальном.Тип режима задается способом размещения объекта в

группе.Если объект является модальным, то все события, возникающие в

программе, обрабатываются только этим объектом и его подэлементами.В

рассматриваемом примере если диалоговое окно находится в модальном ре-

жиме, то все события будут поступать ему и его подэлементам - рамке,

строке ввода и кнопке.Наличие модального объекта приводит к тому, что

нельзя выйти за пределы этого объекта и его подэлементов без снятия

режима модальности (как правило, для этого требуется удалить модальный

объект из группы, в которой он находится).Строка состояния позволяет в

ряде случаев работу с ней и при наличии модального объекта.

Сама программа как отображаемый объект является модальным объек-

том.

Обработка событий

При использовании объектно-ориентированного программирования все

объекты являются в некотором смысле обособленными друг от друга и воз-

никают определенные трудности в передаче информации от объекта к объ-

екту.Тем не менее невозможно представить себе программу, где не осу-

ществлялся обмен информацией между ее отдельными частями.Для того,

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

использоваться тот или иной механизм.В Turbo Vision таким механизмом

является механизм обработки событий.При таком способе любая передавае-

мая информация оформляется в виде так называемого события, представля-

ющего с точки зрения языка Паскаль запись, отдельные слова поля кото-

рой характеризуют те или иные свойства передаваемой информации.Тип

этой записи - tEvent :

type

tEvent = record

What: Word;

case Word of

evNothing: ();

EvMouse: (

Buttons: Byte;

Double: Boolean;

Where: tPoint);

evKeyDown: (

case Integer of

0: (KeyCode: Word);

1: (CharCode: Char;

ScanCode: Byte));

end;

evMessage: (

Command: Word;

case Word of

0: (InfoPrt: Pointer);

1: (InfoLong: Longint);

2: (InfoWord: Word);

3: (InfoInt: Integer);

4: (InfoByte: Byte);

5: (InfoChar: Char);

end;

end;

end;

Запись tEvent состоит из двух частей.Первая часть задает тип со-

бытия (What), определяющий в первую очередь источник данного собы-

тия.Под этот параметр выделяется 16-ти разрядное слово.Отдельные биты

этого слова имеют следующие значения (в скобках - имя константы, имею-

щей единицу в соответствующем разряде слова) :

0-й бит (evMouseDown) - нажата клавиша мыши.

1-й бит (evMouseUp) - отпущена клавиша мыши.

2-й бит (evMouseMove) - мышь перемещена по поверхности.

3-й бит (evMouseAuto) - автоимпульсы от мыши при длительном нажа-

тии клавиши.

4-й бит (evKeyDown) - нажата клавиша клавиатуры.

8-й бит (evCommand) - событие-команда.

9-й бит (evBroadcast) - событие-сообщение.

События-команды и события-сообщения формируются теми или иными

объектами программы для передачи информации другим объектам.Основное

отличие их друг от друга заключается в механизме их обработки.

Помимо указанных констант в Turbo Vision используются константы,

соответствующие группам бит и определяющих источник создания собы-

тия :

evNothing = $0000 - обработанное событие;

evMouse = $000F - событие от мыши;

evKeyboard = $0010 - событие от клавиатуры;

evMessage = $FF00 - событие от объекта (команда или сообщение).

Вторая часть записи tEvent задает информацию, передаваемую с со-

бытием.

Параметры события от мыши.

Buttons (1 байт).Если единица записана в нулевом бите, то событие

поступило от левой клавиши.Если единица в первом бите - была нажата

правая клавиша.

Параметр Double типа Boolean (1 байт) принимает значение True,

если от мыши поступила информация о двойном нажатии, и False - в про-

тивном случае.

Параметр Where типа tPoint (два 16-ти разр.слова) дает текущие

глобальные координаты курсора мыши.

Для событий от клавиш клавиатуры задается информация о нажатой

клавише (либо как 16-ти разрядный код клавиши (KeyCode), либо как со-

вокупность 8-ми разрядного ASCII-кода символа (CharCode) и 8-ми раз-

рядного скэн-кода (ScanCode) - фактически порядкового номера клавиши.

Параметры событий от объектов.

Параметр Command типа Word, задающий код команды, которую необхо-

димо выполнить при появлении данного события.

Второй параметр определяет передаваемую с событием информацию.На-

иболее распространенный вариант - передача указателя (InfoPtr типа

Pointer) на область нахождения информации.Для небольших объемов :

длинное целое (InfoLong типа Longint), беззнаковое целое (InfoWord ти-

па Word), знаковое целое (InfoInt типа Integer), байт (InfoByte типа

Byte), символ (InfoChar типа Char) - предусмотрена их непосредственная

передача.

Обработка события всегда начинается с текущего модального объек-

та, после чего, если необходимо, оно передается подэлементам этого мо-

дального объекта.Если единственный модальный объект - сама программа,

обработка начинается с него.

В зависимости от последовательности обработки событий объектами

все события можно разбить на три группы.

1 группа включает все события от мыши.Эти события воздействуют в

зависимости от координат курсора мыши.Модальный объект, воспринявший

такое событие, передает его своим подэлементам в Z-порядке, отыскивая

подэлемент, в который попадает курсор мыши.Этот подэлемент, если он

существует и является группой, в свою очередь, также передает это со-

бытие своим подэлементам в Z-порядке и т.д., пока этот поиск не оста-

новится из-за отсутствия соответствующего подходящего подэлемента.Если

соответствующий объект найден, то он будет обрабатывать событие, в

противном случае событие обрабатываться не будет.

2 группа предназначена для сфокусированного объекта и включает

события от клавиш клавиатуры и команды.Эти события передаются по це-

почке выделенных объектов непосредственно сфокусированному объекту.Ес-

ли сфокусированный объект "не знает", как обработать соответствующее

событие, то оно передается назад по цепочке выделенных объектов к мо-

дальному объекту.

3 группа включает события-сообщения (стандартные и создаваемые

пользователем).Эти события передаются всем подэлементам модального

объекта в Z-порядке.Те, в свою очередь, передают их своим подэлементам

в Z-порядке и т.д. до тех пор, пока это событие не будет обработано

каким-либо объектом или же не будут просмотрены все объекты.

При обработке события сначала выполняются соответствующие дейс-

твия у объекта, которому предназначено событие, после чего событие

"очищается" стандартным методом ClearEvent :

procedure tView.ClearEvent(var Event: tEvent);

где Event - текущее "очищаемое" событие.Если событие не "очистить", то

оно будет передаваться и дальше в соответствии с механизмом его обра-

ботки и может быть обработано еще каким-либо объектом.

Команды

События от объектов (команды или сообщения) имеют в качестве од-

ного из параметров параметр Command типа Word, задающий код команды,

которую необходимо выполнить при обработке этого события.

Все используемые в Turbo Vision команды делятся на 4 группы :

- команды, зарезервированные за системой и которые можно маскиро-

вать методом DisableCommands объекта tView и демаскировать методом

EnablеCommands объекта tView, - коды от 0 до 99;

- команды, которые может вводить программист и которые можно мас-

кировать и демаскировать аналогично первой группе, - кода от 100 до

225;

- команды, зарезервированные за системой, но которые нельзя мас-

кировать и демаскировать, как команды первой группы, - коды от 256 до

999;

- команды, которые может вводить программист, но которые нельзя

маскировать и демаскировать, - коды от 1000 до 65535.

Программист может использовать зарезервированные за Turbo Vision

команды, не переопределяя их.Более того, команды этой категории имеют

стандартные названия, и средства пакета стандартным образом реагируют

на них.Так, например, команда cmClose вызывает закрытие активного ок-

на, а cmMenu - активизирует меню и т.д.Все стандартные команды начина-

ются с префикса cm.

ПОРЯДОК РАБОТЫ С ОТОБРАЖАЕМЫМИ ОБЪЕКТАМИ

Работа с отображаемыми объектами осуществляется в несколько эта-

пов, выполняемых в определенной последовательности.На этих этапах

отображаемый объект описывается, создается, помещается в соответствую-

щую группу, задаются его параметры, производится работа с объектом,

получаются введенные параметры, наконец, объект удаляется.

Описание отображаемого объекта

Если отображаемый объект не является стандартным, его следует

описать - ввести необходимые параметры и методы на основе правил объ-

ектного программирования.Методы могут быть 4-х видов : конструкторы,

деструкторы, переопределенные методы предка и специфические методы для

данного объекта.

Конструктор позволяет инициализировать отображаемый объект : за-

дать исходные параметры, создать его подэлементы и т.д.Кроме того, он

создает таблицу виртуальных методов, без которой нельзя будет обра-