Меню
  Список тем
  Поиск
Полезная информация
  Краткие содержания
  Словари и энциклопедии
  Классическая литература
Заказ книг и дисков по обучению
  Учебники, словари (labirint.ru)
  Учебная литература (Читай-город.ru)
  Учебная литература (book24.ru)
  Учебная литература (Буквоед.ru)
  Технические и естественные науки (labirint.ru)
  Технические и естественные науки (Читай-город.ru)
  Общественные и гуманитарные науки (labirint.ru)
  Общественные и гуманитарные науки (Читай-город.ru)
  Медицина (labirint.ru)
  Медицина (Читай-город.ru)
  Иностранные языки (labirint.ru)
  Иностранные языки (Читай-город.ru)
  Иностранные языки (Буквоед.ru)
  Искусство. Культура (labirint.ru)
  Искусство. Культура (Читай-город.ru)
  Экономика. Бизнес. Право (labirint.ru)
  Экономика. Бизнес. Право (Читай-город.ru)
  Экономика. Бизнес. Право (book24.ru)
  Экономика. Бизнес. Право (Буквоед.ru)
  Эзотерика и религия (labirint.ru)
  Эзотерика и религия (Читай-город.ru)
  Наука, увлечения, домоводство (book24.ru)
  Наука, увлечения, домоводство (Буквоед.ru)
  Для дома, увлечения (labirint.ru)
  Для дома, увлечения (Читай-город.ru)
  Для детей (labirint.ru)
  Для детей (Читай-город.ru)
  Для детей (book24.ru)
  Компакт-диски (labirint.ru)
  Художественная литература (labirint.ru)
  Художественная литература (Читай-город.ru)
  Художественная литература (Book24.ru)
  Художественная литература (Буквоед)
Реклама
Разное
  Отправить сообщение администрации сайта
  Соглашение на обработку персональных данных
Другие наши сайты
Приглашаем посетить
  Право (law.niv.ru)

   

Turbo Vision

Turbo Vision

ОГЛАВЛЕНИЕ

ОТОБРАЖАЕМЫЕ ОБЪЕКТЫ....................................

Объект tView........................................

Группа (tGroup). Z - порядок.........................

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

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

Помещение отображаемого объекта в группу............

СОЗДАНИЕ МЕНЮ...........................................

Создание разворачивающегося меню....................

Создание локального меню............................

СОЗДАНИЕ ОКОН И ДИАЛОГОВЫХ ОКОН.........................

Окна в Turbo Vision.................................

Элементы окон в Turbo Vision........................

Текстовый элемент буферированной информации.........

Текстовый элемент для пассивного терминала..........

Линейка скроллинга..................................

Диалоговое окно.....................................

Элементы диалоговых окон............................

Строка ввода........................................

Протокол............................................

Селективный и триггерный списки.....................

Статический и параметрический тексты................

Списки строк........................................

Стандартные окна....................................

Строка состояния, отображающая клавиши быстрого

управления..........................................

Стандартная палитра.................................

Изменение стандартной палитры.......................

НЕОТОБРАЖАЕМЫЕ ОБЪЕКТЫ TURBO VISION.....................

Анализаторы вводимой информации.....................

Объект - коллекция..................................

Потоки Turbo Vision.................................

Ресурсы.............................................

НЕКОТОРЫЕ ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ TURBO VISION.......

Текстовый редактор..................................

Отображение древовидных структур....................

Диалоговое окно задания цветной палитры.............

ЗАКЛЮЧЕНИЕ..............................................

ВВЕДЕНИЕ

Для эффективной работы системы и ее большего покупательского

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

является удобство работы пользователя.

Поэтому в настоящее время ни один программный продукт, лишенный

компьютером и программ между собой, не может рассчитывать на успех.

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

шему мнению, являются объектноориентированная система Turbo Vision

Microsoft. Рассмотрением возможностей ОС Windows занимался А. А. Галаш-

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

ностей, возможностей, элементов, организации пакета Turbo Vision.

При создании прикладной программы программист большие усилия зат-

рачивает на организацию ввода/вывода информации, т. е. на формирование

интерфейса. Они соизмеримы с усилиями, затрачиваемыми на программирова-

ние основного алгоритма программы, по которому решается конкретная за-

дача. Работа, связанная с организацией ввода/вывода, повторяется от

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

кает внимание программиста от решения основной задачи.

Хорошим средством упрощения работы по организации ввода/вывода,

его унификации с учетом современных требований к интерфейсу программ

является разработанный фирмой Borland International пакет Turbo

Vision 2. 0, представляющий объектно-ориентированную библиотеку средств

формирования пользовательского интерфейса.

ность двух частей : часть программы, обеспечивающая решение основной

задачи, и часть, обеспечивающая организацию ввода/вывода информации с

программы. В основную часть (из основной части) программы информация

мации (например, программа формирует какие-то данные и размещает их в

конкретном файле на магнитном диске) и передача информации с помощью

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

ную информацию). Способ, основанный на организации диалога, является

более универсальным и именно для организации диалога предназначен в

В современных программах, работающих в текстовом режиме, диалог

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

строк состояния. Turbo Vision позволяет реализовать все эти средства

диалога.

Turbo Vision представляет собой библиотеку объектов, позволяющих

создать пользовательский интерфейс и широко использующих свойства ин-

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

являются потомками общего абстрактного объекта tObject. Мы рассмотрим

их классификацию, исходя из задач, возникающих при создании интерфейса.

тремя методами, два из которых - конструктор Init :

constructor tObject. Init;

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

destructor tObject. Done;

потомках, а третий метод Free :

procedure tObject. Free;

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

т. к. может удалить любой потомок объекта tObject.

При организации интерфейса приходиться решать две задачи : созда-

ние соответствующего образа на экране и возможность посредством того

образа передачи информации как от пользователя к вычислительной маши-

не, так и от машины к пользователю. Помимо этих двух задач при организа-

ции интерфейса приходиться выполнять различные вспомогательные опера-

и т. д.). В связи с этим все объекты Turbo Vision можно разбить на две

группы : отображаемые и неотображаемые объекты.

ОТОБРАЖАЕМЫЕ ОБЪЕКТЫ

Отображаемыми объектами являются такие объекты, которые могут

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

пользователю информацию, дать ему средства ввода информации в програм-

му наиболее естественным образом. К таким объектам относятся,в частнос-

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

Любой отображаемый объект является потомком общего абстрактного

tObject.

Неотображаемыми объектами являются объекты, которые не могут быть

изображены на экране. К этой категории, в частности, относятся объекты,

предназначенные для контроля и хранения данных. Наиболее часто исполь-

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

ции, коллекции, потоки и ресурсы.

определяющих его свойства и методов (подпрограмм), задающих его пове-

дение. Согласно принципам объектного программирования, желательно пара-

щих методов, предназначенных для этой цели. Это связано с тем, что в

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

следует выполнить дополнительно определенные действия (например, пере-

рисовать объект на экране). В ряде случаев непосредственное изменение

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

писывать). К сожалению, принцип объектного программирования, требующий

изменения параметров только с помощью того или иного метода, в полной

мере в Turbo Vision не реализован, и приходится в простейших случаях

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

тоды.

Любой отображаемый объект может быть размещен на кране в прямоу-

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

вого нижнего углов. В Turbo Vision координаты задают линии раздела меж-

ду знакоместами, и при этом нумерация по горизонтали и вертикали начи-

нается с нуля (координаты 0,0 - левый верхний угол экрана). Координаты

угла крана, и относительными, отсчитываемыми от левого верхнего угла

соответствующего окна (так называемого владельца данного отображаемого

объекта).

Для задания координат точки на кране и координат прямоугольной

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

точки - X и Y :

type tPoint = object

X, Y : Integer;

end;

области. Объект tRect не только содержит соответствующие координаты, но

Объект tView

Предком отображаемых объектов является объект tView. Несмотря на

то, что этот объект абстрактный, т. е. нельзя создать конкретный обра-

зец этого типа, он имеет важное значение, т. к. задает общие свойства

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

затем переопределяются для конкретных отображаемых объектов.

У объекта tView задаются следующие параметры :

Расположение и размеры объекта. Расположение объекта tView задает-

метр Origin, а размеры - параметром Size, задающим его ширину и высо-

ту. Непосредственно изменять эти параметры в программе не следует. Для

их задания нужно использовать методы Locate (одновременное задание

всех координат объекта) :

procedure tView. Locate(var Bounds: tRect);

где Bounds - область, выделяемая под объект в координатах его владель-

ца;

MoveTo (перемещение объекта в поле его владельца без изменения разме-

ров):

procedure tView. MoveTo(X, Y: Integer);

где X, Y - координаты левого верхнего угла объекта в поле его владель-

ца,

и GrowTo (изменение размеров объекта):

procedure tView. GrowTo(X, Y: Integer);

где X, Y - горизонтальный и вертикальный размеры объекта.

При изменении размеров объекта с помощью метода GrowTo остается

на месте левый верхний угол объекта.

сор. Координаты этого курсора задаются параметром Cursor. Для объектов,

не имеющих видимого курсора, значение этого параметра безразлично. За-

где X, Y - координаты курсора в поле объекта.

Курсор отображаемого элемента можно сделать видимым и невидимым

(параметр sfCursorIns).

Флаги свойств. Параметр Options размером в одно 16-разрядное слово

задает ряд свойств отображаемого объекта. Назначение битов этого слова

следующее (в круглых скобках приведены константы, соответствующие еди-

нице в указанном бите) :

объекта в его владельце либо с помощью мыши,

либо с помощью клавиши табуляции. Это свойство

используется у любого объекта, и обычно флаг

задается равным единице.

1-ый бит (ofTopSelect) - возможность размещения объекта при его акти-

визации (выделении) сверху всех остальных

объектов конкретной группы. Это свойство ис-

пользуется у окон (тип tWindow) и их потомков

- диалоговых окон, стандартных диалоговых

окон и т. д.

2-ой бит (ofFirstClick) - возможность использования первого нажатия

клавиши не только для выделения объекта (бит

объектов.

3-ий бит (ofFramed) - наличие рамки вокруг отображаемого объекта. Это

свойство используется для подэлементов окон. Не

(tWindow) и его потомков.

приводит к изменению стандартной последова-

тельности реакции отображаемых элементов

группы на событие. Свойство может использо-

ти.

предыдущему флагу, но с другими последстви-

ями его использования.

когда образ отображаемого объекта не создается

каждый раз заново при его прорисовке на экране,

а хранится в специальном КЭШ-буфере. Флаг важен

потомков.

7-ой бит (ofTileable) - расположение отображаемых объектов встык или

каскадно (с наложением). Этот флаг использу-

8-ой бит (ofCenterX) - центрирование объекта по горизонтали. При зада-

нии этого флага объект при его первоначальной

прорисовке центрируется относительно верти-

кальной оси его владельца. Флаг может использо-

ваться у элементов, входящих в группу элемен-

тов.

9-ый бит (ofCenterY) - центрирование объекта по вертикали. Аналогично

предыдущему флагу, но только объект центриру-

ется относительно горизонтальной оси его вла-

дельца.

10-ый бит (ofValidate) - задается проверка правильности введенной в

объект информации при выходе из этого объек-

пользуется только со строками ввода.

11-ый бит (ofVersion20) - используется Turbo Vision 2. 0. Ряд объектов

пиальные отличия в зависимости от версии

Turbo Vision. Версия 2. 0 имеет дополнительные

возможности по сравнению с версией 1. 0.

12-ый бит (ofVersion10) - используется Turbo Vision 1. 0.

Остальные биты слова флагов свойств не используются. Для задания

флагов свойств можно использовать константу ofCentred=$0300 (одновре-

менное центрирование по горизонтали и вертикали), с помощью которой

можно одновременно установить 8 и 9 биты параметра Options. Имеется

константа ofVersion=$3000, позволяющая выделить биты, связанные с вер-

Флаги перемещения. Параметр DragMode размером в один байт задает

0-й бит (dmDragMove) - разрешение перемещения объекта либо с помощью

мыши, либо с помощью клавиш направления. Используется у тех

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

в поле своего владельца, например у окон и их потомков.

1-й бит (dmDragGrow) - разрешение изменения размеров объекта либо с

помощью мыши, либо с помощью клавиш направления. Используется

у окон и их потомков.

4-й бит (dmLimitLoX) - запрещение левой стороне отображаемого объекта

выходить за заданные границы. В качестве таких границ часто

выступают размеры владельца данного объекта (например, разме-

5-й бит (dmLimitLoY) - аналогично 4 биту, но запрещение верхней сторо-

не отображаемого объекта выходить за заданные границы.

6-й бит (dmLimitHiX) - аналогично 4 биту, но запрещение правой стороне

отображаемого объекта выходить за заданные границы.

7-й бит (dmLimitHiY) - аналогично 4 биту, но запрещение нижней стороне

отображаемого объекта выходить за заданные границы.

Остальные биты параметра DragMode не используются. Для одновремен-

ного задания ограничений на перемещение во всех направлениях можно ис-

пользовать константу dmLimitAll=$FO, устанавливающую в единицу биты с

Флаги изменения размеров. Параметр GrowMode размером в один байт

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

его владельца с помощью мыши или клавиш направления.

0-й бит (gfGrowLoX) - левая сторона отображаемого объекта остается на

одном и том же расстоянии от правой стороны его владельца при

изменении размеров владельца.

1-й бит (gfGrowLoY) - верхняя сторона отображаемого объекта остается

при изменении размеров владельца.

2-й бит (gfGrowHiX) - правая сторона отображаемого объекта остается на

одном и том же расстоянии от правой стороны его владельца при

изменении размеров владельца.

изменении размеров владельца.

4-й бит (gfGrowRel) - отображаемый объект изменяет свои размеры про-

порционально размерам владельца. Такой режим может потребовать-

ся при отображении окна в случае изменения режима адаптера с

25 строк на 43/50 строк и наоборот.

Остальные биты параметра GrowMode не используются Для одновремен-

ной фиксации сторон отображаемого объекта относительно размеров его

владельца можно использовать константу gfGrowAll=$OF, устанавливающую

в единицу биты с 0 по 3.

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

ект.

Флаги состояния. Параметр State размером в одно слово определяет

текущее состояние данного отображаемого объекта. Как правило, изменение

этого параметра происходит автоматически в процессе выполнения прог-

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

бых причин менять его в программе. Если же все-таки потребуется произ-

вести те или иные изменения, их необходимо производить с помощью соот-

ветствующих методов, специально для этого предназначенных.

Отдельные биты параметра имеют следующее значение :

0-й бит (sfVisibl) - объект может быть видим в поле своего владель-

ца. Если этот флаг установлен (такое состояние задается авто-

матически при создании объекта), объект будет видим полностью

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

procedure tView. Show;

Для сброса - метод Hide :

Чтобы определить, виден ли на самом деле объект, можно вос-

пользоваться методом Exposed :

function tView. Exposed: Boolean;

где результат - True, если какая-либо часть объекта видна на

экране.

1-й бит (sfCursorVis) - курсор объекта видим в поле объекта. У некото-

рых отображаемых объектов курсор задается видимым (например, у

строки ввода), у других - невидимым (например, у статическо-

го текста). Чтобы изменить заданное состояние и сделать курсор

procedure tView. ShowCursor;

чтобы сделать его невидимым, используется метод HideCursor :

procedure tView. HideCursor;

2-й бит (sfCursorIns) - увеличенный размер курсора. Для задания курсора

увеличенного размера воспользуемся методом BlockCursor :

procedure tView. BlockCursor;

для задания нормального размера курсора (такой размер задается

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

NormalCursor :

procedure tView. NormalCursor;

3-й бит (sfShadow) - объект имеет тень. При создании одних объектов

(например, окон) задается тень, у других объектов (например,

списков) тень не задается. Если требуется изменить заданное

состояние этого флага, следует воспользоваться универсальным

методом SetState :

procedure tView. SetState(AState: Word; Enable: Boolean);virtual;

Enable=True, если флаг следует установить, и False, если

сбросить.

С помощью этого метода можно изменить любые флаги состояния,

но при каждом обращении к нему можно изменить только один

флаг.

4-й бит (sfActiv) - объект является либо активным окном ( окном, с ко-

торым происходит в настоящее время работа в программе), или

подэлементом активного окна. Как правило, этот флаг автомати-

чески меняет свое значение в процессе работы программы и изме-

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

щий флаг, состояние этого флага изменяется автоматически в

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

принудительного изменения его состояния (изменить его также

можно с помощью метода SetState).

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

с которым в настоящее время происходит работа (например,

конкретный редактор текста, если на экране открыто несколько

редакторов).

7-й бит (sfDragging) - объект находится в режиме перемещения или изме-

помощью мыши. Обычно этот флаг используется у окон и устанавли-

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

при выходе из этого режима. Принудительное изменение флага воз-

8-й бит (sfDisabled) - объект является "запрещенным", т. е. не реагиру-

ющим ни на какие воздействия. Задать этот флаг можно также с

окон и устанавливается, если окно находится в модальном режиме

(использование метода ExecView или ExecuteDialog). Принудительно

изменять этот флаг не следует.

10-й бит (sfExposed) - объект имеет в качестве окончательного владель-

ца объект tApplication, т. е. имеет возможность отражаться

Остальные биты параметра State не используются.

Контекстная помощь. Этот параметр (HelpCtx) представляет собой

число типа Word, который задает значение параметра контекстной помощи

в случае, если отображаемый объект является сфокусированным. Этот пара-

метр используется в справочной системе и в системе строк состояния. Ес-

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

создании объекта.

затель на следующий объект в группе, в которую входит данный объ-

ект. Параметр устанавливается автоматически при включении объекта в

группу. Принудительно менять значение этого параметра не следует.

Владелец объекта. Параметр (Owner) представляет собой указатель на

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

обычно с помощью метода Insert объекта tGroup или другого метода,

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

дует.

Объект tView обладает 67 методами плюс 1 метод, унаследованный от

ределяются для потомков. Все методы можно условно разбить на несколько

К первой группе можно отнести методы, с помощью которых создается

или уничтожается объект. Здесь следует отметить два конструктора-Init,

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

которого объект загружается из потока, а также деструктор Done, выпол-

няющий действия, обратные действиям конструктора Init.

Ко второй, самой многочисленной группе, можно отнести методы, с

помощью которых либо задаются, либо определяются текущие параметры

объекта (задание и получение указанных выше параметров).

К третьей группе можно отнести методы, позволяющие поместить объ-

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

экрана.

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

часто используемым из которых является метод HandlEvent, обрабатываю-

щий текущее событие.

Наконец, к пятой группе отнесем все остальные методы, выполняющие

цветов для объекта, разрешение и запрещение выполнения команд и т. д.)

Группа (tGroup). Z-порядок

В общем случае отображаемый объект может иметь достаточно сложную

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

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

другие подэлементы и т. д.

бой группу (тип tGroup) и может рассматриваться как нечто единое,

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

ряда реальных объектов (в первую очередь различных окон) и определяет

раметры и методы.

Любой объект типа tGroup представляет собой основной элемент

группы (например, диалоговое окно), называемый владельцем элементов

мер, различные элементы управления диалогового окна). Параметры, насле-

дуемые группой от объекта tView, относятся к основному объекту группы

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

объекта tView, обладают своими характеристиками, часто не совпадающими

с характеристиками их владельца.

В дополнение к параметрам tView объект tGroup имеет ряд собствен-

ляются два. Первый параметр Last, указывающий на последний подэлемент

группы (фактически он является первым включенным в группу подэлемен-

тов). Вторым является параметр Current, указывающий на текущий выделен-

ный подэлемент. Если группа не имеет ни одного подэлемента, эти два па-

раметра равны nil.

Основной элемент группы инициализируется конструктором Init :

constructor tGroup. Init(var Bounds: tRect);

Если после инициализации группа помещается в другую группу, уста-

навливаются соответствующие значения параметров Next и Owner.

Любой подэлемент группы должен быть включен в эту группу с по-

procedure tGroup. Insert(P: pView);

где P - размещаемый объект, или другого метода, включающего в себя ме-

procedure tGroup. Delete(P: pView);

где P - исключаемый объект, или какого-либо другого метода, включающе-

Последовательность включения подэлементов в группу очень важна,

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

расположение подэлементов с левой верхней части основного элемента и

далее идти вправо и вниз.

Включенные в группу подэлементы образуют так называемый Z-поря-

док, и среди них можно выделить первый, последний и промежуточные эле-

менты.

┌───────────────────────────────────┐

│ Основной элемент (владелец) │

└────────────────┬──────────────────┘

┌────────────────┴──────────────────┐

│ Последний элемент (Last) │───────────────┐

└────────────────┬──────────────────┘ │

│ <───── Insert │

┌────────────────┴──────────────────┐ │

│ Предпоследний элемент │ │

└────────────────┬──────────────────┘ │

│ │

... │

│ │

┌────────────────┴──────────────────┐ │

│ Второй элемент │ │

└────────────────┬──────────────────┘ │

│ <───── InsertBefore │

┌────────────────┴──────────────────┐ │

│ Первый элемент │ │

└────────────────┬──────────────────┘ │

│ │

│ │

└──────────────────────────────────┘

Рис. 1. Структура группы

У каждого отображаемого объекта есть поле Next, указывающее на

на его предыдущий подэлемент и т. д. У первого подэлемента это поле ука-

зывает на последний подэлемент группы. Таким образом, все подэлементы

ле Owner (владелец) указывает на основной элемент группы.

Поля, указывающего на предыдущий подэлемент в группе у отображае-

мого объекта нет, однако у него есть метод Prev, который формирует

указатель на такой предыдущий подэлемент. Этот метод даст указатель на

первый подэлемент, если определяется предыдущий подэлемент последнего

подэлемента.

Объекты tProgram И tApplication

В Turbo Vision имеются два объекта - tProgram и tApplication, на

основе которых можно создать интерактивную программу.

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

программе. В первую очередь это обработка поступающих событий. tProgram

представляет собой отображаемый объект, занимающий все поле экрана. Он

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

свойства. В частности, это позволяет в поле экрана разместить любые

отображаемые объекты. В свою очередь, этот объект имеет свои характер-

ные свойства, которые позволяют создать программу как нечто целое.

constructor tProgram. Init;

После инициализации устанавливаются значения парамет-

ров. ScreenWidth и ScreenHeight - параметры модуля Drivers, содержащие

размеры экрана в текстовом режиме. Параметр DeskTop (модуль App) - ука-

tProgram помещается в переменную Application (модуль App).

Важным методом объекта tProgram является метод Run :

procedure tProgram. Run; virtual;

представляющий собой цикл обработки событий и выполняющий, таким обра-

зом, основные действия, связанные с работой программы.

Объект tProgram позволяет разместить в поле экрана любые отобра-

жаемые объекты. Их можно помещать в поле экрана произвольным образом,

однако принята следующая система их расположения : в верхней строке

экрана размещается строка меню (тип tMenuBar или его потомок), в ниж-

ней части экрана размещается строка состояния (тип tStatusLine или его

потомок), остальная часть экрана отдается под рабочую область (тип

DeskTop или его потомок). Эти три объекта (tMenuBar, tStatusLine и

tDeskTop) также являются отображаемыми объектами, причем объект

tDeskTop является к тому же потомком объекта tGoup.

Объекты этих типов размещаются на экране автоматически при иници-

ализации программы методом Init. Для размещения меню, строки состояния

и рабочей области вызываются методы InitMenuBar, InitDeskTop и

InitStatusLine. Методы InitMenuBar и InitStatusLine переопределяются,

метод же InitDeskTop обычно не меняется (его следует переопределить,

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

твующим образом изменить его размеры).

Рабочая область инициализируется конструктором Init :

где Bounds - размеры рабочей области.

Объект tApplication является непосредственным потомком объекта

tProgram и наследует все его свойства. Кроме этого, он предназначен для

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

инициализированы с помощью конструктора Init этого объекта :

constructor tApplication. Init;

а ликвидированы с помощью деструктора Done :

destructor tApplication. Done; virtual;

При инициализации этого объекта его параметры принимают те же

значения, что и у его предка tProgram.

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

работку событий и завершение работы программы.

Инициализация программы, если не требуется каких-либо специальных

дополнительных действий, представляет собой простое обращение к конс-

труктору Init объекта tApplication (или его потомка), который инициа-

екта tProgram, который, в свою очередь, выполняет действия, связанные

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

ее параметров и размещая на экране меню, строку состояния и рабочую

область.

Обработка событий осуществляется методом Run объекта tProgram

(этот метод доступен и объекту tApplication или его потомку).

Завершение работы программы выполняет деструктор Done.

Обычно тело любой программы и состоит из обращения к этим трем

методам.

Все отображаемые объекты образуют древовидную структуру, корнем

которой является сама программа - потомок объекта tApplication (напри-

мер, рис. 2).

┌──────────────────────┐

│──────────────────────│

│ Программа │

└───────────┬──────────┘

┌────────────────────────┴───────────────────────┐

│ │ │

┌─────────────────┐ ┌───────────┴──────────┐ ┌─────────────────┐

│ Меню │ │──────────────────────│ │Строка состояния │

└─────────────────┘ │ Рабочая область │ └─────────────────┘

└───────────┬──────────┘

┌────────────└────────────┐

│ │

┌────────┴────────┐ ┌───────────┴─────────┐

│ Окно │ │─────────────────────│

└────────┬────────┘ │ Диалоговое окно │

│ └─────────┬───────────┘

┌───────────┘───┐ │

│ │ ┌─────┴─────────┐

│ │ │ │ │

┌─────┴────┐ ┌───────┴──┐ ┌─────┴────┐│┌────────┴──────────┐

│ Рамка │ │ Кнопка │ │ Рамка │││───────────────────│

└──────────┘ └──────────┘ └──────────┘││ Строка ввода │

│└───────────────────┘

┌─────└───────┐

│ │

┌─────┴────┐ ┌─────┴──────┐

│ Кнопка │ │Строка ввода│

└──────────┘ └────────────┘

Рис. 2 Пример структуры отображаемых объектов программы

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

tApplication. Он является группой, в которую входят меню (потомок

tMenuBar), рабочая область (тип tDeskTop) и строка состояния (потомок

торую входят окно и диалоговое окно. Окно и диалоговое окно также явля-

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

Каждый отображаемый объект может быть в одном из двух состояний -

пассивном и выделенном. На рис. выделенные объекты обозначены двойной

верхней чертой. В каждой группе может быть только один выделенный объ-

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

том). Указатель на выделенный элемент находится в переменной Current

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

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

Сделать выделенным предыдущий или последующий объект группы можно

с помощью метода SelectNext :

procedure tGroup. SelectNext(Forwards: Boolean);

где Forwards - параметр, определяющий, какой объект следует выделить :

если Forwards = True, выделяется следующий в Z-порядке объект группы.

Этот метод не проверяет правильность введенных данных в текущем

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

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

function tGroup. FocusNext(Forwards: Boolean): Boolean;

где Forwards - тот же параметр; результат - True, если произошло пе-

реключение на другой объект, и False - в противном случае.

Выделенный объект - это тот объект, с которым в настоящее время

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

взаимодействовать. Меню и строка состояния в этом случае являются пас-

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

том.

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

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

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

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

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

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

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

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

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

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

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

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

type

tEvent = record

What: Word;

EvMouse: (

Buttons: Byte;

Double: Boolean;

Where: tPoint);

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);

5: (InfoChar: Char);

end;

end;

end;

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

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

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

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

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

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

тии клавиши.

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

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

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

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

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

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

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

тия :

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

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

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

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

бытием.

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

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

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

Параметр 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-порядке и т. д., пока этот поиск не оста-

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

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

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

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

"не знает", как обработать соответствующее

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

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

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

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

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

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

procedure tView. ClearEvent(var Event: tEvent);

"очищаемое" событие. Если событие не "очистить", то

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

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

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

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

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

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

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

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

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

225;

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

999;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

титься к этим методам.

Деструктор выполняет действия, обратные действиям конструктора, и

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

методы. Сам деструктор также является виртуальным.

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

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

тельные свойства, специфические для данного объекта. Переопределенный

метод должен быть виртуальным.

Специфический для данного объекта метод - это метод, который не

имеет аналогов у предка данного объекта.

Создание отображаемого объекта

Если отображаемый объект не размещен постоянно в сегменте данных

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

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

чаще все-таки также не размещаются постоянно в сегменте данных. Созда-

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

труктор Init.

Помещение отображаемого объекта в группу

ответствующую группу : если он является элементом окна, то в соответс-

твующее окно, если же он сам является окном, то в рабочую область

DeskTop.

У каждого объекта-группы имеются методы Insert и InsertBefore, с

помощью которых можно поместить немодальный отображаемый объект в

группу.

Для размещения немодального окна в рабочей области вместо метода

Insert лучше воспользоваться методом InsertWindow :

function tProgram. InsertWindow(P: pWindow): pWindow;

где P - указатель на размещаемое окно; результат - указатель на разме-

правильно ли сконструированы окно и его компоненты).

В Turbo Vision принят следующий стандартный способ передачи пара-

метров. Для объекта-группы или его потомка формируется переменная ти-

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

кой подэлементы включались в группу. Для каждого подэлемента параметры

создаются по-своему. Для стандартных элементов параметры должны быть

следующими :

- строка ввода - строка того же размера;

- триггерный список - число типа Word, в котором каждый бит опре-

деляет состояние соответствующего элемента списка;

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

- триггерный список с несколькими состояниями - информация разме-

ром в 4 байта, определяющая состояние каждого элемента списка

(под каждый элемент может отводиться 1,2,4 и 8 бит информации;

- список коллекции строк - запись размером в 6 байт, первое поле

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

рое - число типа Word, определяющее порядковый номер выделен-

ного элемента списка;

- параметрический текст - по 4 байта на каждый параметр.

Для нестандартных элементов пользователь сам определяет вид и

размер параметра.

Задать параметры немодальному отображаемому объекту лучше всего с

procedure <отображаемый объект>. SetData (var Rec); virtual;

где Rec - передаваемая запись с данными.

Работа с модальными объектами

Для работы с модальными отображаемыми объектами используются ме-

Универсальным является метод ExecView объекта tGroup :

function tGroup&ExecView(P: pView): Word;

где P - объект, с которым происходит работа; результат - код команды,

вызвавшей прекращение работы с объектом P.

Этот метод помещает воображаемый объект в группу, делает его мо-

событие является командой или сообщением, означающими конец работы с

отображаемым модальным объектом, удаляет отображаемый объект из груп-

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

ность, что осуществляется с помощью процедуры EndModal объекта tView :

procedure tGruop. EndModal(Command: Word); virtual;

где Command - код команды, при которой снимается модальность.

В качестве результата функция ExecView возвращает код команды,

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

удаляется.

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

его следует поместить в рабочую область, вместо метода ExecView целе-

сообразно использовать метод ExecuteDialog :

function tProgram. ExecuteDialog(P: pDialog;Data: Pointer): Word;

где P - диалоговое окно, с которым происходит работа;

Data - указатель на запись с передаваемыми данными;

результат - код команды, вызвавшей прекращение работы и диалоговым ок-

СОЗДАНИЕ МЕНЮ

выбора дальнейшего пути решения задачи.

После написания объекта-приложения - основного объекта программы,

целесообразно продолжить создание программы именно с описания меню,

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

структуру программы. В Turbo Vision можно использовать либо обычное

разворачивающееся меню, либо так называемое локальное меню.

Создание разворачивающегося меню

Разворачивающееся меню (в дальнейшем - просто меню) может иметь

твенно элемент меню (фактически определяет команду, которую следует

выполнить при выборе этого элемента), подменю, при выборе которого на

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

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

Элемент меню имеет структуру типа-запись (стандартный тип

tMenuItem) :

tMenuItem = record

Next: pMenuItem;

Name: pString;

Command: Word;

Disabled: Boolean;

KeyCode: Word;

HelpCtx: Word;

case Integer of

end;

end;

где Next - указатель на следующий элемент этого же уровня вложенности,

Name - указатель на строку, содержащую выводимый на экран текст;

этот параметр равен nil, если элемент представляет собой разделитель-

ную линию;

Commаnd - код команды, которую следует выполнить при выборе данно-

го элемента меню; эта величина равна нулю, если данный элемент - под-

меню;

меню;

KeyCode - код клавиши или их совокупности быстрого управления, с

помощью которых можно выполнить команду данного элемента меню, не вы-

зывая это элемент, или 0, если для данного элемента такой клавиши не

HelpCtx - параметр контекстной помощи, аналогичный параметру объ-

екта tView, но справочная система выдает информацию об элементе меню;

Param - указатель на строку с дополнительной информацией, которая

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

менту (обычно это название клавиши быстрого управления);

ный элемент представляет собой подменю.

ню.

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

мента меню ограничены 31 символом. В связи с этим в Turbo Vision имеет-

ся стандартный тип строк tMenuStr :

который и используется для задания символьной информации элементам ме-

ню.

Для каждого элемента меню можно в его названии выделить одну ла-

тинскую букву или цифру для быстрого выбора элемента путем нажатия

этой клавиши на клавиатуре (для основного меню - в сочетании с клави-

шей Alt). Такая буква выделяется в тексте символами ~~,например, ~N~ew.

В данном примере соответствующий элемент можно активизировать на-

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

используется подпрограмма NewItem :

function NewItem(Name, Param: tMenuStr; KeyCode: Word; Command:

где Name - текстовая информация для данного элемента, она не должна

быть пустой строкой;

Param - дополнительная текстовая информация для элемента;

KeyCode - код клавиши быстрого управления;

Command - код выполняемой команды, не должен равняться 0;

Next - указатель на следующий элемент меню данного уровня;

результат - указатель на созданный элемент меню.

пользуется подпрограмма NewSubMenu :

function NewSubMenu(Name: tMenuStr; AHelpCtx: Word; SubMenu:

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

пустой строкой;

AHelpCtx - параметр контекстной помощи;

Next - указатель на следующий элемент подменю данного уровня;

ся подпрограмма NewLine :

function NewLine(Next: pMenuItem): pMenuItem;

где Next - указатель на следующий элемент меню данного уровня;

результат - указатель на созданный элемент меню.

Функционально разворачивающееся меню состоит из нескольких частей

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

собой объект типа tMenuBar. Создается оно обычно с помощью стандартной

подпрограммы New, а инициализируется конструктором Init :

сonstructor tMenuBar. Init(var Bounds: tRect; AMenu: pMenu);

где Bounds - область на экране для главного меню;

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

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

тельно, и объект tApplication) имеет метод InitMenuBar :

с помощью которого можно создать меню и который следует переопределить

для конкретной программы. Этот метод помещает указатель на созданное ме-

ню в стандартную типизированную константу MenuBar пакета Turbo Vision.

Создание локального меню

При работе с программой часто приходится многократно повторять

одни и те же действия, которые разнесены по различным частям меню (а

некоторых в меню вообще не может быть). Количество их обычно небольшое,

иному событию, например, команде, нажатию клавиши клавиатуры или мыши.

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

пакета Turbo Vision - tMenuPopup. Для этого в метод HandleEvent основ-

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

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

ню. Так как локальное меню должно быть довольно простым, оператор его

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

тем не менее состоять из обращений к тем же методам.

Создавать локальное меню целесообразно на завершающих этапах соз-

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

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

Несмотря на свою сложность, меню в силу своей специфики группой

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

тупила команда завершения работы с объектом без фиксации результата. В

случае же модального объекта группы (например, диалогового окна) такое

событие игнорируется.

тупить к формированию отдельных частей программы, обрабатывающих соот-

ветствующие команды меню и строки состояния. Часто эти команды требуют

использования различных окон для передачи информации. Окна могут потре-

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

ды.

Основным средством взаимодействия пользователя с программой в

tDialog). У окон и диалоговых окон много общего, т. к. диалоговое окно

является непосредственным потомком окна, однако есть и принципиальные

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

окон - просмотр той или иной информации, а диалоговых окон - ввод в

ностей и более логически завершены, поэтому они чаще используются в

Окна (tWindow) в Turbo Vision

щий специальную рамку и который может иметь средства прокрутки (скро-

ллинга) не умещающейся в окне информации. В него можно поместить инфор-

мацию. Как правило, в программе используется не окно типа tWindow, а

его потомок с переопределенными методами.

В дополнение к параметрам объекта tGroup окно обладает рядом до-

полнительных параметров, отметим два : флаги окна Flags и используемая

палитра Pallete. Назначение флагов параметра Flags, и константы, соот-

ветствующие единице в соответствующем разряде параметра Flags следую-

щие :

0-й бит (wfMove) - возможность перемещения окна по полю его вла-

дельца

2-й бит (wfClose) - наличие пиктограммы закрытия окна.

Параметр Pallete определяет тип используемой палитры окна и может

принимать одно из трех следующих значений :

wpBlueWindow = 0 - синяя палитра окна;

wpCyanWindow = 1 - голубая палитра окна;

wpGrayWindow = 2 - серая палитра окна.

Как правило, синяя палитра - для окон, серая - для диалоговых

constructor tWindow. Init(var Bounds: tRect;

ATitle: tTitleStr; ANumber: Integer);

где Bounds - размеры окна;

ATitle - имя окна размером до 80 символов;

Характерной особенностью окна и его потомков является наличие

рамки - специального отображаемого объекта, помещаемого в окно. Таким

декоративного значения несет на себе еще дополнительную информацию о

окне.

Вид рамки окна меняется в зависимости от его состояния. Активное

окно обрамлено двойной рамкой.

В левой части верхней линии рамки располагается пиктограмма зак-

рытия окна. При подведении курсора мыши к этой пиктограмме и нажатии

В средней части верхней линии рамки располагается имя окна, зада-

ваемое при его инициализации.

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

"стрелка вверх" до полного размера группы, в которую вклю-

чено окно,Распахивание также осуществляется с помощью мыши. После рас-

пахивания окна пиктограмма изменит свой вид - "двустороняя стрел-

ка". Чтобы восстановить исходные размеры окна, следует повторно подвес-

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

следует поместить курсор мыши на верхнюю линию рамки окна и дважды на-

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

может быть изображен одинарной линией даже в случае активного окна. В

этом случае с помощью мыши можно изменять размеры окна. Для этого кур-

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

мых размеров, отпустить. Минимальные размеры окна - 16 позиций по гори-

зонтали и 6 строк по вертикали. Эти ограничения можно изменить с по-

мощью метода SizeLimits :

procedure'tView. SizeLimits(var Min, Max: tPoint); virtual;

Верхняя линия позволяет в ряде случаев с помощью мыши перемещать

Наличие или отсутствие у окна этих возможностей зависит от уста-

новленных флагов параметра Flags.

При работе с окном его следует сначала создать и инициализиро-

вать. При этом создать необходимые компоненты (кроме рамки, которая

создается автоматически) и поместить их в окно.

да InsertWindow, а если окно модальное - при помощи метода ExecView.

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

ных для окна событий.

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

мощью метода EndModal.

Если окно содержит выделенный элемент, а нужно сделать выделенным

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

элементу и нажав клавишу, либо с помощью клавиши клавиатуры Tab

(или Shift+Tab), при этом нажатие Tab выделит следующий в Z-порядке

элемент, а Shift+Tab - предыдущий.

Элементы окон в Turbo Vision

В качестве стандартных элементов окон Turbo Vision можно исполь-

зовать поля скроллинга (тип Scroller), предназначенные для отображения

не умещающейся на экране информации и ее просмотра, текстовые элементы

буферированной информации (тип tTewtDevice), текстовые элементы для

пассивных терминалов (тип tTerminal) наподобие текстовых файлов и ли-

нейки скроллинга. В окне можно помещать также потомки перечисленных вы-

Поле скроллинга предназначено для размещения в нем текстовой ин-

формации, которую необходимо вывести в окно, и которая возможно не

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

нейки горизонтального и вертикального скроллинга :

constructor tScroller. Init(var Bounds: tRect;

AHScrollBar, AVScrollBar: pScrollBar);

где Bounds - размеры поля;

После инициализации устанавливаются значения параметров. Кроме

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

ный размер текстовой информации (размер строк и число строк), размеща-

Следует также переопределить метод Draw объекта tScroller для

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

этого необходимо в начале определить, какая часть информации должна

быть отображена (исходя из текущего состояния линеек), затем сформиро-

сформированные строки в поле скроллинга, с атрибутами цвета.

Текстовый элемент буферированной информации

Текстовый элемент буферированной информации (тип tTextDevice) яв-

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

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

фера и записывают в текстовый буфер отображаемую информацию.

Текстовый элемент для пассивного терминала

Текстовый элемент для пассивного терминала (тип tTerminal)

ния в поле скроллинга информации от пассивного терминала, чаще всего

из текстового файла этого терминала. Под пассивным терминалом здесь по-

Инициализируется текстовый элемент для пассивного терминала конс-

constructor tTerminal. Init(var Bounds: tRect;

AHScrollBar, AVScrollBar: pScrollBar; ABufSize: Word);

где Bounds - размеры поля;

тальную линейку скроллинга;

ABufSize - размер буфера терминала в байтах.

Во время инициализации создается элемент с указанными параметра-

ми, а также буфер для передачи информации размером ABufSize.

Линейка скроллинга (tScrollBar)

Линейка скроллинга предназначена для фиксации места нахождения

отображаемой на экране в данный момент порции информации во всем объ-

еме отображаемой информации. Линейка представляет собой либо горизон-

тальную полосу, либо вертикальную. Полоса оканчивается двумя стрелками,

а в средней части расположен ползунок, указывающий относительное рас-

Используя этот ползунок, можно быстро переместиться в любое место

отображаемой информации. Для этого необходимо подвести к нему курсор

мыши, нажать клавишу мыши и, не отпуская ее, отбуксировать ползунок в

нужное место линейки скроллинга. Если курсор мыши поместить не на пол-

зунок, а в другое место линейки и нажать клавишу мыши, будет отображе-

равлении. Если курсор мыши поместить на завершающую стрелку и нажать

клавишу мыши, будет осуществлено перемещение на один шаг в соответс-

твующую сторону.

5 параметров объекта tScrollBar :

Min, Max - определяют миним. и максим. значение номера текущего

элемента информации.

ArStep - величина шага перемещения по информации в случае нажатия

клавиш Left, Right, Up, Down или при нажатии клавиши мыши, если ее

PgStep - размер страницы, на которую происходит перемещение.

Value - текущий элемент информации. Инициализация линейки скрол-

constructor tScrollBar. Init(var Bounds: tRect;

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

Линейка скроллинга не может активизироваться, так как у нее не

установлен флаг ofSelectable параметра Options. Поэтому она не может

обычным образом реагировать на нажатие клавиш клавиатуры. Чтобы этого

не происходило, следует нарушить стандартный порядок обработки собы-

тий, установив флаг ofPostProcess параметра Options.

Диалоговое окно

(является потомком tWindow) и предназначено в первую очередь для ввода

значений параметров в программу.

Так же как и обычное окно, диалоговое окно может использовать

один из трех видов палитры :

dpBlueDialog = 0 - синяя палитра диал. окна;

dpCyanDialog = 1 - голубая палитра диал. окна;

В отличие от обычного окна диалоговое окно обычно

труктором Init :

ATitle: tTitleStr);

где Bounds - размеры диалогового окна;

ATitle - имя диалогового окна размером до 80 символов.

В отличие от обычного окна у диалогового окна стандартно нет воз-

можности изменять размеры, оно использует серую палитру и не имеет но-

мера.

К другим особенностям диалогового окна можно отнести обработку им

клавиш Esc и Enter. Если диалоговое окно находится в модальном режиме,

нажатие Esc закрывает окно без сохранения введенной информации. Нажатие

клавиши Enter эквивалентно нажатию кнопки, выбираемой по умолчанию

(закрывает окно с сохранением внесенных изменений).

Для удобной работы с диалоговым окном в Turbo Vision имеется

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

качестве элементов этого окна.

Работу с диалоговым окном в модальном режиме можно организовать

при этом поместив в него все его элементы. Затем подготовить исходные

данные для передачи диалоговому окну.

Далее диалоговое окно размещается в рабочей области с помощью ме-

тода ExecuteDialog и осуществляется работа с ним. При завершении работы

изменений или без. Изменения, которые требуется сохранить, возвращаются

в том же параметре, в котором передавались исходные данные.

Если окно используется в немодальном режиме, последовательность

Элементы диалоговых окон

Возможно использование стандартных элементов или их потомков :

- метки;

- протоколы;

- селективные списки;

- триггерные списки;

- кнопки;

- статические и параметрические тексты;

- списки строк;

- линейки скроллинга.

Строка ввода

Строка ввода (тип tInputLine) предназначена для ввода в программу

символьной информации. Фактически строка ввода представляет собой прос-

тей. Основным элементом строки является буфер (строка, в которую поме-

щаются все вводимые символы). Инициализируется строка ввода методом

Init :

constructor tInputLine. Init(var Bounds: tRect;

AMaxLen: Integer);

где Bounds - размер поля строки ввода;

AMaxLen - размер буфера.

Высота поля строки ввода должна равняться единице. Ширина поля мо-

до 255. После создания строки ввода непосредственно изменять размеры

буфера нельзя.

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

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

преобразовано в двоичную.

Метка (tLabel)

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

метки можно довольно просто активизировать связанный с ней элемент. При

ней элемент.

Конструктор метки имеет вид :

constructor tLabel. Init(var Bounds: tRect;

const AText: string; ALink: pView);

где Bounds - размер поля метки;

AText - текст метки;

ALink - указатель на объект, с которым связана метка.

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

поля метки равна единице. Если текст метки состоит из цифр и латинских

букв, то можно выделить одну букву и поместить ее между символами

~~. Такая буква на экране будет выделена особым цветом, а нажав клавишу

с этим символом, можно активизировать данный элемент.

Протокол

Протокол (тип tHistory) всегда связан со строкой ввода и предназ-

начен для сохранения в своем буфере вводимой в строку ввода информа-

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

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

вишу мыши, либо нажать клавишу Down. В результате откроется окно прото-

выбрать интересующую строку (клавиша мыши или клавиши Up и Down). Далее

дважды нажать клавишу мыши или нажать Enter.

Протокол инициализируется при помощи метода Init :

constructor tHistory. Init(var Bounds: tRect;

ALink: pInputLine; AHistoryID: Word);

ALink - указатель на строку ввода, с которым связан протокол;

AHistoryID - номер протокола - число, определяющее данный тип

протокола.

сится. Ширина поля должна равняться двум, высота - единице.

Селективный (тип tRadioButtons) и триггерный ( тип tCheckBoxes)

списки

Селективный и триггерный списки очень похожи, так как у них есть

общий предок (tCluster), заключающий в себе общие свойства.

Триггерный список позволяет выбрать из списка любое число элемен-

тов (или ни одного), однако при стандартном использовании число эле-

ментов этого списка ограничено 16-ю.

Оба списка инициализируются одним методом Init объекта tCluster :

constructor tСluster. Init(var Bounds: tRect;

AStrings: pSItem);

где Bounds - поле, выделяемое под образ списка;

AStrings - указатель на список информационных строк.

Чтобы выбрать элемент списка, можно воспользоваться мышью, подве-

используя клавиши направления. В триггерном списке при использовании

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

пробела.

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

кую букву или цифру, поместив ее между ~~. Она будет выделена на экране

особым цветом, и можно выбрать соответствующий элемент списка нажатием

клавиши клавиатуры с этим символом.

Кнопка (тип tButton)

Кнопка позволяет выбрать команду, которая с ней связана. При выбо-

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

Кнопка может иметь флаги, находящиеся в параметре Flags при ини-

циализации :

0-й бит (bfDefault) - кнопка, выбираемая по умолчанию.

1-й бит (bfLeftJust) - текст кнопки выравнивается по ее левому

2-й бит (bfBroadcast) - кнопка формирует сообщение вместо команды.

3-й бит (bfGrabFocus) - фокусирование кнопки при ее активизации

мышью.

Инициализируется кнопка конструктором Init :

ATitle: tTitleStr; ACommand:Word;AFlags:Byte);

ATitle - текст, размещаемый на кнопке;

ACommand - код команды, связанной с кнопкой;

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

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

текста.

Статический (tStaticText) и параметрический (tParamText) тексты

Статический текст предназначен для размещения в диалоговом окне

различной поясняющей информации.

Инициализация осуществляется при помощи метода Init :

constructor tStaticText. Init(var Bounds: tRect;

где Bounds - поле, выделяемое под статический текст;

AText - размещаемый текст.

Поле, выделяемое под статический текст, должно быть достаточных

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

внутри слов.

текст, позволяющий модифицировать выводимый текст в зависимости от за-

даваемых параметров. Для того, чтобы указать, в каком месте текста сле-

ся спецификации там, где должны быть размещены параметры.

Инициализируется параметрический текст методом Init:

const AText: string; AParamCount: Integer);

где Bounds - поле, выделенное под параметрический текст;

AText - исходный текст со спецификациями параметров;

AParamCount - число параметров текста.

Списки строк

Списки строк в диалоговом окне напоминают поле скроллинга и его

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

списков.

него можно получить реальный объект, который будет работать с конк-

строк (типа ListBox), предназначенный в первую очередь для просмотра

Инициализируется список коллекции строк с помощью конструктора

Init :

constructor tListBox. Init(var Bounds: tRect;

ANumCols: Word; AScrollBar: pScrollBar);

где Bounds - поле, выделенное под список;

AScrollBar - указатель на линейку вертикального скроллинга.

Стандартные окна

В Turbo Vision имеется большое количество стандартных окон, имею-

щих специальное назначение. Рассмотрим стандартные информационные ок-

на. Заголовок функции MessageBox имеет вид :

function MessageBox(const Msg: string; Params:

Pointer; AOptions: Word): Word;

где Msg - размещаемое в окне сообщение;

Params - указатель на параметры сообщения;

AOptions - флаги;

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

окна.

Функция формирует окно размером 40*60, в котором помещается сооб-

щение Msg, скорректированное параметрами, находящимися по адресу, оп-

ределяемому значением Params и набор кнопок, определяемый параметром

AOptions, который определяет также тип окна (его название).

СОЗДАНИЕ СТРОК СОСТОЯНИЯ

Строка состояния не является необходимым атрибутом. Однако ее ис-

пользование помогает пользователю проще работать с программой, так как

он может получить информацию о текущем состоянии программы и клавишах

мые меню и строкой состояния.

Каждый элемент строки состояния , содержащий информацию о конк-

ретной клавише (их совокупности) быстрого управления, имеет стандарт-

ный тип-запись tStatusItem :

tStatusItem = record

Next: pStatusItem;

Text: pString;

Command: Word

end;

Text - указатель на строку, содержащую выводимый на экран текст

для данной клавиши быстрого управления;

выбрать данный элемент строки состояния;

Command - код команды, которую следует выполнить при выборе данно-

Создать элемент строки состояния можно с помощью стандартной

функции NewStatusKey :

AKeyCode: Word; ACommand: Word; ANext:

pStatusItem); pStatusItem;

AKeyCode - код клавиши быстрого управления;

ACommand - код команды, которую следует выполнить при выборе дан-

ного элемента;

результат - указатель на созданный элемент строки состояния.

Next: pStatusDef;

Min, Max: Word;

Items: pStatusItem;

end;

где Next - указатель на следующую строку состояния;

Min, Max - миним. и максим. границы диапазона параметра контекс-

тной помощи, для которого отображается именно эта строка состояния;

Items - указатель на первый элемент списка элементов.

Элементы строки состояния также как и строки состояния представ-

ляют собой линейный список.

Для создания строки состояния можно воспользоваться стандартной

function NewStatusDef(AMin, AMax: Word;

AItems: pStatusItem; ANext: pStatusDef): pStatusDef;

где ANext - указатель на следующую строку состояния;

AMin, AMax - миним. и максим. границы диапазона параметра контекс-

тной помощи, для которого отображается именно эта строка состояния;

В строке состояния также можно отразить информацию о состоянии

программы в конкретный момент времени (процесс, протекающий в програм-

ме и т. д.)Информация такого вида зависит от значения параметра кон-

текстной помощи активизированного в настоящий момент элемента програм-

мы. Вывести такую информацию можно с помощью метода Hint объекта

tStatusLine :

function tStatusLine(AHelpCtx : Word): string; virtual;

Turbo Vision позволяет манипулировать цветом изображения объектов

на экране. При этом можно использовать стандартный набор цветов, задан-

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

мы, или создавать свою палитру.

Стандартная палитра

- набор цветов для отдельных элементов этого объекта, а окна и диало-

говые окна - по три палитры. Учитывая структуру отображаемых объектов

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

основного объекта tApplication, являются подэлементами какой - либо

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

компонентами которой являются не атрибуты цветов, а номера элементов

палитры данной группы.

Если в программе достаточно использовать цвета основной палитры

по их прямому назначению, то никаких действий по раскрашиванию предп-

ринимать не надо, так как цвета выбираются при отображении на экране

соответствующего объекта с помощью метода Draw :

procedure <отображаемый объект>. Draw; virtual;

который, в свою очередь, использует методы GetPallete :

<отображаемый объект>. GetPallete:

pPallete; virtual;

определяющий указатель на конкретную палитру объекта, и GetColor :

function tView. GetColor(Color: Word): Word;

где Color - номер входа в палитру;

результат - атрибуты соответствующего цвета.

Изменение стандартной палитры

Если требуется изменить уже существующий цвет у всех использующих

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

ру. Для этого нужно либо внести изменения в исходный текст модуля App

в метод GetPallete объекта tProgram.

константу, определяющую палитру у метода GetPallete.

Если необходимо изменить цвета конкретного объекта, а требуемого

сочетания цветов у его владельца нет, то следует дополнить основную

там. Так как основная палитра исходно имеет 127 элементов, то примерно

столько же можно к ней добавить в случае необходимости. После этого

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

В тех случаях, когда следует предусмотреть частое изменение цве-

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

зоваться средствами модуля ColorSel.

НЕОТОБРАЖАЕМЫЕ ОБЪЕКТЫ TURBO VISION

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

редственно с представлением информации на экране, в частности проверки

вводимой информации или размещения в них той или иной информации.

информации, коллекции, потоки и ресурсы. Все эти объекты - потомки объ-

екта tObject.

Анализаторы вводимой информации

В Turbo Vision 2. 0 имеется возможность контроля размещаемой в

строке ввода информации. Для этого служит серия объектов, называемых

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

проверяет, входят ли вводимые символы в множество допустимых, и если

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

волы игнорируются. Инициализация такого анализатора осуществляется

конструктором Init :

constructor tFilterValidator. Init(AValidChars: tCharSet);

где AValidChars - множество допустимых символов типа tCharSet.

Анализатор границ вводимого числа (тип tRangeValidator) предназ-

начен для контроля вводимых в символьной форме целых чисел (в общем

tFilterValidator, помимо проверки допустимых символов (только цифр и

знаков "+" и "-" в первой позиции вводимой информации) проверяет также

значение введенного числа и его нахождение в заданном диапазоне.

Анализатор инициализируется конструктором Init :

constructor tRangeValidator. Init(AMin, AMax: Longint);

где AMin, AMax - миним. и максим. допустимые границы вводимого числа.

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

ет строку введенных символов со списком допустимых строк, находящимся

в коллекции строк. Реакция при неправильно введенной строке аналогичная.

constructor tStringLookupValidator. Init(

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

мация.

Анализатор по шаблону (тип tPXPictureValidator) позволяет создать

количество вводимых символов, их вид и т. д.

Анализатор инициализируется конструктором Init :

constructor tPXPictureValidator. Init(

AutoFill - если равен True, вводимая информация автоматически до-

полняется символами шаблона, не являющимися служебными символами.

Анализатор должен быть подключен к соответствующей строке ввода с

помощью метода SetValidator строки ввода :

procedure tInputLine. SetValidator(AValid: pValidator);

Объект-коллекция

Объект-коллекция (тип Collection) предназначен в первую очередь

для размещения в нем объектов (точнее, указателей на объекты). Основным

димости могут изменяться. Кроме этого, коллекция может содержать объек-

ты разных типов и элементы, не являющиеся объектами.

Создается коллекция с помощью конструктора Init :

constructor tCollection. Init(ALimit, ADelta: Integer);

где ALimit - первоначальный размер коллекции;

ADelta - величина, на которую изменяется размер в случае необхо-

димости.

Работа с коллекцией осуществляется следующим образом. Вначале соз-

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

нее можно помещать компоненты. При этом в коллекции помещается указа-

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

коллекции нет достаточного места, она автоматически увеличивается на

величину ADelta.

после компоненты с указанным значением индекса. В первом случае исполь-

procedure tCollection. Insert(Item: Pointer); virtual;

где Item - указатель на размещаемый в коллекции объект,

во втором случае используется метод AtInsert :

где Index - номер компоненты, который получает размещаемый объект;

Эти методы копии размещаемого в коллекции объекта не создают.

Метод FirstThat :

function tCollection. FirstThat(Test: Pointer): Pointer;

где Test - указатель на функцию, проверяющую некоторое условие;

верно условие, проверяемое функцией, указатель на которую равен Test.

function <имя функции>(Item: Pointer): Boolean; far;

В этом заголовке Item - указатель на компоненту коллекции; ре-

зультат функции равен True, если проверяемое функцией условие выполня-

ется, и False - в противном случае.

Второй метод - LastThat :

function tCollection. LastThat(Test: Pointer): Pointer;

где Test - указатель на функцию, проверяющую условие; результат - ука-

затель на последнюю компоненту коллекции, для которой верно условие,

проверяемое функцией, указатель на которую равен Test, либо nil, если

ни для одной компоненты коллекции условие не выполняется. Функция с

указателем Test аналогична такой же функции метода FirstThat.

Третий метод - ForEach :

procedure tCollection. ForEach(Action: Pointer);

твия с каждой компонентой. Процедура с указателем Action не должна быть

procedure <имя процедуры>(Item: Pointer); far;

где Item - указатель на компоненту коллекции.

Коллекция может содержать не только объекты, но и элементы других

типов. В частности, имеется стандартная коллекция строк (тип

tStringCollection). В ней переопределен метод FreeItem, который удаляет

Потоки Turbo Vision

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

ществовать не только на внешних устройствах, но и в оперативной памя-

пов. Возможны запись и чтение.

При создании потока в нем не находится никакой информации. Записы-

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

так что условный указатель на текущий элемент файла в этом случае ука-

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

тель автоматически настраивается на начало следующей.

Поток типа tStream является абстрактным потоком, потому что он не

привязан к конкретному носителю информации. На практике используются

потоки ДОС (тип tDosStream) и буферированный поток (тип

у буферированного потока информация передается через промежуточный бу-

фер, что повышает быстродействие работы.

Поток ДОС инициализируется конструктором Init :

constructor tDosStream. Init( FileName: FNameStr; Mode: Word);

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

MS-DOS - до 79 символов);

Mode - категория файла.

Буферированный поток инициализируется конструктором Init :

constructor tBufStream. Init( FileName: FNameStr;

Mode, Size: Word);

MS-DOS - до 79 символов);

Mode - категория файла;

Size - размер буфера (обычно от 512 до 2048 байт).

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

Следует создать методы записи информации в поток и чтения из не-

имеются. Первый метод - Store :

procedure <отображаемый объект>. Store (var S: tStream);

потоке.

Второй - конструктор Load :

<отображаемый объект>. Load(var S: tStream);

где S - поток, из которого берется объект. Конструктор загружает объект

из потока в память.

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

методом Write :

procedure <тип потока>. Wriye (var Buf; Count: Word); virtual;

Buf - буфер с переписываемой информацией;

Count - размер переписываемой информации в байтах.

Для всех методов имеются аналоги, осуществляющие чтение информа-

<тип объекта>. Read (var Buf; Count: Word); virtual;

Buf - буфер, в который помещается информация;

Count - размер переписываемой информации в байтах.

Вторая операция, связанная с подготовкой объекта к записи в по-

ток, - его регистрация. В потоке могут быть объекты разных типов, поэ-

тому возникает проблема в определении типов этих объектов при необхо-

димости работы с ними. Для решения этой проблемы используется система

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

рационный номер. По этому номеру будут определяться размер записанной

или записываемой информации, соответствующая таблица виртуальных мето-

ется в поток и читается из него.

Для регистрации объекта следует создать регистрационную запись

(типа tStreamRec) :

type

tStreamRec = record

VmtLink: Word;

Load: Pointer;

Store: Pointer;

Next: Word;

end;

Load - адрес конструктора Load объекта;

Store - адрес метода Store объекта;

Next - смещение адреса следующей регистрационной записи.

В качестве регистрационной записи, как правило, типизированная

константа, у которой заполнены первые 4 поля. Имя регистрационной запи-

дартных элементов уже есть регистрационные записи. За стандартными объ-

ектами зарезервированы индивидуальные регистрационные номера с 1 до

999, так что программист может назначать своим объектам номера от 1000

до 65535. Это число записывается в первое поле регистрационной запи-

дов объекта, в третье поле - адрес конструктора Load, а в четвертое -

адрес метода Store. Пятое поле заполняется автоматически при регистра-

ции объекта.

Запись объекта в поток осуществляется с помощью метода Put

объекта tStream :

procedure tStream. Put(P: pObject);

где P - указатель на размещаемый в потоке объект.

Чтение объекта из потока осуществляет метод Get объекта tStream :

function tStream. Get; pObject;

где результат - указатель на созданный объект.

После работы с потоком его следует закрыть процедурой Dispose :

Dispose(MyStream, Done);

где MyStream - поток, с которым завершается работа;

Done - деструктор потока.

Ресурсы

У рассмотренных потоков есть недостаток - непросто осуществить

произвольный доступ к отдельным компонентам потока. Поэтому имеется

специальный объект - файл ресурсов (tResourceFile), связанный с пото-

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

имени (идентификатору). Этот поток дополнен потомком коллекции строк,

содержащим адреса компонент (ресурсов) в потоке, размеры компонент и

их имена.

Инициализируется файл ресурсов конструктором Init ;

constructor tResourceFile. Init(AStream: pStream);

где AStream - поток, который связывается с файлом ресурсов.

Прежде чем инициализировать файл ресурсов, следует создать соот-

ветствующий поток.

тода Put :

procedure tResourceFile. Put(Item: pObject; Key: String);

где Item - указатель на размещаемый в файле ресурсов объект;

Key - имя, присвоенное размещаемому объекту.

Извлечение объекта из файла ресурсов осуществляется с помощью ме-

тода Get :

Key - имя, присвоенное размещаемому объекту;

результат - указатель на найденный объект или nil, если нет объ-

екта с таким именем.

В файле ресурсов можно хранить библиотеку интерфейсных элемен-

тов. Использование таких файлов является хорошим средством повышения

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

Списки строк

tStringList), предназначенный для хранения в потоке последовательности

строк, которые можно вызвать по номеру.

ектом типа tStrListMaker, позволяющим создать список строк и наполнить

его соответствующим содержанием. Инициализируется он конструктором Init

constructor tStrListMaker. Init(AStrSize,AIndexSize: Word);

где AStrSize - размер буфера для размещения строк;

AIndexSize - максимальный индекс размещаемой строки.

Размещаются строки в список с помощью метода Put :

procedure tStrListMaker. Put(Key: Word; S: string);

где Key - индекс размещаемой строки;

S - размещаемая строка.

Сам список tStrList конструктора не имеет, получить из него стро-

ку можно с помощью метода Get :

где Key - индекс строки;

результат - найденная строка.

НЕКОТОРЫЕ ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ TURBO VISION

Текстовый редактор

В настоящее время создано большое количество текстовых редакто-

должен входить составной частью какого-либо пакета. Пакет Turbo Vision

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

товые редакторы. Исходным является объект tEditor. Его потомок - объект

файлами. Без особых изменений можно создавать редакторы, работающие од-

новременно с любым количеством файлов, содержащих тексты до 64 К,

обеспечивающие работу с клавиатурой и мышью, поиск в тексте и замену,

Отображение древовидных структур

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

ду отдельными элементами. К таким структурам относятся меню и строки

состояния. Для отображения подобных структур в Turbo Vision имеются два

специальных объекта : абстрактный объект tOutlineViewer, осуществляю-

с конкретной древовидной структурой. Последний объект позволяет скры-

вать или показывать на экране те или иные ветви структуры с помощью

мыши или клавиатуры.

Диалоговое окно задания цветной палитры

Существует стандартное диалоговое окно задания цветов

tColorDialog. С помощью этого окна можно изменять лишь имеющиеся цвета

и, кроме того, изменение цветов произойдет одновременно у всех отобра-

жаемых объектов программы соответствующего типа.

ЗАКЛЮЧЕНИЕ

ся удобство работы пользователя.

Поэтому в настоящее время ни один программный продукт, лишенный

удобного интерфейса взаимодействия пользователя с компьютером и

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

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

ским интерфейсом.

Представленный в данной работе разработанный фирмой Borland

рощения работы по организации ввода/вывода, его унификации с учетом

современных требований к интерфейсу программ. Этот пакет представляет

собой объектно-ориентированную библиотеку средств формирования пользо-

вательского интерфейса.

ции и именно для организации диалога предназначен в первую очередь па-

кет Turbo Vision. Использование этого пакета освобождает программиста

от занимающей много времени работы, связанной с организацией вво-

полнения однотипных операций, отвлекает внимание программиста от реше-

ния основной задачи.

В современных программах, работающих в текстовом режиме, диалог

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

строк состояния. Turbo Vision позволяет реализовать все эти средства

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

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

мендации по их использованию.

Turbo Vision представляет собой библиотеку объектов, позволяющих

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

ются потомками общего абстрактного объекта tObject. В работе рассмотре-

на их классификацию, исходя из задач, возникающих при создании интер-

фейса.

В работе подробно рассмотрен порядок работы с отображаемыми

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

с модальными объектами, а также виды неотображаемых объектов Turbo

Пакет Turbo Vision позволяет использовать стандартную па-

литру или создавать свою. Пакет имеет дополнительные возможности, что

видную структуру, использовать диалоговое окно задания цветовой палит-

ры.

Turbo Vision фирмы Borland International является одним из самых удоб-

ных современных средств создания пользовательского интерфейса.