
- •Часть 1. Введение в turbo vision...............................14
- •Глава 1. Наследование велосипеда...............................14
- •Глава 2. Разработка прикладных программ с использованием
- •Часть 2. Глава 3. Иерархия классов..........................88
- •Глава 4. Отображаемые элементы................................108
- •Глава 5. Программирование, управляемое событиями..............143
- •Глава 6. Разработка надежных программ.........................170
- •Глава 7. Коллекции............................................177
- •Глава 8. Объекты, хранимые с потоками.........................199
- •Глава 9. Ресурсы..............................................211
- •Часть 1. Введение в turbo vision
- •Глава 1. Наследование велосипеда
- •Глава 2. Разработка прикладных программ
- •Часть 2. Глава 3. Иерархия классов
- •Глава 4. Отображаемые элементы
- •Глава 5. Программирование, управляемое событиями
- •Глава 6. Разработка надежных программ
- •Глава 7. Коллекции
- •Глава 8. Объекты, хранимые с потоками
- •Глава 9. Ресурсы
- •Глава 10. Дополнительная информация....................................5
- •Часть 3. Справочник по turbo vision...................................13
- •Глава 11. Как использовать справочник.................................13
- •Глава 12. Заголовочные файлы turbo vision.............................16
- •Глава 13. Справочник по классам.......................................35
- •Глава 10. Дополнительная информация
- •Часть 3. Справочник по turbo vision
- •Глава 11. Как использовать справочник
- •Глава 12 описывает различные заголовочные файлы Turbo
- •Глава 16 описывает в алфавитном порядке все глобальные конс-
- •Глава 12. Заголовочные файлы turbo vision
- •Глава 13. Справочник по классам
- •Глава 14. Классы редактора......................................6
- •Глава 15. Стандартные диалоговые окна..........................41
- •Глава 16. Глобальный справочник................................70
- •Глава 14. Классы редактора
- •Глава 15. Стандартные диалоговые окна
- •Глава 16. Глобальный справочник
Часть 1. Введение в turbo vision
-----------------------------------------------------------------
Глава 1. Наследование велосипеда
-----------------------------------------------------------------
Сколько в вашей последней программе было "мяса", а сколько
"костей"?
"Мясо" программы - это ее часть, непосредственно выполняющая
задачу, для решения которой она и была написана: вычисления, ма-
нипуляции с базами данных и тому подобное. Наоборот, "кости"
программы - это средства, обеспечивающие основную структуру, на
базе которой "мясо" реализуется: меню, редактируемые поля ввода,
сообщения об ошибках, поддержка "мыши" и так далее. Если ваши
программы подобны большинству других, то на разработку среды уй-
дет не меньше времени, чем на функциональное содержание. И хотя
один и тот же тип инфраструктуры программы может быть применим к
любой прикладной программе, большинство программистов, по привыч-
ке, продолжают для каждого нового проекта разрабатывать новые
очень незначительно отличающиеся редакторы полей ввода, систему
меню, обработчики событий и т.д.
Вам уже неоднократно рекомендовали ранее не стараться изоб-
ретать велосипед. Теперь вы имеете реальную возможность избежать
этого - "наследуйте" его.
Структура программы, использующей многоэкранный режим
-----------------------------------------------------------------
Библиотека Turbo Vision предоставляет многооконную оболочку,
управляемую событиями. Она является программным средством содер-
жащим только скелет программы. С помощью свойства расширяемости
объектно-ориентированного программирования на языке Турбо С++,
можно наполнить этот скелет. Turbo Vision предоставляет вам класс
прикладной программы, TAррlication, а вы на его основе создаете
собственный класс, например - MyAррlication, для поддержки своей
прикладной программы. Затем вы добавляете к нему, или заменяете в
нем необходимые детали, требующиеся для решения конкретной зада-
чи.
На самом высоком уровне этим все и исчерпывается. Функция
main вашей программы будет выглядеть следующим образом:
int main()
{
TMyAрр myAрр;
myAрр.run(); // создание экземпляра ...
return 0; // запуск его!
}
Turbo Vision для С++ = 15 =
Подразумеваемые конструкторы и деструкторы берут на себя все
функции обслуживания: инициализацию объектов и их уничтожение.
Новый взгляд на разработку прикладных программ
-----------------------------------------------------------------
Возможно, вы имели опыт работы с библиотеками функций языка
Си, и на первый взгляд Turbo Vision покажется вам похожей на тра-
диционные библиотеки. Кроме всего прочего, эти библиотеки также
могут использоваться для обеспечения работы с меню, окнами,
"мышью" и т.д. Но за этим кажущимся сходством стоит их существен-
ное различие, которое нужно сразу прояснить, чтобы не пришлось
преодолевать трудные концептуальные барьеры.
В первую очередь, не следует забывать, что вы имеете дело с
объектно-ориентированным программированием. В традиционном струк-
турном программировании, если какое-либо средство, как, например,
система меню, не удовлетворяет вашим потребностям, то вы модифи-
цируете исходный текст программы, пока не получите требуемого.
Это довольно смелый шаг, и обратный ход здесь возможен лишь в том
случае,если вы точно запомнили исходный текст. Более того, изме-
нение исходного текста (особенно написанного другим разработчи-
ком) может повлечь внесение неприятных технических погрешностей в
подсистему, которые могут иметь далеко идущие последствия.
При использовании же Turbo Vision вам никогда не придется
модифицировать имеющийся исходный текст. Изменения в Turbo Vision
производятся путем расширения. Класс прикладной программы
TAррlication остается неизменным внутри библиотеки TV.LIB. Вы бу-
дете делать добавления к нему, создавая новые типы классов и
вносить нужные изменения путем замены имеющихся функций на новые,
которые вы разрабатываете для новых объектов.
Кроме того, Turbo Vision представляет собой иерархическую
структуру, а не разобщенный набор отдельных средств. Его можно
использовать только целиком, а не по частям. Все компоненты Turbo
Vision архитектурно взаимосвязаны и все они взаимодействуют друг
с другом множеством взаимосвязанных способов. Не стоит пытаться
вычленить из него, например, поддержку "мыши" - это сложнее, чем
создание новой системы поддержки "мыши".
В основе философии разработки Turbo Vision лежат две следую-
щие рекомендации: полное использование объектно-ориентированной
техники и работа с комплексом библиотеки Turbo Vision в ее
собственных понятиях. Это означает "игру по правилам" Turbo
Vision и использование ее составных типов объектов так, как это в
ней предусмотрено. Мы создавали программное средство Turbo
Vision, чтобы избавить пользователей от огромного объема ненужной
повторяющейся работы и предоставить им проверенную основу для
разработки прикладных программ, которой можно доверять. Пре-
доставьте Turbo Vision работать в вашей программе и вы извлечете
из этого максимум пользы.
Turbo Vision для С++ = 16 =
Элементы прикладной программы, построенной в Turbo Vision
-----------------------------------------------------------------
Рассмотрим, для начала, какие средства предоставляет Turbo
Vision для разработки прикладных программ.
Именование частей
-----------------
Прикладная программа, использующая Turbo Vision, представля-
ет собой взаимодействующее множество отображаемых объектов, собы-
тий и неотображаемых объектов.
Отображаемые объекты
Отображаемый объект - это любой объект программы, изображае-
мый на экране. В контексте Turbo Vision отображаемый объект - это
то, что вы можете увидеть на экране. Поля, названия полей, рамки,
строки прокрутки и меню, - все это отображаемые объекты. Отобра-
жаемые объекты могут объединяться и образовывать более сложные
объекты, такие как окна и панели диалога. Такие объединенные
отображаемые объекты называются групповыми объектами, и они функ-
ционируют вместе, как единый отображаемый объект. Группы факти-
чески являются специализированными отображаемыми объектами, кото-
рые могут содержать в себе другие отображаемые объекты, называе-
мые отображаемыми подобъектами. Группы даже могут содержать в се-
бе другие группы, порождая цепочки отображаемых объектов и по-
добъектов. Ниже вы увидите, как включить отображаемый объект в
группу, которая реализована в прикладной программе.
Отображаемые объекты всегда имеют прямоугольную форму, и в
частности, это могут быть и прямоугольники, содержащие один сим-
вол, а также строки в один символ высотой или шириной.
Примечание: Подробная информация о отображаемых объекта содер-
жится в главе 4.
События
Событием является то, на что должна отреагировать ваша прог-
рамма. События поступают от клавиатуры, от "мыши" или из других
частей Turbo Vision. Например, нажатие клавиши, (как и кнопки
"мыши") - это событие. События помещаются в очередь, затем обра-
батываются в порядке поступления обработчиком. Такой обработчик
имеется в классе TAррlication, являющемся телом вашей прикладной
программы. С помощью механизма, описание которого будет дано ни-
же, события, которые не были обработаны в TAррlication, переда-
ются другим отображаемым объектам, имеющимся в программе, и так
до тех пор, пока не будет найден нужный обработчик событий или
пока не возникнет ошибочная ситуация.
Turbo Vision для С++ = 17 =
Например, нажатие клавиши F1 вызывает справочную систему.
Если каждый отображаемый объект имеет свою собственную точку вхо-
да в справочную систему (что имеет место в системе контекстной
помощи), то нажатие клавиши F1 обрабатывается обработчиком собы-
тий главной программы. Обычные алфавитно-цифровые клавиши или
клавиши редактирования строк, наоборот, должны обрабатываться с
помощью отображаемого объекта, который в настоящий момент нахо-
дится в "фокусе" (активен), т.е. объекта, с которым пользователь
работает в данный момент.
Примечание: Подробнее о событиях см. в главе 5.
Неотображаемые объекты
Неотображаемыми называются любые объекты программы, не явля-
ющиеся отображаемыми. Они называются не отображаемыми на экране,
т.к. непосредственно не взаимодействуют с экраном. Они выполняют
вычисления, осуществляют связь с периферийными устройствами и в
целом реализуют функции прикладной программы. Если неотображаемо-
му объекту потребуется вывести какую-либо информацию на экран, то
это делается с помощью отображаемого объекта. Эта концепция явля-
ется очень важной для поддержания строгого порядка в прикладных
программах Turbo Vision: с экраном взаимодействуют только отобра-
жаемые объекты.
Ничто не может, однако, помешать "безгласным" объектам вы-
полнить вывод на экран с помощью функции рrintf или операто-
ра <<. Но при этом, если вы выводите текст на дисплей са-
мостоятельно,то это повлечет разрушение текста, выводимого
Turbo Vision, и текст, который выводит на экран Turbo
Vision, может затереть ваш "отступнический" текст (например,
с помощью перемещения или изменения размеров окон).
Turbo Vision для С++ = 18 =
Общие подходы
Поскольку Turbo Vision разработан для реализации стандарти-
зованного, рационального подхода к построению интерфейса, то ваши
прикладные программы обретут похожий вид. Этот вид идентичен виду
интерфейса различных интегрированных сред фирмы Borland и базиру-
ется на многолетнем опыте и проверках их использования. Наличие
общего и доступного для понимания подхода к интерфейсу прикладной
программы является большим преимуществом для вас и ваших пользо-
вателей: Несмотря на любую сложность и "закрытость" задач вашей
программы, способ работы с ней будет всегда вам знаком и процесс
работы с ней легок и прост.
На рисунке 1.1 показан ряд общих элементов, которые могут
быть частью прикладной программы, созданной с использованием
Turbo Vision. Рабочая область - это заштрихованный фон, на кото-
ром отображаются объекты прикладной программы. Как и все осталь-
ные элементы Turbo Vision, рабочая область является объектом.
Объектами являются также линейное меню в верхней части экрана и
строка состояния в его нижней части. Команды в строковом меню
соответствуют меню, которые "раскрываются" вниз (вертикальные ме-
ню) с помощью "мыши" или нажатия соответствующих управляющих кла-
виш.
Примечание: Подробнее об этом см. в главе 4.
┌──────────────────────────────────────┐
│ Линейное меню │
├──────────────────────────────────────┤
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░ Рабочая область░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
├──────────────────────────────────────┤
│ Строка состояния │
└──────────────────────────────────────┘
Рисунок 1.1. Расположение элементов Turbo Vision на экране.
Текст, который появляется в строке состояния, предназначен
для вас, и, обычно, там выдаются сообщения о текущем состоянии
вашей прикладной программы, показываются имеющиеся управляющие
клавиши или подсказки о командах, которые доступны пользователям
в данный момент.
Когда открывается вертикальное меню, то указатель может пе-
ремещаться вверх и вниз по командам этого меню в соответствии с
перемещением "мыши" или курсора. Когда вы нажимаете клавишу Enter
или левую кнопку "мыши", то выбирается команда меню, которая была
выделена в это время. При ее выборе производится передача управ-
ления в какую-либо часть программы.
Turbo Vision для С++ = 19 =
Связь программы с пользователями обычно осуществляется через
окно или несколько окон или панели диалога, которые отображаются
в рабочей области на экране и исчезают в соответствии с командами
от "мыши" или с клавиатуры. Turbo Vision располагает большим
ассортиментом алгоритмов работы с окнами по вводу и изображению
информации на экране. Внутренние поля окон можно сделать прокру-
чиваемыми, и тогда они будут служить "воротами" в более крупные
изображения данных, такие как файлы документов. Прокрутка окна по
данным выполняется перемещением бегунка строки-прокрутки в нижней
части экрана, в его правой части или в обеих этих частях. Бегунок
строки-прокрутки указывает положение окна относительно совокуп-
ности изображаемых на экране данных.
Диалоговые окна часто содержат кнопки, которые реализованы
как выделенные цветом слова, которые выбираются с помощью "мыши"
(или с помощью клавиш "табуляция" и "пробел"). В ответ на нажа-
тие, "кнопки" вдавливаются (как настоящие кнопки) и могут реали-
зовать передачу команд прикладной программе.
Turbo Vision для С++ = 20 =
Программа "Hello, World!" в стиле Turbo Vision
-----------------------------------------------------------------
Традиционным способом демонстрации применения любого нового
языка или пакета, реализующего интерфейс с пользователем, явля-
ется представление программы "Hello, World" ("Здравствуй, мир"),
написанной с помощью рассматриваемых средств. Эта программа обыч-
но включает лишь элемент, достаточный для изображения на экране
строки "Hello, World" и возврата управления в DOS.
Turbo Vision предоставляет другой способ представления выра-
жения "Hello, World!".
Классическая программа "Hello, World" не является интерак-
тивной (она "говорит", но не "слушает"), а Turbo Vision является
средством для разработки интерактивных программ.
Примечание: программа "Hello, World" содержится в файле HELLO.CPP
на дистрибутивных дисках.
Простейшая прикладная программа, созданная с использованием
Turbo Vision, гораздо сложнее, чем выражение рrintf, заключенное
между { и }. В сравнении с классической программой "Hello, World"
программа HELLO.CPP на Turbo Vision выполняет массу операций, в
т.ч.:
- очистку рабочей области экрана по полутоновому шаблону;
- изображение строкового меню и строки состояния в верхней и
нижней частях экрана;
- установку обработчика событий от клавиатуры и "мыши";
- построение объекта меню "за кулисами" и присоединение его к
строке меню;
- построение диалогового окна также "за кулисами";
- связь диалогового окна с меню;
- ожидание нажатий клавиш и событий от "мыши".
В этом перечне не содержится информация о выводе текста на
экран. Некоторый текст был подготовлен, но это было сделано
на заднем плане в ожидании его вызова по команде. При изуче-
нии Turbo Vision следует иметь в виду: суть программирования
с использованием Turbo Vision заключается в разработке требу-
емого вида интерфейса и его обработки команд. Turbo Vision -
"скелет" программы - позаботится о передаче команд нужным
частям вашей программы. Вам же останется лишь определить, что
конкретно должно быть сделано после нажатия клавиши на клави-
атуре, кнопки "мыши" или выбора команды меню.
Turbo Vision для С++ = 21 =
Таким образом "мясом" вашей программы является та ее часть,
которая выполняет функциональную обработку принимаемых от пользо-
вателя команд - и эта "мясная" часть содержится в создаваемых
отображаемых объектах.
Turbo Vision для С++ = 22 =
Запуск программы HELLO.CPP
Прежде, чем провести детальный анализ программы HELLO.CPP,
следует ее загрузить, откомпилировать и посмотреть, как она рабо-
тает.
При этом Hello очистит экран и создает рабочую область, как
показанную на Рис.1.2. В этой области нет открытых окон, а в ли-
нейном меню в верхней части экрана появляется лишь один элемент:
команда Hello. Обратите внимание, что буква "H" в слове Hello вы-
делена особым цветом, а в строке состояния находится сообщение:
Alt-X Exit.
┌──────────────────────────────────────┐
│ Hello │
├──────────────────────────────────────┤
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
├──────────────────────────────────────┤
│ Alt-X Exit │
└──────────────────────────────────────┘
Рисунок 1.2. Начальный экран программы HELLO.CPP.
Здесь следует отметить два общих правила программирования в
любой пользовательской среде: никогда не заставляйте пользовате-
ля размышлять о том, что же ему делать дальше, а также всегда
предоставляйте пользователю путь движения вперед и путь к отступ-
лению. Перед тем, как начать какие-либо операции, пользователь
программы Hello имеет две четкие возможности: либо выбрать пункт
меню Hello, либо нажать клавишу Alt-X, чтобы выйти из программы.
Появление разворачивающегося меню на экране
Имея в виду предыдущие замечания, выберите в строковом меню
команду Hello. Это можно сделать тремя следующими способами:
- поместите указатель "мыши" над Hello и нажмите ее левую кноп-
ку;
- нажмите клавишу F10, чтобы установить курсор на линейное ме-
ню, выделив при этом слово Hello. Затем нажмите клавишу
Enter, чтобы выбрать Hello.
- нажмите Alt-H, где H - это выделенная буква в команде Hello.
Во всех трех случаях разворачивающееся меню появится ниже
пункта меню Hello. Это вам, как программисту на языке Turbo C++
Turbo Vision для С++ = 23 =
или Borland C++, должно быть знакомо. Выполнив эти операции, вы
убедитесь в том, что в библиотеке Turbo Vision учтены все согла-
шения интегрированных сред фирмы Borland.
Появившееся меню показано на рис.1.3. В нем содержится всего
две команды, разделенных отдельной линией. Однако, в общем слу-
чае, в них может располагаться любое число команд, ограниченных
лишь размером экрана.
┌──────────────────┐
│░░Greeting...░░░░░│
├──────────────────┤
│ Alt-X Exit │
└──────────────────┘
Рисунок 1.3. Меню программы HELLO.CPP.
Вы можете сделать выбор команды меню либо с помощью клавиа-
туры, либо с помощью "мыши". С помощью клавиш управления курсором
указатель можно перемещать по меню вверх и вниз. Выбор отмеченно-
го пункта с клавиатуры производится нажатием клавиши Enter. Выбор
же команды меню с помощью "мыши" происходит интереснее: вы должны
"захватить" указатель меню, нажав левую кнопку "мыши" в тот мо-
мент, когда ее указатель окажется над ним и удержать ее в этом
положении. При этом, пока вы держите кнопку в нажатом состоянии,
вы можете перемещать маркер вверх и вниз по меню. Выбор команды
меню производится повторным нажатием кнопки "мыши" в тот момент,
когда маркер будет находиться над нужным пунктом.
Turbo Vision для С++ = 24 =
Панель диалога
Выбранный любым способом пункт меню Greeting вызывает появ-
ление прямоугольного окна, называемого панелью диалога, как пока-
зано на рис. 1.4. Панель диалога появится в центре экрана, однако
вы сможете перемещать ее, подведя для этого указатель "мыши" к
верхней границе этого окна, нажав левую кнопку "мыши" и передви-
гая "мышь", удерживая при этом кнопку в нажатом состоянии. Как
только вы отпустите кнопку, панель диалога остановится в данном
месте и там останется.
Примечание: Многоточие (...) после пункта меню используется для
обозначения, что данный пункт вызывает появление па-
нели диалога.
╔═[■]══════Hello, World!═══════════════╗
║ ║
║ Terrific ║
║ ──────────────┘║
║ OK ║
║ How are you? ──────────────┘║
║ Lousy ║
║ ──────────────┘║
║ Cancel ║
║ ──────────────┘║
╚══════════════════════════════════════╝
Рисунок 1.4. Панель диалога программы "Hello, World!".
Диалоговое окно содержит заголовок "Hello, World!", а также
кнопку в левом верхнем углу. При указании "мышью" на этот знак,
панель диалога закрывается и исчезает с экрана. Внутри панели ди-
алога помещена короткая строка текста: "How are you?" ("Как пожи-
ваете?"). Она является примером статичного текста, т.е. текста,
который можно прочесть, но который не имеет интерактивного значе-
ния. Другими словами, статичный текст используется для описания
других объектов, и при активации его ничего не произойдет.
Кнопки
Наиболее интересными элементами панели диалога "Hello,
World!" являются четыре прямоугольника в его правой части. Они
называются кнопками и являются примерами элементов управления.
Они называются элементами управления, т.к. напоминают элементы
управления электронных приборов. Каждая кнопка имеет метку, ука-
зывающую, что произойдет при ее нажатии.
Нажатие кнопки производится с помощью "мыши" или приведением
ее в состояние по умолчанию (что описано ниже) и последующим на-
жатием клавиши Enter. Попробуйте "нажать" одну из кнопок с по-
мощью "мыши" (поместив на нее указатель "мыши" и нажав при этому
клавишу "мыши") и посмотрите, что произойдет: кнопка передвинется
Turbo Vision для С++ = 25 =
вправо на одну позицию и ее тень исчезнет. Создается иллюзия, что
прямоугольную кнопку нажимают в направлении вниз к экрану. Когда
вы отпустите клавишу "мыши", то выполнится действие, соответству-
ющее отжатой кнопке.
Обратите внимание на то, что метка кнопки Cancel (отмена)
имеет цвет, отличный от других меток. Это означает, что кнопка
Cancel является в данный момент кнопкой управления, используемой
по умолчанию в панели диалога. Если в этом случае вы нажмете кла-
вишу Enter, то фактически нажмете кнопку Cancel.
Примечание: В монохромных системах кнопки, используемые по умол-
чанию, обозначаются с помощью символов ">> <<".
Управляющая кнопка, используемая по умолчанию в панели диа-
лога, может быть изменена нажатием клавиши Tab (табуляция). Поп-
робуйте проделать это с панелью диалога "Hello, World!". Отличи-
тельные цвета для кнопки по умолчанию переходят от одной кнопки к
другой при каждом нажатии клавиши Tab. Это позволяет пользователю
нажимать кнопку, не пользуясь "мышью", а перемещая цвет кнопки,
используемой по умолчанию, к выбранной кнопке с помощью клавиши
Tab и нажимая затем клавишу Enter или "Пробел" для "нажатия кноп-
ки".
Примите во внимание, что манипуляции "мышью" вне панели диа-
лога (например, обращение к меню) ни к чему не приводят, пока
блок диалога активен. Блок диалога контролирует dct!
Выход из программы
Нажатие любой кнопки, в панели диалога Hello, убирает панель
диалога и оставляет рабочую область пустой. Вы снова можете выб-
рать меню Hello и вызвать панель диалога сколько угодно раз. Для
того, чтобы выйти из программы, можно либо выбрать команду Exit
меню Hello, либо нажать клавишу Alt-X - сокращенный вариант ко-
манды Exit. Имейте в виду, что этот вариант представлен как в ме-
ню Hello, так и в строке состояния в нижней части экрана.
Следует придерживаться такого правила: Всегда обеспечивайте
пользователю простой выход из программы. Некоторые рассеян-
ные пользователи, вполне вероятно,не смогут найти выход и
попытаются перезагрузить компьютер, чем помешают закрыть
файлы прикладной программы или выполнить другие завершающие
операции перед выходом из программы.
Turbo Vision для С++ = 26 =
Структура программы HELLO.CPP
-----------------------------------------------------------------
Мы рассмотрели ход выполнения программы Hello после ее за-
пуска. Каким же образом реализуется выполнение программы? Большая
часть программы Hello унаследована из определенных ранее объектов
в Turbo Vision. Причем унаследована настолько значительная часть
программы, что принципы ее реализации могут показаться таинствен-
ными. Пошаговое выполнение программы с помощью интегрированного
отладчика не даст полной картины, т.к. Turbo Vision функционирует
в виде оттранслированной библиотеки. К счастью, если вы уловите
суть работы программы, то знание точных принципов ее реализации
не потребуется.
Чтобы понять принципы работы программы Turbo Vision, следует
помнить, что она представляет собой множество совместно работаю-
щих объектов. Определите главные объекты и постарайтесь понять
принципы их совместной работы. Затем проследите, как второстепен-
ные объекты поддерживают более крупные объекты.
Перед тем как изучать методику, следует понять определения
классов в прилагаемых файлах заголовков *.H. Важно понять, что
содержится в объекте и как он соотносится с другими объектами в
системе.
Класс прикладной программы
"Краеугольным камнем" любой прикладной программы является
класс TAррlication. Хотя, фактически, вы никогда в явном виде не
создаете объекты типа TAррlication. Как наследник TGrouр,
TAррlication - это групповой объект, который знает как владеть и
управлять динамическими цепочками отображаемых объектов, таких
как, например, меню или окна программы или другими отображаемыми
подобъектами. Класс TAррlication сама по себе не обеспечивает вы-
полнение программы. Вы используете TAррlication как базовый
класс. Из него вы порождаете класс, содержащий суть вашей
программы - ее "мясо". Лишь один экземпляр такого прикладного
класса необходим для конкретной программы. В программе Hello этим
производным классом является THelloAрр, объявленный следующим об-
разом:
class THelloAрр : рublic TAррlication
{
рublic:
THelloAрр(); // конструктор
virtual void handleEvent ( TEvent& event );
static TMenuBar *initMenuBar (TRect r);
static TStatusLine *initStatusLine (TRect r);
рrivate:
Turbo Vision для С++ = 27 =
void greetingBox();
};
В более сложных программах определения классов следует раз-
мещать в заголовочных файлах *.H , а соответствующие описания - в
файлах *.CPP .
Конечно, объект THelloAрр содержит не просто конструктор и
четыре функции-элемента (в дальнейшем просто метод); порожденный
класс наследует все свойства своего базового класса (а тот, в
свою очередь, - своего непосредственного базового класса, и так
далее). При создании объекта THelloAрр вы определяете также его
отличия от предшественника TAррlication. Все не переопределенные
свойства наследуются из TAррlication в неизменном виде.
Мы сейчас оставляем в стороне обсуждение конструктора и
предлагаем обзор четырех методов, определенных в THelloAрр. Эти
методы, в том или ином виде, присутствуют, практически, в любой
прикладной программе:
1. Функционирование прикладной программы определяется тем на
какие события она реагирует и как это происходит. Для
обеспечения реакции на события вы должны определить метод
handleEvent. Виртуальный метод handleEvent наследуется из
класса TAррlication (через его базовый класс TProgramm) для
работы с событиями, которые происходят в ходе выполнения лю-
бой программы, однако вы всегда должны переопределять обра-
ботчик событий, специфичных для вашей собственной прикладной
программы.
2. Статический метод initMenuBar возвращает указатель на объект
TMenuBar. Она задает меню для вашей программы (напомним, что
строковое меню располагается в верхней строке экрана).
TAррlication поддерживает саму работу меню, но не содержит
команд; если вам требуются меню, то вы должны определить ме-
тод initMenuBar для их создания. Впоследствии будет видно,
как конструктор THelloAрр вызывает метод initMenuBar и вклю-
чает полученный из него объект TMenuBar в группу прикладной
программы.
3. Аналогично, статический метод initStatusLine возвращает ука-
затель на TStatusLine, чтобы обеспечить текст в строке
состояния в нижней части экрана. В ней обычно сообщается о
текущем состоянии прикладной программы, дается информация о
управляющих клавишах или напоминается о действиях, которые
должен предпринять пользователь. Как и в случае с
initMenuBar, конструктор THelloAрр вызывает initStatusLine и
включает полученный из нее объект TStatusLine в групповой
объект вашей прикладной программы.
Частный метод greetingBox вызывает появление диалогового окна после выбора пункта меню Greeting. Этот метод вызывается только из метода handleEvent в ответ на событие, инициированное выбором команды меню Greeting с помощью "мыши" или нажатия клавиш. В более совершенных прикладных программах имеются отдельные функции для отклика на каждый пункт меню, определенный в первоначальном меню.
Итак, методы класса THelloAрр служат для реализации всех возможностей объектов вашей программы: конструктор для установки программы, "механизм" (обработчик событий) для распознавания событий и методы, для реакции на эти события. Эти три "средства" вы
и должны всегда добавлять к классам, порожденным из класса
TAррlication.
Объект "панель диалога"
Другим важным объектом, используемым в программе Hello, яв-
ляется объект "панель диалога", т.к. эта панель не выполняет ка-
ких-либо специальных функций, то в Hello используется просто эк-
земпляр класса TDialog. Обычно, порождать новый класс из TDialog
нет необходимости, хотя бывают случаи, когда это может оказаться
полезным.
Сам по себе класс TDialog не содержит интерактивных элемен-
тов. Он представляет собой лишь шаблон: с его помощью вы задаете,
какие поля (или элементы управления) нужны для взаимодействия с
пользователем.
Функция THelloAрр::greetingBox создает объект класса
TDialog, "вставляя" в него четыре кнопки, которые являются отоб-
ражаемыми объектами Turbo Vision. (Напомним, что все объекты
программы, выводящие хоть какие-то изображения на экран, являются
отображаемыми объектами Turbo Vision!) Это обычная ситуация при
использовании диалоговых окон. Обычно, вы просто "вставляете" в
них элементы управления, которые хотите использовать. Все же
остальное, что должно находиться в панели диалога (включая обра-
ботчик событий), реализовано в классе TDialog.
Turbo Vision для С++ = 29 =
Ход выполнения и отладки программы
Т.к. программы, написанные с использованием Turbo Vision,
управляются событиями, их структура несколько отличается от обыч-
ных программ. Особенностью программ, управляемых событиями, явля-
ется отделение структур управления, которые выполняют чтение и
обработку входных данных пользователя (и других событий), от про-
цедур и функций, которые воздействуют на эти входные данные.
Обычные программы, как правило, содержат много отдельных
программных блоков, каждый из которых предусматривает получение
входных данных, затем определяет, какой части программы они ад-
ресованы и выполняют вызов соответствующего фрагмента (фрагмен-
тов) для обработки этих данных, а затем повторяет все эти опера-
ции. Кроме того, фрагмент, завершающий обработку входных данных,
должен получить информацию о месте передачи управления для следу-
ющего этапа ввода.
Программы, управляемые событиями, наоборот, имеют централи-
зованный механизм диспетчеризации событий. Таким образом, большая
часть программы не заботится о выборке входных данных и, поэтому,
их использование не будет составлять большой проблемы. Ваши функ-
ции просто ждут, когда центральный диспетчер передаст их на обра-
ботку. Это имеет большое значение для отладки программ, так как
вы должны изменить свою стратегию отладки, устанавливая контроль-
ные точки в функциях обработки событий для проверки диспетчериза-
ции сообщений; в фрагментах программы, реагирующих на происходя-
щие события, чтобы проверить правильность их функционирования.
Примечание: Более детально об отладке программ, написанных с по-
мощью Turbo Vision, см. в главе 10.
Turbo Vision для С++ = 30 =
Функция main прикладной программы HELLO
-----------------------------------------------------------------
На самом высоком уровне, функция main всех прикладных прог-
рамм, написанных с использованием Turbo Vision, выглядит подобно
функции main в программе HELLO:
int main()
{
THelloAрр helloWorld;
helloWorld.run();
return 0;
}
Давайте разберем тело main более подробно.
Создание экземпляра прикладной программы
Первое выражение объявляет экземпляр THelloAрр с именем
helloWorld. Оно вызывает конструктор THelloAрр::THelloAрр для
создания и инициализации объекта helloWorld. Игнорируя внешние
детали, можно сказать, что конструктор THelloAрр переключает об-
ращения к базовым конструкторам вниз по иерархии классов Turbo
Vision от TObject (базовый класс Turbo Vision) к TView, к TGrouр,
к TProgram, к TAррlication и, наконец, к THelloAрр. Этот поток
нисходящей деятельности устанавливает большое количество условий
по умолчанию и механизмов, которые реализуют стандартные интер-
фейсы большинства прикладных программ. (Опытным программистам,
желающим разрабатывать нестандартные интерфейсы, необходимо изу-
чить и освоить соответствующие конструкторы классов, описанные в
главе 13.) Прямым результатом всего этого будет то, что
helloWorld - главный программный объект, начнет свое существова-
ние с чистой, полноэкранной, полутоновой рабочей области.
Конструктор TProgram вызывает initMenuBar и initStatusLine,
чтобы проинициализировать конкретные меню строки состояния и
программы HELLO, которые вы видели ранее. Важнейшие шаги таковы:
// упрощенный пример конструкторов классов TProgram и TProgInit
menuBar = initMenuBar(); // Получим указатель на menuBar
if (menuBar != 0 )
insert( menuBar); // Вставим его в список отображаемых
// объектов прикладной программы
statusLine = initStatusLine(); // Получим указатель на statusLine
if (statusLine != 0 )
insert( statusLine); // Вставим и его в список
// отображаемых объектов
На данном этапе важно получить общее представление об этих
операциях. Исходный текст для THelloAрр::initMenuBar и THelloAрр
::initStatusLine показывает основную стратегию. В главе 2 мы объ-
Turbo Vision для С++ = 31 =
ясним более подробно, как создавать строковое меню и связанные с
ним подменю и команды вместе со строкой состояния, ее текстом и
командами.
Достаточно интересно использовать интегрированный отладчик,
чтобы выполнить HELLO.EXE в пошаговом режиме и посмотреть, что
получится на дисплее. После вызова конструктора рабочая область,
строковое меню и строка состояния будут полностью представлены на
экране и готовы для использования в методе helloWorld.run.
Метод run
Почти вся "таинственность" прикладной программы, написанной
с использованием Turbo Vision, заключается в методе run главной
программы. Таинственность начинается с момента, когда вы загляне-
те в THelloAрр в поисках определения run. Его здесь нет, потому
что метод run целиком унаследован из базового класса THelloAрр -
TAррlication, через его базовый класс - TProgram. TProgram::run
вызывает метод execute, которая находится там, где большую часть
времени будет находиться программа. Этот метод состоит из двойно-
го цикла do..while, в упрощенном виде показано ниже:
ushort TGouр::execute()
{
do {
endState = 0;
do {
TEvent event;
getEvent ( event );
handleEvent ( event );
} while ( endState == 0 );
} while ( !valid(endState ) );
return endState;
}
Не вдаваясь в детали, вы можете видеть, что прикладная прог-
рамма, созданная с использованием Turbo Vision, циклически прохо-
дит через две задачи: получение события через метод getEvent
(если это событие действительно представляет какое-либо действие)
и обслуживание этого события через метод handleEvent. В какой-то
момент одно из этих событий разрешает команду выхода, и цикл за-
вершается.
Примечание: Подробнее об обработке событий см. в главе 5.
Деструктор прикладной программы
Явного деструктора, определенного в HELLO.CPP, не существу-
ет. Когда программа завершается, объект helloAрр и связанные с
ним отображаемые объекты (строка меню, строка состояния и рабочая
Turbo Vision для С++ = 32 =
область) уничтожаются (освобождается, выделенная под них память)
путем автоматических вызовов деструкторов базовых классов в по-
рядке, обратном тому, который использовался при вызове конструк-
торов. Наконец, отключаются обработчик ошибок и драйверы Turbo
Vision. В целом, от вас не требуется специального завершения ра-
боты с объектами Turbo Vision.
Резюме
-----------------------------------------------------------------
В данной главе вы, в первом приближении, были ознакомлены
(мы надеемся, и заинтригованы) с программным средством Turbo
Vision. Вы узнали о взаимодействии объектов в структуре, управля-
емой событиями, и получили представление о средствах, предостав-
ляемых Turbo Vision.
Теперь вы можете с достаточной уверенностью попытаться моди-
фицировать программу HELLO.CPP, чтобы она могла выполнять и дру-
гие функции. Вы можете это легко сделать. Turbo Vision предостав-
ляет возможность свободного изменения программ с минимальными
усилиями с вашей стороны.
В следующей главе вы ознакомитесь с этапами создания прог-
раммы, с использованием Turbo Vision, на основе предлагаемого на-
ми "скелета" программы.
Turbo Vision для С++ = 33 =