Реферат: Turbo Vision

                                                     ОГЛАВЛЕНИЕ

     ВВЕДЕНИЕ................................................

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

         Объект 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  занимался А.А.Галаш-

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

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

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

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

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

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

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

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

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

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

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

является   разработанный  фирмой  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 Vision2.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)          │───────────────┐

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

                                  │          <───── Insert          │

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

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

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

                                  │                                 │

                                     ...                            │

                                                                    │

                                  │                                 │

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

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

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

                                  │           <───── InsertBefore   │

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

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

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

                                  │                                 │

                                  │                                 │

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

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

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

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

на предыдущий подэлемент,  поле Next предыдущего подэлементауказывает

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

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

группы образуют циклическую структуру.У каждого подэлементагруппы по-

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

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

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

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

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

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

      Оформление программы, использующей средства TurboVision.

                   Объекты 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 — в противном случае.

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

происходит работа.Так,  в рассматриваемом примеревыделенной  является

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

том.

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

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

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

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

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

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

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

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

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

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

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

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

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

     type

        tEvent = record

          What: Word;

          case Word of

             evNothing: ();

             EvMouse: (

               Buttons: Byte;

               Double: Boolean;

               Where: tPoint);

        evKeyDown: (

           case Integer of

              0: (KeyCode: Word);

              1: (CharCode: Char;

                   ScanCode: Byte));

          end;

       evMessage: (

          Command: Word;

          case Word of

            0: (InfoPrt: Pointer);

            1: (InfoLong: Longint);

            2: (InfoWord: Word);

            3: (InfoInt: Integer);

            4: (InfoByte: Byte);

            5: (InfoChar: Char);

          end;

       end;

     end;

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

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

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

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

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

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

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

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

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

                             тии клавиши.

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

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

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

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

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

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

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

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

тия :

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

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

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

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

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

бытием.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

передача.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

     procedure tView.ClearEvent(var Event:tEvent);

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

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

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

                               Команды

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

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

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

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

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

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

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

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

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

225;

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

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

999;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

работы с ними;  немодальные объекты могут и одного, идругого вида, но

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

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

труктор Init.

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

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

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

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

DeskTop.

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

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

группу.

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

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

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

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

щенное окно, и nil — если не размещено.

     Метод является функцией, которая перед размещением окнапроверяет

допустимость такой  операции  (имеется ли необходимаяобласть памяти и

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

               Задание параметров воображаемому объекту

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

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

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

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

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

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

следующими :

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

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

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

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

       номер выделенного элемента списка;

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

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

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

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

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

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

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

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

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

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

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

помощью  метода SetData :

     procedure <отображаемый объект>.SetData (varRec); 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 — указатель на запись с передаваемыми данными;

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

ном P.

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

     Turbo Vision позволяет создать менюпрограммы, предназначенное для

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

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

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

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

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

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

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

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

довольно сложную структуру и любое число уровнейвложенности,  но сос-

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

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

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

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

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

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

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

tMenuItem) :

     tMenuItem = record

        Next: pMenuItem;

        Name: pString;

        Command: Word;

        Disabled: Boolean;

        KeyCode: Word;

        HelpCtx: Word;

     case Integer of

        0: (Param: pString);

        1: (SubMemu: pMenu);

     end;

   end;

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

если следующего элемента нет, указатель равен nil;

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

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

ную линию;

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

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

меню;

    Disabled -  признак разрешения или запрета выбораданного элемента

меню;

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

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

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

предусмотрено;

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

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

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

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

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

    SubMemu — указатель на структуру меню следующего уровня,если дан-

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

ню.

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

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

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

     tMenuStr = string[31];

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

ню.

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

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

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

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

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

жатием клавиши N (или Alt+N, если это элемент основногоменю).На экра-

не такая буква выделяется особым цветом.

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

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

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

Word; AHelpCtx: Word; Next: pMenuItem):pMenuItem;

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

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

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

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

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

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

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

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

     Для создания элемента меню,  представляющего собой подменю,  ис-

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

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

pMenu; Next: pMenuItem;

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

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

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

    SubMenu — указатель на структуру подменю;

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

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

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

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

     function NewLine(Next: pMenuItem):pMenuItem;

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

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

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

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

появляющихся на экране по мере необходимости.Главное менюпредставляет

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

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

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

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

    AMenu — указатель на главное меню.

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

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

при их отображении на экране.Стандартный объект tProgram (а, следова-

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

     procedure tProgram.InitMenuBar; virtual;

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

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

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

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

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

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

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

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

одно дополнительное меню, доступ к которому осуществляетсяпо тому или

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

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

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

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

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

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

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

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

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

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

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

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

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

бытий.Так, например,  если меню получит событие от мыши, когда курсор

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

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

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

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

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

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

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

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

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

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

ды.

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

Turbo Vision являются  окна  (тип  tWindow)  и  диалоговые окна  (тип

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

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

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

элементов, цветовой палитре.Можно  сказать,  что  основное назначение

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

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

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

программах.

                    Окна (tWindow) в Turbo Vision

     Окном в TurboVision называется отображаемыйобъект-группа,  имею-

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

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

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

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

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

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

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

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

щие :

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

                        дельца

     1-й бит (wfGrow) — возможность изменения размеров окна.

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

     3-й бит (wfZoom) — наличие пиктограммы распахиванияокна.

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

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

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

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

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

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

окон, а голубая — для вспомогательных окон.

     Инициализируется окно параметром Init :

     constructor tWindow.Init(var Bounds: tRect;

                             ATitle: tTitleStr; ANumber:Integer);

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

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

     ANumber — номер окна.

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

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

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

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

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

окне.

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

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

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

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

левой клавиши окно закрывается.

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

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

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

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

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

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

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

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

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

жать клавишу.

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

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

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

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

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

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

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

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

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

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

окно по полю его владельца.

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

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

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

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

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

     Далее окно следует поместить в рабочую область.Какправило,  окно

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

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

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

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

ных для окна событий.

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

мощью метода EndModal.

     Если окно содержит выделенный элемент, а нужно сделатьвыделенным

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

элементу и  нажав  клавишу,  либо  с  помощью  клавиши клавиатуры Tab

(или Shift+Tab),  при этом нажатие  Tab выделит  следующий вZ-порядке

элемент, а Shift+Tab — предыдущий.

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

     В качестве стандартных элементов окон Turbo Visionможно  исполь-

зовать поля скроллинга (тип Scroller), предназначенные дляотображения

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

буферированной информации  (тип  tTewtDevice),  текстовыеэлементы для

пассивных терминалов (тип tTerminal) наподобие текстовыхфайлов и  ли-

нейки скроллинга.В окне можно помещать также потомкиперечисленных вы-

ше стандартных элементов.

                     Поле скроллинга  (tScroller)

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

формации, которую необходимо вывести в окно,  и  которая возможно  не

уменьшается целиком в поле окна.

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

нейки горизонтального и вертикального скроллинга :

     constructor tScroller.Init(var Bounds: tRect;

                            AHScrollBar, AVScrollBar:pScrollBar);

где Bounds — размеры поля;

    AHScrollBar, AVScrollBar  -  указатели  на вертикальнуюи горизон-

тальную линейку скроллинга.

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

этого, при инициализации потомка tScroller могут быть заданыпараметры

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

ный размер текстовой информации (размер строк и числострок), размеща-

емой в поле скроллинга.

     Следует также переопределить метод Draw  объекта tScroller   для

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

этого необходимо в начале определить,  какая часть информации  должна

быть отображена (исходя из текущего состояния линеек), затемсформиро-

вать строки, которые необходимо вывести на экран и, наконец,поместить

сформированные строки в поле скроллинга, с атрибутами цвета.

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

     Текстовый элемент буферированной информации (типtTextDevice) яв-

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

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

фера и записывают в текстовый буфер отображаемую информацию.

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

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

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

ния в поле скроллинга информации от пассивного терминала, чаще  всего

из текстового файла этого терминала.Под пассивным терминаломздесь по-

нимается терминал,  хранящий информацию,  но  не  имеющий собственных

средств редактирования информации и управления экраном.

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

труктором Init :

     constructor tTerminal.Init(var Bounds: tRect;

         AHScrollBar, AVScrollBar: pScrollBar; ABufSize:Word);

где Bounds — размеры поля;

    AHScrollBar, AVScrollBar  -  указатели  на вертикальнуюи горизон-

тальную линейку скроллинга;

    ABufSize — размер буфера терминала в байтах.

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

ми, а также буфер для передачи информации размером ABufSize.

                   Линейка скроллинга (tScrollBar)

     Линейка скроллинга  предназначена  для  фиксации местанахождения

отображаемой на экране в данный момент порции информации вовсем  объ-

еме отображаемой  информации.Линейка  представляет собойлибо горизон-

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

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

положение отображаемой порции информации.

     Используя этот ползунок, можно быстро переместиться влюбое место

отображаемой информации.Для этого необходимо подвести  к нему  курсор

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

нужное место линейки скроллинга.Если курсор мыши поместитьне на  пол-

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

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

равлении.Если курсор  мыши  поместить  на завершающую стрелкуи нажать

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

твующую сторону.

     5 параметров объекта tScrollBar :

     Min, Max — определяют миним.  и максим.  значениеномера текущего

элемента информации.

     ArStep — величина шага перемещения по информации вслучае нажатия

клавиш Left,  Right,  Up,  Down или при нажатии клавишимыши,  если ее

курсор находится на завершающей стрелке.

     PgStep — размер страницы, на которую происходитперемещение.

     Value -  текущий  элемент информации.Инициализациялинейки скрол-

линга осуществляется конструктором Init :

     constructor tScrollBar.Init(var Bounds: tRect;

     где Bounds — область, выделенная под линейку скроллингав коорди-

натах его владельца.

     Линейка скроллинга не может активизироваться,  так каку  нее  не

установлен флаг  ofSelectable  параметра  Options.Поэтомуона не может

обычным образом реагировать на нажатие клавиш клавиатуры.Чтобы  этого

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

тий, установив флаг ofPostProcess параметра Options.

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

     Диалоговое окно (тип tDialog) представляет специальный тип  окна

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

значений параметров в программу.

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

один из трех видов палитры :

     dpBlueDialog = 0 — синяя палитра диал. окна;

     dpCyanDialog = 1 — голубая палитра диал. окна;

     dpGrayDialog = 2 — серая палитра диал. окна.

     В отличие  от    обычного   окна       диалоговое   окно обычно

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

труктором Init :

     constructor tDialog.Init(var Bounds: tRect;

                                               ATitle:tTitleStr);

где  Bounds — размеры диалогового окна;

     ATitle — имя диалогового окна размером до 80 символов.

     В отличие от обычного окна у диалогового окнастандартно нет воз-

можности изменять размеры, оно использует серую палитру и неимеет но-

мера.

     К другим особенностям диалогового окна можно отнестиобработку им

клавиш Esc  и Enter.Если диалоговое окно находится вмодальном режиме,

нажатие Esc закрывает окно без сохранения введеннойинформации.Нажатие

клавиши Enter  эквивалентно  нажатию  кнопки,  выбираемой поумолчанию

(закрывает окно с сохранением внесенных изменений).

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

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

качестве элементов этого окна.

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

следующим образом.Сначала создать и инициализироватьдиалоговое  окно,

при этом  поместив  в него все его элементы.Затемподготовить исходные

данные для передачи диалоговому окну.

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

тода ExecuteDialog и осуществляется работа с ним.Призавершении работы

анализируется, какое  происходит  завершение — с сохранениемвнесенных

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

в том же параметре, в котором передавались исходные данные.

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

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

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

     Возможно использование стандартных элементов или ихпотомков :

     — строки ввода;

     — метки;

     — протоколы;

     — селективные списки;

     — триггерные списки;

     — кнопки;

     — статические и параметрические тексты;

     — списки строк;

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

                             Строка ввода

     Строка ввода (тип tInputLine) предназначена для ввода впрограмму

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

тейший редактор  строки символов и обладает большим наборомвозможнос-

тей.Основным элементом строки является буфер (строка,  вкоторую поме-

щаются все  вводимые  символы).Инициализируется  строка ввода методом

Init :

     constructor tInputLine.Init(var Bounds: tRect;

                                               AMaxLen:Integer);

где  Bounds — размер поля строки ввода;

     AMaxLen — размер буфера.

     Высота поля строки ввода должна равнятьсяединице.Ширина поля мо-

жет быть любой, но не менее 3.Размер буфера может иметьлюбое значение

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

где  Bounds — поле для размещения пиктограммы протокола;

     ALink — указатель на строку ввода, с которым связанпротокол;

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

протокола.

     Обычно протокол размещается за строкой ввода,  ккоторой он отно-

сится.Ширина поля должна равняться двум, высота — единице.

  Селективный (тип  tRadioButtons)  и триггерный ( типtCheckBoxes)

                                списки

     Селективный и триггерный списки очень похожи,  так каку них есть

общий предок (tCluster), заключающий в себе общие свойства.

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

списка.Количество элементов ограничено числом 65536.

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

тов (или ни одного),  однако при стандартном использованиичисло  эле-

ментов этого списка ограничено 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 :

     constructor tButton.Init(var Bounds: tRect;

                    ATitle: tTitleStr;ACommand:Word;AFlags:Byte);

где  Bounds — поле, выделяемое под кнопку;

     ATitle — текст, размещаемый на кнопке;

     ACommand — код команды, связанной с кнопкой;

     AFlags — задаваемые флаги кнопки.

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

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

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

текста.

     Выбрать кнопку можно с помощью мыши,  подведя курсор инажимая на

клавишу, либо с помощью клавиши Tab,  а затем клавишиEnter.При выборе

кнопки она формирует событие-команду с кодом команды, который был за-

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

   Статический (tStaticText) и параметрический (tParamText)тексты

     Статический текст  предназначен  для размещения вдиалоговом окне

различной поясняющей информации.

     Инициализация осуществляется при помощи метода Init :

     constructor tStaticText.Init(var Bounds: tRect;

                                             const AText:String);

     где  Bounds — поле, выделяемое под статический текст;

          AText — размещаемый текст.

     Поле, выделяемое  под статический текст,  должно бытьдостаточных

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

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

внутри слов.

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

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

даваемых параметров.Для того, чтобы указать, в каком местетекста сле-

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

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

     Инициализируется параметрический текст методом Init:

     constructor tParamText.Init(var Bounds: tRect;

                       const AText: string; AParamCount:Integer);

где  Bounds — поле, выделенное под параметрический текст;

     AText — исходный текст со спецификациями параметров;

     AParamCount — число параметров текста.

                             Списки строк

     Списки строк в диалоговом окне напоминают полескроллинга  и  его

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

списков.

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

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

ретным списком информации (вертикальный и горизонтальныйскроллинг).

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

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

коллекции строк (только вертикальный скроллинг).

     Инициализируется список  коллекции  строк  с помощьюконструктора

Init :

     constructor tListBox.Init(var Bounds: tRect;

                          ANumCols: Word; AScrollBar:pScrollBar);

     где  Bounds — поле, выделенное под список;

          ANumCols — число колонок, в которые выводятсястроки;

          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;

        KeyCode: Word;

        Command: Word

     end;

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

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

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

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

выбрать данный элемент строки состояния;

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

го элемента строки состояния.

     Создать элемент  строки  состояния  можно  с  помощьюстандартной

функции NewStatusKey :

     function NewStatusKey(const AText: string;

                            AKeyCode: Word; ACommand: Word;ANext:

                                        pStatusItem);pStatusItem;

где AText — выводимый на экран текст;

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

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

ного элемента;

    ANext — указатель на следующий элемент строки состояния;

    результат — указатель на созданный элемент строкисостояния.

     Сама строка состояния имеет стандартный тип-записьtStatusDef :

     tStatusDef = recerd

        Next: pStatusDef;

        Min, Max: Word;

        Items: pStatusItem;

     end;

где Next — указатель на следующую строку состояния;

    Min, Max — миним.  и максим.  границы диапазонапараметра контекс-

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

    Items — указатель на первый элемент списка элементов.

     Элементы строки  состояния также как и строки состоянияпредстав-

ляют собой линейный список.

     Для создания строки состояния можно  воспользоваться стандартной

функцией NewStatusDef :

     function NewStatusDef(AMin, AMax: Word;

              AItems: pStatusItem; ANext: pStatusDef):pStatusDef;

где ANext — указатель на следующую строку состояния;

    AMin, AMax — миним. и максим. границы диапазонапараметра контекс-

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

    AItems — указатель на первый элемент списка элементов.

     В строке состояния также можно отразить  информацию  о состоянии

программы в конкретный момент времени (процесс, протекающийв програм-

ме и т.д.)Информация такого вида зависит от  значения параметра  кон-

текстной помощи активизированного в настоящий момент элементапрограм-

мы.Вывести такую  информацию  можно  с  помощью  метода Hint  объекта

tStatusLine :

     function tStatusLine(AHelpCtx: Word): string; virtual;

где AHelpCtx — значение параметра контекстной помощи;

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

                    ЦВЕТОВАЯ ПАЛИТРА TURBO VISION

     Turbo Vision позволяет манипулировать цветомизображения объектов

на экране.При этом можно использовать стандартный наборцветов, задан-

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

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

мы, или создавать свою палитру.

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

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

— набор цветов для отдельных элементов этого объекта,  аокна и диало-

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

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

основного объекта  tApplication,  являются  подэлементамикакой — либо

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

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

палитры данной группы.

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

по их прямому назначению,  то никаких действий пораскрашиванию предп-

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

соответствующего объекта с помощью метода Draw :

     procedure <отображаемый объект>.Draw; virtual;

который, в свою очередь, использует методы GetPallete :

     function <отображаемый объект>.GetPallete:

                                                pPallete;virtual;

определяющий указатель на конкретную палитру объекта, иGetColor :

     function tView.GetColor(Color: Word): Word;

где Color — номер входа в палитру;

    результат — атрибуты соответствующего цвета.

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

     Если требуется изменить уже существующий цвет у всехиспользующих

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

ру.Для этого нужно либо внести изменения в исходный текст модуля  App

 (константа CAppColor) и перекомпилировать его,  либо внестиизменения

в метод  GetPallete объекта tProgram.

     Второй вариант  — когда нужно изменить цвета укакого-нибудь объ-

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

мыми цветами.В  этом  случае  можно  изменить соответствующим образом

константу, определяющую палитру у метода GetPallete.

     Если необходимо изменить цвета конкретного объекта,  атребуемого

сочетания цветов у его владельца нет,  то следует дополнить  основную

палитру программы  новыми элементами,  соответствующимитребуемым цве-

там.Так как основная палитра исходно имеет 127 элементов, то примерно

столько же  можно  к  ней  добавить в случаенеобходимости.После этого

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

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

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

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

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

     Помимо отображаемых,  в  Turbo  Vision имеется ряднеотображаемых

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

редственно с представлением информации на экране, вчастности проверки

вводимой информации или размещения в них той или инойинформации.

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

информации, коллекции, потоки и ресурсы.Все эти объекты — потомки объ-

екта tObject.

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

     В Turbo  Vision  2.0  имеется  возможность контроляразмещаемой в

строке ввода информации.Для этого служит  серия  объектов, называемых

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

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

     Анализатор множества допустимых символов  (тип tFilterValidator)

проверяет, входят  ли вводимые символы в множество допустимых, и если

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

волы игнорируются.Инициализация   такого   анализатора осуществляется

конструктором Init :

     constructor tFilterValidator.Init(AValidChars:tCharSet);

где AValidChars — множество допустимых символов типаtCharSet.

     Анализатор границ вводимого числа (типtRangeValidator)  предназ-

начен для  контроля  вводимых  в символьной форме целыхчисел (в общем

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

tFilterValidator, помимо  проверки  допустимых символов(только цифр и

знаков "+" и "-" в первой позициивводимой информации) проверяет также

значение введенного числа и его нахождение в заданномдиапазоне.

     Анализатор инициализируется конструктором Init :

     constructor tRangeValidator.Init(AMin, AMax: Longint);

где AMin, AMax — миним. и максим. допустимые границывводимого числа.

     Если введенное  число  не попадает в заданныйдиапазон,  выдается

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

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

менений.Окно не закрывается.

     Анализатор по списку строк (тип tStringLookupValidator)сравнива-

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

в коллекции строк.Реакция при неправильно введенной строкеаналогичная.

     Анализатор инициализируется конструктором Init :

     constructor tStringLookupValidator.Init(

                                     AStrings:pStringCollection);

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

мация.

     Анализатор по шаблону (тип tPXPictureValidator)позволяет создать

шаблон, по которому проверяется  вводимая  информация.Можно проверять

количество вводимых символов, их вид и т.д.

     Анализатор инициализируется конструктором Init :

     constructor tPXPictureValidator.Init(

                           const APic: string; AutoFill:Boolean);

где APic — шаблон, по которому проверяется вводимаяинформация;

    AutoFill — если равен True,  вводимая информацияавтоматически до-

полняется символами шаблона, не являющимися служебнымисимволами.

     Анализатор должен быть подключен к соответствующейстроке ввода с

помощью метода SetValidator строки ввода :

     procedure tInputLine.SetValidator(AValid: pValidator);

где  AValid — указатель на подключаемый к строке вводаанализатор.

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

     Объект-коллекция (тип  Collection)  предназначен впервую очередь

для размещения в нем объектов (точнее, указателей наобъекты).Основным

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

димости могут изменяться.Кроме этого, коллекция можетсодержать объек-

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

     Создается коллекция с помощью конструктора Init :

     constructor tCollection.Init(ALimit, ADelta: Integer);

где  ALimit — первоначальный размер коллекции;

     ADelta — величина,  на которую изменяется размер вслучае необхо-

димости.

     Работа с коллекцией осуществляется следующимобразом.Вначале соз-

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

нее можно  помещать  компоненты.При этом в коллекциипомещается указа-

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

коллекции нет достаточного  места,  она автоматическиувеличивается на

величину ADelta.

     Компоненту в коллекцию можно поместить либо в концесписка,  либо

после компоненты с указанным значением индекса.В первомслучае исполь-

зуется метод Insert :

     procedure tCollection.Insert(Item: Pointer); virtual;

где  Item — указатель на размещаемый в коллекции объект,

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

     procedure tCollection.AtInsert(Index:Integer;Item:Pointer);

где  Index — номер компоненты, который получает размещаемыйобъект;

     Item — указатель на размещаемый в коллекции объект.

     Эти методы копии размещаемого в коллекции объекта несоздают.

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

     Метод FirstThat :

     function tCollection.FirstThat(Test: Pointer): Pointer;

где  Test — указатель на функцию, проверяющую некотороеусловие;

     результат — указатель на первую компоненту коллекции,для которой

верно условие, проверяемое функцией, указатель на которуюравен Test.

     Функция с указателем Test не должна быть методом идолжна  компи-

лироваться с директивой far.Ее заголовок выглядит следующимобразом :

     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 — указатель на процедуру, которая выполняеттребуемые дейс-

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

методом и должна компилироваться с директивой far.Еезаголовок :

     procedure <имя процедуры>(Item: Pointer); far;

где Item — указатель на компоненту коллекции.

     Коллекция может содержать не только объекты, но иэлементы других

типов.В частности,   имеется   стандартная   коллекция  строк    (тип

tStringCollection).В ней переопределен метод FreeItem,который удаляет

компоненту из коллекции и из динамической памяти.

                         Потоки Turbo Vision

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

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

ществовать не только на внешних устройствах,  но и воперативной памя-

ти.Другое важное отличие -  возможность  хранения  данных разных  ти-

пов.Возможны запись и чтение.

     При создании потока в нем не находится никакойинформации.Записы-

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

так что условный указатель на текущий элемент файла в этомслучае ука-

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

тель автоматически настраивается на начало следующей.

     Поток типа tStream является абстрактным потоком, потомучто он не

привязан к  конкретному  носителю  информации.На практикеиспользуются

потоки ДОС   (тип   tDosStream)   и    буферированный   поток    (тип

tBufStream).Они позволяют хранить информацию во внешнихфайлах, причем

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

фер, что повышает быстродействие работы.

     Поток ДОС инициализируется конструктором Init :

     constructor tDosStream.Init( FileName: FNameStr; Mode:Word);

где FileName — имя файла,  с которым связан поток (размерыпо правилам

MS-DOS — до 79 символов);

     Mode — категория файла.

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

     constructor tBufStream.Init( FileName: FNameStr;

                                                 Mode, Size:Word);

где FileName — имя файла,  с которым связан поток (размерыпо правилам

MS-DOS — до 79 символов);

    Mode — категория файла;

    Size — размер буфера (обычно от 512 до 2048 байт).

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

следует подготовить.

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

го.У стандартных отображаемых объектов в Turbo Vision такиеметоды уже

имеются.Первый метод — Store :

     procedure <отображаемый объект>.Store (var S:tStream);

где S  -  поток,  в который помещается объект.Методразмещает объект в

потоке.

     Второй — конструктор Load :

     constructor <отображаемый объект>.Load(var S:tStream);

где S — поток, из которого берется объект.Конструкторзагружает объект

из потока в память.

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

(группу параметров,  следующих друг за другом),  можновоспользоваться

методом Write :

     procedure <тип потока>.Wriye (var Buf; Count:Word); virtual;

     Buf — буфер с переписываемой информацией;

     Count — размер переписываемой информации в байтах.

     Это основной метод записи информации в поток.

     Для всех методов имеются аналоги,  осуществляющиечтение информа-

ции из потока.Основной — метод Read, позволяющий читать изпотока зна-

чение параметра объекта (группы параметров) :

     procedure <тип объекта>.Read (var Buf; Count:Word); virtual;

     Buf — буфер, в который помещается информация;

     Count — размер переписываемой информации в байтах.

     Вторая операция,  связанная  с подготовкой объекта кзаписи в по-

ток, — его регистрация.В потоке могут быть объекты разныхтипов,  поэ-

тому возникает  проблема в определении типов этих объектовпри необхо-

димости работы с ними.Для решения этой проблемы используется  система

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

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

рационный номер.По  этому  номеру будут определяться размерзаписанной

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

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

ется в поток и читается из него.

     Для регистрации объекта следует  создать регистрационную  запись

(типа tStreamRec) :

     type

        tStreamRec = record

           ObjType: Word;

           VmtLink: Word;

           Load: Pointer;

           Store: Pointer;

           Next: Word;

     end;

где ObjType — индивидуальный регистрационный номер объекта;

    VmtLink — смещение адреса таблицы виртуальных методовобъекта;

    Load — адрес конструктора Load объекта;

    Store — адрес метода Store объекта;

    Next — смещение адреса следующей регистрационной записи.

     В качестве регистрационной записи,  как  правило, типизированная

константа, у которой заполнены первые 4 поля.Имярегистрационной запи-

си получается из имени объекта заменой префикса t на префиксR.У стан-

дартных элементов уже есть регистрационные записи.Застандартными объ-

ектами зарезервированы индивидуальные регистрационныеномера  с  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 :

     function tResourceFile.Get(Key: String): pObject;

     Key — имя, присвоенное размещаемому объекту;

     результат — указатель на найденный объект или nil, если нет объ-

екта с таким именем.

     В файле ресурсов можно хранить  библиотеку интерфейсных  элемен-

тов.Использование таких  файлов  является  хорошим средствомповышения

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

                             Списки строк

     В Turbo  Vision  имеется  специальный  объект — списокстрок (тип

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

строк, которые можно вызвать по номеру.

     Прежде чем рассматривать объект tStrihgList, познакомимся с объ-

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

его соответствующим содержанием.Инициализируется онконструктором Init

     constructor tStrListMaker.Init(AStrSize,AIndexSize:Word);

где AStrSize — размер буфера для размещения строк;

     AIndexSize — максимальный индекс размещаемой строки.

     Размещаются строки в список с помощью метода Put :

     procedure tStrListMaker.Put(Key: Word; S: string);

где Key — индекс размещаемой строки;

     S — размещаемая строка.

     Сам список tStrList конструктора не имеет, получить изнего стро-

ку можно с помощью метода Get :

     function tStrList.Get(Key: Word): string;

где Key — индекс строки;

    результат — найденная строка.

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

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

     В настоящее  время  создано большое количествотекстовых редакто-

ров, но иногда требуется создать свой собственный,  особеннокогда  он

должен входить  составной частью какого-либо пакета.ПакетTurbo Vision

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

товые редакторы.Исходным  является объект tEditor.Его потомок- объект

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

файлами.Без особых изменений можно создавать редакторы,работающие од-

новременно с любым количеством файлов,  содержащих  тексты до  64  К,

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

использование буфера и т.д.

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

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

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

ду отдельными  элементами.К  таким  структурам относятсяменю и строки

состояния.Для отображения подобных структур в Turbo Visionимеются два

специальных объекта :  абстрактный объект tOutlineViewer,осуществляю-

щий отображение структуры на экране, и tOutline,осуществляющий работу

с конкретной  древовидной  структурой.Последний объектпозволяет скры-

вать или показывать на экране те или иные ветви  структуры с  помощью

мыши или клавиатуры.

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

     Существует стандартное    диалоговое    окно   задания    цветов

tColorDialog.С помощью этого окна можно изменять лишьимеющиеся  цвета

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

жаемых объектов программы соответствующего типа.

                              ЗАКЛЮЧЕНИЕ

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

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

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

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

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

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

ским интерфейсом.

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

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

     Представленный в данной   работе  разработанный фирмой   Borland

International  пакет  Turbo Vision 2.0 является удобным средством уп-

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

современных требований к интерфейсу программ.  Этот пакетпредставляет

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

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

     Более универсальным является диалоговый способпередачи  информа-

ции и именно для организации диалога предназначен в первуюочередь па-

кет Turbo Vision.Использование этого пакета  освобождает программиста

от занимающей много времени работы,  связанной   с организацией  вво-

да/вывода, которая повторяется от программы к программе, требует  вы-

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

ния основной задачи.

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

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

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

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

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

мендации по их использованию.

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

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

ются потомками общего абстрактного объекта tObject.В работерассмотре-

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

фейса.

     В работе  подробно  рассмотрен    порядок работы с отображаемыми

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

с  модальными  объектами,  а  также виды неотображаемыхобъектов Turbo

Vision и работу с ними.

     Пакет    Turbo Vision  позволяет  использовать  стандартную  па-

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

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

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

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

ры.

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

Turbo Vision фирмы Borland International является одним изсамых удоб-

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

еще рефераты
Еще работы по информатике, программированию