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

         

Управляющие сообщения




BM_GETCHECK EM_LINEINDEX
BM_SETCHECK EM_SETHANDLE
BM_GETSTATE EM_GETHANDLE
BM_SETSTYLE EM_GETTHUMB
BM_SETSTATE EM_LINELENGTH
EM_REPLACESEL
BN_CLICKED EM_SETFONT
BN_PAINT EM_GETLINE
BN_HILITE EM_LIMITTEXT
BN_UNHILITE EM_CANUNDO
BN_DISABLE EM_UNDO
BN_DOUBLECLICKED EM_FMTLINES
EM_LINEFROMCHAR
CB_GETEDITSEL EM_SETWORDBREAK
CB_LIMITTEXT EM_SETTABSTOPS
CB_SETEDITSEL EM_SETPASSWORDCHAR
CB_ADDSTRING EM_EMPTYUNDOBUFFER
CB_DELETESTRING EM_MSGMAX
CB_DIR
CB_GETCOUNT EN_SETFOCUS
CB_GETCURSEL EN_KILLFOCUS
CB_GETLBTEXT EN_CHANGE
CB_GETLBTEXTLEN EN_UPDATE
CB_INSERTSTRING EN_ERRSPACE
CB_RESETCONTENT EN_MAXTEXT
CB_FINDSTRING EN_HSCROLL
CB_SELECTSTRING EN_VSCROLL
CB_SETCURSEL

CB_SHOWDROPDOWN LB_ADDSTRING
CB_GETITEMDATA LB_INSERTSTRING
CB_SETITEMDATA LB_DELETESTRING
CB_GETDROPPEDCONTROLRECT LB_RESETCONTENT
CB_GETDROPPEDSTATE LB_SETSEL
CB_MSGMAX LB_SETCURSEL
CB_SHOWDROPDOWN LB_GETSEL
CB_SETITEMHEIGHT LB_GETCURSEL
LB_GETTEXT

CBN_SETFOCUS LB_GETTEXTLEN
CBN_KILLFOCUS LB_GETCOUNT
CBN_EDITCHANGE LB_SELECTSTRING
CBN_EDITUPDATE LB_DIR
CBN_DROPDOWN LB_GETTOPINDEX
CBN_SELCHANGE LB_FINDSTRING
CBN_DBLCLK LB_GETSELCOUNT
CBN_CLOSEUP LB_GETSELITEMS
CBN_ERRSPACE LB_SETTABSTOPS
CBN_SELENDCANCEL LB_GETHORIZONTALEXTENT
LB_SETHORIZONTALEXTENT
DM_GETDEFID LB_SETTOPINDEX
DM_SETDEFID LB_GETITEMRECT
LB_SETITEMDATA
EM_GETSEL LB_SELITEMRANGE
EM_SETSEL LB_MSGMAX
EM_GETRECT
EM_SETRECT LBN_SELCHANGE
EM_SETRECTNP LBN_DBLCLK
EM_SCROLL LBN_SELCANCEL
EM_LINESCROLL LBN_SETFOCUS
EM_GETMODIFY LBN_KILLFOCUS
EM_SETMODIFY

EM_GETLINECOUNT STM_GETICON
STM_SETICON



Установка атрибутов создания


Обычное Windows приложение имеет много различных стилей

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

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

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

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

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

TWindowAttr. TWindowAttr включает следующие элементы данных:

Элемент данных Использование

Style Типа DWORD, содержит константу комбинированного стиля.
ExStyle Типа DWORD, содержит расширенный стиль.
Menu Типа LPSTR, идентифицирует ресурс меню.
X Типа int, задает горизонтальную координату начального

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

Y Типа int, задает вертикальную координату начального

местоположения окна. Является вертикальной координатой

левого верхнего угла окна на экране.

W Типа int, задает начальную ширину окна в экранных координатах.
H Типа int, задает начальную высоту окна в экранных координатах.
Param Типа LPSTR, будет передаваться окну при его создании.
Id Типа int, задает идентификатор дочернего окна, исползуемого для связи между управляющим элементом и его

родительским окном или диалогом. Id должен быть разным

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

AccelTable Типа TResId. Идентификатор ресурса таблицы акселераторов окна.

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

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

указатель на объект дочернего окна.

В следующей таблице показаны некоторые заданные по умолчанию

значения, которые вы можете переопределить для элементов Attr:

Элементы Attr Значение по умолчанию

Style WS_CHILD WS_VISIBLE
ExStyle 0
X 0
Y 0
W 0
H 0
Menu 0
Id 0
Param 0
AccelTable 0



Установка глобальных точек останова


Эти точки останова являются по существую точками останова

двух описанных выше типов, но отслеживаются они непрерывно в течении всего периода выполнения программы. Так как Turbo Debugger

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

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

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

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

условную точку останова или точку останова по изменению памяти

(как описано выше), затем после выхода из окна Conditions and Actions включите кнопку с зависимой фиксацией Global диалогового

окна Breakpoint Options.

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

Breakpoint Options выводится <not available>.

Чтобы глобальная точка останова проверялась после выполнения

каждой машинной инструкции, а не каждой строки исходного кода, в

активном окне CPU нажмите F9. Эти точки останова сильно замедляют

выполнение программы, поэтому использовать их нужно умеренно.

Кроме того, для них не рекомендуется задавать условие "Always".

Меню Breakpoint содержит команды для быстрой установки глобальных точек останова: Changed Memory Global и Expression True

Global. При этом по умолчанию выбирается действие "Break". Changed Memory Global устанавливает глобальную точку останова, активизируемую при изменении значения в памяти. Эта команда выводит

подсказку для задания соответствующей области памяти Enter Memory

Address и поле счетчика Count. Expression True Global устанавливает точку останова, срабатывающую при истинном значении заданного выражения.



Установка и настройка Turbo Debugger


В данном разделе описывается, как инсталлировать Turbo Debugger и задать используемые по умолчанию параметры у режимы вывода. Здесь рассказывается также о некоторых файлах, входящих в

состав данного продукта.



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


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

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



Установка параметров IDE


Параметры IDE позволяют вам автоматически определить работу

с некоторыми окнами. Чтобы их установить, выберите команду Options Enviroment Preferences и установите или отмените нужные параметры. Затем выберите OK. Пояснение каждого параметра можно найти

в справочнике Help.

При выходе из IDE ее информация сохраняется автоматически,

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

диалогового окна Enviroment Options. Параметры оперативной полосы

сохраняются в файле BCCONFIG.BCW. Информация об оперативной области записывается в файл <имя_проекта>.DSW.



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


Параметр -W позволяет вам установить некоторые параметры MAKE, которые будут использоваться по умолчанию. Чтобы задать такие

параметры, наберите:

make -параметр[-] [-параметр][-] ... -W

Нужно учитывать, что -W не работает, когда загружена программа DOS SHARE, а таке со следующими параметрами MAKE:

-Dмакро -fимя_файла

[-D]ид=[стр] -? или -h

-dкаталог -lкаталог

-Uидентификатор



Установка простых точек останова


Когда вы впервые устанавливаете точку останова, Turbo Debugger создает по умолчанию простую точку останова. При достижении

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

Простейшие методы установки простых точек останова предлагают окно Module и область Code окна CPU.

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

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

окна CPU и нажмите F2. То же самое можно сделать с помощью команды Breakpoint Toggle. После установки точки останова соответствующая строка становится красной. Для отмены точки останова нажмите F2.

При работе с "мышью" вы можете установить точку останова,

щелкнув на двух левых столбцах нужной строки. Повторный щелчок

"мышью" отменяет точку останова.

Кроме того, команда Breakpoinr At (Alt+F2) позволяет установить простую точку останова на текущей строке. Кроме того, эта

команда открывает диалоговое окно Breakpoint Options, которое

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

Кроме установки точке останова из окон Module и CPU, Turbo

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

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

класса, используйте команду Group локального меню окна Breakpoints. Команда Add этого же меню также устанавливает точки останова. Она открывает диалоговое окно Breakpoint Options и позиционирует курсор на пустое поле ввода Address, где вы можете ввести

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

После установки точки останова вы можете модифицировать

действие, выполняемое по ее активизации. По умолчанию это "Break"

- Turbo Debugger приостанавливает выполнение программы. О других

действиях рассказывается ниже.



Установка точек останова по изменению памяти


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

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

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

шаги, что и перечисленные выше, но

В диалоговом окне Conditions and Actions вместо Expression

True щелкните "мышью" на кнопке с зависимой фиксацией

Changed Memory.

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

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

строки. Это нужно учитывать.

При вводе выражения вы можете также ввести счетчик числа

отслеживаемых объектов. Общее число отслеживаемых байт памяти

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



Установка точек останова в нитях


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

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

NT устанавливается во всех нитях программы. Чтобы установить ее

только в одной нити, сделайте следующее:

Подсветите нужную точку останова в области списка окна Breakpoint.

Выберите команду локального меню Set Options.

Чтобы открыть диалоговое окно Copnditions and Actions,

щелкните "мышью" в на кнопке Change диалогового окна Breakpoint Options. Если нужно, установите для точки останова условия и действия. По умолчанию отмечается кнопка All

Threads - точки останова устанавливаются во всех активных нитях.

Сбросьте установку All Threads. Становится доступным поле

ввода Threads. Наберите в этом поле номер нити Windows NT.

(Чтобы получить номер нити Windows NT, с помощью команды

View Thread откройте диалоговое окно Thread. В области

Threads List выводятся все активные нити.)

Чтобы подтвердить установку, выберите командную кнопку OK.



Установка Turbo Debugger


Программа INSTALL, поставляемая с компилятором Borland, полностью устанавливает пакет Turbo Debugger, включая выполняемые

файлы, файлы конфигурации, утилиты, справочные текстовые файлы и

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

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

их в новую программную группу Windows. Полный перечень файлов,

инсталлируемых программой INSTALL.EXE, содержится в файле FILELIST.DOC (этот файл копируется программой инсталляции в основной

каталог компилятора).



Установка условных точек останова


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

ними действия.

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

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

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

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

следующие шаги:

Установите простую точку останова (как описано выше).

Откройте диалоговое окно Conditions and Actions.

Откройте окно точке останова и подсветите в области List

нужную точку останова.

Выберите в SpeedMenu команду Set Options. Выводится диа логовое окно Breakpoint Options. Это окно содержит ко манды, позволяющие модифицировать параметры точек оста нова. Текущие параметры выбранной точки останова выво дятся в блоке списка Conditions and Actions&

Чтобы модифицировать условие точки останова и выполняе мые по ней действия, щелкните "мышью" на командной кноп ке Change. Выводимое окно Conditions and Actions позво ляет вам настроить условия срабатывания точки останова и

выполняемые по ней действия.

Выберите кнопку с зависимой фиксацией Expression True. По

умолчанию условие точек останова устанавливается в Always,

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

программе. щелчок "мышью" на кнопке с зависимой фиксацией

Expression True задает активизацию точки останова только

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

В поле ввода Condition Expression введите выражение. Оно

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

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

Pass Count. Это поле определяет, сколько раз должно удов летворяться условие точки останова, прежде чем точка оста нова будет активизирована. По умолчанию он равен 1. Значе ние счетчика уменьшается при каждом удовлетворении усло вия.

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

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

Для выхода из окна щелкните "мышью" на OK или нажмите Esc.



Утилита BUILDSYM


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

Когда файлы .SYM недоступны, создание их без BUILDSYM за два

шага:

Используйте утилиту EXEMAP для программы, чтобы создать

файл .MAP.

Используйте утилиту TMAPSYM с файлом .MAP для создания

файла .SYM.

Утилита BUILDSYM использует EXEMAP и TMAPSYM, но полный процесс можно выполнить с помощью только одной команды. BUILDSYM

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

Утилита BUILDSYM поддерживает синтаксис, позволяющий использовать

трафаретные символы, что дает вам возможность создавать файлы

.SYM для всех файлов каталога или части файлов с помощью одной

команды.

BUILDSYM требует, чтобы утилиты EXEMAP и TMAPSYM указывались

в маршруте доступа. Полученные в результате файлы .SYM помещаются

в текущий каталог. Чтобы WinSpector могла найти файл .SYM, при

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

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

Утилита BUILDSYM делает следующее:

проверяет, что файлы действительно представляют собой файлы Windows (если это не так, то данная утилита их не трогает);

вызывает утилиту EXEMAP для создания файлов .MAP;

проверяет, что файлы .MAP были созданы;

вызывает утилиту TMAPSYM, передавая ей имена новых файлов

.MAP для создания файлов .SYM;

удаляет файлы .MAP (которые больше не требуются).

Синтаксис: BUILDSYM имя_файла

В имени файла допускается указывать трафаретные символы DOS.

Компоновщик TLINK

Файл TLINK.CFG

Файл подсказки

Использование TLINK c BCC.EXE

Компоновка библиотек

Параметр TLINK

Файл определения модуля

Оператор CODE

Оператор DATA

Оператор DESCRIPTION

Оператор EXETYPE

Оператор EXPORTS

Оператор IMPORTS

Оператор LIBRARY

Оператор NAME

Оператор SEGMENTS

Оператор STACKSIZE

Оператор STUB

Стандартный файл определения модуля

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

Компилятор ресурсов BRCC.EXE



Утилита EXEMAP


Файлы .MAP для выполняемых файлов Windows создает утилита

EXEMAP. Файл .MAP можно использовать для создания файла .SYM, который затем используется WinSpector для улучшения отчета об ошибках. Это может быть особенно полезным для использования с .DLL

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

Хотя полученный в результате файл .MAP не будет таким пол-

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

Синтаксис: EXEMAP имя_выполняемого_файла [выходной_файл_map]

Если [выходной_файл_map] и не задается, то по умолчанию это

будет имя_выполняемого_файла.MAP.



Утилита IMPDEF: администратор файлов определения модуля


Утилита IMPDEF используется с IMPLIB для того, чтобы дать

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

Синтаксис вызова утилиты IMPDEF:

IMPDEF имя_приемника.DEF имя_источника.DLL

При этом из файла "имя_источника.DLL" создается файл определения модуля с именем "имя_приемника.DEF". Файл определения модуля будет выглядеть следующим образом:

LIBRARY имя_файла

DESCRIPTION 'Описание'

EXPORTS

имя_экспортируемой_функции @номер

...

имя_экспортируемой_функции @номер

где "имя_файла" является именем корневого файла DLL, 'Описание'

является значением утверждения DESCRIPTON, если DLL была предварительно скомпонована с файлом определения модуля, который включает утверждение DESCRIPTION, "имя_экспортируемой_функции" являются именами экспортных функций, а "номера" являются порядковыми

значениями (целыми) этих функций.



Утилита IMPLIB: библиотекарь импорта


Утилита IMPLIB создает библиотеку импорта, которая может замещать часть или всю секции IMPORTS файла определения модуля для

прикладной программы Windows. IDE использует IMPLIB как транслятор для целевого файла DLL. Когда вы добавляете DLL в качестве

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

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

.LIB. Вы можете также запустить IMPLIB из IDE.

Библиотеки импорта содержат записи. Каждая запись содержит

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

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

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

функций. Библиотека импорта может указываться в секции IMPORTS

файла определения модуля.

Если вы создали приложение Windows, то уже использовали по

крайней мере одну библиотеку импорта, IMPORT.LIB, библиотеку для

стандартных DLL Windows (она компонуется автоматически). Библиотека импорта перечисляет некоторые или все экспортируемые функции

для одной или нескольких DLL. Чтобы создать библиотеку импорта

для DLL, наберите:

IMPLIB параметры имя_библиотеки [файлы_определ... DLL...]

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

параметров IMPLIB, "имя_библиотеки" - это имя новой библиотеки

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

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

файл определения модуля.

Параметр Описание

Воспринимает идентификаторы с различием регистра

символов.

-i Сообщает IMPLIB, что нужно игнорировать WEP (процедуру выхода Windows), необходимую для завершения DLL. Используйте этот параметр, если вы задаете в командной строке несколько DLL.
-w Не выводит предупреждений.



Утилита MAKE


Утилита MAKE фирмы Borland (MAKE - для защищенного режима и

MAKER для реального режима) - это утилита управления проектами,

работающая в режиме командной строки. Она помогает вам создавать

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

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

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

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

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

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

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

привести к слишком большим затратам времени.

Эта задача разрешается утилитой MAKE. Утилите MAKE задается

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

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

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

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

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

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

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

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

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



Утилита TLIB: турбо библиотекарь


Включенная в пакет Borland С++ утилита TLIB осуществляет управление библиотеками, состоящими из отдельных файлов с расширением .OBJ (объектных модулей). Библиотека представляет собой

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

рассматриваемых как единое целое.

Библиотеки, включенные в систему Borland C++, были созданы с

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

библиотек системы Borland C++, своих собственных библиотек, библиотек, которые были созданы другими программистами, или приобретенных вами коммерческих библиотек. Утилиту TLIB можно использовать для того, чтобы:

создать новую библиотеку из совокупности объектных модулей;

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

удалить объектные модули из существующей библиотеки;

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

на другие;

извлечь объектные модули из существующей библиотеки;

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

Когда утилита TLIB осуществляет модификацию существующей

библиотеки, она всегда создает копию оригинальной библиотеки с

расширением .BAK. При модификации существующей библиотеки TLIB

всегда создает копию исходной библиотеки с расширением .BAK. Это

делается для вашего удобства.

Утилита TLIB может также создавать (и включать в файл библиотеки) расширенный словарь, который может использоваться для ускорения процесса компоновки.

Хотя утилита TLIB не обязательна для создания выполняемых

программ при работе с Borland C++, она представляет собой полезный инструмент повышения производительности труда программиста.

Вы обнаружите, что утилита TLIB незаменима при создании больших

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

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



Утилита TMAPSYM


Утилита TMAPSYM создает файлы .SYM из существующих файлов

.MAP. (созданных либо TLINK, либо утилитой EXEMAP). Результирующий файл .SYM содержит информацию о доступных для WinSpector

функции public, именах переменных и функциях в таблице входа.

Константы и информация о номерах строк в генерируемый утилитой

TMAPSYM файл .SYM не включается.

Синтаксис: TMAPSYM имя_файла[.MAP]

Расширение .MAP не обязательно.

Прекомпилированные файлы заголовков Borland C++ используют

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

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

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

имен.

BUILDSYM перезаписывает любой существующий файл .SYM. Для

надежности перед использованием утилиты BUILDSYM или TMAPSYM скопируйте существующие файлы .SYM.



Утилита WinSight


Утилита WinSight - это средство отладки, которое дает информацию об окнах, классах окон и сообщениях. Вы можете использовать

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

Вы можете настроить WinSight, чтобы отслеживать сообщения:

по окну;

по классу окна;

по типу сообщения;

по комбинации всего, указанного выше.

Нужно помнить, что Winsight - это "пассивный наблюдатель".

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



Утилита WinSpector


WinSpector и ее утилиты помогают вам выполнить послесбойную

проверку невосстановимых ошибок прикладной программы Windows - Windows Unrecoverable Application Errors (UAE) и сбоев по общему

нарушению защиты General Protection Faults (GPF). В случае подобных ошибок WinSpector записывает на диск файл регистрации с полезной информацией о причине исключительной ситуации, включая:

стек вызова;

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

регистры процессора;

дизассемблированные инструкции;

информацию Windows.



- V -


Value of type void is not allowed


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

(значение типа void не допускается)

Значение типа void на самом деле вовсе не является значением

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

фактические значения. Такой контекст включает в себя правую часть

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

ров if, for или while.

VIRDEF Name Conflict for функция


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

(конфликт имен VIRDEF для функции)

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

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

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

ются в одинаковое имя. Если эти имена являются именами VIRDER, то

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

Variable идентификатор is initialized more than once


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

(переменная инициализируется несколько раз)

Данная переменная имеет более одной инициализации. Допуска-

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

иметь только одну инициализацию.

'virtual' can be used with member functions

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

('virtual' можно использовать с функцией-элементом)

Элемент данных описан со спецификатором virtual. Только

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

Virtual function функция conflict with base class база


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

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

Виртуальная функция имеет те же типы аргументов, что и функ-

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

Virtual specified more than once


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

(virtual задается несколько раз)

Зарезервированное слово virtual С++ может встречаться только

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

void& is not a valid type

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

(void& не является допустимым типом)

Ссылка всегда ссылается на объект, но объект не может иметь

тип void. Таким образом, тип void здесь не допускается.

Void functions may not return a value


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

(функции void не могут возвращать значение)

Ваш исходный файл описывает текущую функцию, как возвращаю-

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

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



Версии объектов


Различным реализациям одного и того же класса, изменяемым

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

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

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

class Sample : public TStreamableBase

{

int i;

DECLARE_STREAMABLE( IMPEXMACRO, Sample, 1 );

};

IMPLEMENT_CASTABLE( Sample );

IMPLEMENT_STREAMABLE( Sample );

void Sample::Streamer::Write( opstream& out ) const

{

out << GetObject()->i;

}

void *Sample::Streamer::Read( ipstream& in, uint32 ) const

{

in >> GetObject()->i;

return GetObject();

}

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

class Sample : public TStreamableBase

{

int i;

int j; // новый элемент данных

DECLARE_STREAMABLE( IMPEXMACRO, Sample, 2 ); // новая версия

};

IMPLEMENT_CASTABLE( Sample );

IMPLEMENT_STREAMABLE( Sample );

void Sample::Streamer::Write( opstream& out ) const

{

out << GetObject()->i;

out << GetObject()->j;

}

void *Sample::Streamer::Read( ipstream& in, uint32 ) const

{

in >> GetObject()->i;

if ( ver > 1 )

in >> GetObject()->j;

else

GetObject()->j = 0;

return GetObject();

}

Потоки, записываемые со старой версией Sample, будет иметь

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

номер версии 2. Код в Read проверяет номер версии и определяет,

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

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

ObjectWindows и Turbo Vision, не поддерживает версий объектов.

Если вы используете эту библиотеку, функции Read будет передаваться номер версии 0.



Видео-функции


Borland C++ поставляется с полной библиотекой графических

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

DOS. Ниже приведено краткое описание видеорежимов и окон. Затем

объясняется, как программировать в текстовом и графическом режимах.



Видеорежимы


Ваш компьютер обязательно имеет некоторый видеоадаптер. Это

может быть монохромный дисплейный адаптер (MDA) для базового

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

адаптер, например цветной графический адаптер (CGA), улучшенный

графический адаптер (EGA), монохромный графический адаптер Hercules или видеографическая матрица (VGA/SVGA). Каждый из этих адаптеров может работать в нескольких режимах. Режим определяет величину экрана - 80 или 40 символов в строке (только в текстовом режиме), разрешающую способность экрана (только в графическом режиме) и тип дисплея (цветной или черно-белый).

Рабочий режим экрана определяется, когда ваша программа вызывает одну из функций определения режима (textmode, initgraph

или setgraphmode).

В текстовом режиме экран компьютера разделен на ячейки (80

или 40 столбцов в ширину и 25, 43 или 50 строк по высоте).

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

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

выведен на экран (его цвет, яркость, и т.д.). Borland C++

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

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

экран и управления атрибутами ячеек.

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

изображения (пикселы); каждый элемент изображения представляет собой отображение на экране одной точки. Число

элементов изображения на экране (т.е. его разрешающая способность) зависит от типа подключенного к вашей системе

видеоадаптера и режима, в который установлен этот адаптер. Для получения на экране графических изображений Borland C++ предоставляет библиотеку графических функций: вы

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

элемента изображения.

В текстовом режиме позиция верхнего левого угла экрана определяется координатами (1,1), где x-координата растет слева-направо, а y-координата увеличивается сверху-вниз. В графическом режиме позиция верхнего левого угла определяется координатами (0,0), с теми же направления возрастания координат.



Виртуальная функция элемент поверхности Shape


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

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

double shape::area()

{

return 0;

}



Виртуальные функции элементы


Виртуальные функции элементы - это функции специального типа.

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

этого. Все что их отличает от обычных функций - это вызов во время

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

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

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

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

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

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



Владение объектом


Косвенные контейнеры наследуют из TShouldDelete (файл

shddel.h) функцию-элемент OwnsElements. Эта функция позволяет

указать, будет ли контейнер при применении функций Detach или

Flash по умолчанию удалять объекты.



Вложенный класс Streamer


Вложенный класс Streamer - это ядро потокового кода для ваших объектов. Макрокоманда DECLARE_STREAMABLE создает класс

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

Streamer - это наследник TNewStreamer, а TNewStreamer является

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

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

virtual void Write( opstream& ) const = 0;

virtual void *Read( ipstream& , sint32 ) const = 0;

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

Вы должны написать эти функции: Write

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

для воссоздания объекта, а Read должна считывать эти данные.

Streamer:GetObject возвращает указатель на потоковый объект.

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

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

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

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

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

поток.

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

ObjectWindows и Turbo Vision это делалось путем прямого вызова

базовых функций Read и Write. В том программном коде, который использует новые потоки, это не работает (из-за поддержки версий

класса).

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

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

ReadBaseObject и WriteBaseObject - для невиртуальных.

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

указателя this. Без приведения типа шаблон функции будет думать,

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



Внешние подпрограммы в оверлеях


Подобно обычным функциям языка Си, внешние (external) подпрограммы на языке Ассемблера, чтобы хорошо работать с подсистемой

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

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

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

FAR и устанавливать границу стека при помощи регистра BP. Например, если OtherFunc - это оверлейная функция в другом модуле, и

ее вызывает подпрограмма на языке Ассемблера ExternFunc, то тогда

ExternFunc должна быть дальней (FAR) и устанавливать границы стека, как показано ниже:

ExternFunc PROC FAR

push bp ; сохранить bp

mov bp,sp ; установить стек

sub sp,LocalSize ; распределить локальные

; переменные

...

call OtherFunc ; вызов другого оверлейного

; модуля

...

mov sp,bp ; освобождение локальных

; переменных

pop bp ; восстановление BP

RET ; возврат

ExternFunc ENDP

где LocalSize - это размер локальных переменных. Если LocalSize

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

в стеке нет.

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

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

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

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

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

быть объявлена как NEAR. Она не обязана устанавливать границ стека.

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



и поддержки приложений DOS, Windows


Borland С++ - это мощное профессиональное инструментальное

средство для создания и поддержки приложений DOS, Windows Win32s и

Windows NT на языках C++ и Си. Версия 4.0 Borland С++ включает множество последних достижений в области программирования:

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

рации 32-разрядных приложений для Win32s и Windows NT.

Возможность генерации программ DOS из IDE для Windows.

Улучшенный редактор интегрированной среды (IDE) с макросредствами и несколькими областями в одном окне редактирования, а

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

Brief или Epsilon.

Правая кнопка "мыши" выводит оперативные меню SpeedMenu c командами, применимыми к указываемому "мышью" объекту (старые

функции правой кнопки "мыши" доступны по Ctrl+щелчок кнопкой).

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

программами.

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

Средство AppsExpert, дающее возможность быстро генерировать

программы ObjectWindows 2.0 для Windows. ClassExpert позволяет

вам модифицировать и организовывать приложение AppExpert.

Си и С++: Borland C++ предоставляет всю мощь программирования

на Cи и С++ с полной реализацией возможностей С++ AT&T и Си

стандарта ANSI).

WinSight: эта утилита предназначена для отслеживания сообщений

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

программы.

Потоки: Borland C++ включает полную поддержку потоков ввода/вывода C++, а также специальные расширения Borland для библиотеки потоков, позволяющие размещать текст, устанавливать

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

среде Windows.

Контейнерные классы: Улучшенные библиотеки контейнерных

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

Windows API: Наличие всей документации по прикладным программам для Windows в контекстной помощи.


Вспомогательные классы С++


Ниже перечислены вспомогательные классы С++: классы даты,

классы файлов, строковые классы, классы нитей и классы времени.



Встроенные функции


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

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

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

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

struct rect { // Определение структуры rect (прямоугольник)

int wd, ht; // Ширина и высота

inline int area(int wd, int ht) { return (wd * ht); }

};

...

node1 = area(first, two);

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

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

их помещают в заголовочные файлы, а не в файлы c расширением .CPP.

Заметим, что в определениях класса ключевое слово inline не требуется. Чтобы излишне не увлекаться встроенными функциями, помните - наиболее целесообразно делать функцию встроенной только когда объем

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

извне.

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

таким образом, чтобы они выглядели аналогично другим функциям элементам:

inline int area(int wd, int ht)

{

return (wd * ht);

}

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

в том, что можно избежать раскрытия исходного текста (*.CPP) в

поставляемых заголовочных файлах.



Встроенный ассемблер


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

языке Си и С++ операторы ассемблера. Инструкции встроенного ассемблера компилируются и ассемблируются с вашей программой, и вам

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



Сейчас совершенно ясно, что на


Сейчас совершенно ясно, что на смену традиционному программированию, переживающему трудные времена, пришло объектно-ориентированное. Властелины софта переключили производства на выпуск
объектно-ориентированных сред и языков программирования. В срочном порядке переписываются под объектно-ориентированное представление многие известные программы, например FoxPro.
Успех объектно-ориентированного программирования (ООП) объясняется предоставляемой им возможностью естественно имитировать
реалии нашего мира. Решая сложные проблемы, выдвигаемые жизнью,
человек постепенно развил в себе замечательные способности к
обобщению, классификации и созданию абстракций. В живых реалиях
мы находим общие признаки, свойства, способы поведения и по ним
создаем классификационные словари.
Долгое время идеи ООП сдерживало ограниченное быстродействие
персональных компьютеров. Первые объектно-ориентированные языки,
поддерживающие эту технологию, носили больше исследовательских
характер. Однако, с приходом 386-ых процессоров процесс пошел,
как по маслу. На смену пришли новые языки, предназначенные для
широкомасштабного промышленного ООП. С их помощью стало возможным
обобщать свойства, классифицировать объекты, абстрагировать из
них новые, управлять ими, используя различные методы.
Эта книга посвящена Borland C++ - новому мощному объектно-ориентированному расширению языка Си.
С++ лучше, чем Си. Он удобней при написании программ, более
читаемый. Подходы, примененные при программировании на С++ повышают надежность и расширяемость продуктов. C++ обладает исключительным свойством, которого нет у специализированных языков ООП
(Simula, Smalltalk): он обеспечивают обратную совместимость с
миллионами уже написанных строк на обычном Си. Добавить объектно-ориентированные элементы к действующей программе на знакомом
языке гораздо проще, чем всю ее переписать заново, используя совершенно другой язык. Кроме того, не пропадают ни средства, вложенные фирмой в подготовку программистов, ни накопленный ими
опыт, так как программистам нужно освоить не совершенно новую
систему основных конструкций, а лишь несколько дополнительных
особенностей.
В данной книге сделана попытка разложить С++ в понятных проекциях, в которых он бы воспринимался с первого взгляда, без остановок, в первом чтении.

Турбо отладчик Turbo Debugger представляет


Турбо отладчик Turbo Debugger представляет собой набор инструментальных средств, позволяющий отлаживать программы на уровне
исходного текста и предназначенный для программистов, использующих семейство компиляторов Borland. В пакет отладчика входят набор выполняемых файлов, утилит, справочных текстовых файлов и
примеров программ.
Turbo Debugger позволяет вам отлаживать программы для Microsoft Windows, Windows 32s, Windows NT и DOS. Многочисленные перекрывающие друг друга окна, а также сочетание спускающихся и
раскрывающихся меню обеспечивают быстрый, интерактивный пользовательский интерфейс. Интерактивная, контекстно-зависимая справочная система обеспечит вас подсказкой на всех стадиях работы. Кроме того, Turbo Debugger полный набор средств отладки:
Вычисление любых выражений языка Си, C++, Pascal и Assemb ler.
Полное управление выполнением программы, включая программ ную анимацию.
Доступ на нижнем уровне к регистрам процессора и системной
памяти.
Полные средства проверки данных.
Развитые возможности задания точек останова и регистрации.
Трассировка сообщений Windows, включая точки останова по
сообщениям.
Обратное выполнение.
Поддержка удаленной отладки, в том числе для Windows.
Полная поддержка объектно-ориентированного программирова ния, включая просмотр классов и проверку объектов.
Макрокоманды в виде последовательности нажатий клавиш, ус коряющие выполнение команд.
Копирование и вставка между окнами и диалогами.
Контекстно-зависимые меню.
Возможность отладки больших программ.
Диалоговые окна, позволяющие вам настроить параметры от ладчика.
Возможность отладчик 16- и 32-разрядных программ Windows
(для 32-разрядной отладки имеется отладчик TD32).
Обработка исключительных ситуаций операционной системы, а
также С и С++.
Сохранение сеанса.
Поддержка нитей для мультинитевого программирования Win dows NT.
Возможность подключения готовых к выполнению в Windows
процессов.
Возможность выбора для элементов, выводимых в Turbo Debug ger, национального порядка сортировки.
Для работы Turbo Debugger требуются те же аппаратные средства, что и для компилятора языка Borland. Кроме того, Turbo Debugger поддерживает графические адаптеры CGA, EGA, VGA, Hercules
(монохромный графический режим), Super VGA, TIGA и 8414.

Введение в классы


Классы являются сердцевиной ООП, поскольку именно объекты встроены в классы, а не наоборот. Для программирующих на Си классы являются расширениями структур языка Си, дополненные "механизмами" скрытия данных, функциями элементами и наследованием.


Ниже показана взаимосвязь старых структур Си, новых структур C++

и классов:

Структура Си Структура C++ Класс C++

typedef struct { struct rect { class rect {

int wd, ht; int wd, ht; public:

} rect; }; int wd, ht;

};

В отличии от структур Си, структуры C++ фактически являются типами определяемыми пользователем, без использования ключевого слова

typedef. На помощь программистам добавлено новое для Си ключевое слово: class. Естественно, что класс, имеющий все элементы типа public

без каких-либо функций, является обычной структурой Си.


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

class circle { < Объявление класса

private: < Следующий элемент приватный

double radius; < Приватный элемент

public: < Следующие элементы общие

void init(double r); < Функция элемент

double area(void); < Еще одна функция элемент

};

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



Выбор другого принтера


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

любым инсталлированным в Windows устройством печати. По умолчанию

TPrinter использует принтер, заданный в Windows по умолчанию.

Существует два способа задания альтернативного принтера:

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

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

печати. TPrinter делает это автоматически при вызове его функции-элемента Setup. Setup выводит диалоговое окно на базе TPrinterDialog.

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

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

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

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

строковых параметра: имя устройства, имя драйвера и имя порта.

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



Выбор области просмотра


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

окон и область трассировки сообщений. Вы можете просматривать любую из них. WinSignt автоматически располагает эти области в основном окне с перекрытием.

Область списка классов показывает все зарегистрированные в

данный момент классы окон.

Область дерева окон выводит иерархию всех окон оперативной

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

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

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

затем дайте команду Spy Open Detail, или дважды щелкните "мышью"

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



Выбор по набору


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

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



Выбор трассируемых сообщений


Утилита WinSight предоставляет вам несколько способов ограничения трассировки сообщений. Независимо от того, за какими окнами вы наблюдаете, можно задавать конкретный тип сообщений, которые вы хотите трассировать. Сообщения, посылаемые через SendMessage показываются дважды, а диспетчеризуемые сообщения - один

раз.



Вычисление выражений


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

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



Выгода от наследования


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

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

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

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

Так, вы можете распространять ваши классы в объектном виде среди других программистов. На их базе они смогут порождать новые, специализированные классы. При этом без знания вашего исходного текста. Уже появилось большое количество библиотек классов различных фирм (см. приложение 2). Возможно, они будут вам весьма полезны и обеспечат значительный успех в программных проектах.



Выход из отладчика


Завершить сеанс отладки и вернуться в администратор программ

Windows вы можете в любое время (за исключением передачи управления в программу или работы с диалоговым окном) с помощью клавиш

Alt+X. Можно также выбрать команду File Quit.

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



Выход из режима поиска окна


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

поиска окна, нажав кнопку "мыши" или клавиши Esc или Enter. При

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

дереве окон.



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


Выполнение диалогового блока аналогично созданию и выводу

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

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

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

Большинство диалоговых блоков режимные. При выводе такого

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

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

приложения.

Для режимного выполнения диалогового блока используйте TDialog::Execute. При закрытии диалогового блока Execute возвращает

целое значение, указывающее на характер закрытия (идентификатор

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

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

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

действия, находить информацию и т.д.

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

TDialog::Create. При этом с помощью флага WS_VISIBLE или функции

ShowWindow нужно явно задать видимость диалогового блока. Закрыть

диалоговый блок и удалить объект можно с помощью TDialog::CmOk и

TDialog::CmCancel.

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

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

явное его удаление не требуется.

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

ObjectWindows автоматически создает за вас дочерние диалоговые

объекты. Создав эти объекты в конструкторе производного от TWindow класса (спецификацией в качестве родительского объекта this),




производный от TWindow класс строит список дочерних окон. Это

происходит также когда объект диалогового блока является

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

от TWindow класса он пытается создать все дочерние объекты в

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

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

Включить флаг wfAutoCreate можно с помощью функции EnableAutoCreate, а выключить - с помощью DisableAutoCreate. Для автоматического создание дочерних объектов TWindow использует Create.

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

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

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

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

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

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

функции CmOK диалогового блока, которая вызывается по кнопке OK.

Аналогично оконным объектам, функции-элементы Create и Execute диалогового блока могут порождать исключительную ситуацию

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

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

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

try/catch.


Выполнение DLL по шагам


При пошаговом выполнении функции DLL Turbo Debugger загружает идентификатор DLL, исходный код DLL в окно Windows и позиционирует курсор на вызываемую подпрограмму. Однако, перед загрузкой исходного кода в окно Module должны удовлетворяться следующие условия:

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

Файл .DLL должен находиться в том же каталоге, что и файл

.EXE программы.

Должен быть доступен исходный код DLL.

Turbo Debugger ищет исходный код DLL также, как и исходный

код программ. Если DLL не содержит отладочной информации, то отладчик не может найти исходный код DLL и открывает окно CPU.

При отладке функции DLL и прохождении с помощью F7 или F8

оператора return ваша программа может начать работать, хотя вы

нажали F9. Такое поведение типично при отладке DLL, вызванной из

программы без отладочной информации, или когда DLL возвращает управление через функциональный вызов Windows.

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

приостановку программы при возврате и DLL.



Выполнение отладчика


При выполнении TDW (или TD32 в Windows 32s) отладчик откры вает полноэкранное текстовое окно. Однако, в отличие от других

приложений, вы не можете использовать в Turbo Debugger клавиши

Windows Alt+Esc или Ctrl+Esc, то есть смена задач здесь запреще на. Однако в Windows NT TD32 активизирует окно с командной подс казкой, и доступны все обычные средства приложения Windows.



Выполнение в IDE других программ


Не выходя из IDE, вы можете выполнять другие программы, инструментальные средства и утилиты. IDE позволяет выполнять Turbo

Debugger, Resource Workshop, WinSpector, WinSight, GREP и Keymapper. Для запуска из IDE программы выберите Tools имя_программы.

Чтобы добавить программы в меню Tools, сделайте следующее:

Выберите Options Tools. Выводится окно Tools с выбором Tools, Viewers и Translators.

Щелкните "мышью" на New. Если вы хотите добавить существующее инструментальное средство (перечисленное в Tools),

щелкните "мышью" на Edit.

Наберите имя программы, маршрут и параметры командной

строки (можно использовать макрокоманды передачи).

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

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

Щелкните "мышью" на Advanced. Выведется диалоговое окно

Tool Advanced Options.

Если программа использует тип файла, создаваемый другой

программой, щелкните "мышью" на Translator. Если программа

используется для просмотра файла, выберите Viewer.

Отметьте в меню Tools пункт Place on SpeedMenu, если хотите, чтобы имя программы выводилось в оперативном меню окна

проекта.

Если ваша программа является транслятором, наберите расширения имен воспринимаемых ей файлов (через точку с запятой).

Наберите расширения транслированных файлов (например, .OBJ).

Во всех открытых диалоговых окнах выберите OK.

Чтобы увидеть корректность добавления в меню Tools, выберите в основном меню Tools.



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


В директивах !if и !elif возможно задание выражений; они используют синтаксис, присущий языку Cи. Выражение вычисляется как обычное 32-битовое целое со знаком.

Вы можете вводить числа как десятичные, восьмеричные или

шестнадцатиричные константы. Если вы знаете язык Си, то вы уже

знаете, как нужно задавать константы утилите MAKE: форматы одинаковы. Если вы программируете на ассемблере или на Турбо Паскале,

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

примеры. Ниже приводятся допустимые для утилиты MAKE константы:

4536 # десятичная константа
0677 # восьмеричная константа (различается по начальному нулю)
0x23aF # шестнадцатиричная константа (различается по начальной последовательности 0x)

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

Операция Действие

Символы унарных операций:
- унарный минус
~ побитовое дополнение (инверсия всех битов)
! логическое отрицание NOT (0, если операнд ненулевой, 1 - в противном случае)
Символы бинарных операций:
+ сложение
- вычитание
* умножение
/ деление
% остаток
>> сдвиг вправо
<< сдвиг влево
& поразрядное И (AND)
| поразрядное ИЛИ (OR)
^ поразрядное исключающее ИЛИ (XOR)
&& логическое И (AND)
|| логическое ИЛИ (OR)
> больше чем
" меньше чем
>= больше либо равно
"= меньше или равно
== равенство
!= неравенство
Символ тернарной операции:
?: Операнд перед знаком ? рассматривается как тестовый.

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

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

круглые скобки. В отличие от языка Си утилита MAKE может сравнивать строки с помощью обычных операций ==, !=, <, >, >= и =>.

Числовые (например, + или *) операции со строками использовать

нельзя.

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

Model = "Medium model"

.

.

.

!if $(Model) == "Medium model"

CFLAG = -mm

!elif $(Model) == "Large model"

CFLAG = -m1

!endif

Вы можете вызвать макрокоманды в выражении; будет распознаваться специальная макрокоманда $d(). После того, как произошло

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



Выражения с побочными эффектами


Побочный эффект означает изменение при вычислении выражения

элемента данных. Это мощный инструмент отладки. Побочные эффекты

имеют выражения с операциями присваивания (=, += и др.) и выражения с операциями ++ и --.



Если функция отмечена ключевым словом


Если функция отмечена ключевым словом _export, и используется любой из параметров компилятора Windows, то функция компилируется как экспортируемая и компонуется как функция экспорта. Если
функция не помечена ключевым словом _export, Borland C++ будет
выполнять одно из следующих действий:

* При компиляции с параметром -W/-WC или -WD/-WCD (или эквивалентными установками интегрированной среды IDE) функция
будет компилироваться как экспортируемая. Если функция
указывается в секции EXPORTS, то она будет компоноваться
как функция экспорта. Если она не указывается в файле определения модуля, или файл определения модуля не компонуется, то она не будет компоноваться как функция экспорта.
* При компиляции с параметром -WE или -WDE/-WCDE (или эквивалентными установками интегрированной среды IDE) функция
не будет компилироваться как экспортируемая. Включение
этой функции в секцию EXPORTS файла определения модуля
приводит к тому, что она будет экспортируемой, однако,
поскольку начальный код будет некорректен, программа не
будет правильно работать. В 16-разрядном окружении вы можете получить сообщение об ошибке Windows.
Результат комбинирования параметров компилятора с ключевым
словом _export описывается следующей таблицей:
Функция помечена + + + + - - - -
словом _export?
Функция перечислена + + - - + + - -
в EXPORTS
Параметр -W -WE -W -WE -W -WE -W -WE
компилятора -WD -WDE -WD -WDE -WD -WDE -WD -WDE
Функция + + + + + - + -
экспортируема?
Функция будет + + + + + + (1) - (2) -
экспортируемой?
1 - функция будет в некотором смысле экспортируемой, но
из-за некорректности начального и завершающего кода функция будет
работать не так как ожидается.
2 - эта комбинация также имеет смысл. Нет смысла компилировать все функции как экспортируемые, если реально вы экспортируете только некоторые из них.

Вызов деструкторов


Как и конструкторы, деструкторы могут вызываться явно (при помощи оператора С++ delete) или неявно - при выходе объекта из области

действия, например:

void doit(void)

{

sber_bank telly(1000.0); < Здесь вызывается конструктор

...

} < Деструктор вызывается, когда выполнение завершается

Если вы не определите деструктор для данного класса, то С++ генерирует деструктор по умолчанию.



Вызов функций-элементов


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

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

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

Объект Имя функции элемента

v v

my_bank.deposit(paycheck);

^ ^ ^

Простой селектор

в обращении к задан- Вызов функции элемента

ному элементу струк-

туры

Общий вид синтаксиса вызова выглядит как:

имя_класса_объекта.имя_функции(список аргументов).



Вызов конструкторов


Конструкторы могут вызываться неявно - через обращение к функции

элементу во время объявления объекта. Задавая объекту параметры, вы

сообщаете о их передаче непосредственно конструктором:

Имя Объект

класса

v v

sber_bank counterfeit_bank_of_AZ(1000000.00);

^ ^

Обусловлено вызовом конструктора

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

void doit(void)

{

sber_bank telly(1000.0); < Здесь вызывается конструктор

...



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


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

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

механизм для манипулирования управляющими элементами и реакции на

их события.

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

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

Диалоговый блок для циклического перемещения по управляющим

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

также использовать клавиши стрелок. Разрешить такой клавиатурный

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



- W -


функция was priviously declared with the language язык


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

(функция ранее была описана с языком язык)

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

один язык. В разных частях одного модуля эта функция была описана

с разными языками.

While statement missing (


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

(в операторе while пропущена скобка ()

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

нашел левую скобку.

While statement missing )

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

(в операторе while пропущена скобка ))

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

нашел правую скобку.

Write error on file имя_файла

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

(ошибка записи в указанный файл)

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

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

Wrong number of arguments in call macro макрокоманда


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

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

В вашем исходном файле имеется макрокоманда с некорректным

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

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



это расширение операционной системы Windows


Win32 - это расширение операционной системы Windows 3.1,

обеспечивающее поддержку разработки и выполнения 32-разрядных выполняемых файлов Windows. Win32 - это набор DLL, отображающих вызовы 32-разрядного прикладного программного интерфейса (API) в

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

драйвер устройства (VxD) для работы с памятью и содержащие обновленные функции API. Эти DLL и VxD обеспечивают прозрачный режим

работы.

Чтобы обеспечить компиляцию и выполнение своего кода под

Win32, вам следует:

обеспечить использование в своей программе API Win32;

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

windowssx.h.

API Win32 расширяют большинство существующих 16-битовых API

Windows до 32-битовых. Сюда добавлены и новые вызовы API, совместимые с Windows NT. API Win32 - это подмножество API Win32 для

Windows NT. API Win32 состоят из 16-битовых вызовов, преобразованных и допускающих вызов в 32-разрядной среде, и 32-битовых вызовов API, реализуемых в 16-разрядной среде Windows.

Если выполняемые вызовы Win32 любой из функций API Win32 в

Win32 не поддерживаются, на этапе выполнения возвращаются соответствующие коды ошибки. Если вы пишете приложения, совпадающие с

API Win32 и использующие соглашения по переносимости, ваше приложение должно обладать переносимостью между 16- и 32-разрядной

средой Windows.


WINAPI и соглашения по вызову CALLBACK


Макрокоманда WINAPI, которая находится в файле windows.h,

определяет соглашения по вызову. WINAPI дает в результате соответствующее соглашение по вызову, применяемое на целевой платформе. WINAPI следует использовать вместо FAR PASCAL. Эта макрокоманда позволяет задать альтернативные соглашения по вызову. В

настоящее время Win32 использует __stdcall. Фундаментальный тип

unsigned изменен на более переносимый UINT.

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

вызову CALLBACK, заменяющие FAR PASCAL.



Задание действия по сообщению


После спецификации окна и отслеживаемых сообщений нужно задать действие, выполняемое при поступлении сообщения. Turbo Debugger предусматривает в диалоговом окне Set Message Filter две кнопки Action: Break (приостановка выполнения программы) и Log

(регистрация сообщения вы области регистрации окна Windows Messages). Break фактически означает установку точки останова по сообщения.

Если вы регистрируете сообщения для нескольких окон, не регистрируйте все сообщения. Большое число передаваемых между Windows и Turbo Debugger сообщений может привести к краху системы.



Задание окна


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

это окно, отслеживаемые сообщения и действия, выполняемые отладчиком при их получении: прерывание выполнения (Break) или регистрация (Log).

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

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

Add в SpeedMenu области выбора окна откройте диалоговое окно Add

Window Procedure to Watch (или наберите непосредственно ее имя в

области). Затем наберите имя процедуры в поле ввода Window Identifier и нажмите Enter. Эту процедуру вы можете повторить для

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

В TDW окно можно задать с помощью описателя окна или оконной

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

использовать диалоговое окно Add Window или Handle to Watch. Для

его вывода выберите команду Add в SpeedMenu области выбора окна

или наберите имя непосредственно в этой области. Кнопки Identify

By этих окон позволяет вам выбрать способ спецификации окна. Это

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

команды Remove (Ctrl+R) и Delete All (Ctrl+D).



Задание отслеживаемых сообщений


После задания окна Turbo Debugger по умолчанию перечисляет в

области регистрации сообщения все сообщения WM_. Чтобы сократить

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

Message Filter, которое выводится командой Add в SpeedMenu области класса сообщения. Это окно позволяет задать класс сообщений

или индивидуальные имена сообщений.

Чтобы задать конкретное сообщение для окна в области выбора

окна, откройте диалоговое окно Set Message Filter и с помощью

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

сообщений:

All Messages Все оконные сообщения.
Mouse Сообщения, генерируемые событием "мыши".
Window Сообщения, генерируемые администратором окон.
Input Сообщения, генерируемые клавиатурным событием, или обращением пользователя к меню System, полосе прокрутки или блоку изменения размера.
System Сообщения, генерируемые изменениями в масштабе системы.
Initialization Сообщения, генерируемые при создании в приложении диалогового окна.
Clipboard Сообщения, генерируемые при обращении пользователя к буферу Clipboard.
DDE Сообщения динамического обмена данными, генерируемые при обмене данными между приложениями Windows.
Non-client Сообщения, генерируемые Windows для обслуживания неклиентной области окна приложения.
Other Любые сообщения, не попадающие в предыдущие

категории (например, сообщения MDI).

Single Message Позволяет вам задать конкретное отслеживаемое

сообщение.

Чтобы регистрировать одно сообщение, выберите Single Message

и введите в поле ввода Single Message Name имя сообщения или его

номер. Если вы хотите регистрировать для конкретного окна несколько классов или сообщений, то

задайте конкретный класс или имя сообщения;

выберите в SpeedMenu области классов сообщений команду Add;

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

имена сообщений.



Задание параметров печати


Чтобы разрешить разбивку документа на страницы, объект принтера (производный от TPrinter) вызывает две функции объекта распечатки - SetPrintParams и GetDialogInfo. Функция SetPrintParams

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

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

После вызова SetPrintParams объект принтера вызывает функцию

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

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



Задание пользовательских исключительных ситуаций


Поля ввода Range Low и Range High окна Specify Exception

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

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

устанавливаются отладчиком в 0. Введите в поле Range Low шестнадцатиричное значение, генерируемое исключительной ситуацией. Если

определяется несколько исключительных ситуаций, в поле Range High

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



Задание размера страницы: параметр /P


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

Размер страницы библиотеки определяет максимальный совокупный размер всех объектных модулей в библиотеке - библиотека не может превышать 65536 страниц. Стандартный (и минимальный) размер страницы, равный 16 байтам, позволяет создавать библиотеки размером до 1 Мбайт (приблизительно). Для того, чтобы создать библиотеку большего размера, необходимо увеличить размер страницы с помощью параметра /P; размер страницы должен являться степенью двойки; он не может быть меньше 16 байт и не может превышать 32768 байт.

Все модули в библиотеке должны начинаться с границы страницы. Например, в библиотеке с размером страницы 32 (минимально возможный размер страницы который больше стандартного значения 16), в результате создания "зазоров" на каждом объектном модуле

будет теряться в среднем 16 байт. Если вы пытаетесь создать библиотеку, которая слишком велика для заданного размера страницы, утилита TLIB выдаст сообщение об ошибке и предложит вам воспользоваться параметром /P, задав следующее, большее значение размера

страницы.



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


Средства просмотра позволяют вам просматривать содержимое

выбранного узла. Заданным по умолчанию редактором для Text Edit

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

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

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

Инструментальные средства Tools - это приложения, которые вы можете выполнять из IDE. Задать средства просмотра и инструментальные средства можно аналогично тому, как задаются трансляторы.



Задание транслятора


Чтобы задать транслятор, сделайте следующее:

Выберите Options Tools. Выводится диалоговое окно со списком Tools, Viewers и Translators. Вы можете также задать

трансляторы выбором команды Build Attributes в SpeedMenu

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

Щелкните "мышью" на New.

Наберите имя транслятора и его маршрут, а также укажите

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

Наберите текст меню. Этот текст может выводиться в оперативных меню SpeedMenu и в основном меню Tools. Если вы хотите присвоить тексту меню оперативную клавишу, то перед

буквой нужно указать &.

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

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

Щелкните "мышью" на Advanced. Выведется окно Tool Advanced

Options.

Щелкните "мышью" на Translator.

Если вы хотите, чтобы транслятор выводился в основном меню

Tools, отметьте Place on Tools menu. Если нужно, чтобы

транслятор выводился при щелчке правой кнопкой "мыши" на

соответствующем узле, выберите Place on SpeedMenu.

Если вы хотите, чтобы транслятор работал с целями, выберите Target transpator. Узел становится целевым, а транслируемый файл сохраняется в каталоге Final (в противном случае он записывается в каталог Intermediate).

В Translate from наберите расширения имен файлов, которые

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

В Translate to наберите расширение результирующего (транслированного) файла.

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

типа узла по умолчанию, наберите в поле Default for расширение файла и двоеточие.

Выберите OK.



Задание условий и действий


Для задания активизации точки останова и того, что должно

при этом происходить, используется окно Conditions and Actions.

Обычно для каждой конкретной точки останова задается одно условие

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

Чтобы задать набор условий, выберите кнопку с зависимой фиксацией Changed Memory of Expression, введите в поле ввода Condition Expression условие выберите кнопку Add под блоком ввода Condition Expression (если вводится несколько выражений, повторите

эти шаги). Кнопка Delete под полем Condition Expression позволяет

удалить из поля ввода Condition Expression текущее подсвеченное

выражение.

При выборе кнопки с зависимой фиксацией Execute, Log, Enable

Group или Disable Group в группе Action, то нужно задать набор

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

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

При выборе кнопки Enable Group или Disable Group для ссылки

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

наберите в поле Action Expression номер группы.

Кнопка Delete под полем Action Expression позволяет удалить

из набора действие текущее подсвеченное выражение. Закончив ввод

действий, выберите в диалоговом окне Condition Action командную

кнопку OK.

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

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

Чтобы модифицировать точку останова в другом (не загруженном

в данный момент) модуле, используйте команду View Another Module.



Загрузка программы в отладчик


Программу в Turbo Debugger вы можете загрузить из командной

строки или после запуска отладчика. Чтобы загрузить в отладчик

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

File Open. Эта команда открывает набор диалоговых окон, первое из

которых называется Load a Program to Debug. В TD и TDW это окно

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

В поле ввода Program Name задайте имя выполняемого файла

программы и нажмите Enter. Чтобы выполнить поиск программы по ка талогам, щелкните "мышью" на кнопке Browse. Откроется второе диа логовое окно - Enter Program Name to Load. В блоке Files этого

окна выводятся файлы в текущем выбранном каталоге. Введя в блоке

File Name маску файлов (например, *.EXE), вы можете задать список

нужных файлов.

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

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

выберите загружаемый файл в блоке Files. Для быстрого поиска фай ла наберите в блоке Files его имя.

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

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

независимой фиксацией Execute Startup Code, Turbo Debugger выпол няет программный код до процедуры main программы (или ее эквива лента). В противном случае при загрузке программы никакой код вы полняться не будет.

Для поддержки удаленной отладки TDW содержит дополнительный

набор переключателей. Если вы выберите в группе Session окна Load

a New Program to Debug кнопку с зависимой фиксацией Remote, это

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

При загрузке программы с включенной в нее отладочной инфор мацией Turbo Debugger открывает окно CPU, в котором показывает

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




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

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

в том каталоге, где компилятор нашел исходные файлы;

в каталоге, заданном в команде Options Path for Source

(или в параметре командной строки -sd);

в текущем каталоге;

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

После загрузки программы в отладчик вы можете с помощью ко манды Run Arguments задать или изменить аргументы программы. Их

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

При выходе из Turbo Debugger он сохраняет состояние текущего

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

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

файлы называются XXXX.TR (отладчик TD), XXXX.TRW (TDW) и XXXX.TR2

(TD32), где XXXX - имя отлаживаемой программы. Если при выходе из

отладчика программа не загружена, то XXXX - это имя отладчика.

Команда Options Set Restart открывает диалоговое окно пара метров рестарта Restart Options, где вы можете настроить обработ ку в Turbo Debugger файлов сеанса. Кнопка с независимой фиксацией

Restore at Restart определяет, какие параметры отладчика вы хоти те сохранять в файле состояния сеанса, а кнопка а зависимой фик сацией Use Restart задает, когда следует загружать файл сеанса:

Always Файл состояния сеанса используется всегда.
Ignore if old Если программа перекомпилирована, файл состояния сеанса не используется.
Prompt if old Turbo Debugger запрашивает, хотите ли вы использовать файл состояния сеанса после изменения программы.
Never Не использовать файл состояния сеанса.

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


Язык С++ является непосредственным откликом на сложность современных прикладных задач, которые нередко приводят программистов в отчаяние. Наследование и инкапсуляция - это чрезвычайно полезные
средства, позволяющие справляться со сложностями. С++ рационально
упорядочивает структуры программного обеспечения, не сужает его границы.
Когда вы освоитесь с С++, попробуйте реализовать его концепции в
повседневной практике программирования. Возьмите несколько наиболее
используемых программ-утилит и попробуйте преобразовать их в терминах
С++. Попробуйте реализовать классы в библиотечных функциях, затем запишите функции в форме класса. Вы обнаружите, что в последующих разработках гораздо легче пользоваться библиотеками классов. Очень немногие из ваших начальных усилий в программировании пропадут впустую.
Классы редко приходится переписывать с самого начала. Если его можно
использовать в таком виде, как он есть, то используйте его. Если же в
классе чего-то не хватает, его можно расширить. Но если он хорошо работает, то нет причин отказываться от того, что в нем записано.
Назад | Содержание | Вперед

Закрытие диалогового блока


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

реакции на события CmOk или CmCancel, отвечающие на данные кнопки. CmOk вызывает CloseWindow, которая для проверки возможности

закрытия диалогового блока вызывает CanClose. При возврате True

CloseWindow передает данные диалогового блока и закрывает его вызовом CloseWindow. CmCancel вызывает функцию Destroy, которая

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

проверки ввода вы можете переопределить CanClose.



Закрытие документа


Как и другие объекты, TDocument предусматривает функции,

позволяющие вам закрывать и уничтожать объект. Большую часть операций по очистке выполняет функция ~TDocument. Сначала она уничтожает дочерние объекты и закрывает все открытые потоки и другие

ресурсы. Затем она поочередно отсоединяет подсоединенные шаблоны,

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

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

документа.

Кроме деструктора TDocument предусматривает функцию CanClose, обеспечивающую безопасное закрытие и вызывающую функцию

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



Закрытие отображаемого элемента


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

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

~TView делает немного. Она вызывает функцию DetachView соответствующего документа, удаляя себя из списка отображаемых элементов

документа. Функция CanClose TView вызывает функцию CanClose соответствующего документа.



Закрытие приложений


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

File Exit или Alt+F4. Однако важно, чтобы приложения могли перехватывать такие попытки и давать пользователю возможность сохранить открытые файлы. TApplication позволяет вам это сделать.

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

объекту возможность подготовиться к завершению, а также при необходимости отменить завершение. Когда объект завершает очистку, его функция CanClose должна возвращать True. Если возвращается False, процедура завершения прерывается.

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

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

Windows посылает основному окну сообщение WM_CLOSE.

Функция-элемент EvClose основного окна объекта вызывает

функцию-элемент CanClose объекта приложения.

Функция CanClose объекта приложения вызывает функцию-элемент CanClose основного окна объекта.

Основное окно и объекты администратора документов вызывают

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

Если функции CanClose основного окна и администратора документа возвращает True, то функция CanClose объекта приложения также возвращает True.

Если функция CanClose объекта приложения возвращает True,

функция evClose закрывает основное окно и завершает приложение.

Функция CanClose по возможности должна выполнить все необходимые для возврата True действия. False следует возвращать только

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

приложение выполняющимся.



Замечания по терминологии


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

К ним относятся термины "модуль", "функция" и "аргумент".

Термин "модуль" в данном руководстве обозначает эквивалент

модуля (module) Си и ассемблера, а также модуля (unit) Паскаля.

Термин "функция" в данном руководстве означает функцию в

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

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

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

Паскале). (В Си функция, которая не возвращает значения, называется пустой (void) функцией). Для краткости изложения термин

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

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

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

Термин "аргумент" используется в данном руководстве как синоним термина "параметр". Он означает как аргументы (параметры)

командной строки, так и аргументы (параметры), передаваемые в

процедуры и функции.



Запуск Borland С++


Для запуска IDE дважды щелкните "мышью" на пиктограмме Borland С++ в Windows. Интегрированная среда разработки IDE позволяет вам писать, редактировать, компилировать, компоновать, отлаживать программы и управлять проектами. Оперативное контекстно-зависимое оперативное меню IDE (SpeedBar) позволяет вам быстро модифицировать объекты. Чтобы увидеть это меню, щелкните в окно

правой кнопкой "мыши" или нажмите Alt+F10. В зависимости от выбранного окна это меню изменяется. Оперативное меню можно настраивать.

Справочная система Borland С++ дает вам оперативный доступ к

информации о Borland С++. Чтобы вызвать справочник Help, в IDE

выберите в меню Help или нажмите F1. В диалоговом окне щелкните

"мышью" на командной кнопке Help. F1 позволяет также получить

справку по команде меню.



Запуск ClassExpert


Для запуска ClassExpert сделайте следующее:

Выбрав Project Open project, откройте проект AppExpert.

Дважды щелкните "мышью" на целевом узле AppExpert или выберите View ClassExpert (можно также щелкнуть "мышью" в

оперативном меню слева). ClassExpert выводится с перечнем

всех классов приложения и их реализации.

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



Запуск и приостановка обновления экрана


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

Messages Trace Off (Сообщения Выключение трассировки). Область

трассировки сообщений остается видимой на экране, а трассировка

возобновляется, когда вы выбираете одну из команд меню трассировки сообщений: Selected Classes (Выделенные классы), Selected

Windows (Выбранные окна) или All Windows (Все окна).

Команда Stop! строки основного меню отключает все обновления в реальном времени, выполняемые WinSight. Обычно для областей

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

Stop! приостанавливает все эти изменения и изменяет команду меню

на Start!. Выбор команды Start! возобновляет нормальную работу.

Использование команды Stop! имеет две основных цели:

Дает вам возможность изучить конкретную ситуацию.

Устраняет непроизводительные затраты на постоянное самообновление изображения в WinSight.

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

Messages Trace Off. Область трассировки сообщений остается видимой, и трассировка возобновляется при выборе Messages Selected

Classes, Selected Windows или All Windows.



Запуск из IDE


При запуске Resource Workshop как средства просмотра приложения AppsExpert (с помощью администратора проекта в IDE или

ClassExpert) его поведение отличается от автономного запуска следующим:

При внесении в Resource Workshop изменений, влияющих на

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

Открыть другой сценарий вы не можете.

При закрытии IDE Resource Workshop также закрывается, и

все внесенные изменения автоматически сохраняются.

Если вы строите проект, когда Resource Workshop открыт, то

на основе загруженных ресурсов он создает файл .RES.

Обращаться к Resource Workshop из IDE можно с помощью оперативного меню SpeedBar (щелчком правой кнопкой "мыши")

или выбором ClassExpert.



Запуск отладчика


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

Debugger и загрузив с ним программу. При этом вы можете использовать один из трех отладчиков: TD.EXE для отладки 16-разрядных

приложений DOS, TDW.EXE для отладки 16-разрядных приложений Windows и TD32.EXE для отладки 32-разрядных приложений Windows.

Отладчики для Windows запускаются в Windows из группу компиляторов Borland в Program Manager выбором пиктограмм TDW или

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

Edit), из диалогового окна Program Manager File Run (в поле ввода

Command наберите TDW или TD32 и параметры) или из File Manager

двойным щелчком "мышью" на пиктограмме выполняемого файла TDW.EXE

или TD32.EXE из каталога, содержащего Turbo Debugger.

При запуске Turbo Debugger из командной строки можно задать

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

следующий синтаксис:

TD TDW TD32 [параметры] [имя_программы [аргументы]]

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

отладчика задавайте корректный маршрут программы и ее аргументы.

Параметры Turbo Debugger перечислены в следующей таблице:

Параметр Функция

-ar# Подключает к процессу с идентификационным номером

# и продолжает выполнение.

-as# Подключает к процессу с идентификационным номером

и передает управление Turbo Debugger.

-cимя_файла Файл конфигурации, активизирующийся при загрузке.
-do Выводит TD.EXE или TDW.EXE на втором дисплее.
-dp Переключение страниц для TD.EXE.
-ds Переключение на содержимое экрана пользователя.
-h Вывод справочного экрана.
-? Вывод справочного экрана.
-ji Игнорирование старой информации сохранения.
-jn Не использовать информацию сохраненного состоя-

ния.

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

состояния старая.

-ju Использовать информацию сохраненного состояния,

даже если она старая.

-k Разрешает запись нажатий клавиш.
-l Запуск кода инициализации ассемблера.
-p Разрешает работать с "мышью".
-r Отладка на удаленных системах (с параметрами по

умолчанию.

-rnлок;удал Разрешает сетевую отладку.
-rp# Задает порт для удаленной отладки.
-rs# Скорость связи: 1 - медленная, 2 - средняя, 3 - быстрая.
-sc Отмена проверки букв на верхний/нижний регистр.
-sdкат;[кат] Каталог исходного файла.
-tкаталог Задает каталог для поиска информации о конфигурации и выполняемых файлов.
-vg Полное сохранение графики (только для TD.EXE).
-vn Запрет режима 43/50 строк для TD.EXE.
-vp Разрешение сохранения палитры EGA/VGA для TD.EXE.
-wc Разрешает/запрещает сообщение о возможном крахе

системы.

-wd Разрешает проверку на наличие всех DLL вашей

программы (по умолчанию разрешена).

<


Если вы запускаете программу, используя пиктограммы TDW или

TD32, то можете задать параметры с помощью диалогового окна Pro perties пиктограммы. При этом параметры сохраняются вместе с ус тановленными значениями характеристик пиктограммы. В окне Proper ties вы можете также задать свою программу и ее аргументы. После

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

щелкните на ней "мышью", затем выберите в Program Manager команду

File Properties. В поле ввода Command Line наберите имя отладчика

с параметрами командной строки. После этого щелкните "мышью" на

OK.

Для запуска Turbo Debugger из интегрированной среды Borland

С++ for Windows, то для задания параметров командной строки може те сделать следующее:

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

В списке окна Tools выберите TDStartup.

Чтобы открыть диалоговое окно Tools Options, щелкните

"мышью" на командной кнопке Edit.

В поле Commands Line после макрокоманды $TD введите пара метры командной строки отладчика.

Макрокоманда $ARG в поле Command Line позволяет задать аргу менты, передаваемые программе. Чтобы задать аргументы, выберите

для открытия диалогового окна Enviroment Options команду Opti ons Enviroment. Затем выберите в блоке списка Topics Debugger и

введите в блоке списка Run Arguments аргументы программы.


Запуск сеанса удаленной отладки


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

TDW и загрузите программу для отладки.

Удаленная система должна содержать следующие файлы: отлаживаемую программу и все необходимые для нее файлы, WREMOTE.EXE,

WRSETUP.EXE (программу конфигурации).

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

"мышью" на кнопке Serial, выберите скорость передачи (Baud Rate), выберите Desable Clock Interrupts и порт. В поле ввода Starting Directory введите каталог вашей программы. Если нужно, чтобы

WREMOTE после завершения отладчика возвращала управление в Windows, установите Quit When Host Quits. По умолчанию WREMOTE использует COM1 и скорость 192000 бод.

- WRSetup Turbo Debugger Setup -

File Settings Help

- Remote Driver Settings

OK Cancel

Disable clock interrupts

Quit when TD quits Baud rate

o 9600

Starting directory: * 19200

o 38400

o 115000

Remote type

* Serial

o Network

Comm port

Network remote name: * COM1

o COM2

При использовании связи через сеть щелкните "мышью" на кнопке с независимой фиксацией Network, в поле ввода Network Remote

Name задайте имя удаленной системы (по умолчанию REMOTE), а в поле Starting Directory введите каталог программы. После закрытия

окна WRSETUP установки сохраняются в файле TDW.INI.

После настройки конфигурации WREMOTE вы можете загрузить ее,

щелкнув "мышью" на пиктограмме Remote Debugging или с помощью команды Windows File Run. Курсор "мыши" изменяет форму, указывая,

что он ждет запуска TDW на другом конце.



Запуск TDW


После запуска на удаленной системе TDREMOTE для связи TDW с

TDREMOTE его нужно правильно конфигурировать. Проще всего это

сделать с помощью команды File Open (но можно использовать и Options Misceeellaneous программы TDWINST). В открывающемся диалоговом окне Load a New Program to Debug щелкните "мышью" на кнопке

Session. Открывается окно Set Session Parameters. Щелкните

"мышью" на кнопке Serial Remote. Затем выберите порт (Remote Link

Port) и скорость передачи (Link Speed). Щелкните "мышью" на OK.

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

Для конфигурации TDW на локальной сети NETBIOS запустите на

удаленной системе WREMOTE, запустите TDW и выберите File Open.

Открывается окно Load a New Program. Чтобы открыть окно Set Session Parameters щелкните "мышью" на кнопке Session. Выберите

кнопку Network Remote и задайте имена локальной и удаленной систем (по умолчанию LOCAL и REMOTE). Затем щелкните на OK.



Защита данных


Банковская информация, как правило, доступна только ограниченному (разрешенному) кругу лиц. Делается это путем присвоения ей приватного уровня доступа. Например:

class sber_bank {

private: // Ключевое слово private

double big_bucks; // Приватный элемент данных

public: // Ключевое слово public

void deposit(double bucks); // Общая функция элемент

double withdraw(double bucks); // Общая функция элемент

};

Примечание: ключевое слово private необязательно. Любой элемент

до первого элемента public (общий) автоматически

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

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

Нельзя, если big_bucks

sber_bank shaky_savings; является приватным (private)!

shaky_savings.big_bucks = 10000.00; <

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

своего класса:

Селектор

Определяемый класс Функция элемент

v v v

void sber_bank::deposit(double bucks)

{

big_bucks += bucks;

} ^

Доступ к приватному элементу разрешен,

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

классу sber_bank.

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

общими (public). В этом случае они открыты, даже функциям элементам

других классов.



Завершение программы


При завершении работы программы управление передается в Turbo Debugger, который выводит код выхода программы. После этого

любая команда меню Run перезагружает программу. После завершения

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

При выполнении программы в отладчике легко случайно пропустить нужное место. В этом случае вы можете возобновить сеанс отладки с помощью команды Run Program Reset (Ctrl+F2), которая перезагружает программу с диска. Перезагрузка программы не влияет

на точки останова и параметры просмотра.



Значения характеристик и их имена


TDocument и TView имеют некоторые общие характеристики. Эти

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

и TView. Эти характеристики индексируются списком перечислимых

значений. Первой характеристикой каждого производного от TDocument и TView класса должна быть PrevProperty, а последним значением в списке характеристик - NextProperty. Эти два значения ограничивают список характеристик и обеспечивают, что в производных

классах список характеристик будет начинаться с корректного значения. PrevProperty следует установить в значение NextProperty-1

ближайшего базового класса.

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

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

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

Атрибуты характеристик также обычно содержатся в массиве

(значений int). Вы можете работать с ними произвольным образом,

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

Атрибут Функция

pfGetText Доступ в текстовом формате.
pfGetBinary Доступ в собственном нетекстовом формате.
pfConstant Характеристику нельзя изменить после создания

объекта.

pfSettable Характеристику можно устанавливать с указанием

собственного формата.

pfUnknown Определена, но недоступна в объекте this.
pfHidden Характеристика должна быть скрыта от нормального просмотра (но пользователь может видеть ее имя или значение).
pfUserDel Характеристика определена пользователем на

этапе выполнения.