Четвертый Borland C++ и его окружение

         

Цветовое выделение синтаксиса


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

и атрибуты шрифта. По умолчанию цветовое выделение синтаксиса

разрешено. Чтобы отключить его, выберите Options Enviroment Syntax Highlighting и отмените Use Syntax Highlighting. Выделение

синтаксиса действует для файлов .CPP, .C, .H и .HPP. Эти расширения перечислены в Syntax Extension. Вы можете расширить или сократить этот список.

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

Options Enviroment Syntax Highlighting и одну из четырех цветовых

схем. Можно также задать выделение синтаксиса вручную:

Выберите Options Enviroment Syntax Highlighting Customize.

Справа в диалоговом окне Options Enviroment выводится пример исходного кода.

Выберите из списка элементов элемент, который вы хотите

модифицировать, или щелкните "мышью" на элементе (при этом

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

Выберите цвет для элемента. Цвет элемента в примере будет

отражать изменения. Для выбора фонового цвета элемента используйте правую кнопку "мыши", а основного - левую.

Если требуется, выберите атрибут.



- D -


Debug into switch ignored for .COM files


Предупреждение утилиты TLINK



(параметр отладочной информации для файлов .COM игнорируется)

Borland C++ не включает отладочную информацию в файлы .COM.

См. описание параметра /v.

Debug information in module модуль will be ignored


Предупреждение утилиты TLINK

(информация для отладки в модуле модуль будет игнорироваться)

Объектные файлы, скомпилированные с включением отладочной

информации, теперь содержат запись о версии. Основная версия в

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

компоновщик TLINK, поэтому компоновщик не может сгенерировать

отладочную информацию для данного модуля.

Debug information overflow; try fewer modules withDebug info


Сообщение об ошибке утилиты TLINK

(переполнение отладочной информации; попробуйте включать отладочную информацию в меньшее число модулей)

Слишком много участвующих в компоновке модулей содержат отладочную информацию. Перекомпилируйте программу с меньшим объемом

отладочной информации.

DeclarationDoes not specify a tag or an identifier


Сообщение об ошибке этапа компиляции

(описание не определяет идентификатор или признак)

Это описание ничего не описывает. Это может быть структура

или объединение без признака, либо переменная в описании. С++

требует, чтобы что-то описывалось.

Declaration is not allowed here


Сообщение об ошибке этапа компиляции

(объявление здесь недопустимо)

Объявления не могут использоваться в управляющих операторах

для операторов while, for,Do. if или switch.

Declaration missing ;


Сообщение об ошибке этапа компиляции

(в объявлении отсутствует ;)

В исходном файле содержится объявление поля структуры или

объединения, в котором отсутствует точка с запятой (;).

Declaration syntax error


Сообщение об ошибке этапа компиляции

(синтаксическая ошибка в объявлении)

Исходный файл содержит объявление, в котором отсутствует некоторый символ имя или наоборот имеются лишние.

Declaration terminated incorrectiy


Сообщение об ошибке этапа компиляции




(неправильное окончание объявления)

Объявление содержит лишний или неверный конечный символ,

например, точка с запятой, помещенная после тела функции. Эту

ошибку также дает функция-элемент С++, объявленная в классе с

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

скобкой.

Declaration was expected



Сообщение об ошибке этапа компиляции

(требуется объявление)

Требуется, но не найдено объявление. Это обычно бывает при

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

Declare operatorDelete (void*) or (void*, size_t)

Сообщение об ошибке этапа компиляции

(описание операцииDelete (void*) или (void*, size_t))

Описание операцииDelete с единственным параметром void* или

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

Глобальная операцияDelete может описываться только в форме с одним параметром.

Declare operatorDelete[] (void*) or (void*, size_t)

Сообщение об ошибке этапа компиляции

(описание операцииDelete[] (void*) или (void*, size_t))

Опишите операторDelete с один параметром void и параметром

типа type size_t.

Declare type тип ptior to use in prototype



Предупреждение этапа компиляции

(описание типа тип перед использованием в прототипе)

Когда прототип функции ссылается на не описанный ранее тип

структуры, то описание в прототипе не эквивалентно описанию вне

прототипа. Например:

int func(struct S *ps)

struct s{ /* ... */ }

Так как в области действия прототипа для функции func нет

структуры s, типом параметра ps будет указатель на неопределенную

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

Далее это приведет к предупреждениям и сообщениям об ошибках

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

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

или добавить перед любым прототипом, который ссылается на структуру s, неполное описание типа struct s;. Если параметром функции



является struct, а не указатель на struct, то неполное описание

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

прототипом.

Default argument value redeclared



Сообщение об ошибке этапа компиляции

(переопределение заданного по умолчанию значения аргумента)

Когда для параметра функции С++ описывается значение по

умолчанию, это значение не может описываться заново, изменяться

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

Default argument value redeclared for parameter параметр



Сообщение об ошибке этапа компиляции:

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

Когда описанный параметр функции С++ имеет используемое по

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

Default expression may not use local variable

Сообщение об ошибке этапа компиляции

(используемое по умолчанию значение не может использовать

локальную переменную)

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

Default outside of switch

Сообщение об ошибке этапа компиляции

(операторDefault вне оператора switch)

Компилятор обнаружил ключевое словоDefault вне оператора

switch. Обычно это вызывается пропущенной фигурной скобкой.

Default value missing



Сообщение об ошибке этапа компиляции

(пропущено используемое по умолчанию значение)

Если в функции С++ объявляется параметр со значением по

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

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

умолчанию следует параметр без умолчания.

Default value missing following parameter параметр



Сообщение об ошибке этапа компиляции

(после параметра пропущено используемое по умолчанию значение)

Все параметры после первого параметра с используемым по

умолчанию значением также должны иметь заданные по умолчанию значения.

DefineDirective needs an identifier

Сообщение об ошибке этапа компиляции



(директивеDefine необходим идентификатор)

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

символы.

symbolDefined in module модуль isDuplicated



Ошибка или предупреждение утилиты TLINK

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

Имеется конфликт между двумя идентификаторами (общими или

общедоступными). Обычно это означает, что идентификатор определен

в двух модулях. Если обе из них обнаружены в файлах .OBJ, возникает ошибка, так как TLINK не знает, какой из них является допустимым. Если TLINK обнаруживает один из дублируемых идентификаторов в библиотеке, а другой - файле .OBJ, то выводится предупреждение. В этом случае TLINK использует один из файлов .OBJ.

Delete array size missing ]



Сообщение об ошибке этапа компиляции

(в спецификаторе массива пропущена ])

В спецификаторе массива в операции даты пропущена скобка ].

Destructor cannot beDeclared const or volatile



Сообщение об ошибке этапа компиляции

(деструктор не может описываться как const или volatile)

Деструктор описан как const и/или volatile, а это не допускается.

Destructor cannot have a return type specification

Сообщение об ошибке этапа компиляции

(деструктор не может иметь спецификации типа возврата)

Деструкторы С++ не имеют типа возврата, и вы не можете объявить тип или значение возврата.

Destructor for класс is not accessible



Сообщение об ошибке этапа компиляции

(деструктор для класса недоступен)

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

private и недоступен из данной точки для разрушения класса. Если

деструктор класса является частным (private), класс не может быть

разрушен и потому не может никогда быть использован. Это наверняка ошибка. Защищенный деструктор (protected) допускает доступ

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

производных классов.

Destructor for класс required in conditional expression





Сообщение об ошибке этапа компиляции

( в условном выражении потребовался деструктор класса класс)

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

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

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

явно в виде имя_класса(значение_1,значение_2), либо неявно, некоторыми другими кодами программы. Измените код, чтобы избавиться

от этого временного значения.

Destructor name must match the class name



Сообщение об ошибке этапа компиляции

(имя деструктора должно соответствовать имени класса)

В классах С++ объявление деструктора класса вводится символом тильда (~). Имя деструктора должно совпадать с именем класса.

В вашем исходном файле ~ предшествует какому-то другому имени.

Divide error



Сообщение об ошибке этапа выполнения

(ошибка деления)

Вы пытаетесь разделить целое значение на 0, например:

int n = 0;

n = 2 / n;

Вы можете перехватить эту ошибку с помощью сигнальной функции. В противном случае Borland C++ вызывает функцию abort, и

программа завершает работу.

Division by zero



Сообщение об ошибке этапа компиляции

(деление на ноль)

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

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

Division by zero



Предупреждение этапа компиляции

(деление на ноль)

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

делителя литеральный ноль.

Division by zero



Сообщение об ошибке утилиты MAKE

(деление на ноль)

Деление или остаток в операторе !if имеет нулевой делитель.

Do statement must have while



Сообщение об ошибке этапа компиляции

(операторDo должен иметь while)

В исходном файле встретился операторDo без соответствующего

ограничивающего ключевого слова while.

имя_файлаDoes not exist -Don't know how to make it



Фатальная ошибка утилиты MAKE

(файл не существует - неизвестно, как его сформировать)

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



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

имя файла.

DOS error, ax = число



Сообщение об ошибке утилиты TLINK

(ошибкаDOS, ax = число)

Это происходит, еслиDOS возвращает непредвиденную ошибку. В

результирующем коде ошибки выводится значение регистра ax. Это

может говорить об ошибкеDOS или внутренней ошибке TLINK. Единственными вызовамиDOS, при которых TLINK может приводить к данной

ошибке, являются read, write, seek и close.

Do-whlle statement missing (



Сообщение об ошибке этапа компиляции

(в оператореDo-while отсутствует ()

В оператореDo компилятор не нашел после ключевого слова

while левой круглой скобки.

Do-whlle statement missing )

Сообщение об ошибке этапа компиляции (в оператореDo-while отсутствует ))

В оператореDo компилятор не нашел после условного выражения

правой круглой скобки.

Do-whlle statement missing ;

Сообщение об ошибке этапа компиляции

(в оператореDo-while отсутствует ;)

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

с запятой после правой круглой скобки.

Dublicate case



Сообщение об ошибке этапа компиляции

(повторение case)

Каждое ключевое слово case оператора switch должно иметь

уникальное значение выражения-константы.

Duplicate Handler for type тип1, already had тип2



Сообщение об ошибке этапа компиляции:

(обработчик для типа1 дублируется; уже задан для типа2)

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

Duplicate ordinal for exports: строка (знач1) and строка(знач2)

Предупреждение утилиты TLINK

(В операторе export дублируется номер)

Две экспортируемые функции, перечисленные в секции EXPORTS

файла определения модуля определяют то же внутреннее имя, но разное порядковое значение. Задайте одно значение или удалите одну

из них.


Данные сообщения и обработка сообщений


В 32-битовом коде Windows вам требуется изменить способ распаковки данных сообщения из lParam и wParam. В Win32 wParam вырастает в размере с 16 до 32 бит, в то время как lParam сохраняет

размер 32 бита. Так как lParam в 16-разрядной Windows часто содержит описатель и другое значение, а в Win32 описатель увеличивается до 32 бит, необходима новая схема упаковки wParam и lParam.

В качестве примера сообщения, на которое влияют изменения в

размере параметра, можно привести WM_COMMAND. В Windows 3.x

wParam содержит 16-битовый идентификатор, а lParam - 16-битовый

описатель окна и 16-битовую команду.

В Win32 lParam содержит только 32-битовый описатель окна.

16-битовая команда перемещается из lParam в младшие 16 бит

wParam, а старшие 16 бит wParam содержат идентификатор. Эта новая

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

Обработчик сообщений предоставляет переносимый способ извлечения сообщений из wParam и lParam. В зависимости от вашей среды

(16-битовой Windows или Win32) обработчики сообщений используют

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



Действия, выполняемые по точкам останова


Кнопка с зависимой фиксацией Action в диалоговом окне Conditions and Actions позволяет задать действия, выполняемые по точке

останова.

Break Break приводит к тому, что при срабатывании точки останова

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

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

Execute Execute приводит к выполнению выражения (выражение запрашивается в поле ввода Action Expression). Выражение должно иметь

некоторые побочные эффекты, например, присваивание значения переменной. Эта возможность позволяет вам включить выражение, которое

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

номером ("вставка кода"). Такое средство полезно использовать,

когда вы хотите изменить поведение подпрограммы, чтобы проверить

"диагноз" или скорректировать ошибку. Это позволяет при проверке

минимальных изменений в программе не выполнять цикл компиляции и

компоновки.

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

окне Log. Вам выводится подсказка. В ответ на нее вы должны ввести выражение, значение которого требуется зарегистрировать. Будьте внимательны, чтобы выражение не имело никаких неожиданных побочных эффектов.

Enable group Enable group позволяет вновь активизировать запрещенную ранее группу точек останова. Укажите в поле ввода Action Expression

номер группы.

Disable group Disable group позволяет запретить группу точек останова. При

запрещении группы точек останова они не стираются, а просто маскируются на время сеанса отладки. Укажите в поле ввода Action Expression номер группы.



Декорированные окна-рамки


Декорированные окна-рамки инкапсулируются в TDecoratedFrame

(класс, производный от TFrameWindow и TLayoutWindow). Декорированные окна-рамки обеспечивают все функциональные возможности

окон-рамок и окон разметки, но кроме них поддерживают дополнительные управляющие элементы (декорирующие элементы) и автоматически настраивают дочерние окна соответственно размещению дополнительных элементов.



Дерево меню


Ниже показана полная структуру спускающихся меню отладчика

TD.

= File Edit View Run Breakpoints Data Options Window Help

Run

Run F9

Go to cursor F4

Trace Into F7

Step Over F8

= (System) Execute to... Alt+F9

Until Return Alt+F8

Repaint Desktop Animate...

Restore Standard Back Trace Alt+F4

Instruction Trace Alt+F7

About...

Arguments...

Program reset Ctrl+F2

Next pending status

Wait for child Yes

File

Open...

Attach

Change Dir...

Get Info... Breakpoints

OS Shell

Toggle F2

At... Alt+F2

Changed memory global...

Expression true global...

Quit Alt-X Handware Breakpoint...

Delete all

View

Data

Breakpoints

Stack Inspect...

Log Evaluate/modify... Ctrl+F4

Watches Add watch... Ctrl+F7

Variables Function return

Module... F3

File...

CPU

Dump

Registers Module...

Numeric Processor Dump

Execution History File...

Hierarchy

Threads

Windows messages

Clipboard

Another >

Options

Window

Language... Source

Macros > Zoom F5

Display options... Next F6

Path for source... Next pane Tab

Set Restart Options... Size/move Ctrl+F5

Save options... Iconsize/restore

Restore options... Close Alt+F3

Undo close Alt+F6

User screen Atl+F5

1 First open window

Create... Alt = (2-9 open windows)

Stop recording Alt - Window pick...

Remove

Delete all

Help

Edit Index Shift+F1

Previous topic Alt+F1

Copy Shift+F3 Help on help

Paste Shift+F4

Copy to Log

Dump pane to log

Назад | Содержание | Вперед



Деструкторы


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

класса, созданные перед этим конструктором, очищая значения и освобождая память. Деструкторы наследуют имена своих классов, с добавлением лидирующего знака тильда '~':

class sber_bank {

private:

double big_bucks;

public:

sber_bank(double bucks); < Конструктор

~sber_bank(void); < Деструктор

void deposit(double bucks);

double withdraw(double bucks);

};

В объявленном выше классе деструктор определяется так:

Селектор

Используемый класс Имя деструктора

v v v

sber_bank :: ~sber_bank(void)

{

printf("Машина останавливается \n");

}

Деструктор также можно объявлять встроенным:

class sber_bank {

private:

double big_bucks;

public:

// Встроенный конструктор

sber_bank(double bucks) { big_bucks = bucks; }

// Встроенный деструктор

~sber_bank(void) {printf("Машина останавливается ...\n");}

void deposit(double bucks);

double withdraw(double bucks);

};



Диагностические макрокоманды


Для отладки программного кода С++ предусмотрен ряд макрокоманд, которые находятся в check.h. Их можно использовать в Windows и DOS. Существует два типа макрокоманд - заданные по умолчанию (CHECK, PRECONDITION, TRACE и WARN) и расширенные (CHECKX, PRECONDITIONX, TRACEX и WARNX).

Заданные по умолчанию макрокоманды предусматривают простую

проверку значений и вывод сообщений. Расширенные макрокоманды

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

Управлять расширением диагностических макрокоманд можно с

помощью трех предопределенных идентификаторов препроцессора:

__DEBUG__, __TRACE и __WARN. Если при компиляции определяется

один из этих идентификаторов (с помощью параметра -D), то расширяются соответствующие макрокоманды, и генерируется диагностический код.

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

__DEBUG=1 __DEBUG=2 __TRACE _WARN

PRECONDITION Ч Ч

PRECONDITIONX Ч Ч

CHECK Ч

CHECKX Ч

TRACE Ч

TRACEX Ч

WARN Ч

WARNXЧ

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

разместите в ее важнейших точках диагностические макрокоманды и

скомпилируйте а разрешением соответствующего идентификатора. Диагностическая версия библиотек классов строится аналогично.



Диалоговые блоки открытия файлов


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

приложений для открытия файлов. TOpenSaveDialog::TData имеет несколько элементов которые перед построением объекта диалогового

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

значений или с помощью конструктора TOpenSaveDialog::TData.

Элемент TData Описание

FileName Имя выбранного файла. На входе задает исполь-

зуемое по умолчанию имя файла, на выходе -

имя выбранного файла.

Filter Фильтры имени файла и фильтр-шаблоны имеет

форму:

фильтр фильтр шаблон ...

где "фильтр" - это текстовая строка, описывающая фильтр, а шаблон фильтра - трафарет имени файла DOS.

CustomFile Позволяет задать специальные фильтры.
FilterIndex Определяет, какой из фильтров (Filter) следует

выводить по умолчанию.

InitialDir Каталог, который должен выводиться при открытии файлового диалогового окна.
DelExt Заданное по умолчанию расширение, добавляемое

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



Диалоговые блоки печати


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

ориентацию страницы, размер бумаги и т.д.

Элементы данных TPrintDialog::TData позволяет вам управлять

внешним видом и поведением общих диалоговых окон печати.

Элемент TData Описание

FromPage Первая страница вывода, если задан флаг

PG_PAGENUMS. На входе определяет заданную по умолчанию первую страницу. На выходе задает первую страницу, выбранную пользователю.

ToPage Последняя страница вывода, если установлен

флаг PG_PAGENUMS. На входе определяет заданную по умолчанию последнюю страницу. На выходе задает выбранный пользователем номер последней страницы.

MinPage Наименьшее число страниц, которые может выбрать пользователь.
MaxPage Наибольшее число страниц, которые может выбрать пользователь.
Copies Число печатаемых копий. На входе задает

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

Назад | Содержание | Вперед



Диалоговые блоки поиска и замены


Общие диалоговые окна поиска и замены позволяет вам искать и

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

обладают достаточной гибкостью и могут использоваться для документов и баз данных. Проще всего использовать эти диалоговые блоки с помощью классов редактируемых управляющих элементов TEditSearch и TEditFile. Они реализуют редактируемые управляющие элементы поиска и замены.

Так как диалоговые блоки поиска и замены являются безрежимными, указатель на них обычно сохраняется в элементах данных объекта родительского окна. Это облегчает связь с ними. Строит и

создавать блоки поиск и замены следует в ответ на команду (например, команду меню Search Finf и Search Replace). При этом выводится диалоговый блок, где пользователь может вводить информацию

поиска.

TFindReplaceDialog::TData имеет стандартные элементы данных

Flags, плюс элементы данных, содержащие строки поиска и замены.

Так как блоки поиска и замены являются безрежимными, они взаимодействуют с объектом родительского окна, используя зарегистрированное сообщение FINDMSGSTRING. Вы должны написать функцию реакции на это сообщение. Эта функция воспринимает два параметра WPARAM и LPARAM и возвращает LRESULT. Параметр LPARAM содержит указатель, который вы должны передавать функции-элементу UpdateData.

После вызова UpdateData нужно проверить FR_DIALOGTERM. Этот

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

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

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

Пока вы можете обновлять флаг FR_DIALOGTERM, вы может обрабатывать сообщение FINDMSGSTRING, выполняя фактический поиск. Это

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

сложный поиск в таблице Paradox или dBASE.

Общие диалоговые блоки имеют командную кнопку Find Next

(найти следующий), которую пользователи могут активизировать при

выводе диалогового блока. Большинство приложений также имеют команду Find Next в меню Search, так что пользователь может найти

следующее вхождение за один шаг, не открывая диалогового блока.

Те же функциональные возможности предлагают TFindDialog и TReplaceDialog.



Диалоговые блоки сохранения файла


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

приложений для сохранения файлов, используемых в этих приложениях. TOpenSaveDialog::TData используется диалоговыми окнами открытия и сохранения файлов.



Диалоговые блоки ввода


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

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

но обычно они являются режимными. С объектами диалоговых блоков

связан ресурс диалогового блока, который находится в файле сценария ресурса inputdia.rc. Файл ресурса вашего приложения должен

включать в себя этот файл.

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

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

текст ввода. Когда пользователь выбирает OK или нажимает Enter,

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



Диалоговые блоки выбора цвета


Общие диалоговые блоки выбора цвета позволяют вам выбирать и

создавать используемые в приложениях цвета. TChooseColorDialog::TData имеет несколько элементов типа TColor и TColor*, которые перед построением объекта диалогового блока нужно инициализировать. Color задает выбранный цвет. При выполнении диалогового

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

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

указатель на 16 специальных цветов. На входе он задает используемые по умолчанию цвета, а на выходе - выбранные пользователем

цвета.



Диалоговые блоки выбора шрифтов


Общие диалоговые блоки выбора шрифтов позволяют вам выбрать

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

и т.д. TChooseFontsDialog::TData имеет несколько элементов которые перед построением объекта диалогового блока нужно инициализировать.

Элемент TData Описание

DC Описатель контекста устройства принтера, шрифты которого вы хотите выбрать при задании флага CF_PRINTERFONTS в Flags.
LogFont Описатель LOGFONT, который задает внешний вид

шрифта. При выполнении диалогового блока и задании флага CF_INITTOLOGFONTSTRUCT диалоговое окно выводится с заданным шрифтом.

PointSize Размер выбранного шрифта (в 1/10 пункта). На

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

Color Цвет выбранного шрифта, если установлен флаг

CF_EFFECT. На входе устанавливает цвет выбранного шрифта, а на выходе - цвет, выбранный пользователем.

Style Позволяет задать стиль диалога.
FontType Набор флагов, описывающих стили выбранного

шрифта. Устанавливается только на выходе.

SizeMin
SizeMax
Задает минимум и максимум размера (в пунктах), который может выбирать пользователь при установке флага CF_LIMITSIZE.



Динамическая компоновка


Когда приложение использует функцию из статически компонуемой библиотеки (например, библиотеки исполняющей системы Си), копия этой функции связывается с вашим приложением на этапе компоновки (компоновщиком TLINK). Два одновременно работающих приложения, использующих одну и ту же функцию, будут иметь собственную

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

единственную ее копию. Такую возможность дают динамически компонуемые библиотеки. При динамической компоновке внешние ссылки

разрешаются на этапе выполнения.

Когда программа использует функцию из DLL, эта функция не

компонуется с файлом .EXE. При динамической компоновке используется другой метод. Во-первых, на этапе компоновке TLINK связывает

с вашим файлом .EXE записи импорта (содержащие информацию о DLL и

адресе процедуры). Это временно разрешает в вашей программе внешние ссылки на функции DLL. Данные записи импорта обеспечиваются

файлами определения модуля или библиотеками импорта. На этапе выполнения информация записи импорта используется для поиска и привязки к вашей программе функции DLL.

Благодаря динамической компоновке ваши приложения имеют

меньший размер, так как с ними не компонуется код функций. А поскольку код DLL и ресурсы совместно используются несколькими приложениями, это экономит системную память.



Динамическое использование свободной памяти (операции new и delete)


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

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

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

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

Хотя в С++ можно использовать функции динамического распределения памяти языка Си, такие, как malloc, однако, С++ содержит некоторые мощные расширения, которые облегчают и делают более надежным динамическое распределение и освобождение объектов.

Речь идет о функциях, которые можно использовать для распределения динамической памяти, - new и delete. Работа с этими функциями

строится в стиле операций:

операция new

v

double *d = new double;

delete d;

^

операция delete

Важность операции new заключается в возможности следить за размерами выделяемой памяти, в соответствии с используемыми типами. Без

вспомогательной информации, из вышеприведенного примера ясно, что выделено восемь байт для указателя типа double.

Сравните функции new и delete с функциями Си malloc() и free():

В Си указывается

размер C++ (размер не указывается)

v

double *d = malloc(8); double *d = new double;

free(d); delete d;

char *q = malloc(sizeof(int)*10); char *q = new int[10];

free(q); delete[10] q;

Если память выделяется для массива, а не для типа данных со

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

new объект[размер]

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

целых чисел с именем counts, используйте вызов:

counts = new int [100];

Использование new и delete не только надежней, но и удобней. Они

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

Однако, если динамический объект создан с помощью оператора new,

то программист несет ответственность за его освобождение, так как С++

"не знает", нужен ли еще этот объект. Для освобождения памяти можно

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


Еще раз уточним, что delete имеет следующий синтаксис:

delete указатель;

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

new для выделения памяти.



Директива !error


Директива выдачи сообщения об ошибке (!error) указывает утилите MAKE, что нужно прервать выполнение и отобразить диагностическое сообщение о неисправимой ошибке, содержащее текст после

директивы !error. Данная директива имеет формат:

!error произвольный_текст

Данная директива предназначена для включения в директивы условного выполнения, чтобы заданное пользователем условие определения ошибки могло бы прервать выполнение утилиты MAKE. Например,

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

!if !$d(MODEL)

# если MODEL не определена

!error MODEL не определена

!endif

Если при подходе к данной точке директива MODEL еще не была определена, то утилита MAKE прекращает выполнение с выдачей следующего сообщения об ошибке:

Fatal makefile 4: Error directive: MODEL не определена



Директива отмены макроопределения


Директива отмены макроопределения (!undef) указывает на необходимость отмены любого определения для заданного макрокоманда.

Если в настоящий момент данная макрокоманда не определен, то данная директива действовать не будет. Директива имеет следующий

синтаксис:

!undef имя_макрокоманды

Назад | Содержание | Вперед



Директива .PATH.расширение


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

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

файла. Например, если в формирующем файле имеются следующие строки:

.PATH.c = C:\CSOURCE

.c.obj:

BCC -c $*

tmр.exe: tmр.obj

BCC tmр.obj

то утилита MAKE будет искать файл TMP.C, который является неявно

заданным исходным файлом для создания файла TMP.OBJ, в каталоге

C:\CSOURCE, а не в текущем каталоге.

Директива .PATH также является макрокомандой, которая содержит значение имени маршрута. Ниже приводится пример использования

этой директивы. Исходные файлы содержатся в одном каталоге, объектные файлы - в другом, а все выполняемые файлы - в текущем каталоге.

.PATH.c = C:\CSOURCE

.PATH.obj = C:\OBJS

.c.obj:

BCC -c -o$(.PATH.obj)\$& $<

obj.exe: tmр.obj

BCC -e$&.exe $<

tmр.exe: tmр.obj



Директива .precious


Директива .precious имеет следующий синтаксис:

.precious:целевой_файл[...]

где "целевой_файл" - это один или более целевых файлов. Директива

.precious указывает утилите MAKE, что целевой файл удалять не

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

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

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

программы Winsdows выполнение администратора ресурсов завершается

неудачно, то выполняемый файл .EXE удалять не следует.



Директива .suffixes


В следующем примере MYPROG.OBJ можно создать из файлов

MYPROG.ASM, MYPROG.CPP и MYPROG.C:

myprog.exe: myprog.obj:

tlink mprog.obj

.asm.obj:

tasm /mx $<

.cpp.obj:

bcc -p $<

.c.obj:

bcc -p- $<

Если доступно более одного из этих исходных файлов, директива .suffixes определяет, какой из них будет использоваться. Директива .suffixes имеет следующий синтаксис:

.suffixes: .исх_расшир...

где ".исх_расшир" - это список расширений, для которых имеются

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

Например, если мы добавим .suffixes: .asm .c .cpp в начало

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

файл MYPROG.ASM, MYPROG..C и наконец MYPROG.CPP.



Директива включения файлов


Директива включения файлов (!include) задает файл, который

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

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

следующую форму:

!include имя_файла

Возможен любой уровень вложенности этих директив. Если директива включения файла пытается включить какой-либо файл, который уже был включен на некотором внешнем уровне вложения (таким образом, что может начаться бесконечный цикл вложения), то внутренняя директива включения игнорируется как ошибочная.

Как можно использовать эту директиву? Предположим, что вы

создали файл MODEL.MAC, который содержит следующие строки:

!if !$d(MODEL)

MODEL = m

!endif

Вы можете использовать представленное условное (используемое

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

формирующем файле, задав следующую директиву:

!include "MODEL.MAC"

Когда утилита MAKE обнаруживает директиву !include, она открывает заданный файл и считывает его содержимое, как если бы

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

файла.



Директивы ассемблирования


В операторах встроенного ассемблирования Borland C++ допустимы следующие директивы:

db dd dw extrn

Назад | Содержание | Вперед



Директивы MAKE


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

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

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

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

в файле описания с восклицательного знака (!), который должен являться первым символом строки. Другие начинаются с точки. Ниже

приводится полный перечень директив утилиты MAKE:



Директивы с точкой


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

ей параметр командной строки, но при этом обладает приоритетом по

сравнению с этим параметром. Например, если утилита MAKE вызывается следующей командной строкой:

make -a

но в формирующем файле содержится директива .noautodeрend, то автоматическая проверка зависимостей будет отменена.

Директива Параметр

.autodepend -a
.ignore -i
.noautodepend -a-
.noignore -i-
.nosilent -s-
.noswap -S-
.silent -s
.swap -S

Директивы .AUTODEPEND и .NOAUTODEPEND включают (задают) и

выключают (отменяют) автоматическую проверку зависимостей. Они

соответствуют параметру -a командной строки.

Директивы .IGNORE и .NOIGNORE указывают утилите MAKE, что

нужно игнорировать возвращаемое программой значение, примерно так

же, как это делает префикс - перед командой вызова программы (он

описан ранее). Эти директивы соответствуют параметру -l командной

строки.

Директивы .SILENT и .NOSILENT указывают утилите MAKE, следует ли отображать команды перед их выполнением. Они соответствуют

параметру -s командной строки.

Директивы .SWAP и .NOSWAP указывают утилите MAKE, нужно выгружать себя из памяти или нет. Они соответствуют параметру -S командной строки.



Директивы условного выполнения


Директивы условного выполнения (!if, !elif, !else и !endif)

предоставляют вам определенную степень гибкости при конструировании формирующих файлов. Правила и макрокоманды можно сделать условными, поэтому, используя в командной строке макроопределения (с помощью параметра -D), можно задавать или отменять интерпретацию определенных разделов формирующих файла.

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

Си, ассемблере и Паскале:

!if выражение

[строки]

.

.

.

!endif

!if выражение

[строки]

.

.

.

!else

[строки]

.

.

.

!endif

!if выражение

[строки]

.

.

.

!elif выражение

[строки]

.

.

.

!endif

!ifdef макрокоманда

[строки]

.

.

.

!endif выражение

[строки]

!ifndef макрокоманда

[строки]

.

.

.

!endif выражение

[строки]

где [строки] могут представлять собой один из следующих типов

операторов:

макроопределение;

явное правило;

неявное правило;

директива включения файла include;

группа оператора if;

директива выдачи сообщения об ошибке error;

директива отмены макроопределения undef.

Директивы условного выполнения образуют группу, которая состоит как минимум из открывающей группу директивы !if и завершающей группу директивы !endif.

в группе может присутствовать только одна директива !else.

директивы !elif могут располагаться между директивами !if и else.

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

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

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

одного исходного файла.

Всем директивам !if внутри одного исходного файла должны соответствовать директивы !endif. Таким образом, следующее включение файла является неверным вне зависимости от того, какое содержание имеет файл, включающий данный, поскольку в нем не

содержится парная директива !endif:

!if $(FILE_COUNT) > 5

какие-либо правила

!else

другие правила

<конец файла>

Еще один способ определения макрокоманды предоставляет директива !ifdef. Директива !ifdef MACRO эквивалентна !if

$d(MACRO). Это верно также для директивы !ifndef: директива

!ifdef MACRO эквивалентна !if $d(MACRO).



Директивы утилиты MAKE


Директива Описание

.autodeрend Включает проверку автоматических зависимостей.
!elif Условное выполнение.
!else Условное выполнение.
!endif Условное выполнение.
!error Указывает, что утилита MAKE должна остановиться и

выдать сообщение об ошибке.

!if Условное выполнение
.ignore Указывает, что утилита MAKE должна игнорировать

возвращаемое командой значение

!include Задает файл, который должен быть включен в формирующий файл.
.noautodepend Выключает автоматическую проверку зависимостей.
.noignore Выключает действие директивы .ignore.
.nosilent Указывает утилите MAKE, что нужно отображать команды перед их выполнением.
.noswaр Указывает утилите MAKE, что не нужно осуществлять

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

.рath.ext Задает утилите MAKE маршрут для поиска файлов

с расширением ."EXT".

.precious Указывает утилите MAKE, что целевой файл удалять

не нужно, даже при неудачном выполнении команд

построения целевого файла.

.silent Указывает утилите MAKE, что не нужно отображать

команды перед их выполнением.

.swaр Указывает утилите MAKE, что нужно осуществлять

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

.suffixes Указывает MAKE, что при неоднозначности целевого

файла нужно использовать неявное правило.

!undef Задает отмену описания заданной макрокоманды.



Добавление данных, выводимых в отображаемых элементах


Сам TView не предусматривает вывода данных. В нем отсутствует указатель на окно, нет графических функций и функций вывода

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

для чего можно использовать один из следующих методов:

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

указателя на интерфейсный объект.

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

Каждый из этих методов имеет свои преимущества и недостатки,

которые обсуждаются ниже.

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

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

к конструкторе класса отображаемого элемента экземпляр объекта.

Доступ к данным интерфейсного объекта и его функциям-элементам

можно получить через указатель.

Такой метод позволяет вам легко подключать и отключать различные интерфейсные объекты и использовать различные их типы.

Например, создав указатель TWindow*, можно использовать большинство видов интерфейсных объектов.

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

сначала через интерфейсный объект или приложение. Это вынуждает

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

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

объект приложения. В любом случае это уменьшает гибкость при обработке событий.

Смешивание TView или производного от TView объекта с производным объектом дает вам возможность вывести данные из документа

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

Чтобы создать новый производный класс, определите этот класс

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

Новый конструктор должен вызывать конструкторы обоих базовых

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

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

Этот подход имеет то преимущество, что полученный в результате отображаемый элемент будет в высокой степени интегрированным. Обработка ошибок выполняется централизованно, что уменьшает

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

интегрирована в новый класс отображаемого элемента. Однако данный

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

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

базового указателя на различные классы интерфейсных объектов.



Добавление декорирующих элементов


Для модификации атрибутов декорированных окон-рамок можно

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

Функция-элемент Insert в TDecaratedFrame дает здесь дополнительную гибкость и позволяет добавлять декорирующие элементы: строки

состояния (TControlBar), строки состояния (TStatusBar), кнопки

реквизитов (TButtonGadget) и другие управляющие элементы на базе

TWindow.



Добавление функциональных возможностей


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

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

задать какое-то полезное поведение. Следует переопределять только

виртуальные функции TView:

Функция Назначение

GetViewName Возвращает статическое имя отображаемого

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

GetWindow Возвращает TWindow* - ссылку на интерфейс-

ный объект отображаемого элемента или 0.

SetDocTitle Задает заголовок окна отображаемого элемента. Его следует задать для вызова функции SetDocTitle отображаемого элемента.

TView содержит элемент данных ViewMenu TMenuDescr*. Вы можете присвоить ему любой существующий объект TMenuDescr (описатель

меню). Меню обычно задается в конструкторе отображаемого элемента.



Добавление и удаление целей


Чтобы добавить к проекту цель, сделайте следующее:

Выберите в основном меню Project New.

Наберите имя новой цели и выберите ее тип:

Тип Описание

Standard Выполняемый файл, DLL или другой файл. Выбирается по умолчанию.
AppExpert Приложение ObjectWindows.
Source Pool Набор файлов, на которые можно ссылаться в

другой цели.

Выберите OK. Если типом цели является Standard, выводится

диалоговое окно TargetExpert, в котором можно выполнить

дальнейшее определение цели. В случае типа Source Pool

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

лы. Об AddExpert рассказывается в другом разделе.

Чтобы удалить одну или более целей:

Выделите цель и просмотрите SpeedMenu (щелкните на цели

правой кнопкой "мыши" или нажмите Alt+F10).

Выберите режим Delete.

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

целевой файл. Щелкните "мышью" на OK. Отменить это удаление нельзя.



Добавление и удаление экземпляров переменной


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

управляющих элементов. При создании экземпляра переменных ClassExpert добавляет в ваш код буфер передачи. Во время выполнения в

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

вместо проверки кода с независимой фиксацией. Чтобы связать экземпляр переменной с управляющим элементом (добавить его), сделайте следующее:

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

Щелкните правой кнопкой "мыши" на управляющем элементе и

выберите Add Instance variable.

В диалоговом окне Add Instance variable наберите имя переменной. Щелкните "мышью" на OK. ClassExpert добавляет в

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

описание структуры с записью экземпляра переменной). Переменная выделяется в конструкторе класса в файле .CPP (это

связывает класс ObjectWindows с объектом ресурса).

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

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

Чтобы удалить экземпляр переменной:

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

Щелкните на элементе правой кнопкой "мыши" и выберите Delete Instance variable.

ClassExpert удаляет из вашего кода запись в структуре,

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

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



Добавление и удаление обработчиков событий


Чтобы добавить для события обработчик событий, сделайте следующее:

Выберите класс для обработчика событий. В области событий

выводятся события.

Выберите обрабатываемое событие (вы можете расширить список событий, а затем для просмотра SpeedMenu щелкнуть правой кнопкой "мыши").

Выберите в SpeedMenu Add handler. Если вы выберите добавление обработчика для окна Message, ClassExpert добавляет

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

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

Чтобы показать, что событие обрабатывается, ClassExpert

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

Удаляется обработчик событий следующим образом:

Выберите класс для обработчика событий. События выводятся

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

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

список событий). Затем для вывода SpeedMenu щелкните на

событии правой кнопкой "мыши".

Выберите Delete handler. ClassExpert удаляет только запись

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

Код обработчика выводится в области редактирования, так

что вы можете удалить его. Если вы удалите функцию, удалите его определение из файла заголовка.



Добавление и удаление узлов


Чтобы добавить узел к проекту:

Выберите тот узел под которым вы хотите вывести новый

узел.

Нажмите клавишу Ins или щелкните на выделенном узле правой

кнопкой "мыши", затем выберите в SpeedMenu команду Add.

Выберите файл или файлы, которые нужно связать с новым узлом, или наберите имя добавляемого узла (если файл в текущем каталоге отсутствует, IDE создает его).

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

Чтобы добавить несколько узлов, запустите администратор файлов Windows и выделите файлы, которые нужно добавить к узлам вашего проекта (убедитесь, что вы можете просматривать в IDE окно

проекта). Затем буксируйте файлы из администратора файлов. Администратор проекта добавляет их под выбранным узлом.

Для удаления узла из проекта выделите его и нажмите Del либо

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

несколько узлов.



Добавление класса


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

можно увеличить число уровней. Чтобы добавить класс, сделайте следующее:

Щелкните в области классов правой кнопкой "мыши". Выводится меню Speedbar.

Выберите Create new class или щелкните "мышью" на соответствующей кнопке оперативного меню SpeedBar. Выведется

диалоговое окно Add New Class.

Выберите базовый класс ObjectWindows, из которого вы хотите создать производный класс. Нажмите Tab.

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

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

Source. Нажмите Tab.

Наберите имя определяющего класс файла заголовка. По умолчанию его имя совпадает с именем исходного файла, а расширение - это .H. Нажмите Tab.

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

выбрать идентификатор шаблона диалога. Блок списка Dialog

ID содержит идентификаторы всех диалоговых ресурсов в вашем приложении AppExpert. Если вы зададите несуществующий

идентификатор, AppExpert создает пустое диалоговое окно с

данными идентификатором, затем загружается Resource Workshop, так что вы можете определить диалоговое окно.

Если базовым классом является TFrameWindow или производный

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

нового окна-рамки.

Если базовым классом является TWindow или производный от

него класс, вы можете щелкнуть "мышью" на командной кнопке

Set Window Properties. Выводится диалоговое окно, в котором вы можете задать характеристики окна.

Чтобы добавить новый класс, щелкните "мышью" на OK.



Документы


Концепция традиционного документа и принципы Doc/View во

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

текста и иногда включает в себя графику и встроенные команды, помогающие системе обработки текста форматировать документ. Doc/View имеет свои характерные особенности:

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

Doc/View может содержать данные практически любого типа,

такие как текст, графику, звуки, файлы мультимедиа и даже

другие документы.

Второе отличие состоит в представлении данных. В то время

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

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

Последнее отличие в том, что документ из конкретной программы обработки текста в общем случае не зависит от формата, необходимого программе. Обычные документы обычно становятся переносимыми между различными системами обработки

текста после утомительного процесса преобразования. Документы Doc/View позволяют легко переносить данные между различными приложениями, даже если их базовые функции

весьма различны.

Базовые функции объекта документа обеспечивает класс TDocument.



Достижение больших выгод от объектно-ориентированного стиля


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

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

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

структуры:

char buff1[]={'a',0xff,3,'b','c'}, buff2[]={'z','y',0xff,4,'x'};

main()

{

int c1, c2;

decompressor dc1, dc2; // У нас есть ДВЕ структуры декомпрессора

decompressor_init(&dc1, buff1, sizeof(buff1));

decompressor_init(&dc2, buff2, sizeof(buff2));

do {

if ((c1 = decompressor_next(&dc1)) != -1) putchar(c1);

if ((c2 = decompressor_next(&dc2)) != -1) putchar(c2);

} while (c1 != -1 || c2 != -1);

}



Доступ к DLL и исходному коду модулей


Хотя Turbo Debugger обеспечивает прозрачное пошаговое выполнение функций DLL, вам может потребоваться доступ к DLL до того,

как программа ее вызовет (например, в ней нужно установить точки

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

помощью команды View Modules (F3) диалоговое окно Load Module Source or DLL. Это диалоговое окно перечисляет все исходные модули,

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

DLL & Programs показывает все файлы .DLL и .EXE, загруженные Windows. (При работе с TDW в нем также выводятся все загруженные

файлы .DRV и .FON.)

Символом точки (.) отмечены DLL, которые могут загружаться в

Turbo Debugger (а также DLL с отладочной информацией и исходным

кодом). Звездочка (*) показывает, что модуль загружен отладчиком.

Так как ваши программы могут загружать DLL с помощью вызова LoadLibrary, в блоке списка могут показываться не все DLL.

Если вам нужен другой модуль исходного кода, подсветите нужный модуль в списке Source Module и используйте кнопку Load (или

дважды щелкните на имени модуля "мышью"). Turbo Debugger открывает окно Module и выводит исходный код данного модуля.

Для доступа к выполняемому файлу, отличному от текущего,

откройте диалоговое окно Load Module Source or DLL Symbols (F3),

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

Symbol Load. Turbo Debugger открывает окно Module с исходным кодом первого модуля выполняемого файла.

Чтобы добавить DLL к списку, откройте указанное диалоговое

окно, активизируйте поле ввода DLL Name и введите имя соответствующей DLL. Чтобы добавить DLL к списку, нажмите кнопку Add DLL.

При выполнении по шагам функции DLL отладчик автоматически

загружает таблицу идентификаторов и исходный код этой DLL. Чтобы

предотвратить это, откройте диалоговое окно Load Module Source or

DLL Symbols (F3), подсветите в списке нужную DLL, выберите кнопку

No и щелкните "мышью" на OK. Turbo Debugger будет выполнять вызовы DLL как одну команду.



Доступ к информации о характеристике


TDocument и TView предусматривают ряд функций для доступа к

информации о характеристиках объекта Doc/View. Все эти функции

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

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

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

доступ к характеристикам.

Обычно к характеристике обращаются по индексу. Для поиска

соответствующего индекса используется функция FindProperty, которая по имени характеристики возвращает ее индекс. Обратное действие (поиск имени по индексу) выполняет функция PropertyName. Атрибуты характеристики устанавливает функция PropertyFlags, в параметре которой указывает индекс характеристики. Определить значение флага можно с помощью операции &.

Для получения и модификации значений характеристик используются функции GetProperty и SetProperty.



Доступ к управляющему элементу VBX


Непосредственный доступ к управляющему элементу VBX вы можете получить двумя способами. Первый способ состоит в получении и

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

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

функции в классе TVbxControl.



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


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

DPMI (Dos Protected Mode Interface - интерфейс защищенного режима DOS) для выполнения в защищенном режиме на машинах с процессорами 286^ 386, i486 или Pentium c не менее 640К оперативной памяти и не менее 1 Мб расширенной. Хотя Borland С++ работает в защищенном режиме, он генерирует приложения для работы в реальном

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

том, что компилятор имеет гораздо больше памяти для работы, так

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



Другие инструментальные средства WinSpector


EXEMAP, TMAPSYM и BUILDSYM представляют собой три утилиты,

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

для исключительной ситуации.



Другие параметры трассировки сообщений


Две других полезных возможности предоставляет диалоговое окно параметров трассировки сообщений Message Trace Options, одна

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

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

Обычно область Message Trace интерпретирует параметры каждого сообщения и выводит их в удобном для чтения формате

(выбирается Interpret Values). Для просмотра параметров

сообщений в шестнадцатиричном виде выберите Hex Values.

Информация о трассируемых сообщениях выводится обычно в

области трассировки сообщений Message Trace. Однако вы можете передать сообщения в файл, на принтер или дополнительный монитор. Для этого в диалоговом окне Message Trace

Options нужно выбрать Log File и выполнить одно из следующих действий:

Наберите имя файла трассировки. Если файл уже существует, информация будет добавляться к файлу.

Наберите имя устройства для вывода информации о регистрации (например, PRN).

Для вывода на дополнительный монитор наберите AUX (в

CONFIG.SYS нужно задать WINOS.SYS или OX.SYS).

Чтобы остановить регистрацию сообщений, отмените Log File.



Другие соглашения


Объекты распечатки имеют и несколько других функций-элементов, которые вы можете при необходимости переопределить. BeginPrinting и EndPrinting вызываются перед и после печати каждого документа. Печать страниц выполняется последовательно - для каждой

страницы вызывается функция PrintPage. Однако перед первым вызовом PrintPage объект распечатки вызывает BeginDocument, передавая

номера первой ли последней печатаемой страницы. Если вашему документу требуется подготовка к печати других страниц (кроме первой), переопределите BeginDocument. После печати последней страницы вызывается EndDocument. При печати нескольких копий пара GebinDocument/EndDocument может вызываться между BeginPrinting и

EndPrinting.



Другие сообщения


WM_COALESCE_FIRST WM_MDIGETACTIVE
WM_COALESCE_LAST WM_MDIICONARRRANGE
WM_COMMNOTIFY WM_MDIMAXIMIZE
WM_COMPAREITEM WM_MDINEXT
WM_DRAWITEM WM_MDIRESTORE
WM_DROPFILEW WM_MDISETMENU
WM_KEYFIRST WM_MDITILE
WM_MDIACTIVATE WM_MEASUREITEM
WM_MDICASCADE WM_NEXTDLGCTL
WM_MDICREATE WM_SYSTEMERROR
WM_MDIDESTROY



Дружественные функции


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

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

внешние функции (которые могут даже находиться вне классов), которым

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

позволяет описание friend (дружественный). Иногда можно видеть, что

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

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

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

Рассмотрим пример. Возьмем наш класс sber_bank, с приватным элементом big_bucks и добавим в него "дружественную" функцию вычисления

налога - irs:

class sber_bank {

private: // Начало раздела private

double big_bucks; // элемент private

public: // Начало раздела public

void deposit(double bucks); // Элемент public

double withdraw(double bucks); // Элемент public

friend void irs(void); // Дружественная функция irs

};

Дружественную функцию irs определим следующим образом:

void irs(void)

{

big_bucks -= big_bucks * 0.10; // Взять 10% от итога

}

Отметим, что хотя мы объявили irs() внутри класса, но она не является функцией элементом! Это достигается благодаря ключевому слову

friend. Но даже хотя этот не функция элемент, irs() может выполнить

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

Если бы функция big_bucks была элементом другого класса (например, класса free_shop), то в описании friend нужно использовать операцию разрешения области действия:

friend void free_shop::irs(void);

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

класс, для чего в описании используется ключевое слово class:

friend class check_bucks;

После этого любая функция элемент класса check_bucks может получить доступ к приватным элементам класса sber_bank. Заметим, что в

С++, как и в жизни, дружественность не транзитивна: если А является

другом для Б, а Б является другом для И, то отсюда не следует, что А

является другом для И.

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

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

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

доступа к нужным элементам.



Дружественные функции


real Используется для конвертирования двоично-десятичного числа обратно в long double.



Дружественные функции


abs Возвращает абсолютное значение комплексного числа.
acos Вычисляет арккосинус.
arg По числу в комплексной плоскости возвращает

угол в радианах.

asin Вычисляет арксинус.
atan Вычисляет арктангенс.
conj Возвращает для комплексного числа комплексносопряженное.
cos Вычисляет значение косинуса.
cosh Вычисляет значение гиперкосинуса.
exp Вычисляет экспоненциальное значение e в степени y.
imag Возвращает мнимую часть комплексного числа.
log Вычисляет натуральный логарифм аргумента.
log10 Вычисляет десятичный логарифм аргумента.
norm Вычисляет квадрат абсолютного значения аргумента.
polar Возвращает комплексное число с заданной величиной (абсолютным значением) и углом.
pow Возводит аргумент в степень e.
real Используется для преобразования комплексного

числа в long double.

sin Вычисляет синус.
sinh Вычисляет гиперсинус.
sqrt Вычисляет положительный квадратный корень.
tan Вычисляет тригонометрический тангенс.
tanh Вычисляет гиберболический тангенс.



- E -


Empty LEDATA record in module модуль


Предупреждение утилиты TLINK

(пустая запись LEDATA в модуле)

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

запись без данных. Сообщите об этом разработчику транслятора. Такая запись может давать отрицательные эффекты.

Enum syntaxError


Сообщение об ошибке этапа компиляции

(синтаксическая ошибка вEnum)

ОбъявлениеEnum не содержит правильно оформленного списка

идентификаторов.

Error changing file buffer size


Сообщение об ошибке утилиты TLIB

(ошибка изменения размера буфера файла)

Утилита TLIB пытается настроить размер буфера файла, используемого при операции чтения или записи в файл, но памяти не хватает. Чтобы исправить ситуацию, может потребоваться освободить

некоторый объем системной памяти.

Error directive: сообщение


Фатальная ошибка этапа компиляции

(директиваError: сообщение)

Данное сообщение появляется при обработке директивы #error

из исходного файла. Текст этой директивы выводится в сообщении.

Error directive: сообщение


Фатальная ошибка утилиты MAKE

(директиваError: сообщение)

Данное сообщение появляется при обработке утилитой MAKE директивы #error из исходного файла. Текст этой директивы выводится

в сообщении.

Error opening имя_файла


Сообщение об ошибке утилиты TLIB

(ошибка открытия указанного файла)

Утилита TLIB по каким-то причинам не может открыть указанный

файл.

Error opening имя_файла for output


Сообщение об ошибке утилиты TLIB

(ошибка открытия файла для вывода)

TLIB по каким-то причинам не может открыть указанный файл

для вывода. Обычно это вызывается недостатком места на диске для

файла библиотеки или листинга. Кроме того эта ошибка может возникать в ситуации, когда целевой файл существует, но помечен как

доступный только по чтению.

Error renaming имя_файла to имя_файла


Сообщение об ошибке утилиты TLIB

(ошибка переименования файла)

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

переименовывает временный файл в целевую библиотеку. Ошибка

обычно вызывается нехваткой места на диске.




Error writing output file

Сообщение об ошибке этапа компиляции

(ошибка при записи выходного файла)

Ошибка DOS при попытке Borland C++ вывести файл .OBJ, .EXE

или временный файл. Проверьте параметры командной строки. Убедитесь также, что на диске достаточно места.

__except or __finallyExpected following __try



Сообщение об ошибке этапа компиляции

(за __try должно следовать __except или __finally

В С++ за блоком __try должен следовать блок обработки __except или __finally.

Exception handling variable may not be used there

Сообщение об ошибке этапа компиляции

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

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

исключительной ситуации, которое ограничивается конкретной конструкцией обработки, например, GetExceptionCode().

Exception specification not allowed here

Сообщение об ошибке этапа компиляции

(спецификация исключительной ситуации здесь не допускается)

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

Explicit stacks are ignored in PE images

Предупреждение TLINK

(явные стеки в образах PE игнорируются)

32-разрядные приложения Windows имеют формат приложений PE

без явного указания стеков. Сегмент стека компонуется с образом,

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

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

стек будет операционная система.

Export идентификатор is duplicated

Предупреждение TLINK

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

В _export два раза используется одно и то же имя. Компоновщик использует первый идентификатор.

ExpressionExpected

Сообщение об ошибке этапа компиляции

(требуется выражение)

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

в предложении if или while управляющее выражение, либо при инициализации переменной. Сообщение часто появляется в результате случайно вставленного или удаленного из исходного файла символа.



Expression of scalar typeExpected



Сообщение об ошибке этапа компиляции

(ожидается выражение скалярного типа)

Унарные операции отрицания (!), увеличения (++) и уменьшения

(--) требуют выражений скалярного типа. Допустимыми являются

только типы char, short, int, long,Enum, float, double и long

double и типы указателей.

Expression syntax



Сообщение об ошибке этапа компиляции

(синтаксис выражения)

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

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

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

Expression syntaxError in !if statement



Сообщение об ошибке утилиты MAKE

(синтаксическая ошибка выражения в операторе !if)

Выражение в операторе !if имеет неправильный вид: оно содержит неравное количество открывающих и закрывающих скобок, лишний

или пропущенный оператор или пропущенную или лишнюю константу.

причина -Extended dictionary not created

Предупреждение утилиты TLIB

(расширенный словарь не создан)

Утилита TLIB не могут сформировать расширенный словарь из-за

причины, указанной в сообщении.

Extended dictionary bot found in library библиотека,Extended dictionaries ignored



Предупреждение утилиты TLINK

(в указанной библиотеке на найден расширенный словарь; расширенные словари игнорируются)

Параметр /E TLINK требует, чтобы все библиотеки имели расширенные словари. Если в ходе компоновки обнаруживается библиотека

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

Extern variable cannot be initialized



Сообщение об ошибке этапа компиляции

(переменнаяExtern не может быть инициализирована)

Класс памятиExtern применительно к переменной означает, что

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

памяти для нее не происходит. Следовательно, инициализация переменной в объявлении невозможна.



Extern идентификатор was not qualified with __import in module модуль



Предупреждение утилиты TLINK

(внешний идентификатор не описан в модуле с помощью __import)

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

данных. В вызовах это автоматически обрабатывается компоновщиком.

В ссылках на импорт DATA эту косвенную связь должен генерировать

компилятор (иначе приложение будет работать некорректно), а для

этого идентификатор должен описываться с __import.

Extra argument in template class name шаблон

Сообщение об ошибке этапа компиляции

(лишний аргумент в шаблоне имени класса)

Шаблон имени класса задает слишком много фактических значений для его формальных параметров.

Extra parameter in call



Сообщение об ошибке этапа компиляции

(Лишние параметры в вызове)

Вызов функции через указатель, определенный в прототипе, содержит слишком много аргументов.

Extra parameter in call to функция



Сообщение об ошибке этапа компиляции

(Лишние параметры в вызове функции)

Вызов названной функции (которая была определена с прототипом) содержит слишком много аргументов.