ВВЕДЕНИЕ ................................................
ОТОБРАЖАЕМЫЕ ОБЪЕКТЫ ....................................
Объект tView ........................................
Группа (tGroup).Z - порядок .........................
Оформление программы, использующей средства Turbo
Vision.Объекты tProgram и tApplication ..............
Обработка событий ...................................
Команды .............................................
ПОРЯДОК РАБОТЫ С ОТОБРАЖАЕМЫМИ ОБЪЕКТАМИ ................
Описание отображаемого объекта ......................
Создание отображаемого объекта ......................
Помещение отображаемого объекта в группу ............
Задание параметров отображаемому объекту ............
Работа с модальными объектами .......................
СОЗДАНИЕ МЕНЮ ...........................................
Создание разворачивающегося меню ....................
Создание локального меню ............................
СОЗДАНИЕ ОКОН И ДИАЛОГОВЫХ ОКОН .........................
Окна в Turbo Vision .................................
Элементы окон в Turbo Vision ........................
Поле скроллинга .....................................
Текстовый элемент буферированной информации .........
Текстовый элемент для пассивного терминала ..........
Линейка скроллинга ..................................
Диалоговое окно .....................................
Элементы диалоговых окон ............................
Строка ввода ........................................
Метка ...............................................
Протокол ............................................
Селективный и триггерный списки .....................
Кнопка ..............................................
Статический и параметрический тексты ................
Списки строк ........................................
Стандартные окна ....................................
СОЗДАНИЕ СТРОК СОСТОЯНИЯ ................................
Строка состояния, отображающая клавиши быстрого
управления ..........................................
ЦВЕТОВАЯ ПАЛИТРА TURBO VISION ...........................
Стандартная палитра .................................
Изменение стандартной палитры .......................
НЕОТОБРАЖАЕМЫЕ ОБЪЕКТЫ TURBO VISION .....................
Анализаторы вводимой информации .....................
Объект - коллекция ..................................
Потоки Turbo Vision .................................
Ресурсы .............................................
Списки строк ........................................
НЕКОТОРЫЕ ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ TURBO VISION .......
Текстовый редактор ..................................
Отображение древовидных структур ....................
Диалоговое окно задания цветной палитры .............
ЗАКЛЮЧЕНИЕ ..............................................
ВВЕДЕНИЕ
Для эффективной работы системы и ее большего покупательского
спроса недостаточно только того, чтобы аппаратура и программы обеспе-
чивали правильные результаты и быструю работу.Не менее важным фактором
является удобство работы пользователя.
Поэтому в настоящее время ни один программный продукт, лишенный
более или менее удобного интерфейса взаимодействия пользователя с
компьютером и программ между собой, не может рассчитывать на успех.
В мире разработано огромное количество различных систем поддержки
создания пользовательского интерфейса.Наиболее прогрессивными, по на-
шему мнению, являются объектноориентированная система Turbo Vision
фирмы Borland International и операционная система Windows фирмы
Microsoft.Рассмотрением возможностей ОС Windows занимался А.А.Галаш-
кин, а в представленной работе производится обзор и изучение особен-
ностей, возможностей, элементов, организации пакета Turbo Vision.
При создании прикладной программы программист большие усилия зат-
рачивает на организацию ввода/вывода информации, т.е. на формирование
интерфейса.Они соизмеримы с усилиями, затрачиваемыми на программирова-
ние основного алгоритма программы, по которому решается конкретная за-
дача.Работа, связанная с организацией ввода/вывода, повторяется от
программы к программе, требует выполнения однотипных операций, отвле-
кает внимание программиста от решения основной задачи.
Хорошим средством упрощения работы по организации ввода/вывода,
его унификации с учетом современных требований к интерфейсу программ
является разработанный фирмой Borland International пакет Turbo
Vision 2.0, представляющий объектно-ориентированную библиотеку средств
формирования пользовательского интерфейса.
Программу можно представить как совокуп-
ность двух частей : часть программы, обеспечивающая решение основной
задачи, и часть, обеспечивающая организацию ввода/вывода информации с
внешних устройств (на внешние устройства), - так называемый интерфейс
программы.В основную часть (из основной части) программы информация
может передаваться двумя способами - непосредственная передача инфор-
мации (например, программа формирует какие-то данные и размещает их в
конкретном файле на магнитном диске) и передача информации с помощью
организации диалога (например, после формирования тех же данных проис-
ходит уточнение, в какой конкретно файл следует поместить сформирован-
ную информацию).Способ, основанный на организации диалога, является
более универсальным и именно для организации диалога предназначен в
первую очередь пакет Turbo Vision.
В современных программах, работающих в текстовом режиме, диалог
обычно организуется с помощью трех средств : меню, диалоговых окон и
строк состояния.Turbo Vision позволяет реализовать все эти средства
диалога.
Turbo Vision представляет собой библиотеку объектов, позволяющих
создать пользовательский интерфейс и широко использующих свойства ин-
капсуляции, наследования и полиформизма.Почти все объекты библиотеки
являются потомками общего абстрактного объекта tObject.Мы рассмотрим
их классификацию, исходя из задач, возникающих при создании интерфейса.
Объект tObject достаточно прост.Он не имеет параметров и обладает
тремя методами, два из которых - конструктор Init :
constructor tObject.Init;
заполняющий выделенную под объект область нулями, и деструктор Done :
destructor tObject.Done;
не выполняющий никаких действий, - должны быть переопределены в его
потомках, а третий метод Free :
procedure tObject.Free;
удаляющий объект из динамической памяти, никогда не переопределяется,
т.к. может удалить любой потомок объекта tObject.
При организации интерфейса приходиться решать две задачи : созда-
ние соответствующего образа на экране и возможность посредством того
образа передачи информации как от пользователя к вычислительной маши-
не, так и от машины к пользователю.Помимо этих двух задач при организа-
ции интерфейса приходиться выполнять различные вспомогательные опера-
ции (вычисления, контроль и преобразование данных, хранение информации
и т.д.).В связи с этим все объекты Turbo Vision можно разбить на две
группы : отображаемые и неотображаемые объекты.
ОТОБРАЖАЕМЫЕ ОБЪЕКТЫ
Отображаемыми объектами являются такие объекты, которые могут
быть изображены на экране.Эти объекты позволяют наглядно представить
пользователю информацию, дать ему средства ввода информации в програм-
му наиболее естественным образом.К таким объектам относятся,в частнос-
ти, меню, строки состояния, диалоговые окна с их компонентами.
Любой отображаемый объект является потомком общего абстрактного
объекта tView, который является непосредственным потомком общего предка
tObject.
Неотображаемыми объектами являются объекты, которые не могут быть
изображены на экране.К этой категории, в частности, относятся объекты,
предназначенные для контроля и хранения данных.Наиболее часто исполь-
зуемыми объектами такого класса являются анализаторы вводимой информа-
ции, коллекции, потоки и ресурсы.
Любой объект Turbo Vision имеет большое количество параметров,
определяющих его свойства и методов (подпрограмм), задающих его пове-
дение.Согласно принципам объектного программирования, желательно пара-
метры объектов не изменять непосредственно, а с помощью соответствую-
щих методов, предназначенных для этой цели.Это связано с тем, что в
ряде случаев только изменение того или иного параметра недостаточно -
следует выполнить дополнительно определенные действия (например, пере-
рисовать объект на экране).В ряде случаев непосредственное изменение
параметров просто недопустимо.Практически для всех параметров объектов
в Turbo Vision указано, допустимо ли его непосредственно изменять (за-
писывать).К сожалению, принцип объектного программирования, требующий
изменения параметров только с помощью того или иного метода, в полной
мере в Turbo Vision не реализован, и приходится в простейших случаях
параметры изменять непосредственно либо писать свои дополнительные ме-
тоды.
Любой отображаемый объект может быть размещен на кране в прямоу-
гольной области, которая задается координатами левого верхнего и пра-
вого нижнего углов.В Turbo Vision координаты задают линии раздела меж-
ду знакоместами, и при этом нумерация по горизонтали и вертикали начи-
нается с нуля (координаты 0,0 - левый верхний угол экрана).Координаты
могут быть абсолютными, отсчитываемыми относительно левого верхнего
угла крана, и относительными, отсчитываемыми от левого верхнего угла
соответствующего окна (так называемого владельца данного отображаемого
объекта).
Для задания координат точки на кране и координат прямоугольной
области используются два объекта - tPoint, содержащий две координаты
точки - X и Y :
type tPoint = object
X, Y : Integer;
end;
и tRect, определяющий левый верхний и правый нижний углы прямоугольной
области.Объект 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.Для объектов,
не имеющих видимого курсора, значение этого параметра безразлично.За-
дать координаты курсора можно с помощью метода SetCursor :
procedure tView.SetCursor(X, Y: Integer);
где X, Y - координаты курсора в поле объекта.
Курсор отображаемого элемента можно сделать видимым и невидимым
(параметр sfCursorVis флагов состояния), а также изменять его размеры
(параметр sfCursorIns).
Флаги свойств.Параметр Options размером в одно 16-разрядное слово
задает ряд свойств отображаемого объекта.Назначение битов этого слова
следующее (в круглых скобках приведены константы, соответствующие еди-
нице в указанном бите) :
0-й бит (ofSelectable) - возможность активизации (выделения) данного
объекта в его владельце либо с помощью мыши,
либо с помощью клавиши табуляции.Это свойство
используется у любого объекта, и обычно флаг
задается равным единице.
1-ый бит (ofTopSelect) - возможность размещения объекта при его акти-
визации (выделении) сверху всех остальных
объектов конкретной группы.Это свойство ис-
пользуется у окон (тип tWindow) и их потомков
- диалоговых окон, стандартных диалоговых
окон и т.д.
2-ой бит (ofFirstClick) - возможность использования первого нажатия
клавиши не только для выделения объекта (бит
0), но и для выполнения действий, которые
активизируются данным объектом.Свойство ис-
пользуется практически у всех отображаемых
объектов.
3-ий бит (ofFramed) - наличие рамки вокруг отображаемого объекта.Это
свойство используется для подэлементов окон.Не
следует этот флаг путать с наличием рамки окна
(tWindow) и его потомков.
4-ый бит (ofPreProcess) - опережающая реакция на событие.Задание флага
приводит к изменению стандартной последова-
тельности реакции отображаемых элементов
группы на событие.Свойство может использо-
ваться у любого элемента по мере необходимос-
ти.
5-ый бит (ofPostProcess) - запаздывающая реакция на событие.Аналогично
предыдущему флагу, но с другими последстви-
ями его использования.
6-ой бит (ofBuffered) - наличие КЭШ-буфера у отображаемого объекта,
когда образ отображаемого объекта не создается
каждый раз заново при его прорисовке на экране,
а хранится в специальном КЭШ-буфере.Флаг важен
для сложных составных объектов типа окна и его
потомков.
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, позволяющая выделить биты, связанные с вер-
сией Turbo Vision.
Флаги перемещения.Параметр DragMode размером в один байт задает
характеристики отображаемого объекта при его перемещении :
0-й бит (dmDragMove) - разрешение перемещения объекта либо с помощью
мыши, либо с помощью клавиш направления. Используется у тех
объектов, которые по тем или иным причинам могут перемещаться
в поле своего владельца, например у окон и их потомков.
1-й бит (dmDragGrow) - разрешение изменения размеров объекта либо с
помощью мыши, либо с помощью клавиш направления.Используется
у окон и их потомков.
4-й бит (dmLimitLoX) - запрещение левой стороне отображаемого объекта
выходить за заданные границы.В качестве таких границ часто
выступают размеры владельца данного объекта (например, разме-
ры рабочего поля, в котором размещены окна).
5-й бит (dmLimitLoY) - аналогично 4 биту, но запрещение верхней сторо-
не отображаемого объекта выходить за заданные границы.
6-й бит (dmLimitHiX) - аналогично 4 биту, но запрещение правой стороне
отображаемого объекта выходить за заданные границы.
7-й бит (dmLimitHiY) - аналогично 4 биту, но запрещение нижней стороне
отображаемого объекта выходить за заданные границы.
Остальные биты параметра DragMode не используются.Для одновремен-
ного задания ограничений на перемещение во всех направлениях можно ис-
пользовать константу dmLimitAll=$FO, устанавливающую в единицу биты с
4 по 7.
Флаги изменения размеров.Параметр GrowMode размером в один байт
задает свойства отображаемого объекта при попытке изменения размеров
его владельца с помощью мыши или клавиш направления.
0-й бит (gfGrowLoX) - левая сторона отображаемого объекта остается на
одном и том же расстоянии от правой стороны его владельца при
изменении размеров владельца.
1-й бит (gfGrowLoY) - верхняя сторона отображаемого объекта остается
на одном и том же расстоянии от правой стороны его владельца
при изменении размеров владельца.
2-й бит (gfGrowHiX) - правая сторона отображаемого объекта остается на
одном и том же расстоянии от правой стороны его владельца при
изменении размеров владельца.
3-й бит (gfGrowHiY) - нижняя сторона отображаемого объекта остается на
одном и том же расстоянии от нижней стороны его владельца при
изменении размеров владельца.
4-й бит (gfGrowRel) - отображаемый объект изменяет свои размеры про-
порционально размерам владельца.Такой режим может потребовать-
ся при отображении окна в случае изменения режима адаптера с
25 строк на 43/50 строк и наоборот.
Остальные биты параметра GrowMode не используются Для одновремен-
ной фиксации сторон отображаемого объекта относительно размеров его
владельца можно использовать константу gfGrowAll=$OF, устанавливающую
в единицу биты с 0 по 3.
Флаги обработки событий.Параметр EventMask размером в одно слово
определяет, какие события может обрабатывать данный отображаемый объ-
ект.
Флаги состояния.Параметр State размером в одно слово определяет
текущее состояние данного отображаемого объекта.Как правило, изменение
этого параметра происходит автоматически в процессе выполнения прог-
раммы (например, выделенное состояние объекта), и не следует без осо-
бых причин менять его в программе.Если же все-таки потребуется произ-
вести те или иные изменения, их необходимо производить с помощью соот-
ветствующих методов, специально для этого предназначенных.
Отдельные биты параметра имеют следующее значение :
0-й бит (sfVisibl) - объект может быть видим в поле своего владель-
ца.Если этот флаг установлен (такое состояние задается авто-
матически при создании объекта), объект будет видим полностью
или частично, если только он не закрывается другими отобража-
емыми объектами, а его владелец сам виден на кране.Для зада-
ния этого флага используется метод Show :
procedure tView.Show;
Для сброса - метод Hide :
procedure tView.Hide;
Чтобы определить, виден ли на самом деле объект, можно вос-
пользоваться методом Exposed :
function tView.Exposed: Boolean;
где результат - True, если какая-либо часть объекта видна на
экране.
1-й бит (sfCursorVis) - курсор объекта видим в поле объекта.У некото-
рых отображаемых объектов курсор задается видимым (например, у
строки ввода), у других - невидимым (например, у статическо-
го текста).Чтобы изменить заданное состояние и сделать курсор
видимым, следует воспользоваться методом ShowCursor :
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;
где AState - флаг, который следует изменитьЖ
Enable=True, если флаг следует установить, и False, если
сбросить.
С помощью этого метода можно изменить любые флаги состояния,
но при каждом обращении к нему можно изменить только один
флаг.
4-й бит (sfActiv) - объект является либо активным окном ( окном, с ко-
торым происходит в настоящее время работа в программе), или
подэлементом активного окна.Как правило, этот флаг автомати-
чески меняет свое значение в процессе работы программы и изме-
нять его в программе практически не требуется.
5-й бит (sfSelected) - объект является выделенным в группе.В каждой
группе может быть только один выделенный объект.Как и предыду-
щий флаг, состояние этого флага изменяется автоматически в
процессе работы программы, и обычно не возникает необходимости
принудительного изменения его состояния (изменить его также
можно с помощью метода SetState).
6-й бит (sfFocused) - объект является сфокусированным, т.е.является
выделенным в группе, и все его владельцы также являются выде-
ленными.Сфокусированный объект - то тот отображаемый объект,
с которым в настоящее время происходит работа (например,
конкретный редактор текста, если на экране открыто несколько
редакторов).
7-й бит (sfDragging) - объект находится в режиме перемещения или изме-
нения своих размеров либо с помощью клавиш направления, либо с
помощью мыши.Обычно этот флаг используется у окон и устанавли-
вается у окна при переходе его в такой режим, а сбрасывается
при выходе из этого режима.Принудительное изменение флага воз-
можно с помощью метода SetState.
8-й бит (sfDisabled) - объект является "запрещенным", т.е. не реагиру-
ющим ни на какие воздействия.Задать этот флаг можно также с
помощью метода SetState.
9-й бит (sfModal) - объект является модальным.Этот флаг характерен для
окон и устанавливается, если окно находится в модальном режиме
(использование метода ExecView или ExecuteDialog).Принудительно
изменять этот флаг не следует.
10-й бит (sfExposed) - объект имеет в качестве окончательного владель-
ца объект tApplication, т.е. имеет возможность отражаться
на экране (не путать с флагом ofVisible).Принудительно изме-
нять флаг не следует.
Остальные биты параметра State не используются.
Контекстная помощь.Этот параметр (HelpCtx) представляет собой
число типа Word, который задает значение параметра контекстной помощи
в случае, если отображаемый объект является сфокусированным.Этот пара-
метр используется в справочной системе и в системе строк состояния.Ес-
ли контекстная помощь не нужна, этот параметр следует задать равным
нулю (константа hcNoContex).Это же значение принимает параметр и при
создании объекта.
Следующий отображаемый элемент.Этот параметр (Next) содержит ука-
затель на следующий объект в группе, в которую входит данный объ-
ект.Параметр устанавливается автоматически при включении объекта в
группу.Принудительно менять значение этого параметра не следует.
Владелец объекта.Параметр (Owner) представляет собой указатель на
владельца объекта - группу, в которой расположен данный объект.Пара-
метр устанавливается автоматически при размещении объекта в группе -
обычно с помощью метода Insert объекта tGroup или другого метода,
включающего в себя метод Insert, и изменять его принудительно не сле-
дует.
Объект tView обладает 67 методами плюс 1 метод, унаследованный от
объекта tObject.Многие из этих методов являются виртуальными и переоп-
ределяются для потомков.Все методы можно условно разбить на несколько
групп.
К первой группе можно отнести методы, с помощью которых создается
или уничтожается объект.Здесь следует отметить два конструктора-Init,
с помощью которого инициализируется новый объект, и Load, с помощью
которого объект загружается из потока, а также деструктор Done, выпол-
няющий действия, обратные действиям конструктора Init.
Ко второй, самой многочисленной группе, можно отнести методы, с
помощью которых либо задаются, либо определяются текущие параметры
объекта (задание и получение указанных выше параметров).
К третьей группе можно отнести методы, позволяющие поместить объ-
ект в группу, отобразить его на экране, удалить из группы, удалить с
экрана.
К четвертой группе относятся методы обработки событий, наиболее
часто используемым из которых является метод HandlEvent, обрабатываю-
щий текущее событие.
Наконец, к пятой группе отнесем все остальные методы, выполняющие
разнообразные дополнительные действия (например, получение палитры
цветов для объекта, разрешение и запрещение выполнения команд и т.д.)
Группа (tGroup).Z-порядок
В общем случае отображаемый объект может иметь достаточно сложную
структуру и включать в себя другие видимые элементы в качестве своих
подэлементов.Эти подэлементы, в свою очередь, могут включать в себя
другие подэлементы и т.д.
Совокупность объединенных отображаемых объектов представляет со-
бой группу (тип tGroup) и может рассматриваться как нечто единое,
предназначенное для использования в программе.Так же как и объект
tView, объект tGroup является абстрактным объектом и не может иметь
конкретные образцы в программе, однако является родоначальником целого
ряда реальных объектов (в первую очередь различных окон) и определяет
основные свойства таких объектов как некоего целого.Сам объект tGroup
является потомком объекта tView и наследует или переопределяет его па-
раметры и методы.
Любой объект типа tGroup представляет собой основной элемент
группы (например, диалоговое окно), называемый владельцем элементов
группы, в который включено то или иное количество подэлементов (напри-
мер, различные элементы управления диалогового окна).Параметры, насле-
дуемые группой от объекта tView, относятся к основному объекту группы
- владельцу группы; отдельные подэлементы, также являющиеся потомками
объекта tView, обладают своими характеристиками, часто не совпадающими
с характеристиками их владельца.
В дополнение к параметрам tView объект tGroup имеет ряд собствен-
ных параметров, наиболее важными и часто используемыми из которых яв-
ляются два.Первый параметр Last, указывающий на последний подэлемент
группы (фактически он является первым включенным в группу подэлемен-
тов).Вторым является параметр Current, указывающий на текущий выделен-
ный подэлемент.Если группа не имеет ни одного подэлемента, эти два па-
раметра равны nil.
Основной элемент группы инициализируется конструктором Init :
constructor tGroup.Init(var Bounds: tRect);
где Bounds - размеры объекта.
Если после инициализации группа помещается в другую группу, уста-
навливаются соответствующие значения параметров Next и Owner.
Любой подэлемент группы должен быть включен в эту группу с по-
мощью метода Insert :
procedure tGroup.Insert(P: pView);
где P - размещаемый объект, или другого метода, включающего в себя ме-
тод Insert и может быть из нее исключен с помощью метода Delete :
procedure tGroup.Delete(P: pView);
где P - исключаемый объект, или какого-либо другого метода, включающе-
го в себя метод Delete.
Последовательность включения подэлементов в группу очень важна,
т.к. от нее зависит порядок работы с подэлементами.Следует начинать
расположение подэлементов с левой верхней части основного элемента и
далее идти вправо и вниз.
Включенные в группу подэлементы образуют так называемый Z-поря-
док, и среди них можно выделить первый, последний и промежуточные эле-
менты.
?????????????????????????????????????
? Основной элемент (владелец) ?
?????????????????????????????????????
?
?????????????????????????????????????
? Последний элемент (Last) ?????????????????
????????????????????????????????????? ?
?
????????????????????????????????????? ?
? Предпоследний элемент ? ?
????????????????????????????????????? ?
? ?
... ?
?
? ?
????????????????????????????????????? ?
? Второй элемент ? ?
????????????????????????????????????? ?
?
????????????????????????????????????? ?
? Первый элемент ? ?
????????????????????????????????????? ?
? ?
? ?
????????????????????????????????????
Рис. 1. Структура группы
У каждого отображаемого объекта есть поле Next, указывающее на
следующий подэлемент группы.Поле Next последнего подэлемента указывает
на предыдущий подэлемент, поле Next предыдущего подэлемента указывает
на его предыдущий подэлемент и т.д.У первого подэлемента это поле ука-
зывает на последний подэлемент группы.Таким образом, все подэлементы
группы образуют циклическую структуру.У каждого подэлемента группы по-
ле Owner (владелец) указывает на основной элемент группы.
Поля, указывающего на предыдущий подэлемент в группе у отображае-
мого объекта нет, однако у него есть метод Prev, который формирует
указатель на такой предыдущий подэлемент.Этот метод даст указатель на
первый подэлемент, если определяется предыдущий подэлемент последнего
подэлемента.
Оформление программы, использующей средства Turbo Vision.
Объекты tProgram И tApplication
В Turbo Vision имеются два объекта - tProgram и tApplication, на
основе которых можно создать интерактивную программу.
Объект tProgram является основой создаваемой программы и включает
общие действия, которые выполняются практически в любой интерактивной
программе.В первую очередь это обработка поступающих событий.tProgram
представляет собой отображаемый объект, занимающий все поле экрана.Он
является непосредственным потомком объекта tGroup и наследует все его
свойства.В частности, это позволяет в поле экрана разместить любые
отображаемые объекты.В свою очередь, этот объект имеет свои характер-
ные свойства, которые позволяют создать программу как нечто целое.
Инициализируется объект tProgram конструктором Init :
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 :
constructor tDeskTop.Init((var Bounds: tRect);
где Bounds - размеры рабочей области.
Объект tApplication является непосредственным потомком объекта
tProgram и наследует все его свойства.Кроме этого, он предназначен для
создания оболочки программы, включающей систему управления памятью,
видеосистему, систему обработки событий и т.д., которые могут быть
инициализированы с помощью конструктора Init этого объекта :
constructor tApplication.Init;
а ликвидированы с помощью деструктора Done :
destructor tApplication.Done; virtual;
При инициализации этого объекта его параметры принимают те же
значения, что и у его предка tProgram.
Сформированная на основе объекта tApplication программа обычно
выполняет последовательно три операции : инициализацию программы, об-
работку событий и завершение работы программы.
Инициализация программы, если не требуется каких-либо специальных
дополнительных действий, представляет собой простое обращение к конс-
труктору Init объекта tApplication (или его потомка), который инициа-
лизирует оболочку программы, после чего обращается к конструктору объ-
екта tProgram, который, в свою очередь, выполняет действия, связанные
с инициализацией программы как таковой, устанавливая исходные значения
ее параметров и размещая на экране меню, строку состояния и рабочую
область.
Обработка событий осуществляется методом Run объекта tProgram
(этот метод доступен и объекту tApplication или его потомку).
Завершение работы программы выполняет деструктор Done.
Обычно тело любой программы и состоит из обращения к этим трем
методам.
СТРУКТУРА ОТОБРАЖАЕМЫХ ОБЪЕКТОВ ПРОГРАММЫ
Все отображаемые объекты образуют древовидную структуру, корнем
которой является сама программа - потомок объекта tApplication (напри-
мер, рис. 2).
????????????????????????
????????????????????????
? Программа ?
????????????????????????
?
??????????????????????????????????????????????????
? ? ?
??????????????????? ???????????????????????? ???????????????????
? Меню ? ???????????????????????? ?Строка состояния ?
??????????????????? ? Рабочая область ? ???????????????????
????????????????????????
?
???????????????????????????
? ?
??????????????????? ???????????????????????
? Окно ? ???????????????????????
??????????????????? ? Диалоговое окно ?
? ???????????????????????
????????????????? ?
? ? ?????????????????
? ? ? ? ?
???????????? ???????????? ??????????????????????????????????
? Рамка ? ? Кнопка ? ? Рамка ???????????????????????
???????????? ???????????? ?????????????? Строка ввода ?
??????????????????????
???????????????
? ?
???????????? ??????????????
? Кнопка ? ?Строка ввода?
???????????? ??????????????
Рис.2 Пример структуры отображаемых объектов программы
Здесь основным отображаемым объектом является программа - потомок
tApplication.Он является группой, в которую входят меню (потомок
tMenuBar), рабочая область (тип tDeskTop) и строка состояния (потомок
tStatusLine).Рабочая область, в свою очередь, является группой, в ко-
торую входят окно и диалоговое окно.Окно и диалоговое окно также явля-
ются группами, включающими различные подэлементы (рамки, строки ввода,
кнопки).
Каждый отображаемый объект может быть в одном из двух состояний -
пассивном и выделенном.На рис. выделенные объекты обозначены двойной
верхней чертой.В каждой группе может быть только один выделенный объ-
ект (или ни одного, если сама группа не является выделенным объек-
том).Указатель на выделенный элемент находится в переменной Current
объекта-группы.Если какой-то объект группы становится выделенным, пре-
дыдущий выделенный объект этой группы становится пассивным.
Сделать выделенным предыдущий или последующий объект группы можно
с помощью метода SelectNext :
procedure tGroup.SelectNext(Forwards: Boolean);
где Forwards - параметр, определяющий, какой объект следует выделить :
если Forwards = True, выделяется следующий в Z-порядке объект группы.
Этот метод не проверяет правильность введенных данных в текущем
выделенном объекте и всегда выделяет другой элемент.Если необходимо
проверять правильность введенных данных, следует вместо этого метода
использовать метод FocusNext :
function tGroup.FocusNext(Forwards: Boolean): Boolean;
где Forwards - тот же параметр; результат - True, если произошло пе-
реключение на другой объект, и False - в противном случае.
Выделенный объект - это тот объект, с которым в настоящее время
происходит работа.Так, в рассматриваемом примере выделенной является
рабочая область - с окнами, расположенными в ней, пользователь может
взаимодействовать.Меню и строка состояния в этом случае являются пас-
сивными.Если выделить меню, то рабочая область становится пассивной,и
уже не будет возможности работать с окнами рабочей области до тех пор,
пока рабочая область опять не станет выделенной.
Выделенные объекты образуют цепочку выделенных объектов (в нашем
примере : программа - рабочая область - диалоговое окно - строка вво-
да).Последний объект такой цепочки называется сфокусированным объек-
том.В нашем п