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

Часть 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 =