Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РУКОВОДСТВО TURBO VISION ДЛЯ C++ TV Turbo Visio...doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
5.2 Mб
Скачать

Часть 2. Глава 3. Иерархия классов

-----------------------------------------------------------------

Материал данной главы подразумевает, что читатель уже имеет

опыт работы с языком C++. Имеется в виду также, что читатель оз-

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

философских концепциях, возможностях и терминологии объектно-ори-

ентированной библиотеки Turbo Vision.

В данной главе после ряда общих соображений по объектно-ори-

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

ние принципов иерархии классов Turbo Vision и подчеркивается ме-

ханизм их взаимосвязи. Изучив основные свойства каждого из

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

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

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

ность.

Обзор иерархии классов Turbo Vision

-----------------------------------------------------------------

В главе 13 "Список классов" дается подробная характеристика

методов и полей, каждого стандартного типа класса. Однако полу-

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

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

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

остальных главах этой части книги даются более детальные поясне-

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

части книги содержится справочный материал в алфавитном порядке.

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

классов Turbo Vision, основные классы наследуются из класса

TView, который является прямым наследником TObject.

На рисунке 3.1 показана иерархия классов TObject и TView.

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

те, что класс TDialog является наследником класса TWindow, кото-

рый, в свою очередь, является наследником класса TGroup, а

последний - класса TView. Т.о. вам потребуется значительно меньше

времени на изучение свойств всех классов. Каждый новый производ-

ный класс будет обладать известными унаследованными свойствами, и

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

он будет иметь.

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

рархии классов. Вот один из них: TProgram получается из TProgInit

и TGroup.

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

как на рисунке 3.2 показана иерархия класса TView.

Turbo Vision для С++ = 89 =

Рисунок 3.1 Иерархия классов Turbo Vision.

(f) ┌opstream

┌───────┘

TObject TStreamable─┤

^ ^ └───────┐

└───────────┬─────────────┘ (f) └ipstream

TView

f = friend ^

v = virtual │

TGroup

^ ^ ^

┌─────────────────┘ │ └────────┐ (v) TDeskInit

│ │ │ ^

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

│ │ TWindowInit │

│ │ (v) ^ │

│ TProgInit └──┬─────┘ TDeskTop

│ ^ (v) │

└────┬───┘ ┌─>TWindow<────┐ THistInit<┐

│ │ │ │

TProgram │ THistoryWindow───┘

^ │

│ │

TApplication TDialog

Рисунок 3.2. Иерархия класса TView.

View<──────┬─<TBackGround ┌─<TMenuBar

├─<TMenuView <──────┤

├─<TButton │ TMenuItem

├─<TScrollBar └─<TMenuBox

├─<TFrame ┌─<TTextDevice

├─<TScroller <──────┤

├─<THistory └─<TTerminal

├─<TStatusLine TStatusDef

│ TStatusItem

├─<TInputLine <───────<TFileInputLine

│ ┌-<TCheckBoxes

├─<TCluster <───────┤

├─<TFileInfoPane └─<TRadioButtons TLabel >─┐

├─<TStaticText <────┬──────────────────────────┘

│ └────────────────<TParamText

└─<TListViewer <────┬─<THistoryViewer

└─<TListBox<─┐

┌──────────────────┘

└┬─<TSortedListBox──<TFileList

└─<TDirListBox TDirEntry

Turbo Vision для С++ = 90 =

Несколько слов о проектировании иерархии классов

------------------------------------------------

Не существует "идеальной" иерархии для каждой конкретной

программы. Каждая иерархия классов представляет собой сплав

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

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

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

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

классов.

В процессе разработки программ с помощью Turbo Vision вы

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

и их взаимоотношений. Позднее, вы вникните во все детали, но

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

ного создания ваших программ (что характерно для всех объект-

но-ориентированных проектов).

Turbo Vision для С++ = 91 =

Типология классов

-----------------------------------------------------------------

В Turbo Vision не все классы создаются одинаковыми. По вы-

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

классы, отображаемые классы и неотображаемые классы. Описание

каждой из них приводится в отдельных разделах данной главы.

Внутри каждой группы имеются также различные классы. Часть

из них является полезными классами, экземпляры которых вы можете

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

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

Перед тем, как рассматривать классы в иерархии Turbo Vision, бу-

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

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

Он существует только для того, чтобы служить основой для другого

класса. Turbo Vision содержит несколько классов, которые не явля-

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

в программе.

Абстрактные классы

Многие типы классов существуют в виде "абстрактной" основы,

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

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

абстрактных типов носит отчасти концептуальный характер, но в

большей степени служит практической цели уменьшения объемов прог-

раммы.

Можно рассмотреть, например, классы TRadioButtons и

TCheckBoxes. Каждый из них может быть непосредственно порожден из

класса TView без особых затруднений. Тем не менее они имеют много

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

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

фиксацией во многом сходен с набором кнопок c зависимой фиксаци-

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

здесь имеется и ряд других технических отличий. Подобная общность

делает возможным выделение абстрактного класса TCluster. Далее из

него порождаются классы TRadioButtons и TCheckBoxes и ряд специ-

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

возможности.

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

классов. Например, экземпляр класса TCluster, MyCluster не будет

иметь полезного метода draw: он унаследует TView::draw без пере-

определения, т.о. объект MyCluster::draw будет выдавать на экране

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

умолчанию. Если вы хотите получить усовершенствованный набор эле-

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

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

объект TMyCluster из TCluster, либо вам будет проще породить спе-

циальный набор из объектов TRadioButtons или TCheckBoxеs в за-

Turbo Vision для С++ = 92 =

висимости от ваших потребностей. Во всех случаях вы сможете до-

бавлять сколько угодно полей и функций. Если вы планируете

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

дать промежуточный абстрактный класс.

Абстрактные (пустые) функции класса

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

или иной класс. Многие из стандартных классов Turbo Vision имеют

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

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

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

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

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

Общее правило здесь заключается в том, что по мере продвиже-

ния вниз по иерархии Turbo Vision, стандартные классы становятся

более специализированными и менее "абстрактными". Их имена заклю-

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

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

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

интерфейсы: рабочую область, строку меню, строку состояния, пане-

ли диалога и т.д.

Создание экземпляров классов и их производных

-----------------------------------------------------------------

Для каждого класса имеются две основные операции: вы можете

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

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

но проделать те же операции. Рассмотрим их поподробнее.

Создание экземпляра класса

Создание экземпляра класса обычно выполняется с помощью объ-

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

myScrollBar( TRect r );

TButton *someButton = new TButton( ... );

Объект myScrollBar будет инициализирован посредством

конструктора TScrollBar с определенными значениями полей, задан-

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

торе TScrollBar в главе 13. Поскольку класс TScrollBar является

потомком класса TView, конструктор TScrollBar вызовет конструктор

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

же образом конструктор TView порожден из класса TObject, поэтому

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

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

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

Turbo Vision для С++ = 93 =

У объекта myScrollBar имеются теперь заданные по умолчанию

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

ет также все методы класса TScrollBar, а также методы (возможно,

переопределенные) классов TView и TObject. Для того, чтобы

воспользоваться методами MyScrollBar, вам необходимо их знать и,

в частности, метод handleEvent и draw. Если в классе TScrollBar

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

ет породить из него новый класс.

Создание порожденных классов

-----------------------------

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

class TNewScrollBar : public TScrollBar

{

// здесь объявите новые члены

}

// здесь определите новые члены

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

класса. Перед тем, как объявить класс TNewScrollBar вам следует

определить его новые методы или переопределить некоторые из мето-

дов класса TScrollBar и, возможно, добавить ряд новых полей; в

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

лишено смысла. Определяемые вами новые или пересмотренные методы

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

классу TScrollBar. Ваш новый конструктор будет определять значе-

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

прокрутки.

Turbo Vision для С++ = 94 =

Методы классов Turbo Vision

-----------------------------------------------------------------

Методы классов Turbo Vision можно охарактеризовать четырьмя

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

Абстрактные (пустые) методы класса

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

тела (или тела, содержащего выражения для перехвата ошибочных вы-

зовов). Абстрактные методы должны определяться порожденным

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

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

Псевдо-абстрактные (пустые) методы класса

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

нимальный объем действий. Чтобы их можно было использовать, они

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

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

классов в цепочке наследования. Таким примером может служить

TSortedCollection::compare.

Виртуальные методы класса

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

директиву virtual. Виртуальные методы можно переопределить в по-

рожденных классах. Переопределенные методы класса должны пол-

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

такие же типы данных. Виртуальные методы переопределять не требу-

ется, однако обычно имеется тенденция к их переопределению (рано

или поздно). Примером такого метода может служить TView::dataSize

и TGroup::handleEvent. Виртуальные методы C++ основаны на концеп-

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

во время выполнения программы, а не во время компиляции.

Не виртуальные методы класса

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

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

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

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

ционируют в полиморфном режиме. Это имеет особенное значение при

обращении к функциям классов. Если, например, pGeneric является

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

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

реопределение переменной и вызываете не виртуальные методы

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

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

Turbo Vision для С++ = 95 =

pGeneric->non_virtualMemberFunction всегда эквивалентно TView::

non_virtualMemberFunction, даже если вы присвоили переменной

pGeneric указатель другого типа. Сравните это с виртуальным мето-

дом: pGeneric ->virtualMemberFunction будет связан с объектом ди-

намически, поэтому будет вызван метод, принадлежащий объекту на

который указывает pGeneric.

Статические члены

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

ются при помощи ключевого слова static. Такие члены имеют только

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

члены не могут быть виртуальными и иметь указатель this. Они иг-

рают важную роль Turbo Vision. Например, вы можете видеть, что

TProgram::InitStatusLine - статический член, создающий стати-

ческое поле TProgram::statusLine.

Поля данных Turbo Vision

-----------------------------------------------------------------

Если взять на рассмотрение три важных класса: TView, TGroup

и TWindow, то на примере их полей можно проследить механизм

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

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

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

Таблица 3.1. Наследование полей данных отображаемых объектов.

─────────────────────────────────────────────

Поля TView Поля TGroup Поля TWindow

─────────────────────────────────────────────

cursor cursor cursor

dragMode dragMode dragMode

eventMask eventMask eventMask

growMode growMode growMode

helpCtx helpCtx helpCtx

next next next

options options options

origin origin origin

owner wner owner

size size size

state state state

buffer buffer

clip clip

current current

endState endState

last last

lockFlag lockFlag

phase phase

flags

frame

number

Turbo Vision для С++ = 96 =

palette

title

zoomRect

─────────────────────────────────────────────

Обратите внимание, что объект TGroup наследует все поля объ-

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

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

та в группе. В свою очередь, объект TWindow наследует все поля

объекта TGroup и добавляет еще поля, необходимые для функциониро-

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

Для того, чтобы полностью разобраться с классом TWindow,

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

отображаемым объектом.

Примитивные классы

-----------------------------------------------------------------

В библиотеке Turbo Vision имеется три простых класса, кото-

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

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

TPoint и TRect используются всеми отображаемыми классами в иерар-

хии Turbo Vision. Класс TОbjеct является основой иерархии.

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

непосредственно. Класс TPoint является просто объектом-точкой на

экране (в координатах X и Y). Класс TRect - отображаемый класс,

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

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

Класс TPoint

Данный класс представляет точку на экране. Его поля x и y

определяют декартовы координаты (x, y) позиции на экране. Точка с

координатами (0,0) является крайней левой верхней точкой экрана.

x возрастает в горизонтальном направлении вправо; y - в верти-

кальном направлении вниз. Класс TPoint переопределяет некоторые

операторы, такие как +, == и +=, которые используются в обычном

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

разования глобальных (весь экран) координат в локальные (по отно-

шению к месту нахождения объекта) и наоборот.

Класс TRect

Данный класс представляет прямоугольник. Его поля a и b яв-

ляются объектами TPoint, определяющими верхнюю левую и нижнюю

правую точки прямоугольника. Объект TRect имеет методы: move,

grow, intersect, Union, contains, ==, != и isEmpty. Объекты TRect

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

Turbo Vision для С++ = 97 =

жать. Однако, все они имеют форму прямоугольников: все их

конструкторы имеют параметр bounds типа TRect для определения ох-

ватываемой ими области.

Класс TObject

TObject представляет собой абстрактный базовый класс без по-

лей. Он является прародителем всех классов Turbo Vision за исклю-

чением TPoint и TRect. Объект TObject имеет два метода: destroy и

shutDown. Первый из них освобождает память, а второй является

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

рожденных классах.

Классы, порожденные из класса TObject, разделяются на два

семейства: отображаемые и неотображаемые. Отображаемые объекты

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

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

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

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

представляют набор утилит для обработки потоков и других классов,

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

непосредственно.

Turbo Vision для С++ = 98 =

Отображаемые объекты

-----------------------------------------------------------------

Объекты, производные от класса TObject и изображение которых

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

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

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

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

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

гими отображаемыми объектами.

Обзор отображаемых объектов

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

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

жаемого объекта должен быть порожденным от класса TView. Сам

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

прямоугольную зону на экране. Использование класса TView в ка-

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

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

область на экране и виртуальный метод draw (это вынуждает все не-

посредственно порождаемые классы иметь специфический метод draw).

В процессе программирования на Turbo Vision вы будете

использовать более специализированные классы, порожденные от

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

на все области Turbo Vision, поэтому вам следует с ними подробнее

ознакомиться.

Turbo Vision для С++ = 99 =

Группы

-----------------------------------------------------------------

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

ческой схеме, изображенной на рисунке 3.1. Все классы, имеющиеся

в программе Turbo Vision, являются тем или иным образом порожде-

нием класса TView. Однако ряд этих отображаемых классов имеют еще

и другое значение: они позволяют согласовывать действия разных

классов.

Класс TGroup

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

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

ражаемого объекта под названием owner (владелец) группы. Каждый

отображаемый объект имеет поле owner типа *TGroup, которое указы-

вает на его владельца - экземпляра класса TGroup. Нулевой указа-

тель означает, что у отображаемого объекта нет владельца. Поле по

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

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

могут быть другие отображаемые объекты, которые, в свою очередь

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

т.д.

Состояние этой цепочки постоянно меняется по мере нажатия

пользователем кнопок "мыши" или клавиш на клавиатуре в процессе

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

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

цессе работы с другими отображаемыми объектами данный отображае-

мый объект может быть скрыт или изображен, поэтому отображаемому

объекту необходимо координировать множество действий.

Рабочая область

Объект TDeskTop - это нормальный исходный вид фона, пред-

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

торой обычно расположены строка меню и строка состояния. Обычно

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

щей классы TDeskTop, TMenuBar и TStatusLine. Другие отображаемые

объекты (такие как окна и рамки диалога) создаются, изображаются

и управляются (обрабатываются) в рабочей области в соответствии с

действиями пользователя (нажатия кнопок "мыши" или клавиш на кла-

виатуре). Основная часть работы с программой выполняется в рабо-

чей области.

Программы

Класс TProgram предоставляет набор виртуальных методов для

порожденного от него класса TApplication. TProgram содержит два

базовых класса (множественное наследование): TGroup и TProgInit.

Turbo Vision для С++ = 100 =

Прикладные программы

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

вашей прикладной программы, использующей Turbo Vision. Он явля-

ется порождением класса TGroup (через TProgram). Обычно он владе-

ет отображаемыми подобъектами TMenuBar, TDeskTop и TStatusLine.

Объект TApplication располагает методами для создания и включения

этих трех отображаемых объектов. Ключевым методом класса

TApplication является метод TApplication::run, который запускает

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

Окна

Объекты TWindow, с помощью ассоциированных с ними объектов

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

ной рамкой, которые вы можете двигать по экрану, изменять их раз-

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

класса TView. Поле frame указывает на объект окна TFrame. Объект

ТWindow может также изменять размер своего изображения и закры-

ваться. Объект ТWindow обрабатывает нажатия клавиш Tab и

Shift-Tab для выбора предыдущего и последующего отображаемых объ-

ектов из имеющихся в окне. Обработчик событий объекта ТWindow

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

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

управляющих клавиш Alt-n.

Панели диалога

Класс TDialog является потомком класса TWindow. Он исполь-

зуется для создания панелей диалога для обеспечения взаимо-

действия с пользователями. Панели диалога обычно содержат элемен-

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

цией. Методы объекта-прародителя execView используется для сохра-

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

превращения панели диалога в модальное. Далее объект TDialog на-

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

вателя как нажатие кнопок "мыши" и клавиш на клавиатуре. Обычно,

клавиша Esc рассматривается как клавиша выхода (cmCancel). Клави-

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

параметром cmDefault. И, наконец, execView восстанавливает сохра-

ненный ранее контекст.

Turbo Vision для С++ = 101 =

Терминальные отображаемые объекты

-----------------------------------------------------------------

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

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

ментами. Следовательно, они являются конечными точками любых це-

почек отображаемых объектов.

Рамки

Объект TFrame предоставляет рамку (границу) для изображения

класса TWindow, вместе с кнопками для перемещения и закрытия ок-

на. Объекты TFrame никогда не используются сами по себе, а только

вместе с объектом TWindow.

Кнопки

Объект TButton представляет собой окно с заголовком; он

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

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

ляют выбор между "OK" и "Cancel". Панель диалога, при появлении,

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

захватывает и обрабатывает все события, включая нажатия кнопки.

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

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

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

мощью клавиши Enter.

Набор

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

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

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

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

рованы с объектами TLabel, что позволяет выбирать элемент

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

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

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

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

ровки. Для активизации элементов управления в наборе могут быть

использованы клавиши курсора и кнопки "мыши".

Кнопки с зависимой фиксацией - это специальные наборы, в ко-

торых может быть выбран лишь один элемент управления. Каждый

последующий выбор отменяет текущий. Кнопки с независимой фиксаци-

ей - это наборы, в которых может быть указано включенными любое

число элементов управления.

Меню

Класс TMenuView и два его порождения - классы TMenuBar и

Turbo Vision для С++ = 102 =

TMenuBox, предоставляют основные классы для создания вертикальных

меню и вложенных до любого уровня подменю. Вы представляете стро-

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

сокращениями) вместе с командами, ассоциированными с каждой ко-

мандой. Методы handleEvent управляют механизмом выбора команды

меню с помощью "мыши" и/или клавиатуры (включая букву - сокраще-

ние и управляющую клавишу).

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

класса TMenuBar, находящегося во владении класса TApplication.

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

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

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

TApplication::initMenuBar подходящим набором вложенных вызовов

new NewSubMenu,new NewItem и new NewLine, Turbo Vision создает,

выдает на экране изображение требуемых меню и взаимодействует с

ними.

Протоколы

Абстрактный класс THistory реализует механизм подбора

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

historyId, предоставляют каждому объекту THistory связанный с ним

объект TInputLine и имя (идентификатор) списка предыдущих элемен-

тов в строке ввода. Объект THistory функционирует в сочетании с

объектами THistoryWindow и THistoryViewer.

Строки ввода

Объект TInputLine - это специализированный отображаемый объ-

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

да. Он обрабатывает все обычные события: ввод с клавиатуры и пе-

ремещениt курсора (включая клавиши Home и End). Он выполняет опе-

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

томатическое управление формой курсора. Для выделения в окно от-

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

Просмотр списков

Класс TListViewer - это абстрактный базовый тип, от которого

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

как TListBox. Поля и методы класса TListViewer позволяют получить

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

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

выполнение выбора элементов списка с выделением с помощью кнопок

"мыши" или клавиш клавиатуры. Метод draw осуществляет изменение

размеров и прокрутку содержимого списков. Класс TListViewer имеет

Turbo Vision для С++ = 103 =

виртуальный метод getText, поэтому вы должны разработать механизм

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

жаться на экране.

Класс TListBox, порожденный от класса TListViewer, реализует

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

ражения таких списков строк как имена файлов. Объекты TListBox

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

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

ки прокрутки. Строки горизонтальной прокрутки классом TListViewer

не поддерживаются. Наследуемые методы и классы TListViewer позво-

ляют выбрать (и выделять) элементы списков с помощью "мыши" и

клавиатуры. Класс TListBox имеет дополнительное поле list, указы-

вающее на класс коллекции - TCollection. Он обеспечивает создание

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

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

Классы, реализующие прокрутку

Класс TScroller - это прокручиваемый отображаемый объект,

который служит "воротами" в другой более крупный "фоновый" отоб-

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

или действиях с объектами, ассоциированными с TScrollBar. Объекты

прокрутки имеют два поля, hScrollbar и vScrollbar, определяющие

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

Поле delta класса TScroller определяет величину прокрутки по осям

x и y в соответствии с полями в ассоциированных строках прокрут-

ки.

Классы TScrollBar допускают управление либо вертикальной,

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

ляются value (положение бегунка строки прокрутки), PgStep (вели-

чина прокрутки в соответствии с нажатием кнопки "мыши" или клавиш

PgUp и PgDn) и arStep (величина прокрутки в соответствии с нажа-

тием кнопки "мыши" или клавиш со стрелками).

Элемент прокрутки и его строка прокрутки обычно принадлежат

объекту TWindow, что влечет за собой обработку сложного набора

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

соответствующее обновление изображения прокрутчиком. Значения

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

Текстовые устройства

Классы TTextDevice - это средство просмотра текста/драйвер

устройства с прокруткой типа TTY. Кроме полей и методов, наследу-

емых от класса TScroller, класс TTеxtDevice определяет виртуаль-

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

Объект TTextDevice является лишь базовым типом для порождения

действительных терминальных драйверов. Объект TTextDevice исполь-

зует конструктор и деструктор класса TScroller.

Turbo Vision для С++ = 104 =

Класс TTerminal реализует терминал ввода-вывода с буферными

устройствами чтения и записи строк. Размер буфера определяется

при инициализации.

Статический текст

Классы TStaticText - это простые отображаемые объекты,

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

полем text. Они игнорируют все передаваемые в них события. Класса

TLabel добавляет данному классу такое свойство, что отображаемый

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

нажатия кнопки "мыши", клавиши курсора или клавиш Alt с сокращен-

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

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

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

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

элемента управления вызывает выделение метки так же как и элемен-

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

Строки состояния

Класс TStatusLine предназначен для вывода различной информа-

ции о состоянии и подсказок (помощи). Вывод обычно выполняется в

нижней строке экрана. Строка состояния - это полоса с высотой в

один символ и с любой длиной вплоть до ширины экрана. Объект реа-

лизует динамический вывод на экран "отражения" различных событий,

происходящих в выполняемой прикладной программе. Элементы в стро-

ке состояния могут быть выбраны с помощью "мыши" или оперативных

клавиш аналогично классам TLabel. Большинство классов в приклад-

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

TMenuBar, TDeskTop и TStatusLine. Добавляемые в TStatusLine поля

реализуют указатели на items и defs.

Поле items указывает на текущий связанный список записей

TStatusItem. Этот список содержит список выводимых строк, список

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

ле defs указывает на связанный список записей PStatusDef, исполь-

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

вы можете выводить только короткие мнемонические сокращения ("на-

меки"). TStatusLine может быть задано и инициализировано

TApplication::initStatusLine.

Turbo Vision для С++ = 105 =

Потоки

-----------------------------------------------------------------

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

вода. При традиционной организации операции ввода-вывода в файлы

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

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

доставляемых Turbo Vision, вы можете создавать, используя

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

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

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

Благодаря классу TStreamableClass, Turbo Vision поддерживает

обработчик потока, который позволяет вводить и выводить объекты в

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

ределенных специально для класса TStreamableClass. Они использу-

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

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

работчик потока. Это осуществляется при помощи макроса __link;

например : __link( RClasName ... );

Это дает вам возможность вводить и выводить объекты типа

TClasName в поток. Этот процесс называется регистрацией класса.

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

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

матически, без вашего участия.

Потоки объектов работают с стандартными классами C++

streambuf, используемыми для обеспечения iostream. Это значит,

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

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

классов.

Коллекции

Класс TCollection реализует обобщенное множество объектов,

включая произвольные объекты различных типов. В отличие от масси-

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

ция библиотеки Turbo Vision допускает динамическое задание разме-

ров. Класс Collection - это абстрактная основа для более специа-

лизированных коллекций, таких как TSortedCollection. Главным яв-

ляется поле items, (void**) - указатель на массив элементов. По-

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

TCollection предоставляет ряд программ итерации. Коллекция может

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

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

мощью метода forEach вы можете также инициировать определенные

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

Примечание. TNSCollection - базовый класс для TCollection, но вы

должны использовать TCollection. Это касается и

TSortedCollection и TNSSortedCollection. Почему это

Turbo Vision для С++ = 106 =

так объясняется ниже.

Отсортированные коллекции

Класс TSortedCollection реализует коллекции, которые сорти-

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

абстрактной (пустой) функцией compare. Следовательно, ваши порож-

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

ций любого типа. Функция insert добавляет элементы для реализации

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

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

добавление объектов происходит если логическое поле данных

duplicates установлено в True.

Строковые коллекции

Класс TStringCollection является простым расширением TSor-

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

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

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

Метод freeItem удаляет заданный элемент-строку из коллекции.

Ресурсы

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

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

ковые ключи. Чтобы не порождать файлы ресурсов из класса TStream,

TResourceFile имеет поле stream, ассоциирующее поток с файлом

ресурсов. Доступ к пунктам ресурсов осуществляется через обраще-

ние к get(key), где key - это строковый индекс. Данный класс пре-

доставляет также метод put (хранение элемента с заданным ключом).

keyAt (получение индекса заданного элемента), flush (запись всех

изменений в поток), remove (удаление элемента с заданным ключом)

и count (возврат числа элементов в файле).

Коллекции ресурсов

Класс TResourceCollection реализует коллекции отсортирован-

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

класса TStringCollection - freeItem и keyOf - являются переопре-

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

Строковые списки

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

строкового ресурса, в котором доступ к строкам осуществляется че-

рез числовой индекс с помощью функции get. Поле count хранит

Turbo Vision для С++ = 107 =

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

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

программ. Чтение строковых списков может выполняться из потока с

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

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

Объект TStringList обеспечивает доступ к существующим стро-

ковым спискам с числовыми индексами. Объект TStrListMaker имеет

функцию put для добавления строк в строковый список и операторы

>> и << для сохранения строковых списков в потоке.

Turbo Vision для С++ = 108 =