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 является одним из самых удоб-
ных современных средств создания пользовательского интерфейса.
|