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


- A -

Администратор динамически распределяемой области памяти


Windows поддерживает динамическое распределение памяти с помощью двух различных динамически распределяемых областей - глобальной и локальной.
Глобальная динамически распределяемая область - это пул памяти, доступной для всех приложений. Хотя могут распределяться
глобальные блоки памяти любого размера, глобальная динамически
распределяемая область предназначена только для больших блоков
памяти (256 байт или более). Каждый блок глобальной памяти дополнительно использует не менее 20 байт. В соответствии со стандартом Windows и улучшенными режимами процессора 386 существует системное ограничение в 8192 блока глобальной памяти, только некоторые из которых будут доступны для любого конкретного приложения.
Локальная динамически распределяемая область - это пул памяти, доступной только для вашего приложения. Она существует только
в верхней части сегмента данных приложения. Общий размер блоков
локальной памяти, которые могут распределяться в локальной динамической области - это 64 минус размер стека приложения и его
статических данных. По этой причине локальная динамически распределяемая область лучше подходит для небольших блоков памяти (256
байт и менее). По умолчанию локальная динамически распределяемая
область имеет размер 4К, но в файле .DEF приложения его можно изменить.
Borland C++ включает в себя администратор памяти, реализующий функции new, delete, malloc и free. Этот администратор динамически распределяемой памяти использует для всех приложений глобальную динамически распределяемую область. Поскольку такая область имеет системное ограничение, администратор динамически
распределяемой памяти включает в себя механизм вторичного распределения, улучшающий производительность и позволяющий выделять существенно большее число блоков.
Алгоритм вторичного распределения работает следующим образом: при выделении большого блока администратор динамически распределяемой памяти с помощью подпрограммы Windows GlobalAlloc выделяет блок глобальной памяти. При выделении небольшого блока администратор памяти выделяет более крупный блок глобальной памяти,
а затем при необходимости разбивает этот блок на блоки меньшего
размера. При выделении небольших блоков перед тем, как администратор выделит новый блок глобальной памяти (который также будет
вторично распределяться), повторно используется все доступное
пространство вторичного распределения.
Пороговое значение между большим и малым блоком динамически
распределяемой памяти определяет переменная HeapLimit. Она устанавливается равной 64 байтам. Переменная HeapBlock определяет
размер, используемый администратором динамически распределяемой
памяти при вторичном распределении. Ей присваивается значение
4096 байт.


Администратор проектов


Borland С++ 4.0 имеет новый администратор проектов с расширенными функциональными возможностями. Поскольку большинство
программ состоит из нескольких файлов, желательно иметь возможность автоматически определять те файлы, которые необходимо перекомпилировать и скомпоновать. Эти и многие другие обязанности выполняет встроенный администратор проектов системы Borland C++.
Администратор управляет проектами, которые формируются из
нескольких компонентов. Когда вы осуществляете перекомпиляцию
проекта, администратор проектов автоматически обновляет информацию, которая хранится в файле проекта. Администратор проектов организует и обновляет сложные приложения, отслеживая взаимную зависимость компонентов в файле проекта с расширением .IDE.
Такой механизм позволяет повысить эффективность построения
проектов, так как транслируются только те файлы, которые были изменены со времени последнего формирования проекта. Трансляция означает использование одного типа файла для создания другого.
Проект можно рассматривать как список зависящих друг от друга файлов - файлов исходного кода, файлов .OBJ, .EXE или .DLL.
Эти файлы создаются компилятором, компоновщиком или другими инструментальными средствами. В администраторе файлов зависимость
между файлами показывается графически в виде дерева проекта с
тремя типами пиктограмм. Узел проекта представляет весь проект.
Ниже выводятся все составляющие проекта файлы. Целевой узел
представляет создаваемый проектом файл (.EXE или .DLL). Обычный
узел представляет используемый в проекте файл. Узлы этапа выполнения указывают общие файлы, используемые на этапе выполнения.


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


Приложения защищенного режима DOS используют администраторы
защищенного режима RTM.EXE и 32RTM.EXE. При загрузке эти инструментальные средства сначала загружают администратор, выполняют
свою задачу, а затем выгружают его. При частом вызове в командной
строке таких инструментальных средств вы можете ускорить процесс,
если загрузите администратор защищенного режима в командной строке командой 32RTM (выгружается он той же командой с параметром
-u).
По умолчанию администратор защищенного режима использует всю
доступную память, а затем распределяет ее своим клиентам. С помощью команды SET RTM=[параметр nnnn] вы можете управлять объемом
этой памяти. Параметр может быть следующим:

Параметр Описание
EXTLEAVE Всегда оставляет доступным указанный объем
расширенной памяти (по умолчанию 640К).
EXTMAX Не выделяет более nnnn килобайт расширенной
памяти (по умолчанию 4 гигабайта).
EXTMIN Если после применения EXTMAX и EXTLEAVE доступно менее nnnn килобайт, завершается с Out
of memory (по умолчанию 0).
REALLEAVE Всегда оставляет доступным не менее nnnn параграфов реальной памяти (по умолчанию 4096
параграфов).
REALMAX Не выделяет более nnnn параграфов реальной
памяти (по умолчанию 1 мегабайт).
REALMIN Если после применения EXTMAX и EXTLEAVE доступно менее nnnn килобайт, завершается с Out of memory (по умолчанию 0).



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


Предположим, что у вас есть некоторый текст, закодированный
групповой функцией элементом как будет показано далее. Байт со значением кода 0xff указывает, что следующие за ним два байта содержат
повторяющиеся символы. Любые другие байты передаются так как есть.
Например,
a \xff \03 b c -> Decomp > a b b b c
Ваша задача, заключается в переделке алгоритма декомпрессии с
языка Си в объектно-ориентированную версию. Не беспокойтесь, мы будем
сопровождать вас на каждом шаге пути.


Анализ и модификация данных


Данные вашей программы - это глобальные и локальные переменные, а также определенные константы. Для проверки и модификации
данных в Turbo Debugger имеется ряд окон.


Аппаратные точки останова


Эти точки останова доступны в TDW и TD32 при отладке программ Windows NT. Они используют специальные отладочные регистры
процессоров Intel 80386 и старше. Эти точки останова являются
глобальными. Для работы с этими точками останова вам потребуется
драйвер TDDEBUG.386. Скопируйте его с дистрибутивных диске и
включите в файл CONFIG.SYS. (Инструкции содержатся в файле
TD_HDWBP.TXT.) При правильной установке этого драйвера в поле
Breakpoints диалогового окна File Get Info выводится Hardware (в
противном случае - Software).
Чтобы установить аппаратную точку останова, выберите в меню
Breakpoints команду Hardware Breakpoint. Эта команда автоматически устанавливает кнопку Global окна Breakpoint Options, кнопку
Hardware в окне Conditions and Actions и открывает диалоговое окно Hardware Breakpoint Options. Это окно содержит все параметры
аппаратных точек останова и полностью описано в файле
TD_HDWBP.TXT.
Можно также создать аппаратную точку останова, модифицировав
существующую точку останова:
  • Установите кнопку с независимой фиксацией Global в диало говом окне Options.

  • Откройте диалоговое окно Conditions and Actions и выберите
    кнопку с зависимой фиксацией Hardware.

  • Чтобы открыть диалоговое окно Hardware Breakpoint Options,
    щелкните "мышью" на кнопке Hardware окна Conditions and
    Actions.

  • Задайте параметры аппаратной точки останова и щелкните
    "мышью" на OK.

  • Если нужно, задайте в окне Conditions and Actions нужные
    действия.



  • Application Admin Options



    Параметр Описание
    Version Number Задает номер версии проекта, который
    выводится в диалоговом окне Help About. Эта информация сохраняется в файле .RC проекта.
    Copyright Определяет информацию об авторских
    правах, которая выводится в диалоговом окне About.
    Description Описывает приложение и выводит текст
    в окне Help About приложения. По умолчанию это имя проекта.
    Author Фамилия программиста, генерирующего
    исходный код. Используется в комментариях сгенерированного кода.
    Company Название фирмы, где работает программист. Используется в комментариях сгенерированного кода.



    Application Advanced Options



    Параметр Описание
    Start Up Задает начальное состояние основного окна приложения:
    • Normal - задает используемый по умолчанию размер (определяется значением WS_NORMAL).

    • Minimized - запуск в виде пиктограммы в оперативной области Windows.

    • Maximized - заполняет при запуске всю оперативную область Windows.
    Control StyleОпределяет, какой тип управляющих
    элементов использует приложение:
    • Windows - стандартные управляющие элементы Windows.

    • BWCC - использует специализированные управляющие элементы Borland.

    • 3D - трехмерные управляющие элементы Windows.



    Application Basic Options



    Параметр Описание
    Target Name Определяет имя создаваемого проекта как базовое для используемых по умолчанию имен и других элементов проекта.
    Base Directory Задает маршрут базового каталога, в котором находятся все подкаталоги проекта. Все маршруты в проекте определяются относительно этого каталога. Имя данного каталога передается администратору проекта в качестве новой цели AppExpert. Заданным по умолчанию значением для базового каталога является каталог родительского узла проекта, определенный в администраторе проекта.
    Help File Support Генерирует исходные файлы справочника
    Help (.RTF) и файл проекта Help (.HPJ). Файл проекта Help добавляется к проекту администратора проекта и автоматически формируется с целевым приложением. Исходный файл Help содержит шаблонный текст для элементов меню приложения.
    Help File Name Именует связанные с приложением справочные файлы.



    Application Code Gen Control



    Параметр Описание
    Target Name Выводит на экран имя проекта, определенное в Basic Options Target.
    Base Directory Выводит базовый каталог проекта, определенный в Basic Options Base Directory.
    Source Directory Задает каталог, в который записываются исходные файлы приложения. Этот маршрут показывается относительно каталога, заданного в Base Directory. При задании абсолютного маршрута он преобразуется в относительный.
    Header Directory Задает каталог, в котором хранятся
    файлы заголовков. Он задается относительно базового каталога (Base Directory).
    Main Source File Именует основной исходный файл приложения.
    Main Header File Именует основной файл заголовка приложения.
    Application Class Именует производный класс, создаваемый AppExpert из TApplication. Заданное по умолчанию имя класса основывается на имя проекта.
    About Dialog Class Именует производный класс, создаваемый AppExpert из TDialog. Заданное по умолчанию имя класса основывается на
    имени проекта.
    Comments Документирует генерируемый код частично или полностью.



    Application options



    Параметр Описание
    Multiple Document Стиль приложения будет соответствовать
    Interface модели MDI.
    Single Document Стиль приложения будет соответствовать
    Interface модели SDI.
    Document/Viev Определяет поддержку приложением модели
    Document/View для управления объектами
    приложения. Document - это данные, а
    View - это пользовательский интерфейс к
    этим данным.
    SpeedBar Помещает в верхнюю часть окна приложения оперативную полосу.
    Status Line Помещает в нижнюю часть основного окна
    приложения строку состояния и генерирует код для вывода в этой строке справочных сообщений при подсветке пунктов
    меню.
    Drag/Drop Поддерживает стандартные действия Windows по буксировке "мышью".
    Printing Поддерживает операции, связанные с печатью, и создает меню File Print Setup,
    Print Preview и Print.



    Аргументы функции элемента, принимаемые "по умолчанию"


    При вызове функции элемента в С++, разрешается не указывать ее
    последние аргументы в списке и, таким образом, избавить программиста
    от необходимости указывать их каждый раз при обращении. Определить
    такие аргументы лучше списком в начале программы. Например:
    #define RED 0x04
    #define BLUE 0x01
    Тем не менее не теряется и гибкость, поскольку, при необходимости изменить используемые по умолчанию значения, просто задаются
    необходимые. В следующем примере последнему аргументу функции присваивается конкретное значение. Использование знака '=' означает, что
    это значение может быть использовано по умолчанию. Достаточно будет
    его пропустить, при обращении к функции.
    Назначает по умолчанию
    красный цвет
    v
    void set_pixel(int x, int y, int c = RED)
    {
    ...
    }
    set_pixel(100,100,BLUE); // Переопределяет цвет
    // установленный по умолчанию
    set_pixel(200,300); // По умолчанию использует цвет RED
    // (красный)
    Примечание: необходимо помнить, что этот "механизм" может конфликтовать с механизмом переопределения функций (см.
    "Связывание функций").


    Аргументы типа ссылки


    Описатель ссылки может также использоваться для объявления в
    функции параметров типа ссылки:
    void func1 (int i);
    void func2 (int &ir); // ir имеет тип "ссылка на int"
    ...
    int sum=3;
    func1(sum); // sum передается по значению
    func2(sum); // sum передается по ссылке
    Переданный по ссылке аргумент sum может изменяться прямо в
    func2. Напротив, func1 получает только копию аргумента sum (переданного по значению), поэтому сама переменная sum функцией func1
    изменяться не может.
    При передаче фактического аргумента x по значению соответствующий формальный аргумент в функции принимает копию x. Любые
    изменения этой копии в теле функции не отражаются на самом значении x. Разумеется, функция может возвратить значение, которое затем может использоваться для изменения x, но самостоятельно изменить напрямую параметр, переданный ей по значению, функция не может.
    Традиционный метод Си для изменения x заключается в использовании в качестве фактического аргумента &x, то есть адреса x, а
    не самого значения x. Хотя &x передается по значению, функция получает доступ к x благодаря тому, что ей доступна полученная копия &x. Даже если функции не требуется изменять значения x, тем
    не менее полезно (хотя это чревато возможностью нежелательных побочных эффектов) передавать &x, особенно если x представляет собой большую по размерам структуру данных. Передача x непосредственно по значению ведет к бесполезным затратам памяти на копирование такой структуры данных.
    Сравним три различных реализации функции treble:
    Реализация 1:
    int treble_1(n)
    {
    return 3*n;
    }
    ...
    int x, i = 4;
    x = treble_1(i); // теперь x = 12, i = 4
    ...
    Реализация 2:
    void treble_2(int* np)
    {
    *np = (*np)*3;
    }
    ...
    treble_2(int &i); // теперь i = 12
    Реализация 3:
    void treble_3(int& n) // n имеет тип ссылки
    {
    n = 3*n;
    }
    ...
    treble_3(i); // теперь i = 36
    Объявление формального аргумента type& t (или, что эквивалентно, type &t) устанавливает t как имеющую тип "ссылки на тип type". Поэтому при вызове treble_3 с действительным аргументом i, i используется для инициализации формального аргумента ссылки n.



    Следовательно, n играет роль псевдонима i, и n = 3*n также присваивает i значение 3*i.

    Если инициализатор представляет собой константу или объект

    нессылочного типа, то Borland C++ создаст временный объект, для

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

    int& ir = 16; /* создается временный объект int, с именем

    псевдонима ir, который получает значение

    16 */

    float f;

    int& ir2 = f; /* создается временный объект int, с именем

    псевдонима ir2, f перед присваиванием

    преобразуется */

    ir2 = 2.0 /* теперь ir2 = 2, но f остается без измене-

    ний */

    Если формальные и фактические аргументы имеют различные (но

    совместимые по присваиванию) типы, то автоматическое создание

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

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

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


    Ассоциативность и приоритеты операций Borland C++



    Операции Ассоциативность
    () [] -> :: . ! ~ - ++ -- & * (приведение типа) Слева-направо
    sizeof new delete Справа-налево
    .* ->* Слева-направо
    * / % Слева-направо
    + - Слева-направо
    << >> Слева-направо
    < <= > >= Слева-направо
    == != Слева-направо
    & Слева-направо
    ^ Слева-направо
    | Слева-направо
    && Слева-направо
    || Слева-направо
    ?:(условное выражение) Справа-налево
    = *= /= := += -= &= ^= |= <<= >>= Справа-налево
    , Слева-направо



    Автоматическая передача файла


    После загрузки программы TDW автоматически определяет, нужно
    ли пересылать программу на удаленную систему. В отношении загрузки программы в удаленную систему отладчик отличается гибкостью.
    Сначала он проверяет наличие программы на удаленной системе. Если
    программы там нет, он передает ее. Если программа на удаленной
    системе имеется, он анализирует дату и время копии программы на
    локальной системе и удаленной системе. Если копия на локальной
    системе более поздняя (новая), чем на удаленной, он предполагает,
    что вы перекомпилировали и перекомпоновали программу и передает
    ее по линии связи. Учтите однако, что TDW передает только файлы
    .EXE.


    Автоматическая проверка зависимостей


    Система Borland C++ ориентирована также на использование
    утилиты MAKE в целях автоматической проверки зависимостей для
    включаемых файлов. Компиляторы BCC и BCC32 создают объектные файлы, которые содержат используемую утилитой MAKE информацию о всех
    файлах включения, необходимых для создания объектного файла. Параметр командной строки -a утилиты MAKE проверяет эту информацию,
    чтобы удостовериться в "современности" всех используемых файлов.
    Когда утилита MAKE осуществляет автоматическую проверку зависимостей, она считывает имена файлов включения, а также время и
    дату создания объектных файлов. Если какой-либо включаемый файл
    был модифицирован, утилита MAKE осуществляет перекомпиляцию для
    обновления объектного файла.


    Автоматическое дополнение имени


    Когда в поле ввода выводится подсказка для ввода имени идентификатора, вы можете набрать часть имени, а затем нажать Ctrl+N.
    Turbo Debugger заполнит остальную часть имени автоматически. При
    этом набранная часть должна уникальным образом идентифицировать
    имя. Если с набранных символов не начинается ни одно из имен, то
    ничего не происходит. При наличии нескольких идентификаторов, соответствующих набранным вам символам, выводится список имен, из
    которого вы можете выбрать нужное.


    Автоматическое создание


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


    Азы С++


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


    Файл BUILTINS.MAK


    Вы быстро обнаружите, что существуют макрокоманды и правила
    утилиты MAKE, которые требуется использовать снова и снова. Существует три способа их обработки:
  • Во-первых, вы можете заносить их в каждый создаваемый вами
    формирующий файл для утилиты MAKE;

  • Во-вторых, вы можете занести все эти элементы в один файл
    и воспользоваться директивой !include в каждом создаваемом
    вами формирующем файле утилиты MAKE. (Другие директивы
    описываются далее в этой главе.);

  • В-третьих, вы можете занести все эти элементы в файл
    BUILTINS.MAK.

  • Каждый раз, когда вы запускаете утилиту MAKE, она ищет файл
    с именем BUILTINS.MAK. Однако, наличие файла BUILTINS.MAK не является обязательным. Если MAKE обнаруживает файл BUILTINS.MAK, то
    сначала она интерпретирует этот файл. Если утилита MAKE не может
    обнаружить файл BUILTINS.MAK, то она переходит непосредственно к
    интерпретации файла MAKEFILE (или того формирующего файла утилиты
    MAKE, который был вами задан с помощью параметра -f).
    Утилита MAKE сначала ищет файл BUILTINS.MAK в текущем каталоге. Если он отсутствует, и вы работаете под управлением DOS
    версии 3.0 или старше, то MAKE осуществляет поиск в том каталоге,
    откуда была вызвана сама утилита MAKE. Вам следует заносить файл
    BUILTINS.MAK в тот же каталог, где находится файл MAKE.EXE.
    Утилита MAKE всегда осуществляет поиск формирующего файла
    только в текущем каталоге. Этот файл содержит правила для конкретной создаваемой выполняемой программы. Как файл BUILTINS.MAK,
    так и формирующий файл подчиняются одинаковым синтаксическим правилам.
    Поиск файлов, задаваемых с помощью директивы !include, также
    осуществляется в текущем каталоге. Если вы используете параметр
    -I (файлы включения), то она будет также выполнять поиск в каталоге, заданном с помощью параметра -I.
    BUILTINS.MAK содержит стандартные правила и макрокоманды,
    которые MAKE применяет перед тем, как MAKE использует формирующий
    файл (параметр -r позволяет MAKE игнорировать BUILTINS.MAK).


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


    В данном разделе описываются файлы определения модуля и операторы, которые в них содержатся. Файл определения модуля обеспечивает для TLINK информацию о содержимом приложения Windows и
    требованиях к системе:
  • Имена прикладной программы или библиотеки динамической
    компоновки (DLL).

  • Идентификация типа прикладной программы как программы для
    Windows или OS/2.

  • Перечисление импортируемых и экспортируемых функций.

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

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

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

  • Заметим, что утилита IMPLIB может использовать файл определения модуля для создания библиотеки импорта. Утилита IMPDEF может создавать файл определения модуля для использования его с
    IMPLIB.


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


    Файлы подсказки представляют собой обычные текстовые файлы,
    содержащие параметры и/или имена файлов, которые обычно вводятся
    после имени программы TLINK в командной строке. Однако, в отличие
    от командной строки, файл подсказки может занимать несколько
    строк текста. Вы можете разбить длинный список объектных файлов
    или файлов библиотек на несколько строк, завершая одну строку
    знаком "плюс" (+) и продолжая список на следующей строке. Когда
    плюс возникает в конце строки, следуя непосредственно за одним из
    параметров TLINK, в котором + используется для включения параметра (например, /ye+), плюс не рассматривается как символ продолжения строки.
    Вы можете также начать каждый из четырех компонентов списка
    на отдельных строках: объектные файлы, выполняемый файл, файл
    карты отображения, библиотечные файлы. В этом случае вы должны
    убрать запятую, используемую для разделения компонентов.
    Чтобы проиллюстрировать эти возможности, предположим, что вы
    пользуетесь следующей командной строкой:
    tlink /c mainline wd ln tx,fin,mfin,work\lib\comm
    work\lib\suррort
    Вместо нее можно использовать файл подсказки, назвав его, например, FINRESP:
    /c mainline wd+
    ln tx,fin
    mfin
    worl\lib\comm work\lib\suррort
    Теперь команду TLINK следует вводить следующим образом:
    tlink @finresр
    Заметьте, что имени файла должен предшествовать символ (@),
    который указывает, что следующий файл является файлом подсказки.
    Альтернативный способ заключается в том, что команду компоновки можно разбить на несколько файлов подсказки. Например,
    представленную выше командную строку можно разбить на следующие
    два файла подсказки:

    Имя файла Содержимое
    LISTOBJS mainline+
    wd+
    ln tx
    LISTLIBS lib\comm+
    lib\suррort

    Теперь команду TLINK можно ввести в следующем виде:
    tlink /c @listobjs,fin,mfin,@listlibs
    Параметры командной строки переопределяют параметры, заданные в файле подсказки.


    Файл TLINK.CFG


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


    Файл WINSPCTR.LOG


    Первая строка в отчете (отчетах) WINSPCTR.LOG показывает вам
    дату и время возникновения исключительной ситуации. На второй
    строке перечисляется:
  • тип исключительной ситуации;

  • имя модуля;

  • логический адрес;

  • физический адрес;

  • текущая задача во время особой ситуации.

  • Если указатель стека во время исключительной ситуации слишком мал, TOOLHELP.DLL автоматически переключает стек. Когда это
    происходит, в конце второй строки файла регистрации выводится сообщение "Stack Switched".


    Файлы конфигурации


    При запуске Turbo Debugger использует следующие файлы конфигурации, инициализации и сеанса:
    - TDCONFIG.TD
    - TFCONFIG.TDW
    - TDCONFIG.TD2
    - TDW.INI
    - XXXX.TR
    - XXXXTRW
    - XXXX.TR2
    Файлы конфигурации TDCONFIG.TD, TDCONFIG.TDW и TDCONFIG.TD2
    создаются с помощью отладчиков TD, TDW и TD32 соответственно. Параметры, установленные в этих файлах, переопределяют параметры,
    используемые данными отладчиками по умолчанию. Вы можете модифицировать файлы конфигурации с помощью инсталляционных программ
    TDINST.EXE. TDWINST.EXE и TD32.EXE.
    TDW.INI - это файл инициализации, используемый TDW.EXE и
    TD2.EXE. Он содержит установки для используемого отладчиком видеодрайвера, расположение файла TDWINTH.DLL (динамически компонуемой библиотеки, применяемой для отладчик в Windows), и параметры удаленной отладчик для WRSETUP.EXE.
    Программа установки отладчика помещает TDW.INI в основной
    каталог Windows. В этой копии TDW.INI параметр видеодрайвера
    ([VideoDLL]) устанавливается в SVGA.DLL, а установка DebuggerDLL
    указывает маршрут к TDWINTH.DLL. Полное описание TDW.INI можно
    найти в файле TD_HELP!.TXT. Файлы с расширениями .TR, .TRW и .TR2
    содержат параметры состояния сеанса отладчиков.
    Когда вы запускаете Turbo Debugger, он ищет файлы конфигурации в следующей последовательности:
  • в текущем каталоге;

  • в каталоге, заданном в установке Turbo Directory программы
    установки Turbo Debugger;

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

  • Если Turbo Debugger находит файл конфигурации, то параметры,
    заданные в этом файле, переопределяют встроенные по умолчанию установки. Если при запуске Turbo Debugger вы указываете параметры
    командной строки, то они переопределяют соответствующие значения
    по умолчанию и значения, заданные в файле конфигурации.
    Для поддержки доступных типов видеоадаптеров и мониторов TDW
    и TD32 используют различные типы видео-DLL. При инсталляции Turbo
    Debugger запустите программу установки TDWINI.EXE, которая поможет вам выбрать или модифицировать используемые отладчиками видео-DLL. По умолчанию TDW и TD32 используют драйвер SVGA.DLL, который поддерживает большинство видеоадаптеров и мониторов. Подробнее об этом рассказывается в оперативном справочнике Help
    программы TDWINI.EXE.
    Кроме того, Turbo Debugger поддерживает в TD, TDW и в TD32
    отладку с двумя мониторами. Для этого вам потребуется цветной монитор и видеоадаптер и монохромный монитор и видеоадаптер. При
    отладке с двумя мониторами Turbo Debugger выводится на монохромном мониторе, а отлаживаемая программа - на цветном. Это позволяет видеть во время отладки вывод программы. Для загрузки TD или
    TDW в режиме с двумя мониторами используйте параметр командной
    строки -do. При работе с TD32 в Windows 32s нужно использовать
    видеобиблиотеку SVGA.DLL. В файл TDW.INI в раздел [VideoOptions]
    для этого нужно включить mono=yes. Для установки параметров видеоадаптера используйте утилиту TDWINI.EXE.


    Файлы конфигурации


    Если каждый раз в командной строке используется один и тот
    же набор параметров, то их можно перечислить в файле конфигурации. Это обычный текстовый файл, в котором параметры разделены
    пробелами. По умолчанию BCC использует файл конфигурации с именем
    TURBOC.CFG, а BCC32 - BCC32.EXE. Параметры командной строки переопределяют параметры файлов конфигурации.


    Файлы описания проектов


    Файлы описания проекта автоматизируют процесс построения
    приложений Windows при использовании IDE Borland C++. Файлы описания проектов с расширением .PRJ содержат информацию о том, как
    построить конкретное приложение. Используя такое инструментальное
    средство как администратор проектов, вы можете создавать и обслуживать файлы проектов, описывающие каждое из разрабатываемых
    приложений. Файлы описания проектов содержат список обрабатываемых файлов и параметры каждого используемого инструментального
    средства. Эта информация используется администратором проектов
    для автоматического построения приложения. Файлы описания проектов и администратор проектов - это эквиваленты формирующих файлов
    и утилиты Make, но их легче обслуживать и использовать, чем формирующие файлы. Для установки параметров проекта можно использовать диалоговое окно Project Options интегрированной среды.


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


    Файл определения модуля .DEF обеспечивает информацию о содержимом файла и требованиях к системе приложения Windows. Эта
    информацию используется компоновщиком и включает в себя размер
    динамически распределяемой памяти и стека, а также характеристики
    кода и данных. Файл .DEF перечисляет также функции, которые должны быть доступными для других модулей (экспортируемые функции), и
    используемые функции других модулей (импортируемые функции). Так
    как компоновщик Borland имеет и другие способы получения этой информации, файл .DEF для него не обязателен. Файл .DEF содержит
    несколько операторов. Перечислим некоторые из них:

    Оператор Функция

    NAME
    Задает имя программы. Если нужно построить DLL,
    используйте оператор LIBRARY. Каждый файл .DEF
    обязательно должен иметь оператор NAME или
    LIBRARY. Заданное имя должно совпадать с именем
    выполняемого файла. WINDOWAPI идентифицирует
    программу, как выполняемую программу Windows.

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

    EXETYPE
    Помечает файл, как выполняемый файл Windows (это
    необходимо для всех выполняемых файлов Windows.

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

    HEAPSIZE
    Задает размер локальной динамически распределяе-
    мой памяти приложения.

    STACKSIZE
    Задает размер стека приложения. Для создания DLL
    этот оператор использовать нельзя.

    Кроме указанных в файлах .DEF используются операции EXPORTS
    и IMPORTS. Оператор EXPORTS перечисляет функции в программе или
    DLL, которые будут вызываться другими приложениями или Windows
    (экспортируемые функции или функции обратного вызова). Экспортируемые функции идентифицируются компоновщиком и вводятся в таблицу экспорта.
    Чтобы избежать создания в файлах .DEF длинных секций
    EXPORTS, в Borland C++ предусмотрено ключевое слово _export. Отмеченные этим ключевым словом функции будут идентифицироваться
    компоновщиком и вводиться компоновщиком в таблицу экспорта.


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


    Если в командной строке задается множества файлов и параметров, поместите их в файл подсказки. Эти текстовые файлы позволяют
    задать более длинную команду, чем это допускает операционная система. Чтобы использовать файл подсказки, дайте команду:
    BCC @[маршрут]файл_подсказки.rsp
    В команде можно задать несколько файлов подсказки (через
    пробел).


    Файлы сценариев ресурсов


    Приложения Windows обычно используют ресурсы. Ресурсы - это
    пиктограммы, меню, диалоговые окна, шрифты, курсоры, битовые массивы и ресурсы, определенные пользователем. Ресурсы определяются
    в файле, который называется файлом сценария ресурса. Эти файлы
    имеют расширение .RC.
    Для использования ресурсов вам потребуется компилятор ресурсов Borland BRC (Borland Resource Compiler) или BRC32, который
    компилирует файл .RC в двоичных формат. При компиляции ресурсов
    создается файл .RES. Компоновщик TLINK или TLINK32 позволяет
    затем связать файл .RES с генерируемым им файлом .EXE. При этом
    файл .EXE отмечается также как выполняемый файл Windows.


    Файлы, входящие в состав пакета Turbo Debugger



    Имя файла Описание
    DUAL8514.DLL Видео-DLL, которые поддерживают отладку с
    двумя мониторами для мониторов 8514.
    STB.DLL Видео-DLL, поддерживающая видео-адаптеры
    STB.
    TD.EXE Отладчик для отладки приложений DOS.
    TDDEBUG.386 Этот драйвер используется TDW.EXE для доступа к специальным отладочным регистрами процессора 80386 (или старше).
    TDHELP.TDH Справочных файл для TD.EXE.
    TDKBDW16.DLL Файл поддержки для Windows 32s.
    TDKBDW32.DLL Файл поддержки для Windows 32s.
    TDREMOTE.EXE Драйвер, используемый в удаленной системе
    для поддержки удаленной отладки в DOS.
    TD32.ICO Пиктограмма, используемая для TD32.EXE.
    TD32HELP.TDH Справочный файл для TD32.EXE.
    TDVIDW16.DLL Файл поддержки для Windows 32s.
    TDVIDW32.DLL Файл поддержки для Windows 32s.
    TDW.EXE Выполняемая программа для отладки 16-разрядных программ Windows.
    TDW.INI Файл инициализации, используемый TDW.EXE и
    TD32.EXE. Он создается программой инсталляции и помещается в основной каталог Windows.
    TDWGUI.DLL Видео-DLL, используемая для вывода окна отладчика TDW в Windows 3.х или TD32 в Windows 32s.
    TDWHELP.TDH Справочный файл для TDW.EXE.
    TDWINTH.DLL Поддерживающая DLL для TDW.EXE.
    WREMOTE.EXE Драйвер для удаленной отладки в Windows.
    TDINST.EXE Создает и модифицирует файл конфигурации
    TDCONFIG.TD.
    TDMEM.EXE Выводит на экран доступную память компьютера, включая дополнительную и расширенную.
    TDRF.EXE Утилита передачи файлов, используемая для
    передачи файлов в удаленную систему.
    TD32INST.EXE Создает и модифицирует файл конфигурации
    TD32 - TDCONFIG.TD32.
    TDSTRIP.EXE Удаляет из файлов .EXE и .DLL используемую
    отладчиком отладочную информацию (таблицу
    идентификаторов) без перекомпоновки файлов.
    TDSTRP32.EXE Удаляет из файлов .EXE и .DLL используемую
    отладчиком отладочную информацию (таблицу идентификаторов) без перекомпоновки файлов.
    TDUMP.EXE Выводит на экран структуру 16- или 32-раз-
    рядных файлов .EXE, .DLL и .OBJ, а также
    содержимое отладочную информацию об идентификаторах.
    TDWINI.EXE Позволяет изменить и настроить параметры
    видеодрайвера отладчика.
    TDWINI.HLP Справочный файл для TDWINI.EXE.
    TDWINST.EXE Создает и модифицирует файл конфигурации
    TDCONFIG.EXE. Настраивает для TDW параметры
    вывода и цвета экрана.
    WRSETUP.EXE Файл конфигурации для утилиты WREMOTE -
    драйвера удаленной отладки.
    TD_ASM.TXT Файл с информацией по отладке программ
    на Turbo Assembler, которая полезна также
    при отладке программ со встроенным ассебмлером.
    TD_HELP!.TXT Файл с ответами на общие вопросы. Среди
    прочего в нем обсуждаются синтаксические
    отличия между анализом выражений в Turbo
    Debugger и компиляторах, отладка программ на нескольких языках др.
    TD_HDWMP.TXT Файл с информации о настройке конфигурации
    отладчика для использования аппаратных отладочных регистров.
    TD_RDME.TXT Содержит последнюю информацию, отсутствую-
    щую в руководстве.
    TD_UTILS.TXT Описывает утилиты отладчика, работающие в
    режиме командной строки: TDSTRIP, TDUMP,
    TDWINST, TD32INST, TDSTRP32, TDMEM, TDMAP и
    TDUMP32.
    MAKEFILE Формирующий файл, используемый в примерах
    программ.
    TDWDEMO.BUG Исходный код примера программы с ошибками
    (для отладки).
    TDWDEMO.H Файл заголовка, используемых примером прог-
    раммы.
    TDWDEMO.ICO Пиктограмма примера программы.
    TDWDEMO.IDE Файл проекта для примера программы.
    TDWDEMO.RC Файл ресурса для примера программы.
    S_PAINT.C Исходный код примера программы.
    S_PAINT.EXE Пример программы.



    Файлы-заголовки ObjectWindows


    Файлы-заголовки находятся в подкаталоге OWL\INCLUDE и содержат описания функций классов и определений типов данных и констант.

    Имя файла Определение класса Использование
    applicat.h TApplication Управляет базовым повелением всех приложений ObjectWindows.
    bitmapga.h TBitMapGadget Выводит на экран массив растровых изображений.
    bitset.h TBitSet Устанавливает или сбрасывает один или более бит.
    TCharSet Устанавливает или сбрасывает байты.
    button.h TButton Создает различные виды
    управляющих элементов типа командных кнопок.
    buttonga.h TButtonGadget Создает реквизиты командных кнопок, которые можно выключать и включать щелчком "мыши".
    cearray.h TCelArrayСоздает массив ячеек.
    checkbox.h TCheckBoxПредставляет управляющий
    элемент типа кнопки с независимой фиксацией.
    chooseco.h TChooseColor Представляет режимное диалоговое окно с возможностью выбора цвета.
    choosefo.h TChooseFont Представляет режимное диалоговое окно с возможностью выбора шрифта.
    clipboar.h TClipboard Содержит функции, управляющие обработкой данных в буфере вырезанного изображения.
    clipview.h TClipboardViewer Регистрирует TClipboardViewer как средство просмотра TClipboard.
    color.h TColor Содержит функцию, используемую для упрощения
    стандартной операции с цветом Windows.
    combobox.h TComboboxСоздает в окне комбинированный блок или управляющий элемент комбинированного блока и класс TComboBoxData, который используется для передачи данных между управляющими элементами.
    commdial.h TCommonDial Абстрактный базовый класс для объектов TCommonDialog.
    compat.h Определяет служебные функции и константы ObjectWindows.
    control.h Tcontrol Используется для создания в производных классов управляющих объектов.
    controlb.h TControlBar Реализует полосу инструментальных средств, обеспечивающую мнемонический доступ к командным кнопкам.
    contolg.h TControlGadget Позволяет помещать управляющие элементы в окно реквизитов.
    dc.h TBandInfo, TClientDC,
    TDC, TDesktopDC, TIC,
    TDibDC, TPrintDC,
    TScreenDC, TWindowDC
    Включающие классы GDI DC, создающие объекты DC.
    decframe.h TDecoratedFrame Создает клиентное окно, куда можно поместить "декорации".
    decmdifr.h TDecoratedMDIFrame Создает объект рамки, поддерживающий "декорированные" дочерние окна.
    dialog.h TDialog Создает режимное и безрежимное диалоговое окно с интерфейсными элементами.
    TDialogAttr Содержит атрибуты диалогового окна.
    dispatch.h Определяет функции диспетчеризации, созданные для обработки сообщений Windows.
    docmanag.h TDocManager Создает объект администратора документов, который работает с документами и шаблонами.
    TDocTemplate Создает шаблоны.
    docview.h TDocument, TView,
    TStream, TInStream,
    TWindowView, TOutStream
    Создает, уничтожает и посылает сообщения о просмотре документов.
    edit.h TEdit Создает управляющий интерфейсный элемент редактирования.
    editfile.h TEditFileСоздает окно редактирования файла.
    editsear.h TEditSearch Создает управляющий элемент редактирования, отвечающий за команды поиска и замены.
    editview.h TEditViewОболочка просмотра для TEdit.
    except.h TXOwl Базовый класс обработки исключительных ситуаций.
    TXOutOfMemory Описывает исключительную
    ситуацию нехватки памяти.
    TXCompatibility Описывает исключительную
    ситуацию состояния.
    TStatus Используется для обратной
    совместимости.
    filedoc.h TFileDocument Открывает и закрывает область просмотра документа.
    findrepl.h TFindDialog,
    TFindReplaceDialog
    Эти классы создают и определяют атрибуты безрежимных диалоговых окон, отвечающих на команды поиска и замены.
    floatfra.h TFloatingFrame Реализует в родительском
    окне свободную рамку.
    framewin TFrameWindow Управляет специфическим для окна поведением, таким как перемещение с помощью клавиатуры и обработка команд.
    TMenuDesc Описывает строку меню.
    gadget.h TGadget Создает объект реквизита, принадлежащий окну реквизитов и имеющий заданные атрибуты.
    gedgetwi.h TGadgetWindow Обслуживает для окна список неперекрывающихся реквизитов.
    gdibase.h TGdiBase Абстрактный базовый класс
    для классов GDI.
    gdiobjec.h TGdiObject Базовый класс GDI.
    TPen, TBrush, TFont,
    TBitMap, TPalette, TIcon,
    TCusor, TDib, TRegion.
    Эти классы специфицируют объекты GDI.
    groupbox.h TGroupBoxСоздает групповой объект,
    представляющий элемент группового блока в Windows.
    inputdia.h TInputDialog Общее диалоговое окно.
    keymodet.h TKeybardModeTracker Смешанный класс, созданный для отслеживания изменений режимов клавиатуры.
    layoutco.h TLayoutConstraint Создает ограничения разметки.
    layoutwi.h TLayoutMetrics Создает ограничения разметки, используемые для характеристик разметки в окне.
    listbox.h TListBox Создает объект блока списка.
    TListBoxData Используется для передачи контекста блока списка.
    listview.h TListView Обеспечивает просмотр блоков списка.
    mdi.h TMDIClient Управляет дочерними окнами MDI.
    TMDIFrame Основное окно MDI-приложения.
    mdichild.h TMDIChild Определяет поведение дочернего окна MDI.
    menu.h TMenu, TPopupMenu, TSystemMenu Создает объекты меню.
    messageb.h TMessageBar Реализует строку сообщения.
    metafile.h TMetaFileBar Класс-оболочка для TMetaFileDC.
    module.h TModule Определяет базовое поведение для библиотек и приложений ObjectWindows.
    opensave.h TOpenSave Базовый класс для режимных диалоговых окон открытия и сохранения.
    owlall.h Включаемый файл для всех классов ObjectWindows.
    owlcore.h Включаемый файл для классов ядра ObjectWindows.
    owldefs.h Определения макрокоманд, используемых в программах ObjectWindows.
    owlpch.h Определения макрокоманд, данных и функций, используемых в программах ObjectWindows.
    point TPoint, TSize, TRect Математические классы.
    TDropinfo Поддерживает операции буксировки имени файла.
    TProcInstance Класс поддержки Win16.
    TPointer Обеспечивает надежную работу с указателями.
    preview.h TPreviewPage Выводит страницу документа в окне предварительного просмотра.
    printdia.h TPrintDialog Выводит диалог печати или режимное окно печати.
    printer.h TPrinter Представляет устройство печати.
    TPrintout Представляет печатаемый документ.
    TPrinterAbortDlg Представляет диалоговое окно прерывания печати.
    radiobut.h TRadioButton Создает управляющий элемент типа кнопки с зависимой фиксацией.
    scrollba.h TScrollBar Представляет управляющий элемент типа вертикальной или горизонтальной полосы прокрутки.
    TScrollBarData Содержит значения позиции указателя полосы прокрутки.
    scroller.h TScroller Реализует автоматическую прокрутку окна.
    signatur.h Определяет шаблоны сигнатуры обработки сообщений, используемых функциями обработки событий ObjectWindows.
    slider.h TSlider Определяет базовое поведение скользящих маркеров.
    THSlider Горизонтальный скользящий маркер.
    TVSlider Вертикальный скользящий маркер.
    static.h TStatic Создает в окне статический управляющий элемент.
    statusba.h TStatusBar Строит строку состояния.
    textgadg.h TTextGadget Строит дополнительный текстовый объект.
    tinycarp.h TTinyCaption Создает для окна меньшую строку заголовка.
    toolbox.h TToolBox Создает инструментальный объект с заданным числом строк и столбцов.
    validate.h TValidator Базовый класс проверки допустимости.
    TPictureValidator Средство проверки допустимости картинки.
    TFilterValidator Средство проверки допустимости фильтра.
    TRangeValidator Средство проверки допустимости диапазона.
    TLookupValidator Средство проверки допустимости преобразования.
    TStringLookupValidator Средство проверки допустимости строки.
    vbxctl.h TVbxControl Интерфейс для управляющих элементов VBX.
    TVbxEventHandler Обрабатывает события от управляющих элементов VBX.
    version.h Определяет внутренний номер версии библиотеки ObjectWindows.
    window.h TWindow Обеспечивает специфическое для окна поведение и инкапсулирует многие функции API.
    windowev.h Определяет обработчики событий и таблицы макрокоманд реакции на сообщения Windows.



    Фатальные ошибки


    Фатальные ошибки генерируются компилятором, компоновщиком и утилитой MAKE и приводят с немедленному прекращению процесса компиляции. Если такую ошибку генерирует компилятор или утилита MAKE, то файл .EXE не создается. Если фатальная ошибка генерируется компоновщиком, то файл .EXE может создаваться.
    Фатальные ошибки встречаются редко. Некоторые из них указывают на внутреннюю ошибку компилятора. Вы должны выполнить соответствующие действия, а затем


    Флаги формата



    Флаг Описание
    skipws Пропускает при вводе пробелы и разделители.
    left Выравнивание вывода влево.
    right Выравнивание вывода влево.
    internal Дополнение после знака или указателя основания.
    dec Десятичное преобразование.
    oct Восьмеричное преобразование.
    hex Шестнадцатиричное преобразование.
    showbase Показывает в выводе индикатор основания.
    showpoint Показывает при выводе с плавающей точкой десятичную точку.
    uppercase Преобразует шестнадцатиричный вывод в верхний
    регистр.
    showpos Выводит с положительными числами символ '+'.
    scientific Добавляет к числам с плавающей точкой суффикс
    с показателем степени (E).
    fixed Для вывода чисел с плавающей точкой использует десятичную фиксированную точку.
    unitbuf После включения выводит все потоки.
    stdio После включения выводит stdout и stderr.



    Формат вывода:


    Описатель {Класс} Модуль Позиция "Заголовок"
    Линии слева показывают структуру дерева. С помощью этих линий каждое окно соединяется с его предком, "братскими" окнами и
    потомками. Линии рисуются таким же образом, как в администраторе
    файлов. Ромб после каждого окна показывает, имеет ли окно дочерние окна. Если он пустой, то дочерних окон нет. Если он содержит
    символ +, то дочерние окна имеются, но они не показаны. Если он
    содержит символ -, то имеются дочерние окна, и они выведены в
    древовидной схеме (видим по крайней мере один уровень дочерних
    окон, другие уровни могут быть скрыты).
    "Описатель" - это описатель окна, возвращаемый CreateWindow.
    "Класс" - это имя класса окна, описанного в области списка
    классов.
    "Модуль" - это имя выполняемого модуля (.EXE или .DLL), который создал окно. Строго говоря, это имя модуля, являющегося
    владельцем сегмента данных, переданного как параметр hInstance
    функции CreateWindow.
    "Позиция" может либо не указываться, если окно скрыто, либо
    это (x_Begin,y_Begin)-(x_End,y_End), если окно является видимым.
    Для окон верхнего уровня это координаты экрана. Для порожденных
    окон это координаты в области пользователя родительского окна,
    которое используется в CreateWindow для создания порожденного окна.
    "Заголовок" - это заголовок окна или текст, возвращаемый
    функцией GetWindowText или сообщением WM_GETTEXT. Если заголовок
    - это нулевая строка, то кавычки опускаются.


    Формат вывода:


    Описатель ["Заголовок" {Класс}] Сообщение Статус
    "Описатель" - это описатель окна, получающего сообщение.
    "Заголовок" - это заголовок окна. Если заголовок - это нулевая строка, то вместо него выводится имя класса (в фигурных скобках).
    "Сообщение" - это имя сообщения, определенное в файле WINDOWS.H. Существуют также неописанные сообщения Windows, показанные символами в нижнем регистре. Номера неизвестных сообщений
    (определенных пользователем) показываются как WM_USER+OxXXXX, если они больше или равны WM_USER, или WM_OxXXXX, если они меньше
    WM_USER. Номера зарегистрированных сообщений (из RegisterWindowsMessage) показываются вместе с их зарегистрированными именами в
    одиночных кавычках.
    "Статус" представляет собой следующее:
  • Значение Dispatched показывает, что сообщение получено через DispatchMessage.

  • Значение Sent [from XXXX] показывает, что сообщение применяется через SendMessage. Если оно посылалось через другое
    окно, то from XXXX показывает описатель окна. Если оно посылалось из того же окна, что и принимает сообщение, то
    указывается fromself. Если сообщение поступает от Windows,
    то часть from... опускается.

  • Return показывает, что сообщение было принято через
    SendMessage и теперь возвращается.

  • Дополнительная информация, относящаяся к каждому сообщению. В случае возвращаемого сообщения здесь показывается
    это значение (в числовой форме или с более конкретной информацией по сообщению, например, wm_GETTEXT. Для посылаемых и диспетчеризуемых сообщений здесь показывается параметры сообщения. WinSight интерпретирует параметры таким
    образом, чтобы получилась читаемая форма. Для сообщений,
    имеющих связанные с ними структуры данных (например,
    WM_CREATE) она перехватывает эти структуры и включает их в
    вывод.



  • Формат вывода:


    Класс (Модуль) Функции Стили
    Ромбы после классов при получении окном любого сообщения
    становятся черными. Это позволяет видеть, какие окна получают в
    данный момент сообщения. Если дочерние окна данного окна в дереве
    убраны, то будет инвертироваться ромб данного окна, что указывает
    на активность дочерних окон.
    "Класс" - это имя класса. Некоторые предопределенные классы
    Windows имеют числовые номера. Например, в качестве имени класса
    всплывающего меню используется число 32768. Для таких классов показывается как номер, так и имя, например, #32768:PopupMenu. Однако фактическое имя класса состоит только из числа. В формате MAKEINTRESOURCE используется также идентификатор ресурса.
    "Модуль" - это имя выполняемого модуля (.EXE или .DLL), который зарегистрировал класс.
    "Функция" - это адрес функции класса окна.
    "Стили" представляют собой стили cs_ класса. Их имена совпадают с определениями cs_ в файле windows.h, но cs_ удаляется, и
    имя указывается с различным регистром символов.


    Форматирование ввода-вывода


    Форматирование ввода и вывода определяется различными флагами состояний формата, перечисленными в классе ios. Эти состояния
    определяются битами числа типа long int следующим образом:
    public:
    enum {
    skipws = 0x0001, // пропуск пробельного символа на
    // вводе
    left = 0x0002, // вывод с левым выравниванием
    right = 0x0004, // вывод с правым выравниванием
    internal = 0x0008, // заполнитель после знака или
    // указателя системы счисления
    dec = 0x0010, // десятичное преобразование
    oct = 0x0020, // восьмиричное преобразование
    hex = 0x0040, // шестнадцатиричное преобразование
    showbase = 0x0080, // показать на выходе указатель
    // системы счисления
    showpoint = 0x0100, // показать позицию десятичной точки
    // (на выходе)
    uppercase = 0x0200, // вывод шестнадцатиричных значений
    // буквами верхнего регистра
    showpos = 0x0400, // показать знак "+" для
    // положительных чисел
    scientific = 0x0800, // использовать запись чисел с плава-
    // ющей точкой с выводом экспоненты Е
    // например, 12345E2
    fixed = 0x1000, // использовать запись чисел с плава-
    // ющей точкой типа 123.45
    unitbuf = 0x2000, // сброс на диск всех потоков
    // после вставки
    stdio = 0x4000, // сброс на диск stdout и stderr после
    // вставки
    };
    Эти флаги читаются и устанавливаются функциями-элементами
    flags, setf и unsetf.


    Функции библиотеки graphics


    Графические функции Borland C++ делятся на несколько категорий:
  • функции управления графической системой;

  • функции черчения и заполнения;

  • функции манипулирования экранами и графическими окнами;

  • функции вывода текстов;

  • функции управления цветами;

  • функции обработки ошибок;

  • функции запроса состояния.



  • Функции доступа к данным


    TDocument предусматривает ряд функций для доступа к данным.
    Вы можете обращаться к данным в простом последовательном потоке
    или тем способом, который зададите в производных классах.
    TDocument предусматривает две функции InStream и OutStream,
    которые возвращают указатель на TInStream и TOutStream. Базовые
    версии этих функций не выполняют никаких действий и возвращают 0.
    В производном классе их нужно переопределить, чтобы они возвращали указатель на объект. Таким образом вы можете обеспечить в
    классе документа доступ к потокам.
    TInStream и TOutStream - это абстрактные базовые классы,
    производные от isteam и ostream класса TStream. TStream обеспечивает минимальные функции для связи потока с документом, а isteam
    и ostream - это стандартные потоки С++. Из TInStream и TOutStream
    нужно создать производные потоковые классы, специфические для
    приложения. Эти классы имеют функции для работы с потоками.
    Каждый документ поддерживает список открытых потоков, который обновляет при добавлении или удалении потоков. В начале этого
    списка находится элемент данных StreamList класса TDocument, который указывает первый поток в списке или содержит 0. Каждый объект TStream в списке имеет функцию-элемент NextStream, которая
    указывает на следующий поток в списке.
    Потоки могут обеспечивать только простой последовательный
    доступ к данным. Если документы содержат файлы мультимедиа, таблицы баз данных или другие сложные данных, то вам потребуются более развитые методы доступа. Для этой цели в TDocument имеется
    еще две функции доступа - Open и Close, которые вы можете переопределить и задать нужное поведение при открытии и закрытии. На
    определение открытия документа никаких ограничений не накладывается. Вы можете задать настолько простое или сложное открытие,
    насколько это требуется.
    Close обеспечивает несколько больше функциональных возможностей. Эта функция проверяет существующие дочерние объекты документа и перед закрытием документа пытается закрыть их все. Данная
    функция позволяет закрыть документ, когда это требуется.
    TDocument имеет также ряд функций, позволяющих вам защитить
    данные. IsDirty проверяет, был ли документ модифицирован. IsOpen
    проверяет состояние документа (открыт он или нет) или наличие потоков в списке. Commit сохраняет изменения данных в памяти. Revert выполняет действие, обратное Commit.


    Функции элементы (методы)


    Как вы уже видели раньше, классы С++ могут содержать в качестве
    своих элементов не только данные, но и функции элементы. Функция эле
    мент - это функция, объявленная внутри определения класса и тесно
    связанная с типом этого класса. В нашем примере - это операции которые выполняются в сберегательных банках. Наш объект sber_bank имеет
    функции элементы deposite (вкладывать) и withdraw (снимать) деньги.
    sber_bank
    Объект сбербанк
    < deposit << Вклад денег
    $$$ < >
    <
    Данные > withdraw >> Снятие денег
    Функции элементы
    Наглядное представление функции элемента withdraw() приводится
    ниже:
    Селектор
    Определяемый класс Имя функции элемента
    Возвращаемый тип Аргумент
    v v v v v
    double sber_bank::withdraw(double bucks)
    {
    big_bucks -= bucks;
    if (big_bucks < 0.0) {
    printf("К сожалению, товарищ, у вас нет таких денег!\n");
    big_bucks -= 10.0; // Штрафная санкция
    }
    return big_bucks;
    }
    Обратите особое внимание на использование операции селектор области действия '::' между определяемым классом и функцией элементом.
    Имя класса sber_bank используется для указания компилятору, к какому
    классу принадлежит withdraw (так как могут иметься и другие варианты
    withdraw, принадлежащие другим классам). При внутреннем определении
    селектор '::' не потребуется, так как и так ясно, что withdraw принадлежит классу sber_bank.
    По аналогии, при обращении функций к элементам своего объекта,
    селектор '.' лишний:
    double sber_bank::withdraw(double bucks)
    {
    Обращение к данным своего объекта
    v (не указывается принадлежность
    big_bucks -= bucks; объекту - sber_bank.)
    if (big_bucks < 0.0) {
    printf("К сожалению, товарищ, у вас нет таких денег!\n");
    big_bucks -= 10.0; // Штраф за перерасход
    }
    return big_bucks;
    }


    Функции в DLL


    Утилита IMPDEF создает редактируемый исходный файл, который
    перечисляет все экспортные функции в DLL. Вы можете отредактировать этот файл .DEF так, чтобы он содержал только те функции, которые вы хотите сделать доступными для нужной прикладной программы, а затем выполнить IMPLIB для отредактированного файла .DEF. В
    результате получается библиотека импорта, которая содержит информацию импорта для заданного подмножества экспортируемых функций
    DLL.
    Например, пусть вы определяете DLL, которая предоставляет
    функции для использования различными прикладными программами.
    Каждая экспортируемая функция в DLL определяется с помощью оператора _exрort. Теперь, если все прикладные программы используют
    все экспортируемые функции DLL, вы можете просто использовать
    IMPLIB для создания одной библиотеки импорта для DLL и поставлять
    эту библиотеку импорта с DLL. Библиотека импорта может быть скомпонована с любыми прикладными программами, исключая таким образом
    необходимость перечисления для каждой прикладной программы каждой
    используемой ей функции DLL в секции IMPORT файла определения модуля.
    Теперь, пусть нужно передать некоторую часть экспортируемых
    функций DLL отдельной прикладной программе. В идеале требуется
    скомпоновать специальную библиотеку импорта с этой прикладной
    программой - библиотеку импорта, которая предоставляет только
    подмножество функций, которые будут использоваться прикладной
    программой. Все другие экспортируемые функции в DLL для клиентной
    прикладной программы должны быть скрыты.
    Для создания библиотеки импорта, которая удовлетворяет этим
    условиям, выполните IMPDEF для откомпилированной и скомпонованной
    DLL. Утилита IMPDEF создаст файл определения модуля, который содержит в секции EXPORT перечисление всех экспортируемых функций
    DLL. Вы можете редактировать этот файл определения модуля, удаляя
    компоненты секции EXPORTS для тех функций, которые вы не хотите
    включать в библиотеку импорта. После того, как вы удалите ненужные экспортируемые функции, выполните утилиту IMPLIB для файла
    определения модуля. Результатом будет библиотека импорта, которая
    содержит информацию импорта только для экспортных функций, перечисленных в секции EXPORTS файла определения модуля.
  • Утилита TLIB: турбо библиотекарь

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

  • Командная строка утилиты TLIB

  • Использование файлов подсказки

  • Создание расширенного словаря: параметр /E

  • Задание размера страницы: параметр /P

  • Различимость регистра символов в идентификаторе: параметр /C

  • Удаление записей-комментариев: параметр /O

  • Список операций

  • Примеры



  • Функции запроса состояния графического режима



    Функция Возвращаемое значение
    getarccoords Возвращает информацию о координатах, заданных
    в последнем вызове arc или ellipse.
    getaspectratio Возвращает коэффициент сжатия для графического экрана.
    getbkcolor Возвращает текущий цвет фона.
    getcolor Возвращает текущий цвет вычерчивания.
    getdrivername Возвращает имя текущего графического драйвера.
    getfillpattern Возвращает шаблон заполнения, определяемый пользователем.
    getfillsettings Возвращает информацию о текущем шаблоне и
    цвете заполнения.
    getgraphmode Возвращает текущий графический режим.
    getlinesettings Возвращает текущие стиль, шаблон и толщину
    линии.
    getmaxcolor Возвращает максимально допустимое на текущий момент значение элемента изображения.
    getmaxmode Возвращает максимально допустимый номер режима для текущего драйвера.
    getmaxx Возвращает текущее разрешение по оси x.
    getmaxy Возвращает текущее разрешение по оси y.
    getmodename Возвращает имя данного режима драйвера.
    getmoderange Возвращает диапазон режимов для данного
    драйвера.
    getpalette Возвращает текущую палитру и ее размер.
    getpixel Возвращает цвет элемента изображения в (x,y).
    gettextsettings Возвращает текущий шрифт, направление, размер
    и способ выравнивания текста.
    getviewsettings Возвращает информацию о текущем графическом
    окне.
    getx Возвращает координату x текущей позиции (CP).
    gety Возвращает координату y текущей позиции (CP).

    В каждой из категорий графических функций Borland C++ имеется хотя бы одна функция запроса состояния. Эти функции упоминались при рассмотрении соответствующих категорий и также рассматриваются здесь отдельно. Каждая из графических функций запроса
    состояния Borland C++ имеет имя вида "get что-то" (за исключением
    категории функций обработки ошибок). Некоторые из них не воспринимают никаких аргументов и возвращают единственное значение,
    представляющее собой искомую информацию. Прочие считывают указатель структуры, определяемой в файле graphics.h, заполняют эту
    структуру соответствующей информацией и не возвращают никаких



    значений.

    Функциями запроса состояния категории управления графической

    системы являются getgraphmode, getmaxmode и getmoderange. Первая

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

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

    этого драйвера, а третья возвращает диапазон режимов, поддерживаемых данным графическим драйвером. getmaxx и getmaxy возвращают

    соответственно максимальные экранные координаты x и y для текущего графического режима.

    Функциями запроса состояния категории вычерчивания и заполнения являются функции getarccoords, getaspectratio, getfillpattern и getlinesettings. Функция getarccoords заполняет структуру, содержащую координаты, которые использовались при последнем вызове функций arc или ellipse. Функция getaspectratio сообщает текущий коэффициент сжатия, используемый графической системой для того, чтобы окружности выглядели круглыми. Функция getfillpattern

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

    Функция getfillsettings заполняет некоторую структуру текущим

    шаблоном и цветом заполнения. Функция getlinesettings заполняет

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

    Функциями запроса состояния категории манипулирования графическим окном являются getviewsettings, getx, gety и getpixel.

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

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

    информацией некоторую структуру. Функции getx и gety возвращают

    (относительно графического окна) x- и y-координаты текущей позиции (CP). Функция getpixel возвращает цвет указанного элемента изображения.

    Функция запроса состояния категории вывода текста в графическом режиме имеется только одна, и притом всеобъемлющая, - gettextsettings. Эта функция заполняет структуру информацией о текущем символьном шрифте, направлении вывода текста (по горизонтали

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

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

    Функциями запроса состоянии категории управления цветом Borland С++ являются функция getbkcolor, возвращающая текущий цвет

    фона, функция getcolor, возвращающая текущий цвет вычерчивания и

    функция getpalette, заполняющая структуру, которая включает в себя размер текущей палитры и ее содержимое. Функция getmaxcolor

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

    для текущего графического драйвера и режима (размер палитры -1).

    И наконец, функции getmodename и getdrivername возвращают

    имя заданного режима драйвера и имя текущего графического драйвера, соответственно.


    Функции запроса состояния


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


    Функция Error


    Виртуальная функция-элемент Error предупреждает пользователя, что содержимое редактируемого управляющего элемента не проходит проверки допустимости. Стандартные объекты проверки допустимости представляют простое диалоговое окно, уведомляющее пользователя, что содержимое ввода является недопустимым, и указывает,
    какой должна быть вводимая информация.
    Хотя большинство производных объектов переопределяют Error,
    ее не следует вызывать непосредственно. Valid вызывает Error, если IsValid возвращает False.


    Функция IsValid


    Виртуальная функция-элемент IsValid вызывается функцией Valid, которая передает IsValid проверяемую строку текста. IsValid
    возвращает True, если строка представляет допустимые данные. IsValid выполняет фактическую проверку допустимости, так что при
    создании собственных объектов проверки допустимости вам потребуется переопределить эту функцию. Обратите внимание, что IsValid
    не вызывается непосредственно. Это делается через Valid, которая
    вызывает Error, если IsValid возвращает False. Это позволяет отделить проверку допустимости от сообщения об ошибке.


    Функция IsValidInput


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


    Функция main.


    Аргументы функции main (argc, argv и env) всегда передаются
    функции main подпрограммой инициализаци и Borland С++.
  • argc (тип integer) - число аргументов командной строки.

  • argv - массив указателей на строки (char *[]). В версиях
    DOS 3.x argv[0] - полное (т.е. включая маршрут доступа)
    имя запускаемой программы. argv[x] - параметр, набранный
    в командной строке после функции (порядковый номер - x).

  • env - также массив указателей на строки. Каждый элемент
    env[] содержит строку вида ENVVAR = value. Аргумент env
    доступен также через глобальную переменную environ. argc и
    argv также доступны через глобальные переменные _argc и
    _argv.

  • Для использования соглашения о связях Паскаля можно использовать ключевое слово cdecl. Например:
    cdecl main(int argc, char *argv[], char *envp[])


    Функция set_new_handler (new.h)


    Устанавливает функцию, вызываемую, когда operator new() или
    operator new[] не могут выделить запрошенную память. По умолчанию
    операции new генерируют в этом случае исключительные ситуации
    xalloc. Это поведение можно переопределить вызовом для установки
    нового обработчика set_new_handler. Для возврата к обычной версии
    используйте set_new_handler(0).
    Заданный пользователем обработчик должен выполнять возврат
    после освобождения памяти, генерировать исключительную ситуацию
    xalloc и вызывать функции abort или exit.


    Функция set_termionate (except.h)


    Позволяет вам установить функцию, определяющую поведение
    программы при ее завершении, когда не найден обработчик исключительной ситуации. Заданная функция описывается как функция типа
    terminate_function. Такая функция не имеет аргументов и возвращает void.
    По умолчанию указанная исключительная ситуация возникает при
    вызове в программе функции terminate. Обычно это приводит к вызову abort. Затем программа завершается с сообщением "Abnormal
    program termination". Если вы хотите вызывать в terminate другую
    функцию, то можете ее определить. Такая функция называется функцией завершения и позволяет вам выполнять действия, не реализованные в abort. Функция завершения не должна возвращаться в terminate.


    Функция set_unexpected (except.h)


    Позволяет установить функцию, определяющую поведение программы при возникновении исключительной ситуации, не описанной в
    списке спецификаций. Действия описываемой функции зависят от типа
    функции. Функция типа unexpected_function - это функция без аргументов, возвращающая void.
    По умолчанию непредвиденные исключительные ситуации приводят
    к вызову unexpected. Если определена unexpected_func, то unexpected вызывает далее unexpected_func, куда и передается управление
    программой. В противном случае вызывается terminate. По определению unexpected_func не возвращает управление в unexpected.


    Функция terminate (except.h)


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


    Функция unexpected (except.h)


    Вызывается, когда функция генерирует исключительную ситуацию, не перечисленную в списке спецификаций. Программа вызывает
    unexpected, которая по умолчанию вызывает определенную пользователем функцию, зарегистрированную с помощью set_unexpected. Если
    такой зарегистрированной функции нет, то вызывается terminate.
    Функция unexpected не возвращает управления, однако может генерировать исключительную ситуацию.


    Функция Valid


    Функция-элемент Valid вызывается соответствующим объектом
    редактируемого управляющего элемента для проверки допустимости
    вводимых данных. Аналогично функции CanClose для интерфейсных
    объектов Valid возвращает True только если переданная ей строка
    содержит допустимые данные.
    При использовании объектов проверки допустимости с редактируемыми управляющими элементами переопределять или вызывать функцию Valid объекта проверки допустимости вам не нужно. Здесь достаточно наследуемой версии Valid. По умолчанию Valid возвращает
    True, если возвращает True функция-элемент IsValid. В противном
    случае она вызывает функцию Error для уведомления пользователя об
    ошибке и возвращает False.


    Функция WinMain


    В качестве основной точки входа приложения Windows вы должны
    предусмотреть функцию WinMain. Некоторые приложения (например,
    ObjectWindows) инкапсулируют эту точку входа. В WinMain передаются следующие параметры:
    WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
    Параметр hInstance - это описатель экземпляра приложения.
    Каждый экземпляр приложения Windows имеет уникальный описатель
    экземпляра, используемый в качестве аргумента в нескольких функциях Windows. Он может также использоваться, чтобы различать несколько экземпляров данного приложения.
    Параметр hPrevInstance - это описатель предыдущего экземпляра данного приложения. hPrevInstance равно NULL, если это первый
    экземпляр (в Win32 это значение всегда равно 0).
    lpCmdLine представляет собой указатель (в 16-разрядной
    Windows указатель типа far) на командную строку с завершающим нулем. Это значение может задаваться при вызове приложения из администратора программ или через вызов WinExec.
    nCmdShow - это целое значение, определяющее, как выводить на
    экран окно приложения (например, в виде пиктограммы).
    Возвращаемое WinMain значение в данный момент Windows не используется, однако оно может быть полезным при отладке.


    - B -

    Базовые параметры


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


    Базовые параметры дочерних окон и отображаемых элементов MDI


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


    Базовые параметры


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


    Базовый класс TValidator


    Абстрактный класс TValidator - это базовый класс, из которого получаются все объекты проверки допустимости. Все его функции-элементы всегда возвращают значения True, а Error не выполняет никаких действий. Чтобы определять, какие значения являются
    допустимыми, производные классы должны переопределять функции IsValid, IsValidInput и Error.


    Библиотека INCLUDE


    Библиотека INCLUDE\CLASSLIB содержит файлы заголовков, необходимые для компиляции программы, которая использует классы контейнеров. Для каждого ADT или FDS в этом каталоге имеется соответствующий файл заголовка. Убедитесь, что вы включили INCLUDE в
    маршрут доступа и явно ссылаетесь на файл заголовка.


    Библиотека iostream


    Библиотека iostream (определенная в файле iostream.h) содержит два параллельных семейства классов: классы, которые являются
    производными (порожденными) из streambuf, и классы, производные
    из ios. Оба эти классы являются классами нижнего уровня, и каждый
    из них выполняет различный набор задач. Один из этих двух классов
    является базовым классом для всех классов потоков.


    Библиотека классов постоянных потоков


    Опишем, что нового появилось в объектной поддержке потоков
    Borland, а затем поясним, как сделать объекты потоковыми.
    Объекты, которые вы создаете при запуске приложения (окна,
    диалоговые окна, наборы и т.д.) являются временными. Они строятся, используются и уничтожаются в ходе выполнения приложения.
    Объекты могут появляться и уничтожаться при входе и выходе из их
    области действия или при завершении программы. Сделав свои объекты, потоковыми, вы можете сохранить эти объекты в памяти или в
    файловых потоках. Поэтому они являются постоянными.
    Для постоянных потоков существует множество применений. При
    сохранении в совместно используемой памяти они могут обеспечивать
    коммуникации между процессами. Их можно передавать через модемы в
    другие системы. Кроме того, объекты можно сохранить на диске с
    помощью файловых потоков. Их можно считывать обратно и восстанавливать в том же приложении, в других экземплярах того же приложения или в других приложениях. Эффективное, содержательное и надежное использование потоков доступно для всех объектов.
    Построить собственные потоковые классы достаточно просто и
    не потребует особых издержек. Чтобы сделать класс потоковым, вам
    нужно добавить специфические элементы данных, функции-элементы и
    операции. Свой производный класс вы должны построить (прямо или
    косвенно) ил TStreamableBase. Любой производный класс также является потоковым.
    Чтобы упростить создание потоковых объектов, библиотека постоянных потоков содержит макрокоманды, добавляющие все подпрограммы, необходимые для того, чтобы сделать ваши классы потоковыми. Наиболее важными из них являются DECLARE_STREAMABLE и
    IMPLEMENT_STREAMABLE. Эти макрокоманды добавляют программный код,
    необходимый для того, чтобы сделать ваши объекты потоковыми.
    Для облегчения их использования и расширения функциональных
    возможностей объектов потоки в Borland C++ 4.0 существенно изменены. Эти изменения совместимы с существующим кодом ObjectWindows
    и кодом Turbo Vision.
    Новый потоковый код легче использовать, поскольку он предусматривает макрокоманды, освобождающие программиста от запоминания
    большинства деталей, необходимых для создания потоковых классов.
    Другие новые средства включают в себя поддержку множественного
    наследования, отслеживание версий классов и лучшую изоляцию системы. Кроме того, потоковый код реорганизован так, чтобы облегчить написание библиотек, позволяющих не компоновать потоковый
    код, если он не используется.
    Потоки перенесены из библиотеки ObjectWindows в библиотеку
    классов. Это облегчает применение потоков в приложениях, не использующих ObjectWindows.
    Потоковые средства имеют несколько дополнений. Целью этих
    изменений является обеспечение обратной совместимости, поэтому,
    если вы компилируете работающее приложение с новым потоковым кодом, приложение сможет считывать потоки, записанные в старом коде. Однако запись потоков в старом формате не предусматривается.
    В следующих разделах описываются изменения и новые возможности потоковых средств.


    Библиотека контейнерного класса


    В данном разделе описываются структуры данных BIDS (Borland
    International Data Structures), которые называются также библиотекой контейнерного класса. Контейнеры - это объекты, реализующие
    общие структуры данных, предлагающие функции-элементы для доступа
    к каждому элементу данных и добавления таких элементов. При этом
    внутренние детали скрыты от пользователей. Контейнеры могут содержать целые и вещественные числа, строки, структуры, классы,
    типы, определенные пользователями, и любые объекты C++.
    Контейнеры Borland реализуются с помощью шаблонов. Вы можете
    передавать в шаблон любой тип объекта, который хотите включить в
    контейнер. Это облегчает, например, инициализацию массивов.
    Библиотеку класса контейнера можно разделить на две категории: фундаментальные структуры данных FDS (Fundamental Data
    Structures) и абстрактные типы данных ADT (Abstract Data Types)


    Библиотеки DLL


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


    Библиотеки DOS


    Ниже представлен краткий обзор библиотечных программ Borland
    С++, доступных только для 16-разрядных приложений DOS. Библиотечные подпрограммы состоят из функций и макрокоманд, которые можно
    вызывать в программах Си и С++ для выполнения различных задач,
    включая ввод-вывод различного уровня, работу со строками и файлами, распределение памяти, управление процессом, преобразование
    данных, математические вычисления и др.
    В данном разделе вы найдете имена библиотек из файлов в подкаталоге LIB с описанием их использования, а также представленные
    по категориям библиотечные подпрограммы (в соответствии с типом
    выполняемых ими задач).


    Библиотеки импорта


    При использовании DLL вы должны дать компоновщику определения функций, которые хотите импортировать из DLL. Эта информация
    временно удовлетворяет внешние ссылки на функции, вызываемые компилируемым кодом, и сообщает загрузчику Windows, где найти функции на этапе выполнения. Сообщить компоновщику о функциях импорта
    можно двумя способами:
  • Вы можете добавить секцию IMPORT в файл определения модуля
    и перечистить все функции DLL, которые будет использовать
    данный модуль.

  • Включить библиотеку импорта для DLL можно при компоновке
    модуля.

  • Библиотека импорта содержит определения импорта для всех или
    некоторых экспортируемых функций для одной или более DLL. Утилита
    IMPLIB создает для DLL библиотеки импорта. IMPLIB создает библиотеки импорта непосредственно из DLL или из файлов определения модуля DLL (либо из их комбинации).


    Библиотеки исполняющей системы


    В приложениях DOS используются статические библиотеки исполняющей системы (OBJ и LIB). Эти приложения описаны в данном разделе. Дополнительные библиотеки вы найдете в справочнике по библиотекам.
    Существует несколько версий библиотеки исполняющей системы.
    Это версии для конкретных моделей памяти и диагностические библиотеки. Имеются также дополнительные библиотеки, обеспечивающие
    контейнеры, графику и математические операции. При выборе используемых библиотек исполняющей системы следует иметь в виду что перечисленные ниже библиотеки используются только в 16-разрядных
    приложениях DOS. Об обработке исключительных ситуаций рассказывается выше.


    Библиотеки поддержки DOS


    Статические (OBJ и LIB) 16-разрядные библиотеки исполняющей
    системы Borland С++ после установки записываются в подкаталог
    LIB. Для каждого из имен этих библиотек символ '?' представляет
    одну и 6 поддерживаемых Borland моделей памяти. Каждая модель
    имеет собственный библиотечный файл и файл поддержки математических операций с версиями подпрограмм, написанных для конкретной
    модели.
    В следующей таблице перечислены имена библиотек Borland С++,
    которые доступны только для 16-разрядных приложений DOS.

    Имя файла Использование
    BIDSH.LIB Библиотеки классов Borland модели памяти
    huge.
    BIDSDBH.LIB Диагностическая версия той же библиотеки.
    C?.LIB Библиотеки DOS.
    C0F.OBJ MS-совместимые библиотеки запуска.
    C0?.OBJ Библиотеки запуска BC.
    EMU.LIB Эмуляция операций с плавающей точкой.
    FP87.LIB Для программ, работающих на машинах с сопроцессором 80х87.
    GRAPHICS.LIB Графический интерфейс Borland.
    MATH?.LIB Математические подпрограммы.
    OVERLAY.LIB Разработка оверлеев.



    Бинарные операции



    Операция Смысл
    Операции типа сложения + Бинарный плюс (сложение)
    - Бинарный минус (вычитание)
    Операции типа умножения * Умножение
    / Деление
    % Остаток от деления
    Операции сдвига << Сдвиг влево
    >> Сдвиг вправо
    Поразрядные операции & Поразрядное И
    ^ Поразрядное исключающее ИЛИ
    | Поразрядное включающее ИЛИ
    Логические операции && Логическое И
    || Логическое ИЛИ
    Операции присваивания = Присваивание
    *= Присвоить произведение
    /= Присвоить частное
    %= Присвоить остаток
    += Присвоить сумму
    -= Присвоить разность
    <<= Присвоить сдвиг влево
    >>= Присвоить сдвиг вправо
    &= Присвоить поразрядное И
    ^= Присвоить поразрядное
    исключающее ИЛИ
    |= Присвоить поразрядное ИЛИ
    Операции отношения < Меньше
    > Больше
    <= Меньше или равно
    >= Больше или равно
    Операции равенства == Равно
    != Не равно
    Операции выбора элемента . Непосредственный выбор элемента
    -> Косвенный выбор элемента
    Операции с элементами класса :: Доступ/определение области действия
    .* Обращение через указатель к элементу класса
    ->* Обращение через указатель к элементу класса
    Условные операции a ? x : y "Если a, то x, иначе - y"
    Операция запятой , Вычислить, например, a, b, c слева - направо



    Блоки списков


    С помощью такого блока пользователь может выбирать что-либо
    из списка. Класс TListBox инкапсулирует блоки списка и определяет
    функции-элементы для создания блоков списка, модификации элементов списка, запроса о списке элемента и поиска выбранного пользователем элемента.
    Один и конструкторов TListBox имеет 7 стандартных параметров
    конструктора объекта управляющего элемента: родительское окно,
    идентификатор ресурса, размеры и положение управляющего элемента,
    а также необязательный идентификатор библиотеки.
    TListBox получает заданные по умолчанию стили управляющего
    элемента и добавляет LBS_STANDARD - комбинацию LBS_NOTIFY,
    WS_VSCROLL (для вывода вертикально полосы прокрутки), LBS_SORT
    (для сортировки списка по алфавиту) и WS_BORDER (для вывода рамки). Если вы хотите получить другой стиль, то можете модифицировать Attr.Style (в конструкторе объекта блока списка или родительского объекта).
    После создания блока списка его нужно заполнить элементами
    (строками). После этого вы можете включать, добавлять, удалять
    элементы из списка или очищать его. Для этого используются функции ClearList, DirectoryList, AddString, InsertString, DeleteString, SetSelIndex, SetSel, SetSelString, SetSelStrings, SetSelIndexes, SetSelItemRange, SetTopIndex, SetTabStops, SetHorizontalExtent, SetColumnWidth, SetCaretIndex, SetItemData, SetItemHeight.
    Существует также несколько функций-элементов, с помощью которых вы можете получить информацию о блоке списка или его элементах. Это функции: GetCount, FindString, FindExactString, GetTopIndex, GetCaretIndex, GetHorizontalExtent, GetItemData, GetItemHeight, GetItemRect, GetSelCount. GetSelIndex, GetSel, GetSelString, GetSelStrings, GetSelInbdexes, GetString, GetStringLen.


    Более легкий подход в Borland С++


    Сейчас наша программа на языке Си стала выглядеть более объектно-ориентированной. Однако, есть маленькая неточность, все указатели
    оказываются разименованными. Например, посмотрите на фрагмент текста
    из функции decompressor_next():
    dc->c = *(dc->p)++; /* Обработка следующего символа буфера */
    if (dc->c == 0xff) {
    dc->rcnt = (*(dc->p)++)-1; /* Сброс первого символа в записи */
    dc->c = *(dc->p)++; /* Здесь повторить символ */
    dc->srclen -= 2;
    }
    Это довольно безобразный текст. Можем ли мы его исправить? Конечно, для этого нужно использовать Турбо и Borland С++.


    Файл BUILTINS.MAK


    Вы быстро обнаружите, что существуют макрокоманды и правила
    утилиты MAKE, которые требуется использовать снова и снова. Существует три способа их обработки:
  • Во-первых, вы можете заносить их в каждый создаваемый вами
    формирующий файл для утилиты MAKE;

  • Во-вторых, вы можете занести все эти элементы в один файл
    и воспользоваться директивой !include в каждом создаваемом
    вами формирующем файле утилиты MAKE. (Другие директивы
    описываются далее в этой главе.);

  • В-третьих, вы можете занести все эти элементы в файл
    BUILTINS.MAK.

  • Каждый раз, когда вы запускаете утилиту MAKE, она ищет файл
    с именем BUILTINS.MAK. Однако, наличие файла BUILTINS.MAK не является обязательным. Если MAKE обнаруживает файл BUILTINS.MAK, то
    сначала она интерпретирует этот файл. Если утилита MAKE не может
    обнаружить файл BUILTINS.MAK, то она переходит непосредственно к
    интерпретации файла MAKEFILE (или того формирующего файла утилиты
    MAKE, который был вами задан с помощью параметра -f).
    Утилита MAKE сначала ищет файл BUILTINS.MAK в текущем каталоге. Если он отсутствует, и вы работаете под управлением DOS
    версии 3.0 или старше, то MAKE осуществляет поиск в том каталоге,
    откуда была вызвана сама утилита MAKE. Вам следует заносить файл
    BUILTINS.MAK в тот же каталог, где находится файл MAKE.EXE.
    Утилита MAKE всегда осуществляет поиск формирующего файла
    только в текущем каталоге. Этот файл содержит правила для конкретной создаваемой выполняемой программы. Как файл BUILTINS.MAK,
    так и формирующий файл подчиняются одинаковым синтаксическим правилам.
    Поиск файлов, задаваемых с помощью директивы !include, также
    осуществляется в текущем каталоге. Если вы используете параметр
    -I (файлы включения), то она будет также выполнять поиск в каталоге, заданном с помощью параметра -I.
    BUILTINS.MAK содержит стандартные правила и макрокоманды,
    которые MAKE применяет перед тем, как MAKE использует формирующий
    файл (параметр -r позволяет MAKE игнорировать BUILTINS.MAK).


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


    В данном разделе описываются файлы определения модуля и операторы, которые в них содержатся. Файл определения модуля обеспечивает для TLINK информацию о содержимом приложения Windows и
    требованиях к системе:
  • Имена прикладной программы или библиотеки динамической
    компоновки (DLL).

  • Идентификация типа прикладной программы как программы для
    Windows или OS/2.

  • Перечисление импортируемых и экспортируемых функций.

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

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

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

  • Заметим, что утилита IMPLIB может использовать файл определения модуля для создания библиотеки импорта. Утилита IMPDEF может создавать файл определения модуля для использования его с
    IMPLIB.


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


    Файлы подсказки представляют собой обычные текстовые файлы,
    содержащие параметры и/или имена файлов, которые обычно вводятся
    после имени программы TLINK в командной строке. Однако, в отличие
    от командной строки, файл подсказки может занимать несколько
    строк текста. Вы можете разбить длинный список объектных файлов
    или файлов библиотек на несколько строк, завершая одну строку
    знаком "плюс" (+) и продолжая список на следующей строке. Когда
    плюс возникает в конце строки, следуя непосредственно за одним из
    параметров TLINK, в котором + используется для включения параметра (например, /ye+), плюс не рассматривается как символ продолжения строки.
    Вы можете также начать каждый из четырех компонентов списка
    на отдельных строках: объектные файлы, выполняемый файл, файл
    карты отображения, библиотечные файлы. В этом случае вы должны
    убрать запятую, используемую для разделения компонентов.
    Чтобы проиллюстрировать эти возможности, предположим, что вы
    пользуетесь следующей командной строкой:
    tlink /c mainline wd ln tx,fin,mfin,work\lib\comm
    work\lib\suррort
    Вместо нее можно использовать файл подсказки, назвав его, например, FINRESP:
    /c mainline wd+
    ln tx,fin
    mfin
    worl\lib\comm work\lib\suррort
    Теперь команду TLINK следует вводить следующим образом:
    tlink @finresр
    Заметьте, что имени файла должен предшествовать символ (@),
    который указывает, что следующий файл является файлом подсказки.
    Альтернативный способ заключается в том, что команду компоновки можно разбить на несколько файлов подсказки. Например,
    представленную выше командную строку можно разбить на следующие
    два файла подсказки:

    Имя файла Содержимое
    LISTOBJS mainline+
    wd+
    ln tx
    LISTLIBS lib\comm+
    lib\suррort

    Теперь команду TLINK можно ввести в следующем виде:
    tlink /c @listobjs,fin,mfin,@listlibs
    Параметры командной строки переопределяют параметры, заданные в файле подсказки.


    Файл TLINK.CFG


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


    Файл WINSPCTR.LOG


    Первая строка в отчете (отчетах) WINSPCTR.LOG показывает вам
    дату и время возникновения исключительной ситуации. На второй
    строке перечисляется:
  • тип исключительной ситуации;

  • имя модуля;

  • логический адрес;

  • физический адрес;

  • текущая задача во время особой ситуации.

  • Если указатель стека во время исключительной ситуации слишком мал, TOOLHELP.DLL автоматически переключает стек. Когда это
    происходит, в конце второй строки файла регистрации выводится сообщение "Stack Switched".


    Файлы конфигурации


    При запуске Turbo Debugger использует следующие файлы конфигурации, инициализации и сеанса:
    - TDCONFIG.TD
    - TFCONFIG.TDW
    - TDCONFIG.TD2
    - TDW.INI
    - XXXX.TR
    - XXXXTRW
    - XXXX.TR2
    Файлы конфигурации TDCONFIG.TD, TDCONFIG.TDW и TDCONFIG.TD2
    создаются с помощью отладчиков TD, TDW и TD32 соответственно. Параметры, установленные в этих файлах, переопределяют параметры,
    используемые данными отладчиками по умолчанию. Вы можете модифицировать файлы конфигурации с помощью инсталляционных программ
    TDINST.EXE. TDWINST.EXE и TD32.EXE.
    TDW.INI - это файл инициализации, используемый TDW.EXE и
    TD2.EXE. Он содержит установки для используемого отладчиком видеодрайвера, расположение файла TDWINTH.DLL (динамически компонуемой библиотеки, применяемой для отладчик в Windows), и параметры удаленной отладчик для WRSETUP.EXE.
    Программа установки отладчика помещает TDW.INI в основной
    каталог Windows. В этой копии TDW.INI параметр видеодрайвера
    ([VideoDLL]) устанавливается в SVGA.DLL, а установка DebuggerDLL
    указывает маршрут к TDWINTH.DLL. Полное описание TDW.INI можно
    найти в файле TD_HELP!.TXT. Файлы с расширениями .TR, .TRW и .TR2
    содержат параметры состояния сеанса отладчиков.
    Когда вы запускаете Turbo Debugger, он ищет файлы конфигурации в следующей последовательности:
  • в текущем каталоге;

  • в каталоге, заданном в установке Turbo Directory программы
    установки Turbo Debugger;

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

  • Если Turbo Debugger находит файл конфигурации, то параметры,
    заданные в этом файле, переопределяют встроенные по умолчанию установки. Если при запуске Turbo Debugger вы указываете параметры
    командной строки, то они переопределяют соответствующие значения
    по умолчанию и значения, заданные в файле конфигурации.
    Для поддержки доступных типов видеоадаптеров и мониторов TDW
    и TD32 используют различные типы видео-DLL. При инсталляции Turbo
    Debugger запустите программу установки TDWINI.EXE, которая поможет вам выбрать или модифицировать используемые отладчиками видео-DLL. По умолчанию TDW и TD32 используют драйвер SVGA.DLL, который поддерживает большинство видеоадаптеров и мониторов. Подробнее об этом рассказывается в оперативном справочнике Help
    программы TDWINI.EXE.
    Кроме того, Turbo Debugger поддерживает в TD, TDW и в TD32
    отладку с двумя мониторами. Для этого вам потребуется цветной монитор и видеоадаптер и монохромный монитор и видеоадаптер. При
    отладке с двумя мониторами Turbo Debugger выводится на монохромном мониторе, а отлаживаемая программа - на цветном. Это позволяет видеть во время отладки вывод программы. Для загрузки TD или
    TDW в режиме с двумя мониторами используйте параметр командной
    строки -do. При работе с TD32 в Windows 32s нужно использовать
    видеобиблиотеку SVGA.DLL. В файл TDW.INI в раздел [VideoOptions]
    для этого нужно включить mono=yes. Для установки параметров видеоадаптера используйте утилиту TDWINI.EXE.


    Файлы конфигурации


    Если каждый раз в командной строке используется один и тот
    же набор параметров, то их можно перечислить в файле конфигурации. Это обычный текстовый файл, в котором параметры разделены
    пробелами. По умолчанию BCC использует файл конфигурации с именем
    TURBOC.CFG, а BCC32 - BCC32.EXE. Параметры командной строки переопределяют параметры файлов конфигурации.


    Файлы описания проектов


    Файлы описания проекта автоматизируют процесс построения
    приложений Windows при использовании IDE Borland C++. Файлы описания проектов с расширением .PRJ содержат информацию о том, как
    построить конкретное приложение. Используя такое инструментальное
    средство как администратор проектов, вы можете создавать и обслуживать файлы проектов, описывающие каждое из разрабатываемых
    приложений. Файлы описания проектов содержат список обрабатываемых файлов и параметры каждого используемого инструментального
    средства. Эта информация используется администратором проектов
    для автоматического построения приложения. Файлы описания проектов и администратор проектов - это эквиваленты формирующих файлов
    и утилиты Make, но их легче обслуживать и использовать, чем формирующие файлы. Для установки параметров проекта можно использовать диалоговое окно Project Options интегрированной среды.


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


    Файл определения модуля .DEF обеспечивает информацию о содержимом файла и требованиях к системе приложения Windows. Эта
    информацию используется компоновщиком и включает в себя размер
    динамически распределяемой памяти и стека, а также характеристики
    кода и данных. Файл .DEF перечисляет также функции, которые должны быть доступными для других модулей (экспортируемые функции), и
    используемые функции других модулей (импортируемые функции). Так
    как компоновщик Borland имеет и другие способы получения этой информации, файл .DEF для него не обязателен. Файл .DEF содержит
    несколько операторов. Перечислим некоторые из них:

    Оператор Функция

    NAME
    Задает имя программы. Если нужно построить DLL,
    используйте оператор LIBRARY. Каждый файл .DEF
    обязательно должен иметь оператор NAME или
    LIBRARY. Заданное имя должно совпадать с именем
    выполняемого файла. WINDOWAPI идентифицирует
    программу, как выполняемую программу Windows.

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

    EXETYPE
    Помечает файл, как выполняемый файл Windows (это
    необходимо для всех выполняемых файлов Windows.

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

    HEAPSIZE
    Задает размер локальной динамически распределяе-
    мой памяти приложения.

    STACKSIZE
    Задает размер стека приложения. Для создания DLL
    этот оператор использовать нельзя.

    Кроме указанных в файлах .DEF используются операции EXPORTS
    и IMPORTS. Оператор EXPORTS перечисляет функции в программе или
    DLL, которые будут вызываться другими приложениями или Windows
    (экспортируемые функции или функции обратного вызова). Экспортируемые функции идентифицируются компоновщиком и вводятся в таблицу экспорта.
    Чтобы избежать создания в файлах .DEF длинных секций
    EXPORTS, в Borland C++ предусмотрено ключевое слово _export. Отмеченные этим ключевым словом функции будут идентифицироваться
    компоновщиком и вводиться компоновщиком в таблицу экспорта.


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


    Если в командной строке задается множества файлов и параметров, поместите их в файл подсказки. Эти текстовые файлы позволяют
    задать более длинную команду, чем это допускает операционная система. Чтобы использовать файл подсказки, дайте команду:
    BCC @[маршрут]файл_подсказки.rsp
    В команде можно задать несколько файлов подсказки (через
    пробел).


    Файлы сценариев ресурсов


    Приложения Windows обычно используют ресурсы. Ресурсы - это
    пиктограммы, меню, диалоговые окна, шрифты, курсоры, битовые массивы и ресурсы, определенные пользователем. Ресурсы определяются
    в файле, который называется файлом сценария ресурса. Эти файлы
    имеют расширение .RC.
    Для использования ресурсов вам потребуется компилятор ресурсов Borland BRC (Borland Resource Compiler) или BRC32, который
    компилирует файл .RC в двоичных формат. При компиляции ресурсов
    создается файл .RES. Компоновщик TLINK или TLINK32 позволяет
    затем связать файл .RES с генерируемым им файлом .EXE. При этом
    файл .EXE отмечается также как выполняемый файл Windows.


    Файлы, входящие в состав пакета Turbo Debugger



    Имя файла Описание
    DUAL8514.DLL Видео-DLL, которые поддерживают отладку с
    двумя мониторами для мониторов 8514.
    STB.DLL Видео-DLL, поддерживающая видео-адаптеры
    STB.
    TD.EXE Отладчик для отладки приложений DOS.
    TDDEBUG.386 Этот драйвер используется TDW.EXE для доступа к специальным отладочным регистрами процессора 80386 (или старше).
    TDHELP.TDH Справочных файл для TD.EXE.
    TDKBDW16.DLL Файл поддержки для Windows 32s.
    TDKBDW32.DLL Файл поддержки для Windows 32s.
    TDREMOTE.EXE Драйвер, используемый в удаленной системе
    для поддержки удаленной отладки в DOS.
    TD32.ICO Пиктограмма, используемая для TD32.EXE.
    TD32HELP.TDH Справочный файл для TD32.EXE.
    TDVIDW16.DLL Файл поддержки для Windows 32s.
    TDVIDW32.DLL Файл поддержки для Windows 32s.
    TDW.EXE Выполняемая программа для отладки 16-разрядных программ Windows.
    TDW.INI Файл инициализации, используемый TDW.EXE и
    TD32.EXE. Он создается программой инсталляции и помещается в основной каталог Windows.
    TDWGUI.DLL Видео-DLL, используемая для вывода окна отладчика TDW в Windows 3.х или TD32 в Windows 32s.
    TDWHELP.TDH Справочный файл для TDW.EXE.
    TDWINTH.DLL Поддерживающая DLL для TDW.EXE.
    WREMOTE.EXE Драйвер для удаленной отладки в Windows.
    TDINST.EXE Создает и модифицирует файл конфигурации
    TDCONFIG.TD.
    TDMEM.EXE Выводит на экран доступную память компьютера, включая дополнительную и расширенную.
    TDRF.EXE Утилита передачи файлов, используемая для
    передачи файлов в удаленную систему.
    TD32INST.EXE Создает и модифицирует файл конфигурации
    TD32 - TDCONFIG.TD32.
    TDSTRIP.EXE Удаляет из файлов .EXE и .DLL используемую
    отладчиком отладочную информацию (таблицу
    идентификаторов) без перекомпоновки файлов.
    TDSTRP32.EXE Удаляет из файлов .EXE и .DLL используемую
    отладчиком отладочную информацию (таблицу идентификаторов) без перекомпоновки файлов.
    TDUMP.EXE Выводит на экран структуру 16- или 32-раз-
    рядных файлов .EXE, .DLL и .OBJ, а также
    содержимое отладочную информацию об идентификаторах.
    TDWINI.EXE Позволяет изменить и настроить параметры
    видеодрайвера отладчика.
    TDWINI.HLP Справочный файл для TDWINI.EXE.
    TDWINST.EXE Создает и модифицирует файл конфигурации
    TDCONFIG.EXE. Настраивает для TDW параметры
    вывода и цвета экрана.
    WRSETUP.EXE Файл конфигурации для утилиты WREMOTE -
    драйвера удаленной отладки.
    TD_ASM.TXT Файл с информацией по отладке программ
    на Turbo Assembler, которая полезна также
    при отладке программ со встроенным ассебмлером.
    TD_HELP!.TXT Файл с ответами на общие вопросы. Среди
    прочего в нем обсуждаются синтаксические
    отличия между анализом выражений в Turbo
    Debugger и компиляторах, отладка программ на нескольких языках др.
    TD_HDWMP.TXT Файл с информации о настройке конфигурации
    отладчика для использования аппаратных отладочных регистров.
    TD_RDME.TXT Содержит последнюю информацию, отсутствую-
    щую в руководстве.
    TD_UTILS.TXT Описывает утилиты отладчика, работающие в
    режиме командной строки: TDSTRIP, TDUMP,
    TDWINST, TD32INST, TDSTRP32, TDMEM, TDMAP и
    TDUMP32.
    MAKEFILE Формирующий файл, используемый в примерах
    программ.
    TDWDEMO.BUG Исходный код примера программы с ошибками
    (для отладки).
    TDWDEMO.H Файл заголовка, используемых примером прог-
    раммы.
    TDWDEMO.ICO Пиктограмма примера программы.
    TDWDEMO.IDE Файл проекта для примера программы.
    TDWDEMO.RC Файл ресурса для примера программы.
    S_PAINT.C Исходный код примера программы.
    S_PAINT.EXE Пример программы.



    Файлы-заголовки ObjectWindows


    Файлы-заголовки находятся в подкаталоге OWL\INCLUDE и содержат описания функций классов и определений типов данных и констант.

    Имя файла Определение класса Использование
    applicat.h TApplication Управляет базовым повелением всех приложений ObjectWindows.
    bitmapga.h TBitMapGadget Выводит на экран массив растровых изображений.
    bitset.h TBitSet Устанавливает или сбрасывает один или более бит.
    TCharSet Устанавливает или сбрасывает байты.
    button.h TButton Создает различные виды
    управляющих элементов типа командных кнопок.
    buttonga.h TButtonGadget Создает реквизиты командных кнопок, которые можно выключать и включать щелчком "мыши".
    cearray.h TCelArrayСоздает массив ячеек.
    checkbox.h TCheckBoxПредставляет управляющий
    элемент типа кнопки с независимой фиксацией.
    chooseco.h TChooseColor Представляет режимное диалоговое окно с возможностью выбора цвета.
    choosefo.h TChooseFont Представляет режимное диалоговое окно с возможностью выбора шрифта.
    clipboar.h TClipboard Содержит функции, управляющие обработкой данных в буфере вырезанного изображения.
    clipview.h TClipboardViewer Регистрирует TClipboardViewer как средство просмотра TClipboard.
    color.h TColor Содержит функцию, используемую для упрощения
    стандартной операции с цветом Windows.
    combobox.h TComboboxСоздает в окне комбинированный блок или управляющий элемент комбинированного блока и класс TComboBoxData, который используется для передачи данных между управляющими элементами.
    commdial.h TCommonDial Абстрактный базовый класс для объектов TCommonDialog.
    compat.h Определяет служебные функции и константы ObjectWindows.
    control.h Tcontrol Используется для создания в производных классов управляющих объектов.
    controlb.h TControlBar Реализует полосу инструментальных средств, обеспечивающую мнемонический доступ к командным кнопкам.
    contolg.h TControlGadget Позволяет помещать управляющие элементы в окно реквизитов.
    dc.h TBandInfo, TClientDC,
    TDC, TDesktopDC, TIC,
    TDibDC, TPrintDC,
    TScreenDC, TWindowDC
    Включающие классы GDI DC, создающие объекты DC.
    decframe.h TDecoratedFrame Создает клиентное окно, куда можно поместить "декорации".
    decmdifr.h TDecoratedMDIFrame Создает объект рамки, поддерживающий "декорированные" дочерние окна.
    dialog.h TDialog Создает режимное и безрежимное диалоговое окно с интерфейсными элементами.
    TDialogAttr Содержит атрибуты диалогового окна.
    dispatch.h Определяет функции диспетчеризации, созданные для обработки сообщений Windows.
    docmanag.h TDocManager Создает объект администратора документов, который работает с документами и шаблонами.
    TDocTemplate Создает шаблоны.
    docview.h TDocument, TView,
    TStream, TInStream,
    TWindowView, TOutStream
    Создает, уничтожает и посылает сообщения о просмотре документов.
    edit.h TEdit Создает управляющий интерфейсный элемент редактирования.
    editfile.h TEditFileСоздает окно редактирования файла.
    editsear.h TEditSearch Создает управляющий элемент редактирования, отвечающий за команды поиска и замены.
    editview.h TEditViewОболочка просмотра для TEdit.
    except.h TXOwl Базовый класс обработки исключительных ситуаций.
    TXOutOfMemory Описывает исключительную
    ситуацию нехватки памяти.
    TXCompatibility Описывает исключительную
    ситуацию состояния.
    TStatus Используется для обратной
    совместимости.
    filedoc.h TFileDocument Открывает и закрывает область просмотра документа.
    findrepl.h TFindDialog,
    TFindReplaceDialog
    Эти классы создают и определяют атрибуты безрежимных диалоговых окон, отвечающих на команды поиска и замены.
    floatfra.h TFloatingFrame Реализует в родительском
    окне свободную рамку.
    framewin TFrameWindow Управляет специфическим для окна поведением, таким как перемещение с помощью клавиатуры и обработка команд.
    TMenuDesc Описывает строку меню.
    gadget.h TGadget Создает объект реквизита, принадлежащий окну реквизитов и имеющий заданные атрибуты.
    gedgetwi.h TGadgetWindow Обслуживает для окна список неперекрывающихся реквизитов.
    gdibase.h TGdiBase Абстрактный базовый класс
    для классов GDI.
    gdiobjec.h TGdiObject Базовый класс GDI.
    TPen, TBrush, TFont,
    TBitMap, TPalette, TIcon,
    TCusor, TDib, TRegion.
    Эти классы специфицируют объекты GDI.
    groupbox.h TGroupBoxСоздает групповой объект,
    представляющий элемент группового блока в Windows.
    inputdia.h TInputDialog Общее диалоговое окно.
    keymodet.h TKeybardModeTracker Смешанный класс, созданный для отслеживания изменений режимов клавиатуры.
    layoutco.h TLayoutConstraint Создает ограничения разметки.
    layoutwi.h TLayoutMetrics Создает ограничения разметки, используемые для характеристик разметки в окне.
    listbox.h TListBox Создает объект блока списка.
    TListBoxData Используется для передачи контекста блока списка.
    listview.h TListView Обеспечивает просмотр блоков списка.
    mdi.h TMDIClient Управляет дочерними окнами MDI.
    TMDIFrame Основное окно MDI-приложения.
    mdichild.h TMDIChild Определяет поведение дочернего окна MDI.
    menu.h TMenu, TPopupMenu, TSystemMenu Создает объекты меню.
    messageb.h TMessageBar Реализует строку сообщения.
    metafile.h TMetaFileBar Класс-оболочка для TMetaFileDC.
    module.h TModule Определяет базовое поведение для библиотек и приложений ObjectWindows.
    opensave.h TOpenSave Базовый класс для режимных диалоговых окон открытия и сохранения.
    owlall.h Включаемый файл для всех классов ObjectWindows.
    owlcore.h Включаемый файл для классов ядра ObjectWindows.
    owldefs.h Определения макрокоманд, используемых в программах ObjectWindows.
    owlpch.h Определения макрокоманд, данных и функций, используемых в программах ObjectWindows.
    point TPoint, TSize, TRect Математические классы.
    TDropinfo Поддерживает операции буксировки имени файла.
    TProcInstance Класс поддержки Win16.
    TPointer Обеспечивает надежную работу с указателями.
    preview.h TPreviewPage Выводит страницу документа в окне предварительного просмотра.
    printdia.h TPrintDialog Выводит диалог печати или режимное окно печати.
    printer.h TPrinter Представляет устройство печати.
    TPrintout Представляет печатаемый документ.
    TPrinterAbortDlg Представляет диалоговое окно прерывания печати.
    radiobut.h TRadioButton Создает управляющий элемент типа кнопки с зависимой фиксацией.
    scrollba.h TScrollBar Представляет управляющий элемент типа вертикальной или горизонтальной полосы прокрутки.
    TScrollBarData Содержит значения позиции указателя полосы прокрутки.
    scroller.h TScroller Реализует автоматическую прокрутку окна.
    signatur.h Определяет шаблоны сигнатуры обработки сообщений, используемых функциями обработки событий ObjectWindows.
    slider.h TSlider Определяет базовое поведение скользящих маркеров.
    THSlider Горизонтальный скользящий маркер.
    TVSlider Вертикальный скользящий маркер.
    static.h TStatic Создает в окне статический управляющий элемент.
    statusba.h TStatusBar Строит строку состояния.
    textgadg.h TTextGadget Строит дополнительный текстовый объект.
    tinycarp.h TTinyCaption Создает для окна меньшую строку заголовка.
    toolbox.h TToolBox Создает инструментальный объект с заданным числом строк и столбцов.
    validate.h TValidator Базовый класс проверки допустимости.
    TPictureValidator Средство проверки допустимости картинки.
    TFilterValidator Средство проверки допустимости фильтра.
    TRangeValidator Средство проверки допустимости диапазона.
    TLookupValidator Средство проверки допустимости преобразования.
    TStringLookupValidator Средство проверки допустимости строки.
    vbxctl.h TVbxControl Интерфейс для управляющих элементов VBX.
    TVbxEventHandler Обрабатывает события от управляющих элементов VBX.
    version.h Определяет внутренний номер версии библиотеки ObjectWindows.
    window.h TWindow Обеспечивает специфическое для окна поведение и инкапсулирует многие функции API.
    windowev.h Определяет обработчики событий и таблицы макрокоманд реакции на сообщения Windows.



    Фатальные ошибки


    Фатальные ошибки генерируются компилятором, компоновщиком и утилитой MAKE и приводят с немедленному прекращению процесса компиляции. Если такую ошибку генерирует компилятор или утилита MAKE, то файл .EXE не создается. Если фатальная ошибка генерируется компоновщиком, то файл .EXE может создаваться.
    Фатальные ошибки встречаются редко. Некоторые из них указывают на внутреннюю ошибку компилятора. Вы должны выполнить соответствующие действия, а затем


    Флаги формата



    Флаг Описание
    skipws Пропускает при вводе пробелы и разделители.
    left Выравнивание вывода влево.
    right Выравнивание вывода влево.
    internal Дополнение после знака или указателя основания.
    dec Десятичное преобразование.
    oct Восьмеричное преобразование.
    hex Шестнадцатиричное преобразование.
    showbase Показывает в выводе индикатор основания.
    showpoint Показывает при выводе с плавающей точкой десятичную точку.
    uppercase Преобразует шестнадцатиричный вывод в верхний
    регистр.
    showpos Выводит с положительными числами символ '+'.
    scientific Добавляет к числам с плавающей точкой суффикс
    с показателем степени (E).
    fixed Для вывода чисел с плавающей точкой использует десятичную фиксированную точку.
    unitbuf После включения выводит все потоки.
    stdio После включения выводит stdout и stderr.



    Формат вывода:


    Описатель {Класс} Модуль Позиция "Заголовок"
    Линии слева показывают структуру дерева. С помощью этих линий каждое окно соединяется с его предком, "братскими" окнами и
    потомками. Линии рисуются таким же образом, как в администраторе
    файлов. Ромб после каждого окна показывает, имеет ли окно дочерние окна. Если он пустой, то дочерних окон нет. Если он содержит
    символ +, то дочерние окна имеются, но они не показаны. Если он
    содержит символ -, то имеются дочерние окна, и они выведены в
    древовидной схеме (видим по крайней мере один уровень дочерних
    окон, другие уровни могут быть скрыты).
    "Описатель" - это описатель окна, возвращаемый CreateWindow.
    "Класс" - это имя класса окна, описанного в области списка
    классов.
    "Модуль" - это имя выполняемого модуля (.EXE или .DLL), который создал окно. Строго говоря, это имя модуля, являющегося
    владельцем сегмента данных, переданного как параметр hInstance
    функции CreateWindow.
    "Позиция" может либо не указываться, если окно скрыто, либо
    это (x_Begin,y_Begin)-(x_End,y_End), если окно является видимым.
    Для окон верхнего уровня это координаты экрана. Для порожденных
    окон это координаты в области пользователя родительского окна,
    которое используется в CreateWindow для создания порожденного окна.
    "Заголовок" - это заголовок окна или текст, возвращаемый
    функцией GetWindowText или сообщением WM_GETTEXT. Если заголовок
    - это нулевая строка, то кавычки опускаются.


    Формат вывода:


    Описатель ["Заголовок" {Класс}] Сообщение Статус
    "Описатель" - это описатель окна, получающего сообщение.
    "Заголовок" - это заголовок окна. Если заголовок - это нулевая строка, то вместо него выводится имя класса (в фигурных скобках).
    "Сообщение" - это имя сообщения, определенное в файле WINDOWS.H. Существуют также неописанные сообщения Windows, показанные символами в нижнем регистре. Номера неизвестных сообщений
    (определенных пользователем) показываются как WM_USER+OxXXXX, если они больше или равны WM_USER, или WM_OxXXXX, если они меньше
    WM_USER. Номера зарегистрированных сообщений (из RegisterWindowsMessage) показываются вместе с их зарегистрированными именами в
    одиночных кавычках.
    "Статус" представляет собой следующее:
  • Значение Dispatched показывает, что сообщение получено через DispatchMessage.

  • Значение Sent [from XXXX] показывает, что сообщение применяется через SendMessage. Если оно посылалось через другое
    окно, то from XXXX показывает описатель окна. Если оно посылалось из того же окна, что и принимает сообщение, то
    указывается fromself. Если сообщение поступает от Windows,
    то часть from... опускается.

  • Return показывает, что сообщение было принято через
    SendMessage и теперь возвращается.

  • Дополнительная информация, относящаяся к каждому сообщению. В случае возвращаемого сообщения здесь показывается
    это значение (в числовой форме или с более конкретной информацией по сообщению, например, wm_GETTEXT. Для посылаемых и диспетчеризуемых сообщений здесь показывается параметры сообщения. WinSight интерпретирует параметры таким
    образом, чтобы получилась читаемая форма. Для сообщений,
    имеющих связанные с ними структуры данных (например,
    WM_CREATE) она перехватывает эти структуры и включает их в
    вывод.



  • Формат вывода:


    Класс (Модуль) Функции Стили
    Ромбы после классов при получении окном любого сообщения
    становятся черными. Это позволяет видеть, какие окна получают в
    данный момент сообщения. Если дочерние окна данного окна в дереве
    убраны, то будет инвертироваться ромб данного окна, что указывает
    на активность дочерних окон.
    "Класс" - это имя класса. Некоторые предопределенные классы
    Windows имеют числовые номера. Например, в качестве имени класса
    всплывающего меню используется число 32768. Для таких классов показывается как номер, так и имя, например, #32768:PopupMenu. Однако фактическое имя класса состоит только из числа. В формате MAKEINTRESOURCE используется также идентификатор ресурса.
    "Модуль" - это имя выполняемого модуля (.EXE или .DLL), который зарегистрировал класс.
    "Функция" - это адрес функции класса окна.
    "Стили" представляют собой стили cs_ класса. Их имена совпадают с определениями cs_ в файле windows.h, но cs_ удаляется, и
    имя указывается с различным регистром символов.


    Форматирование ввода-вывода


    Форматирование ввода и вывода определяется различными флагами состояний формата, перечисленными в классе ios. Эти состояния
    определяются битами числа типа long int следующим образом:
    public:
    enum {
    skipws = 0x0001, // пропуск пробельного символа на
    // вводе
    left = 0x0002, // вывод с левым выравниванием
    right = 0x0004, // вывод с правым выравниванием
    internal = 0x0008, // заполнитель после знака или
    // указателя системы счисления
    dec = 0x0010, // десятичное преобразование
    oct = 0x0020, // восьмиричное преобразование
    hex = 0x0040, // шестнадцатиричное преобразование
    showbase = 0x0080, // показать на выходе указатель
    // системы счисления
    showpoint = 0x0100, // показать позицию десятичной точки
    // (на выходе)
    uppercase = 0x0200, // вывод шестнадцатиричных значений
    // буквами верхнего регистра
    showpos = 0x0400, // показать знак "+" для
    // положительных чисел
    scientific = 0x0800, // использовать запись чисел с плава-
    // ющей точкой с выводом экспоненты Е
    // например, 12345E2
    fixed = 0x1000, // использовать запись чисел с плава-
    // ющей точкой типа 123.45
    unitbuf = 0x2000, // сброс на диск всех потоков
    // после вставки
    stdio = 0x4000, // сброс на диск stdout и stderr после
    // вставки
    };
    Эти флаги читаются и устанавливаются функциями-элементами
    flags, setf и unsetf.


    Функции библиотеки graphics


    Графические функции Borland C++ делятся на несколько категорий:
  • функции управления графической системой;

  • функции черчения и заполнения;

  • функции манипулирования экранами и графическими окнами;

  • функции вывода текстов;

  • функции управления цветами;

  • функции обработки ошибок;

  • функции запроса состояния.



  • Функции доступа к данным


    TDocument предусматривает ряд функций для доступа к данным.
    Вы можете обращаться к данным в простом последовательном потоке
    или тем способом, который зададите в производных классах.
    TDocument предусматривает две функции InStream и OutStream,
    которые возвращают указатель на TInStream и TOutStream. Базовые
    версии этих функций не выполняют никаких действий и возвращают 0.
    В производном классе их нужно переопределить, чтобы они возвращали указатель на объект. Таким образом вы можете обеспечить в
    классе документа доступ к потокам.
    TInStream и TOutStream - это абстрактные базовые классы,
    производные от isteam и ostream класса TStream. TStream обеспечивает минимальные функции для связи потока с документом, а isteam
    и ostream - это стандартные потоки С++. Из TInStream и TOutStream
    нужно создать производные потоковые классы, специфические для
    приложения. Эти классы имеют функции для работы с потоками.
    Каждый документ поддерживает список открытых потоков, который обновляет при добавлении или удалении потоков. В начале этого
    списка находится элемент данных StreamList класса TDocument, который указывает первый поток в списке или содержит 0. Каждый объект TStream в списке имеет функцию-элемент NextStream, которая
    указывает на следующий поток в списке.
    Потоки могут обеспечивать только простой последовательный
    доступ к данным. Если документы содержат файлы мультимедиа, таблицы баз данных или другие сложные данных, то вам потребуются более развитые методы доступа. Для этой цели в TDocument имеется
    еще две функции доступа - Open и Close, которые вы можете переопределить и задать нужное поведение при открытии и закрытии. На
    определение открытия документа никаких ограничений не накладывается. Вы можете задать настолько простое или сложное открытие,
    насколько это требуется.
    Close обеспечивает несколько больше функциональных возможностей. Эта функция проверяет существующие дочерние объекты документа и перед закрытием документа пытается закрыть их все. Данная
    функция позволяет закрыть документ, когда это требуется.
    TDocument имеет также ряд функций, позволяющих вам защитить
    данные. IsDirty проверяет, был ли документ модифицирован. IsOpen
    проверяет состояние документа (открыт он или нет) или наличие потоков в списке. Commit сохраняет изменения данных в памяти. Revert выполняет действие, обратное Commit.


    Функции элементы (методы)


    Как вы уже видели раньше, классы С++ могут содержать в качестве
    своих элементов не только данные, но и функции элементы. Функция эле
    мент - это функция, объявленная внутри определения класса и тесно
    связанная с типом этого класса. В нашем примере - это операции которые выполняются в сберегательных банках. Наш объект sber_bank имеет
    функции элементы deposite (вкладывать) и withdraw (снимать) деньги.
    sber_bank
    Объект сбербанк
    < deposit << Вклад денег
    $$$ < >
    <
    Данные > withdraw >> Снятие денег
    Функции элементы
    Наглядное представление функции элемента withdraw() приводится
    ниже:
    Селектор
    Определяемый класс Имя функции элемента
    Возвращаемый тип Аргумент
    v v v v v
    double sber_bank::withdraw(double bucks)
    {
    big_bucks -= bucks;
    if (big_bucks < 0.0) {
    printf("К сожалению, товарищ, у вас нет таких денег!\n");
    big_bucks -= 10.0; // Штрафная санкция
    }
    return big_bucks;
    }
    Обратите особое внимание на использование операции селектор области действия '::' между определяемым классом и функцией элементом.
    Имя класса sber_bank используется для указания компилятору, к какому
    классу принадлежит withdraw (так как могут иметься и другие варианты
    withdraw, принадлежащие другим классам). При внутреннем определении
    селектор '::' не потребуется, так как и так ясно, что withdraw принадлежит классу sber_bank.
    По аналогии, при обращении функций к элементам своего объекта,
    селектор '.' лишний:
    double sber_bank::withdraw(double bucks)
    {
    Обращение к данным своего объекта
    v (не указывается принадлежность
    big_bucks -= bucks; объекту - sber_bank.)
    if (big_bucks < 0.0) {
    printf("К сожалению, товарищ, у вас нет таких денег!\n");
    big_bucks -= 10.0; // Штраф за перерасход
    }
    return big_bucks;
    }


    Функции в DLL


    Утилита IMPDEF создает редактируемый исходный файл, который
    перечисляет все экспортные функции в DLL. Вы можете отредактировать этот файл .DEF так, чтобы он содержал только те функции, которые вы хотите сделать доступными для нужной прикладной программы, а затем выполнить IMPLIB для отредактированного файла .DEF. В
    результате получается библиотека импорта, которая содержит информацию импорта для заданного подмножества экспортируемых функций
    DLL.
    Например, пусть вы определяете DLL, которая предоставляет
    функции для использования различными прикладными программами.
    Каждая экспортируемая функция в DLL определяется с помощью оператора _exрort. Теперь, если все прикладные программы используют
    все экспортируемые функции DLL, вы можете просто использовать
    IMPLIB для создания одной библиотеки импорта для DLL и поставлять
    эту библиотеку импорта с DLL. Библиотека импорта может быть скомпонована с любыми прикладными программами, исключая таким образом
    необходимость перечисления для каждой прикладной программы каждой
    используемой ей функции DLL в секции IMPORT файла определения модуля.
    Теперь, пусть нужно передать некоторую часть экспортируемых
    функций DLL отдельной прикладной программе. В идеале требуется
    скомпоновать специальную библиотеку импорта с этой прикладной
    программой - библиотеку импорта, которая предоставляет только
    подмножество функций, которые будут использоваться прикладной
    программой. Все другие экспортируемые функции в DLL для клиентной
    прикладной программы должны быть скрыты.
    Для создания библиотеки импорта, которая удовлетворяет этим
    условиям, выполните IMPDEF для откомпилированной и скомпонованной
    DLL. Утилита IMPDEF создаст файл определения модуля, который содержит в секции EXPORT перечисление всех экспортируемых функций
    DLL. Вы можете редактировать этот файл определения модуля, удаляя
    компоненты секции EXPORTS для тех функций, которые вы не хотите
    включать в библиотеку импорта. После того, как вы удалите ненужные экспортируемые функции, выполните утилиту IMPLIB для файла
    определения модуля. Результатом будет библиотека импорта, которая
    содержит информацию импорта только для экспортных функций, перечисленных в секции EXPORTS файла определения модуля.
  • Утилита TLIB: турбо библиотекарь

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

  • Командная строка утилиты TLIB

  • Использование файлов подсказки

  • Создание расширенного словаря: параметр /E

  • Задание размера страницы: параметр /P

  • Различимость регистра символов в идентификаторе: параметр /C

  • Удаление записей-комментариев: параметр /O

  • Список операций

  • Примеры



  • Функции запроса состояния графического режима



    Функция Возвращаемое значение
    getarccoords Возвращает информацию о координатах, заданных
    в последнем вызове arc или ellipse.
    getaspectratio Возвращает коэффициент сжатия для графического экрана.
    getbkcolor Возвращает текущий цвет фона.
    getcolor Возвращает текущий цвет вычерчивания.
    getdrivername Возвращает имя текущего графического драйвера.
    getfillpattern Возвращает шаблон заполнения, определяемый пользователем.
    getfillsettings Возвращает информацию о текущем шаблоне и
    цвете заполнения.
    getgraphmode Возвращает текущий графический режим.
    getlinesettings Возвращает текущие стиль, шаблон и толщину
    линии.
    getmaxcolor Возвращает максимально допустимое на текущий момент значение элемента изображения.
    getmaxmode Возвращает максимально допустимый номер режима для текущего драйвера.
    getmaxx Возвращает текущее разрешение по оси x.
    getmaxy Возвращает текущее разрешение по оси y.
    getmodename Возвращает имя данного режима драйвера.
    getmoderange Возвращает диапазон режимов для данного
    драйвера.
    getpalette Возвращает текущую палитру и ее размер.
    getpixel Возвращает цвет элемента изображения в (x,y).
    gettextsettings Возвращает текущий шрифт, направление, размер
    и способ выравнивания текста.
    getviewsettings Возвращает информацию о текущем графическом
    окне.
    getx Возвращает координату x текущей позиции (CP).
    gety Возвращает координату y текущей позиции (CP).

    В каждой из категорий графических функций Borland C++ имеется хотя бы одна функция запроса состояния. Эти функции упоминались при рассмотрении соответствующих категорий и также рассматриваются здесь отдельно. Каждая из графических функций запроса
    состояния Borland C++ имеет имя вида "get что-то" (за исключением
    категории функций обработки ошибок). Некоторые из них не воспринимают никаких аргументов и возвращают единственное значение,
    представляющее собой искомую информацию. Прочие считывают указатель структуры, определяемой в файле graphics.h, заполняют эту
    структуру соответствующей информацией и не возвращают никаких



    значений.

    Функциями запроса состояния категории управления графической

    системы являются getgraphmode, getmaxmode и getmoderange. Первая

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

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

    этого драйвера, а третья возвращает диапазон режимов, поддерживаемых данным графическим драйвером. getmaxx и getmaxy возвращают

    соответственно максимальные экранные координаты x и y для текущего графического режима.

    Функциями запроса состояния категории вычерчивания и заполнения являются функции getarccoords, getaspectratio, getfillpattern и getlinesettings. Функция getarccoords заполняет структуру, содержащую координаты, которые использовались при последнем вызове функций arc или ellipse. Функция getaspectratio сообщает текущий коэффициент сжатия, используемый графической системой для того, чтобы окружности выглядели круглыми. Функция getfillpattern

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

    Функция getfillsettings заполняет некоторую структуру текущим

    шаблоном и цветом заполнения. Функция getlinesettings заполняет

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

    Функциями запроса состояния категории манипулирования графическим окном являются getviewsettings, getx, gety и getpixel.

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

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

    информацией некоторую структуру. Функции getx и gety возвращают

    (относительно графического окна) x- и y-координаты текущей позиции (CP). Функция getpixel возвращает цвет указанного элемента изображения.

    Функция запроса состояния категории вывода текста в графическом режиме имеется только одна, и притом всеобъемлющая, - gettextsettings. Эта функция заполняет структуру информацией о текущем символьном шрифте, направлении вывода текста (по горизонтали

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

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

    Функциями запроса состоянии категории управления цветом Borland С++ являются функция getbkcolor, возвращающая текущий цвет

    фона, функция getcolor, возвращающая текущий цвет вычерчивания и

    функция getpalette, заполняющая структуру, которая включает в себя размер текущей палитры и ее содержимое. Функция getmaxcolor

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

    для текущего графического драйвера и режима (размер палитры -1).

    И наконец, функции getmodename и getdrivername возвращают

    имя заданного режима драйвера и имя текущего графического драйвера, соответственно.


    Функции запроса состояния


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


    Функция Error


    Виртуальная функция-элемент Error предупреждает пользователя, что содержимое редактируемого управляющего элемента не проходит проверки допустимости. Стандартные объекты проверки допустимости представляют простое диалоговое окно, уведомляющее пользователя, что содержимое ввода является недопустимым, и указывает,
    какой должна быть вводимая информация.
    Хотя большинство производных объектов переопределяют Error,
    ее не следует вызывать непосредственно. Valid вызывает Error, если IsValid возвращает False.


    Функция IsValid


    Виртуальная функция-элемент IsValid вызывается функцией Valid, которая передает IsValid проверяемую строку текста. IsValid
    возвращает True, если строка представляет допустимые данные. IsValid выполняет фактическую проверку допустимости, так что при
    создании собственных объектов проверки допустимости вам потребуется переопределить эту функцию. Обратите внимание, что IsValid
    не вызывается непосредственно. Это делается через Valid, которая
    вызывает Error, если IsValid возвращает False. Это позволяет отделить проверку допустимости от сообщения об ошибке.


    Функция IsValidInput


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


    Функция main.


    Аргументы функции main (argc, argv и env) всегда передаются
    функции main подпрограммой инициализаци и Borland С++.
  • argc (тип integer) - число аргументов командной строки.

  • argv - массив указателей на строки (char *[]). В версиях
    DOS 3.x argv[0] - полное (т.е. включая маршрут доступа)
    имя запускаемой программы. argv[x] - параметр, набранный
    в командной строке после функции (порядковый номер - x).

  • env - также массив указателей на строки. Каждый элемент
    env[] содержит строку вида ENVVAR = value. Аргумент env
    доступен также через глобальную переменную environ. argc и
    argv также доступны через глобальные переменные _argc и
    _argv.

  • Для использования соглашения о связях Паскаля можно использовать ключевое слово cdecl. Например:
    cdecl main(int argc, char *argv[], char *envp[])


    Функция set_new_handler (new.h)


    Устанавливает функцию, вызываемую, когда operator new() или
    operator new[] не могут выделить запрошенную память. По умолчанию
    операции new генерируют в этом случае исключительные ситуации
    xalloc. Это поведение можно переопределить вызовом для установки
    нового обработчика set_new_handler. Для возврата к обычной версии
    используйте set_new_handler(0).
    Заданный пользователем обработчик должен выполнять возврат
    после освобождения памяти, генерировать исключительную ситуацию
    xalloc и вызывать функции abort или exit.


    Функция set_termionate (except.h)


    Позволяет вам установить функцию, определяющую поведение
    программы при ее завершении, когда не найден обработчик исключительной ситуации. Заданная функция описывается как функция типа
    terminate_function. Такая функция не имеет аргументов и возвращает void.
    По умолчанию указанная исключительная ситуация возникает при
    вызове в программе функции terminate. Обычно это приводит к вызову abort. Затем программа завершается с сообщением "Abnormal
    program termination". Если вы хотите вызывать в terminate другую
    функцию, то можете ее определить. Такая функция называется функцией завершения и позволяет вам выполнять действия, не реализованные в abort. Функция завершения не должна возвращаться в terminate.


    Функция set_unexpected (except.h)


    Позволяет установить функцию, определяющую поведение программы при возникновении исключительной ситуации, не описанной в
    списке спецификаций. Действия описываемой функции зависят от типа
    функции. Функция типа unexpected_function - это функция без аргументов, возвращающая void.
    По умолчанию непредвиденные исключительные ситуации приводят
    к вызову unexpected. Если определена unexpected_func, то unexpected вызывает далее unexpected_func, куда и передается управление
    программой. В противном случае вызывается terminate. По определению unexpected_func не возвращает управление в unexpected.


    Функция terminate (except.h)


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


    Функция unexpected (except.h)


    Вызывается, когда функция генерирует исключительную ситуацию, не перечисленную в списке спецификаций. Программа вызывает
    unexpected, которая по умолчанию вызывает определенную пользователем функцию, зарегистрированную с помощью set_unexpected. Если
    такой зарегистрированной функции нет, то вызывается terminate.
    Функция unexpected не возвращает управления, однако может генерировать исключительную ситуацию.


    Функция Valid


    Функция-элемент Valid вызывается соответствующим объектом
    редактируемого управляющего элемента для проверки допустимости
    вводимых данных. Аналогично функции CanClose для интерфейсных
    объектов Valid возвращает True только если переданная ей строка
    содержит допустимые данные.
    При использовании объектов проверки допустимости с редактируемыми управляющими элементами переопределять или вызывать функцию Valid объекта проверки допустимости вам не нужно. Здесь достаточно наследуемой версии Valid. По умолчанию Valid возвращает
    True, если возвращает True функция-элемент IsValid. В противном
    случае она вызывает функцию Error для уведомления пользователя об
    ошибке и возвращает False.


    Функция WinMain


    В качестве основной точки входа приложения Windows вы должны
    предусмотреть функцию WinMain. Некоторые приложения (например,
    ObjectWindows) инкапсулируют эту точку входа. В WinMain передаются следующие параметры:
    WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
    Параметр hInstance - это описатель экземпляра приложения.
    Каждый экземпляр приложения Windows имеет уникальный описатель
    экземпляра, используемый в качестве аргумента в нескольких функциях Windows. Он может также использоваться, чтобы различать несколько экземпляров данного приложения.
    Параметр hPrevInstance - это описатель предыдущего экземпляра данного приложения. hPrevInstance равно NULL, если это первый
    экземпляр (в Win32 это значение всегда равно 0).
    lpCmdLine представляет собой указатель (в 16-разрядной
    Windows указатель типа far) на командную строку с завершающим нулем. Это значение может задаваться при вызове приложения из администратора программ или через вызов WinExec.
    nCmdShow - это целое значение, определяющее, как выводить на
    экран окно приложения (например, в виде пиктограммы).
    Возвращаемое WinMain значение в данный момент Windows не используется, однако оно может быть полезным при отладке.


    - C -

    CGA в режиме низкой разрешающей способности


    В режиме низкой разрешающей способности вы имеете возможность выбрать одну из четырех четырехцветных палитр. В каждой из
    этих четырех палитр вы можете сами установить только первый (цвет
    0) элемент; цвета 1, 2 и 3 являются фиксированными. Первый элемент палитры (цвет 0) - это цвет фона. Этот цвет может являться
    одним из 16 имеющихся цветов (см. таблицу цветов фона, приводимую
    ниже).
    Вы выбираете желаемую палитру, выбирая соответствующий режим
    (CGAC0, CGAC1, CGAC2, CGAC3); эти режимы используют палитры цветов от 0 до 3, соответственно, как показано в следующей таблице.
    Цвета вычерчивания в CGA и эквивалентные им константы определяются в graphics.h.
    Константа, присвоенная номеру цвета (значению эл. изображения)

    Номер палитры 1 2 3
    0 CGA_LIGHTGREEN CGA_LIGHTRED CGA_YELLOW
    1 CGA_LIGHTCYAN CGA_LIGHTMAGENTA CGA_WHITE
    2 CGA_GREEN CGA_RED CGA_BROWN
    3 CGA_CYAN CGA_MAGENTA CGA_LIGHTGRAY

    Для того, чтобы назначить один из этих цветов цветом вычерчивания CGA, нужно вызвать функцию setcolor, задав в ней в качестве аргумента либо номер цвета, либо имя соответствующей константы; например, если вы используете палитру 3 и желаете
    назначить цветом вычерчивания cyan, то можно записать:
    setcolor(1);
    или
    setcolor(CGA_CYAN);
    В следующей таблице перечислены назначаемые для CGA цвета
    фона:

    Числовое значение Символическое имя Числовое значение Символическое
    имя
    0 BLACK 8 DARKGRAY
    1 BLUE 9 LIGHTBLUE
    2 GREEN 10 LIGHTGREEN
    3 CYAN 11 LIGTHCYAN
    4 RED 12 LIGHTRED
    5 MAGENTA 13 LIGHTMAGENTA
    6 BROWN 14 YELLOW
    7 LIGHTGRAY 15 WHITE

    Цвета CGA для переднего плана те же, что находятся в данной
    таблице. Для назначения одного из этих цветов в качестве фонового
    цвета служит функция setbkcolor(цвет), где цвет - это один из
    элементов приведенной выше таблицы. Отметим, что для CGA цвет не
    является значением элемента изображения (индексом в палитре). Он
    прямо задает фактический цвет, помещаемый в первый элемент палитры.


    CGA в режиме высокой разрешающей способности


    В режиме высокой разрешающей способности (640x200) CGA работает с двумя цветами - черным цветом фона и цветным передним планом. Элементы изображения могут принимать при этом значения только 0 или 1. В связи с особенностями CGA цветом переднего плана
    фактически является тот цвет, который аппаратное обеспечение считает цветом фона. Таким образом, цвет переднего плана устанавливается подпрограммой setbkcolor.
    Цвет для переднего плана может быть выбран из предыдущей
    таблицы. CGA далее будет использовать этот цвет для отображения
    им всех элементов изображения, имеющих значение 1.
    Режимы CGAHI, MCGAMED, MCGAHI, ATT400MED и ATT400HI работают
    аналогичным образом.


    Черчение и заполнение


    Ниже приводится краткий обзор функций черчения и закраски:

    Функция черчения Описание
    arc Чертит дугу окружности.
    circle Чертит окружность.
    drawpoly Чертит контур многоугольника.
    ellipse Чертит эллиптическую дугу.
    getarccoords Возвращает координаты последнего вызова
    arc или ellipse.
    getaspectratio Возвращает коэффициент сжатия для текущего графического режима.
    getlinesettings Возвращает текущий тип линии, шаблон линии и толщину линии.
    line Чертит линию из точки (x0,y0) в (x1,y1).
    linerel Чертит линию в точку, задаваемую относительным расстоянием от текущей позиции (CP).
    lineto Чертит линию из текущей позиции (CP) в
    (x,y).
    moveto Перемещает текущую позицию (CP) в (x,y).
    moverel Перемещает текущую позицию (CP) на относительное расстояние.
    rectangle Рисует прямоугольник.
    setaspectratio Изменяет коэффициент сжатия по умолчанию.
    setlinestyle Устанавливает толщину и тип текущей линии.


    Функция закраски Описание
    bar Чертит и закрашивает столбец.
    bar3d Чертит и закрашивает трехмерный столбец.
    fillellipse Чертит и закрашивает эллипс.
    fillpoly Чертит и закрашивает многоугольник.
    getfillpattern Возвращает определяемый пользователем шаблон закраски.
    getfillsettings Возвращает информацию о текущем шаблоне и цвете закраски.
    pieslice Чертит и закрашивает сектор окружности.
    sector Чертит и закрашивает эллиптический сектор.
    setfillpattern Выбирает шаблон закраски, определяемый
    пользователем.
    setfillstyle Устанавливает шаблон и цвет закраски.

    При помощи функций черчения и раскрашивания Borland C++ вы
    можете вычерчивать цветные линии, дуги, окружности, эллипсы, прямоугольники, секторы, дву- и трехмерные столбики, многоугольники,
    а также различные правильные или неправильные формы, являющиеся
    комбинациями перечисленных графических примитивов. Ограниченную
    форму изнутри или снаружи можно заполнить одним из 11 предопределенных шаблонов (образцов заполнителей), либо шаблоном, определенным пользователем. Можно также управлять толщиной и стилем линии вычерчивания, а также местоположением текущей позиции (CP).



    Линии и незакрашенные формы вычерчиваются при помощи функций

    arc, circle, drawpoly, ellipse, line, linerel, lineto и rectangle. Затем можно закрасить эти формы с помощью floodfil, либо можно объединить вычерчивание/закраску в одном шаге при помощи функций bar, bar3d, fillellipse, fillpoly, pieslice и sector. Функция

    setlinestyle позволяет задать тип линий (и граничных линий форм):

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

    setfillstyle можно выбрать предопределенный шаблон заполнения,

    либо определить собственный шаблон заполнения в setfillpattern.

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

    функция moverel позволяет сдвинуть ее на желаемую величину смещения.

    Выяснить текущий тип и толщину линии позволяет функция

    getlinesettings. Информацию о текущем шаблоне заполнения и цвете

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

    функции getfillpattern.

    Получить сведения о коэффициенте относительного удлинения

    (коэффициенте масштабирования, применяемом графической системой

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

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

    или эллипса - функция getarccoords. Если окружности не получаются

    идеально круглыми, можно исправить дело при помощи функции setaspectratio.


    Четвертый BORLAND С++ и его окружение


    М.Вахтеров, С.Орлов, 1994 г.
  • Введение

  • Глава 1. Азы С++

  • Глава 2. Наставление пользователю по Borland C++ 4.0

  • Глава 3. Справочная информация по программированию

  • Глава 4. Справочник по работе с DOS

  • Глава 5. Наставление по отладчику Turbo Debugger 4.0

  • Глава 6. Краткий справочник по библиотеке Borland C++ 4.0

  • Глава 7. Наставление по Borland ObjectWindows for C++ 2.0



  • Число десятичных знаков


    Вы можете задать, сколько десятичных знаков должно участвовать в преобразовании из двоичного типа в bcd. Это число является
    вторым, необязательным аргументом в конструкторе bcd. Например,
    для преобразования $1000.00/7 в переменную bcd, округленную до
    ближайшего цента, можно записать:
    bcd a = bcd(1000.00/7, 2)
    где 2 обозначает два разряда после десятичной точки. Таким образом:
    1000.00/7 = 142.85714
    bcd(1000.00/7, 2) = 142.860
    bcd(1000.00/7, 1) = 142.900
    bcd(1000.00/7, 0) = 142.000
    bcd(1000.00/7, -1) = 140.000
    bcd(1000.00/7, -2) = 100.000
    Округление происходит по банковским правилам, что означает
    округление до ближайшего целого числа, причем в случае одинакового "расстояния" до ближайшего целого в прямую и обратную сторону
    округление выполняется в сторону четного. Например:
    bcd(12.335, 2) = 12.34
    bcd(12.245, 2) = 12.34
    bcd(12.355, 2) = 12.36
    Такой метод округления задается стандартом IEEE.


    Чтение и запись целых чисел


    Старые потоки записывают данные типов int и unsigned как
    двухбайтовые значения. Чтобы облегчить переход на 32-разрядные
    платформы, новые потоки записывают значения int и unsigned как
    4-байтовые значения. Новые потоки могут считывать старые потоки и
    будут корректно обрабатывать 2-байтовые значения.
    Старые потоки предусматривают две функции-элемента для чтения и записи целых значений:
    void writeWord(unsigned);
    unsigned readWord();
    В новых потоках они изменились:
    void writeWord(uint32);
    uint 32 readWord();
    Существующий програмный код, который использует эти функции,
    после перекомпиляции и перекомпоновки будет продолжать работать
    корректно, хотя вызов readWord будет генерировать предупреждения
    о потере точности (когда возвращаемое значение в 16-разрядном
    приложении присваивается переменной типа int или unsigned). Однако в новых программах этих функций следует избегать. В общем случае истинный размер записываемых данных вам вероятно известен,
    поэтому библиотека потоков предусматривает теперь отдельные функции для каждого размера:
    void writeWord16(uint16);
    void writeWord32(uint32);
    uint16 readWord16(uint16);
    uint32 writeWord32(uint32);


    Что такое драйвер устройства?


    Драйвер устройства - это набор подпрограмм, используемых
    операционной системой DOS для управления на нижнем уровне функциями ввода-вывода. Устанавливаемые драйверы устройств (в отличие
    от драйверов, встроенных в DOS) устанавливаются с помощью включения соответствующих строк, например:
    device = clock.sys
    в файл CONFIG.SYS. Когда DOS выполняет операцию ввода-вывода для
    отдельного символа, она просматривает связанный список заголовков
    устройств, выполняя поиск устройства с соответствующим логическим
    именем (например, COM1). В случае драйверов блочно-ориентированных
    устройств, таких, как драйвер диска, DOS отслеживает, сколько установлено драйверов блочно-ориентированных устройств, и обозначает каждый из них буквой: A - первый установленный драйвер устройства, B - второй и т.д. Когда вы, например, ссылаетесь на
    дисковод C, DOS знает, что нужно вызвать драйвер третьего блочно-ориентированного устройства.
    Связанный список двух заголовков драйвера содержит смещение
    двух компонентов самого драйвера устройства: подпрограмму функции
    и подпрограмму обработки прерывания.
    Когда DOS определяет, что требуется вызвать данный драйвер
    устройства, она вызывает драйвер дважды. При первом вызове драйвера DOS общается с подрограммой функции и передает ей указатель
    на буфер в памяти, который называется заголовком запроса. Этот
    заголовок запроса содержит информацию о том, какие функции требует выполнить DOS от драйвера устройства. Подпрограмма функции
    просто сохраняет данный указатель для последующего использования. При втором вызове драйвера устройства DOS вызывает подпрограмму обработки прерывания, которая выполняет реальные функции, заданные DOS в заголовке запроса, например, пересылку
    символов с диска.
    В заголовке запроса с помощью байта, который называется кодом команды, определяется, что должен делать драйвер устройства.
    Код команды определяет одну из предопределенных операций из набора операций, которые должны выполнять все драйверы устройств. Набор кодов команд (операций) для драйверов символьно-ориентированных и блочно-ориентированных устройств различен.
    Проблема при отладке драйверов устройств состоит в том, что
    файл .EXE отсутствует, так как для выполнения соответствующих
    функций драйвер должен быть загружен во время загрузки системы с
    помощью команды DEVICE = DRIVER.EXT, где EXT - это расширение
    .SYS, .COM или .BIN. Это означает, что отлаживаемый драйвер устройства уже резидентен в памяти до начала отладки. Следовательно,
    функции по выполнению загрузки и перемещения таблицы идентификаторов весьма полезны, поскольку они могут восстановить информацию
    об идентификаторах для дизассемблированного сегмента памяти (когда драйвер загружен). Как мы увидим далее, команда File Resident
    также очень полезна.


    Что такое поток?


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


    Что такое резидентная программа?


    Резидентными (TSR) называют такие программы, которые остаются в оперативной памяти после того, как они завершат управление.
    В Borland Си и С++, предусмотрена специальная функция geninterrupt, которая выдает такое программное прерывание.
    Резидентная программа состоит из двух частей - рабочей части
    и резидентной части. Рабочая часть выполняет загрузку резидентной
    части в память и устанавливает вектор прерываний, который определяет характер вызова резидентной в памяти программы. Если резидентная программа должна вызываться с помощью программного прерывания, то рабочая часть программы помещает адрес резидентной части кода в соответствующий вектор прерывания. Если резидентная
    программа должна вызываться с помощью оперативной клавиши, то резидентная часть должна модифицировать обработчик прерывания DOS
    для обработки нажатия соответствующих клавиш (клавиши) на клавиатуре.
    Когда рабочая часть завершает выполнение, она вызывает функцию DOS, которая позволяет части файла .EXE оставаться резидентной в оперативной памяти после завершения выполнения программы.
    Рабочая часть резидентной программы знает размер резидентной части, а также ее адрес в памяти, и передает эту информацию DOS.
    Операционная системе DOS при этом резервирует специальный блок
    памяти, но может свободно записывать информацию в незащищенную
    часть памяти. Таким образом, резидентная часть остается в памяти,
    а рабочая часть может быть "затерта".
    Тонкость отладки резидентных программ состоит в том, что вы
    должны иметь возможность отлаживать и резидентную, и рабочую
    часть программы. Когда выполняется файл .EXE, то выполняется
    только код рабочей части TSR. Поэтому, когда вы как обычно запускаете отладчик, задав имя файла, вы видите выполнение только рабочей части кода программы: то, как он устанавливает резидентную
    часть и обработчики прерываний. Чтобы отлаживать резидентную
    часть, вы должны задать точку останова и сделать резидентным сам
    отладчик.


    Что же такое объекты?


    Начнем с того, что объекты можно сравнить, отвлеченно, с объектами физического мира - компьютерами, автомобилями, электронными платами. Они обладают свойствами, такими, как, например, размер, производительность. Детали автомобиля, компьютера можно использовать многократно. Стандартные элементы позволяет разработчику сосредоточиться над стоящей перед ним задачей вместо того, чтобы заново изобретать
    средства для ее решения.
    Наши объектно-ориентированные объекты - это объединение функций
    и данных (включая простые переменные и структуры) в виде независимой
    конструкции. Эти конструкции - строительные блоки вашей программы.
    Ниже приведены простые примеры объектов:
    Window: Bank:
    int x, y, wd, ht; double savings;
    void draw(); void deposit();
    void hide(); double withdraw();
    Объекты подобны миниатюрным программам. Они содержат и данные, и
    функции, которые в терминологии ООП называются методами. (В С++ функции класса называются функциями-элементами или, как их еще называют,
    - функциями-членами.)
    Замечание: В других объектно-ориентированных языках классы часто называются объектами, функции элементы - методами, а элементы данных - полями.
    Данные обычно специально "упрятываются" и могут принимать значения, от (для) функций-элементов объектов.
    Объект Сбербанк
    Sber_bank
    < deposit << "Вклад $999"
    $$$ < > Функции-элементы Передаваемые сообщения
    Данные > Withdraw < > << "Снять $5555"
    >> $$$ Деньги!
    class sber_bank { // Объявление класса
    public: // Упрятывание управления данными
    double big_bucks; // Элемент данных
    void deposit(double bucks); // Функция-элемент
    double withdraw(double bucks); // Еще одна функция-элемент
    };


    Цвет фона и вычерчивания


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


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


    Цветовое выделение синтаксиса позволяет вам определить цвета
    и атрибуты шрифта. По умолчанию цветовое выделение синтаксиса
    разрешено. Чтобы отключить его, выберите Options Enviroment Syntax Highlighting и отмените Use Syntax Highlighting. Выделение
    синтаксиса действует для файлов .CPP, .C, .H и .HPP. Эти расширения перечислены в Syntax Extension. Вы можете расширить или сократить этот список.
    Чтобы использовать предопределенную схему цветов, выберите
    Options Enviroment Syntax Highlighting и одну из четырех цветовых
    схем. Можно также задать выделение синтаксиса вручную:
  • Выберите Options Enviroment Syntax Highlighting Customize.
    Справа в диалоговом окне Options Enviroment выводится пример исходного кода.

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

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

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



  • Файл BUILTINS.MAK


    Вы быстро обнаружите, что существуют макрокоманды и правила
    утилиты MAKE, которые требуется использовать снова и снова. Существует три способа их обработки:
  • Во-первых, вы можете заносить их в каждый создаваемый вами
    формирующий файл для утилиты MAKE;

  • Во-вторых, вы можете занести все эти элементы в один файл
    и воспользоваться директивой !include в каждом создаваемом
    вами формирующем файле утилиты MAKE. (Другие директивы
    описываются далее в этой главе.);

  • В-третьих, вы можете занести все эти элементы в файл
    BUILTINS.MAK.

  • Каждый раз, когда вы запускаете утилиту MAKE, она ищет файл
    с именем BUILTINS.MAK. Однако, наличие файла BUILTINS.MAK не является обязательным. Если MAKE обнаруживает файл BUILTINS.MAK, то
    сначала она интерпретирует этот файл. Если утилита MAKE не может
    обнаружить файл BUILTINS.MAK, то она переходит непосредственно к
    интерпретации файла MAKEFILE (или того формирующего файла утилиты
    MAKE, который был вами задан с помощью параметра -f).
    Утилита MAKE сначала ищет файл BUILTINS.MAK в текущем каталоге. Если он отсутствует, и вы работаете под управлением DOS
    версии 3.0 или старше, то MAKE осуществляет поиск в том каталоге,
    откуда была вызвана сама утилита MAKE. Вам следует заносить файл
    BUILTINS.MAK в тот же каталог, где находится файл MAKE.EXE.
    Утилита MAKE всегда осуществляет поиск формирующего файла
    только в текущем каталоге. Этот файл содержит правила для конкретной создаваемой выполняемой программы. Как файл BUILTINS.MAK,
    так и формирующий файл подчиняются одинаковым синтаксическим правилам.
    Поиск файлов, задаваемых с помощью директивы !include, также
    осуществляется в текущем каталоге. Если вы используете параметр
    -I (файлы включения), то она будет также выполнять поиск в каталоге, заданном с помощью параметра -I.
    BUILTINS.MAK содержит стандартные правила и макрокоманды,
    которые MAKE применяет перед тем, как MAKE использует формирующий
    файл (параметр -r позволяет MAKE игнорировать BUILTINS.MAK).


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


    В данном разделе описываются файлы определения модуля и операторы, которые в них содержатся. Файл определения модуля обеспечивает для TLINK информацию о содержимом приложения Windows и
    требованиях к системе:
  • Имена прикладной программы или библиотеки динамической
    компоновки (DLL).

  • Идентификация типа прикладной программы как программы для
    Windows или OS/2.

  • Перечисление импортируемых и экспортируемых функций.

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

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

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

  • Заметим, что утилита IMPLIB может использовать файл определения модуля для создания библиотеки импорта. Утилита IMPDEF может создавать файл определения модуля для использования его с
    IMPLIB.


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


    Файлы подсказки представляют собой обычные текстовые файлы,
    содержащие параметры и/или имена файлов, которые обычно вводятся
    после имени программы TLINK в командной строке. Однако, в отличие
    от командной строки, файл подсказки может занимать несколько
    строк текста. Вы можете разбить длинный список объектных файлов
    или файлов библиотек на несколько строк, завершая одну строку
    знаком "плюс" (+) и продолжая список на следующей строке. Когда
    плюс возникает в конце строки, следуя непосредственно за одним из
    параметров TLINK, в котором + используется для включения параметра (например, /ye+), плюс не рассматривается как символ продолжения строки.
    Вы можете также начать каждый из четырех компонентов списка
    на отдельных строках: объектные файлы, выполняемый файл, файл
    карты отображения, библиотечные файлы. В этом случае вы должны
    убрать запятую, используемую для разделения компонентов.
    Чтобы проиллюстрировать эти возможности, предположим, что вы
    пользуетесь следующей командной строкой:
    tlink /c mainline wd ln tx,fin,mfin,work\lib\comm
    work\lib\suррort
    Вместо нее можно использовать файл подсказки, назвав его, например, FINRESP:
    /c mainline wd+
    ln tx,fin
    mfin
    worl\lib\comm work\lib\suррort
    Теперь команду TLINK следует вводить следующим образом:
    tlink @finresр
    Заметьте, что имени файла должен предшествовать символ (@),
    который указывает, что следующий файл является файлом подсказки.
    Альтернативный способ заключается в том, что команду компоновки можно разбить на несколько файлов подсказки. Например,
    представленную выше командную строку можно разбить на следующие
    два файла подсказки:

    Имя файла Содержимое
    LISTOBJS mainline+
    wd+
    ln tx
    LISTLIBS lib\comm+
    lib\suррort

    Теперь команду TLINK можно ввести в следующем виде:
    tlink /c @listobjs,fin,mfin,@listlibs
    Параметры командной строки переопределяют параметры, заданные в файле подсказки.


    Файл TLINK.CFG


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


    Файл WINSPCTR.LOG


    Первая строка в отчете (отчетах) WINSPCTR.LOG показывает вам
    дату и время возникновения исключительной ситуации. На второй
    строке перечисляется:
  • тип исключительной ситуации;

  • имя модуля;

  • логический адрес;

  • физический адрес;

  • текущая задача во время особой ситуации.

  • Если указатель стека во время исключительной ситуации слишком мал, TOOLHELP.DLL автоматически переключает стек. Когда это
    происходит, в конце второй строки файла регистрации выводится сообщение "Stack Switched".


    Файлы конфигурации


    При запуске Turbo Debugger использует следующие файлы конфигурации, инициализации и сеанса:
    - TDCONFIG.TD
    - TFCONFIG.TDW
    - TDCONFIG.TD2
    - TDW.INI
    - XXXX.TR
    - XXXXTRW
    - XXXX.TR2
    Файлы конфигурации TDCONFIG.TD, TDCONFIG.TDW и TDCONFIG.TD2
    создаются с помощью отладчиков TD, TDW и TD32 соответственно. Параметры, установленные в этих файлах, переопределяют параметры,
    используемые данными отладчиками по умолчанию. Вы можете модифицировать файлы конфигурации с помощью инсталляционных программ
    TDINST.EXE. TDWINST.EXE и TD32.EXE.
    TDW.INI - это файл инициализации, используемый TDW.EXE и
    TD2.EXE. Он содержит установки для используемого отладчиком видеодрайвера, расположение файла TDWINTH.DLL (динамически компонуемой библиотеки, применяемой для отладчик в Windows), и параметры удаленной отладчик для WRSETUP.EXE.
    Программа установки отладчика помещает TDW.INI в основной
    каталог Windows. В этой копии TDW.INI параметр видеодрайвера
    ([VideoDLL]) устанавливается в SVGA.DLL, а установка DebuggerDLL
    указывает маршрут к TDWINTH.DLL. Полное описание TDW.INI можно
    найти в файле TD_HELP!.TXT. Файлы с расширениями .TR, .TRW и .TR2
    содержат параметры состояния сеанса отладчиков.
    Когда вы запускаете Turbo Debugger, он ищет файлы конфигурации в следующей последовательности:
  • в текущем каталоге;

  • в каталоге, заданном в установке Turbo Directory программы
    установки Turbo Debugger;

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

  • Если Turbo Debugger находит файл конфигурации, то параметры,
    заданные в этом файле, переопределяют встроенные по умолчанию установки. Если при запуске Turbo Debugger вы указываете параметры
    командной строки, то они переопределяют соответствующие значения
    по умолчанию и значения, заданные в файле конфигурации.
    Для поддержки доступных типов видеоадаптеров и мониторов TDW
    и TD32 используют различные типы видео-DLL. При инсталляции Turbo
    Debugger запустите программу установки TDWINI.EXE, которая поможет вам выбрать или модифицировать используемые отладчиками видео-DLL. По умолчанию TDW и TD32 используют драйвер SVGA.DLL, который поддерживает большинство видеоадаптеров и мониторов. Подробнее об этом рассказывается в оперативном справочнике Help
    программы TDWINI.EXE.
    Кроме того, Turbo Debugger поддерживает в TD, TDW и в TD32
    отладку с двумя мониторами. Для этого вам потребуется цветной монитор и видеоадаптер и монохромный монитор и видеоадаптер. При
    отладке с двумя мониторами Turbo Debugger выводится на монохромном мониторе, а отлаживаемая программа - на цветном. Это позволяет видеть во время отладки вывод программы. Для загрузки TD или
    TDW в режиме с двумя мониторами используйте параметр командной
    строки -do. При работе с TD32 в Windows 32s нужно использовать
    видеобиблиотеку SVGA.DLL. В файл TDW.INI в раздел [VideoOptions]
    для этого нужно включить mono=yes. Для установки параметров видеоадаптера используйте утилиту TDWINI.EXE.


    Файлы конфигурации


    Если каждый раз в командной строке используется один и тот
    же набор параметров, то их можно перечислить в файле конфигурации. Это обычный текстовый файл, в котором параметры разделены
    пробелами. По умолчанию BCC использует файл конфигурации с именем
    TURBOC.CFG, а BCC32 - BCC32.EXE. Параметры командной строки переопределяют параметры файлов конфигурации.


    Файлы описания проектов


    Файлы описания проекта автоматизируют процесс построения
    приложений Windows при использовании IDE Borland C++. Файлы описания проектов с расширением .PRJ содержат информацию о том, как
    построить конкретное приложение. Используя такое инструментальное
    средство как администратор проектов, вы можете создавать и обслуживать файлы проектов, описывающие каждое из разрабатываемых
    приложений. Файлы описания проектов содержат список обрабатываемых файлов и параметры каждого используемого инструментального
    средства. Эта информация используется администратором проектов
    для автоматического построения приложения. Файлы описания проектов и администратор проектов - это эквиваленты формирующих файлов
    и утилиты Make, но их легче обслуживать и использовать, чем формирующие файлы. Для установки параметров проекта можно использовать диалоговое окно Project Options интегрированной среды.


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


    Файл определения модуля .DEF обеспечивает информацию о содержимом файла и требованиях к системе приложения Windows. Эта
    информацию используется компоновщиком и включает в себя размер
    динамически распределяемой памяти и стека, а также характеристики
    кода и данных. Файл .DEF перечисляет также функции, которые должны быть доступными для других модулей (экспортируемые функции), и
    используемые функции других модулей (импортируемые функции). Так
    как компоновщик Borland имеет и другие способы получения этой информации, файл .DEF для него не обязателен. Файл .DEF содержит
    несколько операторов. Перечислим некоторые из них:

    Оператор Функция

    NAME
    Задает имя программы. Если нужно построить DLL,
    используйте оператор LIBRARY. Каждый файл .DEF
    обязательно должен иметь оператор NAME или
    LIBRARY. Заданное имя должно совпадать с именем
    выполняемого файла. WINDOWAPI идентифицирует
    программу, как выполняемую программу Windows.

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

    EXETYPE
    Помечает файл, как выполняемый файл Windows (это
    необходимо для всех выполняемых файлов Windows.

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

    HEAPSIZE
    Задает размер локальной динамически распределяе-
    мой памяти приложения.

    STACKSIZE
    Задает размер стека приложения. Для создания DLL
    этот оператор использовать нельзя.

    Кроме указанных в файлах .DEF используются операции EXPORTS
    и IMPORTS. Оператор EXPORTS перечисляет функции в программе или
    DLL, которые будут вызываться другими приложениями или Windows
    (экспортируемые функции или функции обратного вызова). Экспортируемые функции идентифицируются компоновщиком и вводятся в таблицу экспорта.
    Чтобы избежать создания в файлах .DEF длинных секций
    EXPORTS, в Borland C++ предусмотрено ключевое слово _export. Отмеченные этим ключевым словом функции будут идентифицироваться
    компоновщиком и вводиться компоновщиком в таблицу экспорта.


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


    Если в командной строке задается множества файлов и параметров, поместите их в файл подсказки. Эти текстовые файлы позволяют
    задать более длинную команду, чем это допускает операционная система. Чтобы использовать файл подсказки, дайте команду:
    BCC @[маршрут]файл_подсказки.rsp
    В команде можно задать несколько файлов подсказки (через
    пробел).


    Файлы сценариев ресурсов


    Приложения Windows обычно используют ресурсы. Ресурсы - это
    пиктограммы, меню, диалоговые окна, шрифты, курсоры, битовые массивы и ресурсы, определенные пользователем. Ресурсы определяются
    в файле, который называется файлом сценария ресурса. Эти файлы
    имеют расширение .RC.
    Для использования ресурсов вам потребуется компилятор ресурсов Borland BRC (Borland Resource Compiler) или BRC32, который
    компилирует файл .RC в двоичных формат. При компиляции ресурсов
    создается файл .RES. Компоновщик TLINK или TLINK32 позволяет
    затем связать файл .RES с генерируемым им файлом .EXE. При этом
    файл .EXE отмечается также как выполняемый файл Windows.


    Файлы, входящие в состав пакета Turbo Debugger



    Имя файла Описание
    DUAL8514.DLL Видео-DLL, которые поддерживают отладку с
    двумя мониторами для мониторов 8514.
    STB.DLL Видео-DLL, поддерживающая видео-адаптеры
    STB.
    TD.EXE Отладчик для отладки приложений DOS.
    TDDEBUG.386 Этот драйвер используется TDW.EXE для доступа к специальным отладочным регистрами процессора 80386 (или старше).
    TDHELP.TDH Справочных файл для TD.EXE.
    TDKBDW16.DLL Файл поддержки для Windows 32s.
    TDKBDW32.DLL Файл поддержки для Windows 32s.
    TDREMOTE.EXE Драйвер, используемый в удаленной системе
    для поддержки удаленной отладки в DOS.
    TD32.ICO Пиктограмма, используемая для TD32.EXE.
    TD32HELP.TDH Справочный файл для TD32.EXE.
    TDVIDW16.DLL Файл поддержки для Windows 32s.
    TDVIDW32.DLL Файл поддержки для Windows 32s.
    TDW.EXE Выполняемая программа для отладки 16-разрядных программ Windows.
    TDW.INI Файл инициализации, используемый TDW.EXE и
    TD32.EXE. Он создается программой инсталляции и помещается в основной каталог Windows.
    TDWGUI.DLL Видео-DLL, используемая для вывода окна отладчика TDW в Windows 3.х или TD32 в Windows 32s.
    TDWHELP.TDH Справочный файл для TDW.EXE.
    TDWINTH.DLL Поддерживающая DLL для TDW.EXE.
    WREMOTE.EXE Драйвер для удаленной отладки в Windows.
    TDINST.EXE Создает и модифицирует файл конфигурации
    TDCONFIG.TD.
    TDMEM.EXE Выводит на экран доступную память компьютера, включая дополнительную и расширенную.
    TDRF.EXE Утилита передачи файлов, используемая для
    передачи файлов в удаленную систему.
    TD32INST.EXE Создает и модифицирует файл конфигурации
    TD32 - TDCONFIG.TD32.
    TDSTRIP.EXE Удаляет из файлов .EXE и .DLL используемую
    отладчиком отладочную информацию (таблицу
    идентификаторов) без перекомпоновки файлов.
    TDSTRP32.EXE Удаляет из файлов .EXE и .DLL используемую
    отладчиком отладочную информацию (таблицу идентификаторов) без перекомпоновки файлов.
    TDUMP.EXE Выводит на экран структуру 16- или 32-раз-
    рядных файлов .EXE, .DLL и .OBJ, а также
    содержимое отладочную информацию об идентификаторах.
    TDWINI.EXE Позволяет изменить и настроить параметры
    видеодрайвера отладчика.
    TDWINI.HLP Справочный файл для TDWINI.EXE.
    TDWINST.EXE Создает и модифицирует файл конфигурации
    TDCONFIG.EXE. Настраивает для TDW параметры
    вывода и цвета экрана.
    WRSETUP.EXE Файл конфигурации для утилиты WREMOTE -
    драйвера удаленной отладки.
    TD_ASM.TXT Файл с информацией по отладке программ
    на Turbo Assembler, которая полезна также
    при отладке программ со встроенным ассебмлером.
    TD_HELP!.TXT Файл с ответами на общие вопросы. Среди
    прочего в нем обсуждаются синтаксические
    отличия между анализом выражений в Turbo
    Debugger и компиляторах, отладка программ на нескольких языках др.
    TD_HDWMP.TXT Файл с информации о настройке конфигурации
    отладчика для использования аппаратных отладочных регистров.
    TD_RDME.TXT Содержит последнюю информацию, отсутствую-
    щую в руководстве.
    TD_UTILS.TXT Описывает утилиты отладчика, работающие в
    режиме командной строки: TDSTRIP, TDUMP,
    TDWINST, TD32INST, TDSTRP32, TDMEM, TDMAP и
    TDUMP32.
    MAKEFILE Формирующий файл, используемый в примерах
    программ.
    TDWDEMO.BUG Исходный код примера программы с ошибками
    (для отладки).
    TDWDEMO.H Файл заголовка, используемых примером прог-
    раммы.
    TDWDEMO.ICO Пиктограмма примера программы.
    TDWDEMO.IDE Файл проекта для примера программы.
    TDWDEMO.RC Файл ресурса для примера программы.
    S_PAINT.C Исходный код примера программы.
    S_PAINT.EXE Пример программы.



    Файлы-заголовки ObjectWindows


    Файлы-заголовки находятся в подкаталоге OWL\INCLUDE и содержат описания функций классов и определений типов данных и констант.

    Имя файла Определение класса Использование
    applicat.h TApplication Управляет базовым повелением всех приложений ObjectWindows.
    bitmapga.h TBitMapGadget Выводит на экран массив растровых изображений.
    bitset.h TBitSet Устанавливает или сбрасывает один или более бит.
    TCharSet Устанавливает или сбрасывает байты.
    button.h TButton Создает различные виды
    управляющих элементов типа командных кнопок.
    buttonga.h TButtonGadget Создает реквизиты командных кнопок, которые можно выключать и включать щелчком "мыши".
    cearray.h TCelArrayСоздает массив ячеек.
    checkbox.h TCheckBoxПредставляет управляющий
    элемент типа кнопки с независимой фиксацией.
    chooseco.h TChooseColor Представляет режимное диалоговое окно с возможностью выбора цвета.
    choosefo.h TChooseFont Представляет режимное диалоговое окно с возможностью выбора шрифта.
    clipboar.h TClipboard Содержит функции, управляющие обработкой данных в буфере вырезанного изображения.
    clipview.h TClipboardViewer Регистрирует TClipboardViewer как средство просмотра TClipboard.
    color.h TColor Содержит функцию, используемую для упрощения
    стандартной операции с цветом Windows.
    combobox.h TComboboxСоздает в окне комбинированный блок или управляющий элемент комбинированного блока и класс TComboBoxData, который используется для передачи данных между управляющими элементами.
    commdial.h TCommonDial Абстрактный базовый класс для объектов TCommonDialog.
    compat.h Определяет служебные функции и константы ObjectWindows.
    control.h Tcontrol Используется для создания в производных классов управляющих объектов.
    controlb.h TControlBar Реализует полосу инструментальных средств, обеспечивающую мнемонический доступ к командным кнопкам.
    contolg.h TControlGadget Позволяет помещать управляющие элементы в окно реквизитов.
    dc.h TBandInfo, TClientDC,
    TDC, TDesktopDC, TIC,
    TDibDC, TPrintDC,
    TScreenDC, TWindowDC
    Включающие классы GDI DC, создающие объекты DC.
    decframe.h TDecoratedFrame Создает клиентное окно, куда можно поместить "декорации".
    decmdifr.h TDecoratedMDIFrame Создает объект рамки, поддерживающий "декорированные" дочерние окна.
    dialog.h TDialog Создает режимное и безрежимное диалоговое окно с интерфейсными элементами.
    TDialogAttr Содержит атрибуты диалогового окна.
    dispatch.h Определяет функции диспетчеризации, созданные для обработки сообщений Windows.
    docmanag.h TDocManager Создает объект администратора документов, который работает с документами и шаблонами.
    TDocTemplate Создает шаблоны.
    docview.h TDocument, TView,
    TStream, TInStream,
    TWindowView, TOutStream
    Создает, уничтожает и посылает сообщения о просмотре документов.
    edit.h TEdit Создает управляющий интерфейсный элемент редактирования.
    editfile.h TEditFileСоздает окно редактирования файла.
    editsear.h TEditSearch Создает управляющий элемент редактирования, отвечающий за команды поиска и замены.
    editview.h TEditViewОболочка просмотра для TEdit.
    except.h TXOwl Базовый класс обработки исключительных ситуаций.
    TXOutOfMemory Описывает исключительную
    ситуацию нехватки памяти.
    TXCompatibility Описывает исключительную
    ситуацию состояния.
    TStatus Используется для обратной
    совместимости.
    filedoc.h TFileDocument Открывает и закрывает область просмотра документа.
    findrepl.h TFindDialog,
    TFindReplaceDialog
    Эти классы создают и определяют атрибуты безрежимных диалоговых окон, отвечающих на команды поиска и замены.
    floatfra.h TFloatingFrame Реализует в родительском
    окне свободную рамку.
    framewin TFrameWindow Управляет специфическим для окна поведением, таким как перемещение с помощью клавиатуры и обработка команд.
    TMenuDesc Описывает строку меню.
    gadget.h TGadget Создает объект реквизита, принадлежащий окну реквизитов и имеющий заданные атрибуты.
    gedgetwi.h TGadgetWindow Обслуживает для окна список неперекрывающихся реквизитов.
    gdibase.h TGdiBase Абстрактный базовый класс
    для классов GDI.
    gdiobjec.h TGdiObject Базовый класс GDI.
    TPen, TBrush, TFont,
    TBitMap, TPalette, TIcon,
    TCusor, TDib, TRegion.
    Эти классы специфицируют объекты GDI.
    groupbox.h TGroupBoxСоздает групповой объект,
    представляющий элемент группового блока в Windows.
    inputdia.h TInputDialog Общее диалоговое окно.
    keymodet.h TKeybardModeTracker Смешанный класс, созданный для отслеживания изменений режимов клавиатуры.
    layoutco.h TLayoutConstraint Создает ограничения разметки.
    layoutwi.h TLayoutMetrics Создает ограничения разметки, используемые для характеристик разметки в окне.
    listbox.h TListBox Создает объект блока списка.
    TListBoxData Используется для передачи контекста блока списка.
    listview.h TListView Обеспечивает просмотр блоков списка.
    mdi.h TMDIClient Управляет дочерними окнами MDI.
    TMDIFrame Основное окно MDI-приложения.
    mdichild.h TMDIChild Определяет поведение дочернего окна MDI.
    menu.h TMenu, TPopupMenu, TSystemMenu Создает объекты меню.
    messageb.h TMessageBar Реализует строку сообщения.
    metafile.h TMetaFileBar Класс-оболочка для TMetaFileDC.
    module.h TModule Определяет базовое поведение для библиотек и приложений ObjectWindows.
    opensave.h TOpenSave Базовый класс для режимных диалоговых окон открытия и сохранения.
    owlall.h Включаемый файл для всех классов ObjectWindows.
    owlcore.h Включаемый файл для классов ядра ObjectWindows.
    owldefs.h Определения макрокоманд, используемых в программах ObjectWindows.
    owlpch.h Определения макрокоманд, данных и функций, используемых в программах ObjectWindows.
    point TPoint, TSize, TRect Математические классы.
    TDropinfo Поддерживает операции буксировки имени файла.
    TProcInstance Класс поддержки Win16.
    TPointer Обеспечивает надежную работу с указателями.
    preview.h TPreviewPage Выводит страницу документа в окне предварительного просмотра.
    printdia.h TPrintDialog Выводит диалог печати или режимное окно печати.
    printer.h TPrinter Представляет устройство печати.
    TPrintout Представляет печатаемый документ.
    TPrinterAbortDlg Представляет диалоговое окно прерывания печати.
    radiobut.h TRadioButton Создает управляющий элемент типа кнопки с зависимой фиксацией.
    scrollba.h TScrollBar Представляет управляющий элемент типа вертикальной или горизонтальной полосы прокрутки.
    TScrollBarData Содержит значения позиции указателя полосы прокрутки.
    scroller.h TScroller Реализует автоматическую прокрутку окна.
    signatur.h Определяет шаблоны сигнатуры обработки сообщений, используемых функциями обработки событий ObjectWindows.
    slider.h TSlider Определяет базовое поведение скользящих маркеров.
    THSlider Горизонтальный скользящий маркер.
    TVSlider Вертикальный скользящий маркер.
    static.h TStatic Создает в окне статический управляющий элемент.
    statusba.h TStatusBar Строит строку состояния.
    textgadg.h TTextGadget Строит дополнительный текстовый объект.
    tinycarp.h TTinyCaption Создает для окна меньшую строку заголовка.
    toolbox.h TToolBox Создает инструментальный объект с заданным числом строк и столбцов.
    validate.h TValidator Базовый класс проверки допустимости.
    TPictureValidator Средство проверки допустимости картинки.
    TFilterValidator Средство проверки допустимости фильтра.
    TRangeValidator Средство проверки допустимости диапазона.
    TLookupValidator Средство проверки допустимости преобразования.
    TStringLookupValidator Средство проверки допустимости строки.
    vbxctl.h TVbxControl Интерфейс для управляющих элементов VBX.
    TVbxEventHandler Обрабатывает события от управляющих элементов VBX.
    version.h Определяет внутренний номер версии библиотеки ObjectWindows.
    window.h TWindow Обеспечивает специфическое для окна поведение и инкапсулирует многие функции API.
    windowev.h Определяет обработчики событий и таблицы макрокоманд реакции на сообщения Windows.



    Фатальные ошибки


    Фатальные ошибки генерируются компилятором, компоновщиком и утилитой MAKE и приводят с немедленному прекращению процесса компиляции. Если такую ошибку генерирует компилятор или утилита MAKE, то файл .EXE не создается. Если фатальная ошибка генерируется компоновщиком, то файл .EXE может создаваться.
    Фатальные ошибки встречаются редко. Некоторые из них указывают на внутреннюю ошибку компилятора. Вы должны выполнить соответствующие действия, а затем


    Флаги формата



    Флаг Описание
    skipws Пропускает при вводе пробелы и разделители.
    left Выравнивание вывода влево.
    right Выравнивание вывода влево.
    internal Дополнение после знака или указателя основания.
    dec Десятичное преобразование.
    oct Восьмеричное преобразование.
    hex Шестнадцатиричное преобразование.
    showbase Показывает в выводе индикатор основания.
    showpoint Показывает при выводе с плавающей точкой десятичную точку.
    uppercase Преобразует шестнадцатиричный вывод в верхний
    регистр.
    showpos Выводит с положительными числами символ '+'.
    scientific Добавляет к числам с плавающей точкой суффикс
    с показателем степени (E).
    fixed Для вывода чисел с плавающей точкой использует десятичную фиксированную точку.
    unitbuf После включения выводит все потоки.
    stdio После включения выводит stdout и stderr.



    Формат вывода:


    Описатель {Класс} Модуль Позиция "Заголовок"
    Линии слева показывают структуру дерева. С помощью этих линий каждое окно соединяется с его предком, "братскими" окнами и
    потомками. Линии рисуются таким же образом, как в администраторе
    файлов. Ромб после каждого окна показывает, имеет ли окно дочерние окна. Если он пустой, то дочерних окон нет. Если он содержит
    символ +, то дочерние окна имеются, но они не показаны. Если он
    содержит символ -, то имеются дочерние окна, и они выведены в
    древовидной схеме (видим по крайней мере один уровень дочерних
    окон, другие уровни могут быть скрыты).
    "Описатель" - это описатель окна, возвращаемый CreateWindow.
    "Класс" - это имя класса окна, описанного в области списка
    классов.
    "Модуль" - это имя выполняемого модуля (.EXE или .DLL), который создал окно. Строго говоря, это имя модуля, являющегося
    владельцем сегмента данных, переданного как параметр hInstance
    функции CreateWindow.
    "Позиция" может либо не указываться, если окно скрыто, либо
    это (x_Begin,y_Begin)-(x_End,y_End), если окно является видимым.
    Для окон верхнего уровня это координаты экрана. Для порожденных
    окон это координаты в области пользователя родительского окна,
    которое используется в CreateWindow для создания порожденного окна.
    "Заголовок" - это заголовок окна или текст, возвращаемый
    функцией GetWindowText или сообщением WM_GETTEXT. Если заголовок
    - это нулевая строка, то кавычки опускаются.


    Формат вывода:


    Описатель ["Заголовок" {Класс}] Сообщение Статус
    "Описатель" - это описатель окна, получающего сообщение.
    "Заголовок" - это заголовок окна. Если заголовок - это нулевая строка, то вместо него выводится имя класса (в фигурных скобках).
    "Сообщение" - это имя сообщения, определенное в файле WINDOWS.H. Существуют также неописанные сообщения Windows, показанные символами в нижнем регистре. Номера неизвестных сообщений
    (определенных пользователем) показываются как WM_USER+OxXXXX, если они больше или равны WM_USER, или WM_OxXXXX, если они меньше
    WM_USER. Номера зарегистрированных сообщений (из RegisterWindowsMessage) показываются вместе с их зарегистрированными именами в
    одиночных кавычках.
    "Статус" представляет собой следующее:
  • Значение Dispatched показывает, что сообщение получено через DispatchMessage.

  • Значение Sent [from XXXX] показывает, что сообщение применяется через SendMessage. Если оно посылалось через другое
    окно, то from XXXX показывает описатель окна. Если оно посылалось из того же окна, что и принимает сообщение, то
    указывается fromself. Если сообщение поступает от Windows,
    то часть from... опускается.

  • Return показывает, что сообщение было принято через
    SendMessage и теперь возвращается.

  • Дополнительная информация, относящаяся к каждому сообщению. В случае возвращаемого сообщения здесь показывается
    это значение (в числовой форме или с более конкретной информацией по сообщению, например, wm_GETTEXT. Для посылаемых и диспетчеризуемых сообщений здесь показывается параметры сообщения. WinSight интерпретирует параметры таким
    образом, чтобы получилась читаемая форма. Для сообщений,
    имеющих связанные с ними структуры данных (например,
    WM_CREATE) она перехватывает эти структуры и включает их в
    вывод.



  • Формат вывода:


    Класс (Модуль) Функции Стили
    Ромбы после классов при получении окном любого сообщения
    становятся черными. Это позволяет видеть, какие окна получают в
    данный момент сообщения. Если дочерние окна данного окна в дереве
    убраны, то будет инвертироваться ромб данного окна, что указывает
    на активность дочерних окон.
    "Класс" - это имя класса. Некоторые предопределенные классы
    Windows имеют числовые номера. Например, в качестве имени класса
    всплывающего меню используется число 32768. Для таких классов показывается как номер, так и имя, например, #32768:PopupMenu. Однако фактическое имя класса состоит только из числа. В формате MAKEINTRESOURCE используется также идентификатор ресурса.
    "Модуль" - это имя выполняемого модуля (.EXE или .DLL), который зарегистрировал класс.
    "Функция" - это адрес функции класса окна.
    "Стили" представляют собой стили cs_ класса. Их имена совпадают с определениями cs_ в файле windows.h, но cs_ удаляется, и
    имя указывается с различным регистром символов.


    Форматирование ввода-вывода


    Форматирование ввода и вывода определяется различными флагами состояний формата, перечисленными в классе ios. Эти состояния
    определяются битами числа типа long int следующим образом:
    public:
    enum {
    skipws = 0x0001, // пропуск пробельного символа на
    // вводе
    left = 0x0002, // вывод с левым выравниванием
    right = 0x0004, // вывод с правым выравниванием
    internal = 0x0008, // заполнитель после знака или
    // указателя системы счисления
    dec = 0x0010, // десятичное преобразование
    oct = 0x0020, // восьмиричное преобразование
    hex = 0x0040, // шестнадцатиричное преобразование
    showbase = 0x0080, // показать на выходе указатель
    // системы счисления
    showpoint = 0x0100, // показать позицию десятичной точки
    // (на выходе)
    uppercase = 0x0200, // вывод шестнадцатиричных значений
    // буквами верхнего регистра
    showpos = 0x0400, // показать знак "+" для
    // положительных чисел
    scientific = 0x0800, // использовать запись чисел с плава-
    // ющей точкой с выводом экспоненты Е
    // например, 12345E2
    fixed = 0x1000, // использовать запись чисел с плава-
    // ющей точкой типа 123.45
    unitbuf = 0x2000, // сброс на диск всех потоков
    // после вставки
    stdio = 0x4000, // сброс на диск stdout и stderr после
    // вставки
    };
    Эти флаги читаются и устанавливаются функциями-элементами
    flags, setf и unsetf.


    Функции библиотеки graphics


    Графические функции Borland C++ делятся на несколько категорий:
  • функции управления графической системой;

  • функции черчения и заполнения;

  • функции манипулирования экранами и графическими окнами;

  • функции вывода текстов;

  • функции управления цветами;

  • функции обработки ошибок;

  • функции запроса состояния.



  • Функции доступа к данным


    TDocument предусматривает ряд функций для доступа к данным.
    Вы можете обращаться к данным в простом последовательном потоке
    или тем способом, который зададите в производных классах.
    TDocument предусматривает две функции InStream и OutStream,
    которые возвращают указатель на TInStream и TOutStream. Базовые
    версии этих функций не выполняют никаких действий и возвращают 0.
    В производном классе их нужно переопределить, чтобы они возвращали указатель на объект. Таким образом вы можете обеспечить в
    классе документа доступ к потокам.
    TInStream и TOutStream - это абстрактные базовые классы,
    производные от isteam и ostream класса TStream. TStream обеспечивает минимальные функции для связи потока с документом, а isteam
    и ostream - это стандартные потоки С++. Из TInStream и TOutStream
    нужно создать производные потоковые классы, специфические для
    приложения. Эти классы имеют функции для работы с потоками.
    Каждый документ поддерживает список открытых потоков, который обновляет при добавлении или удалении потоков. В начале этого
    списка находится элемент данных StreamList класса TDocument, который указывает первый поток в списке или содержит 0. Каждый объект TStream в списке имеет функцию-элемент NextStream, которая
    указывает на следующий поток в списке.
    Потоки могут обеспечивать только простой последовательный
    доступ к данным. Если документы содержат файлы мультимедиа, таблицы баз данных или другие сложные данных, то вам потребуются более развитые методы доступа. Для этой цели в TDocument имеется
    еще две функции доступа - Open и Close, которые вы можете переопределить и задать нужное поведение при открытии и закрытии. На
    определение открытия документа никаких ограничений не накладывается. Вы можете задать настолько простое или сложное открытие,
    насколько это требуется.
    Close обеспечивает несколько больше функциональных возможностей. Эта функция проверяет существующие дочерние объекты документа и перед закрытием документа пытается закрыть их все. Данная
    функция позволяет закрыть документ, когда это требуется.
    TDocument имеет также ряд функций, позволяющих вам защитить
    данные. IsDirty проверяет, был ли документ модифицирован. IsOpen
    проверяет состояние документа (открыт он или нет) или наличие потоков в списке. Commit сохраняет изменения данных в памяти. Revert выполняет действие, обратное Commit.


    Функции элементы (методы)


    Как вы уже видели раньше, классы С++ могут содержать в качестве
    своих элементов не только данные, но и функции элементы. Функция эле
    мент - это функция, объявленная внутри определения класса и тесно
    связанная с типом этого класса. В нашем примере - это операции которые выполняются в сберегательных банках. Наш объект sber_bank имеет
    функции элементы deposite (вкладывать) и withdraw (снимать) деньги.
    sber_bank
    Объект сбербанк
    < deposit << Вклад денег
    $$$ < >
    <
    Данные > withdraw >> Снятие денег
    Функции элементы
    Наглядное представление функции элемента withdraw() приводится
    ниже:
    Селектор
    Определяемый класс Имя функции элемента
    Возвращаемый тип Аргумент
    v v v v v
    double sber_bank::withdraw(double bucks)
    {
    big_bucks -= bucks;
    if (big_bucks < 0.0) {
    printf("К сожалению, товарищ, у вас нет таких денег!\n");
    big_bucks -= 10.0; // Штрафная санкция
    }
    return big_bucks;
    }
    Обратите особое внимание на использование операции селектор области действия '::' между определяемым классом и функцией элементом.
    Имя класса sber_bank используется для указания компилятору, к какому
    классу принадлежит withdraw (так как могут иметься и другие варианты
    withdraw, принадлежащие другим классам). При внутреннем определении
    селектор '::' не потребуется, так как и так ясно, что withdraw принадлежит классу sber_bank.
    По аналогии, при обращении функций к элементам своего объекта,
    селектор '.' лишний:
    double sber_bank::withdraw(double bucks)
    {
    Обращение к данным своего объекта
    v (не указывается принадлежность
    big_bucks -= bucks; объекту - sber_bank.)
    if (big_bucks < 0.0) {
    printf("К сожалению, товарищ, у вас нет таких денег!\n");
    big_bucks -= 10.0; // Штраф за перерасход
    }
    return big_bucks;
    }


    Функции в DLL


    Утилита IMPDEF создает редактируемый исходный файл, который
    перечисляет все экспортные функции в DLL. Вы можете отредактировать этот файл .DEF так, чтобы он содержал только те функции, которые вы хотите сделать доступными для нужной прикладной программы, а затем выполнить IMPLIB для отредактированного файла .DEF. В
    результате получается библиотека импорта, которая содержит информацию импорта для заданного подмножества экспортируемых функций
    DLL.
    Например, пусть вы определяете DLL, которая предоставляет
    функции для использования различными прикладными программами.
    Каждая экспортируемая функция в DLL определяется с помощью оператора _exрort. Теперь, если все прикладные программы используют
    все экспортируемые функции DLL, вы можете просто использовать
    IMPLIB для создания одной библиотеки импорта для DLL и поставлять
    эту библиотеку импорта с DLL. Библиотека импорта может быть скомпонована с любыми прикладными программами, исключая таким образом
    необходимость перечисления для каждой прикладной программы каждой
    используемой ей функции DLL в секции IMPORT файла определения модуля.
    Теперь, пусть нужно передать некоторую часть экспортируемых
    функций DLL отдельной прикладной программе. В идеале требуется
    скомпоновать специальную библиотеку импорта с этой прикладной
    программой - библиотеку импорта, которая предоставляет только
    подмножество функций, которые будут использоваться прикладной
    программой. Все другие экспортируемые функции в DLL для клиентной
    прикладной программы должны быть скрыты.
    Для создания библиотеки импорта, которая удовлетворяет этим
    условиям, выполните IMPDEF для откомпилированной и скомпонованной
    DLL. Утилита IMPDEF создаст файл определения модуля, который содержит в секции EXPORT перечисление всех экспортируемых функций
    DLL. Вы можете редактировать этот файл определения модуля, удаляя
    компоненты секции EXPORTS для тех функций, которые вы не хотите
    включать в библиотеку импорта. После того, как вы удалите ненужные экспортируемые функции, выполните утилиту IMPLIB для файла
    определения модуля. Результатом будет библиотека импорта, которая
    содержит информацию импорта только для экспортных функций, перечисленных в секции EXPORTS файла определения модуля.
  • Утилита TLIB: турбо библиотекарь

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

  • Командная строка утилиты TLIB

  • Использование файлов подсказки

  • Создание расширенного словаря: параметр /E

  • Задание размера страницы: параметр /P

  • Различимость регистра символов в идентификаторе: параметр /C

  • Удаление записей-комментариев: параметр /O

  • Список операций

  • Примеры



  • Функции запроса состояния графического режима



    Функция Возвращаемое значение
    getarccoords Возвращает информацию о координатах, заданных
    в последнем вызове arc или ellipse.
    getaspectratio Возвращает коэффициент сжатия для графического экрана.
    getbkcolor Возвращает текущий цвет фона.
    getcolor Возвращает текущий цвет вычерчивания.
    getdrivername Возвращает имя текущего графического драйвера.
    getfillpattern Возвращает шаблон заполнения, определяемый пользователем.
    getfillsettings Возвращает информацию о текущем шаблоне и
    цвете заполнения.
    getgraphmode Возвращает текущий графический режим.
    getlinesettings Возвращает текущие стиль, шаблон и толщину
    линии.
    getmaxcolor Возвращает максимально допустимое на текущий момент значение элемента изображения.
    getmaxmode Возвращает максимально допустимый номер режима для текущего драйвера.
    getmaxx Возвращает текущее разрешение по оси x.
    getmaxy Возвращает текущее разрешение по оси y.
    getmodename Возвращает имя данного режима драйвера.
    getmoderange Возвращает диапазон режимов для данного
    драйвера.
    getpalette Возвращает текущую палитру и ее размер.
    getpixel Возвращает цвет элемента изображения в (x,y).
    gettextsettings Возвращает текущий шрифт, направление, размер
    и способ выравнивания текста.
    getviewsettings Возвращает информацию о текущем графическом
    окне.
    getx Возвращает координату x текущей позиции (CP).
    gety Возвращает координату y текущей позиции (CP).

    В каждой из категорий графических функций Borland C++ имеется хотя бы одна функция запроса состояния. Эти функции упоминались при рассмотрении соответствующих категорий и также рассматриваются здесь отдельно. Каждая из графических функций запроса
    состояния Borland C++ имеет имя вида "get что-то" (за исключением
    категории функций обработки ошибок). Некоторые из них не воспринимают никаких аргументов и возвращают единственное значение,
    представляющее собой искомую информацию. Прочие считывают указатель структуры, определяемой в файле graphics.h, заполняют эту
    структуру соответствующей информацией и не возвращают никаких



    значений.

    Функциями запроса состояния категории управления графической

    системы являются getgraphmode, getmaxmode и getmoderange. Первая

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

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

    этого драйвера, а третья возвращает диапазон режимов, поддерживаемых данным графическим драйвером. getmaxx и getmaxy возвращают

    соответственно максимальные экранные координаты x и y для текущего графического режима.

    Функциями запроса состояния категории вычерчивания и заполнения являются функции getarccoords, getaspectratio, getfillpattern и getlinesettings. Функция getarccoords заполняет структуру, содержащую координаты, которые использовались при последнем вызове функций arc или ellipse. Функция getaspectratio сообщает текущий коэффициент сжатия, используемый графической системой для того, чтобы окружности выглядели круглыми. Функция getfillpattern

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

    Функция getfillsettings заполняет некоторую структуру текущим

    шаблоном и цветом заполнения. Функция getlinesettings заполняет

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

    Функциями запроса состояния категории манипулирования графическим окном являются getviewsettings, getx, gety и getpixel.

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

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

    информацией некоторую структуру. Функции getx и gety возвращают

    (относительно графического окна) x- и y-координаты текущей позиции (CP). Функция getpixel возвращает цвет указанного элемента изображения.

    Функция запроса состояния категории вывода текста в графическом режиме имеется только одна, и притом всеобъемлющая, - gettextsettings. Эта функция заполняет структуру информацией о текущем символьном шрифте, направлении вывода текста (по горизонтали

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

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

    Функциями запроса состоянии категории управления цветом Borland С++ являются функция getbkcolor, возвращающая текущий цвет

    фона, функция getcolor, возвращающая текущий цвет вычерчивания и

    функция getpalette, заполняющая структуру, которая включает в себя размер текущей палитры и ее содержимое. Функция getmaxcolor

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

    для текущего графического драйвера и режима (размер палитры -1).

    И наконец, функции getmodename и getdrivername возвращают

    имя заданного режима драйвера и имя текущего графического драйвера, соответственно.


    Функции запроса состояния


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


    Функция Error


    Виртуальная функция-элемент Error предупреждает пользователя, что содержимое редактируемого управляющего элемента не проходит проверки допустимости. Стандартные объекты проверки допустимости представляют простое диалоговое окно, уведомляющее пользователя, что содержимое ввода является недопустимым, и указывает,
    какой должна быть вводимая информация.
    Хотя большинство производных объектов переопределяют Error,
    ее не следует вызывать непосредственно. Valid вызывает Error, если IsValid возвращает False.


    Функция IsValid


    Виртуальная функция-элемент IsValid вызывается функцией Valid, которая передает IsValid проверяемую строку текста. IsValid
    возвращает True, если строка представляет допустимые данные. IsValid выполняет фактическую проверку допустимости, так что при
    создании собственных объектов проверки допустимости вам потребуется переопределить эту функцию. Обратите внимание, что IsValid
    не вызывается непосредственно. Это делается через Valid, которая
    вызывает Error, если IsValid возвращает False. Это позволяет отделить проверку допустимости от сообщения об ошибке.


    Функция IsValidInput


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


    Функция main.


    Аргументы функции main (argc, argv и env) всегда передаются
    функции main подпрограммой инициализаци и Borland С++.
  • argc (тип integer) - число аргументов командной строки.

  • argv - массив указателей на строки (char *[]). В версиях
    DOS 3.x argv[0] - полное (т.е. включая маршрут доступа)
    имя запускаемой программы. argv[x] - параметр, набранный
    в командной строке после функции (порядковый номер - x).

  • env - также массив указателей на строки. Каждый элемент
    env[] содержит строку вида ENVVAR = value. Аргумент env
    доступен также через глобальную переменную environ. argc и
    argv также доступны через глобальные переменные _argc и
    _argv.

  • Для использования соглашения о связях Паскаля можно использовать ключевое слово cdecl. Например:
    cdecl main(int argc, char *argv[], char *envp[])


    Функция set_new_handler (new.h)


    Устанавливает функцию, вызываемую, когда operator new() или
    operator new[] не могут выделить запрошенную память. По умолчанию
    операции new генерируют в этом случае исключительные ситуации
    xalloc. Это поведение можно переопределить вызовом для установки
    нового обработчика set_new_handler. Для возврата к обычной версии
    используйте set_new_handler(0).
    Заданный пользователем обработчик должен выполнять возврат
    после освобождения памяти, генерировать исключительную ситуацию
    xalloc и вызывать функции abort или exit.


    Функция set_termionate (except.h)


    Позволяет вам установить функцию, определяющую поведение
    программы при ее завершении, когда не найден обработчик исключительной ситуации. Заданная функция описывается как функция типа
    terminate_function. Такая функция не имеет аргументов и возвращает void.
    По умолчанию указанная исключительная ситуация возникает при
    вызове в программе функции terminate. Обычно это приводит к вызову abort. Затем программа завершается с сообщением "Abnormal
    program termination". Если вы хотите вызывать в terminate другую
    функцию, то можете ее определить. Такая функция называется функцией завершения и позволяет вам выполнять действия, не реализованные в abort. Функция завершения не должна возвращаться в terminate.


    Функция set_unexpected (except.h)


    Позволяет установить функцию, определяющую поведение программы при возникновении исключительной ситуации, не описанной в
    списке спецификаций. Действия описываемой функции зависят от типа
    функции. Функция типа unexpected_function - это функция без аргументов, возвращающая void.
    По умолчанию непредвиденные исключительные ситуации приводят
    к вызову unexpected. Если определена unexpected_func, то unexpected вызывает далее unexpected_func, куда и передается управление
    программой. В противном случае вызывается terminate. По определению unexpected_func не возвращает управление в unexpected.


    Функция terminate (except.h)


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


    Функция unexpected (except.h)


    Вызывается, когда функция генерирует исключительную ситуацию, не перечисленную в списке спецификаций. Программа вызывает
    unexpected, которая по умолчанию вызывает определенную пользователем функцию, зарегистрированную с помощью set_unexpected. Если
    такой зарегистрированной функции нет, то вызывается terminate.
    Функция unexpected не возвращает управления, однако может генерировать исключительную ситуацию.


    Функция Valid


    Функция-элемент Valid вызывается соответствующим объектом
    редактируемого управляющего элемента для проверки допустимости
    вводимых данных. Аналогично функции CanClose для интерфейсных
    объектов Valid возвращает True только если переданная ей строка
    содержит допустимые данные.
    При использовании объектов проверки допустимости с редактируемыми управляющими элементами переопределять или вызывать функцию Valid объекта проверки допустимости вам не нужно. Здесь достаточно наследуемой версии Valid. По умолчанию Valid возвращает
    True, если возвращает True функция-элемент IsValid. В противном
    случае она вызывает функцию Error для уведомления пользователя об
    ошибке и возвращает False.


    Функция WinMain


    В качестве основной точки входа приложения Windows вы должны
    предусмотреть функцию WinMain. Некоторые приложения (например,
    ObjectWindows) инкапсулируют эту точку входа. В WinMain передаются следующие параметры:
    WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
    Параметр hInstance - это описатель экземпляра приложения.
    Каждый экземпляр приложения Windows имеет уникальный описатель
    экземпляра, используемый в качестве аргумента в нескольких функциях Windows. Он может также использоваться, чтобы различать несколько экземпляров данного приложения.
    Параметр hPrevInstance - это описатель предыдущего экземпляра данного приложения. hPrevInstance равно NULL, если это первый
    экземпляр (в Win32 это значение всегда равно 0).
    lpCmdLine представляет собой указатель (в 16-разрядной
    Windows указатель типа far) на командную строку с завершающим нулем. Это значение может задаваться при вызове приложения из администратора программ или через вызов WinExec.
    nCmdShow - это целое значение, определяющее, как выводить на
    экран окно приложения (например, в виде пиктограммы).
    Возвращаемое WinMain значение в данный момент Windows не используется, однако оно может быть полезным при отладке.


    - D -

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


    В 32-битовом коде Windows вам требуется изменить способ распаковки данных сообщения из lParam и wParam. В Win32 wParam вырастает в размере с 16 до 32 бит, в то время как lParam сохраняет
    размер 32 бита. Так как lParam в 16-разрядной Windows часто содержит описатель и другое значение, а в Win32 описатель увеличивается до 32 бит, необходима новая схема упаковки wParam и lParam.
    В качестве примера сообщения, на которое влияют изменения в
    размере параметра, можно привести WM_COMMAND. В Windows 3.x
    wParam содержит 16-битовый идентификатор, а lParam - 16-битовый
    описатель окна и 16-битовую команду.
    В Win32 lParam содержит только 32-битовый описатель окна.
    16-битовая команда перемещается из lParam в младшие 16 бит
    wParam, а старшие 16 бит wParam содержат идентификатор. Эта новая
    схема означает, что вам нужно изменить способ извлечения информации из этих параметров, для чего используются обработчики сообщений.
    Обработчик сообщений предоставляет переносимый способ извлечения сообщений из wParam и lParam. В зависимости от вашей среды
    (16-битовой Windows или Win32) обработчики сообщений используют
    разные методы выделения из сообщений данных. Использование макрокоманд обработки сообщений обеспечит функционирования кода выделения данных из сообщения на любой из двух платформ.


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


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

    Break Break приводит к тому, что при срабатывании точки останова
    программа останавливается. Экран отладчика будет выведен заново,
    и вы можете вводить команды для просмотра структур данных программы.
    Execute Execute приводит к выполнению выражения (выражение запрашивается в поле ввода Action Expression). Выражение должно иметь
    некоторые побочные эффекты, например, присваивание значения переменной. Эта возможность позволяет вам включить выражение, которое
    будет выполняться перед кодом вашей программы в строке с текущим
    номером ("вставка кода"). Такое средство полезно использовать,
    когда вы хотите изменить поведение подпрограммы, чтобы проверить
    "диагноз" или скорректировать ошибку. Это позволяет при проверке
    минимальных изменений в программе не выполнять цикл компиляции и
    компоновки.
    Log Log приводит к тому, что значение выражения будет записано в
    окне Log. Вам выводится подсказка. В ответ на нее вы должны ввести выражение, значение которого требуется зарегистрировать. Будьте внимательны, чтобы выражение не имело никаких неожиданных побочных эффектов.
    Enable group Enable group позволяет вновь активизировать запрещенную ранее группу точек останова. Укажите в поле ввода Action Expression
    номер группы.
    Disable group Disable group позволяет запретить группу точек останова. При
    запрещении группы точек останова они не стираются, а просто маскируются на время сеанса отладки. Укажите в поле ввода Action Expression номер группы.



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


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


    Дерево меню


    Ниже показана полная структуру спускающихся меню отладчика
    TD.
    = File Edit View Run Breakpoints Data Options Window Help
    Run
    Run F9
    Go to cursor F4
    Trace Into F7
    Step Over F8
    = (System) Execute to... Alt+F9
    Until Return Alt+F8
    Repaint Desktop Animate...
    Restore Standard Back Trace Alt+F4
    Instruction Trace Alt+F7
    About...
    Arguments...
    Program reset Ctrl+F2
    Next pending status
    Wait for child Yes
    File
    Open...
    Attach
    Change Dir...
    Get Info... Breakpoints
    OS Shell
    Toggle F2
    At... Alt+F2
    Changed memory global...
    Expression true global...
    Quit Alt-X Handware Breakpoint...
    Delete all
    View
    Data
    Breakpoints
    Stack Inspect...
    Log Evaluate/modify... Ctrl+F4
    Watches Add watch... Ctrl+F7
    Variables Function return
    Module... F3
    File...
    CPU
    Dump
    Registers Module...
    Numeric Processor Dump
    Execution History File...
    Hierarchy
    Threads
    Windows messages
    Clipboard
    Another >
    Options
    Window
    Language... Source
    Macros > Zoom F5
    Display options... Next F6
    Path for source... Next pane Tab
    Set Restart Options... Size/move Ctrl+F5
    Save options... Iconsize/restore
    Restore options... Close Alt+F3
    Undo close Alt+F6
    User screen Atl+F5
    1 First open window
    Create... Alt = (2-9 open windows)
    Stop recording Alt - Window pick...
    Remove
    Delete all
    Help
    Edit Index Shift+F1
    Previous topic Alt+F1
    Copy Shift+F3 Help on help
    Paste Shift+F4
    Copy to Log
    Dump pane to log


    Деструкторы


    Деструкторы, как следует из их названия, уничтожают объекты
    класса, созданные перед этим конструктором, очищая значения и освобождая память. Деструкторы наследуют имена своих классов, с добавлением лидирующего знака тильда '~':
    class sber_bank {
    private:
    double big_bucks;
    public:
    sber_bank(double bucks); < Конструктор
    ~sber_bank(void); < Деструктор
    void deposit(double bucks);
    double withdraw(double bucks);
    };
    В объявленном выше классе деструктор определяется так:
    Селектор
    Используемый класс Имя деструктора
    v v v
    sber_bank :: ~sber_bank(void)
    {
    printf("Машина останавливается \n");
    }
    Деструктор также можно объявлять встроенным:
    class sber_bank {
    private:
    double big_bucks;
    public:
    // Встроенный конструктор
    sber_bank(double bucks) { big_bucks = bucks; }
    // Встроенный деструктор
    ~sber_bank(void) {printf("Машина останавливается ...\n");}
    void deposit(double bucks);
    double withdraw(double bucks);
    };


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


    Для отладки программного кода С++ предусмотрен ряд макрокоманд, которые находятся в check.h. Их можно использовать в Windows и DOS. Существует два типа макрокоманд - заданные по умолчанию (CHECK, PRECONDITION, TRACE и WARN) и расширенные (CHECKX, PRECONDITIONX, TRACEX и WARNX).
    Заданные по умолчанию макрокоманды предусматривают простую
    проверку значений и вывод сообщений. Расширенные макрокоманды
    позволяют создавать макрогруппы и избирательно разрешать или запрещать их. Расширенные макрокоманды позволяют вам избирательно разрешать или запрещать макрокоманды на основе порогового значения.
    Управлять расширением диагностических макрокоманд можно с
    помощью трех предопределенных идентификаторов препроцессора:
    __DEBUG__, __TRACE и __WARN. Если при компиляции определяется
    один из этих идентификаторов (с помощью параметра -D), то расширяются соответствующие макрокоманды, и генерируется диагностический код.
    Диагностические макрокоманды разрешаются согласно следующему правилу:
    __DEBUG=1 __DEBUG=2 __TRACE _WARN
    PRECONDITION Ч Ч
    PRECONDITIONX Ч Ч
    CHECK Ч
    CHECKX Ч
    TRACE Ч
    TRACEX Ч
    WARN Ч
    WARNXЧ
    Чтобы создать диагностическую версию выполняемой программы,
    разместите в ее важнейших точках диагностические макрокоманды и
    скомпилируйте а разрешением соответствующего идентификатора. Диагностическая версия библиотек классов строится аналогично.


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


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

    Элемент TData Описание
    FileName Имя выбранного файла. На входе задает исполь-
    зуемое по умолчанию имя файла, на выходе -
    имя выбранного файла.
    Filter Фильтры имени файла и фильтр-шаблоны имеет
    форму:
    фильтр фильтр шаблон ...
    где "фильтр" - это текстовая строка, описывающая фильтр, а шаблон фильтра - трафарет имени файла DOS.
    CustomFile Позволяет задать специальные фильтры.
    FilterIndex Определяет, какой из фильтров (Filter) следует
    выводить по умолчанию.
    InitialDir Каталог, который должен выводиться при открытии файлового диалогового окна.
    DelExt Заданное по умолчанию расширение, добавляемое
    к имени файла, если пользователь его не указывает.



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


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

    Элемент TData Описание
    FromPage Первая страница вывода, если задан флаг
    PG_PAGENUMS. На входе определяет заданную по умолчанию первую страницу. На выходе задает первую страницу, выбранную пользователю.
    ToPage Последняя страница вывода, если установлен
    флаг PG_PAGENUMS. На входе определяет заданную по умолчанию последнюю страницу. На выходе задает выбранный пользователем номер последней страницы.
    MinPage Наименьшее число страниц, которые может выбрать пользователь.
    MaxPage Наибольшее число страниц, которые может выбрать пользователь.
    Copies Число печатаемых копий. На входе задает
    число копий по умолчанию, на выходе - число копий, заданное пользователем.



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


    Общие диалоговые окна поиска и замены позволяет вам искать и
    возможно заменять текст в данных приложения. Эти диалоговые окна
    обладают достаточной гибкостью и могут использоваться для документов и баз данных. Проще всего использовать эти диалоговые блоки с помощью классов редактируемых управляющих элементов TEditSearch и TEditFile. Они реализуют редактируемые управляющие элементы поиска и замены.
    Так как диалоговые блоки поиска и замены являются безрежимными, указатель на них обычно сохраняется в элементах данных объекта родительского окна. Это облегчает связь с ними. Строит и
    создавать блоки поиск и замены следует в ответ на команду (например, команду меню Search Finf и Search Replace). При этом выводится диалоговый блок, где пользователь может вводить информацию
    поиска.
    TFindReplaceDialog::TData имеет стандартные элементы данных
    Flags, плюс элементы данных, содержащие строки поиска и замены.
    Так как блоки поиска и замены являются безрежимными, они взаимодействуют с объектом родительского окна, используя зарегистрированное сообщение FINDMSGSTRING. Вы должны написать функцию реакции на это сообщение. Эта функция воспринимает два параметра WPARAM и LPARAM и возвращает LRESULT. Параметр LPARAM содержит указатель, который вы должны передавать функции-элементу UpdateData.
    После вызова UpdateData нужно проверить FR_DIALOGTERM. Этот
    флаг устанавливается, когда пользователь закрывает безрежимный
    диалоговый блок. При этом ваша функция реакции на событие должна
    обнулять указатель на объект диалогового блока, после чего вы можете строить и создавать этот объект снова.
    Пока вы можете обновлять флаг FR_DIALOGTERM, вы может обрабатывать сообщение FINDMSGSTRING, выполняя фактический поиск. Это
    может быть простой поиск в редактирующем управляющем элементе или
    сложный поиск в таблице Paradox или dBASE.
    Общие диалоговые блоки имеют командную кнопку Find Next
    (найти следующий), которую пользователи могут активизировать при
    выводе диалогового блока. Большинство приложений также имеют команду Find Next в меню Search, так что пользователь может найти
    следующее вхождение за один шаг, не открывая диалогового блока.
    Те же функциональные возможности предлагают TFindDialog и TReplaceDialog.


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


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


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


    Диалоговые блоки ввода - это простые диалоговые блоки, выводящие пользователю подсказку для ввода одной строки текста. Вы
    можете выполнять диалоговые блоки как режимные или безрежимным,
    но обычно они являются режимными. С объектами диалоговых блоков
    связан ресурс диалогового блока, который находится в файле сценария ресурса inputdia.rc. Файл ресурса вашего приложения должен
    включать в себя этот файл.
    При построении объекта диалогового блока задается указатель
    на объект родительского окна, заголовок, подсказку, текстовый буфер и его размер. В этом буфере содержится заданный по умолчанию
    текст ввода. Когда пользователь выбирает OK или нажимает Enter,
    строка введенного текста автоматически передается в массив символов.


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


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


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


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

    Элемент TData Описание
    DC Описатель контекста устройства принтера, шрифты которого вы хотите выбрать при задании флага CF_PRINTERFONTS в Flags.
    LogFont Описатель LOGFONT, который задает внешний вид
    шрифта. При выполнении диалогового блока и задании флага CF_INITTOLOGFONTSTRUCT диалоговое окно выводится с заданным шрифтом.
    PointSize Размер выбранного шрифта (в 1/10 пункта). На
    входе задает размер выбранного по умолчанию шрифта, а на выходе возвращает выбранный пользователем размер.
    Color Цвет выбранного шрифта, если установлен флаг
    CF_EFFECT. На входе устанавливает цвет выбранного шрифта, а на выходе - цвет, выбранный пользователем.
    Style Позволяет задать стиль диалога.
    FontType Набор флагов, описывающих стили выбранного
    шрифта. Устанавливается только на выходе.
    SizeMin
    SizeMax
    Задает минимум и максимум размера (в пунктах), который может выбирать пользователь при установке флага CF_LIMITSIZE.



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


    Когда приложение использует функцию из статически компонуемой библиотеки (например, библиотеки исполняющей системы Си), копия этой функции связывается с вашим приложением на этапе компоновки (компоновщиком TLINK). Два одновременно работающих приложения, использующих одну и ту же функцию, будут иметь собственную
    копию данной функции. Эффективней было бы совместно использовать
    единственную ее копию. Такую возможность дают динамически компонуемые библиотеки. При динамической компоновке внешние ссылки
    разрешаются на этапе выполнения.
    Когда программа использует функцию из DLL, эта функция не
    компонуется с файлом .EXE. При динамической компоновке используется другой метод. Во-первых, на этапе компоновке TLINK связывает
    с вашим файлом .EXE записи импорта (содержащие информацию о DLL и
    адресе процедуры). Это временно разрешает в вашей программе внешние ссылки на функции DLL. Данные записи импорта обеспечиваются
    файлами определения модуля или библиотеками импорта. На этапе выполнения информация записи импорта используется для поиска и привязки к вашей программе функции DLL.
    Благодаря динамической компоновке ваши приложения имеют
    меньший размер, так как с ними не компонуется код функций. А поскольку код DLL и ресурсы совместно используются несколькими приложениями, это экономит системную память.


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


    В данном разделе мы рассмотрим объекты, создаваемые на этапе вы-
    полнения. Память для них выделяется из области свободной памяти. Метод создания динамических объектов очень важен для многих прикладных
    задач, где объем хранимых в памяти данных неизвестен заранее перед
    запуском программы. Примером может служить программа произвольной базы данных, которая для быстрого доступа хранит в памяти записи различного размера.
    Хотя в С++ можно использовать функции динамического распределения памяти языка Си, такие, как malloc, однако, С++ содержит некоторые мощные расширения, которые облегчают и делают более надежным динамическое распределение и освобождение объектов.
    Речь идет о функциях, которые можно использовать для распределения динамической памяти, - new и delete. Работа с этими функциями
    строится в стиле операций:
    операция new
    v
    double *d = new double;
    delete d;
    ^
    операция delete
    Важность операции new заключается в возможности следить за размерами выделяемой памяти, в соответствии с используемыми типами. Без
    вспомогательной информации, из вышеприведенного примера ясно, что выделено восемь байт для указателя типа double.
    Сравните функции new и delete с функциями Си malloc() и free():
    В Си указывается
    размер C++ (размер не указывается)
    v
    double *d = malloc(8); double *d = new double;
    free(d); delete d;
    char *q = malloc(sizeof(int)*10); char *q = new int[10];
    free(q); delete[10] q;
    Если память выделяется для массива, а не для типа данных со
    стандартной длиной, то используется следующий синтаксис:
    new объект[размер]
    Например, чтобы динамически выделить память для массива из 100
    целых чисел с именем counts, используйте вызов:
    counts = new int [100];
    Использование new и delete не только надежней, но и удобней. Они
    автоматически могут вызываться конструкторами и деструкторами.
    Однако, если динамический объект создан с помощью оператора new,
    то программист несет ответственность за его освобождение, так как С++
    "не знает", нужен ли еще этот объект. Для освобождения памяти можно
    использовать оператор delete. При выполнении оператора delete вызывается любой определенный вами деструктор.

    Еще раз уточним, что delete имеет следующий синтаксис:
    delete указатель;
    где "указатель" - это указатель, который использовался в операторе
    new для выделения памяти.


    Директива !error


    Директива выдачи сообщения об ошибке (!error) указывает утилите MAKE, что нужно прервать выполнение и отобразить диагностическое сообщение о неисправимой ошибке, содержащее текст после
    директивы !error. Данная директива имеет формат:
    !error произвольный_текст
    Данная директива предназначена для включения в директивы условного выполнения, чтобы заданное пользователем условие определения ошибки могло бы прервать выполнение утилиты MAKE. Например,
    вы можете вставить перед первым явным правилом следующий код:
    !if !$d(MODEL)
    # если MODEL не определена
    !error MODEL не определена
    !endif
    Если при подходе к данной точке директива MODEL еще не была определена, то утилита MAKE прекращает выполнение с выдачей следующего сообщения об ошибке:
    Fatal makefile 4: Error directive: MODEL не определена


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


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


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


    Данная директива, помещенная в формирующий файл, указывает
    утилите MAKE, где нужно искать файл с заданным расширением имени
    файла. Например, если в формирующем файле имеются следующие строки:
    .PATH.c = C:\CSOURCE
    .c.obj:
    BCC -c $*
    tmр.exe: tmр.obj
    BCC tmр.obj
    то утилита MAKE будет искать файл TMP.C, который является неявно
    заданным исходным файлом для создания файла TMP.OBJ, в каталоге
    C:\CSOURCE, а не в текущем каталоге.
    Директива .PATH также является макрокомандой, которая содержит значение имени маршрута. Ниже приводится пример использования
    этой директивы. Исходные файлы содержатся в одном каталоге, объектные файлы - в другом, а все выполняемые файлы - в текущем каталоге.
    .PATH.c = C:\CSOURCE
    .PATH.obj = C:\OBJS
    .c.obj:
    BCC -c -o$(.PATH.obj)\$& $<
    obj.exe: tmр.obj
    BCC -e$&.exe $<
    tmр.exe: tmр.obj


    Директива .precious


    Директива .precious имеет следующий синтаксис:
    .precious:целевой_файл[...]
    где "целевой_файл" - это один или более целевых файлов. Директива
    .precious указывает утилите MAKE, что целевой файл удалять не
    нужно, даже при неудачном выполнении команд построения целевого
    файла. В некоторых случаях целевой файл будет допустимым. Например, если к библиотеке нельзя присоединить объектный модуль, то
    библиотеку удалять не следует. Или если при построении прикладной
    программы Winsdows выполнение администратора ресурсов завершается
    неудачно, то выполняемый файл .EXE удалять не следует.



    Директива .suffixes


    В следующем примере MYPROG.OBJ можно создать из файлов
    MYPROG.ASM, MYPROG.CPP и MYPROG.C:
    myprog.exe: myprog.obj:
    tlink mprog.obj
    .asm.obj:
    tasm /mx $<
    .cpp.obj:
    bcc -p $<
    .c.obj:
    bcc -p- $<
    Если доступно более одного из этих исходных файлов, директива .suffixes определяет, какой из них будет использоваться. Директива .suffixes имеет следующий синтаксис:
    .suffixes: .исх_расшир...
    где ".исх_расшир" - это список расширений, для которых имеются
    неявные правила, в том порядке, в каком должны использоваться неявные правила.
    Например, если мы добавим .suffixes: .asm .c .cpp в начало
    предыдущего формирующего файла, утилита MAKE сначала будет искать
    файл MYPROG.ASM, MYPROG..C и наконец MYPROG.CPP.


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


    Директива включения файлов (!include) задает файл, который
    должен быть включен в формирующий файл для интерпретации в том
    месте, где располагается эта директива. Данная директива имеет
    следующую форму:
    !include имя_файла
    Возможен любой уровень вложенности этих директив. Если директива включения файла пытается включить какой-либо файл, который уже был включен на некотором внешнем уровне вложения (таким образом, что может начаться бесконечный цикл вложения), то внутренняя директива включения игнорируется как ошибочная.
    Как можно использовать эту директиву? Предположим, что вы
    создали файл MODEL.MAC, который содержит следующие строки:
    !if !$d(MODEL)
    MODEL = m
    !endif
    Вы можете использовать представленное условное (используемое
    в зависимости от выполнения условия) макроопределение в любом
    формирующем файле, задав следующую директиву:
    !include "MODEL.MAC"
    Когда утилита MAKE обнаруживает директиву !include, она открывает заданный файл и считывает его содержимое, как если бы
    строки файла включения являлись бы строками самого формирующего
    файла.


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


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


    Директивы MAKE


    Утилита MAKE фирмы Borland позволяет выполнять операции, которые не допускаются в других версиях MAKE: задавать директивы,
    подобные тем, которые имеются в языках Си, ассемблере и Паскале.
    Эти директивы могут использоваться для реализации значительного
    числа полезных и мощных операций. Некоторые директивы начинаются
    в файле описания с восклицательного знака (!), который должен являться первым символом строки. Другие начинаются с точки. Ниже
    приводится полный перечень директив утилиты MAKE:


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


    Каждая из представленных ниже директив имеет соответствующий
    ей параметр командной строки, но при этом обладает приоритетом по
    сравнению с этим параметром. Например, если утилита MAKE вызывается следующей командной строкой:
    make -a
    но в формирующем файле содержится директива .noautodeрend, то автоматическая проверка зависимостей будет отменена.

    Директива Параметр
    .autodepend -a
    .ignore -i
    .noautodepend -a-
    .noignore -i-
    .nosilent -s-
    .noswap -S-
    .silent -s
    .swap -S

    Директивы .AUTODEPEND и .NOAUTODEPEND включают (задают) и
    выключают (отменяют) автоматическую проверку зависимостей. Они
    соответствуют параметру -a командной строки.
    Директивы .IGNORE и .NOIGNORE указывают утилите MAKE, что
    нужно игнорировать возвращаемое программой значение, примерно так
    же, как это делает префикс - перед командой вызова программы (он
    описан ранее). Эти директивы соответствуют параметру -l командной
    строки.
    Директивы .SILENT и .NOSILENT указывают утилите MAKE, следует ли отображать команды перед их выполнением. Они соответствуют
    параметру -s командной строки.
    Директивы .SWAP и .NOSWAP указывают утилите MAKE, нужно выгружать себя из памяти или нет. Они соответствуют параметру -S командной строки.


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


    Директивы условного выполнения (!if, !elif, !else и !endif)
    предоставляют вам определенную степень гибкости при конструировании формирующих файлов. Правила и макрокоманды можно сделать условными, поэтому, используя в командной строке макроопределения (с помощью параметра -D), можно задавать или отменять интерпретацию определенных разделов формирующих файла.
    Формат этих директив аналогичен тому, который используется в
    Си, ассемблере и Паскале:
    !if выражение
    [строки]
    .
    .
    .
    !endif
    !if выражение
    [строки]
    .
    .
    .
    !else
    [строки]
    .
    .
    .
    !endif
    !if выражение
    [строки]
    .
    .
    .
    !elif выражение
    [строки]
    .
    .
    .
    !endif
    !ifdef макрокоманда
    [строки]
    .
    .
    .
    !endif выражение
    [строки]
    !ifndef макрокоманда
    [строки]
    .
    .
    .
    !endif выражение
    [строки]
    где [строки] могут представлять собой один из следующих типов
    операторов:
  • макроопределение;

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

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

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

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

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

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

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

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

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

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

  • Любые правила, команды и директивы должны завершаться внутри
    одного исходного файла.
    Всем директивам !if внутри одного исходного файла должны соответствовать директивы !endif. Таким образом, следующее включение файла является неверным вне зависимости от того, какое содержание имеет файл, включающий данный, поскольку в нем не
    содержится парная директива !endif:
    !if $(FILE_COUNT) > 5
    какие-либо правила
    !else
    другие правила
    <конец файла>
    Еще один способ определения макрокоманды предоставляет директива !ifdef. Директива !ifdef MACRO эквивалентна !if
    $d(MACRO). Это верно также для директивы !ifndef: директива
    !ifdef MACRO эквивалентна !if $d(MACRO).


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



    Директива Описание
    .autodeрend Включает проверку автоматических зависимостей.
    !elif Условное выполнение.
    !else Условное выполнение.
    !endif Условное выполнение.
    !error Указывает, что утилита MAKE должна остановиться и
    выдать сообщение об ошибке.
    !if Условное выполнение
    .ignore Указывает, что утилита MAKE должна игнорировать
    возвращаемое командой значение
    !include Задает файл, который должен быть включен в формирующий файл.
    .noautodepend Выключает автоматическую проверку зависимостей.
    .noignore Выключает действие директивы .ignore.
    .nosilent Указывает утилите MAKE, что нужно отображать команды перед их выполнением.
    .noswaр Указывает утилите MAKE, что не нужно осуществлять
    выгрузку самой себя из памяти и подкачку в память.
    .рath.ext Задает утилите MAKE маршрут для поиска файлов
    с расширением ."EXT".
    .precious Указывает утилите MAKE, что целевой файл удалять
    не нужно, даже при неудачном выполнении команд
    построения целевого файла.
    .silent Указывает утилите MAKE, что не нужно отображать
    команды перед их выполнением.
    .swaр Указывает утилите MAKE, что нужно осуществлять
    выгрузку самой себя из памяти и подкачку в память.
    .suffixes Указывает MAKE, что при неоднозначности целевого
    файла нужно использовать неявное правило.
    !undef Задает отмену описания заданной макрокоманды.



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


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

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

  • Каждый из этих методов имеет свои преимущества и недостатки,
    которые обсуждаются ниже.
    Чтобы добавить в производном от TView классе указатель на
    интерфейсный объект, добавьте элемент к новому классу и создайте
    к конструкторе класса отображаемого элемента экземпляр объекта.
    Доступ к данным интерфейсного объекта и его функциям-элементам
    можно получить через указатель.
    Такой метод позволяет вам легко подключать и отключать различные интерфейсные объекты и использовать различные их типы.
    Например, создав указатель TWindow*, можно использовать большинство видов интерфейсных объектов.
    Недостатком является то, что обрабатываемое событие проходит
    сначала через интерфейсный объект или приложение. Это вынуждает
    вас либо использовать для добавления функций обработки событий
    производный интерфейсный объект, либо обрабатывать событие через
    объект приложения. В любом случае это уменьшает гибкость при обработке событий.
    Смешивание TView или производного от TView объекта с производным объектом дает вам возможность вывести данные из документа
    с обработкой потока передаваемых в документ и из документа данных. Это несложная, но требующая аккуратности задача.
    Чтобы создать новый производный класс, определите этот класс
    на основе базового класса отображаемого документа (TView или производного от TView класса) и выбранного интерфейсного объекта.
    Новый конструктор должен вызывать конструкторы обоих базовых
    классов. Как минимум, этот новый класс должен определять все виртуальные функции базовых классов. Там следует также определить
    специализированные функции для работы с экраном и функции обработки событий, взаимодействующие с интерфейсным элементом и объектом документа.
    Этот подход имеет то преимущество, что полученный в результате отображаемый элемент будет в высокой степени интегрированным. Обработка ошибок выполняется централизованно, что уменьшает
    необходимость делать это на уровне приложения. Управление интерфейсными элементами осуществляется не через указатель, а также
    интегрирована в новый класс отображаемого элемента. Однако данный
    метод не дает такой гибкости, как использование указателя. Вы не
    можете также обмениваться различными типами объектов с помощью
    базового указателя на различные классы интерфейсных объектов.


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


    Для модификации атрибутов декорированных окон-рамок можно
    использовать те же базовые методы, что и для модификации окон.
    Функция-элемент Insert в TDecaratedFrame дает здесь дополнительную гибкость и позволяет добавлять декорирующие элементы: строки
    состояния (TControlBar), строки состояния (TStatusBar), кнопки
    реквизитов (TButtonGadget) и другие управляющие элементы на базе
    TWindow.


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


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

    Функция Назначение
    GetViewName Возвращает статическое имя отображаемого
    элемента. В производном классе ее требуется определить.
    GetWindow Возвращает TWindow* - ссылку на интерфейс-
    ный объект отображаемого элемента или 0.
    SetDocTitle Задает заголовок окна отображаемого элемента. Его следует задать для вызова функции SetDocTitle отображаемого элемента.

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


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


    Чтобы добавить к проекту цель, сделайте следующее:
  • Выберите в основном меню Project New.

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


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

    • Выберите OK. Если типом цели является Standard, выводится
      диалоговое окно TargetExpert, в котором можно выполнить
      дальнейшее определение цели. В случае типа Source Pool
      цель добавляется к проекту и вы можете сразу добавить уз-
      лы. Об AddExpert рассказывается в другом разделе.

    • Чтобы удалить одну или более целей:
    • Выделите цель и просмотрите SpeedMenu (щелкните на цели
      правой кнопкой "мыши" или нажмите Alt+F10).

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

    • Администратор проекта запрашивает, хотите ли вы удалить
      целевой файл. Щелкните "мышью" на OK. Отменить это удаление нельзя.



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


      Экземпляры переменных позволяют легко обрабатывать множество
      управляющих элементов. При создании экземпляра переменных ClassExpert добавляет в ваш код буфер передачи. Во время выполнения в
      этом буфере собирается информация, и вы можете использовать ее
      вместо проверки кода с независимой фиксацией. Чтобы связать экземпляр переменной с управляющим элементом (добавить его), сделайте следующее:
    • Выберите управляющий элемент в области событий.

    • Щелкните правой кнопкой "мыши" на управляющем элементе и
      выберите Add Instance variable.

    • В диалоговом окне Add Instance variable наберите имя переменной. Щелкните "мышью" на OK. ClassExpert добавляет в
      исходный код приложения файл заголовка (который содержит
      описание структуры с записью экземпляра переменной). Переменная выделяется в конструкторе класса в файле .CPP (это
      связывает класс ObjectWindows с объектом ресурса).

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

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

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

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

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


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


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

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

    • Выберите в SpeedMenu Add handler. Если вы выберите добавление обработчика для окна Message, ClassExpert добавляет
      запись в таблицу реакции, имя которой определяется по
      умолчанию, после чего связанная с обработчиком функция выводится в окне редактирования. Некоторые обработчики запрашивают у вас имя функции перед добавлением в таблицу.

    • Чтобы показать, что событие обрабатывается, ClassExpert
      отмечает его в области событий.

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

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

    • Выберите Delete handler. ClassExpert удаляет только запись
      в таблице реакции, а не программный код в исходном файле.
      Код обработчика выводится в области редактирования, так
      что вы можете удалить его. Если вы удалите функцию, удалите его определение из файла заголовка.



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


      Чтобы добавить узел к проекту:
    • Выберите тот узел под которым вы хотите вывести новый
      узел.

    • Нажмите клавишу Ins или щелкните на выделенном узле правой
      кнопкой "мыши", затем выберите в SpeedMenu команду Add.

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

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

    • Чтобы добавить несколько узлов, запустите администратор файлов Windows и выделите файлы, которые нужно добавить к узлам вашего проекта (убедитесь, что вы можете просматривать в IDE окно
      проекта). Затем буксируйте файлы из администратора файлов. Администратор проекта добавляет их под выбранным узлом.
      Для удаления узла из проекта выделите его и нажмите Del либо
      выберите в SpeedMenu команду Delete node. Можно удалить сразу
      несколько узлов.


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


      ClassExpert позволяет вам добавить основанные на ObjectWindows классы и поддерживает один уровень наследования (вручную
      можно увеличить число уровней. Чтобы добавить класс, сделайте следующее:
    • Щелкните в области классов правой кнопкой "мыши". Выводится меню Speedbar.

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

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

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

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

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

    • Если базовым классом является TDialog, нужно задать или
      выбрать идентификатор шаблона диалога. Блок списка Dialog
      ID содержит идентификаторы всех диалоговых ресурсов в вашем приложении AppExpert. Если вы зададите несуществующий
      идентификатор, AppExpert создает пустое диалоговое окно с
      данными идентификатором, затем загружается Resource Workshop, так что вы можете определить диалоговое окно.

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

    • Если базовым классом является TWindow или производный от
      него класс, вы можете щелкнуть "мышью" на командной кнопке
      Set Window Properties. Выводится диалоговое окно, в котором вы можете задать характеристики окна.

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



    • Документы


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

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

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

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


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


      Поскольку наш декомпрессор написан в объектно-ориентированном
      стиле, то мы могли бы иметь более чем один подход к декомпрессии, как
      здесь. За счет того, что мы извлекли внутренние переменные и поместили их в структуру, и без остановки из имеющихся более чем одной копии
      структуры:
      char buff1[]={'a',0xff,3,'b','c'}, buff2[]={'z','y',0xff,4,'x'};
      main()
      {
      int c1, c2;
      decompressor dc1, dc2; // У нас есть ДВЕ структуры декомпрессора
      decompressor_init(&dc1, buff1, sizeof(buff1));
      decompressor_init(&dc2, buff2, sizeof(buff2));
      do {
      if ((c1 = decompressor_next(&dc1)) != -1) putchar(c1);
      if ((c2 = decompressor_next(&dc2)) != -1) putchar(c2);
      } while (c1 != -1 || c2 != -1);
      }


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


      Хотя Turbo Debugger обеспечивает прозрачное пошаговое выполнение функций DLL, вам может потребоваться доступ к DLL до того,
      как программа ее вызовет (например, в ней нужно установить точки
      останова или задать отслеживаемые выражения). Для доступа к выполняемому модулю, отличному от текущего загруженного, откройте с
      помощью команды View Modules (F3) диалоговое окно Load Module Source or DLL. Это диалоговое окно перечисляет все исходные модули,
      содержащиеся в текущем загруженном выполняемом файле. Блок списка
      DLL & Programs показывает все файлы .DLL и .EXE, загруженные Windows. (При работе с TDW в нем также выводятся все загруженные
      файлы .DRV и .FON.)
      Символом точки (.) отмечены DLL, которые могут загружаться в
      Turbo Debugger (а также DLL с отладочной информацией и исходным
      кодом). Звездочка (*) показывает, что модуль загружен отладчиком.
      Так как ваши программы могут загружать DLL с помощью вызова LoadLibrary, в блоке списка могут показываться не все DLL.
      Если вам нужен другой модуль исходного кода, подсветите нужный модуль в списке Source Module и используйте кнопку Load (или
      дважды щелкните на имени модуля "мышью"). Turbo Debugger открывает окно Module и выводит исходный код данного модуля.
      Для доступа к выполняемому файлу, отличному от текущего,
      откройте диалоговое окно Load Module Source or DLL Symbols (F3),
      подсветите в блоке списка нужный файл и выберите командную кнопку
      Symbol Load. Turbo Debugger открывает окно Module с исходным кодом первого модуля выполняемого файла.
      Чтобы добавить DLL к списку, откройте указанное диалоговое
      окно, активизируйте поле ввода DLL Name и введите имя соответствующей DLL. Чтобы добавить DLL к списку, нажмите кнопку Add DLL.
      При выполнении по шагам функции DLL отладчик автоматически
      загружает таблицу идентификаторов и исходный код этой DLL. Чтобы
      предотвратить это, откройте диалоговое окно Load Module Source or
      DLL Symbols (F3), подсветите в списке нужную DLL, выберите кнопку
      No и щелкните "мышью" на OK. Turbo Debugger будет выполнять вызовы DLL как одну команду.


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


      TDocument и TView предусматривают ряд функций для доступа к
      информации о характеристиках объекта Doc/View. Все эти функции
      описаны как виртуальные, поэтому функции в последних производных
      классах вызываются первыми и могут переопределять характеристики,
      определенные в базовых классах. Каждый класс должен реализовывать
      доступ к характеристикам.
      Обычно к характеристике обращаются по индексу. Для поиска
      соответствующего индекса используется функция FindProperty, которая по имени характеристики возвращает ее индекс. Обратное действие (поиск имени по индексу) выполняет функция PropertyName. Атрибуты характеристики устанавливает функция PropertyFlags, в параметре которой указывает индекс характеристики. Определить значение флага можно с помощью операции &.
      Для получения и модификации значений характеристик используются функции GetProperty и SetProperty.


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


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


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


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


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


      EXEMAP, TMAPSYM и BUILDSYM представляют собой три утилиты,
      которые улучшают вид информации, которую WinSpector обеспечивает
      для исключительной ситуации.


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


      Две других полезных возможности предоставляет диалоговое окно параметров трассировки сообщений Message Trace Options, одна
      из которых позволяет задать формат области трассировки сообщений,
      а другая - зарегистрировать трассируемые сообщения в файле.
    • Обычно область Message Trace интерпретирует параметры каждого сообщения и выводит их в удобном для чтения формате
      (выбирается Interpret Values). Для просмотра параметров
      сообщений в шестнадцатиричном виде выберите Hex Values.

    • Информация о трассируемых сообщениях выводится обычно в
      области трассировки сообщений Message Trace. Однако вы можете передать сообщения в файл, на принтер или дополнительный монитор. Для этого в диалоговом окне Message Trace
      Options нужно выбрать Log File и выполнить одно из следующих действий:

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

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

  • Для вывода на дополнительный монитор наберите AUX (в
    CONFIG.SYS нужно задать WINOS.SYS или OX.SYS).

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


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


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


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



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



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



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



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



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



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


    Обычно доступ к приватным элементам класса ограничивается методами этого класса. Но иногда возникает необходимость предоставить
    доступ к приватным данным класса внешним функциям. Определить такие
    внешние функции (которые могут даже находиться вне классов), которым
    будет предоставлена возможность доступа к приватным элементам класса,
    позволяет описание friend (дружественный). Иногда можно видеть, что
    переопределенная операция также описывается, как дружественная, но,
    обычно, дружественные функции используются редко. Их присутствие в
    программе обычно означает то, что иерархия классов нуждается в видоизменении.
    Рассмотрим пример. Возьмем наш класс sber_bank, с приватным элементом big_bucks и добавим в него "дружественную" функцию вычисления
    налога - irs:
    class sber_bank {
    private: // Начало раздела private
    double big_bucks; // элемент private
    public: // Начало раздела public
    void deposit(double bucks); // Элемент public
    double withdraw(double bucks); // Элемент public
    friend void irs(void); // Дружественная функция irs
    };
    Дружественную функцию irs определим следующим образом:
    void irs(void)
    {
    big_bucks -= big_bucks * 0.10; // Взять 10% от итога
    }
    Отметим, что хотя мы объявили irs() внутри класса, но она не является функцией элементом! Это достигается благодаря ключевому слову
    friend. Но даже хотя этот не функция элемент, irs() может выполнить
    указанную операцию с нашими данными, имеющими тип private.
    Если бы функция big_bucks была элементом другого класса (например, класса free_shop), то в описании friend нужно использовать операцию разрешения области действия:
    friend void free_shop::irs(void);
    Дружественным для описанного класса можно также сделать целый
    класс, для чего в описании используется ключевое слово class:
    friend class check_bucks;
    После этого любая функция элемент класса check_bucks может получить доступ к приватным элементам класса sber_bank. Заметим, что в
    С++, как и в жизни, дружественность не транзитивна: если А является
    другом для Б, а Б является другом для И, то отсюда не следует, что А
    является другом для И.
    Дружественные описания следует использовать только в том случае,
    когда это действительно необходимо, например, когда без этого пришлось бы использовать чересчур сложную иерархию классов. По своей природе дружественные описания уменьшают инкапсуляцию и модульность. В
    частности, если нужно определить целый класс, как дружественный для другого класса, то вместо этого лучше рассмотреть возможность построения обоюдно порождаемого класса, который можно использовать для
    доступа к нужным элементам.




    - F -

    Файл BUILTINS.MAK


    Вы быстро обнаружите, что существуют макрокоманды и правила
    утилиты MAKE, которые требуется использовать снова и снова. Существует три способа их обработки:
  • Во-первых, вы можете заносить их в каждый создаваемый вами
    формирующий файл для утилиты MAKE;

  • Во-вторых, вы можете занести все эти элементы в один файл
    и воспользоваться директивой !include в каждом создаваемом
    вами формирующем файле утилиты MAKE. (Другие директивы
    описываются далее в этой главе.);

  • В-третьих, вы можете занести все эти элементы в файл
    BUILTINS.MAK.

  • Каждый раз, когда вы запускаете утилиту MAKE, она ищет файл
    с именем BUILTINS.MAK. Однако, наличие файла BUILTINS.MAK не является обязательным. Если MAKE обнаруживает файл BUILTINS.MAK, то
    сначала она интерпретирует этот файл. Если утилита MAKE не может
    обнаружить файл BUILTINS.MAK, то она переходит непосредственно к
    интерпретации файла MAKEFILE (или того формирующего файла утилиты
    MAKE, который был вами задан с помощью параметра -f).
    Утилита MAKE сначала ищет файл BUILTINS.MAK в текущем каталоге. Если он отсутствует, и вы работаете под управлением DOS
    версии 3.0 или старше, то MAKE осуществляет поиск в том каталоге,
    откуда была вызвана сама утилита MAKE. Вам следует заносить файл
    BUILTINS.MAK в тот же каталог, где находится файл MAKE.EXE.
    Утилита MAKE всегда осуществляет поиск формирующего файла
    только в текущем каталоге. Этот файл содержит правила для конкретной создаваемой выполняемой программы. Как файл BUILTINS.MAK,
    так и формирующий файл подчиняются одинаковым синтаксическим правилам.
    Поиск файлов, задаваемых с помощью директивы !include, также
    осуществляется в текущем каталоге. Если вы используете параметр
    -I (файлы включения), то она будет также выполнять поиск в каталоге, заданном с помощью параметра -I.
    BUILTINS.MAK содержит стандартные правила и макрокоманды,
    которые MAKE применяет перед тем, как MAKE использует формирующий
    файл (параметр -r позволяет MAKE игнорировать BUILTINS.MAK).


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


    В данном разделе описываются файлы определения модуля и операторы, которые в них содержатся. Файл определения модуля обеспечивает для TLINK информацию о содержимом приложения Windows и
    требованиях к системе:
  • Имена прикладной программы или библиотеки динамической
    компоновки (DLL).

  • Идентификация типа прикладной программы как программы для
    Windows или OS/2.

  • Перечисление импортируемых и экспортируемых функций.

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

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

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

  • Заметим, что утилита IMPLIB может использовать файл определения модуля для создания библиотеки импорта. Утилита IMPDEF может создавать файл определения модуля для использования его с
    IMPLIB.


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


    Файлы подсказки представляют собой обычные текстовые файлы,
    содержащие параметры и/или имена файлов, которые обычно вводятся
    после имени программы TLINK в командной строке. Однако, в отличие
    от командной строки, файл подсказки может занимать несколько
    строк текста. Вы можете разбить длинный список объектных файлов
    или файлов библиотек на несколько строк, завершая одну строку
    знаком "плюс" (+) и продолжая список на следующей строке. Когда
    плюс возникает в конце строки, следуя непосредственно за одним из
    параметров TLINK, в котором + используется для включения параметра (например, /ye+), плюс не рассматривается как символ продолжения строки.
    Вы можете также начать каждый из четырех компонентов списка
    на отдельных строках: объектные файлы, выполняемый файл, файл
    карты отображения, библиотечные файлы. В этом случае вы должны
    убрать запятую, используемую для разделения компонентов.
    Чтобы проиллюстрировать эти возможности, предположим, что вы
    пользуетесь следующей командной строкой:
    tlink /c mainline wd ln tx,fin,mfin,work\lib\comm
    work\lib\suррort
    Вместо нее можно использовать файл подсказки, назвав его, например, FINRESP:
    /c mainline wd+
    ln tx,fin
    mfin
    worl\lib\comm work\lib\suррort
    Теперь команду TLINK следует вводить следующим образом:
    tlink @finresр
    Заметьте, что имени файла должен предшествовать символ (@),
    который указывает, что следующий файл является файлом подсказки.
    Альтернативный способ заключается в том, что команду компоновки можно разбить на несколько файлов подсказки. Например,
    представленную выше командную строку можно разбить на следующие
    два файла подсказки:

    Имя файла Содержимое
    LISTOBJS mainline+
    wd+
    ln tx
    LISTLIBS lib\comm+
    lib\suррort

    Теперь команду TLINK можно ввести в следующем виде:
    tlink /c @listobjs,fin,mfin,@listlibs
    Параметры командной строки переопределяют параметры, заданные в файле подсказки.


    Файл TLINK.CFG


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


    Файл WINSPCTR.LOG


    Первая строка в отчете (отчетах) WINSPCTR.LOG показывает вам
    дату и время возникновения исключительной ситуации. На второй
    строке перечисляется:
  • тип исключительной ситуации;

  • имя модуля;

  • логический адрес;

  • физический адрес;

  • текущая задача во время особой ситуации.

  • Если указатель стека во время исключительной ситуации слишком мал, TOOLHELP.DLL автоматически переключает стек. Когда это
    происходит, в конце второй строки файла регистрации выводится сообщение "Stack Switched".


    Файлы конфигурации


    При запуске Turbo Debugger использует следующие файлы конфигурации, инициализации и сеанса:
    - TDCONFIG.TD
    - TFCONFIG.TDW
    - TDCONFIG.TD2
    - TDW.INI
    - XXXX.TR
    - XXXXTRW
    - XXXX.TR2
    Файлы конфигурации TDCONFIG.TD, TDCONFIG.TDW и TDCONFIG.TD2
    создаются с помощью отладчиков TD, TDW и TD32 соответственно. Параметры, установленные в этих файлах, переопределяют параметры,
    используемые данными отладчиками по умолчанию. Вы можете модифицировать файлы конфигурации с помощью инсталляционных программ
    TDINST.EXE. TDWINST.EXE и TD32.EXE.
    TDW.INI - это файл инициализации, используемый TDW.EXE и
    TD2.EXE. Он содержит установки для используемого отладчиком видеодрайвера, расположение файла TDWINTH.DLL (динамически компонуемой библиотеки, применяемой для отладчик в Windows), и параметры удаленной отладчик для WRSETUP.EXE.
    Программа установки отладчика помещает TDW.INI в основной
    каталог Windows. В этой копии TDW.INI параметр видеодрайвера
    ([VideoDLL]) устанавливается в SVGA.DLL, а установка DebuggerDLL
    указывает маршрут к TDWINTH.DLL. Полное описание TDW.INI можно
    найти в файле TD_HELP!.TXT. Файлы с расширениями .TR, .TRW и .TR2
    содержат параметры состояния сеанса отладчиков.
    Когда вы запускаете Turbo Debugger, он ищет файлы конфигурации в следующей последовательности:
  • в текущем каталоге;

  • в каталоге, заданном в установке Turbo Directory программы
    установки Turbo Debugger;

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

  • Если Turbo Debugger находит файл конфигурации, то параметры,
    заданные в этом файле, переопределяют встроенные по умолчанию установки. Если при запуске Turbo Debugger вы указываете параметры
    командной строки, то они переопределяют соответствующие значения
    по умолчанию и значения, заданные в файле конфигурации.
    Для поддержки доступных типов видеоадаптеров и мониторов TDW
    и TD32 используют различные типы видео-DLL. При инсталляции Turbo
    Debugger запустите программу установки TDWINI.EXE, которая поможет вам выбрать или модифицировать используемые отладчиками видео-DLL. По умолчанию TDW и TD32 используют драйвер SVGA.DLL, который поддерживает большинство видеоадаптеров и мониторов. Подробнее об этом рассказывается в оперативном справочнике Help
    программы TDWINI.EXE.
    Кроме того, Turbo Debugger поддерживает в TD, TDW и в TD32
    отладку с двумя мониторами. Для этого вам потребуется цветной монитор и видеоадаптер и монохромный монитор и видеоадаптер. При
    отладке с двумя мониторами Turbo Debugger выводится на монохромном мониторе, а отлаживаемая программа - на цветном. Это позволяет видеть во время отладки вывод программы. Для загрузки TD или
    TDW в режиме с двумя мониторами используйте параметр командной
    строки -do. При работе с TD32 в Windows 32s нужно использовать
    видеобиблиотеку SVGA.DLL. В файл TDW.INI в раздел [VideoOptions]
    для этого нужно включить mono=yes. Для установки параметров видеоадаптера используйте утилиту TDWINI.EXE.


    Файлы конфигурации


    Если каждый раз в командной строке используется один и тот
    же набор параметров, то их можно перечислить в файле конфигурации. Это обычный текстовый файл, в котором параметры разделены
    пробелами. По умолчанию BCC использует файл конфигурации с именем
    TURBOC.CFG, а BCC32 - BCC32.EXE. Параметры командной строки переопределяют параметры файлов конфигурации.


    Файлы описания проектов


    Файлы описания проекта автоматизируют процесс построения
    приложений Windows при использовании IDE Borland C++. Файлы описания проектов с расширением .PRJ содержат информацию о том, как
    построить конкретное приложение. Используя такое инструментальное
    средство как администратор проектов, вы можете создавать и обслуживать файлы проектов, описывающие каждое из разрабатываемых
    приложений. Файлы описания проектов содержат список обрабатываемых файлов и параметры каждого используемого инструментального
    средства. Эта информация используется администратором проектов
    для автоматического построения приложения. Файлы описания проектов и администратор проектов - это эквиваленты формирующих файлов
    и утилиты Make, но их легче обслуживать и использовать, чем формирующие файлы. Для установки параметров проекта можно использовать диалоговое окно Project Options интегрированной среды.


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


    Файл определения модуля .DEF обеспечивает информацию о содержимом файла и требованиях к системе приложения Windows. Эта
    информацию используется компоновщиком и включает в себя размер
    динамически распределяемой памяти и стека, а также характеристики
    кода и данных. Файл .DEF перечисляет также функции, которые должны быть доступными для других модулей (экспортируемые функции), и
    используемые функции других модулей (импортируемые функции). Так
    как компоновщик Borland имеет и другие способы получения этой информации, файл .DEF для него не обязателен. Файл .DEF содержит
    несколько операторов. Перечислим некоторые из них:

    Оператор Функция

    NAME
    Задает имя программы. Если нужно построить DLL,
    используйте оператор LIBRARY. Каждый файл .DEF
    обязательно должен иметь оператор NAME или
    LIBRARY. Заданное имя должно совпадать с именем
    выполняемого файла. WINDOWAPI идентифицирует
    программу, как выполняемую программу Windows.

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

    EXETYPE
    Помечает файл, как выполняемый файл Windows (это
    необходимо для всех выполняемых файлов Windows.

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

    HEAPSIZE
    Задает размер локальной динамически распределяе-
    мой памяти приложения.

    STACKSIZE
    Задает размер стека приложения. Для создания DLL
    этот оператор использовать нельзя.

    Кроме указанных в файлах .DEF используются операции EXPORTS
    и IMPORTS. Оператор EXPORTS перечисляет функции в программе или
    DLL, которые будут вызываться другими приложениями или Windows
    (экспортируемые функции или функции обратного вызова). Экспортируемые функции идентифицируются компоновщиком и вводятся в таблицу экспорта.
    Чтобы избежать создания в файлах .DEF длинных секций
    EXPORTS, в Borland C++ предусмотрено ключевое слово _export. Отмеченные этим ключевым словом функции будут идентифицироваться
    компоновщиком и вводиться компоновщиком в таблицу экспорта.


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


    Если в командной строке задается множества файлов и параметров, поместите их в файл подсказки. Эти текстовые файлы позволяют
    задать более длинную команду, чем это допускает операционная система. Чтобы использовать файл подсказки, дайте команду:
    BCC @[маршрут]файл_подсказки.rsp
    В команде можно задать несколько файлов подсказки (через
    пробел).


    Файлы сценариев ресурсов


    Приложения Windows обычно используют ресурсы. Ресурсы - это
    пиктограммы, меню, диалоговые окна, шрифты, курсоры, битовые массивы и ресурсы, определенные пользователем. Ресурсы определяются
    в файле, который называется файлом сценария ресурса. Эти файлы
    имеют расширение .RC.
    Для использования ресурсов вам потребуется компилятор ресурсов Borland BRC (Borland Resource Compiler) или BRC32, который
    компилирует файл .RC в двоичных формат. При компиляции ресурсов
    создается файл .RES. Компоновщик TLINK или TLINK32 позволяет
    затем связать файл .RES с генерируемым им файлом .EXE. При этом
    файл .EXE отмечается также как выполняемый файл Windows.


    Файлы, входящие в состав пакета Turbo Debugger



    Имя файла Описание
    DUAL8514.DLL Видео-DLL, которые поддерживают отладку с
    двумя мониторами для мониторов 8514.
    STB.DLL Видео-DLL, поддерживающая видео-адаптеры
    STB.
    TD.EXE Отладчик для отладки приложений DOS.
    TDDEBUG.386 Этот драйвер используется TDW.EXE для доступа к специальным отладочным регистрами процессора 80386 (или старше).
    TDHELP.TDH Справочных файл для TD.EXE.
    TDKBDW16.DLL Файл поддержки для Windows 32s.
    TDKBDW32.DLL Файл поддержки для Windows 32s.
    TDREMOTE.EXE Драйвер, используемый в удаленной системе
    для поддержки удаленной отладки в DOS.
    TD32.ICO Пиктограмма, используемая для TD32.EXE.
    TD32HELP.TDH Справочный файл для TD32.EXE.
    TDVIDW16.DLL Файл поддержки для Windows 32s.
    TDVIDW32.DLL Файл поддержки для Windows 32s.
    TDW.EXE Выполняемая программа для отладки 16-разрядных программ Windows.
    TDW.INI Файл инициализации, используемый TDW.EXE и
    TD32.EXE. Он создается программой инсталляции и помещается в основной каталог Windows.
    TDWGUI.DLL Видео-DLL, используемая для вывода окна отладчика TDW в Windows 3.х или TD32 в Windows 32s.
    TDWHELP.TDH Справочный файл для TDW.EXE.
    TDWINTH.DLL Поддерживающая DLL для TDW.EXE.
    WREMOTE.EXE Драйвер для удаленной отладки в Windows.
    TDINST.EXE Создает и модифицирует файл конфигурации
    TDCONFIG.TD.
    TDMEM.EXE Выводит на экран доступную память компьютера, включая дополнительную и расширенную.
    TDRF.EXE Утилита передачи файлов, используемая для
    передачи файлов в удаленную систему.
    TD32INST.EXE Создает и модифицирует файл конфигурации
    TD32 - TDCONFIG.TD32.
    TDSTRIP.EXE Удаляет из файлов .EXE и .DLL используемую
    отладчиком отладочную информацию (таблицу
    идентификаторов) без перекомпоновки файлов.
    TDSTRP32.EXE Удаляет из файлов .EXE и .DLL используемую
    отладчиком отладочную информацию (таблицу идентификаторов) без перекомпоновки файлов.
    TDUMP.EXE Выводит на экран структуру 16- или 32-раз-
    рядных файлов .EXE, .DLL и .OBJ, а также
    содержимое отладочную информацию об идентификаторах.
    TDWINI.EXE Позволяет изменить и настроить параметры
    видеодрайвера отладчика.
    TDWINI.HLP Справочный файл для TDWINI.EXE.
    TDWINST.EXE Создает и модифицирует файл конфигурации
    TDCONFIG.EXE. Настраивает для TDW параметры
    вывода и цвета экрана.
    WRSETUP.EXE Файл конфигурации для утилиты WREMOTE -
    драйвера удаленной отладки.
    TD_ASM.TXT Файл с информацией по отладке программ
    на Turbo Assembler, которая полезна также
    при отладке программ со встроенным ассебмлером.
    TD_HELP!.TXT Файл с ответами на общие вопросы. Среди
    прочего в нем обсуждаются синтаксические
    отличия между анализом выражений в Turbo
    Debugger и компиляторах, отладка программ на нескольких языках др.
    TD_HDWMP.TXT Файл с информации о настройке конфигурации
    отладчика для использования аппаратных отладочных регистров.
    TD_RDME.TXT Содержит последнюю информацию, отсутствую-
    щую в руководстве.
    TD_UTILS.TXT Описывает утилиты отладчика, работающие в
    режиме командной строки: TDSTRIP, TDUMP,
    TDWINST, TD32INST, TDSTRP32, TDMEM, TDMAP и
    TDUMP32.
    MAKEFILE Формирующий файл, используемый в примерах
    программ.
    TDWDEMO.BUG Исходный код примера программы с ошибками
    (для отладки).
    TDWDEMO.H Файл заголовка, используемых примером прог-
    раммы.
    TDWDEMO.ICO Пиктограмма примера программы.
    TDWDEMO.IDE Файл проекта для примера программы.
    TDWDEMO.RC Файл ресурса для примера программы.
    S_PAINT.C Исходный код примера программы.
    S_PAINT.EXE Пример программы.



    Файлы-заголовки ObjectWindows


    Файлы-заголовки находятся в подкаталоге OWL\INCLUDE и содержат описания функций классов и определений типов данных и констант.

    Имя файла Определение класса Использование
    applicat.h TApplication Управляет базовым повелением всех приложений ObjectWindows.
    bitmapga.h TBitMapGadget Выводит на экран массив растровых изображений.
    bitset.h TBitSet Устанавливает или сбрасывает один или более бит.
    TCharSet Устанавливает или сбрасывает байты.
    button.h TButton Создает различные виды
    управляющих элементов типа командных кнопок.
    buttonga.h TButtonGadget Создает реквизиты командных кнопок, которые можно выключать и включать щелчком "мыши".
    cearray.h TCelArrayСоздает массив ячеек.
    checkbox.h TCheckBoxПредставляет управляющий
    элемент типа кнопки с независимой фиксацией.
    chooseco.h TChooseColor Представляет режимное диалоговое окно с возможностью выбора цвета.
    choosefo.h TChooseFont Представляет режимное диалоговое окно с возможностью выбора шрифта.
    clipboar.h TClipboard Содержит функции, управляющие обработкой данных в буфере вырезанного изображения.
    clipview.h TClipboardViewer Регистрирует TClipboardViewer как средство просмотра TClipboard.
    color.h TColor Содержит функцию, используемую для упрощения
    стандартной операции с цветом Windows.
    combobox.h TComboboxСоздает в окне комбинированный блок или управляющий элемент комбинированного блока и класс TComboBoxData, который используется для передачи данных между управляющими элементами.
    commdial.h TCommonDial Абстрактный базовый класс для объектов TCommonDialog.
    compat.h Определяет служебные функции и константы ObjectWindows.
    control.h Tcontrol Используется для создания в производных классов управляющих объектов.
    controlb.h TControlBar Реализует полосу инструментальных средств, обеспечивающую мнемонический доступ к командным кнопкам.
    contolg.h TControlGadget Позволяет помещать управляющие элементы в окно реквизитов.
    dc.h TBandInfo, TClientDC,
    TDC, TDesktopDC, TIC,
    TDibDC, TPrintDC,
    TScreenDC, TWindowDC
    Включающие классы GDI DC, создающие объекты DC.
    decframe.h TDecoratedFrame Создает клиентное окно, куда можно поместить "декорации".
    decmdifr.h TDecoratedMDIFrame Создает объект рамки, поддерживающий "декорированные" дочерние окна.
    dialog.h TDialog Создает режимное и безрежимное диалоговое окно с интерфейсными элементами.
    TDialogAttr Содержит атрибуты диалогового окна.
    dispatch.h Определяет функции диспетчеризации, созданные для обработки сообщений Windows.
    docmanag.h TDocManager Создает объект администратора документов, который работает с документами и шаблонами.
    TDocTemplate Создает шаблоны.
    docview.h TDocument, TView,
    TStream, TInStream,
    TWindowView, TOutStream
    Создает, уничтожает и посылает сообщения о просмотре документов.
    edit.h TEdit Создает управляющий интерфейсный элемент редактирования.
    editfile.h TEditFileСоздает окно редактирования файла.
    editsear.h TEditSearch Создает управляющий элемент редактирования, отвечающий за команды поиска и замены.
    editview.h TEditViewОболочка просмотра для TEdit.
    except.h TXOwl Базовый класс обработки исключительных ситуаций.
    TXOutOfMemory Описывает исключительную
    ситуацию нехватки памяти.
    TXCompatibility Описывает исключительную
    ситуацию состояния.
    TStatus Используется для обратной
    совместимости.
    filedoc.h TFileDocument Открывает и закрывает область просмотра документа.
    findrepl.h TFindDialog,
    TFindReplaceDialog
    Эти классы создают и определяют атрибуты безрежимных диалоговых окон, отвечающих на команды поиска и замены.
    floatfra.h TFloatingFrame Реализует в родительском
    окне свободную рамку.
    framewin TFrameWindow Управляет специфическим для окна поведением, таким как перемещение с помощью клавиатуры и обработка команд.
    TMenuDesc Описывает строку меню.
    gadget.h TGadget Создает объект реквизита, принадлежащий окну реквизитов и имеющий заданные атрибуты.
    gedgetwi.h TGadgetWindow Обслуживает для окна список неперекрывающихся реквизитов.
    gdibase.h TGdiBase Абстрактный базовый класс
    для классов GDI.
    gdiobjec.h TGdiObject Базовый класс GDI.
    TPen, TBrush, TFont,
    TBitMap, TPalette, TIcon,
    TCusor, TDib, TRegion.
    Эти классы специфицируют объекты GDI.
    groupbox.h TGroupBoxСоздает групповой объект,
    представляющий элемент группового блока в Windows.
    inputdia.h TInputDialog Общее диалоговое окно.
    keymodet.h TKeybardModeTracker Смешанный класс, созданный для отслеживания изменений режимов клавиатуры.
    layoutco.h TLayoutConstraint Создает ограничения разметки.
    layoutwi.h TLayoutMetrics Создает ограничения разметки, используемые для характеристик разметки в окне.
    listbox.h TListBox Создает объект блока списка.
    TListBoxData Используется для передачи контекста блока списка.
    listview.h TListView Обеспечивает просмотр блоков списка.
    mdi.h TMDIClient Управляет дочерними окнами MDI.
    TMDIFrame Основное окно MDI-приложения.
    mdichild.h TMDIChild Определяет поведение дочернего окна MDI.
    menu.h TMenu, TPopupMenu, TSystemMenu Создает объекты меню.
    messageb.h TMessageBar Реализует строку сообщения.
    metafile.h TMetaFileBar Класс-оболочка для TMetaFileDC.
    module.h TModule Определяет базовое поведение для библиотек и приложений ObjectWindows.
    opensave.h TOpenSave Базовый класс для режимных диалоговых окон открытия и сохранения.
    owlall.h Включаемый файл для всех классов ObjectWindows.
    owlcore.h Включаемый файл для классов ядра ObjectWindows.
    owldefs.h Определения макрокоманд, используемых в программах ObjectWindows.
    owlpch.h Определения макрокоманд, данных и функций, используемых в программах ObjectWindows.
    point TPoint, TSize, TRect Математические классы.
    TDropinfo Поддерживает операции буксировки имени файла.
    TProcInstance Класс поддержки Win16.
    TPointer Обеспечивает надежную работу с указателями.
    preview.h TPreviewPage Выводит страницу документа в окне предварительного просмотра.
    printdia.h TPrintDialog Выводит диалог печати или режимное окно печати.
    printer.h TPrinter Представляет устройство печати.
    TPrintout Представляет печатаемый документ.
    TPrinterAbortDlg Представляет диалоговое окно прерывания печати.
    radiobut.h TRadioButton Создает управляющий элемент типа кнопки с зависимой фиксацией.
    scrollba.h TScrollBar Представляет управляющий элемент типа вертикальной или горизонтальной полосы прокрутки.
    TScrollBarData Содержит значения позиции указателя полосы прокрутки.
    scroller.h TScroller Реализует автоматическую прокрутку окна.
    signatur.h Определяет шаблоны сигнатуры обработки сообщений, используемых функциями обработки событий ObjectWindows.
    slider.h TSlider Определяет базовое поведение скользящих маркеров.
    THSlider Горизонтальный скользящий маркер.
    TVSlider Вертикальный скользящий маркер.
    static.h TStatic Создает в окне статический управляющий элемент.
    statusba.h TStatusBar Строит строку состояния.
    textgadg.h TTextGadget Строит дополнительный текстовый объект.
    tinycarp.h TTinyCaption Создает для окна меньшую строку заголовка.
    toolbox.h TToolBox Создает инструментальный объект с заданным числом строк и столбцов.
    validate.h TValidator Базовый класс проверки допустимости.
    TPictureValidator Средство проверки допустимости картинки.
    TFilterValidator Средство проверки допустимости фильтра.
    TRangeValidator Средство проверки допустимости диапазона.
    TLookupValidator Средство проверки допустимости преобразования.
    TStringLookupValidator Средство проверки допустимости строки.
    vbxctl.h TVbxControl Интерфейс для управляющих элементов VBX.
    TVbxEventHandler Обрабатывает события от управляющих элементов VBX.
    version.h Определяет внутренний номер версии библиотеки ObjectWindows.
    window.h TWindow Обеспечивает специфическое для окна поведение и инкапсулирует многие функции API.
    windowev.h Определяет обработчики событий и таблицы макрокоманд реакции на сообщения Windows.



    Фатальные ошибки


    Фатальные ошибки генерируются компилятором, компоновщиком и утилитой MAKE и приводят с немедленному прекращению процесса компиляции. Если такую ошибку генерирует компилятор или утилита MAKE, то файл .EXE не создается. Если фатальная ошибка генерируется компоновщиком, то файл .EXE может создаваться.
    Фатальные ошибки встречаются редко. Некоторые из них указывают на внутреннюю ошибку компилятора. Вы должны выполнить соответствующие действия, а затем


    Флаги формата



    Флаг Описание
    skipws Пропускает при вводе пробелы и разделители.
    left Выравнивание вывода влево.
    right Выравнивание вывода влево.
    internal Дополнение после знака или указателя основания.
    dec Десятичное преобразование.
    oct Восьмеричное преобразование.
    hex Шестнадцатиричное преобразование.
    showbase Показывает в выводе индикатор основания.
    showpoint Показывает при выводе с плавающей точкой десятичную точку.
    uppercase Преобразует шестнадцатиричный вывод в верхний
    регистр.
    showpos Выводит с положительными числами символ '+'.
    scientific Добавляет к числам с плавающей точкой суффикс
    с показателем степени (E).
    fixed Для вывода чисел с плавающей точкой использует десятичную фиксированную точку.
    unitbuf После включения выводит все потоки.
    stdio После включения выводит stdout и stderr.



    Формат вывода:


    Описатель {Класс} Модуль Позиция "Заголовок"
    Линии слева показывают структуру дерева. С помощью этих линий каждое окно соединяется с его предком, "братскими" окнами и
    потомками. Линии рисуются таким же образом, как в администраторе
    файлов. Ромб после каждого окна показывает, имеет ли окно дочерние окна. Если он пустой, то дочерних окон нет. Если он содержит
    символ +, то дочерние окна имеются, но они не показаны. Если он
    содержит символ -, то имеются дочерние окна, и они выведены в
    древовидной схеме (видим по крайней мере один уровень дочерних
    окон, другие уровни могут быть скрыты).
    "Описатель" - это описатель окна, возвращаемый CreateWindow.
    "Класс" - это имя класса окна, описанного в области списка
    классов.
    "Модуль" - это имя выполняемого модуля (.EXE или .DLL), который создал окно. Строго говоря, это имя модуля, являющегося
    владельцем сегмента данных, переданного как параметр hInstance
    функции CreateWindow.
    "Позиция" может либо не указываться, если окно скрыто, либо
    это (x_Begin,y_Begin)-(x_End,y_End), если окно является видимым.
    Для окон верхнего уровня это координаты экрана. Для порожденных
    окон это координаты в области пользователя родительского окна,
    которое используется в CreateWindow для создания порожденного окна.
    "Заголовок" - это заголовок окна или текст, возвращаемый
    функцией GetWindowText или сообщением WM_GETTEXT. Если заголовок
    - это нулевая строка, то кавычки опускаются.


    Формат вывода:


    Описатель ["Заголовок" {Класс}] Сообщение Статус
    "Описатель" - это описатель окна, получающего сообщение.
    "Заголовок" - это заголовок окна. Если заголовок - это нулевая строка, то вместо него выводится имя класса (в фигурных скобках).
    "Сообщение" - это имя сообщения, определенное в файле WINDOWS.H. Существуют также неописанные сообщения Windows, показанные символами в нижнем регистре. Номера неизвестных сообщений
    (определенных пользователем) показываются как WM_USER+OxXXXX, если они больше или равны WM_USER, или WM_OxXXXX, если они меньше
    WM_USER. Номера зарегистрированных сообщений (из RegisterWindowsMessage) показываются вместе с их зарегистрированными именами в
    одиночных кавычках.
    "Статус" представляет собой следующее:
  • Значение Dispatched показывает, что сообщение получено через DispatchMessage.

  • Значение Sent [from XXXX] показывает, что сообщение применяется через SendMessage. Если оно посылалось через другое
    окно, то from XXXX показывает описатель окна. Если оно посылалось из того же окна, что и принимает сообщение, то
    указывается fromself. Если сообщение поступает от Windows,
    то часть from... опускается.

  • Return показывает, что сообщение было принято через
    SendMessage и теперь возвращается.

  • Дополнительная информация, относящаяся к каждому сообщению. В случае возвращаемого сообщения здесь показывается
    это значение (в числовой форме или с более конкретной информацией по сообщению, например, wm_GETTEXT. Для посылаемых и диспетчеризуемых сообщений здесь показывается параметры сообщения. WinSight интерпретирует параметры таким
    образом, чтобы получилась читаемая форма. Для сообщений,
    имеющих связанные с ними структуры данных (например,
    WM_CREATE) она перехватывает эти структуры и включает их в
    вывод.



  • Формат вывода:


    Класс (Модуль) Функции Стили
    Ромбы после классов при получении окном любого сообщения
    становятся черными. Это позволяет видеть, какие окна получают в
    данный момент сообщения. Если дочерние окна данного окна в дереве
    убраны, то будет инвертироваться ромб данного окна, что указывает
    на активность дочерних окон.
    "Класс" - это имя класса. Некоторые предопределенные классы
    Windows имеют числовые номера. Например, в качестве имени класса
    всплывающего меню используется число 32768. Для таких классов показывается как номер, так и имя, например, #32768:PopupMenu. Однако фактическое имя класса состоит только из числа. В формате MAKEINTRESOURCE используется также идентификатор ресурса.
    "Модуль" - это имя выполняемого модуля (.EXE или .DLL), который зарегистрировал класс.
    "Функция" - это адрес функции класса окна.
    "Стили" представляют собой стили cs_ класса. Их имена совпадают с определениями cs_ в файле windows.h, но cs_ удаляется, и
    имя указывается с различным регистром символов.


    Форматирование ввода-вывода


    Форматирование ввода и вывода определяется различными флагами состояний формата, перечисленными в классе ios. Эти состояния
    определяются битами числа типа long int следующим образом:
    public:
    enum {
    skipws = 0x0001, // пропуск пробельного символа на
    // вводе
    left = 0x0002, // вывод с левым выравниванием
    right = 0x0004, // вывод с правым выравниванием
    internal = 0x0008, // заполнитель после знака или
    // указателя системы счисления
    dec = 0x0010, // десятичное преобразование
    oct = 0x0020, // восьмиричное преобразование
    hex = 0x0040, // шестнадцатиричное преобразование
    showbase = 0x0080, // показать на выходе указатель
    // системы счисления
    showpoint = 0x0100, // показать позицию десятичной точки
    // (на выходе)
    uppercase = 0x0200, // вывод шестнадцатиричных значений
    // буквами верхнего регистра
    showpos = 0x0400, // показать знак "+" для
    // положительных чисел
    scientific = 0x0800, // использовать запись чисел с плава-
    // ющей точкой с выводом экспоненты Е
    // например, 12345E2
    fixed = 0x1000, // использовать запись чисел с плава-
    // ющей точкой типа 123.45
    unitbuf = 0x2000, // сброс на диск всех потоков
    // после вставки
    stdio = 0x4000, // сброс на диск stdout и stderr после
    // вставки
    };
    Эти флаги читаются и устанавливаются функциями-элементами
    flags, setf и unsetf.


    Функции библиотеки graphics


    Графические функции Borland C++ делятся на несколько категорий:
  • функции управления графической системой;

  • функции черчения и заполнения;

  • функции манипулирования экранами и графическими окнами;

  • функции вывода текстов;

  • функции управления цветами;

  • функции обработки ошибок;

  • функции запроса состояния.



  • Функции доступа к данным


    TDocument предусматривает ряд функций для доступа к данным.
    Вы можете обращаться к данным в простом последовательном потоке
    или тем способом, который зададите в производных классах.
    TDocument предусматривает две функции InStream и OutStream,
    которые возвращают указатель на TInStream и TOutStream. Базовые
    версии этих функций не выполняют никаких действий и возвращают 0.
    В производном классе их нужно переопределить, чтобы они возвращали указатель на объект. Таким образом вы можете обеспечить в
    классе документа доступ к потокам.
    TInStream и TOutStream - это абстрактные базовые классы,
    производные от isteam и ostream класса TStream. TStream обеспечивает минимальные функции для связи потока с документом, а isteam
    и ostream - это стандартные потоки С++. Из TInStream и TOutStream
    нужно создать производные потоковые классы, специфические для
    приложения. Эти классы имеют функции для работы с потоками.
    Каждый документ поддерживает список открытых потоков, который обновляет при добавлении или удалении потоков. В начале этого
    списка находится элемент данных StreamList класса TDocument, который указывает первый поток в списке или содержит 0. Каждый объект TStream в списке имеет функцию-элемент NextStream, которая
    указывает на следующий поток в списке.
    Потоки могут обеспечивать только простой последовательный
    доступ к данным. Если документы содержат файлы мультимедиа, таблицы баз данных или другие сложные данных, то вам потребуются более развитые методы доступа. Для этой цели в TDocument имеется
    еще две функции доступа - Open и Close, которые вы можете переопределить и задать нужное поведение при открытии и закрытии. На
    определение открытия документа никаких ограничений не накладывается. Вы можете задать настолько простое или сложное открытие,
    насколько это требуется.
    Close обеспечивает несколько больше функциональных возможностей. Эта функция проверяет существующие дочерние объекты документа и перед закрытием документа пытается закрыть их все. Данная
    функция позволяет закрыть документ, когда это требуется.
    TDocument имеет также ряд функций, позволяющих вам защитить
    данные. IsDirty проверяет, был ли документ модифицирован. IsOpen
    проверяет состояние документа (открыт он или нет) или наличие потоков в списке. Commit сохраняет изменения данных в памяти. Revert выполняет действие, обратное Commit.


    Функции элементы (методы)


    Как вы уже видели раньше, классы С++ могут содержать в качестве
    своих элементов не только данные, но и функции элементы. Функция эле
    мент - это функция, объявленная внутри определения класса и тесно
    связанная с типом этого класса. В нашем примере - это операции которые выполняются в сберегательных банках. Наш объект sber_bank имеет
    функции элементы deposite (вкладывать) и withdraw (снимать) деньги.
    sber_bank
    Объект сбербанк
    < deposit << Вклад денег
    $$$ < >
    <
    Данные > withdraw >> Снятие денег
    Функции элементы
    Наглядное представление функции элемента withdraw() приводится
    ниже:
    Селектор
    Определяемый класс Имя функции элемента
    Возвращаемый тип Аргумент
    v v v v v
    double sber_bank::withdraw(double bucks)
    {
    big_bucks -= bucks;
    if (big_bucks < 0.0) {
    printf("К сожалению, товарищ, у вас нет таких денег!\n");
    big_bucks -= 10.0; // Штрафная санкция
    }
    return big_bucks;
    }
    Обратите особое внимание на использование операции селектор области действия '::' между определяемым классом и функцией элементом.
    Имя класса sber_bank используется для указания компилятору, к какому
    классу принадлежит withdraw (так как могут иметься и другие варианты
    withdraw, принадлежащие другим классам). При внутреннем определении
    селектор '::' не потребуется, так как и так ясно, что withdraw принадлежит классу sber_bank.
    По аналогии, при обращении функций к элементам своего объекта,
    селектор '.' лишний:
    double sber_bank::withdraw(double bucks)
    {
    Обращение к данным своего объекта
    v (не указывается принадлежность
    big_bucks -= bucks; объекту - sber_bank.)
    if (big_bucks < 0.0) {
    printf("К сожалению, товарищ, у вас нет таких денег!\n");
    big_bucks -= 10.0; // Штраф за перерасход
    }
    return big_bucks;
    }


    Функции в DLL


    Утилита IMPDEF создает редактируемый исходный файл, который
    перечисляет все экспортные функции в DLL. Вы можете отредактировать этот файл .DEF так, чтобы он содержал только те функции, которые вы хотите сделать доступными для нужной прикладной программы, а затем выполнить IMPLIB для отредактированного файла .DEF. В
    результате получается библиотека импорта, которая содержит информацию импорта для заданного подмножества экспортируемых функций
    DLL.
    Например, пусть вы определяете DLL, которая предоставляет
    функции для использования различными прикладными программами.
    Каждая экспортируемая функция в DLL определяется с помощью оператора _exрort. Теперь, если все прикладные программы используют
    все экспортируемые функции DLL, вы можете просто использовать
    IMPLIB для создания одной библиотеки импорта для DLL и поставлять
    эту библиотеку импорта с DLL. Библиотека импорта может быть скомпонована с любыми прикладными программами, исключая таким образом
    необходимость перечисления для каждой прикладной программы каждой
    используемой ей функции DLL в секции IMPORT файла определения модуля.
    Теперь, пусть нужно передать некоторую часть экспортируемых
    функций DLL отдельной прикладной программе. В идеале требуется
    скомпоновать специальную библиотеку импорта с этой прикладной
    программой - библиотеку импорта, которая предоставляет только
    подмножество функций, которые будут использоваться прикладной
    программой. Все другие экспортируемые функции в DLL для клиентной
    прикладной программы должны быть скрыты.
    Для создания библиотеки импорта, которая удовлетворяет этим
    условиям, выполните IMPDEF для откомпилированной и скомпонованной
    DLL. Утилита IMPDEF создаст файл определения модуля, который содержит в секции EXPORT перечисление всех экспортируемых функций
    DLL. Вы можете редактировать этот файл определения модуля, удаляя
    компоненты секции EXPORTS для тех функций, которые вы не хотите
    включать в библиотеку импорта. После того, как вы удалите ненужные экспортируемые функции, выполните утилиту IMPLIB для файла
    определения модуля. Результатом будет библиотека импорта, которая
    содержит информацию импорта только для экспортных функций, перечисленных в секции EXPORTS файла определения модуля.
  • Утилита TLIB: турбо библиотекарь

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

  • Командная строка утилиты TLIB

  • Использование файлов подсказки

  • Создание расширенного словаря: параметр /E

  • Задание размера страницы: параметр /P

  • Различимость регистра символов в идентификаторе: параметр /C

  • Удаление записей-комментариев: параметр /O

  • Список операций

  • Примеры



  • Функции запроса состояния графического режима



    Функция Возвращаемое значение
    getarccoords Возвращает информацию о координатах, заданных
    в последнем вызове arc или ellipse.
    getaspectratio Возвращает коэффициент сжатия для графического экрана.
    getbkcolor Возвращает текущий цвет фона.
    getcolor Возвращает текущий цвет вычерчивания.
    getdrivername Возвращает имя текущего графического драйвера.
    getfillpattern Возвращает шаблон заполнения, определяемый пользователем.
    getfillsettings Возвращает информацию о текущем шаблоне и
    цвете заполнения.
    getgraphmode Возвращает текущий графический режим.
    getlinesettings Возвращает текущие стиль, шаблон и толщину
    линии.
    getmaxcolor Возвращает максимально допустимое на текущий момент значение элемента изображения.
    getmaxmode Возвращает максимально допустимый номер режима для текущего драйвера.
    getmaxx Возвращает текущее разрешение по оси x.
    getmaxy Возвращает текущее разрешение по оси y.
    getmodename Возвращает имя данного режима драйвера.
    getmoderange Возвращает диапазон режимов для данного
    драйвера.
    getpalette Возвращает текущую палитру и ее размер.
    getpixel Возвращает цвет элемента изображения в (x,y).
    gettextsettings Возвращает текущий шрифт, направление, размер
    и способ выравнивания текста.
    getviewsettings Возвращает информацию о текущем графическом
    окне.
    getx Возвращает координату x текущей позиции (CP).
    gety Возвращает координату y текущей позиции (CP).

    В каждой из категорий графических функций Borland C++ имеется хотя бы одна функция запроса состояния. Эти функции упоминались при рассмотрении соответствующих категорий и также рассматриваются здесь отдельно. Каждая из графических функций запроса
    состояния Borland C++ имеет имя вида "get что-то" (за исключением
    категории функций обработки ошибок). Некоторые из них не воспринимают никаких аргументов и возвращают единственное значение,
    представляющее собой искомую информацию. Прочие считывают указатель структуры, определяемой в файле graphics.h, заполняют эту
    структуру соответствующей информацией и не возвращают никаких



    значений.

    Функциями запроса состояния категории управления графической

    системы являются getgraphmode, getmaxmode и getmoderange. Первая

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

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

    этого драйвера, а третья возвращает диапазон режимов, поддерживаемых данным графическим драйвером. getmaxx и getmaxy возвращают

    соответственно максимальные экранные координаты x и y для текущего графического режима.

    Функциями запроса состояния категории вычерчивания и заполнения являются функции getarccoords, getaspectratio, getfillpattern и getlinesettings. Функция getarccoords заполняет структуру, содержащую координаты, которые использовались при последнем вызове функций arc или ellipse. Функция getaspectratio сообщает текущий коэффициент сжатия, используемый графической системой для того, чтобы окружности выглядели круглыми. Функция getfillpattern

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

    Функция getfillsettings заполняет некоторую структуру текущим

    шаблоном и цветом заполнения. Функция getlinesettings заполняет

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

    Функциями запроса состояния категории манипулирования графическим окном являются getviewsettings, getx, gety и getpixel.

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

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

    информацией некоторую структуру. Функции getx и gety возвращают

    (относительно графического окна) x- и y-координаты текущей позиции (CP). Функция getpixel возвращает цвет указанного элемента изображения.

    Функция запроса состояния категории вывода текста в графическом режиме имеется только одна, и притом всеобъемлющая, - gettextsettings. Эта функция заполняет структуру информацией о текущем символьном шрифте, направлении вывода текста (по горизонтали

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

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

    Функциями запроса состоянии категории управления цветом Borland С++ являются функция getbkcolor, возвращающая текущий цвет

    фона, функция getcolor, возвращающая текущий цвет вычерчивания и

    функция getpalette, заполняющая структуру, которая включает в себя размер текущей палитры и ее содержимое. Функция getmaxcolor

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

    для текущего графического драйвера и режима (размер палитры -1).

    И наконец, функции getmodename и getdrivername возвращают

    имя заданного режима драйвера и имя текущего графического драйвера, соответственно.


    Функции запроса состояния


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


    Функция Error


    Виртуальная функция-элемент Error предупреждает пользователя, что содержимое редактируемого управляющего элемента не проходит проверки допустимости. Стандартные объекты проверки допустимости представляют простое диалоговое окно, уведомляющее пользователя, что содержимое ввода является недопустимым, и указывает,
    какой должна быть вводимая информация.
    Хотя большинство производных объектов переопределяют Error,
    ее не следует вызывать непосредственно. Valid вызывает Error, если IsValid возвращает False.


    Функция IsValid


    Виртуальная функция-элемент IsValid вызывается функцией Valid, которая передает IsValid проверяемую строку текста. IsValid
    возвращает True, если строка представляет допустимые данные. IsValid выполняет фактическую проверку допустимости, так что при
    создании собственных объектов проверки допустимости вам потребуется переопределить эту функцию. Обратите внимание, что IsValid
    не вызывается непосредственно. Это делается через Valid, которая
    вызывает Error, если IsValid возвращает False. Это позволяет отделить проверку допустимости от сообщения об ошибке.


    Функция IsValidInput


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


    Функция main.


    Аргументы функции main (argc, argv и env) всегда передаются
    функции main подпрограммой инициализаци и Borland С++.
  • argc (тип integer) - число аргументов командной строки.

  • argv - массив указателей на строки (char *[]). В версиях
    DOS 3.x argv[0] - полное (т.е. включая маршрут доступа)
    имя запускаемой программы. argv[x] - параметр, набранный
    в командной строке после функции (порядковый номер - x).

  • env - также массив указателей на строки. Каждый элемент
    env[] содержит строку вида ENVVAR = value. Аргумент env
    доступен также через глобальную переменную environ. argc и
    argv также доступны через глобальные переменные _argc и
    _argv.

  • Для использования соглашения о связях Паскаля можно использовать ключевое слово cdecl. Например:
    cdecl main(int argc, char *argv[], char *envp[])


    Функция set_new_handler (new.h)


    Устанавливает функцию, вызываемую, когда operator new() или
    operator new[] не могут выделить запрошенную память. По умолчанию
    операции new генерируют в этом случае исключительные ситуации
    xalloc. Это поведение можно переопределить вызовом для установки
    нового обработчика set_new_handler. Для возврата к обычной версии
    используйте set_new_handler(0).
    Заданный пользователем обработчик должен выполнять возврат
    после освобождения памяти, генерировать исключительную ситуацию
    xalloc и вызывать функции abort или exit.


    Функция set_termionate (except.h)


    Позволяет вам установить функцию, определяющую поведение
    программы при ее завершении, когда не найден обработчик исключительной ситуации. Заданная функция описывается как функция типа
    terminate_function. Такая функция не имеет аргументов и возвращает void.
    По умолчанию указанная исключительная ситуация возникает при
    вызове в программе функции terminate. Обычно это приводит к вызову abort. Затем программа завершается с сообщением "Abnormal
    program termination". Если вы хотите вызывать в terminate другую
    функцию, то можете ее определить. Такая функция называется функцией завершения и позволяет вам выполнять действия, не реализованные в abort. Функция завершения не должна возвращаться в terminate.


    Функция set_unexpected (except.h)


    Позволяет установить функцию, определяющую поведение программы при возникновении исключительной ситуации, не описанной в
    списке спецификаций. Действия описываемой функции зависят от типа
    функции. Функция типа unexpected_function - это функция без аргументов, возвращающая void.
    По умолчанию непредвиденные исключительные ситуации приводят
    к вызову unexpected. Если определена unexpected_func, то unexpected вызывает далее unexpected_func, куда и передается управление
    программой. В противном случае вызывается terminate. По определению unexpected_func не возвращает управление в unexpected.


    Функция terminate (except.h)


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


    Функция unexpected (except.h)


    Вызывается, когда функция генерирует исключительную ситуацию, не перечисленную в списке спецификаций. Программа вызывает
    unexpected, которая по умолчанию вызывает определенную пользователем функцию, зарегистрированную с помощью set_unexpected. Если
    такой зарегистрированной функции нет, то вызывается terminate.
    Функция unexpected не возвращает управления, однако может генерировать исключительную ситуацию.


    Функция Valid


    Функция-элемент Valid вызывается соответствующим объектом
    редактируемого управляющего элемента для проверки допустимости
    вводимых данных. Аналогично функции CanClose для интерфейсных
    объектов Valid возвращает True только если переданная ей строка
    содержит допустимые данные.
    При использовании объектов проверки допустимости с редактируемыми управляющими элементами переопределять или вызывать функцию Valid объекта проверки допустимости вам не нужно. Здесь достаточно наследуемой версии Valid. По умолчанию Valid возвращает
    True, если возвращает True функция-элемент IsValid. В противном
    случае она вызывает функцию Error для уведомления пользователя об
    ошибке и возвращает False.


    Функция WinMain


    В качестве основной точки входа приложения Windows вы должны
    предусмотреть функцию WinMain. Некоторые приложения (например,
    ObjectWindows) инкапсулируют эту точку входа. В WinMain передаются следующие параметры:
    WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
    Параметр hInstance - это описатель экземпляра приложения.
    Каждый экземпляр приложения Windows имеет уникальный описатель
    экземпляра, используемый в качестве аргумента в нескольких функциях Windows. Он может также использоваться, чтобы различать несколько экземпляров данного приложения.
    Параметр hPrevInstance - это описатель предыдущего экземпляра данного приложения. hPrevInstance равно NULL, если это первый
    экземпляр (в Win32 это значение всегда равно 0).
    lpCmdLine представляет собой указатель (в 16-разрядной
    Windows указатель типа far) на командную строку с завершающим нулем. Это значение может задаваться при вызове приложения из администратора программ или через вызов WinExec.
    nCmdShow - это целое значение, определяющее, как выводить на
    экран окно приложения (например, в виде пиктограммы).
    Возвращаемое WinMain значение в данный момент Windows не используется, однако оно может быть полезным при отладке.


    - G -

    Глобальные переменные DOS


    В данном разделе представлены глобальные переменные Borland
    С++, доступные только для 16-разрядных приложений DOS.


    Глобальные переменные и классы


  • Глобальные переменные
  • Потоковые классы С++

  • Потоковые классы С++

  • Класс conbuf (constrea.h)

  • Класс constream (constrea.h)

  • Класс filebuf (fstream.h)

  • Класс fstream (fstream.h)

  • Класс fstreamable (fstream.h)

  • Класс ifstream (fstream.h)

  • Класс ios (iostream.h)

  • Класс iostream (iostream.h)

  • Класс istream (iostream.h)

  • Класс istream_withassign (iostream.h)

  • Класс istream (strstrea.h)

  • Класс ofstream (fstream.h)

  • Класс ostream (iostream.h)

  • Класс ostream_withassign (iostream.h)

  • Класс oststream (strstrea.h)

  • Класс streambuf (iostream.h)

  • Класс strstreambase (strstrea.h)

  • Класс strstreambuf (strstrea.h)

  • Класс strstream (strstrea.h)

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

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

    • Класс fpbase (objstm.h)

    • Класс ifpstream (objstrm.h)

    • Класс ipstream (objstrm.h)

    • Класс pstream (objstrm.h)

    • Класс TStreamableBase (objstrn.h)

    • Класс TStreamable (streambl.h)

    • Класс TStreamer (objstrm.h)

    • Макрокоманда __DELTA (streambl.h)

    • Макрокоманды, начинающиеся с DECLARE

    • Макрокоманды, начинающиеся с IMPLEMENT
    • Контейнерные классы С++ от TMArray... до TIHash...

      • Контейнерные классы С++

      • Шаблон TMArrayVector (arrays.h)

      • Шаблон TMArrayAsVectorIterator (arrays.h)

      • Шаблон TArrayAsVector (arrays.h)

      • Шаблон TArrayAsVectorIterator (arrays.h)

      • Шаблон TMIArrayAsVector (arrays.h)

      • Шаблон TMIArrayAsVectorIterator (arrays.h)

      • Шаблон TIArrayAsVector (arrays.h)

      • Шаблон TIArrayAsVectorItetator (arrays.h)

      • Шаблон TMSArrayAsVector (arrays.h)

      • Шаблон TMSArrayAsVectorItetator (arrays.h)

      • Шаблон TSArrayAsVector (arrays.h)

      • Шаблон TSArrayAsVectorItetator (arrays.h)

      • Шаблон TISArrayAsVector (arrays.h)

      • Шаблон TISArrayAsVectorItetator (arrays.h)

      • Шаблон TMISArrayAsVector (arrays.h)

      • Шаблон TMDAssociation (assoc.h)

      • Шаблон TDDAssociation (assoc.h)

      • Шаблон TDDAssociation (assoc.h)

      • Шаблон TDIAssociation (assoc.h)

      • Шаблон TMIDAssociation (assoc.h)

      • Шаблон TIDAssociation (assoc.h)

      • Шаблон TMIIAssociation (assoc.h)

      • Шаблон TIIAssociation (assoc.h)

      • Шаблон TMBagAsVector (bags.h)




      • Шаблон TMBagAsVectorIterator (bags.h)


      • Шаблон TBagAsVector (bags.h)


      • Шаблон TMBagAsVectorIterator (bags.h)


      • Шаблон TMIBagAsVector (bags.h)


      • Шаблон TMIBagAsVectorIterator (bags.h)


      • Шаблон TIBagAsVector (bags.h)


      • Шаблон TIBagAsVectorIterator (bags.h)


      • Шаблон TBinarySearchTreeImp (binimp.h)


      • Шаблон TBinarySearchTreeIteratorImp (binimp.h)


      • Шаблон TIBinarySearchTreeImp (binimp.h)


      • Шаблон TIBinarySearchTreeIteratorImp (binimp.h)


      • Шаблон TMDequeAsVector (deques.h)


      • Шаблон TMDequeAsVectorIterator (deques.h)


      • Шаблон TDequeAsVector (deques.h)


      • Шаблон TDequeAsVectorIterator (deques.h)


      • Шаблон TMIDequeAsVector (deques.h)


      • Шаблон TMIDequeAsVectorIterator (deques.h)


      • Шаблон TIDequeAsVector (deques.h)


      • Шаблон TMDequeAsDoubleList (deques.h)


      • Шаблон TMDequeAsDoubleListIterator (deques.h)


      • Шаблон TDequeAsDoubleList (deques.h)


      • Шаблон TDequeAsDoubleListIterator (deques.h)


      • Шаблон TMIDequeAsDoubleList (deques.h)


      • Шаблон TMIDequeAsDoubleListIterator (deques.h)


      • Шаблон TIDequeAsDoubleList (deques.h)


      • Шаблон TDequeAsDoubleListIterator (deques.h)


      • Шаблон TMDictionaryAsHashTable (dict.h)


      • Шаблон TMDictionaryAsHashTableIterator (dict.h)


      • Шаблон TDictionaryAsHashTable (dict.h)


      • Шаблон TDictionaryAsHashTableIterator (dict.h)


      • Шаблон TMIDictionaryAsHashTable (dict.h)


      • Шаблон TMIDictionaryAsHashTableIterator (dict.h)


      • Шаблон TIDictionaryAsHashTable (dict.h)


      • Шаблон TIDictionaryAsHashTableIterator (dict.h)


      • Шаблон TDictionary (dict.h)


      • Шаблон TDictionaryIterator (dict.h)


      • Шаблон TMDoubleListElement (dlistimp.h)


      • Шаблон TMDoubleListImp (dlistimp.h)


      • Шаблон TMDoubleListIteratorImp (dlistimp.h)


      • Шаблон TDoubleListImp (dlistimp.h)


      • Шаблон TDoubleListIteratorImp (dlistimp.h)


      • Шаблон TMSDoubleListImp (dlistimp.h)


      • Шаблон TMSDoubleListIteratorImp (dlistimp.h)


      • Шаблон TSDoubleListImp (dlistimp.h)


      • Шаблон TSDoubleListIteratorImp (dlistimp.h)


      • Шаблон TMIDoubleListImp (dlistimp.h)


      • Шаблон TMIDoubleListIteratorImp (dlistimp.h)


      • Шаблон TIDoubleListImp (dlistimp.h)


      • Шаблон TIDoubleListIteratorImp (dlistimp.h)




      • Шаблон TMISDoubleListImp (dlistimp.h)


      • Шаблон TMISDoubleListIteratorImp (dlistimp.h)


      • Шаблон TISDoubleListImp (dlistimp.h)


      • Шаблон TISDoubleListIteratorImp (dlistimp.h)


      • Шаблон THashTableImp (hashimp.h)


      • Шаблон THashTableIteratorImp (hashimp.h)


      • Шаблон TMIHashTableImp (hashimp.h)


      • Шаблон TMIHashTableIteratorImp (hashimp.h)


      • Шаблон TIHashTableImp (hashimp.h)


      • Шаблон TIHashTableIteratorImp (hashimp.h)

      • Контейнерные классы С++ от TMList... до TShould...



        • Шаблон TMListElement (listimp.h)


        • Шаблон TMListImp (listimp.h)


        • Шаблон TMListIteratorImp (listimp.h)


        • Шаблон TMListImp (listimp.h)


        • Шаблон TListIteratorImp (listimp.h)


        • Шаблон TMSListImp (listimp.h)


        • Шаблон TMSListIteratorImp (listimp.h)


        • Шаблон TSListImp (listimp.h)


        • Шаблон TSListIteratorImp (listimp.h)


        • Шаблон TMIListImp (listimp.h)


        • Шаблон TMiListIteratorImp (listimp.h)


        • Шаблон TIListImp (listimp.h)


        • Шаблон TIListIteratorImp (listimp.h)


        • Шаблон TMISListImp (listimp.h)


        • Шаблон TMISListIteratorImp (listimp.h)


        • Шаблон TISListImp (listimp.h)


        • Шаблон TMISListIteratorImp (listimp.h)


        • Шаблон TMQueueAsVector (queues.h)


        • Шаблон TMQueueAsVectorIterator (queues.h)


        • Шаблон TQueueAsVector (queues.h)


        • Шаблон TQueueAsVectorIterator (queues.h)


        • Шаблон TMIQueueAsVector (queues.h)


        • Шаблон TMIQueueAsVectorIterator (queues.h)


        • Шаблон TIQueueAsVector (queues.h)


        • Шаблон TIQueueAsVectorIterator (queues.h)


        • Шаблон TMQueueAsDoubleList (queues.h)


        • Шаблон TMQueueAsDoubleListIterator (queues.h)


        • Шаблон TQueueAsDoubleList (queues.h)


        • Шаблон TQueueAsDoubleListIterator (queues.h)


        • Шаблон TMIQueueAsDoubleList (queues.h)


        • Шаблон TMIQueueAsDoubleListIterator (queues.h)


        • Шаблон TIQueueAsDoubleList (queues.h)


        • Шаблон TQueue (queues.h)


        • Шаблон TQueueIterator (queues.h)


        • Шаблон TMSetAsVector (sets.h)


        • Шаблон TMSetAsVectorIterator (sets.h)


        • Шаблон TSetAsVector (sets.h)


        • Шаблон TSetAsVectorIterator (sets.h)


        • Шаблон TMISetAsVector (sets.h)


        • Шаблон TMISetAsVectorIterator (sets.h)


        • Шаблон TISetAsVector (sets.h)


        • Шаблон TISetAsVectorIterator (sets.h)


        • Шаблон TSet (sets.h)




        • Шаблон TSetIterator (sets.h)


        • Шаблон TStackAsVector (stacks.h)


        • Шаблон TMStackAsVectorIterator (stacks.h)


        • Шаблон TStackAsVector (stacks.h)


        • Шаблон TStackAsVectorIterator (stacks.h)


        • Шаблон TMIStackAsVector (stacks.h)


        • Шаблон TMIStackAsVectorIterator (stacks.h)


        • Шаблон TIStackAsVector (stacks.h)


        • Шаблон TIStackAsVectorIterator (stacks.h)


        • Шаблон TMStackAsList (stacks.h)


        • Шаблон TMStackAsListIterator (stacks.h)


        • Шаблон TStackAsList (stacks.h)


        • Шаблон TStackAsListIterator (stacks.h)


        • Шаблон TMIStackAsList (stacks.h)


        • Шаблон TMIStackAsListIterator (stacks.h)


        • Шаблон TIStackAsList (stacks.h)


        • Шаблон TIStackAsListIterator (stacks.h)


        • Шаблон TStack (stacks.h)


        • Шаблон TStackIterator (stacks.h)


        • Шаблон TMVectorImp (vectimp.h)


        • Шаблон TMVectorIteratorImp (vectimp.h)


        • Шаблон TVectorImp (vectimp.h)


        • Шаблон TVectorIteratorImp (vectimp.h)


        • Шаблон TMCVectorImp (vectimp.h)


        • Шаблон TMCVectorIteratorImp (vectimp.h)


        • Шаблон TCVectorImp (vectimp.h)


        • Шаблон TCVectorIteratorImp (vectimp.h)


        • Шаблон TMSVectorImp (vectimp.h)


        • Шаблон TMSVectorIteratorImp (vectimp.h)


        • Шаблон TSVectorImp (vectimp.h)


        • Шаблон TSVectorIteratorImp (vectimp.h)


        • Шаблон TMIVectorImp (vectimp.h)


        • Шаблон TMIVectorIteratorImp (vectimp.h)


        • Шаблон TIVectorImp (vectimp.h)


        • Шаблон TIVectorIteratorImp (vectimp.h)


        • Шаблон TMICVectorImp (vectimp.h)


        • Шаблон TMICVectorIteratorImp (vectimp.h)


        • Шаблон TICVectorImp (vectimp.h)


        • Шаблон TICVectorIteratorImp (vectimp.h)


        • Шаблон TMISVectorImp (vectimp.h)


        • Шаблон TMISVectorIteratorImp (vectimp.h)


        • Шаблон TISVectorImp (vectimp.h)


        • Шаблон TISVectorIteratorImp (vectimp.h)


        • Класс TShouldDelete (shddel.h)

        • Математические классы С+



          • Математические классы С+


          • Класс bcd (bcd.h)


          • Класс complex (comnplex.h)

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



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


            • Поддержка этапа выполнения


            • Класс Bad_cast (typeinfo.h)


            • Класс Bad_typeid (typeinfo.h)


            • Функция set_new_handler (new.h)


            • Функция set_termionate (except.h)


            • Функция set_unexpected (except.h)


            • Функция terminate (except.h)


            • Класс Type_info (typeinfo.h)


            • Функция unexpected (except.h)


            • Класс xalloc (except.h)


            • Класс xmsg (except.h)


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


            • Класс TDate (date.h)


            • Класс TFileStatus (file.h)


            • Класс String (cstring.h)


            • Класс TSubString (cstring.h)


            • Класс TCriticalSection (thread.h)


            • Класс TCriticalSection::Lock (thread.h)


            • Класс TMutex (thread)


            • Класс TMutex::Lock (thread.h)


            • Класс TSync (thread.h)


            • Класс TSync::Lock (thread.h)


            • Класс TThread (thread.h)


            • Класс TTread::TThreadError (thread.h)


            • Класс TTime (time.h)

              Глобальные переменные


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


              Графические объекты


              Ниже описываются инкапсуляция в ObjectWindows 2.0 GDI Windows. ObjectWindows облегчает использование графических объектов
              и функций GDI.
              Некоторые приложения, такие как графические приложения и задачи обработки изображений, требуют использования графики. Эта
              графика может быть в форме линий, форм, текста или побитовых
              (растровых) отображений. Для предоставления приложениям функциональных возможностей работы с графикой Windows имеет набор функций, называемых интерфейсом с графическими устройствами (GDI).
              GDI может рассматриваться как графический пакет, который используют приложения Windows для представления и манипуляций с графикой. Функции GDI дают вашему приложению возможности рисования, не
              зависящие от используемого устройства представления. Например, вы
              можете использовать одни и те же функции GDI для написания программ для дисплеев EGA и VGA или для принтера PostScript. Независимость от устройств достигается с помощью использования драйверов устройств, переводящих вызовы функций GDI в команды, понятные
              использующемуся устройству вывода.


              Графические подпрограммы


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

              arc (graphics.h) fillellipse (graphics.h)
              bar (graphics.h) fillpoly (graphics.h)
              bar3d (graphics.h) floofill (graphics.h)
              circle (graphics.h) getarccoords (graphics.h)
              cleardevice (graphics.h) getaspectratio (graphics.h)
              clearviewport (graphics.h) getbkcolor (graphics.h)
              closgraph (graphics.h) getcolor (graphics.h)
              detectgraph (graphics.h) getdefaultpallette(graphics.h)
              drawpoly (graphics.h) getdrivername (graphics.h)
              ellipse (graphics.h) getfillpattern (graphics.h)
              getfillsettings (graphics.h) outtext (graphics.h)
              getgraphmode (graphics.h) outtextxy (graphics.h)
              getimage (graphics.h) pieslice (graphics.h)
              getfinesettings (graphics.h) pufimage (graphics.h)
              getmaxcolor (graphics.h) pulpixel (graphics.h)
              getmaxmode (graphics.h) rectangle (graphics.h)
              getmaxx (graphics.h) registerbgidriver (graphics.h)
              getmaxy (graphics.h) registerbgifont (graphics.h)
              getmodename (graphics.h) restorecrtmode (graphics.h)
              getmoderange (graphics.h) sector (graphics.h)
              getpalette (graphics.h) settaffpalette (graphics.h)
              getpixel (graphics.h) setaspectratio (graphics.h)
              gettextsettings (graphics.h) setbkcolor (graphics.h)
              getviewsettings (graphics.h) setcolor (graphics.h)
              getx (graphics.h) setcursortype (conio.h)
              gety (graphics.h) setfillpattern (graphics.h)
              graphdefaults (graphics.h) setfillstyle (graphics.h)
              grapherrormsg (graphics.h) setgraphbufsize (graphics.h)
              _graphfreemem (graphics.h) setgraphmode (graphics.h)
              _graphgetmem (graphics.h) setlinestyle (graphics.h)
              graphresult (graphics.h) setpalette (graphics.h)
              imagesize (graphics.h) setrgbpalette (graphics.h)
              initgraph (graphics.h) settextjunistify (graphics.h)
              installuserdriver(graphics.h) settexttyle (graphics.h)
              installuserfont (graphics.h) setusercharsize (graphics.h)
              line (graphics.h) setviewport (graphics.h)
              linerel (graphics.h) setvisualpage (graphics.h)
              lineto (graphics.h) setwritemode (graphics.h)
              moverei (graphics.h) textheight (graphics.h)
              moveto (graphics.h) textwidth (graphics.h)



              Групповые блоки


              В своей простейшей форме групповой блок помечается как статический прямоугольник, визуально группирующий другие управляющие
              элементы.
              Конструктор TListBox имеет 7 стандартных параметров конструктора объекта управляющего элемента (родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, необязательный идентификатор библиотеки), плюс текстовую строку,
              помечающую группу.
              Обычно групповой блок объединяет другие управляющие элементы, однако он может также логически объединять группы кнопок. Эти
              логические группы выполняют автоматическую отмену выбора (BS_AUTOCHECKBOX, BS_AUTORADIOBUTTON). Чтобы добавить к групповому блоку кнопку с зависимой или независимой фиксацией, передайте указатель на объект группового блока при вызове конструктора кнопки.
              При наступлении события, которое может изменить выбор в
              групповом блоке Windows посылает родительскому окну группового
              блока уведомляющее сообщение. Родительское окно может перехватывать сообщение для группового блока в целом, а не отвечать на выбор отдельных кнопок. Для определения задействованного управляющего элемента вы можете получить текущее состояние каждой кнопки.


              Группы точек останова


              Объединение точек останова в группы позволяет разрешать,
              запрещать или удалять их одним действие. Кроме того, одной командой можно задать группу точек останова для всех функций (или
              функций-элементов) модуля.
              Команда Group в локальном меню окна Breakpoint активизирует
              диалоговое окно Edit Breakpoint Groups, с помощью которого вы можете создать или модифицировать точки останова.
              [*] Edit Breakpoint groups
              Group
              1 #BCDEMO#38 #BCDEMO#39 OK
              3 #BCDEMO#40
              Help
              Add... Delete Enable Disable
              Группа точек останова идентифицируется положительным целым
              числом, которое автоматически генерируется отладчиком или назначается вами. Отладчик автоматически присваивает групповое число
              каждой создаваемой точке останова. Генерируемый номер группы
              представляет собой наименьший еще не использованный номер. Таким
              образом, если номера 1, 2 и 5 уже используются группами, то следующей создаваемой точке останова автоматически присваивается номер группы 3. После создания точки останова вы можете модифицировать статус ее группы с помощью команды Breakpoint Groups.
              Кнопка Add окна Edit Breakpoints активизирует диалоговое окно Add Group, содержащее один блок списка и набор кнопок с зависимой фиксацией. Блок списка Module/Class выводит список модуле или классов текущей программы. Посветите нужных модуль или класс
              и выберите OK. Все устанавливаемые таким образом точки останова
              объединяются в одну группу. Кнопка Delete удаляет подсвеченную
              группу, а Enable/Disable разрешают или временно запрещают данную
              группу.
              Кнопки с зависимой фиксацией позволяют выбрать тип функций,
              выводимых в блоке Module/Class: кнопка Modules выбирает все модули в текущей программе, а кнопка Classes - все ее классы.


              - H -

              Характеристики Doc/View


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


              Характеристики объекта


              Кроме атрибутов интерфейсного элемента интерфейсные объекты
              имеют характеристики объекта ObjectWindows. С помощью функций
              SetFlag, ClearFlag и IsFlagSet вы можете запросить и изменить эти
              характеристики. При работе с данными функциями можно использовать
              следующие флаги:

              Флаг Значени
              wfAlias Указывает, является ли объект псевдонимом
              wfAutoCreate Указывает, разрешено ли для объект
              автоматическое создание.
              wfFromResource Показывает, загружен ли интерфейсны
              элемент из ресурса
              wfShrinkToClient Задает сжатие окна-рамки до размер
              клиентного окна
              wfMainWindow Указывает, что окно является основным
              wfPredefinedClass Определяет, что окно является предопределенным классом Windows.
              wfTransfer Показывает, может ли окно использовать механизм передачи данных.



              Характеристики окна


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

            • GetWindowTextTitle - возвращает строку, содержащую заголовок текущего окна.

            • SetCursor - устанавливает в экземпляре курсор, идентифицируемый параметром TModule (курсор передается в параметре в виде ресурса).

            • Присвоив Attr.AccelTable идентификатор ресурса (строку или
              целое число), вы можете задать для окна таблицу акселераторов.



            • Характеристики управляющего элемента VBX


              Каждый управляющий элемент VBX имеет ряд характеристик. С их
              помощью вы можете, например, изменять цвета различных частей управляющего элемента, его размер и расположение, заголовок и т.д.
              В изменении этих характеристик заключается обычно основной способ
              манипулирования управляющим элементом VBX. Характеристики управляющего элемента VBX должны быть полностью описаны в руководствах
              по библиотекам управляющих элементов.
              TVbxControl предусматривает ряд методов для получения информации о характеристиках. С помощью функции GetNumProps вы можете
              получить общее число характеристик.
              Получить имя характеристики в данном диапазоне вы можете с
              помощью функции-элемента TVbxControl GetPropName, которая имеет
              один параметр (индекс) и возвращает строку с именем характеристики. Индекс характеристики по ее имени можно получить с помощью
              GetPropIndex.
              Получить значение характеристики вы можете по ее имени или
              индексу. Хотя индекс использовать эффективнее, применение имени
              понятнее. Вы можете использовать тот или иной метод по своему усмотрению.
              Для получения характеристик управляющего элемента TVbxControl предусматривает функцию GetProp, которая позволяет получать
              характеристики, используя индекс или имя.
              Устанавливать значение характеристики также можно по ее индексу или имени. Для этого в TVbxControl предусмотрена функция
              SetProp.


              _Heaplen (dos.h)


              Эта переменная содержит длину ближней динамически распределяемой области памяти в малых моделях данных (tinu. small, medium) и описывается следующим образом:
              extern unsigned _heaplen;
              В моделях small и medium размер сегмента данных вычисляется
              следующим образом:
              сегмент данных [small,medium] = глобальные данные +
              динамически распределяемая область + стек
              где размер стека можно настроить с помощью _stklen.
              Если _heaplen установлена в 0 (по умолчанию), то программа
              выделяет для сегмента данных 64К, и размером динамически распределяемой области будет:
              64K - (глобальные данных + стек)
              В модели tiny все (включая код) находится в одном и том же
              сегменте, поэтому размер сегмента данных вычисляется следующим
              образом (с учетом 256 байт для PSP):
              сегмент данных [tiny] = 256 + глобальные данные +
              динамически распределяемая область + стек
              Если в модели tiny _heaplen = 0, то фактический размер динамически распределяемой области вычисляется вычитанием из 64К PSP,
              кода, глобальных данных и стека.
              В моделях compact и large ближней динамически распределяемой
              области нет, и стек имеет собственный сегмент, поэтому сегмент
              данных вычисляется так:
              сегмент данных [compact, large] = глобальные данные
              В модели huge стек находится в отдельном сегменте, и каждый
              модуль имеет собственный сегмент данных.


              - I -

              Идентификаторы


              Характерным для Borland C++ и для других реализаций языка
              является учет регистра букв в идентификаторах. Последние могут
              содержать буквы от A до Z и от a до z, символ подчеркивания (_) и
              цифры от 0 до 9 и должны начинаться с буквы.
              Константы
              Константами называются лексемы, представляющие собой фиксированные числовые или символьные значения. Borland C++ поддерживает четыре класса констант: константы с плавающей точкой, целочисленные константы, константы перечислимого типа и символьные константы (включая строковые).
              Целочисленные константы представлены десятичным, восьмиричным и шестнадцатиричным форматом.
              Символьные константы записываются одним или более символами,
              заключенными в одинарные кавычки, например 'F', '=', '\n'.


              Иерархия классов постоянных потоков


              Иерархия классов постоянных потоков представляется следующей
              схемой:
              pstream
              ^ ^ ^
              TStreamable
              ^ ^
              ipstream opstream fpbase
              ^ ^ ^ ^
              ofpstream
              ifstream
              Двойная стрелка указывает, что TStreamableBase - это дружественный класс.



              Иерархия классов


              Наследование может использоваться множество раз при порождении
              объектов. Порожденные классы могут наследовать готовые функции элементы своих классов-предков, набирая при каждом порождении все больше
              и больше функций элементов.
              Окно
              ^
              Наследование Панель Порождение
              классов
              v
              Меню
              Вы можете также порождать несколько классов из базового класса:
              ^ Меню
              Насле- Порождение
              дование > < классов
              v
              Вертикальное Горизонтальное
              Вертикальное и Горизонтальное меню имеют одного предка - Меню.
              Общее свойство, унаследованное от Меню - это список элементов, расположение. Порождение нескольких классов из одного корня позволяет
              использовать текст программ для многих классов.
              Используя наследование, можно наращивать иерархию классов, создавая как-бы древовидные формы. Еще более сложные иерархии образуются
              через множественное наследование.


              Имена контейнеров и комбинации ADT/FDS


              Характеристики каждого класса закодированы в имени контейнера. Например, TDequeueAsDoubleList - это прямой контейнер, использующий схему управления памятью и реализующий двусвязанный
              список.

              Сокращение Описание
              T Префикс библиотечного класса Borland.
              M Контейнер управления памятью, предусматриваемый
              пользователем.
              I Косвенный контейнер.
              C Счетный контейнер.
              S Отсортированный контейнер.

              Библиотеки BIDS не содержат всех возможных комбинаций
              ADT/FDS. Предусмотренные комбинации указаны в следующей таблице:
              ADT Sorted Dictiona-
              FDS Stack Queue Dequeue Bag Set array Array ry
              Вектор * * * * * * *
              Список *
              Двойной * *
              список
              Таблица *
              хеширования
              Двоичное
              дерево
              Для построения собственных реализаций ADT/FDS вы можете использовать шаблоны классов.


              Импорт класса


              Чтобы импортировать класс из одного проекта AppsExpert в
              другой, сделайте следующее:
            • Переместите или скопируйте исходный файл и файл заголовка,
              который определяет класс, в исходный каталог и каталог заголовка проекта. Все исходные файлы проекта должны находиться в каталоге исходных файлов проекта (.CPP) или заголовков (.H). Эти каталоги создаются при генерации объекта
              AppsExpert.

            • Добавьте в проекте IDE в качестве зависимого узла под
              целью AppsExpert исходный файла класса (используйте команду Add node оперативного меню).

            • В окне проекта выберите цель AppsExpert, щелкните правой
              кнопкой "мыши", затем выберите Special Rescan.



            • Информация о динамически распределяемой памяти USER и GDI


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


              Информация, выводимая утилитой DFA


              Утилита DFA записывает файл только в том случае, если в кадре стека для файла присутствует информация отладчика Turbo Debugger. Выходной файл DFA (DFA.OUT) содержит трассировку стека, аналогичную файлу регистрации WinSpector. Кроме того, там находится следующее:
            • имена функции;

            • номера строк;

            • локальные и глобальные переменные;

            • сегменты данных и их значения (включая сегмент стека).

            • Во время сеанса работы в Windows записывается только один
              файл WINSPCTR.BIN, поэтому построцессорная обработка файла выполняется с подсказкой. При этом вы можете удалить или переименовать
              файлы DFA.OUT и WINSPCTR.LOG, что позволит отследить за один сеанс более одной исключительной ситуации.


              Инициация связи


              После настройки TDW для удаленной отладки загрузите программу с помощью диалогового окна Load a New Program to Debug. TDW
              выводит уведомляющее сообщение. После установления связи выводится обычный экран отладчика, и команды его работают так же. Однако
              вывод программы на экран и ввод с клавиатуры происходит на удаленной системе.


              Инициализация основного окна


              По умолчанию TApplication::InitMainWindow создает окно-рамку
              с тем же именем, что и объект приложения. Это оно не особенно полезно, так как не может воспринимать и обрабатывать ввод от пользователя. Вы должны переопределить InitMainWindow и создать новый объект окна, обрабатывающий ввод от пользователя. Обычно InitMainWindow создает TFrameWindow или производный от него объект и
              вызывает функцию SetMainWindow, которая воспринимает один параметр (TFrameWindows*) и возвращает указатель на старое основное окно (в случае нового приложения возвращается 0).
              С помощью элемента данных nCmdShow, соответствующего параметру с таким же именем функции WinMain, вы можете изменить характер вывода на экран основного окна приложения. Эту переменную можно установить, как только начинает выполнение функция Run, или
              пока вы не вызовите TApplication::InitInstance. По существу это
              означает, что вы можете установить значение nCmdShow либо в InitApplication, либо в функции InitMainWindow.
              Для изменения основного окна при выполнении приложения вы
              можете использовать функцию SetMainWindow, которая имеет один параметр, TFrameWindow*, и возвращает указатель на старое основное окно (или 0). Этот указатель можно использовать для сохранения старого основного окна (и его последующего восстановления), либо
              для удаления объекта окна.


              Инициализация приложений


              Для инициализации приложения ObjectWindows требуется построить объект приложения и инициализировать приложение, каждый новый
              экземпляр и основное окно.
              Для запуска приложения объект TApplication вызывает свои
              функции-элементы InitApplication, InitInstance и InitMainWindows.
              Вы можете переопределить любые из этих функций и задать собственную инициализацию. Для получения полезного приложения можно также
              переопределить InitMainWindow. Для переопределения функции TApplication нужно построить собственный производный от TApplication
              класс.
              Конструктор класса приложения должен вызывать конструктор
              TApplication. Библиотека ObjectWindows обеспечивает собственные
              средства для обработки ошибок и исключительных ситуаций (в функции WinMain). Любую инициализацию можно выполнять в функции OwlMain, которая вызывается заданной по умолчанию функцией WinMain.
              Для построения объекта приложения создайте в функции OwlMain экземпляр класса приложения.
              Хотя вы можете вызывать собственную функцию WinMain, поместив ее в исходный файл, делать этого не нужно. Все что требуется,
              можно сделать в вызываемой ей функции OwlMain или в функциях-элементах инициализации TApplication.
              Если вы решили создать свою собственную функцию WinMain,
              TApplication поддерживает во втором своем конструкторе передачу
              обычных параметров функции WinMain.
              Пользователи одновременно могут выполнять несколько копий
              приложения. С точки зрения 16-разрядных приложений инициализация
              первого экземпляра выполняется только когда не работает вторая
              копия приложения. Инициализация экземпляра происходит каждый раз,
              когда пользователь запускает приложение. Если пользователь запускает и закрывает приложение, запускает его снова и т.д., то каждый экземпляр будет первым экземпляром, так как они работают не одновременно.
              В случае 32-разрядных приложений каждое приложение работает
              в своем собственном адресном пространстве без разделяемых данных,
              поэтому каждый экземпляр выглядит как первый экземпляр. Таким образом, при инициализации 32-разрядного приложения оно выполняет и
              инициализацию первого экземпляра, и инициализацию каждого экземпляра.
              Если текущий экземпляр является первым экземпляром (на что
              указывает hPrevInstance = 0), то вызывается InitApplication. В
              производном классе приложения вы можете переопределить InitApplication (по умолчанию InitApplication не несет никакой функциональной нагрузки).
              Пользователи могут одновременно выполнять несколько копий
              (экземпляров) приложения. Для выполнения любой необходимой инициализации можно переопределить TApplication::InitInstance. InitInstance вызывает InitMainWindow, а затем создает и выводит на экран основное окно. Если вы переопределяете InitInstance, убедитесь, что новая функция InitInstance вызывает TAppliation::InitInstance.


              Инкапсуляция или скрытие данных


              Понятие инкапсуляция означает, что функции элементы и структуры
              данных, определяющие некоторые свойства данного класса, рассматриваются в качестве единого целого. Это подразумевает "защиту" данных в
              пределах класса таким образом, что только элементы класса получают к
              ним доступ. То есть, для того чтобы получить значение одного из элементов данных класса, нужно вызвать функцию элемент этого класса, ко-
              торый возвращает необходимое значение. Для присвоения элементу значения, вызывается соответствующая функция элемент данного класса. Вообще, в объектном программировании считается хорошим тоном закрывать
              все данные и функции элементы описываемого класса для доступа "извне".
              Borland C++ предоставляет программистам три уровня доступа к
              элементам объектов:
              - public (общий),
              - private (приватный),
              - protected (защищенный).
              Элементы, объявленные общими, будут доступны любому внешнему
              элементу класса, любой функции элементу или выражению в программе,
              когда объект является видимым.
              Приватные элементы доступны только другим элементам своего же
              класса. Они не доступны извне, за исключением специальных функций,
              называемых "дружественными".
              К защищенным элементам имеют доступ лишь некоторые из объектов.
              Они доступны только элементам своего класса и любым его потомкам. Поэтому защищенные элементы занимают промежуточное положение между общими и приватными.
              Примечание: приватные элементы недоступны потомкам своего класса. Поэтому и понадобились защищенные элементы.
              Уровень доступности к элементам класса проиллюстрирован ниже:
              Общие элементы
              (public)
              Защищенные
              элементы (protect)
              Приватные
              элементы
              (private)
              Умелое использование уровней доступа повышает надежность программ и их способность к изменениям, ослабляя взаимозависимость между
              объектами. Правильно описанными функциями элементами типа public можно изменять приватные элементы, не затрагивая программный код других
              объектов. В реальной жизни мы подобным образом взаимодействуем с различными предметами: телевизором, будильником, радиоприемником, автомобилем - знание внутреннего устройства которых нам не обязательно.
              Однако, нам важны внешние кнопки и ручки управления.


              Инкрементальное сопоставление


              Это средство помогает вам находить записи в алфавитных списках. При наборе каждого символа полоса подсветки перемещается к
              первому элементу, начинающемуся с выбранных вами букв. Позиция
              курсора указывает, какую часть имени вы уже набрали. После подсветки вы можете нажать Alt+F10 или щелкнуть правой кнопкой "мыши". При этом выводится SpeedMenu, где вы можете выбрать команду,
              соответствующую подсвеченному элементу.


              Инсталляция и настройка Borland С++


              Пакет Borland С++ содержит инструментальные средства Windows, инструментальные средства, работающие в режиме командной
              строки, и библиотеки, позволяющие разрабатывать приложения для
              DOS, Windows, Win32 и Windows NT.
              Borland C++ содержит приложения DOS и Windows. Для работы
              Borland С++ требуется:
            • DOS версии 4.01 или старше.

            • Windows 3.1 или старше, работающая в защищенном режиме
              386.

            • Жесткий диск с 40 мегабайтами свободного пространства
              (полная инсталляция требует 80 Мб).

            • Дисковод на 1.44 Мб или CD-ROM (для инсталляции).

            • Не менее 4 Мб расширенной памяти.

            • Совместимая с Windows "мышь".

            • Наличие 8 мегабайт оперативной памяти и сопроцессора 80х87
              значительно улучшит производительность работы (при отсутствии
              сопроцессора он эмулируется).


              Инструкции перехода


              Инструкции перехода рассматриваются отдельно. Поскольку метка не может быть включена в саму команду, переходы выполняются к
              меткам Си (см. выше раздел "Использование команд перехода и меток"). В следующей таблице перечислены допустимые инструкции перехода:
              Инструкции перехода
              ja jge jnc jns loop
              jae jl jne jnz loope
              jb jle jng jo loopne
              jbe jmp jnge jp loopnz
              jc jna jnl jpe loopz
              jcxz jnae jnle jpo
              je jnb jno js
              jg jnbe jnp jz


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


              В пакет Borland С++ входят следующие инструментальные средства для работы с ресурсами:
            • Компиляторы ресурсов BRCC.EXE и BRCC32.EXE. Они компилируют файлы сценариев ресурсов (.RC) и создают двоичный файл
              .RES.

            • Компоновщики ресурсов RLINK.EXE и RLINK32.EXE используются
              для компоновки ресурса в файл .RES, .EXE или создают выполняемый файл Windows (через TLINK).

            • Borland BRC.EXE и BRC32.EXE - это оболочки, позволяющие
              запускать BRCC и RLINK за один шаг.

            • Большинство программ Windows легко использовать, так как они
              обеспечивают стандартный интерфейс с пользователем. Например,
              большинство программ Windows, позволяющие вам реализовать команды
              программы и изменять курсоры, что позволяет указателю "мыши"
              представлять большой набор инструментальных средств, таких как
              стрелки или кисти.
              Меню и курсоры представляют два примера ресурсов программ
              Windows. Ресурсы - это данные, записываемые в выполняемый файл
              программы (.EXE) отдельно от обычных ее данных. Ресурсы определяются и задаются вне кода программы, а затем добавляются к скомпилированному коду программы для создания выполняемого файла программы.
              Ресурсы определяются как внешние для вашего программного кода данные, а затем они подключаются к выполняемому файлу в процессе компоновки. Приложение вызывает ресурсы в память только при
              необходимости, что минимизирует использование памяти.
              Чаще всего создавать и использовать вы будете следующие
              ресурсы:
            • меню;

            • диалоговые блоки;

            • тограммы;

            • затели;

            • соры;

            • елераторы клавиатуры (оперативные клавиши);

            • овые массивы;

            • шрифты;

            • символьные строки.

            • Файлы сценариев ресурсов - это текстовые файлы, которые описывают конкретный ресурс приложения. Создать ресурсы вы можете с
              помощью редактора ресурсов или компилятора ресурсов. В большинстве случаев проще всего использовать редактор ресурсов и визуально создать ресурсы. Однако иногда удобно использовать для компиляции файлов манускрипта, которые встречаются в книгах или журналах, компилятор ресурсов.
              Независимо от того, какой подход вы используете, с помощью
              RC или BRCC обычно создается файл ресурса (.RES) для каждой прикладной программы. Данный файл ресурсов содержит двоичную информацию для всех меню, диалогов, растровых образов и других ресурсов, используемых в прикладной программе.
              Двоичный файл ресурсов, добавляемый к вашей прикладной программе (.EXE) с помощью компилятора ресурсов, описывается в данной
              главе ниже. Вы должны также написать код, который загружает ресурсы в память. Каждый ресурс требуется загружать в память отдельно. Это дает вам гибкость, поскольку ваша программа будет использовать память только для тех ресурсов, которые действительно
              нужны.


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


              Borland С++ содержит несколько инструментальных средств режима командной строки, позволяющие выполнять те же задачи, что и
              IDE. Это компилятор, компоновщик, компилятор ресурсов, библиотекарь, компоновщик проектов (MAKE) и другие средства. Некоторые из
              них описаны в файлах оперативного справочника. Эти средства могут
              потребоваться вам, если вы работаете с редактором DOS, например,
              Brief. Перечислим эти средства:

              Файл Описание
              BCC.EXE
              BCC32.EXE
              16-разрядный и 32-разрядный компилятор.
              TLINK.EXE
              TLINK32.EXE
              Компоновщики, формирующие из файлов .OBJ и
              .LIB файлы .EXE и .DLL.
              IMPLIB.EXE
              TLIB.EXE
              Помогают работать с библиотеками.
              HC31.EXE Компилирует файлы для оперативного справочника Help и создает файлы .HLP, используемые большинством приложений Windows.
              BRCC.EXE
              BRCC32.EXE

              BRC.EXE

              BRC32.EXE
              RLINK.EXE
              Компиляторы ресурсов.
              MAKE.EXE
              MAKER.EXE
              Помогают обслуживать проекты и компонуют
              только те файлы, которые были изменены после последней генерации программы.



              Интерфейс отладчика


              Среда Turbo Debugger включает в себя набор меню, диалоговых
              окон и специальных окон отладчика.


              Интерфейсные объекты


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


              Интерфейсные подпрограммы


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

              absread (dos.h) _dos_freemem (dos.h)
              abswrite (dos.h) freemem (dos.h)
              bioscom (bios.h) _harderr (dos.h)
              _bios_disk (bios.h) harderr (dos.h)
              biosdisk (bios.h) _hardresume (dos.h)
              _bios_keybrd (bios.h) hardresume (dos.h)
              bioskey (bios.h) _hardretn (dos.h)
              biosprint (dos.h) hardretn (dos.h)
              _bios_printer (dos.h) keep (dos.h)
              _bios_serialcom (dos.h) randbrd (dos.h)
              _dos_keep (dos.h) randbwr (dos.h)



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


              После наступления события VBX и вызова функции обработки события функции нужно иметь дело со структурой VBXEVENT в качестве
              параметра. В этой структуре задается описатель посылающего событие управляющего элемента, описатель управляющего окна, идентификатор управляющего элемента VBX, индекс события, имя события,
              число параметров события и указатель на массив, содержащий указатели на значения параметров для данного события.
              Чтобы понять эту структуру, нужно понимать, как работает управляющий элемент VBX. Первые 3 элемента достаточно просты и позволяют вам идентифицировать передающий событие управляющий элемент. Следующие 2 элемента также достаточно просты: каждое событие, которое может посылать управляющий элемент VBX, представляется здесь индексом события и его именем.
              Следующие 2 элемента сохраняют события содержат параметры
              события. Эти параметры более сложны. Информацию по ним вы можете
              найти в руководстве по библиотеке управляющих элементов VBX.


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


              Администратор документа является экземпляром класса, производного от TDocManager или TDocManager, и выполняет ряд задач:
            • Поддерживает список текущих документов и зарегистрированных шаблонов.

            • Обрабатывает события стандартного меню File.

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

            • Для поддержки модели Doc/View администратор документа должен
              подключаться к приложению. Это делается путем создания экземпляра
              TDocManager и превращения его в администратор документа приложения. К общедоступным данным и функциям администратора документа
              можно обращаться с помощью функции GetDocManager, которая не имеет параметров и возвращает TDocManager&. Для создания документов
              и отображаемых элементов администратор документа предусматривает
              следующие функции:
            • CreateAnyDoc представляет все видимые шаблоны, в то время
              как функция-элемент TDocTemplate CreateDoc представляет
              только свой собственный шаблон.

            • CreateAnyView отфильтровывает список шаблонов для тех
              отображаемых элементов, которые поддерживают текущий документ и представляют список имен файлов, а функция-элемент
              TDocTemplate CreateView непосредственно строит отображаемый документ, заданный классом шаблона документа.

            • Для поддержки других средств (например, OLE 2.0) можно использовать специализированный администратор документа.


              Использование AppExpert


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

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

            • Использование Resource Workshop для редактирования или добавления ресурсов.

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

            • Для каждого приложения AppExpert создает следующие файлы:

              Тип файла Описание
              .IDE Файл проекта.
              .CPP Основной исходный файл.
              .H Основной файл заголовка.
              .RC Файл сценария ресурса.
              .RH Файл заголовка ресурса.
              .APX Файл базы данных для AppExpert.
              .RC Файл сценария ресурса
              .RTF Исходные файлы справочника.
              .HPJ Файл проекта справочника.
              .ICO Файлы пиктограмм.
              .BMP Файлы битовых массивов.



              Использование библиотечных файлов


              Borland C++ предлагает для каждой из шести моделей памяти
              собственную версию библиотеки стандартных подпрограмм. Компилятор
              Borland C++ при этом проявляет достаточно "интеллекта", чтобы при
              последующей компоновке брать нужные библиотеки и в нужной последовательности, в зависимости от выбранной вами модели памяти. Однако, при непосредственном использовании компоновщика Borland C++
              TLINK (как автономного компоновщика) вы должны явно указывать используемые библиотеки.


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


              TApplication имеет функции, необходимые для загрузки библиотеки специализированных управляющих элементов Borland (BWCC.DLL
              для 16-разрядных приложений и BWCC32.DLL для 32-разрядных) и библиотеки трехмерных управляющих элементов Microsoft (CTL3D.DLL).
              Эти DLL широко используются для обеспечения стандартного вида многих приложений.
              BWCC можно открыть с помощью функции TApplication::EnableBWCC, которая воспринимает единственный параметр. Когда вы передаете ей True, функция загружает еще не загруженную DLL. При
              передаче False DLL выгружается.
              После загрузки DLL вы можете использовать обычные функциональные возможности BWCC. EnableBWCC автоматически открывает корректную библиотеку (для 16- или 32-разрядных приложений).
              Функция TApplication::EnableCtrl3d позволяет вам загружать и
              выгружать библиотеку CTL3D фирмы Microsoft. Определить, загружена
              ли эта библиотека, можно с помощью функции TApplication::Ctl2Enabled. Параметров эта функция не имеет, а возвращаемое значение True указывает на загрузку библиотеки.
              Определить, загружена ли библиотека CTL3D, можно с помощью
              TApplication::Ctl3dEnabled, которая в этом случае возвращает
              True. Чтобы использовать функцию EnableCtl3dAutosubclass воспринимает единственный параметр. Если передаете ей True, функция разрешает выделение подклассов (в этом случае все отличные от ObjectWindows диалоги будут иметь трехмерный вид), а если False запрещает.


              Использование библиотек


              Данный раздел описывает несколько инструментальных средств,
              которые позволяют вам работать с библиотечными файлами. Вы можете
              использовать эти инструментальные средства в IDE или в командной
              строке.
            • Утилита IMPLIB создает библиотеки импорта, а IMPDEF - файлы определения модуля (.DEF). Библиотеки импорта и файлы
              определения модулей задают для компоновщика информацию об
              импортируемых из библиотек DLL функциях.

            • Утилита TLIB управляет библиотеками отдельных файлов .OBJ.
              Библиотека - это удобный инструмент для работы с набором
              объектных модулей.



            • Использование буферов передачи


              Вместо создания производного класса вы можете использовать
              структуру, представляющую состояния управляющих элементов. Такая
              структура называется буфером передачи, так как состояния управляющего элемента передается от управляющих элементов в буфер и в
              управляющие элементы из буфера.
              Механизм передачи требует для представления управляющих элементов, которым вы хотите передавать данные, использования объектов ObjectWindows. Для использования механизма передачи вам необходимо следующее:
            • Определите буфер передачи с переменной экземпляра для каждого управляющего элемента, с которым вы хотите обмениваться данными.

            • Определите соответствующее окно или диалоговый блок.

            • Передайте данные.



            • Использование ClassExpert


              ClassExpert позволяет вам создавать новые классы, редактировать и обновлять реализацию классов, а также перемещаться по
              классам в исходном коде приложений AppExpert. Чтобы связать классы с ресурсами, вы можете использовать ClassExpert с Resource
              Workshop.


              Использование диалогового блока в качестве основного окна


              Чтобы использовать диалоговый блок в качестве основного окна, лучше создать окно-рамку с диалоговым блоком в качестве клиентного окна. Для этого создайте производный от Tapplication класс. Кроме конструктора, единственное, что для этого требуется,
              это функция InitMeinWindow, в которой строится объект окна-рамки.
              Конструктор TFrameWindow включает автоматическое создание объекта
              диалогового блока, который вы передаете в качестве клиента.
              Требуется также обеспечить, чтобы объект диалогового блока
              имел определенные атрибуты:
            • Уничтожение диалогового объекта не уничтожает рамки. Ее
              нужно уничтожать явным образом.

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

            • Вы не можете задать заголовок диалогового окна в самом ресурсе. Его нужно задавать через окно-рамку.

            • Стиль диалогового окна нужно задать как WS_VISIBLE (видимое), WS_CHILD (диалоговое окно), и без кнопок максимизации/минимизации, системных меню или любых других стандартных атрибутов окна-рамки.



            • Использование диалоговых блоков


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

              Тип Класс ObjectWindows
              Цвет TChooseColorDialog
              Шрифт TChooseFontDialog
              Открытие файла TFileOpenDialog
              Сохранение файла TFileSaveDialog
              Поиск строки TFindDialog
              Ввод от пользователя TInputDialog
              Диалог прерывания принтера TPrinterAbortDialog
              Управление принтером TPrintDialog
              Замена строки TReplaceDialog



              Использование DLL


              Ниже перечислены типичные формы командной строки, позволяющие использовать DLL-версии библиотек исполняющей системы Borland
              и описанные ниже библиотеки классов.
              Для 16-битовой компиляции и компоновки с использованием
              DLL-версии библиотеки исполняющей системы дайте команду:
              bcc -c -D_RTLDLL -ml source.cpp
              tlink -C -Twe c0w1 source, source, , import crtldll
              Обратите внимание на использование макрокоманды _RTLDLL и
              переключателя командной строки -ml. Для 32-битовой версии используются команды:
              bcc -c -D_RTLDLL source.cpp
              tlink32 -Tpe -ap c0x32 source, source, , import32 cw32i
              Для 16-битовой компиляции и компоновки с использованием
              DLL-версии библиотеки класса дайте команды:
              bcc -c -D_BIDSDLL -ml source.cpp
              tlink -C -Twe c0w1 source, source, , import bidsi crtldll
              Для 32-битовой компиляции и компоновки с использованием
              DLL-версии библиотеки класса дайте команды:
              bcc32 -c -D_BIDSDLL -ml source.cpp
              tlink32 -Tpe -ap c0x32 source, source,
              , import32 bidsfi cw32i


              Использование двоично-десятичной арифметики (BCD)


              Borland C++, также как и большинство прочих компьютеров и
              компиляторов, выполняет математические вычисления с числами в
              двоичном представлении (то есть в системе счисления с основанием
              2). Это иногда путает людей, привыкших исключительно к десятичной
              математике (в системе счисления с основанием 10). Многие числа с
              точным представлением в десятичной системе счисления, такие как
              0.01, в двоичной системе счисления могут иметь лишь приближенные
              представления.
              В большинстве прикладных программ двоичные числа предпочтительны, однако в некоторых ситуациях ошибка округления в преобразованиях между системами счисления с основаниями 2 и 10 нежелательна. Наиболее характерным случаем здесь являются финансовые
              или учетные задачи, где предполагается сложение центов. Рассмотрим программу, складывающую до 100 центов и вычитающую доллар:
              #include
              int i;
              float x =0.0;
              for (i = 0; i < 100; ++i)
              x += 0.01;
              x -= 1.0;
              print("100*.01 - 1 = %g\1",x);
              Правильным ответом является 0.0, однако ответ, полученный
              данной программой, будет малой величиной, близкой к 0.0. При вычислении ошибка округления, возникающая во время преобразования
              0.01 в двоичное число, накапливается. Изменение типа x на double
              или long double только уменьшает ошибку вычисления, но не устраняет ее вообще.
              Для решения этой проблемы Borland C++ предлагает специфический для C++ тип bcd (двоично-десятичный), объявленный в файле
              bcd.h. В случае двоично-десятичного представления число 0.01 будет иметь точное значение, а переменная x типа bcd даст точное
              исчисление центов.
              #include
              int i;
              bcd x = 0.0;
              for (i = 0; i < 100; ++i)
              x += 0.01;
              x -= 1.0;
              cout << "100*0.1 - 1 = " << x << "\n";
              При этом необходимо учитывать следующие особенности типа
              bcd:
            • bcd не уничтожает ошибку округления вообще. Вычисление типа 1.0/3.0 все равно будет иметь ошибку округления.

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

            • Числа типа bcd имеют точность представления около 17 разрядов и диапазон принимаемых значений от 1x10^-125 до 1x10^125.



            • Использование файлов подсказки


              При работе с большим числом операций или при многократном
              повторении определенного числа операций удобно пользоваться файлами подсказки. Файл подсказки представляет собой текстовый файл
              в обычном формате ASCII (который может быть создан с помощью редактора системы Borland C++), содержащий все команды утилиты TLIB
              или какую-то их часть. С помощью файлов подсказки вы можете создавать команды утилиты TLIB, размер которых превышает размер командной строки DOS (128 символов).
              Для использования файла подсказки "имя_маршрута", в любой
              позиции командной строки утилиты TLIB нужно задать @"имя_маршрута".
            • Файл подсказки может состоять из нескольких строк текста;
              чтобы показать, что за данной строкой следует еще одна, в
              конце текущей строки необходимо набить символ "логического
              И" (&).

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

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



            • Использование формирующих файлов


              Формирующий файл содержит описания и отношения, необходимые
              программе MAKE для поддержания самых последних версий ваших программ. Вы можете создавать столько формирующих файлов, сколько вам
              требуется и присваивать им произвольные имена; MAKEFILE представляет собой лишь имя, используемое по умолчанию, на которое ориентируется утилита MAKE, если при ее запуске имя формирующего файла
              не задано.
              Формирующий файл можно создать с помощью любого текстового
              редактора, который поддерживает формат ASCII, например, встроенного редактора интегрированной среды, редакторов Sрrint,
              MicroStar или SideKick. Все правила, описания и директивы завершаются концом строки. Если строка является слишком длинной, то вы
              можете продолжить ее на следующей строке, поместив на текущей
              строке в качестве последнего символа обратную косую черту (\).
              Для разделения соседних идентификаторов (например, при задании последовательностей) и для задания структурного отступа команд внутри правила следует пользоваться пробельными символами
              (пробелами и знаками табуляции). Формирующий файл может содержать комментарии, явные и неявные правила, макрокоманды и директивы.


              Использование элементов структуры


              В операторах встроенного ассемблера вы можете ссылаться на
              элементы структуры (используя формат "переменная.элемент_структуры"). При этом вы работаете с переменными и можете сохранять и
              получать значения элементов структур. Однако, можно также ссылаться на элемент структуры непосредственно по имени (без имени
              переменно). Такая ссылка имеет форму числовой константы. При этом
              константы приравниваются смещению (в байтах) от начала структуры,
              содержащей данный элемент. Рассмотрим фрагмент программы:
              struct myStruct {
              int a_a;
              int a_b;
              int a_c;
              } myA;
              myfumc()
              {
              ...
              asm {mov ax, WORD PTR myA.a_b
              mov bx, WORD PTR myA.a_c
              }
              ...
              }
              Этот фрагмент описывает структурный тип с именем myStruct с
              тремя элементами a_a, a_b, a_c. Первый оператор встроенного ассемблера перемещает значение, содержащееся в myA.a_b, в регистр
              AX. Второй перемещает значение по адресу [di]+offset(a_c) в регистр BX (он берет адрес, записанный в DI, и добавляет его к смещению a_c от начала myStruct). Оператор ассемблера даст следующий
              код:
              mov ax, DGROUP : myA+2
              mov bx, [di+4]
              Таким образом, если вы загружаете регистр (такой как DI) адресом структуры типа meStruct, то можете использовать имена элементов структуры для непосредственной ссылки на них. Имя элемента
              структуры можно использовать в любой позиции, где вы операторе
              языка ассемблера допускается числовая константа.
              Элементу структуры должна предшествовать точка. Она указывает, что это имя элемента структуры, а не обычный идентификатор
              Си. В выводе ассебмлера имена элементов структуры заменяются соответствующими числовым смещением элемента, а информация о типе
              не сохраняется. Такие элементы структуры могут использоваться в
              операторах ассебмлера в качестве констант этапа компиляции.
              Однако есть одно ограничение: если две используемые во
              встроенном ассебмлере структуры имеют элемент с одинаковыми именем, их нужно сделать различными. Укажите между точкой и именем
              элемента тип структуры в скобках (как в случае приведения типа),
              например:
              asm mov bx.[di].(struct tm)tm_hour


              Использование ключевого слова void.


              Тип void был введен в системы программирования Си в Начале 80-х
              годов. Он является стандартным согласно ANSI Си.
              В предыдущем разделе мы рассмотрели два случая использования
              ключевого слова void: первый - для обозначения пустого списка аргументов, второй - для указания типа функции, не возвращающей какое-либо значение. Рассмотрим еще два способа применения ключевого слова
              void: в качестве преобразователя типов и как часть определения указателя.
              В первом случае компилятор получает информацию о необходимости и
              проигнорировать какое-либо выражение:
              //Простейший случай использования ключевого слова void
              Более интересным является второй случай, когда void* используется как родовой указатель, т.е. может указывать на объекты любого типа. Однако его значение не может быть присвоено какому-либо другому
              указателю, так как компилятор не знает размер объекта на который ссылается void*. Рассмотрим несколько примеров:
              void *gp; //родовой указатель
              int *ip; // указатель на int
              char *cp; // указатель на char
              gp=ip; // корректное преобразование
              ip=gp; // -"-
              cp=ip // некорректное преобразование
              *ip=15; // корректное присваивание
              *ip=*gp; // некорректное присваивание
              Одним из основных способов применения этого типа являются применения этого типа являются формальные параметры. Функция из стандартной библиотеки memcpy, например, определена в string.h как:
              void*memcpy(voidf*s1, const void*s2, unsigned int n);
              Она копирует n символов из объекта, на который ссылается s2 в
              объект, на который указывает s1. Таким образом она работает с объектами любого типа.


              Если вы планируете использовать вашу


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

              на машинах с установленным математическим сопроцессором 80х87, то

              можно сэкономить около 10К памяти программы, опустив из нее логику автоматического определения присутствия процессора 80х87 и

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

              кода операций с плавающей точкой при наличии сопроцессора 80х87

              (или параметр компилятора режима командной строки -f87). Borland

              C++ в этом случае скомпонует вашу программу с библиотекой

              FP87.LIB (вместо EMU.LIB).


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


              Компиляторы BCC.EXE (компилирует 16-разрядные приложения) и
              BCC32.EXE (компилирует 32-разрядные приложения) работают одинако-
              во, но используют по умолчанию разные параметры. BCC можно ис-
              пользовать для передачи файлов TLINK или TASM. Общий синтаксис
              команды имеет вид:
              BCC [параметр [параметр...]] имя_файла [имя_файла]
              Чтобы увидеть список параметров, наберите просто BCC и нажмите Enter. Параметры в командной строке разделяются пробелами, и
              перед ними указывается символ - или /. Параметры командной строки
              переопределяют параметры, заданные в файле конфигурации.
              По умолчанию BCC компилирует файлы без расширений и файла с
              расширениями .CPP. Файлы с расширениями .C или с расширениями,
              отличными от .CPP, .ASM, .OBJ или .LIB компилируются как файлы
              Си.
              Некоторые параметры BCC и BCC32 задаются по умолчанию. Чтобы
              отключить эти параметры, наберите BCC -параметр-. По умолчанию
              BCC пытается выполнить компоновку с файлом определения модуля,
              имя которого совпадает с именем исходного файла. Можно использовать несколько файлов определения.


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


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


              Использование контейнеров


              Использование контейнеров с шаблонами позволяет вам построить приложение на основе стека (например, используя в качестве
              соответствующих структур вектора), что позволяет легко изменить
              реализацию связанного списка. Часто для этого требуется только
              изменить typedef. Например:
              // создать стек целых чисел, загрузить его и вывести содер-
              // жимое
              #include
              #include
              // описание контейнерных типов
              typedef TStackAsVector IntStack;
              int main()
              {
              IntStack intStack;
              for ( int i = 0; i < 10; i++ )
              intStack.Push( i );
              for ( i = 0; i < 10; i++ )
              cout << intStack.Pop() << " ";
              cout << endl;
              return(0);
              }
              Вывод будет следующим:
              9 8 7 6 5 4 3 2 1 0
              Таким образом реализуется стек значений int, а в качестве
              соответствующей FDS используется вектор. Если стек нужно реализовать с помощью списка, вы можете заменить typedef:
              typedef TStackAsList IntStack;
              Все остальное будет работать правильно. Однако, чтобы изменить это на косвенный контейнер, потребуется больше изменений:
              // создать стек целочисленных указателей, загрузить стек и
              // вывести содержимое
              #include
              #include
              // изменить typedef как обычно
              typedef TStackAsVector IntStack;
              int main()
              {
              IntStack intStack;
              for ( int i = 0; i < 10; i++ )
              intStack.Push( &i ); // воспринимает указатель
              for ( i = 0; i < 10; i++ )
              cout << *intStack.Pop() << " ";
              cout << endl;
              return(0);
              }
              Результат будет тот же.


              Использование макрокоманд


              При вызове макрокоманды в формирующем файле должен соблюдаться следующий формат:
              $(имя_макрокоманды)
              Круглые скобки должны использоваться во всех случаях вызова
              макрокоманд, даже в том случае, если имя макрокоманда состоит из
              единственной буквы (за исключением предопределенных макрокоманд).
              Данная конструкция - $(имя_макрокоманды) - называется вызовом
              макрокоманда.
              Когда утилита MAKE обнаруживает вызов макрокоманды, она заменяет ее на текст, раскрывающий макрокоманду (текст макрорасширения). Если текст макрорасширения не определен, то MAKE заменяет
              ее пустой (нулевой) строкой.


              Использование объектов диалоговых блоков


              Использование объектов диалоговых окон во многом аналогично
              использованию оконных объектов. Простыми диалоговыми окнами кратковременного вывода вы можете управлять в одной функции-элементе
              родительского окна, которая может конструировать, выполнять и
              уничтожать функцию-элемент.
              Использование объектов диалоговых окон требует следующих шагов:
            • построения объекта;

            • выполнения диалогового блока;

            • закрытия диалогового блока;

            • уничтожения объекта.



            • Использование объектов меню


              Класс TSystemMenu ObjectWindows позволяет вам модифицировать
              системное меню окна. Этот класс является производным от TMenu и
              отличается от него только конструктором, в аргументах которого
              указывается описатель окна и флаг. Если флаг имеет значение True,
              то текущее системное меню удаляется, и на его место помещается
              объект меню, представляющий немодифицированное меню. В случае
              False объект меню представляет текущее системное меню. Для работы
              с системным меню можно использовать все функции-элементы, наследуемые из TMenu.
              Для создания всплывающего меню, которое вы можете добавить к
              окну или существующей системе меню, можно использовать TPopupMenu. Этот производный от TMenu класс также отличается от него только конструктором. После создания всплывающего меню для вывода "свободно плавающего меню" можно использовать TrackPoupMenu.
              В ObjectWindows 2.0 для присваивания ресурсом меню используется функция AssignMenu, которая определяется в классе TFrameWindow и доступна в любом производном классе.


              Использование области списка классов


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


              Использование области трассировки сообщений


              По умолчанию WinSignt трассирует все сообщения и выводит их
              в области трассировки сообщений. Ограничить число трассируемых
              сообщений можно несколькими способами:
            • Выберите Message Selected Classes или Messages Selected
              Windows, затем выберите классы (в области списка классов)
              или окна (в области дерева окон).

            • Выберите Message All Windows.

            • Выберите Message Options, затем любую из 4 групп сообщений
              (см. таблицы). Выбор параметра All Messages запрещает от-
              дельные подгруппы и будет трассировать все сообщения.



            • Использование общих диалоговых блоков


              Общие диалоговые блоки инкапсулируют функциональные возможности общих диалоговых блоков Windows. Эти диалоговые блоки позволяют пользователю выбирать цвета, шрифты, имена файлов, параметры печати, находить и заменять строки и т.д. Вы можете строить, выполнять и уничтожать их.
              Каждый общий диалоговый блок имеет вложенный класс TData,
              который содержит некоторые служебные функции-элементы и данные,
              соответствующие каждому типу общего диалогового блока. Например,
              TChooseCologDialog:TData имеет функции-элементы для выбора цветов и массив цветов. Однако TData имеют два элемента, общих для
              всех вложенных классов TData. Элемент Flag представляет собой набор специальных флагов, управляющих внешним видом и поведением
              диалогового блока, а Error содержит код ошибки, которая происходит при обработке общего диалогового блока, или 0.
              Каждый класс общего диалогового блока имеет конструктор, которому передается указатель на объект родительского окна, ссылка
              на вложенный класс TData данного класса и дополнительные необязательные параметры, содержащие шаблон диалогового блока, строку
              заголовка и модуль принтера.
              После построения объекта общего диалогового блока его следует выполнить (если это режимный диалоговый блок) или создать (если он безрежимный). Создание выполняется с помощью функции Create, а выполнение - Execute. К безрежимным относятся типы Color,
              Font, File open, File save и Printer, а безрежимным - Find и
              Find/replace. Успешность выполнения Execute проверяется по возвращаемому значению.


              Использование оконных объектов


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


              Использование оверлеев


              Для создания программы с оверлейной структурой все ее модули
              должны компилироваться с включенным параметром компилятора -Y.
              Для того, чтобы сделать оверлейным конкретный модуль, его следует
              компилировать с параметром -Yo. (-Yo автоматически включает параметр -Y).
              Параметр -Yo распространяется на все модули и библиотеки,
              следующие за ней в командной строке компилятора BCC. Отменить ее
              можно, задав -Yo-. Эти два параметра являются единственными параметрами командной строки, которые могут следовать после имен файлов. Например, для того, чтобы сделать оверлейным модуль OVL.C,
              но не библиотеку GRAPHICS.LIB, можно использовать любую из следующих командных строк:
              BCC -ml - Yo ovl.c -Yo- graphics.lib
              или
              BCC -ml graphics.lib -Yo ovl.c
              Если при запуске компоновщика TLINK явно задана компоновка
              файла .EXE, то в командной строке компоновщика должен задаваться
              параметр /o.
              Предположим, вы хотите иметь оверлейную структуру в программе, состоящей из трех модулей: MAIN.C, O1.C и O2.C. Оверлеями
              должны являться модули O1.C и O2.C. (Программа MAIN.C содержит
              зависящие от текущего времени подпрограммы и обработчики прерываний и потому должна оставаться резидентной). Предположим, что
              данная программа использует модель памяти large.
              Следующая команда позволяет выполнить данную задачу:
              BCC -ml -Y main.c -Yo o1.c o2.c
              В результате получится выполняемый файл MAIN.EXE с двумя
              оверлеями.


              Использование переменных alias, как параметров


              Переменные alias используются как параметры к функциям, и
              обеспечивают новый путь передачи ссылок. Например,
              struct rect {
              int wd, ht;
              }; передача указателя
              V
              int area(rect &r)
              {
              return r.wd * r.ht;
              } ^
              - используем селектор вместо '->'
              Здесь нет нужды использовать '&'
              rect r; V
              int k = area(r);
              Struct rect {int wd, ht;
              };


              Использование Rescan


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


              Использование с ClassExpert Resource Workshop


              Resource Workshop используется как заданное по умолчанию
              средство просмотра сценария ресурсов (.RC). При запуске Resource
              Workshop из ClassExpert (щелчком правой кнопкой "мыши" или выбором Edit dialog или Edit menu) Resource Workshop автоматически
              загружает для данного приложения файл .RC.
              При использовании Resource Workshop с исходным кодом, сгенерированным AppsExpert, запускайте Resource Workshop из ClassExpert, так как Resource Workshop и ClassExpert при внесении изменений в проект обновляют другу друга. При запуске Resource Workshop он проверяет исходный код ресурса на наличие изменений и посылает обновления в ClassExpert.


              Использование Source Pool


              Source Pool - это набор узлов. Цель для них не строится, но
              их можно использовать при построении. Source Pool позволяет различным целям использовать общий набор исходного кода. Например, с
              помощью Source Pool можно создать два целевых приложения - 16- и
              32-разрядное. Подобные примеры вы можете найти проекте SRCPOOL.IDE в каталоге EXAMPLES\IDE\SRCPOOL.
              Наборы Source Pool могут содержать несколько файлов, которые
              можно копировать в проект по ссылке. Source Pool полезно использовать для нескольких проектов нужно назначить один стилевой шаблон Style Sheet.


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


              Чтобы использовать объекты проверки допустимости данных, вы
              должны сначала построить редактируемый управляющий элемент, затем
              объект проверки допустимости, и присвоить этот объект редактируемому управляющему элементу. Редактируемый управляющий элемент
              знает, в какие моменты нужно вызывать функции-элементы объекта
              проверки допустимости.
              Редактируемые управляющие элементы являются экземплярами
              класса TEdit. Так как объекты проверки допустимости не являются
              интерфейсными объектами, их конструкторы требуют только информацию, достаточную для задания критерия проверки допустимости. Каждый объект редактируемого управляющего элемента имеет элемент
              данных, указывающих на объект проверки допустимости. Полный пример, показывающий использование стандартных объектов проверки допустимости, вы можете найти в OWLAPI\VALIDATE.


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


              Параметры и файлы для компоновщика вы можете указать в командной строке компиляторов BCC и BCC32, указав явные расширения
              .OBJ и .LIB. BCC запускает TLINK с файлами C0WS.OBJ, CWS.LIB и
              IMPORT.LIB (модуль инициализации, библиотека исполняющей системы
              и библиотека импорта Windows). BCC32 запускает TLINK32 с файлами
              C0W32.OBJ, CW32.LIB и IMPORT32.LIB.


              Использование TOUCH.EXE


              Иногда требуется вызвать принудительную перекомпиляцию или
              построение целевого файла, даже если он еще не изменялся. Это
              можно сделать с помощью утилиты TOUCH, которая изменяет дату и
              время одного или более файлов на текущие дату и время, делая его
              (их) более новым, чем файлы, от которых он зависит.
              Вы можете также вынудить MAKE перестроить целевой файл, изменив один из файлов, от которых он зависит. Для этого наберите в
              командной строке:
              TOUCH имя_файла [имя_файла]
              После этого TOUCH обновляет дату и время создания файла.


              Использование управляющих элементов VBX


              Чтобы использовать в приложении ObjectWindows стандартные
              управляющие элементы VBX, нужно выполнить следующие шаги:
            • В функции OwMain вызовите перед функцией Run объекта приложения функцию VBXInit. После вызова функции Run объекта
              приложения вызовите функцию VBXTerm. В качестве параметра
              функции VBXInit задается экземпляр приложения.

            • Создайте производный класс, смешивающий интерфейс базового
              класса с TVbxEventHandler. Ваш базовый класс - это класс,
              в котором вы хотите выводить управляющий элемент. Если вы
              используете управляющий элемент в диалоговом окне, вам
              нужно смешать его с TDialog.

            • Постройте для родительского объекта таблицу реакции, включив в нее все соответствующие события из управляющего элемента. Используйте для этого макрокоманду EV_VBXEVENTNAME.

            • Создайте родительский объект управляющего элемента. Управляющий элемент можно построить управляющий элемент при
              создании родительского окна или позволить родительскому
              объекту самому построить управляющий элемент.



            • Использование утилиты DFA с файлом WINSPCTR.BIN


              При использовании файла WINSPCTR.BIN утилита DFA делает доступной следующую дополнительную информацию:
            • переменные в стеке, добавленные в файл регистрации, включая структуры и массивы;

            • для функции перечисляются типы переменных, значения и адреса.

            • При наличии файла отладчика .TDS для каждого кадра стека
              утилита DFA сообщает:
            • Секция 1:

            • исходный файл;

            • локальные переменные;

            • параметры.

            • Секция 2:

              • имя модуля для задачи, вызвавшей сбой;

              • имена файлов;

              • логические сегменты;

              • их сегменты;

              • где находятся их данные и код.
              • Секция 3:

                • глобальные переменные;

                • статические переменные;

                • их значения во время исключительной ситуации.
                  Синтаксис: DFA [параметр] WINSPCTR.LOG [WINSPCTR.BIN]

                • Необходим файл WINSPCTR.LOG. При его наличии вы получаете
                  информацию об исходном файле и номерах строк. При наличии файла
                  WINSPCTR.BIN (который не обязателен) вы получите дополнительную
                  информацию о переменной.

                  Параметр Действие
                  /O[выходной_файл] Переименовывает выходной файл (по умолчанию DFA.OUT).
                  /D Вынуждает DFA записывать шестнадцатиричный дамп сохраненных сегментов данных.



                  Использование утилиты DFA с WINSPCTR.LOG


                  При использовании только с файлом WINSPCTR.LOG утилита DFA
                  дает минимальную информацию трассировки стека, такую как адреса.
                  Когда в выполняемом файле или в отдельном файле присутствует информация отладчика (файл .TDS), к отчету добавляются имена исходных файлов и номера строк.


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


                  Если вы вызываете макрокоманду, для которой "имя_макрокоманды" еще не определено в формирующем файле или в командной строке,
                  утилита MAKE будет пытаться найти "имя_макрокоманды", как переменную операционной среды DOS. Если MAKE находит ее в операционной среде, то текстом макрорасширения будет значение этой переменной операционной среды.
                  Если не был задан параметр -e, то макрокоманды, определенные
                  в формирующем файле или в командной строке, переопределяют переменные операционной среды с тем же именем.


                  Использование WinSpector


                  Перед использованием WinSpector убедитесь, что TOOLHELP.DLL
                  (из Windows 3.1 или старше) задана в маршруте. Для надежности не
                  используйте параллельно с WinSpector других инструментальных
                  средств отладки (кроме Turbo Debugger). TOOLHELP.DLL - это библиотека Windows, которая обеспечивает для утилит доступ к системной информации нижнего уровня. WinSpector использует TOOLHELP.DLL
                  при возникновении исключительной ситуации для получения системной
                  информации, которая будет записана в файл регистрации.
                  Простейший способ использования WinSpector состоит в помещении его в секцию "load=" вашего файла WIN.INI file. До запуска
                  WinSpector будет минимизирована. Дополнительного взаимодействия с
                  ним не требуется. Есть и альтернативные способы, например, можно
                  также включить WinSpector в группу запуска Windows или дважды
                  щелкнуть "мышью" на пиктограмме WinSpector для запуска ее после
                  загрузки Windows.
                  В случае исключительной ситуации (UAE или GPF) WinSpector
                  создает отчет - текстовый файл WINSPCTR.LOG, а также двоичный
                  файл WINSPCTR.BIN, который с помощью утилиты DFA можно транслировать в текстовый файл DFA.OUT. В случае особой ситуации WinSpector выводит диалоговое окно с кратким описанием. Чтобы удалить
                  окно и прочесть файл регистрации, щелкните "мышью" на OK.


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



                  Макрокоманда Назначение
                  CHECK Выводит заданное в аргументе условие и генерирует исключительную ситуацию, если это условие равно 0. Используйте ее для проверки
                  значений в функции.
                  PRECONDITION Выводит заданное в аргументе условие и генерирует исключительную ситуацию, если это условие равно 0. Используйте ее для проверки
                  допустимости аргументов функции или проверки
                  корректности вызова функции.
                  TRACE Выводит заданное в аргументе сообщение. Используется для вывода общих сообщений, не зависящих от конкретного условия.
                  WARN Выводит заданное сообщение, если определенное
                  в аргументе условие не равно 0. Используется
                  для условного вывода сообщений.



                  Итераторы контейнера


                  Каждый контейнер имеет соответствующий класс итераторов, которые предназначены для итерации конкретного вида контейнера.
                  Например, итератор класса TArrayAsVector имеет соответствующий
                  итератор TArrayAsVectorIterator, который отвечает за итерацию по
                  всем элементам массива. Итератор контейнера реализуют для контейнера операции пред- и постинкрементации ++, а также функцию-элемент Current, возвращающую текущий объект, и функцию-элемент Restart, перезапускающую итерацию.


                  Изменение режима просмотра проекта


                  В окне проекта по умолчанию выводится имя проекта, цель и
                  зависимость файлов. Управлять выводом можно с помощью Options Enviroment.
                • Выберите Options Enviroment. Выведется диалоговое окно Enviroment Options.

                • Выберите Project View. Выведется список параметров.

                • Выберите или отмените нужные параметры:


                • Параметр Что выводится
                  Build translator Используемый для узла транслятор.
                  Code size Общий размер сегментов кода в байтах
                  (выводится после компиляции).
                  Data size Общий размер сегментов данных в байтах
                  (выводится после компиляции).
                  Description Описание узла.
                  Location Маршрут связанного с узлом исходного файла.
                  Name Имя узла.
                  Number of lines Число строк в связанном с узлом файле
                  (после компиляции кода).
                  Node type Тип узла.
                  Style Sheet Связанную с узлом таблицу стилей.
                  Output Именует файл, создаваемый узлом при его
                  трансляции.
                  Show runtime nodes Узел в администраторе проекта, используемый при построении проекта.
                  Show protect node Узел для всего проекта. Узел проекта
                  строится при выборе Project Build all.



                  Изучение ООП на маленьком примере


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


                  Явные и неявные правила


                  Явные и неявные правила, инструктирующие MAKE, в общем случае определяются следующим образом:
                • Явные правила дают MAKE инструкции для конкретных файлов.

                • Неявные правила дают MAKE инструкции, которым она следует,
                  когда не может найти явное правило.

                • Правило имеет следующий общий формат:
                  Строка зависимости
                  Команды
                  .
                  .
                  .
                  Строка зависимости для явных и неявных правил отличается, но
                  команды одни и те же. MAKE поддерживает несколько правил на одну
                  цель. После первого явного правила вы можете добавить файл, от
                  которого зависит цель, например:
                  Target1: dependent1 dep2 dep3 dep4 dep5
                  Target2: dep6 del7 del8
                  bcc -c $**


                  Экран пользователя


                  Экран пользователя показывает полный экран вывода вашей
                  программы. Этот экран имеет такой же вид, как при выполнении
                  программы без Turbo Debugger. Чтобы переключиться в этот экран,
                  выберите команду Window User Screen. Для возврата в экран отладчика нажмите любую клавишу.


                  Экспорт и импорт функций


                  Чтобы сделать функции DLL доступными для других приложений
                  (.EXE или других DLL), имена функций должны экспортироваться.
                  Чтобы использовать экспортированные функции, нужно импортировать
                  их мена. Экспорт функций выполняется двумя способами:
                • Создается файл определения модуля с секцией EXPORTS, в которой перечисляются все функции, используемые в других
                  приложениях. Это можно сделать с помощью инструментального
                  средства IMPDEF.

                • Перед именем каждой функции DLL, которая должна экспортироваться, можно указать ключевое слово _export (в определении функции). Кроме того, при построении или компоновке
                  DLL в IDE нужно выбрать корректный параметр генерации кода
                  или задать корректную командную строку компилятора.

                • Чтобы функция могла импортироваться другим приложением или
                  DLL, она должна описываться как экспортируемая из DLL. Вы должны
                  также указать компоновщику, что хотите импортировать эти функции.
                  Это можно сделать тремя способами:
                • Добавить в файл определения модуля секцию IMPORT и перечислить в ней каждую функцию DLL, которую будет использовать данный модуль.

                • Включить библиотеку импорта при компоновке модуля. IMPLIB
                  позволяет создать библиотеку импорта для одной или более
                  DLL.

                • Можно определить функцию с помощью ключевого слова _import
                  (только для 32-разрядных приложений).

                • Функции DLL не компонуются непосредственно с приложением
                  Windows. Они вызываются на этапе выполнения. Это означает, что
                  такие функции должны иметь дальний тип вызова (так как DLL будет
                  иметь другой сегмент кода). Используемые функцией DLL данные также должны иметь дальний тип.
                  Чтобы функцию можно было использовать в приложении, она
                  должна также компилироваться как доступная для экспорта и затем
                  экспортироваться. Для этого вы можете скомпилировать DLL так,
                  чтобы все функции в ней были экспортируемыми (параметр -WD), и
                  указать перед ними ключевое слово _export.
                  Если вы компилируете DLL с большой моделью памяти (дальний
                  код, дальне данные), то вам не нужно явным образом определять в
                  DLL дальний тип функции или ее данных.


                  Экспорт и импорт классов


                  Чтобы использовать в DLL классы, класс требуется экспортировать из DLL и импортировать в файл .EXE. Для этого можно использовать условное макроопределение. Например, в файл заголовка можно включить следующее:
                  #if defined (BUILD_DLL)
                  #define _MY_CLASS _export
                  #elif defined(USE_DLL)
                  #define _MY_CLASS _import
                  #else
                  #define _MY_CLASS
                  #endif
                  В своих определения определите классы следующим образом:
                  class _MY_CLASS class {
                  ...
                  };
                  При построении DLL определите BUILD_DLL (например, с помощью
                  параметра -D). Макрокоманда _MY_CLASS будет расширяться в _import. Определите _MY_DLL при построении файла .EXE, который будет
                  использовать DLL. Макрокоманда _MY_CLASS будет расширяться в _import.


                  Элементы данных



                  Head Tail Элементы перед первым и после последнего элемента списка.



                  Элементы данных



                  FileNull Представляет нулевой описатель файла.
                  O_RONLY, O_RDWR, O_WRONLY,
                  O_CREAT | O_TRUNC,
                  O_CREAT | O_EXCL, O_APPEND,
                  SH_COMPAT, SH_DENYNONE,
                  SH_DENYRD, SH_DENYWR, O_NOINHERIT
                  Режимы трансляции файла и совместного использования.
                  S_READ, S_WRITE, S_IREAD | S_WRITE Полномочия на чтение и запись.



                  Элементы данных



                  RefDate Минимальная допустимая дата (1 января 1901
                  года).
                  MaxDate Максимально допустимая дата для объектов TTime.



                  Элементы данных



                  CmdLine Указывает на копию аргументов командной строки, передаваемых при построении объекта данного класса.
                  cmdShow Указывает вывод окна в полный размер или в виде пиктограммы.
                  HAccTable Используется для обратной совместимости.
                  hPrevinstance Указатель на выполняемый ранее экземпляр приложения Windows.



                  Элементы данных



                  enum StockId Перечисляет атрибуты объекты кистей.
                  Stocks[] Единый статический массив перьевых объектов
                  Windows, обслуживающий все объекты TBrush.



                  Элементы данных



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



                  Элементы данных



                  TShadowStyle Перечисляет стили теней командной кнопки
                  enum (двойная или одинарная).
                  TState enum Перечисляет три позиции кнопки (нажата, отжата и в неопределенном состоянии).
                  TType enum Перечисляет типы командных кнопок (с зависимой или независимой фиксацией).
                  BitmapOrigin Указывает на координаты x и y битового массива для данной командной кнопки.
                  NotchCorners Инициализируется значением 1 и равно 1, если
                  кнопка не имеет скошенные углы.
                  Pressed Инициализируется 1 и равно 0 при нажатии кнопки.
                  Repeat Инициализируется 1 и хранит значения клавиатурных событий.
                  ResldСодержит идентификатор ресурса для битового
                  массива командной кнопки.
                  ShadowStyle Содержит стиль тени для кнопки (1 - одинарная
                  и 2 - двойная).
                  StateСодержит состояние кнопки (нажата, отжата, не
                  определено).
                  Type Содержит тип кнопки ( командная, с зависимой
                  или независимой фиксацией).
                  UIOBitmap Содержит связанный с кнопкой битовый массив



                  Элементы данных



                  Bitmap Указывает на битовый массив.
                  CSizeРазмер ячейки в массиве.
                  Offs Смещение верхнего левого угла ячейки массива
                  от верхнего левого угла битового массива.
                  ShouldDelete Равно True, если деструктор должен удалить битовый массив, связанный с массивом ячеек.



                  Элементы данных



                  GroupЕсли кнопка с независимой фиксацией принадлежит к групповому блоку (TGroupBox), то Group указывает на этот объект. Иначе это 0.



                  Элементы данных



                  adjustfield Эти константы используются в качестве второго
                  basefield параметра функции self. Они задают выравнива floatfield ние, систему счисления и формат числа.
                  seek_dir Направление установки в потоке.
                  open_mode Режим потоковой операции.
                  *pb Соответствующий streambuf.
                  x_fill Символ заполнения для вывода.
                  x_flags Битовые флаги форматирования.
                  x_precision Точность выводимых чисел с плавающей точкой.
                  state Текущее состояние streambuf.
                  *x_tie Связанный ostream (если он существует).
                  x_width Ширина поля при выводе.



                  Элементы данных



                  cc Содержит длину структуры TChooseColorDialog,
                  владельца данного диалогового окна и блок данных с шаблоном диалога. Указывает также на
                  массив из 16 RGB-значений.
                  Data Ссылка на переданный конструктору объект
                  TData.
                  SetRGBMsgId Содержит идентификатор переданного SetRGBColor
                  зарегистрированного сообщения.
                  DialogFunction Возвращает True, если сообщение обработано.
                  DoExecute Копирует флаги и цвета в Data и возвращает 0.
                  EvSetRGBColor Отвечает на переданное SetRGBColor сообщение (обработчик событий).



                  Элементы данных



                  ColorЭлемент структуры TData, задающий цвет, выбранный при создании диалогового окна, и содержащий выбор пользователя при его закрытии.
                  CustColors Указывает на массив из 16 цветов (элемент
                  TData).
                  ErrorОшибка, содержащая один из кодов CommDlgExtendedError.
                  FlagsСочетание констант API Windows.



                  Элементы данных



                  cf Содержит атрибуты шрифтов, которые ObjectWindows передает функции API Windows Closefont.
                  Data Ссылка на переданный в конструкторе объект
                  TData.
                  ColorУказывает (в структуре ChooseFontDialog) цвет
                  шрифта при создании диалогового окна или выбранный пользователем цвет.
                  DC Описатель контекста устройства для получения
                  шрифтов (в ChooseFontDialog).
                  ErrorСодержит коды ошибок (в ChooseFontDialog).
                  FlagsКомбинация констант API Windows (в ChooseFontDialog).
                  LogFont Атрибуты шрифта (в ChooseFontDialog).
                  PointSize Размер шрифта в пунктах (в ChooseFontDialog).
                  PointType Тип шрифта или имя.
                  StyleСтиль шрифта - жирный, наклонный и т.д. (в
                  ChooseFontDialog).
                  SizeMax Максимальный размер шрифта.
                  SizeMin Минимальный размер шрифта.



                  Элементы данных



                  DefaultProtocol Указывает на строку, определяющую имя необходимого клиентам протокола.
                  IsOpen Возвращает True, если буфер Clipboard открыт.
                  TheClipboard Защищенный элемент данных.



                  Элементы данных



                  HWndNext Задает следующее окно в цепочке просмотра буфера Clipboard.



                  Элементы данных



                  BlackСтатический объект TColor c фиксированным значением Value, установленным RGB(0,0,0).
                  Gray Содержит статический объект TColor c фиксированным значением Value, установленным в RGB(128,128,128).
                  LtBlue Содержит статический объект TColor c фиксированным значением Value, установленным в RGB(0,0,255).
                  LtCyan Содержит статический объект TColor c фиксированным значением Value, установленным в RGB(0,255,255).
                  LtGray Содержит статический объект TColor c фиксированным значением Value, установленным RGB(192,192,192).
                  LtGreen Содержит статический объект TColor c фиксированным значением Value, установленным в RGB(0,255,0).
                  LtMagenta Содержит статический объект TColor c фиксированным значением Value, установленным в RGB(255,0,255).
                  LtRedСодержит статический объект TColor c фиксированным значением Value, установленным в RGB(255,0,0).
                  LtYellow Содержит статический объект TColor c фиксированным значением Value, установленным в RGB(255,255,0).
                  WhiteСодержит статический объект TColor c фиксированным значением Value, установленным в RGB(255,255,255).
                  ValueЗначение цвета для данного объекта TColor.



                  Элементы данных



                  TTextLen Содержит длину текста в соответствующем редактируемом управляющем элементе комбинированного блока.



                  Элементы данных



                  ItemDatas Массив для передачи в блок списка соответствующего комбинированного блока или из него.
                  Selection Указывает на текущую выделенную строку для передачи в комбинированный блок или из него.
                  Selindex Индекс выделенного элемента в строковом массиве.
                  Strings Массив строк класса для передачи в соответствующий блок списка комбинированного блока или из него.



                  Элементы данных



                  CDTitle Содержит необязательный заголовок диалогового
                  окна.



                  Элементы данных



                  Control Указывает на управляющее окно, с которым работает TControlGadget.



                  Элементы данных



                  bp Указатель на буфер потока.
                  state Флаги состояния формата.



                  Элементы данных



                  enum Флаг для управления удалением объекта GDI в
                  TAutoDelete деструкторе.
                  Handle Описатель Windows данного DC.
                  OrgBrush Описатель первоначального объекта кисти GDI.
                  При выборе новой кисти содержит первоначальный
                  объект кисти.
                  OrgFont Описатель первоначального объекта шрифта GDI.
                  При выборе нового шрифта содержит первоначальный объект шрифта.
                  OrgPalette Описатель первоначального объекта палитры GDI.
                  При выборе новой палитры содержит первоначальный объект палитры.
                  OrgPen Описатель первоначального объекта пера GDI.
                  При выборе нового пера содержит первоначальный
                  объект пера.
                  OrgTextBrush Описатель первоначального объекта текстовой
                  кисти GDI. При выборе новой текстовой кисти
                  содержит первоначальный объект текстовой кисти.
                  ShouldDelete Устанавливается в True, если описатель данного
                  объекта должен удаляться деструктором.



                  Элементы данных



                  MenuItemId Задает идентификатор элемента меню.
                  TrackMenuSelection Определяет, должен ли быть видимым выбор в меню и статус справки.



                  Элементы данных



                  Attr Содержит атрибуты создания диалога.
                  IsModal Равно True для режимного диалогового окна и False для безрежимного.



                  Элементы данных



                  Name Содержит идентификатор диалогового ресурса.
                  ParamСодержит параметр, передаваемый в диалоговое
                  окно при его создании.



                  Элементы данных



                  Bits Указывает на блок памяти, идентифицируемый Info.
                  H Высота объекта DIB в элементах изображения.
                  Info Блокирует блок глобальной памяти.
                  IsCore Устанавливается в True, если данных DIB старого типа использует заголовки ядра.
                  Mode Если Mode равен DIB_RGB_Colors, таблица цветов содержит 4-байтовые записи RGB. Если Mode равен DIB_PAL_COLOR, таблица цветов содержит двухбайтовые индексы в некоторой другой палитре.
                  NumClrs Число цветов, связанных с данным DIB.
                  W Ширина объекта DIB в элементах изображения.



                  Элементы данных



                  DocList Содержит список подключенных документов или 0,
                  если документ не существует.



                  Элементы данных

                  .

                  InitDoc Вызывается только из подклассов для продолжения обработки CreateDoc.
                  InitView Вызывается только из подклассов для продолжения обработки CreateDoc.


                  Элементы данных



                  ChildDoc Список связанных с данным документом дочерних
                  документов.
                  Property enum Значения определенных для TDocument характеристик, доступных в производных классах.
                  Tag Содержит указатель на данные, определенные
                  приложением.
                  DirtyFlag Указывает, что в документ внесены не сохраненные изменения.



                  Элементы данных



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



                  Элементы данных



                  SearchCmd Содержит идентификатор команды поиска, которая
                  открывает диалоговое окно.
                  SearchData Эта структура определяет строку искомого текста, строку текста замены и размер текстового
                  буфера.
                  SearchDialog Содержит информацию диалогового окна поиска
                  или замены и установки кнопок с независимой
                  фиксацией.
                  Constructor Строит на основе заданного родительского окна,
                  идентификатора ресурса и строки символов объект TEditSearch.
                  CmdEditFind В ответ на поступившую команду Find открывает
                  TFindDialog.
                  CmdEditFindNext В ответ на поступившую команду FindNext вызывает DoSearch для повторения операции поиска.
                  CmEditReplace В ответ на поступившую команду Find открывает
                  TReplaceDialog.
                  DoSearch На основе информации в SearchData выполняет
                  операцию поиска или замены.
                  EvFindMsg Отвечает на сообщение, посылаемое безрежимным
                  диалогом поиска или замены.
                  SetupWindow Посылает сообщение CM_EDITFIND или CM_EDITREPLACE или заменяет безрежимное диалоговое окно.



                  Элементы данных



                  KeyData Класс, переданный в шаблон пользователем.
                  ValueData Значение класса, переданного в шаблоне пользователем.



                  Элементы данных



                  Origin Содержит позицию файла в начале вывода.



                  Элементы данных



                  FHdl Содержит описатель открытого файла документа.



                  Элементы данных



                  Data Ссылка не переданный в конструкторе объект
                  TData.
                  fr Содержит атрибуты поиска и замены.



                  Элементы данных



                  enum TStockld Перечисляет стандартные шрифты.
                  Stock[] Единый статический массив стандартных шрифтов
                  Windows, обслуживающий все объекты TFont.
                  Constructor Создает объект TFont и устанавливает элемент
                  данных Handle в заданный указатель.
                  GetObject Получает информацию о данном объекте пера и
                  помещает его в заданную структуру LOGFONT.
                  GetStock Обеспечивает доступ к объектам шрифтов Windows.
                  operator HFONT() Оператор приведения типа, преобразующий описатель шрифта к типу HFONT.



                  Элементы данных



                  KeyboardHandling Указывает, требуется ли перемещение с помощью клавиатуры.
                  ClientWnd Указывает на клиентное окно рамки.
                  DocTitleIndex Содержит индексный номер заголовка документа.
                  HWndRestoreFocus Сохраняет описатель дочернего окна, которое
                  снова становится активным.



                  Элементы данных



                  Clip В случае значения False отсечение границ выполняться не будет. В противном случае каждый
                  реквизит ограничивается границей реквизита.
                  TBorders struct Содержит значения левого, правого, верхнего и
                  нижнего измерения реквизита.
                  TBorderStyle Перечисляет различные стили границы.
                  enum
                  TMargins struct Используется классами TGadgetWindow и TGadget
                  и содержит размеры полей реквизита.
                  WideAsPossible Указывает, будет ли ширина реквизита настраиваться окном реквизита и иметь максимальное
                  значение.



                  Элементы данных



                  AtMouse Последний реквизит в позиции "мыши".
                  BkgndBrush Цвет фоновой кисти.
                  Capture Указывает на реквизит, для которого задан перехват сообщений "мыши", или 0.
                  Direction Направление вывода (без перекрытия) - горизонтально или вертикальное.
                  DirtyLayout Указывает на изменение схемы и необходимость
                  повторного вывода реквизитов.
                  Font Указывает на шрифт, используемый для вычисления единиц разметки.
                  FontHeight Содержит высоту шрифта окна реквизита.
                  Gadgets Указывает на первый реквизит в списке реквизитов.
                  HintMode Содержит текстовый режим подсказки.
                  Margins Содержит значения полей реквизитного окна.
                  NumGadgets Число реквизитов в окне.
                  ShrinkWrapHeight В случае значения True все окна будут сокращаться по ширине для размещения самого высокого реквизита для горизонтально выводимых реквизитов.
                  ShrinkWrapWidth В случае значения True все окна будут сокращаться по ширине для размещения самого широкого реквизита для горизонтально выводимых реквизитов.



                  Элементы данных



                  IsHorizontal Устанавливает соответствующий аргумент конструктора, задающий вывод горизонтального управляющего элемента.
                  LedSpacing Содержит целочисленное (в единицах измерительного элемента) интервала между отметками этого
                  элемента.
                  LedThick Содержит толщину риски измерительного элемента.
                  Max Содержит максимальное значение (в единицах измерительного элемента), которое выводится в
                  элементе.
                  Min Содержит минимальное значение (в единицах измерительного элемента), которое выводится в
                  элементе.
                  Margin Ширина и высота обрамления измерительного элемента.
                  Value Текущее значение измерительного элемента.



                  Элементы данных



                  Handle Описатель GDI данного объекта.
                  ShouldDelete Устанавливается в True, если деструктору требуется удалить объект GDI с данным описателем.



                  Элементы данных



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



                  Элементы данных



                  Data Вектор, содержащий данные очереди. Left Индекс левого элемента самого левого элемента
                  очереди. Right Индекс левого элемента правого левого элемента очереди.

                  Элементы данных



                  buffer Указатель на буфер, содержащий получаемый от
                  пользователя текст.
                  BufferSize Содержит размер буфера, возвращающего вводимые
                  пользователем данные.
                  prompt Указывает на подсказку, выводимую в диалоговом
                  окне ввода.



                  Элементы данных



                  TModeIndicator Подтип индикаторов режима, поддерживаемых
                  TStatusBar и TKeyboardMode.
                  Modes Один или более индикаторов режима клавиатуры,
                  который вы хотите отслеживать в программе.



                  Элементы данных



                  MyEdge Содержит имя окна или ограничения размера.
                  OtherEdge Содержит имя края окна и ограничение размера.
                  Relationship Задает тип соотношений между двумя окнами.
                  RelWin Указатель на братские окна или ImParent, если
                  дочернее окно имеет пропорции родительского
                  окна.
                  Units Перечисляет единицы измерения (элементы
                  изображения или единицы разметки), используемые для измерения высоты и ширины окон.
                  union TLayoutConstraint Это объединение включает в себя соглашение по наименования ограничений разметки.



                  Элементы данных



                  Height Содержит ограничение высоты и нижнего края окна.
                  Width Содержит ограничение ширины или правого края
                  окна.
                  X Содержит ограничение X окна (левый, центр,
                  правый).
                  Y Содержит ограничение Y окна (верхний, центр,
                  нижний).



                  Элементы данных



                  ClientSize Содержит размер клиентной области.



                  Элементы данных



                  ItemDatas Содержит все элементы данных для каждого элемента блока списка.
                  SetCount Содержит число выделенных элементов.
                  SelIndices Содержит индексы всех выделенных строк в блоке
                  списка с множественным выделением.
                  SelStrings Указывает на массив строк, выделяемых при передаче данных в блоке списка.
                  Strings Указатель на массив строк, передаваемых в
                  TListBox.



                  Элементы данных



                  DirtyFlag Не равен 0, если данные в отображаемом элементе списка изменились.
                  MaxWidth Содержит максимальную горизонтальную протяженность (число элементов изображения, на которые
                  отображаемый элемент можно прокручивать горизонтально).
                  Origin Содержит позицию файла в начале вывода.



                  Элементы данных



                  ClientAttr Содержит указатель на структуру с атрибутами
                  клиентного окна MDI.



                  Элементы данных



                  ChildMenuPos Содержит позицию в меню верхнего уровня окна
                  MDI подменю дочернего окна.



                  Элементы данных



                  OrgBitMap Исходный выбранный для данного DC битовый массив.



                  Элементы данных

                  HashTable Реализует лежащую в основе таблицу хеширования.


                  Элементы данных



                  Handle Содержит описатель меню.
                  ShouldDelete Устанавливается в True, если деструктор долен удалять описатель меню.



                  Элементы данных



                  Id Идентификатор ресурса меню.
                  GroupCount[NumGrups] Массив значений, указывающий число всплывающих меню в каждой группе строки меню.



                  Элементы данных



                  Highlightline Имеет значение True, если рисуется подсвеченная строка.



                  Элементы данных



                  IpCmdLine Эта строка с завершающий нулем указывает на
                  копию аргументов командной строки, переданных
                  при загрузке модуля.
                  Module Содержит глобальный указатель на текущий модуль.
                  Status Содержит статус модуля.
                  HInstance Содержит выполняемый экземпляр приложения Windows или модуля DLL.
                  Name Содержит имя приложения или модуля DLL.



                  Элементы данных



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



                  Элементы данных



                  CustomFilter Содержит заданный пользователем фильтр файла.
                  DefExt Содержит используемое по умолчанию расширение.
                  Error Содержит код ошибки.
                  Flags Содержит одну или более констант флагов API
                  Windows.
                  Filename Содержит имя сохраненного или открытого файла.
                  Filter Содержит фильтр, первоначально используемый
                  для вывода имен файлов.
                  FilterIndex Указывает, какой фильтр первоначально используется для вывода имен файлов.
                  InitialDir Содержит каталог, первоначально используемый
                  при выводе на экран имен файлов.



                  Элементы данных



                  Ps Структура отображения, связанная с данным объектом TPaintDC.



                  Элементы данных



                  enum TStockIdd Перечисляет атрибуты стандартной палитры.
                  Stock[] Единый статический массив стандартных палитр
                  Windows, обслуживающий все объекты TPalette.



                  Элементы данных



                  enum TStockId Перечисляет стандартные перья Windows.
                  Stock[] Единый статический массив стандартных перьевых
                  объектов Windows, обслуживающий все объекты
                  TPen.



                  Элементы данных



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



                  Элементы данных



                  PageNum Число страниц, выводимых в окне предварительного просмотра.
                  PrintDC Описатель используемого для печати контекста
                  устройства.
                  PrintExtent Содержит размеры страницы в логических единицах.
                  Printout Ссылка на объект TPrintout.



                  Элементы данных



                  DOCINFO Содержит имена входных и выходных файлов, используемых TPrintDC::StartDoc().



                  Элементы данных



                  Data Ссылка на передаваемых в конструкторе объект
                  TData.
                  pd Задает диалоговое окно характеристик заданий
                  печати, контекст устройства и т.д.



                  Элементы данных



                  Copies Указывает число печатаемых копий.
                  Error Содержит один или более кодов ошибки.
                  FromPage Указывает начало печатаемой страницы.
                  MaxPage Указывает максимальное значение для начальной
                  конечной печатаемой страницы.
                  MinPage Указывает минимальное значение для начальной
                  и конечной печатаемой страницы.
                  ToPage Указывает конечную печатаемую страницу.



                  Элементы данных



                  CurrentPreviewFont Текущий шрифт области просмотра.
                  PrnDC Содержит ссылку на DC принтера.
                  PrnFont Текущий шрифт принтера.



                  Элементы данных



                  Data Ссылка на структуру данных TPrintDialog с информацией о заданных пользователем параметрах печати.
                  Error Код ошибки, возвращаемый GDI при печати. Это
                  значение инициализируется при вызове Print.



                  Элементы данных



                  Banding В случае значения True распечатка содержит зоны, и функция PrintPage вызывается для каждой зоны.
                  DC Используемый для печати описатель контекста
                  устройства.
                  ForceAllBands При установке в True (по умолчанию) обеспечивает все зоны, независимо от вызовов PrintPage. Если PrintPage выводит только текст, то
                  лучше установить False.
                  PageSize Размер области печати для страницы распечатки.
                  Title Текущий заголовок распечатки. Выводится в окне
                  Abort и в Print Manager.



                  Элементы данных



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



                  Элементы данных



                  Max Максимально допустимое для редактируемого управляющего элемента значение.
                  Min Минимально допустимое значение.



                  Элементы данных



                  enum TEllipse Определяет константу Ellipse, используемую тото, чтобы отличить конструктор эллипса от
                  конструктора копирования прямоугольника.



                  Элементы данных



                  Head Начальный элемент двусвязанного списка.
                  Tail Конечный элемент двусвязанного списка.



                  Элементы данных



                  Dispatcher Абстрактный тип диспетчера, указывающий на одну из функций диспетчера.
                  Id Содержит ресурс меню или оперативной клавиши
                  для функции реакции на сообщения.
                  Msg Содержит идентификатор сообщения.
                  NotifyCode Содержит код уведомления для записи таблицы
                  реакции (код кнопки, комбинированного элемента, редактируемого управляющего элемента или блока списка).
                  Pmf Указывает на обработчик сообщения или функцию-элемент.
                  T Тип общей функции-элемента, отвечающей на уведомляющие сообщения.



                  Элементы данных



                  LineMagnitude Это число единиц диапазона для прокрутки на
                  небольшую величину при щелчке "мышью" на
                  стрелке полосы прокрутки.
                  PageMagnitude Число единиц диапазона для прокрутки полосы
                  при большом перемещении (щелчок "мышью" на областях полосы прокрутки).



                  Элементы данных



                  HighValue Содержит максимальное значение позиции скользящего маркера полосы прокрутки.
                  LowValue Содержит минимальное значение позиции скользящего маркера полосы прокрутки.
                  Position Содержит позицию скользящего маркера.



                  Элементы данных



                  AutoMode В случае значения True активизируется автоматическая прокрутка.
                  AutoOrg В случае True прокрутка смещается относительно
                  начала.
                  HasHScrollBar В случае значения True элемент прокрутки имеет
                  горизонтальную прокрутку.
                  HasVScrollBar В случае значения True элемент прокрутки имеет
                  вертикальную прокрутку.
                  TrackMode Имеет значение True при активизации слежения.
                  Window Указывает на окно, с клиентной областью которого должен работать элемент прокрутки.
                  XLine, YLine Задает число логических единиц устройства на
                  строку для прокрутки прямоугольника в горизонтальном и вертикальном направлениях.
                  XPage, YPage Задает число логических единиц устройства на
                  страницу для прокрутки прямоугольника в горизонтальном и вертикальном направлениях.
                  XPos,YPos Задает текущую позицию прямоугольника в горизонтальных и вертикальных единицах прокрутки?.
                  XRange,YRange Задает число горизонтальных и вертикальных
                  единиц прокрутки.
                  XUnit,YUnit Задает величину прокрутки прямоугольника в горизонтальном и вертикальном направлениях.



                  Элементы данных



                  BkColor Значение фонового цвета скользящего маркера.
                  CaretRect Позиция прямоугольника активного окна.
                  Max Максимальное значение позиции скользящего маркера.
                  Min Минимальное значение позиции скользящего маркера.
                  MouseOffset Используется при перемещении "мыши" вниз и
                  движении маркера.
                  Pos Указывает, где позиционирован скользящий маркер.
                  Range Содержит разницу между максимальным и минимальным диапазоном скользящего маркера.
                  SlideDC Используется при перемещении "мыши" вниз и
                  движении маркера.
                  Sliding Имеет значение True при перемещении маркера.
                  SlotThick Указывает толщину области перемещения маркера.
                  Snap True, если действует ограничение позиции.
                  ThumbRect Содержит ограничивающий прямоугольник скользящего маркера.
                  ThumbResId Битовый массив для скользящего маркера.
                  ThumbRgn Ссылка на область, которая определяет форму
                  скользящего маркера.
                  TicGap Задает интервал между рисками в элементах изображения.



                  Элементы данных



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



                  Элементы данных



                  operator= Устанавливает код состояния и отбрасывает
                  исключительную ситуацию TXCompatibility.
                  operator Возвращает код состояния.



                  Элементы данных



                  TModeIndicator enum Перечисляет программные режимы. По умолчанию
                  они упорядочиваются в строке состояния горизонтально слева направо.
                  BorserStyle Один из перечислимых стилей обрамления индикаторов режима в строке состояния.
                  ModeIndicators Это битовое поле указывает, какие индикаторы
                  режима создаются в строке состояния.
                  NumModeIndicators Задает число индикаторов режима (от 1 до 5).
                  Spacing Задает интервал между индикаторами в строке
                  состояния.



                  Элементы данных



                  OpenMode Содержит флаги режимов, используемых при открытии потоков документов.
                  StreamName Содержит имя потока, использованного для открытия документов.
                  Doc Содержит документ, являющийся владельцем потока.
                  NextStream Указывает на следующий поток в списке открытых
                  потоков.



                  Элементы данных



                  Strings Указывает на набор строк, содержащих все допустимые строки (если задается NULL, то разрешаются все строки).



                  Элементы данных



                  data Содержащийся в списке объект данных.
                  Next Указатель на следующий элемент списка.



                  Элементы данных



                  TAlign Перечисляет атрибуты выравнивания текста.
                  Align Атрибут выравнивания текста.
                  NumChars Содержит число символов текста.
                  TextLen Содержит длину текста.



                  Элементы данных



                  Border Тонкая рамка для разделителей.
                  CaptionHeight Высота строки заголовка.
                  CaptionFont Шрифт, используемый для текста в тонкой строке
                  заголовка.
                  CloseBox В случае значения True окно будет закрываться
                  при щелчке "мышью" на блоке закрытия.
                  DownHit Адрес точки нажатия кнопки "мыши" или перемещения курсора.
                  Frame Фактические размеры строки заголовка.
                  isPressed Имеет значение True при нажатии кнопки "мыши".
                  TCEnabled Равно True, если выводится тонкая строка заголовка.
                  WaitingForSysCmd Равно True, если TTinyCaption может принять
                  системные сообщения.



                  Элементы данных



                  NumColumns Содержит число столбцов в полосе инструментальных средств.
                  NumRows Число строк.



                  Элементы данных



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



                  Элементы данных



                  Property enum Значения характеристик, определенные для TView
                  и доступные в производных классах.
                  Tag Содержит указатель на определяемые приложением
                  данные.
                  Doc Содержит текущий документ.
                  NotOK Устанавливает отображаемый элемент в недопустимое состояние (IsOK будет возвращать 0).



                  Элементы данных



                  Attr Содержит структуру TWindowAttr с атрибутами
                  создания окна (стиль окна, расширенный стиль,
                  позиция, размер, идентификатор меню, идентификатор дочернего окна и таблицу оперативных
                  клавиш меню).
                  DefaultProc Содержит адрес используемой по умолчанию оконной процедуры, которая вызывается для обработки сообщений Window, не обрабатываемых приложением.
                  HWindow Содержит описатель соответствующего окна Windows.
                  Parent Указывает на интерфейсный объект, который используется в качестве родительского окна.
                  Scroller Указывает на интерфейсный объект - элемент
                  прокрутки окна.
                  Status Сигнализирует об ошибке при инициализации интерфейсного объекта.
                  Title Указывает на заголовок окна.
                  CursorInstance Содержит идентификатор библиотеки для заданного курсора.
                  CursorResId Содержит идентификатор ресурса курсора для заданного курсора.
                  hAccel Содержит описатель текущей таблицы акселераторов Windows.
                  hCursor Содержит описатель курсора окна.
                  TransferBuffer Указывает на буфер передачи данных в TWindow и
                  из него.



                  Элементы данных



                  Window Указывает на объект окна, связанный с данной
                  исключительной ситуацией.



                  Элементы данных



                  AccelTable Содержит идентификатор ресурса для таблицы акселераторов окна.
                  ExStyle Содержит расширенные значения стиля окна.
                  Id Содержит идентификатор дочернего окна или
                  идентификатор ресурса для управляющего элемента диалогового окна.
                  Menu Содержит идентификатор ресурса, представляющий
                  собой имя меню окна.
                  Param Содержит значение, передаваемое окну при его
                  создании.
                  Style Содержит значения, определяющие стиль, форму и
                  размер окна.
                  X,Y,W,H Содержат координаты верхнего левого угла окна,
                  а также его ширину и высоту.



                  Элементы данных



                  Wnd Содержит описатель окна, владельцем которого
                  является данный DC.



                  Элементы данных



                  openprot Заданная по умолчанию защита файла. Определяет разрешение чтения из файла и записи в файл.



                  Элементы изображения и палитры


                  Графический экран представляет собой массив элементов изображения. Каждый элемент изображения соответствует одной (цветной)
                  точке на экране. Значение элемента изображения не задает точный
                  цвет этой точки напрямую; на самом деле это некоторый индекс таблицы цветов, называемой палитрой. Каждый элемент палитры, соответствующий данному значению элемента изображения, содержит точную информацию о цвете, которым будет отображен этот элемент
                  изображения.
                  Такая схема косвенных обращений имеет множество следствий.
                  Хотя аппаратное обеспечение может позволять отображение множества
                  цветов, одновременно на экране может находиться только некоторое
                  их подмножество. Количество одновременно находящихся на экране
                  цветов равно числу элементов палитры (размеру палитры). Например,
                  EGA позволяет наличие 64 цветов, но лишь 16 из них может находиться на экране сразу; таким образом, размер палитры EGA равен 16.
                  Размер палитры определяет диапазон значений, которые может
                  принимать элемент изображения, от 0 до (размер-1). Функция
                  getmaxcolor возвращает максимальное допустимое значение элемента
                  изображения (размер-1) для текущего графического драйвера и режима.
                  При обсуждении графических функций Borland C++ мы часто используем термин "цвет", например текущий цвет вычерчивания, цвет
                  заполнения и цвет элемента изображения. Фактически цветом мы
                  здесь называем значение элемента изображения: это некоторый индекс в палитре. Только палитра реально определяет фактический
                  цвет на экране. Манипулируя палитрой, вы можете изменять фактические цвета, выводимые на дисплей, даже хотя значения элементов
                  изображения (цвета вычерчивания, заполнения и т.д.) могут не изменяться.


                  Элементы классов


                  Вообще, в классах могут объявляться элементы типа public,
                  private и protected (общие, приватные, и защищенные - детальные разъяснения смотрите в следующем разделе). Эти элементы могут быть другими объектами из других классов и функциями элементами:
                  Ключевое слово сlass
                  Имя класса (как правило, осмысленное)
                  v v
                  class shape {
                  private: // Ключевое слово private
                  Элемент > int init_flag; // Приватный элемент
                  данных protected: // Ключевое слово protected
                  Элементы > double xo, yo; // Защищенные элементы
                  данных public: // Ключевое слово public
                  Функции -> void init(double x, double y); // Общие
                  элементы -> double area(void); // элементы
                  };
                  Имя класса shape можно использовать точно так же, как и имя
                  обычного типа данных в Cи. Например, можно сделать следующее объявле-
                  ние для массивов:
                  shape Times[10]; // объявление массива shape из 10 элементов


                  Этот параметр предназначен для программ,


                  По умолчанию в Borland C++ устанавливается параметр генерации кода "эмуляция" (параметр компилятора режима командной строки

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

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

                  80х87 не установлен.

                  В случае параметра эмуляции компилятор генерирует код, как

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

                  библиотеку эмуляции операций с плавающей точкой (EMU.LIB). При

                  выполнении такой программы сопроцессор 80х87, если он установлен,

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

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

                  обеспечение, эмулирующее процессор 80х87.


                  Этапы инсталляции


                  Программа инсталляции Borland С++ устанавливает сам продукт
                  С++ (IDE, инструментальные средства режима командной строки, ObjectWindows, Turbo Debugger), а также Win32s (что позволяет выполнять 32-разрядные программы в 16-разрядной Windows). Программа
                  инсталляции работает под Windows, Win32s и Windows NT (однако под
                  Windows NT работают не все программы).
                  Перед инсталляцией нужно убедиться, что ваш компьютер отвечает требованиям к программному и аппаратному обеспечению. Чтобы
                  инсталлировать Borland С++ с дискет, сделайте следующее:
                • Вставьте диск 1 в дисковод A или B.

                • Запустите Windows и выберите в администраторе программ команду File Run.

                • Наберите a:\install или b:\install и нажмите Enter. Выводится диалоговое окно инсталляции. В нижней части этого окна вы увидите объем необходимого для полной установки
                  пространства на диске (Target Requirements), а также объем
                  доступного пространства на диске. Если используется компрессия диска, прочитайте файл INSTALL.TXT (возможно, вам
                  потребуется больше места).

                • Если вы хотите установить конкретные файлы, щелкните
                  "мышью" на кнопке Customize BC4.0 Installation. Выведется
                  другое диалоговое окно с описаниями и командными кнопками
                  для установки компонентов продукта. Щелкните "мышью" на
                  том компоненте, который хотите установить. Выводится дополнительное диалоговое окно, в котором вы можете отметить
                  файлы, не требующие установки. Щелкните на OK и повторите
                  этот процесс для всех необходимых компонентов. Щелчок
                  "мышью" на OK возвратит вас в первое окно установки.

                • Программа инсталляции перечисляет используемые по умолчанию каталоги, в которые она будет переписывать файлы. Если
                  вы хотите использовать другие каталоги, наберите другой
                  маршрут. Основным каталогом, в котором устанавливается
                  Borland С++, является C:\BC4, а рабочим - C:\BC4\BIN.

                • По умолчанию программа установки создает группу Windows, в
                  которую помещаются все пиктограммы Borland C++. Если вы не
                  хотите создавать группу, отмените Create Borland C++ Group.




                • По умолчанию инсталлируется также Win32s. Если это не требуется, отмените данный параметр. Win32s необходима для

                  работы 32-разрядных приложений.


                • Если вы инсталлируете продукт на машине с локальной сетью

                  LAN Windows, то выберите LAN Windows Configuration (в других случаях эту возможность выбирать не нужно).


                • Чтобы начать копирование файлов, щелкните "мышью" на кнопке Install. После завершения инсталляции прочитайте файл

                  README.TXT. Он описывает последние изменения в продукте,

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


                • После установки убедитесь, что в CONFIG.SYS FILES и BUFFERS

                  установлены в значение 40 или больше. При установке в системные

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

                • AUTOEXEC.BAT включает в себя маршрут Borland С++ (по умолчанию C:\BC4\BIN).


                • В WIN.INI включается секция [BCW4.0 INSTALL], которая используется программой установки TASM для поиска установленного Borland С++. Кроме того, в секции [EXTENSION] расширение IDE связывается с BCW.EXE.


                • В SYSTEM.INI включаются две строки:

                  device = c:\bc4\bin\tddebug.386

                  device = c:\bc4\bin\windpmi.386


                • Если вы работаете под Windows NT, в файл CONFIG.NT добавляется NTCMDPROMPT.


                • Поставляемые с Borland С++ файлы перечислены в файле FILE-

                  LIST.TXT.


                  Как работает утилита MAKE


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

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

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

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

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

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

                  Ниже приводится синтаксис вызова команды MAKE:
                  MAKE [параметр...][результат...]
                  Здесь "параметр" является параметром утилиты MAKE (они описываются далее), а "результат" представляет собой имя результирующего файла, который должен быть создан.
                  Ниже описываются синтаксические правила вызова утилиты MAKE:
                • За словом make должен следовать пробел, а затем список параметров утилиты make.

                • Каждый параметр утилиты MAKE должен отделяться от соседних
                  параметров пробелом. Параметры могут располагаться в любой
                  последовательности; может быть введено произвольное число



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

                  строки). Все параметры, которые не задают строку (например, -s или -a) могут завершаться необязательным символом - или +. При помощи этих символов указывается выключение

                  (-) или включение (+) данного параметра.


                • За списком параметров утилиты MAKE следует пробел, а затем

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


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


                • Если в командной строке не содержатся имена результирующих

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

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


                  Каталог EXAMPLES


                  Каталог EXAMPLES\CLASSLIB\BIDS содержит несколько примеров
                  программ, использующих контейнерные классы:

                  Программа Описание
                  STRNGMAX Пример программы работы со строками.
                  REVERSE Промежуточные пример, использующий TStack (псевдоним TStackAsVector) и String. Этот пример позволяет пользователю вводить строки, а затем выводить их в обратном порядке.
                  LOOKUP Промежуточный пример, использующий TDictionary-AHashTable и TDDAssociation.
                  QUEUETST Промежуточный пример, использующий TQueue (псевдоним TQueueAsVector) и неирархический класс TTime.
                  DIRECTRY Продвинутый пример, иллюстрирующий производные пользовательские классы, использующие TISArrayAsVector и исходные файлы FILEDATA.CPP и TESTDIR.CPP.

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


                  Каталог SOURCE


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


                  Каталоги контейнеров


                  Библиотеки для классов контейнеров, построенных на базе шаблонов, отличаются по префиксу BIDS: это BIDSx.LIB, где x представляет модель памяти, и BIDSDBx.LIB для диагностических версий.
                  Поддержка классов контейнеров включает в себя каталоги, содержащие файлы заголовков, библиотеки, исходные файлы и примеры.

                  Имя файла Описание
                  BIDSF.LIB 32-битовая (плоская модель).
                  BIDSDF.LIB 32-битовая (плоская модель), диагн. версия.
                  BIDS40F.DLL 32-битовая DLL (плоская модель).
                  BIDS40DF.DLL 32-битовая DLL (плоская модель), диагностическая версия.
                  BIDSFI.LIB 32-битовая библиотека импорта (плоская модель).
                  BIDSDFI.LIB 32-битовая библиотека импорта (плоская модель), диагностическая версия.
                  BIDSS.LIB 16-битовая малая модель.
                  BIDSDBS.LIB 16-битовая малая модель, диагностическая версия.
                  BIDSC.LIB 16-битовая, компактная модель.
                  BIDSDCC.LIB 16-битовая, компактная модель, диагностическая версия.
                  BIDSL.LIB 16-битовая, большая модель.
                  BIDSDBL.LIB 16-битовая, большая модель, диагностическая версия.
                  BIDS40.DLL 16-битовая DLL.
                  BIDS40D.DLL 16-битовая DLL, диагностическая версия.
                  BIDSI.LIB 16-битовая библиотека импорта.
                  BIDSI.LIB 16-битовая библиотека импорта, диагностическая версия.



                  Класс Application::TXInvalidMainWindow (applicat.h)


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


                  Класс Bad_cast (typeinfo.h)


                  Если при приведении типа ссылки dynamic_cast завершается неуспешно, то выражение генерирует особую ситуацию Bad_cast (в случае указателя генерируется нулевой указатель).


                  Класс Bad_typeid (typeinfo.h)


                  Когда операнд typeid разыменовывается в нулевой указатель,
                  то операция typeid может генерировать Bad_typeid.


                  Класс bcd (bcd.h)


                  Конструкторы этого класса создают двоично-кодированные десятичные числа (BCD), от целых до чисел с плавающей точкой. С помощью описанной ниже функции real можно конвертировать числа bcd в long double.
                  После построения чисел bcd их можно использовать в выражения
                  совместно с другими типами и применять в стандартных математических функциях. Такие математические функции как abs, cos или sqrt для операций с bcd переопределяются. Переопределяются также операции +, -, *= , == и т.д. Числа bcd могут иметь точность до 17
                  разрядов и диапазон от 1*10^-125 до 1*10^125.


                  Класс BitmapGadget (bitmapga.h)


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


                  Класс BitSet (bitset.h)


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


                  Класс Box3d


                  Ниже показано как можно произвести класс box3d из shape:
                  class box3d : public rect {
                  public:
                  double depth; // Добавлена глубина
                  // Конструктор для создания трехмерного прямоугольного объекта
                  box3d(double x, double y, double w, double h, double d);
                  double area(void); // Подмена area() в классе rect
                  double vol(void); // Дополнение функцией вычисления объема
                  };


                  Класс Circle


                  Ниже показано как нужно произвести класс circle из shape:
                  class circle : public shape {
                  public:
                  double radius; // Дополнительные данные: радиус круга
                  // конструктор circle
                  circle(double x, double y, double r);
                  double area(void); // Подменяет в классе shape функцию area()
                  };


                  Класс complex (comnplex.h)


                  Создает комплексные числа. Вы можете свободно использовать
                  эти числа в выражениях совместно с числами int, double и другими
                  числовыми типами, а также стандартными математическими функциями Си.
                  Класс complex переопределяет операции +, -, *, /, +=, -=,
                  *=, /=, == и !=. Для потокового ввода-вывода переопределяются
                  операции >> и <<.


                  Класс conbuf (constrea.h)


                  Специализирует streambuf для обработки консольного вывода.


                  Класс constream (constrea.h)


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


                  Класс CreatedDC (dc.h)


                  Этот абстрактный класс TDC служит базовым классом для создаваемых или удаляемых объектов DC (контекст устройства). Он выполняет основную работу по созданию и удалению HDC с помощью CreateDC и DeleteDC.


                  Класс Cylinder


                  Ниже показано как можно произвести класс cylinder из circle:
                  class cylinder : public circle {
                  public:
                  double ht; // Дополнительные данные: высота цилиндра
                  // Конструктор для цилиндра
                  cylinder(double x, double y, double r, double h);
                  double area(void); // Подмена в классе circle функции area()
                  double vol(void); // Дополнительная функция вычисления объема
                  };


                  Класс filebuf (fstream.h)


                  Специализирует streambuf для ввода и вывода символов. Управляет выделением и удалением буфера, а также установкой позиции в
                  файле. Позволяет с помощью соответствующего конструктора или
                  функции-элемента использовать небуферизованный ввод-вывод. По
                  умолчанию файлы открываются в режиме openprot и допускают чтение
                  или запись. Этот класс обеспечивает только базовые средства для
                  ввода-вывода. Операции ввода-вывода выполняются с помощью функций
                  streambuf.


                  Класс фильтрации ввода


                  Простейший способ обеспечения включения в поле только допустимых данных состоит в обеспечении ввода пользователем только допустимых данных. Например, числовое поле ввода может быть ограничено вводом пользователем только цифровых данных.
                  Объект фильтра проверки допустимости ObjectWindows представляет общий механизм, ограничивающий вид символов, которые пользователь может вводить в данном управляющем элементе редактирования. TFilterValidator - это простой механизм проверки допустимости, проверяющий данные по мере ввода их пользователем. Его конструктор имеет только один параметр - набор допустимых символов.
                  TFilterValidator переопределяет IsValidInput таким образом,
                  чтобы она возвращала True, если все символы строки содержатся в
                  наборе допустимых символов. Редактируемый управляющий элемент
                  вставляет символы только в том случае, если IsValidInput возвращает True. Производные классы, такие как TRangeValidator, могут
                  комбинировать фильтрацию ввода с другими видами проверки допустимости строки.


                  Класс fpbase (objstm.h)


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


                  Класс fstream (fstream.h)


                  Этот потоковый класс является производным от fstreambase и
                  iostream и выполняет с помощью filebuf одновременный ввод и вывод.


                  Класс fstreamable (fstream.h)


                  Этот производный от ios класс обеспечивает общие для файловых потоков операции. Он используется в качестве базового для
                  fstream, ifstream и ofstream.


                  Класс ifpstream (objstrm.h)


                  Обеспечивает базовый класс для чтения (извлечения) потоковых
                  объектов из потоков.


                  Класс ifstream (fstream.h)


                  Этот производный от fsreambase потоковый класс обеспечивает
                  операции ввода через filebuf.


                  Класс ios (iostream.h)


                  Обеспечивает общие операции для ввода и вывода. Производные
                  от него классы (istream, ostream, iostream) специализируют
                  ввод-вывод с помощью операций форматирования высокого уровня.
                  Класс ios является базовым для istream, ostream, fstreambase и
                  strstreambase.


                  Класс ios


                  Класс ios (и следовательно, производные от него классы) содержит указатель на streambuf. Он выполняет форматированный вводвывод с контролем ошибок, используя streambuf.
                  На следующем рисунке показана схема наследования для всего
                  семейства классов ios. Например, класс ifstream является производным от istream и fstreambase, а класс istrstream является производным от istream и strstreambase. Поскольку имеет место множественное наследование, данная схема показывает не просто иерархию классов. При множественном наследовании один класс может наследовать от нескольких базовых классов. Это означает, например,
                  что все элементы (данные и функции) iostream, istream, ostream,
                  fstreambase и ios являются частью объектов класса fstream. Все
                  классы в сети ios используют streambuf (либо filebuf или
                  strstreambuf, которые представляют собой специальные случаи
                  streambuf) в качестве источника и/или приемника.
                  ios
                  ^ ^ ^ ^
                  istream fstreambase strstreambase ostream
                  ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
                  ifstream istrstream ofstream ostrstream
                  istream_withassign istream strstream ostream_withassign
                  confstream
                  v v
                  iostream
                  ^
                  iostream_withassign
                  istream_withassign ostream_withassign


                  Класс iostream (iostream.h)


                  Данный производный от istream и ostream класс представляет
                  собой смесь своих базовых классов для ввода и вывода в поток. Он
                  является базовым для fstream и strstream.


                  Класс iostream_withassign (iostream.h)


                  Этот класс представляет собой iostream c добавленными оператором присваивания.


                  Класс iostream


                  Класс iostream обеспечивает общие методы буферизации и обработки потоков при небольшом объеме или отсутствии форматирования.
                  streambuf это полезный базовый класс, используемый другими частями библиотеки iostream, хотя также вы можете создавать производные от него классы для собственных функций и библиотек. Классы strstreambuf и filebuf являются производными от streambuf.
                  streambuf
                  ^ ^ ^
                  filebuf strstreambuf
                  conbuf
                  Класс streambuf обеспечивает интерфейс с памятью и физическими устройствами. Семейство функций-элементов streambuf используется классами, основанными на ios.


                  Класс ipstream (objstrm.h)


                  Обеспечивает базовый класс для чтения (извлечения) альтернативных объектов.


                  Класс istream (iostream.h)


                  Обеспечивает форматированный и неформатированный ввод из
                  streambuf. Для фундаментальных типов операция >> переопределяется. Базовым для данного класса является класс ios.


                  Класс istream (strstrea.h)


                  Обеспечивает для strstreambuf операции ввода. Этот класс является производным от strstreambase и istream.


                  Класс istream_withassign (iostream.h)


                  Этот класс представляет собой istream с добавленной операцией присваивания.


                  Класс ofstream (fstream.h)


                  Является производным от fstreamable и ostream и обеспечивает
                  для filebuf операции ввода.


                  Класс ostream (iostream.h)


                  Обеспечивает для streambuf форматированный или неформатированный вывод. Для всех фундаментальных типов операция << переопределяется. Этот производный от ios класс является базовым для
                  constream, iostream, ofstream, ostrstream и ostream_withassing.


                  Класс ostream_withassign (iostream.h)


                  Этот класс представляет собой ostream с добавленной операцией присваивания.


                  Класс oststream (strstrea.h)


                  Является производным от strstreambase и ostream и обеспечивает для strstreambuf операции вывода.


                  Класс Palette


                  Класс Palette инкапсулирует палитру цветов Windows, которая
                  может использоваться с битовыми массивами и DIB. TPalette позволяет вам нестроить таблицу цветов, привести в соответствие отдельные цвета, поместить палитру в буфер обмена Clipboard и т.д.
                  Построить объект TPalette можно непосредственно, задав атрибуты палитры, или косвенно, задав TPalette& или указатель на
                  структуру LOGPALETTE. При непосредственном построении палитры
                  создается новый объект с заданными атрибутами.
                  При косвенном создании палитры новый объект также создается,
                  но атрибуты копируются из указанного объекта. Вы можете создать
                  объект TPalette и из существующего описателя HPALETTE.
                  Обращаться к объекту TPalette можно через HPALETTE или логическую структуру LOGPALETTE. Для получения HPALETTE из объекта
                  TPalette используйте операцию HPALETTE с объектом TPalette в качестве параметра. Операция HPALETTE явно почти никогда не вызывается.
                  Функция GetObject для TPalette функционирует аналогично
                  соответствующей функции API Windows. TPalette инкапсулирует также
                  стандартные функции API для работы с палитрами. Функция GetNearestPaletteIndex приводит цвет в соответствие с записью палитры.
                  Эта функция имеет единственный параметр (объект TColot) и возвращает индексный номер ближайшего цвета палитры. Функция GetNumEntries не имеет параметров и возвращает число записей в таблице цветов палитры.
                  Получить значения из диапазона записей таблицы цветов можно
                  с помощью функции GetPaletteEntries. Эта функция работает аналогично соответствующей функции API Windows. С помощью функции SetPaletteEntries вы можете задать значения в диапазоне записей таблицы цветов. Для изменения размера палитры используется функция
                  ResizePalette, в параметре которой задается размер новой палитры.
                  SetPalette устанавливает указанную индексом запись палитры соответственно значению объекту PALETTEENTRY. Эта функция работает
                  аналогично функции API Windows ResizePalette.
                  Функция AnimatePalette позволяет вам заменить записи в таблице цветов палитры. В третьем параметре этой функции задается



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

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

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

                  себя как соответствующая функция API Windows.

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

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

                  конструктор TPalette.

                  Две функции Create TPalette вызываются из конструкторов TPalette. Второй параметр Create эквивалентен элементу peFlags

                  структуры PALETTEENTRY. Функции Create создают LOGPALETE с помощью таблицы цветов из передаваемого во втором параметре битового массива. Вы можете использовать Create для создания 2- 16- или

                  256-цветных битовых массивов.


                  Класс проверки допустимости по диапазону


                  TRangeValidator - это класс проверки допустимости, производный от TFilterValidator. Он воспринимает только числа и добавляет
                  к конечному результату проверку по диапазону. Этот конструктор
                  имеет два параметра, определяющие минимальное и максимальное допустимые значения.
                  Механизм проверки допустимости по диапазону действует как
                  механизм фильтрации, воспринимающий только цифры от 0 до 9, символы + и -. Таким образом, наследуемая TValidInput пропускает через фильтр только числа. IsValid в TRangeValidator возвращает
                  True только в том случае, если введенное число является допустимым числом в заданном диапазоне. Если число лежит вне диапазона,
                  функция-элемент Error возвращает сообщение об ошибке.


                  Класс проверки допустимости по шаблону


                  При проверке допустимости по шаблону переданная пользователем строка сравнивается с шаблоном, описывающим допустимый формат
                  ввода. Эти шаблоны совместимы с шаблонами, используемыми в реляционных базах данных Borland, в частности, в Paradox. При построении такого объекта проверки допустимости задаются два параметра:
                  строка, содержащая образ шаблона, и булевское значение, указывающее, следует ли автоматически заполнять образ шаблона символами.
                  TPXPictureValidator переопределяет функции Error, IsValid и
                  IsValidInput и добавляет новую функцию-элемент - Picture. Error
                  выводит сообщение об ошибке, указывающее, каким должен быть формат строки. IsValid возвращает True только при возврате True
                  функцией Picture. Таким образом, переопределив функцию-элемент
                  Picture, вы можете создать новые виды проверки допустимости по
                  шаблону. IsValidInput проверяет символы по мере ввода их пользователем, допуская только те символы, которые разрешены форматом
                  ввода.


                  Класс проверки допустимости по таблице


                  Класс проверки допустимости по таблице TLookupValidator это абстрактный класс, который сравнивает введенное значение со
                  списком значений. TLookupValidator вводит виртуальную функцию-элемент Lookup. По умолчанию Lookup возвращает True. Производные классы должны переопределять Lookup и сравнивать параметр
                  со списком элементов, возвращая True в случае совпадения.
                  IsValid в TLookupValidator возвращает True только если возвращает True Lookup. В производных классах не следует переопределять IsValid. Вместо этого нужно переопределить Lookup. TStringLookupValidator - это экземпляр класса, основанный на TLookupValidator.


                  Класс проверки допустимости строки


                  TStringLookupValidator - это пример средства проверки допустимости по таблице. Он сравнивает переданную из редактируемого
                  управляющего элемента строку с элементами в списке строк и возвращает True, если эта строка содержится в списке. Конструктор
                  здесь имеет только один параметр - список допустимых строк TSortedStringArray. Чтобы после построения объекта проверки допустимости строки использовать другой список строк, воспользуйтесь
                  функцией NewStringList, которая отменяет старый список и инсталлирует новый.
                  TStringLookupValidator переопределяет Lookup и Error. Lookup
                  возвращает True, если переданная строка содержится в списке, а
                  Error выводит окно сообщения, указывающее, что строки нет в списке.


                  Класс pstream (objstrm.h)


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


                  Класс Rectangle


                  Ниже показано как можно произвести класс rectangle из shape:
                  class rect : public shape {
                  public:
                  double wd, ht; // Дополнительные данные: размер прямоугольника
                  // Конструктор для создания объекта rect (прямоугольник)
                  rect(double x, double y, double w, double h);
                  double area(void); // Подмена функции area() в классе shape
                  };


                  Класс Shape


                  Ниже показано как нужно определить класс shape на языке C++:
                  class shape {
                  public:
                  double xo, yo; // Расположение фигуры
                  shape(double x, double y); // Создание конструктором фигуры
                  virtual double area(void); // Функция, вычисляет поверхность
                  };


                  Класс streambuf (iostream.h)


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


                  Класс String (cstring.h)


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


                  Класс strstream (strstrea.h)


                  Обеспечивает для strstreambuf одновременный ввод и вывод.
                  Этот класс является производным от strstreambase и iostream.


                  Класс strstreambase (strstrea.h)


                  Специализирует ios для строковых потоков. За исключением
                  функции-элемента strstreambase::rdbuf, весь класс является защищенными. Этот класс является базовым для strstream, istrstream и
                  ostrstream.


                  Класс strstreambuf (strstrea.h)


                  Специализирует streambuf для форматирования в памяти.


                  Класс TApplication (applicat.h)


                  Класс TApplication является производным от TModule и действует в качестве объектно-ориентированной замены прикладного модуля Windows. Классы TApplication и TModule обеспечивают базовое
                  поведение, необходимое для приложения Windows. Функции-элементы
                  TApplication создают экземпляры класса, основные окна и обрабатывают сообщения.


                  Класс TBandInfo (dc.h)


                  Это структура ObjectWindows, эквивалентная BANDINFOSTRUCT.
                  Она используется для передачи информации драйверу печати. TBandInfo описывается следующим образом:
                  struct TBandInfo {
                  BOOL HasGraphics;
                  BOOL HasText;
                  TRect GraphiscRect;
                  };
                  HasGraphics имеет значение True при наличии на странице или
                  в зоне графики. HasText равно True при наличии текста. GraphicsRect определяет область, ограничивающую всю графику на странице.


                  Класс TBitmap


                  Класс TBitmap инкапсулирует независимый от устройства битовый массив Windows. Он предусматривает различные конструкторы и
                  функции-элементы для работы с битовым массивом.
                  Построить битовый массив можно непосредственно или косвенным
                  путем. Используя косвенное построение, вы можете задать существующий объект битового массива, указатель на структуру BITMAP, метафайл, контекст устройства TDC и др.
                  В конструкторе объекта битового массива задаются высота, ширина битового массива в элемента изображения, число цветовых
                  плоскостей битового массива и число бит на элемент изображения.
                  Вы можете также создать объекты битового массива из существующих
                  битовых массивов инкапсулированных в объекте TBitmap или содержащихся в структуре BITMAP.
                  TBitmap предусматривает два конструктора, которые вы можете
                  использовать для создания битового массива, совместимого с данным
                  контекстом устройства. Первый конструктор создает битовый массив
                  заданного размера (высоты и ширины). Третий параметр позволяет
                  сделать битовый массив выгружаемым. Второй конструктор создает
                  битовый массив с заданной высотой и шириной, совместимый с контекстом устройства из DIB.
                  Вы можете создавать битовые массивы из буфера обмена Windows, метафайла или объекта DIB. Чтобы создать битовый массив из
                  буфера обмена, нужно только передать конструктору ссылку на объект Clipboard. Конструктор получает описатель битового массива в
                  буфере обмена и строит по этому описателю объект битового массива. Чтобы создать объект из метафайла, нужно передать TMetaFilePict&, TPalette& и TSize&. Конструктор на основе палитры инициализирует совместимый с устройством битовый массив. Чтобы создать
                  битовый массив из битового массива, независимого от устройства,
                  нужно передать конструктору TDib&. Можно также задать палитру.
                  Можно создать битовый массив, и загрузив его из модуля. При этом
                  конструктору передается HINSTANCE модуля, содержащего битовый
                  массив, и идентификатор ресурса битового массива. Можно также
                  создать новый объект битового массива из существующего описателя



                  HBITMAP.

                  Вы можете получить доступ к TBitmap через HBITMAP или структуру BITMAP. Чтобы получить HBITMAP из объекта TBitmap, используйте операцию HBITMAP с объектом TBitmap в качестве параметра.

                  Операция HBITMAP почти никогда явно не вызывается. Для преобразования объекта TBitmap в структуру BITMAP используется функция GetObject (фактические биты массива можно получить с помощью функции GetBitmapBits).

                  TBitmap инкапсулирует ряд стандартных вызовов API для работы

                  с палитрами. С помощью функций Width() и Height() вы можете получить ту же информацию, что и с помощью GetObject. Каждая функция

                  возвращает характеристики объекта битового массива.

                  Функции GetBitmapDimension и SetBitmapDimension позволяют

                  вам найти и изменить размеры битового массива. GetBitmapDimension

                  имеет единственный параметр - ссылку на объект TSize и помещает в

                  объект TSize размер битового массива. SetBitmapDimension имеет

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

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

                  Функции GetBitmapDimension и SetBitmapDimension изменяют не

                  фактический размер битового массива в элементах изображения, а

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

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

                  Функции GetBitmap и SetBitmap позволяют вам изменить и опросить биты битового массива. Эти функции имеют по два параметра:

                  размер массива в байтах и указатель на битовый массив. SetBitmapBits копирует массив в битовый массив (копируется заданное в параметре число байт). GetBitmap заполняет массив битами из битового массива.

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

                  конструктор TBitmap.

                  Tbitmap имеет две функции Create. В параметре первой функции

                  указывается ссылка на объект TBitmap. По существу эта функция копирует переданный объект TBitmap. Во второй функции Create указываются ссылки на объект TDib и объект TPalette. Create создает

                  контекст устройства, совместимый с TPalette.


                  Класс TBitmapGadget


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


                  Класс TBrush (gdiobjec.h)


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


                  Класс TBrush


                  Класс TBrush инкапсулирует логическую кисть. Он содержит
                  цвет кисти (инкапсулированный в объекте TColor), ширину кисти, а
                  также стиль кисти, шаблон или битовый массив.
                  Построить объект кисти можно непосредственно, задав цвет,
                  ширину и стиль кисти, или косвенно, через TBrush& или указатель
                  на структуру LOGBRUSH.
                  При косвенном создании кисти новый объект также создается,
                  но атрибуты копируются из указанного объекта. Вы можете создать
                  объект TBrush из существующего описателя HBRUSH.
                  Обращаться к TBrush можно через HBRUSH или логическую структуру LOGBRUSH. Для получения HBRUSH из объекта TBrush используйте
                  операцию HBRUSH с объектом TBrush в качестве параметра. Явно операция HBRUSH почти никогда не вызывается.
                  Для преобразования TBrush в структуру LOGBRUSH используйте
                  функцию GetObject. Чтобы сбросить начальную точку объекта кисти,
                  используйте функцию UnrealizxeObject.


                  Класс TButton (button.h)


                  Это интерфейсный класс, представляющий интерфейс командных
                  кнопок. Для создания управляющего в родительском TWindow элемента
                  типа командной кнопки вы должны использовать TButton. TButton
                  можно использовать для связи между вашим приложением и управляющими элементами типа командный кнопок TDialog. Это потоковый
                  класс.
                  Существует два типа командных кнопок: регулярные и используемые по умолчанию. Используемые по умолчанию кнопки имеют жирную
                  границу.


                  Класс TButtonGadget (buttonga.h)


                  Являясь производным от TGadget, класс TButtonGadget представляет командные кнопки, которые вы можете включать и выключить
                  щелчком "мыши". Вы можете также применять к реквизитам кнопок атрибуты, такие как цвет, стиль и форму.
                  В общем случае кнопки классифицируются как командные и атрибутные. Атрибутные кнопки включают в себя кнопки с зависимой и
                  независимой фиксацией. Объект TButtonGadget отвечает на события
                  "мыши" следующим образом в соответствии с нажатием кнопки "мыши":
                  "нажимается" при нажатии кнопки и освобождается, когда кнопка отпускается. Команды можно вводить, когда кнопка "мыши" отжата.
                  Когда кнопка "мыши" нажата, TButtonGadget перехватывает события
                  "мыши" и резервирует все сообщения "мыши" для текущего окна. При
                  нажатии кнопки "мыши" такой перехват отменяется.


                  Класс TButtonGadget


                  Реквизиты типа командных кнопок TButtonGadget - это единственный тип реквизитов, с которым пользователь может непосредственно взаимодействовать. Управляющие элементы реквизитов также обеспечивают получение данных от пользователя, но делают это через класс управляющего элемента. Реквизит в этом случае действует как посредник между управляющим элементом и окном реквизитов.
                  Кнопка-реквизит имеет три состояния: вверх, вниз и промежуточное. Кроме того, при нажатии во всех трех состояниях кнопка может подсвечиваться.
                  Существует три базовых типа кнопок-реквизитов, команд реквизитов и установки реквизитов. Установка реквизитов можете быть
                  исключающей (как у кнопок с зависимой фиксацией) или неисключающей (как у кнопок с независимой фиксацией). Команды могут находиться только в "верхнем" состоянии. Установки могут иметь все три состояния.
                  После нажатия реквизита он перехватывает перемещения "мыши".
                  Когда "мышь" перемещается вне ограничивающего прямоугольника реквизита без освобождения ее левой кнопки, подсветка отменяется, но
                  перемещения "мыши" для реквизита все равно отслеживаются. Если
                  "мышь" без освобождения кнопки снова перемещается внутрь ограничивающего прямоугольника реквизита, он снова подсвечивается. Если
                  левая кнопка "мыши" освобождается, перемещения "мыши" больше не
                  перехватываются. Если курсор при отпущенной кнопке позиционируется внутрь ограничивающего прямоугольника, то идентификатор реквизита передается окну реквизита в качестве командного сообщения.
                  В конструкторе TButtonGadget задаются идентификатор ресурса
                  битового массива, выводимого в кнопке (размер которого определяется размерами кнопки), идентификатор реквизита (используется в
                  качестве команды при его нажатии), тип реквизита (командный, исключающий или не исключающий), разрешение реквизита, состояние
                  реквизита, повтор (повтор кнопки при удерживании ее в нажатом
                  состоянии).
                  Функция ~TBurronGadget удаляет ресурсы битового массива и
                  занимаемую строкой память.
                  Для доступа к кнопке-реквизиту вы можете использовать ряд
                  функций-элементов. Эти функции позволяют вам устанавливать состояние реквизита (SetButtonState), получать его (GetButtonState), и
                  получать тип кнопки-реквизита (GetButtonType). Модифицировать вид
                  кнопки-реквизита и ее стиль можно с помощью функций SetNotchCorners и SetShadowStyle.
                  TButtonGadget переопределяет функцию CommandEnabled TGadget.
                  Она инициализирует для реквизита сообщение WM_COMMAND_ENABLE.
                  TButtonGadget реализует функцию SysColorChange, так что битовые
                  массивы отслеживают системные цвета. Изменение системных цветов
                  отражается на новой кнопке-реквизите.


                  Класс TCelArray (celarray.h)


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


                  Класс TCharSet (bitset.h)


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


                  Класс TCheckBox (checkbox.h)


                  Это потоковый интерфейсный класс, который представляет управляющий элемент типа кнопки с независимой фиксацией. Его можно
                  использовать для создания такого элемента в родительском окне. Он
                  упрощает также манипуляции с кнопками с независимой фиксацией,
                  созданными ранее в ресурсе диалогового окна. Такая кнопка имеет
                  три состояния: отмечена (нажата), не отмечена (не нажата) и не
                  определена (серая). Связанные управляющие элементы такого типа
                  можно группировать.


                  Класс TChooseColorDialor (chooseco.h)


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


                  Класс TChooseFontDialog (choosefo.h)


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


                  Класс TClientDC (dc.h)


                  Класс DC является производным от TWindowDC, а TClientDC
                  обеспечивает доступ к клиентной области окна.


                  Класс TClipboard (clipboard.h)


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


                  Класс TClipboardViewer (clipview.h)


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


                  Класс TColor (color.h)


                  Это поддерживающий класс, используемый в сочетании с классами TPalette, TPaletteEntry, TRgbQuad и TRgbTriple для упрощения
                  всех операций с цветами Windows.


                  Класс TComboBox (combobox.h)


                  Этот класс можно использовать для создания в родительском
                  TWindow комбинированного блока или управляющего элемента комбинированного блока, а также для облегчения взаимодействия приложения
                  с комбинированными блоками в TDialog. TComboBox наследует свое
                  поведение от TListBox. Существует три типа комбинированного блока: простой, раскрывающийся и комбинированный блок с раскрывающимся списком.


                  Класс TComboBoxData (combobox.h)


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


                  Класс TCommonDialog (commdial.h)


                  Этот класс (производный от TDialog) является абстрактным базовым классом для объектов TCommonDialog. Используя общие диалоговые DLL, он обеспечивает базовые функции для создания диалоговых окон.


                  Класс TControl (control.h)


                  Унифицирует производные классы управляющих элементов, такие
                  как TScrollBar, TControlGadget и TButton. Управляющие объекты в
                  производных классах используются для представления интерфейсных
                  управляющих элементов в Windows. Управляющий объект должен использоваться для создания управляющего элемента в родительском
                  TWindow или используется для связи приложения с управляющими элементами TDialog. Это потоковый класс.


                  Класс TControlBar (controlb.h)


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


                  Класс TControlBar


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


                  Класс TControlGadget (controlg.h)


                  Этот класс является "суррогатом" класса TControl, благодаря
                  которому вы можете помещать объекты управляющих элементов в окно
                  реквизитов. Если необходимо TControlGadget устанавливает родительское окно и создает реквизит управляющего объекта.


                  Класс TControlGadget


                  TControlGadget - это достаточно простой класс, который служит интерфейсом между обычным управляющим элементом Windows и окном реквизита. Это позволяет использовать в окне реквизитов стандартные управляющие элементы Windows, такие как полоса прокрутки,
                  строка состояния и др.
                  В конструкторе TControlGadget задаются управляющий элемент
                  (ссылка на объект ObjectWindows) и стиль обрамления реквизита.
                  Функция ~TControlGadget освобождает занимаемую объектом управляющего элемента память.


                  Класс TCriticalSection::Lock (thread.h)


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


                  Класс TCriticalSection (thread.h)


                  Этот класс обеспечивает системно-независимый интерфейс для
                  критических секций нитей. Объект этого класса может использоваться в сочетании с объектами TCritical::Lock чтобы гарантировать,
                  что в каждый момент времени в критической части кода может выполняться только одна нить.


                  Класс TCursor (gdiobjec.h)


                  Этот класс, производный от TGdiobject, представляет объектный класс курсора GDI. Конструкторы TCursor могут создавать курсоры из ресурсов или на основе точной информации.


                  Класс TCursor


                  Этот класс инкапсулирует описатель курсора и конструктор для
                  создания экземпляра объекта TCursor. Вы можете использовать класс
                  TCursor для построения курсора из ресурса или явной информации.
                  Построить курсор можно несколькими способами: из существующего объекта TCursor, из ресурса в текущем приложении, из ресурса
                  в другом приложении или на основе заданного размера и явной информации. Для 32-разрядных приложений можно также использовать
                  два специальных конструктора, один из которых имеет два параметра
                  (указатель на массив буферов, содержащих биты данных курсора, и
                  размера - числа бит в буфере), а другой - один параметр (структуру ICONINFO). ~TCursor удаляет пиктограмму и освобождает занимаемую ей память.
                  Обращаться к TCursor можно через HCURSOR. Чтобы получить
                  HCURSOR из объекта TCursor, используйте операцию HCURSOR. В
                  32-разрядных приложениях доступна также функция TIcon GetIconInfo
                  с единственным параметром - указателем на структуру ICONINFO. Она
                  заполняет структуру ICONINFO и возвращает True в случае успешного
                  выполнения.


                  Класс TDate (date.h)


                  Класс TDate представляет дату. Он имеет элементы для чтения,
                  записи и преобразования даты.


                  Класс TDC (dc.h)


                  Это корневой класс для оболочек GDI DC. Каждый объект TDC
                  имеет элемент данных Handle типа HDC (описатель контекста устройства). Таким образом, функции API Windows, требующие аргумента
                  HDC, могут вызываться соответствующей функцией-элементом TDC без
                  явного аргумента описателя. Объекты DC могут создаваться непосредственно конструкторами TDC или через конструкторы специализированных подклассов (что обеспечивает нужное поведение). Объект
                  DC может строиться с уже существующим или заимствованным описателем DC, либо с самого начала путем указания информации об устройстве/драйвере.


                  Класс TDC


                  Хотя специализированные классы контекстов устройств обеспечивают дополнительные функциональные возможности, ориентированные
                  на конкретную специфику класса, TDC содержит большую часть необходимых функций.
                  Из-за большого числа содержащихся в этом классе функций мы
                  не будет обсуждать каждую из них подробно, а коснемся лишь общих
                  функциональных возможностей TDC, специфических для ObjectWindows
                  функций и функций типа API. Многие функции TDC аналогичны функциям API Windows.
                  TDC предусматривает только один общедоступный конструктор и
                  деструктор. В конструкторе задается HDC - описатель контекста
                  устройства. По существу это означает, что перед построением объекта TDC вы должны иметь существующий контекст устройства. Обычно
                  TDC не требуется строить непосредственно. Вместо этого при передаче некоторого контекста устройства как параметра функции или
                  указателя используется объект TDC. Указатель может ссылаться на
                  некоторый контекст устройства, содержащийся в TDC или производном
                  от него объекте.
                  ~TDC уничтожает объекты и восстанавливает в контексте устройства все объекты по умолчанию. TDC предусматривает также два
                  защищенных конструктора, используемых только в производных классах.
                  В TDC имеется одна операция преобразования, HDC, которая
                  позволяет вам возвратить контекст устройства. Данная операция чаще всего вызывается неявно.
                  Вы можете сохранить и восстановить контекст устройства аналогично тому, как используются функции SaveDC и RestoreDC. Вы можете также переустановить контекст устройства с помощью функции ResetDC. Единственный параметр ResetDC - это ссылка на структуру
                  DEVMODE.
                  Для получения информации об устройстве можно использовать
                  функцию GetDeviceCaps. Эта функция имеет один параметр - индекс
                  типа получаемой из контекста устройства информации. Возможные
                  значения этого параметра те же, что и функции API Windows.
                  Функция GetDCOrg позволяет найти логические координаты текущего контекста устройства в абсолютных физических координатах
                  устройства. В параметре этой функции задается ссылка на структуру



                  TPoint, а возвращаемое значение говорит об успешном или неуспешном выполнении.

                  Функция SelectObject используется для включения объекта GDI

                  в контекст устройства. Эта функция имеет 4 версии с различными

                  параметрами. Используемая версия зависит от типа выбираемого объекта. Функция TMemoryDC позволяет выбрать битовый массив.

                  Выбираемые в контексте устройства графические объекты обычно

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

                  устройства выбирается графический объект, в контексте устройства

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

                  С помощью функции SelectStockObject можно выбрать стандартный объект. Эта функция имеет один параметр, эквивалентный параметру, используемому при вызове функции API GetStockObject. По

                  существу эта функция эквивалентна двум вызовам: GetStockObject

                  (для получения стандартного объекта) и SelectObject (для включения стандартного объекта в контекст устройства).

                  TDC предусматривает функции для восстановления в контексте

                  устройства исходных объектов. Это RestoreBrush, RestorePen, RestoreFont и RestorePalette. RestoreTextBrush можно использовать

                  только для 32-разрядных приложений. Все эти функции вызываются

                  функцией RestoreObjects.

                  GetBrushOrg имеет один параметр - ссылку на объект TPoint.

                  Она помещает в него координаты начала кисти. Функция SetBrushOrg

                  имеет еще один параметр - TPoint*. Эта функция устанавливает начала кисти контекста устройства в значения x и y первого объекта

                  TPoint. Второй параметр по умолчанию равен 0. Если вы передаете

                  указатель на TPoint, TDC::SetBrushOrg помещает в x и y объекта

                  старые значения кисти.

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

                  палитрами и цветами: GetNearestColor, GetSystemPaletteEntries,

                  GetSystemPaletteUs, RealizePalette, SetSystemPaletteUse и UpdateColors.

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



                  функциям API с теми же именами, но в каждой из них может быть

                  опущен параметр HDC: GetBkColor, GetBkMode, GetPolyFillMode, GetROP2, GetStretchBltMode, GetTextColor, SetBkColor, SetBkMode,

                  SetPolyFillMode, SetROP2, SetStretchBltMode и SetTextColor. Функция SetMiterLimit доступна только в 32-разрядных приложений.

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

                  используйте следующие функции: GetMapMode, GetViewportExt, GetVieportOrg, GetWindowExt, GetWindowOrg, OffsetViewportOrg, GetViewportExt, OffsetWindowOrg, ScaleViewportExt, ScaleWindowExt, SetWindowExt, SetMapMode, SetViewportExt, SetViewportOrg, SetWindowExt и SetWindowOrg. Для 32-разрядных приложений доступны также

                  функции ModifyWorldTransform и SetWorldTransform.

                  Функции координат преобразуют логические координаты в физические и наоборот. Это функции DPtoLP и LPtoDP. Для задания и

                  считывания простых и сложных областей в области отсечения контекста устройства используются функции ExcludeClipRect, ExcludeUpdateRgn, GetBoundsRect, GetClipRgn, IntersectClipRect, OffsetClipRgn, PtVisible, RectVisible, SelectClipRgn и SetBoundsRect.

                  Для доступа к метафайлам служат функции EnumMetaFile, PlayMetaFile, PlayMetaFileRecord. Для перемещения в текущую точку используются три версии функции MoveTo (эта функция перемещает перо

                  в точку с заданными координатами).

                  В параметре функции GetCurrentPosition задается ссылка на

                  объект TPoint. Она помещает координаты текущей позиции в объект

                  TPoint.

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

                  TDC для работы со шрифтами: EnumFontFamilies, EnumFonts, GetAspectRatioFilter, GetCharABCWidth, GetCharWidth, GetFontData и

                  SetMapperFlags.

                  Функции работы с маршрутом доступны только для 32-разрядных

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

                  Win32: BeginPath, CloseFigure, EndPath, FillPath, FlattenPath,

                  PathToRegion, SelectClipPath, StrokedAndFillPath, StrokePath и

                  WidenPath.

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

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

                  функции API (за исключением отсутствия параметра HDC), а альтернативные версии, использующие TPoint, TRect, TRegion и другие

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

                  понятными.


                  Класс TDecorated (decframe.h)


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


                  Класс TDecoratedMDIFrame (decmdifr.h)


                  Это рамка MDI, поддерживающая дочерние окна с дополнительными элементами. TDecoratedMDIFrame - потоковый класс.


                  Класс TDesktopDC (dc.h)


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


                  Класс TDialog (dialog.h)


                  Объекты данного класса представляют собой интерфейсные элементы режимных и безрежимных диалоговых окон. (При открытии режимного диалогового окна операции в родительском окне запрещаются.) Объект TDialog имеет соответствующее определение ресурса,
                  описывающее размещение и внешний вид его управляющих элементов.
                  Идентификатор данного определения ресурса передается конструктору
                  объекта TDialog. TDialog ассоциируется с режимными и безрежимными
                  интерфейсными элементами с помощью функцию-элементов Execute и
                  Create. Это потоковый класс.
                  ObjectWindows предусматривает трехмерную поддержку диалоговых окон. Если ваше приложение предполагает использование DLL
                  CTL3D, его нужно зарегистрировать с помощью EnableCtl3d. Для диалоговых окон ObjectWindows обеспечивает также поддержку BWCC.


                  Класс TDib (gdiobjec.h)


                  Этот класс, производный от TGdiObject, представляет объекты
                  DIB (Device Independent Bitmap). TDibDC инкапсулирует создание DC
                  с помощью DIB.DRV (драйвера GDI Windows). Объекты DIB не имеют
                  описателя Windows. Это просто структуры, содержащие информацию о
                  формате и палитре и битовый набор или набор элементов изображения. TDib позволяет работать с объектами DIB как с объектами GDI.


                  Класс TDib


                  Независимый от устройства битовый массив DIB не имеет описателя GDI как обычный битовый массив, хотя имеет глобальный описатель. Это просто структура, содержащая информацию о палитре и набор бит (элементов изображения). Класс TDib дает удобный способ
                  работы с DIB, аналогичный методам работы с другим объектами GDI.
                  Память для DIB выделяется одним фрагментом (с помощью функции
                  Windows GlobalAlloc), так что ее можно передать в буфер обмена,
                  OLE-серверу или клиенту.
                  Построить объект TDib вы можете прямо или косвенно. При непосредственном построении вы можете задать высоту, ширину битового массива и т.д. При косвенном построении вы можете задать существующий объект битового массива, указатель на структуру BITMAP, метафайл, контекст устройства TDC, буфера обмена и т.д.
                  Если ShouldDelete возвращает True, ~TDib освобождает ресурс
                  и используемую глобальную память.
                  Для доступа к инкапсулированному DIB TDib предусматривает
                  различные функции-элементы. Функции преобразования типов в TDib
                  позволяют вам обращаться к TDib наиболее удобным для конкретной
                  операции способом. Для доступа к TDib через HANDLE можно использовать операцию преобразования HANDLE. Вы можете также преобразовать объект TDib в три других типа битовых массивов. Для этого
                  используются операции BITMAPINFO, BITMAPINFOHEADER и TRgbQuad.
                  Для доступа к внутренним структурам DIB используются специальные функции с такими же именами BITMAPINFO, BITMAPINFOHEADER и
                  TRgbQuad. Функция GetIndices возвращает указатель на массив, содержащий биты фактического образа DIB.
                  Поместить объект DIB в буфер обмена Clipboard можно с помощью функции ToClipboard, в качестве единственного параметра которой задается ссылка на объект TClipboard. Так как эта функция
                  фактически удаляет объект из приложения, нужно использовать конструктор TDib для создания временного объекта.
                  Класс TDib предусматривает ряд функций доступа, которые можно использовать для опроса объекта TDib и получения информации о
                  содержащемся в объекте DIB.
                  Чтобы определить допустимость объекта, вызовите функцию



                  IsOK, которая не имеет параметров и возвращает True в случае допустимости объекта. Функция IsPM также не имеет параметров и

                  возвращает True, если DIB имеет представление, совместимое с Presentation Manager. Функции Width и Height возвращают ширину и высоту битового массива в элементах изображения. Функция Size возвращает ту же информацию в объекте TSize. Функция NumColor возвращает число используемых в битовом массиве цветов. StartScan предусмотрена для совместимости со старыми программами и всегда

                  возвращает 0. NumScan также обеспечивает совместимость и возвращает высоту DIB в элементах изображения. Функция Usage указывает,

                  в каком режиме находится DIB (DIB_RGB_COLORS или DIB_PAL_COLORS).

                  Функция WriteFile записывает объект DIB на диск.

                  Работа с палитрой в режиме RGB

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

                  В режиме палитры цветовая таблицы DIB. Сами значения цветов не

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

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

                  ChangeModeToPal и ChangeModeToRGB.

                  Когда вы переключаетесь в режим палитры с помощью ChangeModeToPal, в качестве палитры DIB используется параметр TPalette&.

                  Каждый используемый в DIB цвет отображается в палитру и преобразуется в индекс палитры. При переключении в режим RGB с помощью

                  ChangeModeToRGB параметр TPalette& используется для конвертирования индексов палитры в содержащиеся в палитре эквиваленты RGB.

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

                  доступа к палитре цветов DIB и ее изменения следующие функции:

                  Функция Назначение
                  GetColor Получает любую запись в палитре цветов DIB по

                  индексу в таблице цветов. Возвращается объект TColor.
                  SetColor Изменяет запись в таблице цветов DIB. В параметрах указываются индекс в таблице цветов и

                  новое значение.
                  FindColor Сравнивает объект TColor с записью в таблице

                  цветов, используя функцию FindColor. В пара-

                  метре задается объект TColor.
                  MapColor Заменяет цвет в существующей таблице цветов.

                  Имеет 3 параметр: TColor, содержащий заменяемый цвет, TColor c новым цветом, и значение, указывающее, нужно ли заменить все вхождения.
                  GetIndex Позволяет получить индекс палитры любой для

                  любой таблицы цветов. Параметр задает индекс в таблице цветов. Возвращается значение индекса палитры.
                  FindIndex Находит индекс палитры по записи таблицы цветов. Выполняет поиск по таблицам цветов DIB. пока не найдет заданное в параметре значение.
                  MapIndex Заменяет цвет на цвет, уже существующий в

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

                  Класс TDibDC (dc.h)


                  Класс DC, производный от TDC и обеспечивающий с помощью
                  драйвера DIB.DRV доступ к независимым от устройства битовым массивам (DIB).


                  Класс TDocManager (docmanag.h)


                  Создает объект администратора документов, который управляет
                  списком текущих документов и зарегистрированных шаблонов, обрабатывает стандартные команды файлового меню и выводит пользовательский интерфейс для окон файла и блоков выбора. Чтобы обеспечить поддержку для документов и отображаемых элементов, этот объект должен создаваться приложением и подключаться к документу.
                  Администратор документов обычно обрабатывает события от имени документов, используя таблицу реакции. Администратор документов может в ответ на команды создавать соответствующие документы
                  на основе выбора, сделанного пользователем. В ответ на другие команды администратор определяет, какие документы содержат отображаемый элемент, связанный с активным окном. Команды меню посылаются сначала в активное окно, а затем через родительское окно в
                  основное окно, и наконец в приложение, которое передает их администратору документов.
                  При создании объектов указанного класса или производных
                  классов вы должны сначала задать многодокументальный или однодокументальный интерфейс. Если требуется, чтобы администратор документов мог обрабатывать файловые команды, нужно выполнить над
                  dmMDI и dmSDI операцию OR. Пункты меню администратора документов
                  можно разрешить или запретить.
                  Когда приложение непосредственно создает новый документ и
                  отображаемый документ, вы можете подключить отображаемый элемент
                  к окну-рамке, создать дочерний MDI и свободное окно.
                  TDocManager и производные классы могут создавать и обслуживать специализированные средства, например, OLE-сервер.


                  Класс TDocTemplate (docmanag.h)


                  Это абстрактный базовый класс, обеспечивающий функциональные
                  возможности шаблона документа. Классы TDocTemplate создают документы и отображаемые элементы и обрабатывают наименование и просмотр документов. Администратор документов поддерживает список текущих объектов шаблонов. Каждый тип документа требует отдельного
                  шаблона документа.


                  Класс TDocTemplateT (docmanag.h)


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


                  Класс TDocument (docview.h)


                  TDocument - это абстрактный базовый класс, используемый как
                  интерфейс между документом, его отображаемыми элементами и администратором документа. Он создает, уничтожает и посылает сообщения об отображаемом элементе, информирующие, например, об изменении документа пользователем.
                  Чтобы послать сообщения соответствующим отображаемым элементам, документ поддерживает список всех существующих для данного
                  документа отображаемых элементов и взаимодействует с ними с помощью механизма обработки событий ObjectWindows. Вместо функции
                  SendMessage документ обращается к таблице событий отображаемого
                  элемента. Отображаемый элемент может обновлять данные документа,
                  вызывая функцию-элемент конкретного документа. Отображаемые элементы могут также представлять формируемые документом потоки.
                  Документы и отображаемые элементы образуют список характеристик, используемых приложением. При их создании и уничтожении
                  приложению посылаются сообщения, которое может запросить характеристики для определения характера обработки или отображения документа. Пригодность для данного документа конкретного отображаемого элемента должен определять администратор документов. Так как
                  функции характеристик атрибутов являются виртуальными, производный класс должен переопределить характеристики, определенные в
                  базовом классе. Каждый производный должен класс реализовывать
                  свои собственные типы атрибутов на основе собственных типов атрибутов строковых или двоичных данных. Если производный класс дублирует имена характеристик родительского класса, он должен обеспечивать такое же поведение и типы данных.
                  Хотя документы уже связаны с файлами, он не обязательно
                  должны быть файлами, а могут состоять из таблиц базы данных, почтовых сообщений, данных, передаваемых по факсу или через модем,
                  каталогов дисков и т.д.


                  Класс TDocument::List (docview.h)


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


                  Класс TDropInfo (point.h)


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


                  Класс TEdit (edit.h)


                  TEdit - это интерфейсный объект, представляющий в Windows
                  интерфейс редактируемого управляющего элемента. Объект TEdit должен использоваться для создания редактируемого управляющего элемента в родительском TWindow. TEdit может также способствовать
                  передаче данных между вашим приложением и редактируемыми управляющими элементами TDialog. Это потоковый класс.
                  Редактируемый управляющий элемент может быть однострочным и
                  многострочным (содержать несколько строк текста). Позиция первого
                  символа в управляющем элементе равна 0.


                  Класс TEditFile (editfile.h)


                  TEditFile - это окно редактирования файла. Элементы этого
                  класса управляют диалоговым окном и автоматически отвечают на такие команды как Open, Read, Save и др.


                  Класс TEditSearch (editsear.h)


                  TEditSeach - это редактируемый управляющий элемент, отвечающий на команды меню File, Replace и FindNext. Это потоковый
                  класс.


                  Класс TEditView (editview.h)


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


                  Класс TEventHandler (enenthan.h)


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


                  Класс TFileDocument (filedoc.h)


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


                  Класс TFileOpenDialog (opensave.h)


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


                  Класс TFileSaveDialog (opensave.h)


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


                  Класс TFileStatus (file.h)


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


                  Класс TFindReplaceDialog (fingrepl.h)


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


                  Класс TFloatingFrame (floaffra.h)


                  Этот класс, производный от TTinyCaption и TFloatingFrame,
                  содержит свободную рамку, которую можно позиционировать в любом
                  месте родительского окна. За исключением добавления строки заголовка, его поведение совпадает с TFrameWindow. Таким образом приложение, использующее TFrameWindow, может легко получить функциональные возможности TFloatingFrame простым изменением имени класса. При наличии клиентного окна свободная рамка сжимается, чтобы
                  поместиться в это окно и оставить место для полей рамки.


                  Класс TFont (gdiobject.h)


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


                  Класс TFont


                  Класс TFont позволяет вам создать и использовать в своих
                  приложениях шрифты Windows. Класс TFont инкапсулирует все атрибуты логического шрифта.
                  Построить объект TFont можно непосредственно, задав атрибуты
                  шрифта, или косвенно, задав TFont& или указатель на структуру
                  LOGFONT. При непосредственном построении шрифта создается новый
                  объект с заданными атрибутами.
                  При косвенном создании шрифта новый объект также создается,
                  но атрибуты копируются из указанного объекта. Вы можете создать
                  объект TFont и из существующего описателя HFONT.
                  Обращаться к объекту TFont можно через HFONT или логическую
                  структуру LOGFONT. Для получения HFONT из объекта TFont используйте операцию HFONT с объектом TFont в качестве параметра. Операция HFONT явно почти никогда не вызывается.


                  Класс TFrameWindow (framewin.h)


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


                  Класс TGadget (gadget.h)


                  Это базовый класс для производных классов - TBitMapGadget,
                  TButtonGadget, TControlGadget, TTextGadget и TSeparatorGadget.
                  Интерфейсные объекты TGadget принадлежат к окну реквизитов, имеют
                  границы и поля и собственную систему координат. Чтобы задать атрибуты реквизита, вы можете выбрать стиль границы или переопределить функцию PaintBorder.


                  Класс TGadget


                  Все реквизиты основываются на классе TGadget. Класс TGadget
                  содержит базовые функции, необходимые для всех реквизитов, включая управление обрамлением реквизита и его стилем, установку размера реквизита, его разрешение и запрещение и т.д.
                  В параметрах конструктора реквизита указывает номер его
                  идентификатора (произвольное значение) и стиль (None, Plain, Raised, Recessed или Embossed). Деструктор TGadget описывается как
                  virtual и удаляет реквизит из окна реквизита.
                  Для получения идентификатора вы можете идентифицировать реквизит с помощью функции GetId, которая не имеет параметров и
                  возвращает целочисленный идентификатор. Идентификатор реквизита
                  имеет несколько областей применения:
                • Вы можете использовать его для идентификации конкретного
                  реквизита. При большом числе реквизитов в окне реквизитов
                  легче всего определить используемый реквизит с помощью
                  идентификатора.

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

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

                • Вы можете проверять и изменять ширину полей, обрамления и
                  стиль обрамления реквизита. Для этого используются функции SetBorder, GetBorders, SetMargins, GetMargins, SetBorderStyle, GetBorderStyle.
                  Границей является внешнее обрамление реквизита. Используемая
                  совместно с функциями SetBorders и GetBorders структура TBorder
                  имеет 4 элемента данных (Left, Right, Top и Bottom), содержащие
                  ширину соответствующей границы реквизита.
                  Полями называется область между обрамлением реквизита и
                  внутренним прямоугольником реквизита. С функциями SetMargins и
                  GetMargins используется структура TMargins с 4 элементами данных:
                  Top, Bottom, Right и Left.
                  Ограничивающий прямоугольник реквизита - это область, занимаемая реквизитом. Она содержится в структуре TRect и состоит из
                  относительных координат X и Y верхнего левого и нижнего правого
                  углов реквизита в окне реквизита. Окно реквизита использует ограничивающий прямоугольник реквизита для его размещения. Он имеет



                  также важное значение для определения нажатия кнопки "мыши" на

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

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

                  Функция SetShrinkWrap позволяет автоматически настраивать

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

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

                  и вертикального размера определяют параметры shrinkWrapWidth и

                  shrinkWrapHeight.

                  Размером реквизита является размер его ограничивающего прямоугольника. С помощью функции SetSize вы можете настроить размер

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

                  окна реквизитов могут изменять желаемый размер реквизита.

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

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

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

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

                  Общедоступные элементы данных TGadget Clip и WideAsPossible

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

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

                  С помощью функций SetEnabled и GetEnabled вы можете разрешить и запретить реквизит. Запрещенный реквизит не стирается. В

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

                  Функцию CommandEnable можно переопределить в производном

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


                  Класс TGadgetWindow (gadgetwi.h)


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

                • Шрифт реквизита.

                • Верхнее, нижнее, правое и левое поля.

                • Единицы измерения.

                • Размер окна реквизита.



                • Класс TGadgetWindowFont (gadgetwi.h)


                  Этот производный от TFont класс применяется для работы со
                  шрифтами в окне реквизитов. Вы можете задать размер шрифта в
                  пунктах и его тип (жирный, наклонный). Для задания типа шрифта
                  можно использовать константы API Windows (FW_xxxx или FF_xxxx).


                  Класс TGauge (gauge.h)


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


                  Класс TGdiObject (gdiobject.h)


                  Это корневой псевдоабстрактный базовый класс для GDI-оболочек ObjectWindows. Вызовы API Windows, воспринимающие аргументы
                  обработки GDI, обычно заменяются вызовами более простых функций-элементов ObjectWindows, в который описатель поставляется
                  другим объектом. Классы TGdiObject, с которыми вы работаете, позволяют вам работать с описателем GDI и строить объект С++ с помощью псевдонима описателя. Обычно иерархия классов, построенных
                  на базе TGdiObject, обрабатывают все объекты GDI независимо от
                  объектов DC.
                  Объект TGdiObject поддерживает описатель GDI и флаг ShouldDelete, определяющий, когда объект и описатель должны уничтожаться.


                  Класс TGdiObject::TXGdi (dgibase.h)


                  Описывает исключительную ситуацию, возникающую в результате
                  проблем в функционировании GDI (например, создания слишком большого числа DC TWindow). Такая исключительная ситуация может возникать, если не найден драйвер dc, или не читается файл DIB.


                  Класс TGroupBox (groupbox.h)


                  Экземпляр TGroupBox - это интерфейсный объект, представляющий в Windows соответствующий элемент группового блока. В общем
                  случае объекты TGoupBox в диалоговых блоках или окнах (TDialog)
                  не используются, но они используются, когда вы создаете в окне
                  групповой блок.
                  Хотя групповые блоки не выполняют на экране активной функции, они визуально унифицируют группу блоков выбора, таких как
                  кнопки с независимой и зависимой фиксацией. Однако они могут выполнять важную роль при обработке изменения состояния в группе.


                  Класс THSlider (slider.h)


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


                  Класс TIC (dc.h)


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


                  Класс TIcon (gdiobjec.h)


                  Этот производный от TGdiObject класс представляет класс пиктограмм объектов GDI. Конструкторы TIcon может создавать пиктограммы из ресурса или из явной информации.
                  Поскольку пиктограммы не являются фактически объектами GDI,
                  деструктор TIcon переопределяет базовый деструктор.


                  Класс TIcon


                  Класс TIcon инкапсулирует описатель пиктограммы и конструкторы для инициализации объекта TIcon. Вы можете использовать
                  класс TIcon для построения пиктограммы из ресурса или на основе
                  явной информации.
                  Построить пиктограмму можно несколькими способами: из существующего объекта TIcon, из ресурса в текущем приложении, из
                  ресурса в другом модуле или на основе заданного размера и явной
                  информации. Для 32-разрядных приложений можно также использовать
                  два специальных конструктора, один из которых имеет два параметра
                  (указатель на массив буферов, содержащих биты данных пиктограммы,
                  и размера - числа бит в буфере), а другой - один параметр (структуру ICONINFO). ~TIcon удаляет пиктограмму и освобождает занимаемую ей память.
                  Обращаться к TIcon можно через HICON. Чтобы получить HICON
                  из объекта TIcon, используйте операцию HICON. В 32-разрядных приложениях доступна также функция TIcon GetIconInfo с единственным
                  параметром - указателем на структуру ICONINFO. Она заполняет
                  структуру ICONINFO и возвращает True в случае успешного выполнения.


                  Класс TInput (inputdia.h)


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


                  Класс TInStream (docview.h)


                  Этот производный от TStream и istream является базовым классом, используемым для определения потоков ввода для документов.


                  Класс TKeyboardModeTracker (keymodef.h)


                  Данный производный от TWindow класс является потоковым смешанным классом для отслеживания изменений в режимах клавиатуры
                  при переключении клавиш CapsLock, NumLock и ScrollLock). Установив в конструкторе updateStatusBar в значение True, вы можете
                  также обновление строки состояния при изменении режима.


                  Класс TLayoutMetrics (layoutwi.h)


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


                  Класс TLayoutWindow (layoutwi.h)


                  Этот производный от TWindow класс обеспечивает определения
                  пропорций окна и ограничения расположения окна. См. TLayoutConstraint и TLayoutMetrics.


                  Класс TListBox (listbox.h)


                  Это интерфейсный объект, который представляет соответствующий элемент блока списка в Windows. Он должен использоваться для
                  создания управляющего элемента блока списка в родительском TWindow. TListBox можно использовать для упрощения взаимодействия
                  между вашим приложением и управляющим элементом блока списка в
                  TDialog. Это потоковый класс.


                  Класс TListView (listview.h)


                  Этот производный от TListBox и TView класс обеспечивает создание для блоков списка отображаемых элементов.


                  Класс TLookupValidator (validate.h)


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


                  Класс TMDIChild (ndichild.h)


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


                  Класс TMDIFrame (mdi.h)


                  Представленные данным классом окна-рамки MDI - это перекрывающиеся окна, используемые в качестве основных окон MDI-приложений. Объект TMDIFrame автоматически создает и инициализирует необходимое Windows клиентное "окно" MDI, а также устанавливает используемый по умолчанию стиль, минимизируя мерцание при стирании
                  фона. Являясь производным от TFrameWindows, данный класс (и
                  дочерние окна) наследует перемещение с помощью клавиатуры.


                  Класс TMemoryDC (dc.h)


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


                  Класс TMenu (menu.h)


                  Этот класс инкапсулирует меню окна. Функции-элементы этого
                  класса вы можете использовать для построения, модификации, опроса
                  и создания объектов меню. Вы можете также использовать TMenu для
                  добавления к меню битовых массивов или спецификации выбора элемента меню.


                  Класс TMenuDescr (framewin.h)


                  Этот класс описывает вашу строку меню и ее упорядочивание.
                  Для идентификации ресурса меню и массива значение, указывающих
                  число меню в каждой группе строки меню он использует идентификатор ресурса. Фактически, конструктор данного класса просто иницилизирует элементы на основе передаваемых элементов. Все действия
                  по объединению групп меню выполняет функция TFrameWindow MergeMenu.


                  Класс TMessageBar (messageb.h)


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


                  Класс TMessageBar


                  Класс TMessageBar (строка сообщения) реализует без рамки и
                  один текстовый реквизит размером с окно. Он позиционируется горизонтально по нижней границе родительского окна.
                  В конструкторе TMessageBar задается указатель на родительское окно, шрифт (указатель на TFont), и модуль (TModule или 0).
                  Функция ~TMessageBar удаляет освобождает память, заданную текстом
                  объекта.
                  Для задания текста сообщения в текстовом реквизите используется функция SetText, а для вывода подсказки - SetHintText.


                  Класс TMetaFileDC (dc.h)


                  Этот производный от TDC класс обеспечивает доступ к DC c
                  выбранным для отображения метафайле.


                  Класс TMetaFilePict (metafile.h)


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


                  Класс TMitMap (gdiobjec.h)


                  Это класс интерфейса GDI растровой графики, производный от
                  TGdiObject. Объекты TBitMap - это DDB (Device Dependent Bitmaps).


                  Класс TModule (module.h)


                  Библиотеки DLL ObjectWindows строят экземпляр TModule, который действует как объектно-ориентированная замена библиотечного
                  модуля (DLL). TModule определяет поведение, реализуемое библиотекой и прикладными модулями. Приложение ObjectWindows строит экземпляр TApplication, производный от TModule. Конструктор TModule
                  управляет загрузкой и освобождением внешних DLL, а его функции-элементы обеспечивают поддержку используемой по умолчанию обработки ошибок.


                  Класс TModule::TXInvalideModule (module.h)


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


                  Класс TMutex::Lock (thread.h)


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


                  Класс TMutex (thread)


                  Этот класс обеспечивает системно-независимый интерфейс для
                  критических секций в нитях. Объекты этого класса можно использовать в сочетании с TMutex::Lock и обеспечивать выполнение любой
                  защищенной блокировкой секции кода только одной нитью.
                  Разница между классами TMutex и TCritical в том, что при
                  создании блокировки с использованием TMutex можно задать
                  тайм-аут, и объект TMutex имеет описатель HANDLE, который может
                  использоваться вне класса.


                  Класс TOpenSaveDialog (opensave.h)


                  Это базовый класс для режимных диалогов, который позволяет
                  вам открывать и сохранять файл под заданным именем. Он строит
                  структуру TData и передает ее конструктору. Затем диалог выполняется (режимный) или создается (безрежимный). При возврате обновляются необходимые поля.


                  Класс TOutStream (docview.h)


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


                  Класс TPaint (dc.h)


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


                  Класс TPalette (gdiobjec.h)


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


                  Класс TPaletteEntry (color.h)


                  Это поддерживающий класс, производный от структуры tagPALETTEENTRY. Он используется в сочетании с классами TPalette и TColor
                  и упрощает логические операции с палитрами и цветами.


                  Класс TPen (gdiobject.h)


                  Это класс, производный от TGdiObject. Он инкапсулирует инструмент пера GDI. Перья можно строить на основе явной информации
                  или косвенно.


                  Класс TPen


                  Класс TPen инкапсулирует логическое перо. Он содержит цвет
                  чернил пера (инкапсулированный в объекте TColor), ширину пера и его стиль.
                  Вы можете построить объект TPen непосредственно, задавая
                  цвет, ширину и стиль пера, или косвенно, задавая TPen& или указатель на структуру LOGPEN. При непосредственном построении задается объект TPen c заданными атрибутами. Параметр стиля может иметь
                  значения PS_SOLID, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT, PS_NULL или
                  PS_INSIDEFRAME.
                  При косвенном создании пера новый объект также создается, но
                  атрибуты копируются из указанного объекта. Вы можете создать объект TPen из существующего описания TPen.
                  Доступ к объекту TPen можно получить через структуру HPEN
                  или LOGPEN. Для получения HPEN из объекта TPen, используйте операцию HPEN, передав объект TPen в качестве параметра. Явно операция HPEN почти никогда не вызывается.


                  Класс TPoint (point.h)


                  Это поддерживающий класс, производный от tapPOINT. Он инкапсулирует понятие двумерной точки, которая обычно представляет позицию на экране. TPoint наследует два элемента данных - координаты x и y.


                  Класс TPointer<> (point.h)


                  Этот небольшой утилитный класс обеспечивает автоматическое
                  уничтожение объектов, построенных с помощью new. Это параметризованный класс, который содержит указатель своего параметризованного типа и переопределяет операции, которые ведут себя как указатель объекта. Если указатель присваивается объекту TPointer, то в
                  конце концов он будет удален (при выходе из функции, исключительной ситуации или присваивании тому же объекту другого указателя).
                  Объекты TPointer должны создаваться в стеке. С помощью new их
                  создать нельзя.


                  Класс TPopMenu (menu.h)


                  Создает пустое всплывающее меню для добавления к существующему окну или всплывающему меню.


                  Класс TPreviewPage (preview.h)


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


                  Класс TPrintDC (dc.h)


                  Производный от TDC класс, обеспечивающий доступ к принтеру.


                  Класс TPrintDialog (printdia.h)


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


                  Класс TPrinter (printer.h)


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


                  Класс TPrinterAbortDlg (printer.h)


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


                  Класс TPrintout (printer.h)


                  Представляет физическую распечатку (печатаемый документ),
                  посылаемую на принтер. Это абстрактный объект, который сам по себе не может использоваться для печати. Для каждого документа, типа документа и производного класса нужно создавать TPrintout c
                  переопределенной функцией PrintPage.


                  Класс TPrintPreviewDC (preview.h)


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


                  Класс TProcInstance (point.h)


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


                  Класс TPXPictureValidator (validate.h)


                  Объекты этого класса сравнивают ввод пользователя с шаблоном
                  формата данных и определяют допустимость ввода. Шаблоны совместимы с шаблонами реляционных баз данных Borland, которые используются для управления вводом.


                  Класс TRadioButton (radiobut.h)


                  Это интерфейсный объект, представляющий в Windows соответствующий элемент типа кнопки с зависимой фиксацией. Его можно использовать для создания таких кнопок в родительском TWindow, а
                  также для содействия связи между приложением и управляющими элементами командных кнопок в TDialog.
                  Кнопки с зависимой фиксацией могут иметь два состояния. TRadioButton наследует управление состояниями из базового класса
                  TCheckBox. Кнопки с зависимой фиксацией могут быть частью группы.
                  TRadioButton - это потоковый класс.


                  Класс TRangeValidator (validate.h)


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


                  Класс TRect (point.h)

                  Это поддерживающий класс, производный от tagRect и инкапсулирующий характеристики прямоугольников со сторонами, параллельными осям x и y. В ObjectWindows эти прямоугольники определяют
                  обрамление окон и областей отсечения. TRect наследует четыре элемента данных, представляющих верхнюю, левую, нижнюю и правую координаты прямоугольника.



                  Класс TRegion (gdiobjec.h)


                  Этот производный от TGdiobject класс представляет абстрактные области или формы GDI. Для комбинирования и сравнения областей предусмотрено несколько операций.


                  Класс TRegion


                  Класс TRegion используется для определения в контексте устройства области. В контексте устройства вы можете выполнить ряд
                  операций, таких как изображение, закраска, инвертирования и т.д.
                  Класс TRegion можно также использовать, чтобы определить область
                  для собственных операций.
                  Области могут быть различных форм и размеров, от простых
                  прямоугольников и прямоугольников с округлыми краями до сложных
                  многоугольных форм. Форму области определяет используемый конструктор. Вы можете также косвенно построить область из описателя
                  области или существующего объекта TRegion.
                  TRegion предусматривает используемый по умолчанию конструктор, который создает пустую прямоугольную область. Для инициализации объекта TRegion вы можете использовать функцию SetRectRgn.
                  Для прямого создания TRegion можно использовать несколько источников. Для создания прямоугольной области используется конструктор, в качестве параметров которого задаются логические координаты объекта TRect. Конструктор, создающий прямоугольную область с
                  закругленными краями, имеет также параметр TSize, определяющий
                  высоту и ширину эллипса закруглений. Конструктор эллиптической
                  области имеет параметр TEllipse. Для создания нерегулярной многоугольной области конструктору передается массив точек TPoints
                  (координат вершин многоугольника).
                  Вы можете получить доступ или модифицировать объекты TRegion
                  непосредственно через описатель HRGN или через ряд функций-элементов и операций. Для получения HRGN из объекта TRegion используйте операцию HRGN.
                  С помощью функций-элементов TRegion вы можете получить информацию об объекте TRegion и определить, содержится ли точка
                  внутри области или на ее границе.
                  Функция SetRectRgn используется для переустановки области
                  объекта в прямоугольную область. С помощью функции Contain можно
                  определить, находится ли точка внутри области. Координаты точки
                  указываются в параметре этой функции. Функция Touches позволяет
                  определить, находится ли какая-нибудь часть прямоугольника внутри
                  области. Функцию GetRgnBox можно использовать для получения координат ограничивающего прямоугольника области (наименьшего возможного прямоугольника, включающего в себя всю область).



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

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

                  других элементов с указанной областью. Булевские операции == и !=

                  используются для проверки - сравнения двух областей. Изменит область можно с помощью операций присваивания. Например, операция =

                  позволяет присвоить одну область другой, += позволяет сдвинуть

                  область на смещение, заданное в объекте TSize (область сохраняет

                  при этом все свои свойства), операций -= выполняет обратное действие - вычитает смещение из каждой точки области (при использовании с объектом TSize).

                  Операция &= может выполняться с объектами TRegion и TRect

                  (перед выполнением операции TRect конвертируется в TRegion с помощью конструктора) и задает пересечение областей (это логическая

                  операция И). Операция |= может выполняться с объектами TRegion и

                  TRect (перед выполнением операции TRect конвертируется в TRegion)

                  и задает объединение областей (это логическая операция ИЛИ). Операция ^= может выполняться с объектами TRegion и TRect (перед выполнением операции TRect конвертируется в TRegion) и позволяет

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

                  (это логическая операция исключающего ИЛИ).


                  Класс TReplaceDialog (findrepl.h)


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


                  Класс TResId (point.h)


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


                  Класс TResponseTableEntry (eventhan.h)


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


                  Класс TRgbQuad (color.h)


                  Это поддерживающий класс, производный из структуры tagRGBQUAD, элементы rgbBlue, rgbGreen и egbRead которой задают относительные интенсивности голубого, зеленого и красного цветов. TEgbQuad используется в сочетании с классами TPalette и TColor для
                  упрощения операций с цветами.


                  Класс tRgbTriple (color.h)


                  Это поддерживающий класс, производный из структуры tagRgbTriple, элементы rgbBlue, rgbGreen и egbRead которой задают относительные интенсивности голубого, зеленого и красного цветов.
                  Данный класс используется в сочетании с классами TPalette и TColor для упрощения операций с цветами.


                  Класс TScrollBar (scrollba.h)


                  Объекты этого класса представляют специальные управляющие
                  элементы - автономным вертикальную и горизонтальную полосы прокрутки. Большинство функций-элементов этого класса служат для управления скользящим маркером полосы прокрутки и диапазоном. Позиция полосы прокрутки может автоматически настраиваться в ответ на
                  сообщения Windows. TScrollBar - это потоковый класс.


                  Класс TScroller (scroller.h)


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


                  Класс TSeparatorGadget (gadget.h)


                  Это простой класс, который можно использовать для создания
                  разделителя между реквизитами. Для этого размер разделителя нужно
                  задать в единицах SM_CXBORDER (ширина окна-рамки) и SM_CYBORDER
                  (высота окна-рамки). Правая и нижняя границы разделителя устанавливаются вызовом GetSystemMetrics.


                  Класс TSeparatorGadget


                  TSeparatorGadget - это очень простой реквизит-разделитель.
                  Он просто занимает место в окне реквизитов. Вы можете использовать его, наслаивая в окне другие реквизиты, и для обеспечения полей между реквизитами (иначе они будут размещаться в окне вплотную).
                  Конструктор TSeparatorGadget запрещает сам себя и выключает
                  настройку размера. Параметр Size конструктора используется для
                  задания высоты и ширины реквизита.


                  Класс TShouldDelete (shddel.h)


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


                  Класс TSize (point.h)


                  Это поддерживающий класс, производный от структуры tagSIZE.
                  Он инкапсулирует понятие двумерной величины и представляет смещение или высоту и ширину прямоугольника. TSize наследует из tagSIZE два элемента данных - cx и cy.


                  Класс TSlider (slider.h)


                  Данный абстрактный базовый класс, производный от TScrollBar,
                  определяет базовое поведение скользящих маркеров полосы прокрутки. Как и полосы прокрутки, маркеры имеют минимальную и максимальную позицию. Скользящие маркеры могут перемещаться с помощью
                  "мыши" или клавиатуры. С помощью "мыши" можно буксировать маркер
                  на новую позицию. Клавиши Home и End позволяют перемещать маркер
                  в предельные позиции.


                  Класс TStatic (static.h)


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


                  Класс TStatus (except.h)


                  Используется в основном для обратной совместимости с предыдущими версиями ObjectWindows в модуле TModule и TWindow для указания ошибки при инициализации интерфейсного объекта.


                  Класс TStatusBar (statusba.h)


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


                  Класс TStatusBar


                  Класс TStatusBar (строка состояния) аналогичен TMessageBar.
                  Разница состоит в том, что строка состояния имеет больше возможностей, чем простая строка сообщения, и резервирует пространство
                  для вывода индикаторов режимов клавиатуры (регистр, вставка/замена и др.).
                  В конструкторе TStatusBar задается указатель на родительское
                  окно, стиль границы, индикаторы режима, шрифт (указатель на
                  TFont) и модуль (TModule для базового конструктора TWindow или
                  0).
                  TStatusBar переопределяет заданную по умолчанию функцию Insert. По умолчанию версия TStatusBar добавляет новый реквизит
                  после существующего текстового реквизита, но перед индикатором
                  режима клавиатуры. Однако вы можете это изменить.
                  Чтобы вывести к строке состояния конкретный индикатор режима, вы должны задать при построении строки состояния индикатор
                  режима. TStatusBar предусматривает ряд функций для модификации
                  индикаторов режима. Вы можете изменить состояние индикатора режима на произвольное состояние. Для этого используется функция SetModeIndicator.
                  Функция SetSpacing позволяет задавать интервал между реквизитами. В параметре этой функции задается ссылка на объект TSpacing - структуру, определенную в классе TStatusBar.


                  Класс TStream (docview.h)


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


                  Класс TStreamable (streambl.h)


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


                  Класс TStreamableBase (objstrn.h)


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


                  Класс TStringLookupValidator (validate.h)


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


                  Класс TSync::Lock (thread.h)


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


                  Класс TSync (thread.h)


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


                  Класс TSystemMenu (menu.h)


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


                  Класс TTextGadget (textgadg.h)


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


                  Класс TTextGadget


                  TTextGadget используется для вывода в окне реквизитов текстовой информации. Вы можете задать число символов, которые должны
                  выводиться в реквизите, а также выравнивание в нем текста.
                  В конструкторе TTextGadget задаются идентификатор реквизита,
                  стиль его рамки, выравнивание текста, число выводимых символов и
                  текст реквизита. ~TTextGadget автоматически освобождает занимаемую текстом реквизита память.
                  Получить и установить текст реквизита вы можете с помощью
                  функций GetText и SetText.


                  Класс TThread (thread.h)


                  Обеспечивает для нитей системно-независимый интерфейс. Состояния нити определяются следующим образом:

                  Состояние Описание
                  Created Объект создан, но нить не запущена. Это состояние может перейти только в Running, что происходит при вызове Start.
                  Running Нить успешно запущена. Пользователь может вызвать Suspend, приостановив выполнение нити. Resume возобновляет выполнение. Когда нить завершается, объекты переходят в состояние Finished.
                  Suspended Нить приостановлена пользователем. Resume возобновляет выполнение.
                  Finished Нить завершила выполнение. Допустимые переходы
                  из этого состояния отсутствуют.



                  Класс TTinyCaption (tinycapt.h)


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


                  Класс TToolBox (toolbox.h)


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


                  Класс TToolBox


                  TToolBox отличается от других классов окон реквизитов ObjectWindows тем, что не упорядочивает реквизиты в одну строку, а
                  располагает их в виде матрицы. Все столбцы матрицы имеют одинаковую ширину (равную ширине максимального реквизита), а строки одинаковую высоту (равную высоте максимального реквизита).
                  TToolBox можно создавать как клиентное окно в TFloatingFrame
                  для получения инструментального блока типа палитры. Примеры можно
                  найти в подкаталоге EXAMPLES\OWL\OWLAPPS\PAINT.
                  В конструкторе TToolBox задается указатель на родительское
                  окно объекта, число столбцов и строк в матрице, направление (горизонтальное/вертикальное) и модуль (TModule для базового конструктора TWindow или 0).
                  Вы можете задать автоматическое определение числа столбцов и
                  строк (AS_MANY_AS_NEEDED).


                  Класс TTread::TThreadError (thread.h)


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


                  Класс TValidator::TXValidator (validate.h)


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


                  Класс TValidator (validate.h)


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


                  Класс TVbxControl (vbxctl.h)


                  Этот производный от TControl класс обеспечивает интерфейс
                  для управляющих элементов Visual Basic (VBX). Вы можете использовать его для получения или установки характеристик VBX. В определенных ситуациях можно использовать дополнительные методы их обработки.
                  Характеристиками элементов VBX можно управлять с помощью индекса или имени. Для этого предназначены несколько функций-элементов. Если вы хотите, чтобы объект управляющего элемента TVbx
                  обрабатывал события VBX, нужно построить производный класс и добавить в него таблицу реакции.


                  Класс TVbxControl


                  TVbxControl обеспечивает для управляющего элемента фактический интерфейс и позволяет вам:
                • Строить управляющий объект VBX.

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

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

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

                • Вызывать стандартные методы управляющего элемента VBX: AddItem, Refresh, Move и RemoveItem.

                • Получать описатель управляющего элемента с помощью функции-элемента TVbxControl GetHCTL.

                • Класс TVbxControl является производным от класса TControl,
                  который, в свою очередь, является производным от TWindow. Таким
                  образом, TVbxControl действует во многом аналогичном другим основанным на TWindow управляющим элементам.
                  TVbxControl имеет два конструктора, первый из которых позволяет вам динамически строить управляющий элемент VBX путем спецификации имени файла VBX, идентификатора управляющего элемента,
                  класса управляющего элемента, его заголовка, расположения и размера. Второй конструктор позволяет построить объект TVbxControl,
                  используя VBX, определенный в файле ресурса приложения.
                  Управляющие элементы VBX можно строить явно или косвенно. Вы
                  можете построить объект явным образом вызовом одного из конструкторов. Неявное его построение осуществляется когда вы не вызываете конструкторы и позволяете создавать экземпляр управляющего
                  элемента родительскому объекту.
                  Конструктор VBX вызывается обычно в конструкторе родительского объекта, так что управляющий элемент VBX будет построен и
                  готов к работе при создании родительского окна. Можно также отложить построение управляющего элемента VBX до того момента, когда
                  он потребуется. Затем, в зависимости от того, что делает пользователь, вы можете создать экземпляр объекта и вывести его в существующем интерфейсном элементе.
                  Неявное построение имеет место, когда вы проектируете интерфейсный элемент вне исходного кода приложения, например, с помощью Resource Workshop. Вы можете использовать Resource Workshop
                  для добавления управляющих элементов VBX в диалоговые окна и другие интерфейсные элементы. Затем, при создании экземпляра родительского объекта дочерние элементы, такие как поля редактирования, блоки списка, командные кнопки и управляющие элементы VBX
                  автоматически создаются вместе с родительским объектом.


                  Класс TVbxEventHadler


                  Класс TVbxEventHadler - это небольшой класс и в основном малоинтересный для программистов класс. Однако он выполняет важные
                  действия. Без него вы не могли бы взаимодействовать с управляющими элементами VBX, поскольку он реализует программирование, управляемое событиями.
                  Этот класс состоит из единственной функции и таблицы реакции
                  на одно сообщение. Функция называется EvVbxDispatch. Это подпрограмма обработки события для сообщения WM_VBXFIREEVENT. EvVbxDispatch получает сообщение WM_VBXFIREEVENT, преобразует необработанное сообщение в структуру WVBXEVENT и планирует новое сообщение, которое обрабатывается родительским объектом управляющего
                  элемента. Это означает, что родительский объект снова вызывает
                  себя с другим сообщением. Это новое сообщение намного легче обработать и понять.


                  Класс TVbxEventHandler (vbxctrl.h)


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


                  Класс TView (docview.h)


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


                  Класс TVSlider (slider.h)


                  Этот производный от TSlider класс реализует детали скользящих маркеров вертикальной полосы прокрутки.


                  Класс TWindow (window.h)


                  Этот класс, производный от TEventHandle и TStreamableBase,
                  обеспечивает специфическое для окна поведение и инкапсулирует
                  многие функции API Windows. Функции TWindow определяют создание
                  окна, включая регистрацию, и его атрибуты.
                  TWindow - это общее окно, которое может перемещаться и изменяться в размере. Вы можете построить экземпляр этого класса, ходя обычно он используется в качестве базового для специализированных оконных классов.


                  Класс TWindowDC (dc.h)


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


                  Класс TWindows::TXWindow (window.h)


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


                  Класс TWindowView (docview.h)


                  Этот производный от TView и TWindow является потоковым базовым классом, который можно использовать для создания производных
                  отображаемых элементов. Функции TWindowView переопределяют виртуальные функции TView. C помощью этого класса вы можете расширить
                  функциональные возможности отображаемого элемента документа.


                  Класс TXCompatibility (except.h)


                  Описывает исключительную ситуацию, возникающую в результате
                  установки TModule::Status в ненулевое значение (используется для
                  обратной совместимости с ObjectWindows 1.0).


                  Класс TXOwl (except.h)


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


                  Класс xalloc (except.h)


                  Сообщает об ошибке при запросе распределения памяти.


                  Класс xmsg (except.h)


                  Выводит сообщение, соответствующее исключительной ситуации.


                  КлассTMDICliten (mdi.h)


                  Клиентные окна многодокументального интерфейса (MDI), представленные объектом TMDIClient, управляют дочерними окнами MDI,
                  для которых родительским является TMDIFrame. Это потоковый класс.


                  Классы - как строительные блоки


                  В программировании на Си используются и переменные, и структуры
                  данных, и функции. Однако, они не очень удобно комплексируются в блоках. Borland C++ (и другие объектно-ориентированные языки) чудесно
                  помещают эти компоненты вместе, так что программисту приятно работать.

                  На схеме показан процесс создания классов:
                  Данные Комплексирование
                  классов
                  double big_bucks;
                  Функции > Bank
                  void deposit();
                  double withdraw();
                  >
                  Создание классов
                  Подобно тому, как структуры в Си используют для своей спецификации внутренние переменные, так классы в С++ используют для своей спецификации элементы-данных и функции-элементы. Для каждого задействованного, при написании программы класса, транслятор порождает соответствующие строки кода.


                  Классы реквизитов ObjectWindows


                  ObjectWindows предусматривает ряд классов, производных от
                  TGadget. Эти реквизиты позволяют создавать многосторонние и простые в использовании оконные элементы и новые способы взаимодействия пользователя с приложением. Это классы TSeparatorGadget,
                  TTextGadget, TButtonGadget, TControlGadget и TBitmapGadget.


                  Классы управляющих элементов VBX


                  ObjectWindows предусматривает два класса, используемых при
                  проектировании интерфейса для управляющих элементов VBX. Это
                  классы TVbxControl и TVbxEventHandler.


                  Классы управляющих элементов


                  Классы управляющих элементов ObjectWindows перечислены в
                  следующей таблице:

                  Управляющий элемент Класс Использование
                  Блок списка TListBox Прокручивающийся список элементов, например, файлов, из которого можно осуществить выбор.
                  Полоса прокрутки TScrollBar Обычная полоса прокрутки, подобная полосам прокрутки в окнах и блоках списков.
                  Командная кнопка TButton Кнопка нажатия с соответствующим текстом.
                  Кнопка с независимой фиксацией TCheckBox Блок, который может включен или выключен, с соответствующим текстом.
                  Кнопка с зависимой фиксацией TRadioButton Кнопка, которая может быть выбрана или нет. Обычно используется при взаимно исключающем выборе.
                  Блок группы TGroupBox Статичный прямоугольник с текстом в верхнем левом углу, использующийся для объединения других управляющих элементов.
                  Редактируемый управляющий элемент TEdit Поле для ввода текста пользователем.
                  Статический управляющий элемент TStatic Текстовое поле, которое не может быть модифицировано пользователем.
                  Комбинированный блок TComboBox Комбинация блока списка и редактируемого управляющего элемента.
                  Регулятор THSlider
                  TVSlider
                  Горизонтальные и вертикальные управляющие элементы, в которых пользователь может выбирать нужный диапазон (аналогично полосам прокрутки).
                  Индикатор TGauge Статический управляющий элемент, показывающий ход выполнения процесса.

                  Примеры программ с этими элементами можно найти в каталогах
                  OWL\OWLAPI и OWL\OWLAPPS.
                  Для Windows управляющие элементы являются просто специальными окнами; в ObjectWindows, поэтому TControl является производным
                  из TWindow. Классы, производные от TControl, представляют управляющие элементы Windows. В своих прикладных программах вы будете
                  использовать экземпляры классов, описанных в приведенной выше
                  таблице.
                  Объекты управляющих элементов и объекты окон аналогичны в
                  том, что они ведут себя как дочерние окна, и вы можете создавать
                  и уничтожать их. Однако стандартные управляющие элементы отличаются от других окон тем, что обрабатывает их сообщения и отображает эти элементы Windows. Специализированные управляющие элементы ObjectWindows выполняют эти задачи самостоятельно.
                  Во многих случаях вы можете непосредственно создать экземпляры перечисленных классов. Однако иногда может потребоваться
                  создать производные классы со специализированном поведением.


                  Классы в DLL


                  Данная утилита удобна для DLL, использующей классы C++, по
                  двум соображениям. Во-первых, если вы используете ключевое слово
                  _exрort при определении класса, экспортируются все невстроенные
                  функции-элементы и элементы статических данных для этого класса.
                  Удобнее создать файл определения модуля с помощью IMPDEF, так как
                  в нем будут перечислены все экспортируемые функции, включая функции-элементы и элементы статических данных.
                  Поскольку имена данных функций являются "скорректированными", процесс перечисления всех имен функций в секции EXPORTS файла определения модуля для создания библиотеки импорта из файла
                  определения модуля является очень утомительным. Если для создания
                  файла определения модуля вы используете утилиту IMPDEF, она будет
                  включать порядковое значение для каждой экспортируемой функции,
                  так же как и исходное имя в комментариях, следующих за точкой
                  входа функции, если экспортируемое имя является "скорректированным". Так, например, файл определения модуля, созданный утилитой
                  IMPDEF для DLL, которая использует классы C++, будет выглядеть
                  примерно следующим образом:
                  LIBRARY имя_файла
                  DESCRIPTION 'Описание'
                  EXPORTS
                  скоррект_имя_экпорт_функции @номер ; имя_экспорт_функции
                  ...
                  скоррект_имя_экпорт_функции @номер ; имя_экспорт_функции
                  где "имя_файла" является корневым именем DLL, 'Описание' является
                  значением утверждения DESCRIPTION, если DLL была предварительно
                  скомпонована с файлом определения модулей, который включал ут-
                  верждение DESCRIPTION, "скоррект_имя_экпорт_функции" представляет
                  собой скорректированное имя, "номера" являются порядковыми значе-
                  ниями (целыми) функций, а "имя_экпорт_функции" задает исходное
                  имя функции.


                  Клавиатурные макрокоманды


                  Макрокоманды представляют собой просто определяемые вами
                  оперативные клавиши. Одной клавише вы можете назначить любую последовательность команд и нажатий клавиш.
                  Расположенная в меню Options команда Macros выводит всплывающее меню с командами для определения клавиатурных макрокоманд и
                  удаления ненужных: Create (Alt+=), Stop Recording (Alt+-), Remove
                  и Delete All. Команда Create начинает запись макрокоманды, а команда Stop Recording завершает ее (не используйте для завершения
                  записи команду Options Macro Stop Recording, так как она добавится к вашей макрокоманде). Delete All удаляет все текущие макрокоманды.


                  Ключевые слова Borland C++



                  __asm __es __interrupt short
                  _asm _es _interrupt signed
                  asm __export interrupt sizeof
                  auto _export __loadds __ss
                  break extern _loadds _ss
                  case __far long static
                  catch _far __near __stdcall
                  __cdecl far _near _stdcall
                  _cdecl __fastcall near struct
                  cdecl _fastcall new switch
                  char __finally operator template
                  class float __pascal this
                  const for _pascal __thread
                  continue friend pascal throw
                  __cs goto private __try
                  _cs __huge protected try
                  default _huge public typedef
                  delete huge register union
                  do if return unsigned
                  double __import __rtti virtual
                  __ds _import __saveregs void
                  _ds import _saveregs volatile
                  else inline __seg while
                  enum int _seg



                  Ключевые слова, специфические для C++



                  asm friend protected try
                  catch inline public virtual
                  class new template __rtti
                  delete operator this
                  private throw



                  Кнопки с зависимой и независимой фиксацией


                  Кнопка с независимой фиксацией (check box) обычно предоставляет пользователю возможность выбора из двух состояний. Пользователь может выбрать этот управляющий элемент, отменить его выбор
                  или оставить его как есть. В группе кнопок с независимой фиксацией вы можете выбрать любой из этих управляющих элементов или все
                  эти элементы.
                  Кнопки с зависимой фиксацией (radio button) используются для
                  выбора одной из взаимоисключающих возможностей.
                  Класс TCheckBox является производным от TButton и представляет кнопки с независимой фиксацией, а класс TRadioButton, представляющий кнопки с зависимой фиксацией, является производным от
                  TCheckBox (кнопки с независимой фиксацией и зависимой фиксацией
                  частично имеют общее поведение).
                  Кнопки с зависимой и независимой фиксацией называют иногда
                  блоками выбора. Такой управляющий элемент выводится на экран в
                  виде выбранного или невыбранного блока. Примеры этих управляющих
                  элементов вы можете найти в подкаталоге EXAMPLES\OWL\OWL\OWLAPI\BUTTON.
                  TCheckBox и TRadioButton имеют конструктор с 7 стандартными
                  параметрами конструктора объекта управляющего элемента (родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, необязательный идентификатор библиотеки), плюс указатель на текстовую строку и указатель на групповой блок, объединяющий блоки выбора (или 0, если такого группового блока нет).
                  Кнопки с независимой фиксацией по умолчанию имеют стиль
                  BS_AUTOCHECHBOX. Это значит, что Windows обрабатывает щелчок
                  "мышью" на этой кнопке, переключая ее состояния. При отсутствии
                  такого стиля состояние кнопки требуется устанавливать вручную.
                  Кнопки с зависимой фиксацией по умолчанию имеют стиль BS_AUTORADIOBUTTON. Это значит, что Windows обрабатывает щелчок "мышью" на
                  этой кнопке, переключая ее состояния, отменяя выбор всех других
                  кнопок в группе. При отсутствии такого стиля нужно перехватывать
                  уведомляющие сообщение и устанавливать состояние кнопки вручную.
                  В некоторых случаях управлять состоянием кнопки может не
                  пользователь, а приложение. TCheckBox определяет несколько функций-элементов для модификации состояния кнопки с независимой фиксацией: Check, SetCheck, Uncheck, Toggle, SetState и SetStyle,
                  которые отменяю и устанавливают выбор кнопки, переключают ее,
                  подсвечивают и изменяют стиль кнопки. При использовании этих
                  функций для кнопки с независимой фиксацией ObjectWindows обеспечивает выбор в группе только одной кнопки.
                  Опрашивая блок выбора, вы можете отреагировать на его состояние. Кнопки с зависимой фиксацией имеют два состояния: выбрана
                  (BF_CHECKED) и не выбрана (BF_UNCHECKED). Блоки с независимой
                  фиксацией имеют необязательное третье состояние (BF_GRAYED). Для
                  опроса состояния используются функции GetCheck и GetState.


                  Коды операций


                  В качестве операторов встроенного ассемблирования допускается включать любые коды операций 80х86. Существует четыре класса
                  команд, позволяемых компилятором Borland C++:
                • обычные команды - стандартный набор кодов операций процессора 8086;

                • строковые команды - специальные коды обработки строк;

                • команды перехода - различные коды операций перехода;

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

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


                  Когда тип не проверяется


                  Как вы уже могли заметить, указатель базового класса, такой как
                  *p фигуры shape, может указывать не только на объект shape, но также
                  и на объект circle. Это делается без указания типа. Фактически, вы
                  можете использовать базовый указатель класса, для указания на любой
                  порожденный объект. Например, *p может указывать на rect, на box3d,
                  на cylinder и так далее. Вот такие возможности заложены в указателях.
                  Однако, преобразование неверно. Например, указатель круга circle
                  не может указывать на объект shape. Почему? Потому что радиус radius
                  круга отсутствует у фигуры shape. Так если вы попытались сделать из
                  фигуры круг, без радиуса, то вероятно будет ошибка.


                  Команда Attach


                  Эта команда позволяет подключить TD32 к процессу, работающему под Windows NT. Ее полезно использовать, когда вы знаете, где
                  в программе возникают ошибки, но вам трудно воспроизвести ситуацию в отладчике. Команда открывает диалоговое окно Attach to and Debug a Running Process.Для подключения к выполняемому процессу сделайте следующее:
                • Запустите процесс, который нужно отладить.

                • Запустите TD32.

                • Выберите команду File Change Dir для перехода в каталог
                  выполняющегося процесса.

                • Выберите команду File Attach для открытия диалогового окна.

                • Включите или выключите кнопку с независимой фиксацией Stop
                  an Attach. При ее включении Turbo Debugger приостанавливает выполнение процесса при подключении к нему.

                • В блоке списка Processes выберите процесс(или введите
                  идентификационный номер процесса в поле ввода Process ID).
                  Затем щелкните "мышью" на OK.

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


                  Команда Evaluate/Modify


                  Эта команда меню Data открывает диалоговое, которое содержит
                  текст по текущей позиции курсора или выражение, выбранное с помощью Ins и стрелок, затем вычисляет его (если вы выберите кнопку
                  Eval) так же, как это сделал бы компилятор. Результат помещается
                  в поле Result.
                  [*] Evaluate/Modify
                  Expression Eval
                  thisShape[CurrentPoint]
                  CurrentShape == LINE
                  HIWORD
                  Cancel
                  Result
                  struct SSHAPE <<113,116,0,0>,5,1,0,0> Help
                  New value Modify

                  Диалоговое окно содержит три поля:
                • В поле ввода Expression вы можете ввести выражение для вычисления. После содержит протокол всех введенных выражений.

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

                • Нижняя область New Value - это область ввода, в которой вы
                  можете ввести новое выражение для вычисления. Если выражение модифицировать нельзя, то в данной области выводится сообщение .

                • Запись в поле ввода New Value (Новое значение) будет действовать, если вы выберите кнопку Modify. Если вы выполняете отладку объектно-ориентированных программ C++, то окно Evaluate/Modify позволяет вам также вывести поля объекта или элементы экземпляра класса. Для каждого элемента, который может использоваться при вычислении записи, можно использовать спецификатор формата.


                  Команда Function Returns


                  По команде Function Returns выводится возвращаемое текущей
                  функцией значение. Используйте эту команду только тогда, когда
                  функция собирается передать значение в вызывающую программу.
                  Возвращаемое значение выводится в окне Inspector (Проверка), поэтому вы легко можете просмотреть значения, представляющие собой
                  указатели на сложные объекты данных. Данная команда позволяет вам
                  не переходить в окно CPU, когда требуется просмотреть возвращаемое через регистры процессора значение.


                  Команда OS Shell


                  Эта команда отладчика TD32 работает в операционной системе
                  Windows NT. По этой команде Turbo Debugger открывает командную
                  подсказку. Для возврата в отладчик наберите Exit.


                  Командная строка утилиты TLIB


                  Командная строка утилиты TLIB имеет общий вид, приведенный
                  ниже, где заключенные в квадратные скобки элементы являются необязательными:
                  tlib [@файл_подсказки] [параметры] имя_библиотеки
                  [операции] [, файл_списка]
                  Чтобы получить информацию об использовании TLIB, просто наберите команду TLIB и нажмите клавишу Enter.
                  В IDE вы можете задать библиотеку в качестве целевого файла
                  проекта. С помощью TargetExpert выберите для целевого типа Static
                  Library. TLIB - это используемый по умолчанию для библиотечного
                  файла транслятор. Он использует параметры, заданные в диалоговом
                  окне Project Options секции Librarian (выберите в основном меню
                  Options Project).

                  Параметр Описание
                  @файл_подсказки Маршрут и имя файла подсказки, содержащего параметры библиотекаря. Можно указать
                  несколько таких файлов.
                  @имя_библиотеки Имя маршрута DOS библиотеки, с которой вы
                  работаете. Она должна указываться в каждой
                  команде TLIB. Трафаретные символы не допускаются. По умолчанию используется расширение .LIB.
                  /C Параметр различимости регистра.
                  /E Создает расширенный словарь.
                  /Pразмер Задает размер страницы библиотеки.
                  /O Удаляет из библиотеки комментарии.
                  операции Список выполняемых TLIB операций. Операции
                  могут следовать в любом порядке. Если вы
                  хотите только просмотреть содержимое библиотеки, не задавайте никаких операций.
                  файл_списка Имя файла, в который будет выводиться перечень содержимого библиотеки. Если имя
                  файла "файл_списка" задается, то ему должна предшествовать запятая. Если имя этого
                  файла не задается, то перечень не создается. Перечень представляет собой список
                  всех модулей, упорядоченных по алфавиту.
                  Запись для каждого модуля содержит упорядоченный по алфавиту список всех общедоступных идентификаторов, описанных в этом
                  модуле. По умолчанию для файла "файл_списка" используется расширение имени .LST. Вы
                  можете назначить вывод списка на экран,
                  задавая в качестве имени "файла_списка"
                  имя CON, или на принтер, задавая в качестве имени "файла_списка" имя PRN.



                  Командные кнопки


                  Командные кнопки выполняют действия при каждом "нажатии"
                  (активизации) такой кнопки. Существует два вида таких кнопок: заданные по умолчанию и остальные. Заданная по умолчанию командная
                  кнопка имеет стиль BS_DEFPUSHBUTTON и обрамление, указывающее реакцию по умолчанию. Другие кнопки имеют стиль BS_PUSHBUTTON. Примеры управляющих элементов типа командных кнопок вы можете найти
                  в подкаталоге EXAMPLES\OWL\OWLAPI\BWCC.
                  Один и конструкторов TListBox имеет 7 стандартных параметров
                  конструктора объекта управляющего элемента (родительское окно,
                  идентификатор ресурса, размеры и положение управляющего элемента,
                  необязательный идентификатор библиотеки), плюс текстовую строку
                  (метку управляющего элемента) и булевский флаг, указывающий, является ли кнопка заданной по умолчанию.
                  Когда пользователь щелкает на командной кнопке "мышью", родительское окно получает уведомляющее сообщение. Если родительский оконный объект перехватывает сообщение, то он может отвечать
                  на эти события, выводя диалоговое окно, сохраняя файл и т.д. Для
                  перехвата и реакции на сообщения командных кнопок определите для
                  кнопки функцию реакции на команду.


                  Командный процессор ресурсов: BRC.EXE


                  Borland Resource Compiler (BRC) - это оболочка компилятора
                  ресурсов. В зависимости от синтаксиса командной строки, она вызывает BRCC или RLINK, либо оба этих продукта. Командная строка BRC
                  имеет следующий синтаксис:
                  brc [параметры] <имя_файла>.RC [<имя_файла>.EXE]
                  Параметры перечислены в следующей таблице:

                  Параметр Описание
                  -d<имя>=строка Определяет идентификатор, который вы можете проверить с помощью директивы препроцессора #IFDEF.
                  -fo<имя_файла> Переименовывает файл .RES.
                  -fe<имя_файла> Переименовывает файл .EXE.
                  -fi<имя_файла> Задает дополнительные файлы .RES.
                  -i<маршрут> Добавляет один или более каталогов к маршруту поиска включаемых файлов.
                  -k Не переупорядочивает сегменты для быстрой
                  компоновки.
                  -r Создает только файлы .RES. Скомпилированный
                  файл не добавляется к файлу .EXE.
                  -v Выводит сообщения о ходе выполнения (расширенный листинг).
                  -x Указывает компилятору, что нужно игнорировать при поиске включаемых файлов или файлов ресурсов переменную операционной среды
                  INCLUDE.
                  -31 Строит файлы .RES, совместимые с Windows
                  3.1.
                  -w32 Строит файлы .RES, совместимые с Win32.



                  Команды меню окна Module


                  Меню SpeedMenu окна Module содержит команды, позволяющие перемещаться по исходному тексту, выбирать и просматривать элементы
                  данных и загружать новые исходные файлы. В TD32 это меню содержит
                  дополнительные команды Thread и Edit.

                  Inspect
                  Открывает окно Inspector с подробной информацией о переменной программы в позиции курсора (если курсор не установлен на переменной, выводится подсказка). Для быстрого перемещения и выбора
                  выражений в окне Module используйте стрелки и клавишу Ins. После
                  выбора выражения активизируйте окно Inspector с помощью Ctrl+I.
                  Watch
                  Добавляет переменную в текущей позиции курсора в окно Watch.
                  Включение переменной в окно Watches позволяет отслеживать ее значение при выполнении.
                  Thread
                  Открывает диалоговое окно Pick a Thread, из которого вы можете выбрать для отслеживания конкретную нить программы.
                  Module
                  Команда Module (F3) позволяет выбрать в диалоговом окне Load
                  Module Source or DLL и загрузить в отладчик другой модуль.
                  File
                  Позволяет просмотреть другой исходный файл, входящий в состав данного модуля. Открывает диалоговое окно Pick a Source File
                  с перечнем исходных файлов, содержащихся в выполняемом коде. При
                  выборе нового файла он заменяет в окне Module текущий. Чтобы
                  просматривать их одновременно, используйте команду View Another Module.
                  Previous
                  Возвращает вас к тому месту исходного кода, которое вы просматривали перед сменой позиции.
                  Line
                  Позиционирует вас на новую строку с указанным номером, который задается в выводимом диалоговом окне Enter New Line Number.
                  Search
                  Ищет заданную строку символов, начиная с текущей позиции
                  курсора. Строка задается в выводимом диалоговом окне Enter Search
                  String. Если курсор позиционирован на имени переменной, то окно
                  инициализируется этим именем. Чтобы инициализировать окно Search
                  String, вы можете также выделить с помощью Ins и стрелок блок
                  файла. В строке поиска можно задавать трафаретные символы * и ?.
                  Next
                  Ищет следующий экземпляр заданной в команде Search строки.
                  Origin
                  Позиционирует курсор на модули и строку, соответствующую текущей инструкции. Ее полезно использовать для возврата в исходное
                  место.
                  Goto
                  Открывает окно Enter Address to Position To, в котором можете ввести любой адрес программы, который хотите просмотреть (в
                  виде имени процедуры или в шестнадцатиричном виде). Это окно выводится также при наборе в окне Module.
                  Edit
                  При отладке программ Windows 32s с помощью TD32 с помощью
                  этой команды вы можете вызвать выбранный редактор. Это полезно
                  использовать для коррекции исходного кода перед выходом из отладчика. Вызов редактора требует настройки конфигурации с помощью
                  TDINST32.EXE (команда Options Directories).
                  Exceptions
                  Если вы реализовали на Си или С++ обработку исключительных
                  ситуаций, то доступна эта команда. Подробнее о ней рассказывается
                  ниже.



                  Команды окна File


                  Команды SpeedMenu окна File можно использовать для перемещения по файлу и изменения формата вывода.

                  Goto
                  Позиционирует вывод на новую строку (при просмотре текстового файла) или смещение в файле (при шестнадцатиричном выводе).
                  Search
                  Ищет строку символов, начиная с текущей позиции курсора. Для
                  ввода строки выводится окно Enter Search String. При шестнадцатиричном выводе можно задать список байт (в соответствии с используемым языком). Допускаются трафаретные символы (* и ?).
                  Next
                  Ищет следующий экземпляр строки, заданной в команде поиска.
                  Display As
                  Переключает вывод между текстовым и шестнадцатиричным форматом.
                  File
                  Позволяет сменить файл, выводимый в окне File. Окно File не
                  дублируется. Чтобы просматривать два файла одновременно, выберите
                  команду View Another File.
                  Edit
                  Эквивалентна соответствующей команде окна Module.



                  Комбинированные блоки


                  Управляющий элемент типа комбинированного блока представляет
                  собой комбинацию двух других управляющих элементов - блока списка
                  и редактируемого или статического управляющего элемента. Он выполняет те же функции, что и блок списка - позволяет пользователю
                  щелчком "мышью" выбрать один текстовый элемент из прокручиваемого
                  списка. Редактируемый управляющий элемент в верхней части блока
                  списка предусматривает еще один механизм выбора, позволяя пользователям набирать текст нужного элемента, который автоматически
                  выделяется в области блока списка. TComboBox является производным
                  от TListBox и наследует его функции-элементы для модификации, опроса и выбора элементов списка. Кроме того, TComboBox предусматривает функции-элементы для манипуляции со списком комбинированного блока, который в некоторых типах комбинированного блока может раскрываться по запросу. Примеры можно найти в подкаталоге
                  OWLAPPS\OWLCMD.


                  Компиляция со встроенным ассемблером


                  Существует два способа, с помощью которых Borland C++ может
                  обрабатывать в вашем коде Си или С++ операторы встроенного ассемблера. Во-первых, Borland С++ может преобразовывать код Cи или
                  C++ непосредственно в код ассебмлера, а затем передавать его TASM
                  для генерации файла .OBJ. Во-вторых, Borland С++ для включения
                  ваших операторов ассебмлера непосредственно в поток инструкций
                  компилятора может использовать встроенный ассебмлер (BASM).
                  Для обработки операторов ассебмлера, встроенных в программы
                  Си и С++ можно указать параметр компилятора -B. По умолчанию -B
                  вызывает TASM или TASM32. Это можно переопределить с помощью параметр -Exxx, где xxx - другой ассебмлер. Если указывается параметр -B, компилятор сначала генерирует файл ассебмлера, а затем
                  вызывает TASM. Если включить в исходные код программы оператор
                  #pragma inline, то TASM будет вызываться и без параметра -B.
                  16-разрядный компилятор Borland С++ использует BASM, что
                  позволяет ассемблировать встроенный код ассебмлера самому компилятору, а не TASM. Этот внутренний ассебмлер компилятора делает
                  все то же, что и TASM, но имеет следующие ограничения:
                • не может использовать макрокоманды ассебмлера;

                • не обрабатывает инструкции 80386/80486;

                • не допускает синтаксис режима Ideal;

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

                • Так как BASM не является полным ассебмлером, некоторые конструкции этого языка он не воспринимает. В этом случае Borland С++
                  будет выводить сообщение об ошибке. При этом у вас есть две возможности: упростить программный код встроенного ассебмлера или
                  использовать параметр -B для вызова TASM. Однако TASM может не
                  идентифицировать место ошибки, так как номер строки исходного кода теряется.


                  Компиляция в интегрированной среде


                  Оперативное меню IDE содержит три командные кнопки компиляции, соответствующие следующим командам меню:
                • Project Compile (Alt+F9) компилирует исходный код в выбранном окне редактора, используя параметры компилятора,
                  заданные в диалоговом окне Project Options. При выборе окна проекта транслируются все выделенные узлы проекта. Если
                  дочерние узлы не выбраны, то они не транслируются.

                • Project Make all (F9) транслирует в проекте все "устаревшие" узлы. Если окно проекта не открыто, то все файлы в
                  окнах редактирования строятся с помощью используемых по
                  умолчанию трансляторов.

                • Project Build транслирует все узлы в проекте (начиная с
                  первого узла проекта).

                • В IDE можно задать параметры компилятора:
                • Выберите Options Project и задайте в диалоговом окне параметры. Эти параметры используются при компиляции, если
                  проект не загружен. При загруженном проекте эти параметры
                  влияют на весь проект.

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



                • Компиляция


                  Компилировать приложения можно с помощью интегрированной
                  среды IDE или компиляторов, работающих в режиме командной строки
                  BCC.EXE и BCC32.EXE (для компиляции 32-разрядных приложений). С
                  помощью параметров компилятора можно управлять компиляцией.


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


                  BRCC - это версия компилятора ресурсов Resource Workshop,
                  работающая в режиме командной строки. Его входным файлом является
                  файл сценария ресурсов (.RC), а на выходе создается объектный
                  файл ресурса (.RES). BRCC использует следующий синтаксис командной строки:
                  BRCC [параметры] <имя_файла>.RC
                  Параметры BRCC перечислены в следующей таблице. Регистр сим-
                  волов в них значения не имеет.

                  Параметр Описание
                  @файл_подсказки Воспринимает инструкции из заданного
                  файла.
                  -d<имя>[=<строка>] Определяет идентификатор препроцессора.
                  -fo<имя_файла> Переименовывает выходной файл .RES (по
                  умолчанию имя этого файла совпадает с
                  именем исходного файла).
                  -i<маршрут> Добавляет к маршруту поиска один или
                  более каталогов.
                  -r Этот параметр игнорируется и включен
                  для совместимости с другими компиляторами ресурсов.
                  -v Выводит сообщения о ходе процесса.
                  -x Определяет текущий маршрут поиска включаемых файлов.
                  -? или -h Выводит справочную информацию о параметрах.
                  -30 Строит файлы .RES, совместимые с Windows 3.0.
                  -31 Строит файлы .RES, совместимые с Windows 3.1.
                  -w32 Строит файлы .RES, совместимые с Win32.

                  Как и компилятор ресурсов в Resource Workshop, BRCC имеет
                  связанные с ресурсами предопределенные константы, такие как
                  WS_VISIBLE и BS_PUSHBUTTON. Кроме того, определены два специальных идентификатора RC_INVOKED и WORKSHOP_INVOKED, которые используются в тексте ресурса в сочетании с условными директивами препроцессора для управления компиляцией.


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


                  Всегда следует указывать компоновку с библиотекой исполняющей системы Borland С++, которая содержит стандартные библиотечные функции Borland С++ для того типа приложения, которое вы генерируете. Нужно также указать соответствующую библиотеку импорта
                  для 16-разрядных приложений, IMPORT32.LIB для консольных приложений или IMPRTW32.LIB для 32-разрядных приложений Windows. В следующей таблице описываются предусмотренные в Borland 16-разрядные
                  библиотеки Windows и файлы .OBJ.

                  Библиотеки и объектные файлы Описание
                  Cn.LIB Библиотека исполняющей системы для приложений DOS, где n - это первая буква модели памяти (Small, Compact, Medium, Large или Huge).
                  CWn.LIB Библиотека исполняющей системы для приложений Windows 3.x, где n - это первая буква модели памяти (Small, Compact, Medium, Large или Huge).
                  CRTLDLL.LIB Библиотека исполняющей системы для DLL Windows.
                  IMPORT.LIB Библиотека импорта для функций API Windows
                  3.x.
                  C0n.OBJ Код запуска для приложений .EXE DOS, где n
                  - это первая буква модели памяти (Small, Compact, Medium, Large или Huge).
                  C0Wn.OBJ Код запуска для приложений Windows, где n
                  - это первая буква модели памяти (Small, Compact, Medium, Large или Huge).
                  C0Dn.OBJ Код запуска для модулей DLL Windows, где n
                  - это первая буква модели памяти (Small, Compact, Medium, Large или Huge).
                  MATHWS.LIB Математическая библиотека для моделей Small и Tiny (если программа использует операции с плавающей точкой).
                  MATHWC.LIB Математическая библиотека для модели Compact.
                  MATHWM.LIB Математическая библиотека для модели Medium.
                  MATHWL.LIB Математическая библиотека для модели
                  Large.

                  В следующей таблице описываются 32-разрядные библиотеки и
                  файлы .OBJ Borland С++, которые используются компоновщиком
                  TLINK32.

                  Библиотеки и объектные файлы Описание
                  CW32.LIB Библиотека исполняющей системы для приложений Win32.
                  IMPORT32.LIB Библиотека импорта для консольных приложений и 32-разрядных приложений Windows.
                  C0X32.OBJ Код запуска для консольных приложений.
                  C0W32.OBJ Код запуска для приложений Win32.
                  C0D32.OBJ Код запуска для 32-разрядных модулей Windows.



                  Компоновка смешанных модулей


                  Что произойдет, если вы компилируете один модуль с использованием модели памяти small (малая), второй - модели large (большая), и затем хотите скомпоновать их? Что при этом произойдет?
                  Файлы скомпонуются удовлетворительно, но при этом вы столкнетесь с проблемами. Если функция модуля с моделью small вызывает
                  функцию в модуле с моделью large, она будет использовать при этом
                  ближний вызов, что даст абсолютно неверные результаты. Кроме того, у вас возникнут проблемы с указателями, описанные в разделе
                  "Объявление указателей как near, far или huge", поскольку функция
                  в модуле small ожидает, что принимаемые и передаваемые ей указатели будут __near, тогда как функция в модуле large ожидает работу с указателями __far.
                  И снова решение заключается в использовании прототипов функций. Предположим, что вы поместили myputs в отдельный модуль и
                  скомпилировали его с моделью памяти large. Затем вы создаете файл
                  заголовка myputs.h (либо с любым другим именем и расширением .h),
                  который содержит следующий прототип функции:
                  void far myputs(char far *s);
                  Теперь, если поместить функцию main в отдельный модуль
                  (MYMAIN.C) и выполнить следующие установки:
                  #include
                  #include "myputs.h"
                  main()
                  {
                  char near *mystr;
                  mystr = "Hello, world\n";
                  myputs(mystr);
                  }
                  то при компиляции данной программы Borland C++ считает прототип
                  функции из файла MYPUTS.H и увидит, что это функция __far, ожидающая указатель __far. В результате этого даже при модели памяти
                  small при компиляции будет сгенерирован правильный вызывающий
                  код.
                  Как быть, если помимо этого вам требуется компоновка с библиотечными подпрограммами? Лучший подход здесь заключается в том,
                  чтобы выбрать одну из библиотек с моделью large и объявить все
                  как far. Для этого сделайте копии всех файлов заголовка, которые
                  вы обычно включаете (таких, как stdio.h) и переименуйте эти копии
                  (например, fstdio.h).
                  Затем отредактируйте копии прототипов функций таким образом,
                  чтобы там было явно указано far, например:
                  int far cdecl printf(char far* format, ...);
                  Тем самым, не только вызовы подпрограмм будут дальними, но и
                  передаваемые указатели также будут дальними. Модифицируйте вашу
                  программу таким образом, чтобы она включала новый файл заголовка:
                  #include
                  main()
                  {
                  char near *mystr;
                  mystr = "Hello, world\n";
                  printf(mystr);
                  }
                  Скомпилируйте вашу программу при помощи компилятора BCC, затем скомпонуйте ее при помощью утилиты TLINK, указав библиотеки с
                  моделью памяти large, например CL.LIB. Смешивание модулей с разными моделями - вещь экстравагантная, но допустимая. Будьте, однако, готовы к тому, что любые неточности здесь приводят к ошибкам, которые очень трудно найти и исправить при отладке.


                  Компоновщик ресурсов RLINK


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

                  Параметр Описание
                  @<имя_файла> Берет инструкции из указанного файла.
                  -d Удаляет ресурсы из файла .EXE.
                  -fe<имя_файла> Переименовывает выходной файл .EXE.
                  -fi<имя_файла> Переименовывает выходной файл .RES.
                  -k Не переупорядочивает сегменты для быстрой компоновки.
                  -v Выводит сообщения о ходе процесса (расширенный листинг).
                  -vx Перечисляет ресурсы, но не связывает их с файлом .EXE.
                  -? или -h Выводит справочную информацию о параметрах.
                  -30 Строит файлы .RES, совместимые с Windows 3.0.
                  -31 Строит файлы .RES, совместимые с Windows 3.1.



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


                  TLINK и TLINK32 - это инструментальные средства, работающие
                  в режиме командной строки, которые комбинируя другие модули (файлы .OBJ) и библиотечные модули (.LIB) создают выполняемые файлы.
                  В IDE имеются встроенные версии этих компоновщиков. Поскольку
                  компилятор автоматически вызывает компоновщик, явный вызов его не
                  требуется, пока вы не отмените этап компоновки (параметр -c). Если не указано обратное, все, что говорится о TLINK, применимо и
                  для TLINK32.
                  TLINK использует файл конфигурации с именем TLINK.CFG, файл
                  подсказки и параметры командной строки, задающие компоновку объектных модулей, библиотек и ресурсов в файл .EXE или .DLL. Компоновщик интегрированной среды использует параметры, заданные в диалоговом окне Project Options. Командная строка TLINK имеет следующий синтаксис:
                  TLINK [@файл_подсказки][параметры] файл_запуска
                  объектн_файлы, имя_exe, [файл_map], [библиотеки]
                  библ_исп_системы [библ_импорта],
                  [файл_определений], [файлы_res]
                  "Параметры" - это параметры TLINK, управляющие его работой
                  (перед ними указывается символ "-" или "/"), "файл_запуска" - это
                  модуль инициализации Borland для выполняемых или DLL-файлов, определяющий порядок загрузки сегментов программы. Он должен следовать в списке объектных файлов первым. "Объектн_файлы" - это компонуемые объектные файлы .OBJ с указанием маршрута. "Имя_exe" -
                  это имя, назначаемое создаваемому выполняемому файлу (.EXE или
                  .DLL). Необязательное имя "файл_map" задает имя файла карты распределения памяти. Если имя не задается, то оно будет соответствовать имени исходного файла с добавлением расширения .MAP. "Библиотеки" - это указываемые при компоновке библиотечные файлы. Если
                  эти файлы не находятся в текущем каталоге или по маршруту поиска,
                  то нужно указать маршрут. "Библ_исп_системы" задает библиотеку
                  исполняющей системы Borland. Если библиотека не указывается, то
                  она не компонуется. "Библ_импорта" - это библиотека импорта Windows, обеспечивающая доступ к функциями API Microsoft Windows.



                  "Файл_определений" - это файл определения модуля (.DEF) для выполняемого файла Windows. Если он не задается, то приложение создается на основе заданных по умолчанию установок. "Файлы_res" задают список файлов ресурсов .RES, используемых для формирования

                  выполняемого файла.

                  Если у имен файлов отсутствуют расширения, то TLINK добавляет следующие расширения:








                  * .OBJ - для объектных файлов;
                  * .EXE - для выполняемых файлов (когда используется параметр

                  /t или /Td, выполняемый файл получает расширение .COM, а не

                  .EXE);
                  * .DLL - для библиотек динамической компоновки (когда используется параметр /Twd или параметр /Tw и файл определения

                  модуля, задающий библиотеку);
                  * .MAP - для файлов карты распределения памяти;
                  * .LIB - для файлов библиотек;
                  * .DEF - для файлов определения модуля.
                  * .RES - для файлов ресурсов.

                  Конструктор Box3d


                  box3d::box3d(double x, double y, double w, double h, double d)
                  : rect(x,y,w,h) < Обратите внимание как конструктор box3d
                  вызывает конструктор rect, для дальнейшей
                  { работы.
                  depth = d;
                  }
                  Функция vol() для box3d вычисляет занимаемый им объем, который
                  равен - * ht * depth. Обратите внимание на изменения функции
                  area() по сравнению с той, что работала у прямоугольника.
                  double box3d::vol()
                  {
                  v
                  return rect::area() * depth;
                  ^
                  }
                  Оператор селектора
                  Заимствование кода является нормой для порожденных классов, поэтому и большая часть созданного программного кода будет использоваться повторно или по крайней мере будет входить в повторный цикл.
                  Функция area() вычисляет поверхность для box3d по формуле
                  - 2 x поверхность основания + 4 x поверхность стороны.
                  double box3d::area()
                  { Функция area возвращает размер
                  v поверхности основания прямоугольника
                  return 2.0 * rect::area() +
                  4.0 * rect(0, 0, ht, depth).area();
                  ^ ^
                  } Вызывает временную ???
                  функцию размера поверхности
                  Делает временным объект размер прямоугольника
                  по одной из сторон
                  Сейчас мы на самом деле достигли наследования текста программы!


                  Конструктор circle


                  circle::circle(double x, double y, double r)
                  : shape(x,y) < Обратите внимание как конструктор circle
                  вызывает конструктор shape, с начальной
                  установкой.
                  {
                  radius = r; < Далее попросту устанавливается
                  радиус круга
                  }
                  Функция площади круга подменяет определение, сделанное в базовом
                  классе, и вычисляет знаменитую формулу pi*r2.
                  double circle::area(void)
                  {
                  return 3.14159 * radius * radius;
                  }


                  Конструктор cylinder


                  cylinder::cylinder(double x, double y, double r, double h)
                  : circle(x,y,r) < Обратите внимание как конструктор cylinder
                  вызывает конструктор circle, для дальнейшей
                  работы.
                  {
                  ht = h;
                  }
                  Функция vol() вычисляет объем цилиндра vol = pi*rЩh. Обратите
                  внимание на изменения функции area() по сравнению с той, что была у
                  окружности.
                  double cylinder::vol()
                  {
                  v
                  return circle::area() * ht;
                  ^
                  }
                  оператор разделения


                  Конструктор - декомпрессор


                  Сначала посмотрим на очередность инициализации нашей версии Си
                  программы:
                  void decompressor_init(decompressor *dc, unsigned char *s, int len)
                  {
                  dc->p = s; dc->srclen = len; dc->rcnt = 0;
                  }
                  А теперь посмотрим на использование конструктора в версии C++:
                  decompressor::decompressor(unsigned char *s, int len)
                  {
                  p = s; srclen = len; rcnt = 0;
                  }
                  Отметим, что переменные p, scrlen, rcnt доступны непосредственно
                  в структуре, без каких-либо дополнительных указаний. Функции, принадлежащие классу, в Турбо и Borland С++ обладают таким свойством. Более
                  наглядно это проявляется в следующей функции декомпрессора next().
                  Decompressor::next() функция.
                  int decompressor::next(void)
                  {
                  if (rcnt && rcnt-- > 0) return c;// Рабочая длина для декомпрессора
                  if (!srclen || srclen-- <= 0) return -1; // Здесь конец
                  c = *p++; // Обработать следующий символ в буфере
                  if (c == 0xff) {
                  rcnt = *p++ - 1; // Уменьшить счетчик
                  c = *p++; // Здесь повторить символ
                  srclen -= 2;
                  }
                  return c;
                  }
                  Сравните эту версию с версией на Си. Borland С++ версия выглядит
                  более ясно и просто, не так ли?

                  Использование программой Borland С++ класса декомпрессора.
                  unsigned char buff[] = {'a',0xff,3,'b','c'};
                  main()
                  { Объявление объекта декомпрессора,
                  с одновременной инициализацией.
                  int c; V
                  decompressor dc(buff, sizeof(buff));
                  while ((c = dc.next()) != -1) putchar(c);
                  return 0; ^
                  } Передача сообщения объекту
                  И так, мы только что выполнили конверсию программы из Си на С++.
                  В результате получен не просто преобразованный оригинал программы, а
                  ее объектно-ориентированное представление.


                  Конструктор rectangle


                  recte::rect(double x, double y, double w, double h)
                  : shape(x,y) < Обратите внимание как конструктор rect
                  вызывает конструктор shape, с начальной
                  установкой.
                  {
                  wd = w; < Затем попросту устанавливаются размеры
                  ht = h;
                  }
                  Область функции area() замещает определение базового класса.
                  double rect::area(void)
                  {
                  return wd * ht;
                  }


                  Конструктор Shape


                  shape::shape(double x, double y)
                  // Устанавливает координаты фигуры
                  {
                  xo = x;
                  yo = y;
                  }


                  Конструкторы, деструкторы и динамическая память


                  Конструкторы и деструкторы тесно связаны с динамической памятью.
                  Вы должны использовать конструкторы для распределения памяти, а
                  деструкторы для возвращения занятой памяти. Например:
                  class string {
                  char *data; // Указатель на строку данных
                  int size; // Размер строки
                  public:
                  // Распределение памяти (см. "Динамическое использование
                  // свободной памяти")
                  string(int sz) { data = new char[size = sz]; }
                  // Возвращение занятой памяти
                  ~string(void) { delete data; }
                  };


                  Конструкторы и деструкторы


                  C++ обеспечивает удобные способы создания и удаления объектов,
                  через специальные процедуры. Процедуры создания объектов называются
                  конструкторами, а процедуры уничтожения - деструкторами. Конструкторы
                  автоматически вызываются при описании объекта, а деструкторы - при
                  выходе из блока, в котором этот объект был описан.
                  Если необходимые конструкторы или деструктор для класса не
                  описаны, то транслятор создает их сам.
                  Для того, чтобы понять важность конструкторов, сделаем маленькое
                  отступление. Общей проблемой для всех традиционных языков программирования является инициализация: прежде чем использовать структуру
                  данных, нужно выделить ей память и проинициализировать. Рассмотрим
                  задачу инициализации следующей структуры:
                  class rectangle { // Прямоугольник
                  public:
                  int wd, ht; // Ширина и высота
                  };
                  Неопытные программисты могут попробовать присвоить значения элементам wd и ht следующим образом:
                  rectangle this_rect // Создание нового объекта this_rect
                  this_rect.wd = 20; // с заданной шириной
                  this_rect.ht = 10; // и высотой
                  Ошибки не будет, но такой способ тесно связан с конкретным объектом, this_rect. Если понадобится проинициализировать несколько объектов типа rectangle, то операция присваивания потребуется использовать неоправданно часто. В данном случае естественным шагом является
                  создание функции инициализации, которая обобщает операции присваивания, работая с любым объектом типа rectangle, переданным ей в качестве аргумента:
                  void init_rect(rectangle* target, int wd, int ht)
                  {
                  target->wd = new_wd;
                  targrt->ht = new_ht;
                  }
                  Данная функция использует переданный ей указатель на объект типа
                  rectangle для присваивания элементам объекта значений ее аргументов.
                  С помощью операции -> указывается элемент, ссылающийся на элементы
                  класса. Функция init_rect, разработанная специально для структуры
                  rectangle, работает корректно.
                  Объектно-ориентированный подход требует возможности создания
                  функции элемента, которая сможет инициализировать любой объект класса
                  rectangle. Такой функцией является конструктор.


                  Конструкторы


                  Итак, конструкторы используются для создания объекта. Благодаря
                  конструкторам разрабатываемые новые типы данных становятся такой неотъемлимой частью языка, как и встроенные типы. Конструктор определяет, каким образом новый объект типа класса будет создан, как будет
                  проводиться выделение памяти и инициализация объекта. Его определение
                  может включать инструкции для выделения памяти, присваивания значений
                  элементам, преобразование типов, и все что угодно, необходимое для
                  данного класса. При этом конструкторы наследуют имя своего класса:
                  class sber_bank { < Объявление класса
                  private:
                  double big_bucks;
                  public:
                  sber_bank(double bucks); < Конструктор
                  void deposit(double bucks);
                  double withdraw(double bucks);
                  };
                  Разберем порядок описания конструктора:
                  Селектор
                  Используемый класс Имя конструктора
                  v v v
                  sber_bank :: sber_bank(double bucks)
                  {
                  big_bucks = bucks; < Инициализация данных
                  }
                  Конструктор можно сделать встроенным:
                  class sber_bank {
                  private:
                  double big_bucks;
                  public:
                  // Встроенный конструктор
                  sber_bank(double bucks) { big_bucks = bucks; }
                  void deposit(double bucks);
                  double withdraw(double bucks);
                  };


                  Контейнерные классы С++


                  Данный раздел представляет собой справочник по контейнерным
                  классам Borlan C++. Каждый контейнерный класс принадлежит к одной
                  из следующих групп:

                  Группа Файл заголовка
                  Массивы. arrays.h
                  Ассоциации. assoc.h
                  Мультимножества. bags.h
                  Двоичные деревья. binimp.h
                  Двунаправленные очереди. deques.h
                  Словарь. dict.h
                  Двусвязный список. dlistimp.h
                  Таблица хеширования. hashimp.h
                  Списки. listimp.h
                  Очереди. queues.h
                  Множества. sets.h
                  Стеки. stacks.h
                  Векторы vectimp.h

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


                  Контейнеры и файлы заголовков Borland



                  Контейнер Файл-заголовок FDS Borland ADT Borland
                  Двоичное дерево binimp.h
                  Таблица хеширования hashimp.h
                  Связанный список listimp.h
                  Двусвязанный список dlistimp.h
                  Вектор vectimp.h
                  Массив arrays.h
                  Ассоциация assoc.h
                  Удаление из очереди dequeue.h
                  Очередь queues.h
                  Множество sets.h
                  Стек stacks.h

                  Структуры FDS - это контейнеры нижнего уровня, реализующие
                  структуры памяти. Каждая FDS имеет фундаментальные функции добавления и отсоединения. Типы ADT обычно используются в конструкциях
                  обработки данных. Каждый тип ADT имеет соответствующие методы,
                  например, контейнеры стека - функции-элементы Push и Pop.
                  Каждый тип ADT основан на FDS. Например, TArrayAsVector реализует массив, используя в качестве соответствующей структуры FDS
                  вектор. Контейнеры ADT используют характеристики хранения соответствующих FDS и добавляет специфические методы доступа, которые
                  делают каждый из них уникальным.
                  Контейнеры могут хранить копии объектов (прямые контейнеры)
                  или указатели на объекты (косвенные контейнеры). Например, следующий контейнер является косвенным массивом, в котором хранятся
                  указатели на значения float:
                  TIArraysAsVector FloatPtrArray(10);
                  где I - имя шаблона, указывающее соответствующий контейнер.
                  В некоторых типах контейнеров содержимое записывается в отсортированном виде. Отсортированные контейнеры (как косвенные,
                  так и прямые) должны иметь соответствующую операцию <, что позволяет определить порядок элементов. Эти операции предусмотрены для
                  предопределенных типов. Для типов, определенных пользователем, вы
                  должны обеспечить такую операцию. Для прямых объектов тип должен
                  иметь допустимую операцию == - используемый по умолчанию конструктор. Для косвенных контейнеров сортируются объекты, а не указатели, которые содержит контейнер.


                  Копирование узлов


                  Узлы можно копировать целиком или по ссылке. Полное копирование позволяет взять узел и его атрибуты и поместить где-либо в
                  проекте идентичную, но другую копию. При этом наследуются атрибуты родительского узла (если параметры не переопределены). Чтобы
                  выполнить такое копирование, сделайте следующее:
                • Выделите копируемый узел или узлы (для выделения нескольких узлов используется Shift или Ctrl и "мышь"). При наличии зависимых узлов они будут копироваться автоматически.

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

                • Когда вы отпустите кнопку "мыши", узлы скопируются.

                • Копирование по ссылке позволяет взять узел и зависящие от
                  него узлы и поместить их в другое место проекта. Такая копия
                  идентичная оригиналу - при удалении оригинала она также удаляется. Для выполнения копирования по ссылке:
                • Выберите узел для копирования (зависимые объекты копируются автоматически).

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

                • Когда вы отпустите кнопку "мыши", узлы скопируются.



                • Local Override


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

                • Щелкните правой кнопкой "мыши" (или нажмите Alt+F10) либо
                  выберите в SpeedMenu Edit local options. Выводится диалоговое окно Style Sheet с выбранным параметром.

                • Выберите параметр, который нужно переопределить. Блок Local Override выбирается автоматически.

                • Выберите OK.

                • Чтобы отменить переопределение, отмените выбор Local Override. Если требуется переопределять несколько параметров, то удобнее использовать Style Sheet.




                  - M -

                  Main Window Basic Options



                  Параметр Описание
                  Window Styles Управляет внешним видом основного окна
                  приложения, определяя стили его неклиентной области.
                  Caption создает одинарную тонкую границу и строку заголовка с текстом.
                  Border одинарная тонкая граница вокруг основного окна без строки заголовка.
                  Max box добавляет в правую часть основного окна кнопку максимизации (доступно при включении параметра Caption).
                  Min box добавляет в правую часть основного окна кнопку минимизации (доступно при включении параметра Caption).
                  Vertical scroll добавляет в правую
                  часть основного окна вертикальную полосу прокрутки (доступно при выборе Caption или Border).
                  Horizontal scroll добавляет в нижнюю
                  часть окна горизонтальную полосу прокрутки (доступно при выборе Caption или
                  Border).
                  System menu добавляет в левую часть
                  основного окна командную кнопку управления меню (доступно при выборе Caption
                  или Border).
                  Visible делает основное окно видимым.
                  Disable по умолчанию запрещает основное окно (например, для вывода картинки при запуске приложения).
                  Thick frame заключает окно в двойную
                  рамку и создает окно с изменяемым размером.
                  Clip siblings защищает одноуровневые
                  ("братские") дочерние окна. Изображение
                  в таком окне ограничено.
                  Clip children защищает дочерние окна
                  от отображения поверх основного окна приложения.



                  Main Window



                  Параметр Описание
                  Window title Текст строки заголовка основного окна
                  приложения.
                  Background color Задает фоновый цвет основного окна
                  приложения.



                  Main Windows MDI Client



                  Параметр Описание
                  Client class Задает имя, которое AppExpert для производного от TMDIClient класса, представляющего клиентную область окна-рамки MDI.
                  Source file Именует исходный файл, в котором хранится
                  реализация класса, заданного в Client
                  Class.
                  Header file Именует файл заголовка, в котором хранится
                  определение класса, указанного в Client
                  Class.



                  Main Windows SDI Client



                  Параметр Описание
                  Class/view class Имена классов клиентной области SDI клиентной области окна или отображаемого элемента. Интерпретация этого параметра
                  зависит от параметра Documentation/View в Application Settings.
                  Document class Именует класс заданного по умолчанию документа (при включении Document/view).
                  Description Описывает класс файлов, связанных с документом/отображаемых элементом (по умолчанию *.*).
                  Filters Трафаретные символы спецификации файлов.
                  Спецификации разделяются запятыми или точками с запятой. Это значение передается диалоговым блокам Windows для фильтрации выводимых в них файлов. По умолчанию задается *.*.
                  Default extension Определяет заданное по умолчанию расширение файла. Это значение передается диалоговым блокам Windows для фильтрации
                  выводимых в них файлов. По умолчанию задается расширение, указанное в File Open
                  или File New.



                  MAKESWAP.EXE


                  При получении в DOS сообщений о нехватке памяти (если это не
                  режим DOS под Windows) и выполнении 32-разрядных инструментальных
                  средств режима командной строки создайте с помощью утилиты MAKESWAP файл свопинга. В параметре этой утилиты задается размер файла
                  в килобайтах, например, MAKESWAP 16000. Он создает в текущем каталоге файл свопинга с именем EDPMI.SWP, который используется
                  инструментальными средствами режима командной строки при необходимости получения дополнительной памяти. Чтобы задать файл свопинга, укажите в файле AUTOEXEC.BAT переменную операционной среды:
                  set DPMIMEM=SWAPFILE <маршрут>\EDPMI.SWP
                  Перед выполнением других инструментальных средств режима командной строки Borland С++ или таких приложений как Paradox эту
                  переменную нужно сбросить (командой set DPMIMEM).


                  Макрокоманда DECLARE_ABSTRACT_STREAMABLE (objstrm.h)


                  Используется в абстрактном классе и содержит ядро потокового
                  кода. Описывает функции Read и Write, определения которых вы
                  должны предусмотреть, и функцию Buyild, вызывающую конструктор
                  TStreabableClass. Описания параметров см. в DECLARE_STREAMABLE.


                  Макрокоманда DECLARE_ABSTRACT_STREAMER (objstrm.h)


                  Используется в DECLARE_ABSTRACT_STREAMABLE и описывает вложенный класс Streamer без функции Build. Описания параметров см.
                  в DECLARE_STREAMABLE.


                  Макрокоманда DECLARE_STREABABLE (objstrm.h)


                  Используется в определении класса для добавления элементов, необходимых для организации потока. Так как она содержит спецификаторы доступа, за ней должен следовать спецификатор доступа (или он должен использоваться в конце определения класса). Первым параметром должна быть макрокоманда, расширяющаяся по условию в __import или __export (в зависимости от того, экспортируется или импортируется класс из DLL). Второй параметр - имя потокового
                  класса, а третий - номер версии объекта.


                  Макрокоманда DECLARE_STREAMABLE_CTOR (objstrm.h)


                  Описывает конструктор, вызываемый функцией Streamer::Build.



                  Макрокоманда DECLARE_STREAMABLE_FROM_BASE (objstrm.h)


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


                  Макрокоманда DECLARE_STREAMABLE_OPS (objstrm.h)


                  Описывает инсертеры и экстракторы. Для классов шаблонов
                  должна использовать в качестве макроаргумента class<...>. В других случаях используется только имя класса.


                  Макрокоманда DECLARE_STREAMER_FROM_BASE (objstrm.h)


                  Используется в DECLARE_STREAMABLE_FROM_BASE и описывает вложенный класс Streamer без функций Read и Write. Описания параметров см. в DECLARE_STREAMABLE.


                  Макрокоманда __DELTA (streambl.h)


                  Вычисляет расстояние (в байтах) между базой потокового объекта и началом компонента TStreamableBase этого объекта.



                  Макрокоманда IMPLEMENT_CASTABLE (objstrm.h)


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


                  Макрокоманда IMPLEMENT_POINTER (objstrm.h)


                  Создает экземпляр операции извлечения указателя (>>).


                  Макрокоманда IMPLEMENT_STREAMABLE_FROM_BASE (objstrm.h)


                  Эта макрокоманда расширяется в IMPLEMENT_STREAMABLE_CLASS
                  (которая строит TStreamableClass), IMPLEMENT_STREAMABLE_CTOR1 и
                  IMPLEMENT_STREAMABLE_POINTER.


                  Макрокоманда в макрокоманде


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


                  Макрокоманда в правилах


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


                  Макрокоманды IMPLEMENT_CASTABLE1..5 (objstrm.h)


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


                  Макрокоманды IMPLEMENT_STREAMABLE_CTOR1..4 (objstrm.h)


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


                  Макрокоманды IMPLEMENT_STREAMABLE1..4 (objstrm.h)


                  Макрокоманды IMPLEMENT_STREAMABLE генерируют для класса регистрационный объект через IMPLEMENT_STREAMABLE_CLASS и через
                  IMPLEMENT_ABSTRACT_STREABABLE генерируют различные необходимые
                  для потокового класса Функции-элементы.
                  Макрокоманда IMPLEMENT_STREAMABLE используются, когда класс
                  не имеет других базовых классов, кроме TStreamableBase. Ее единственным параметром является имя класса. Нумерованные версии этой
                  макрокоманды (IMPLEMENT_STREAMABLE1, IMPLEMENT_STREAMABLE2 и
                  т.д.) используются для классов, имеющих другие базовые классы.


                  Макрокоманды командных сообщений


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


                  Макрокоманды MAKE


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


                  Макрокоманды сообщений Windows


                  ObjectWindows предусматривает макрокоманды для всех стандартных сообщений Windows. Вы можете использовать их для обработки стандартных сообщений в любой их своих функций-элементов. Эти макрокоманды имеют префикс EV_.
                  Эти стандартные макрокоманды передают сообщения функциям с
                  предопределенными именами, имя которой соответствует имени сообщения, но вместо WM_ подставляется Ev, например, WM_LBUTTONDOWN
                  передается EvButtonDown.
                  Благодаря этим макрокомандам Windows автоматически обрабатывают сообщение, то есть сообщения, которые обычно записываются
                  как параметры LPARAM и WPARAM разбиваются на составные части. Они
                  позволяют также переносить приложения с 16- на 32-битовую платформу и наоборот. Чтобы использовать стандартную макрокоманду сообщения Windows, добавьте в свой класс функцию-элемент с корректным именем и сигнатурой.


                  Макрокоманды утилиты MAKE, используемые по умолчанию



                  Макро- команда Расширение в неявных файлах Расширение в явных файлах
                  $* маршрут\исходный_файл маршрут\целевой_файл
                  $< маршрут\исходный_файл+расш маршрут\целевой_файл+расш
                  $: маршрут исходных файлов маршрут целевых файлов
                  $. исходный файл+расширение целевой файл+расширение
                  $& исходный файл целевой файл
                  $@ маршрут\целевой_файл+расш маршрут\целевой_файл+расш
                  $** маршрут\исходный_файл+расш все исходные файлы+расш
                  $? маршрут\исходный_файл+расш старые исходные файлы



                  Макрокоманды уведомления от дочерних объектов


                  Макрокоманды уведомления от дочерних объектов предусматривают несколько различных способов обработки сообщений уведомления
                  от этих объектов. В одной функции вы можете обрабатывать уведомляющие функции от нескольких дочерних объектов, передавать все
                  уведомляющие коды от дочернего окну отвечающему окну или обрабатывать код уведомления в дочернем объекте.
                  Чтобы облегчить связь с дочерними управляющими элементами,
                  можно использовать макрокоманды. Эти макрокоманды предусматривают
                  различные методы для обработки уведомляющих кодов дочерних объектов. Если вы хотите обрабатывать уведомления в родительском окне,
                  используйте EV_CHILD_NOTIFY, которые передает код уведомления в
                  качестве параметра и допускает обработку уведомления нескольких
                  дочерних объектов в одной функции. Это позволяет также избежать
                  обработки каждого уведомляющего сообщения в отдельной таблице реакции для каждого управляющего элемента. Вместо этого сообщение
                  обрабатывается в родительском объекте, позволяя, например, диалоговому окну обрабатывать все свои управляющие элементы в одной
                  таблице реакции.


                  Макрокоманды в директивах


                  Вызовы макрокоманд в директивах !if и !elif раскрываются немедленно. Если вызываемая в директивах !if или !elif макрокоманда
                  в данный момент не определена, то она расширяется в значение 0
                  (ложно).


                  Макрокоманды в командах


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


                  Максимальное заимствование!!


                  Функция area() вычисляет поверхность занимаемую цилиндром
                  (2pi*rh).
                  double cylinder::area()
                  {
                  return 6.283 * radius * ht;
                  }


                  Манипулирование экраном и графическими окнами


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

                  Функции работы с экраном Описание
                  cleardevice Очищает экран (активную страницу).
                  setactivepage Устанавливает активную страницу для
                  графического вывода.
                  setvisualpage Устанавливает номер видимой графической страницы.


                  Функции работы с графическими окнами Описание
                  clearviewport Очищает текущее графическое окно.
                  getviewsettings Возвращает информацию о текущем графическом окне.
                  setviewport Устанавливает текущее графическое окно
                  для направления на него графического
                  вывода.


                  Функции работы с битовыми образами Описание
                  getimage Записывает битовый образ в заданный
                  участок памяти.
                  imagesize Возвращает число байт, требуемых для хранения некоторой прямоугольной области экрана.
                  putimage Помещает на экран ранее записанный в
                  память битовый образ.


                  Функции работы с элементами изображения Описание
                  getpixel Получает цвет элемента изображения в
                  (x,y).
                  putpixel Помещает элемент изображения на экран в
                  точку (x,y).

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



                  Когда ваш экран находится в графическом режиме, с помощью

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

                  прямоугольное "виртуальное окно") на экране. Позиция графического

                  окна задается в абсолютных экранных координатах. Кроме того, задается активное или неактивное состояние функции "отсечения".

                  Очистка графического окна выполняется при помощи функции

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

                  getviewsettings.

                  Можно взять часть экранного образа при помощи функции

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

                  функций вывода (черчения, заполнения, тексты и т.д.) зависят от

                  выбранного графического окна.

                  Благодаря функциям getpixel (возвращающей цвет данного элемента изображения) и putpixel (которая отображает данный элемент

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

                  цветом отдельных элементов изображения.


                  Манипуляция дочерними окнами


                  Вы можете написать функции элементы, осуществляющие итерацию
                  по дочерним окнам некоторого окна с целью выполнения некоторых
                  действий. Например, вам нужно будет проверить все дочерние блоки
                  проверки в окне. В этом случае, используйте наследуемую из TWindowsObject функцию-элемент ForEach. Функции-элементы ForEach и
                  FirstThat позволяют вам выполнять операции со всеми окнами в
                  списке дочерних окон или с каждым окном по очереди. TWindow предусматривает также ряд других функций, которые позволяют вам определить число дочерних окон в списке или перемещать их.
                  Функция-итератор ForEach воспринимает в качестве параметра
                  указатель на функцию. Это может быть функция-элемент или автономная функция. ForEach вызывает функцию (с аргументами TWindow* и
                  void*) один раз для каждого дочернего объекта. Дочернее окно передается как TWindow*.
                  Вам может потребоваться написать функции-элементы, осуществляющие итерацию по списку дочерних окон для поиска определенного
                  дочернего окна. Например, в окне с несколькими дочерними окнами
                  кнопок с независимой фиксацией вам понадобилось определить первый
                  установленный блок проверки. Для этого, используйте наследуемую
                  из TWindowsObject функцию-элемент FirstThat.
                  Кроме функций-итераторов TWindow предусматривает ряд функций
                  для поиска и манипуляции с одним дочерним окном:

                  Функция Действие
                  NumChildren Возвращает значение, указывающее общее число
                  дочерних окон в списке
                  GetFirstChild Возвращает TWindows*, указывающий на первую
                  запись в списке дочерних окон.
                  GetLastChild Возвращает TWindow*, указывающий на последнюю запись в списке дочерних окон.
                  Next Возвращает TWindow*, указывающий на следующую запись в списке дочерних окон.
                  Previous Возвращает TWindow*, указывающий на предыдущую запись в списке дочерних окон.



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


                  Почти все диалоговые блоки имеют (в качестве дочерних окон)
                  управляющие элементы, такие как редактируемые управляющие элементы, блоки списка, командные кнопки и др. Эти управляющие элементы
                  создаются из ресурса диалогового блока.
                  Существует два способа взаимодействия объектов диалогового
                  блока и его управляющих элементов. С одной стороны, диалоговому
                  блоку нужно манипулировать своими управляющими элементами, например, заполнять блок списка. С другой стороны, нужно обрабатывать
                  управляющие элементы и отвечать на генерируемые сообщения (например, при выборе пользователем элемента блока списка).
                  Windows определяет набор сообщений управляющих элементов,
                  которые посылаются из приложения обратно в Windows. Управляющие
                  сообщения определяют конкретный управляющий элемент и передают
                  информацию в аргументах wParam и lParam. Каждый управляющий элемент в диалоговом ресурсе имеет идентификатор, с помощью которого
                  вы можете задать получающий сообщение управляющий элемент. Чтобы
                  послать сообщение, вызывается функция SendDlgItemMessage.


                  Манипуляторы потока



                  Манипулятор Действие
                  dec Установка флага форматирования с десятичными
                  преобразованиями.
                  hex Установка флага форматирования с шестнадцати-
                  ричными преобразованиями.
                  oct Установка флага форматирования с восьмиричными
                  преобразованиями.
                  ws Извлечение пробельных символов.
                  endl Вставка символа новой строки и очистка потока.
                  ends Вставка оконечного пустого символа в строку.
                  flush Сброс на диск и очистка ostream
                  setbase(int n) Установка системы счисления при преобразованиях с основанием n (0, 8, 10 или 16). Нуль означает по умолчанию десятичную систему при выводе и правила Си для литералов целых чисел при вводе.
                  resetiosflags(long f) Очистка форматных бит в ins или outs, заданных аргументом f.
                  setiosflags(long f) Установка бит форматирования в ins или outs, заданных аргументом f.
                  setfill(int c) Установка символа-заполнителя в c.
                  setprecision(int n) Установка точности представления чисел с плавающей точкой равной n разрядам
                  setw(int n) Установка ширины поля в значение n



                  Манипуляторы


                  Простой способ изменения некоторых форматных переменных состоит в использовании специальной функциональной операции, которая
                  называется манипулятором. Манипуляторы воспринимают в качестве
                  аргументов ссылку на поток и возвращают ссылку на тот же поток,
                  поэтому манипуляторы могут объединяться в цепочку занесений в поток (или извлечений из потока) для того, чтобы изменять состояния
                  потока в виде побочного эффекта, без фактического выполнения каких-либо занесений (или извлечений). Например:
                  #include
                  #include // Тpебуется для паpаметpизованных
                  // манипулятоpов
                  int main(void) {
                  int i = 6789, j = 1234, k = 10;
                  cout << setw(4) << i << setw(6) << j;
                  cout << "\n";
                  cout << setw(6) << i << setw(6) << j << setw(6) << k;
                  return(0);
                  }
                  дает на выходе:
                  678912346789101234
                  6789 1234 10


                  Математические классы С+


                  Данный раздел описывает математические операции Borland С++
                  на основе классов С++. Эти операции можно использовать только в
                  программах C++. Однако программа С++ может использовать любые
                  стандартные математические подпрограммы Си ANSI.
                  Числовые типы строятся на основе двух классов - bcd и complex. Наряду с этими числовыми типами каждый класс определяет
                  функции для выполнения операций с соответствующими типами. Каждый
                  класс также переопределяет все необходимые операции.


                  Математические операции с комплексными числами


                  Комплексными называются числа вида x + yi, где x и y - это вещественные числа, а i - это корень квадратный из -1. В Borland
                  C++ всегда существовал тип:
                  struct complex
                  {
                  double x, y;
                  };
                  определенный в math.h. Этот тип удобен для представления комплексных чисел, поскольку их можно рассматривать в качестве пары
                  вещественных чисел. Однако, ограничения Си делают арифметические
                  операции с комплексными числами несколько громоздкими. В С++ операции с комплексными числами выполняются несколько проще.
                  Для работы с комплексными числами в С++ достаточно включить
                  файл complex.h. В complex.h для обработки комплексных чисел переопределены:
                • все обычные арифметические операции;

                • операции потоков >> и <<;

                • обычные арифметические функции, такие как sqrt и log.

                • Библиотека complex активизируется только при наличии аргументов типа complex. Таким образом, для получении комплексного
                  квадратного корня из -1 используйте:
                  sqrt(complex(-1))
                  а не
                  sqrt(-1)


                  Математические операции


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


                  MDI Child/View Basic Options



                  Параметр Описание
                  MDI client/view class Именует класс используемого по умолчанию отображаемого элемента MDI. Интерпретация этого значения зависит от выбора параметра Document/View в Application.
                  Document class Именует класс документа в заданном
                  по умолчанию документе/отображаемом элементе (по умолчанию TFileDocument).
                  Description Описывает класс файлов, связанных с
                  документом/отображаемым элементом.
                  По умолчанию это *.*.
                  Filters Перечисляет трафаретные спецификации
                  файлов, разделенных запятыми или точками с запятой. Это значение передается диалоговым блокам Windows для фильтрации выводимых в них файлов. По умолчанию задается *.*.
                  Default extension Определяет заданное по умолчанию
                  расширение файла. Это значение передается диалоговым блокам Windows для фильтрации выводимых в них файлов. По умолчанию задается расширение, указанное в File Open или File New.



                  MDI Child/View



                  Параметр Описание
                  MDI child Именует производный от TMDIChild класс,
                  представляющий рамку используемых по умолчанию дочерних окон MDI.
                  Source file Именует исходный файл, в котором хранится
                  определение класса, указанного в MDI child.
                  Header file Именует файл заголовка, в котором хранится
                  определение класса, указанного в MDI child.



                  Механизм вычисления выражений Turbo Debugger


                  При вводе выражения в отладчике оно передается механизму вычисления выражения, который проверяет синтаксис и вычисляет значения идентификаторов, возвращая вычисленное значение. Чтобы задать механизм вычисления выражений, выберите команду Options Language, которая открывает диалоговое окно Expression Language. Это
                  окно содержит кнопки с зависимой фиксацией Source, C, Pascal и
                  Assembler, задающие язык для вычисления выражений. Кнопка Source
                  определяет вычисления в соответствие с исходным языком. В большинстве случаев Turbo Debugger поддерживает полный синтаксис указанных языков.


                  Меню окна Watches


                  SpeedMenu окна Wathes содержит все команды, необходимые для
                  работы с элементами окна.

                  Wathes
                  Эта команда выводит подсказку для ввода имени переменной или
                  выражения, добавляемого в окно Watches. Если не задается область
                  действия, оно вычисляется относительно текущей позиции курсора.
                  Edit
                  Открывает диалоговое окно Edit Watch Expression, позволяющее
                  вам модифицировать подсвеченное в окне Wathes выражение.
                  Remove
                  Удаляет из окна Watches подcвеченный элемент.
                  Delete All
                  Удаляет из окна Watches все выражения. Ее полезно использовать при при перемещении из одной области программы в другую.
                  Inspect
                  Открывает окно Inspector с детальной информацией по подсвеченному в окне Watch элементу. Ее полезно применять для просмотра сложного объекта данных.
                  Change
                  Модифицирует значение текущей подсвеченной в окне Wathes переменной. При вводе в диалоговом окне Enter New Value нового значения Turbo Debugger выполняет необходимое преобразование типа.



                  Меню окон Inspector


                  SpeedMenu окон Inspector содержит ряд полезных команд.

                  Range
                  Задает начальный элемент и число элементов, которые нужно
                  просмотреть в массиве.
                  Change
                  Позволяет изменить значение подсвеченного элемента на значение в окне Enter New Value. Необходимое приведение типа выполняется автоматически.
                  Inspect
                  Открывает новое окно Inspector с элементом, подсвеченным в текущем окне Inspector. Используется для проверки составных объектов данных. Эту команду можно вызвать, подсветив элемент и нажав Enter. Если текущий элемент является функцией, то выводится окно Module. Для возврата в прежнее окно нажмите Esc. Чтобы закрыть все окна Inspector, дайте команду Window Close (Alt+F3).
                  Descend
                  Эта команда работает аналогично команде Inspect локального меню, но она заменяет окно Inspector и выводит новые элементы. Это позволяет уменьшит число выводимых окон Inspector. Однако при использовании Descend для структуры данных вы не сможете вернуться к предыдущему просмотру.
                  New Expression
                  Позволяет вам проверить другое выражение, которое замещает
                  данные в текущем окне Inspector.



                  Меню Options



                  Язык Language... Source
                  Макрокоманды Macros >
                  Параметры дисплея Display options...
                  Маршрут доступа к исходному файлу Path for source...
                  Параметры сохранения Save options...
                  Параметры восстановления Restore options...

                  Это меню содержит команды, с помощью которых вы можете управлять выводом отладчика. С помощью команды Options Language вы
                  можете выбрать язык, используемый в Turbo Debugger для вычисления
                  выражений. Команда Options Dispay Options открывает диалоговое
                  окно параметров вывода Display Options. Параметр этого окна можно
                  использовать для управления выводом Turbo Debugger. Отладчик TD32
                  имеет несколько дополнительных параметров для поддержки многозадачной операционной системой Windows NT.
                  [*] Display options
                  Display swapping Integer format
                  ( ) None ( ) Hex
                  (.) Smart ( ) Decimal
                  ( ) Always (.) Both
                  Screen lines Tab size
                  (.) 25 ( ) 43/50 8
                  Background delay User screen delay
                  10 3
                  OK Cancel Help
                  Кнопки с зависимой фиксацией Display Swapping (Переключение
                  дисплея) позволяет вам выбрать один из трех способов управления
                  переключением между экраном Turbo Debugger и экраном вашей программы, а именно:

                  None (отсутствует) Нет переключения между экранами. Используйте данный параметр, если вы отлаживаете программу, которая не выводит никакой информации на экран.
                  Smart (эффективное) Переключение на экран пользователя выполняется только тогда, когда может
                  произойти вывод на экран. Отладчик будет выполнять переключение экранов
                  всякий раз когда вы проходите программу или выполняете инструкцию исходного
                  кода, в которых осуществляется чтение
                  или запись в видеопамять. Этот параметр используется по умолчанию.
                  Always (постоянное) Переключение в экран пользователя происходит при каждом выполнении программы пользователя. Используйте этот параметр, если параметр Smart не
                  позволяет перехватить все случаи вывода информации на экран вашей программой. Если вы выберете этот параметр,
                  экран будет "мерцать" при каждом шаге
                  выполнения вашей программы, так как на
                  короткое время экран Турбо отладчика
                  будет заменяться на экран вашей программы.



                  Меню Run


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

                  Run F9 Выполнение
                  Go to cursor F4 Выполнение до курсора
                  Trace into F7 Трассировка
                  Step over F8 Шаг с пропуском
                  Execute to... Alt-F9 Выполнение до...
                  Until return Alt-F8 Выполнение до возврата
                  Animate... Автоматизировать
                  Back trace Alt-F4Обратная трассировка
                  Instruction trace Alt-F7 Трассировка инструкций
                  Arguments... Аргументы
                  Program reset Ctrl-F2 Сброс программы
                  Next Pending Status Следующий ждущий
                  Wait for Child Ожидание дочернего

                  Команда Run запускает вашу программу на выполнение. При наступлении одного из следующих событий управление передается отладчику.
                • ваша программа завершила выполнение;

                • обнаружена точка останова с действием прерывания;

                • прервали выполнение с помощью клавиши прерывания;

                • олнение программы остановлено из-за ошибки;

                • никли отмеченные исключительные ситуации Си или С++.

                • Команда Go to Cursor выполняет программу до той строки, где
                  находится курсор (в текущем окне Module или области Code окна
                  CPU). Если текущим окном является окно Module, курсор должен находиться на строке исходного кода внутри функции.
                  Команда Trace Into выполняет одну строку исходного кода или
                  машинную инструкцию. Если текущая строка содержит вызов процедуры
                  или функции, то отладчик выполняет трассировку этой процедуры.
                  Однако, если текущим окном является окно CPU, то выполняется одна
                  машинная инструкция. Если текущим является окно Module, то выполняется строка исходного кода.
                  Turbo Debugger интерпретирует методы объектов и функции-элементы классов, как все другие процедуры и функции. Клавиша F7
                  позволяет трассировать их исходный код (если он доступен).
                  Если вы выполняете эту команду для одной машинной инструкции, отладчик интерпретирует некоторые инструкции, как одну инструкцию, даже они приводят к выполнению нескольких инструкций.
                  Это инструкции CALL, INT, LOOP, LOOPZ и LOOPNZ.



                  Это справедливо и для префиксов REP, REPNZ или REPZ, за которыми следуют инструкции CMPS, CMPSW, LODSB, MOVS, MOVSB, MOVSW,

                  SCAS, SCASB, SCASW, STOS, STOSB или STOSW.

                  Команда Step Over выполняет одну строку исходного кода или

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

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

                  программы. Если вы используете Step Over при расположении указателя на инструкции вызова, то Turbo Debugger полностью отрабатывает эту функции и переводит вас к оператору после вызова функции.

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

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

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

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

                  Команда Run Step Over интерпретирует вызов метода объекта

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

                  функции.

                  Команда Execute To выполняет вашу программу до адреса, который вы ввели в ответ на подсказку в диалоговом окне Enter Code

                  Address to Execute To. Программа может не достичь этого адреса,

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

                  Команда Until Return выполняет текущую процедуру или функцию, пока она не возвратит управление вызывающей программе. Это

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

                  вошли в процедуру или функцию, выполнение которой вас не интересует (с помощью команды Run Trace вместо команды Run Step), или

                  когда вы определили, что текущая функция работает правильно, и не

                  хотите медленно проходить по шагам ее оставшуюся часть.

                  Команда Animate выполняет непрерывную последовательность команд Trace. Это позволяет вам наблюдать за текущим адресом в исходном коде и видеть изменение значений переменных. Прервать выполнение данной команды можно нажатием любой клавиши. После выбора команды Run Animate вам выведется подсказка для ввода значения



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

                  3.

                  Если вы выполняете трассировку программы (с помощью оперативных клавиш F7 или Alt-F7), то команда Back Trace изменяет порядок выполнения на обратный. Это средство удобно использовать,

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

                  к этой точке. Данная команда позволяет вам выполнить программу "в

                  обратном порядке" по шагам или до заданной (подсвеченной) точки в

                  области инструкций окна Execution History. В окне CPU обратное

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

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

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

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

                  информации (например, библиотечной подпрограмме). Так как вы

                  больше не будете находиться в начале строки исходного теста, эта

                  команда обычно переводит вас в окно CPU.

                  Команда Arguments позволяет вам задать новые аргументы программы. Введите аргументы программы, как они задаются после имени

                  программы в командной строке. После этого отладчик запрашивает,

                  хотите ли вы перезагрузить отладчик с диска. Следует ответить

                  "Yes".

                  Команда Program Reset перезагружает отлаживаемую вами программу с диска. Ее можно использовать в следующих случаях:

                • да выполнение "зашло слишком далеко", то есть пройдено

                  то место, где имеется ошибка;


                • да ваша программа завершила работу и вы хотите запустить ее снова;


                • если вы работаете в окне CPU, приостановили выполнение

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


                • если вы хотите перезагрузить DLL, которая уже загружена,

                  установите для нужной DLL в Yes параметр Startup Option в



                  диалоговом окне Load Module Source или DLL Symbols и

                  сбросьте программу.


                • Если вы выбрали команду Program Reset и находитесь в окне

                  Module или CPU, то отладчик устанавливает Instruction Pointer на

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

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

                  строки. Если вы выбрали команду Program Reset только потому, что

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

                  Команда Next Pending Status (доступная при отладке в Windows

                  NT) может использоваться при установке в Yes команды Run Wait for

                  Child. Если Wait for Child установлена в No (и ваша программа при

                  обращении к отладчику работает в фоновом режиме), то команду Next

                  Pending Status можно использовать для получения сообщения о статусе программы. Чтобы указать на наличие такого сообщения, индикатор активности отладчика выводит PENDING.

                  Команду Wait for Child (которая используется исключительно

                  отладчиком TD32 для отладки программ Windows NT) можно переключать в Yes и No. В состоянии No вы можете обращаться к отладчику

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

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

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


                  Метки и инструкции перехода


                  Во встроенном ассемблере вы можете использовать любые условные и безусловные инструкции перехода и циклов. Эти инструкции
                  допускаются только внутри функции. Поскольку метки в операторах
                  asm определить нельзя, инструкции перехода должны использовать
                  метки goto языка Си. Если метка находится слишком далеко, переход
                  не будет автоматически преобразовываться в дальний переход. Поэтому работать с условными переходами нужно аккуратно. Для проверки переходов можно использовать параметр -B. Прямые переходы
                  дальнего типа генерировать нельзя. Допускаются косвенные переходы. Чтобы использовать косвенные переходы, применяйте в качестве
                  операнда инструкции перехода имя регистра.


                  Методы управляющих элементов VBX


                  Методы управляющих элементов VBX - это функции, содержащиеся
                  в каждом управляющим элементом VBX и вызывающие определенное
                  действие. TVbxControl обеспечивает совместимость с методами Visual Basic 1.0 Move, Refresh, AddItem и Remove.
                  Функция Move помещает управляющий элемент в точку с заданными координатами и задает его размер в элементах изображения.
                  Функция Refresh обновляет область вывода управляющего элемента.
                  AddItem добавляет заданный элемент к списку управляющих элементов
                  и дает ему указанный индекс. Функция RemoveIndex удаляет элемент
                  с заданным индексом.


                  Мнемонические имена кодов операций


                  aaa fdvtr fpatan lsl
                  aad feni fprem mov
                  aam ffroe** fplan mul
                  aas fiadd frndint neg
                  adc ficom frstor nop
                  add ficomp fsave not
                  and fidiv fscale or
                  bound fidifr fsqrt out
                  call fild fst pop
                  cbw fimul fstcw popa
                  clc fincstp** fslenv popi
                  cld finit fstp push
                  cli fist fstsw pusha
                  cmc fistp fsub pushf
                  cmp fisub fsubp rcl
                  cwd fisubr fsubr rcr
                  daa fld fsubrp ret
                  das fld1 ftst rol
                  dec fldcw fweit ror
                  div fldenv fxam sahf
                  enter fldl2e fxch sal
                  f2xm1 fldl2t fxtract sar
                  fabs fldlg2 fyl2x sbb
                  fadd fldln2 fyl2xp1 shl
                  faddp fldpi hlt shr
                  fold fldz idiv smsw
                  fbstp fmul imul stc
                  fchs fmulp in std
                  fclex fnclex inc sti
                  fcom fndisi int sub
                  fcomp fneni into test
                  fcompp fninit iret verr
                  fdecstp** fnop lahf verw
                  fdisi fnsave lds wait
                  fdiv fnstcw lea xchg
                  fdivp fnstenv leave xlat
                  fdivr fnstsw les xor
                  При использовании средства встроенного ассемблирования в
                  подпрограммах, эмулирующих операции с плавающей точкой (параметр
                  BCC -f), коды операции, помеченные **, не поддерживаются.
                  При использовании в операторах встроенного ассемблирования
                  мнемонических команд процессора 80186 необходимо включать параметр командной строки -1. Тогда компилятор включит в генерируемый
                  им Ассемблерный код соответствующие операторы, в результате чего
                  Турбо Ассемблер будет ожидать появление данных мнемонических
                  имен. При использовании предыдущих версий ассемблера эти мнемонические имена могут не поддерживаться.


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


                  Потоковый код предусматривает теперь 4 шаблона функций, которые поддерживают виртуальные базовые классы и множественное
                  наследование.
                  В любом классе с прямой виртуальной базов следует использовать новые шаблоны функций ReadVirtualBase и WriteVirtualBase:
                  void Derived:Write( opstream& out )
                  {
                  WriteVirtualBase( (VirtualBase *)this, out);
                  ...
                  }
                  void *Derived::Read( ipstream& in, uint32 ver )
                  {
                  ReadVirtualBase( (VirtualBase *)this, in );
                  ...
                  }
                  Класс, производный от класса с виртуальными базами, не должен ничего особенного делать с этими виртуальными базами. Каждый
                  класс отвечает только за свои непосредственные базы.
                  Объектные потоки поддерживают теперь множественное наследование. Чтобы читать и записывать множественные базы, используйте
                  новые шаблоны функций WriteBaseObject и ReadBaseObject:
                  void Derived::Write( opstream& out )
                  {
                  WriteBaseObject( (Base1 *)this, out );
                  WriteBaseObject( (Base2 *)this, out );
                  ...
                  }
                  void *Derived::Read( ipstream& in, uint32 ver )
                  {
                  ReadBaseObject( (Base1 *)this, in );
                  ReadBaseObject( (Base2 *)this, in );
                  ...
                  }


                  Множественное наследование


                  Под множественным наследованием понимается способность наследования свойств и поведения не от одного базового класса, а от нескольких. Такое наследование легко проследить по классификации языков
                  программирования. У каждого из языков, как правило несколько предков.
                  Так язык программирования С++ является потомком Си и Симулы, язык Ада
                  потомком целого спектра языков и так далее.
                  Си Симула
                  ^
                  < >
                  Насле- Порождение
                  дование классов
                  С++
                  v
                  Как используется наследование в реальных программах? На примере
                  библиотеки Turbo Vision попробуем проследить его использование в иерархии классов TObject и TView. Внимательное ее изучение будет вам
                  чрезвычайно полезно. Так, вы узнаете, что класс TDialog (диалог) является наследником класса TWindow (окно), который, в свою очередь,
                  является наследником класса TGroup (группа), а последний - класса
                  TView (отображаемый объект). Имеется несколько примеров множественного наследования в иерархии классов Turbo Vision. Вот один из них:
                  TProgram получается из TProgInit и TGroup.
                  Рисунок: иерархия классов Turbo Vision.
                  opstream
                  TObject TStreamable
                  ^ ^
                  ipstream
                  TView
                  ^
                  TGroup
                  ^ ^ ^
                  TDeskInit
                  ^
                  TWindowInit
                  ^
                  TProgInit TDeskTop
                  ^
                  >TWindow< THistInit<
                  TProgram THistoryWindow
                  ^
                  TApplication TDialog
                  Примечание: по установившейся практике стрелки показывают
                  от порожденного класса на базовый.
                  Выбрав любой из классов, вы можете найти в его определении
                  унаследованные и новые свойства.


                  Модели памяти


                  В 16-разрядных программах Borland С++ вы можете использовать
                  6 моделей памяти: крохотную, малую, среднюю, компактную, большую
                  и огромную.
                • Tiny (крохотная). Эта модель памяти используется в тех
                  случаях, когда абсолютным критерием достоинства программы
                  является размер ее загрузочного кода. Это минимальная из
                  моделей памяти. Все четыре сегментных регистра (CS, DS, SS
                  и ES) устанавливаются на один и тот же адрес, что дает общий размер кода, данных и стека, равный 64К. Используются
                  исключительно ближние указатели. Программы со сверхмалой
                  моделью памяти можно преобразовать к формату .COM (при
                  компоновке с параметром /t).

                • Small (малая). Эта модель хорошо подходит для небольших
                  прикладных программ. Сегменты кода и данных расположены
                  отдельно друг от друга и не перекрываются, что позволяет
                  иметь 64К кода программы и 64К данных и стека. Используются только указатели near.

                • Medium (средняя). Эта модель годится для больших программ,
                  для которых не требуется держать в памяти большой объем
                  данных. Для кода, но не для данных используются указатели
                  far. В результате данные плюс стек ограничены размером
                  64К, а код может занимать до 1М.

                • Compact (компактная). Лучше всего использовать эту модель
                  в тех случаях, когда размер кода невелик, но требуется адресация большого объема данных. Указатели far используются
                  для данных, но не для кода. Следовательно, код здесь ограничен 64К, а предельный размер данных - 1 Мб.

                • Large (большая). Модели large и huge применяются только в
                  очень больших программах. Дальние указатели используются
                  как для кода, так и для данных, что дает предельный размер
                  1 Мб для обоих.

                • Huge (огромная). Дальние указатели используются как для
                  кода, так и для данных. Borland C++ обычно ограничивает
                  размер статических данных 64К; модель памяти huge отменяет
                  это ограничение, позволяя статическим данным занимать более 64К.

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


                  Модели памяти


                  Размер кода
                  Размер данных
                  64К 16Мб
                  Tiny (данные и код
                  перекрываются; общий
                  размер = 64К)
                  64K
                  Small (без перекрытия; Medium (данные small,
                  общий размер = 128К) код large)
                  Compact (данные large, Large (данные и код
                  код small) large)
                  16Мб
                  Huge (то же, что и
                  large, но статические
                  данные > 64K)
                  При компиляции модуля (некоторый исходный файл с несколькими
                  подпрограммами), результирующий код для этого модуля не может
                  превышать 64К, поскольку весь файл должен компилироваться в один
                  кодовый сегмент. Это верно и в том случае, когда вы используете
                  одну из больших моделей памяти (medium, large или huge). Если ваш
                  модуль слишком велик и не помещается в одном кодовом сегменте
                  (64К), вы должны разбить его на несколько файлов исходного кода,
                  скомпилировать каждый из них по отдельности и затем скомпоновать
                  их в одну программу. Аналогичным образом, хотя модель huge и позволяет иметь размер статических данных больше чем 64К, в каждом
                  отдельном модуле статические данные не должны превышать 64К.


                  Модели памяти


                  В Borland С++ используется 6 моделей памяти, каждая из которых служит для различных размеров программ и кода.
                  Регистры процессора
                  Ниже представлены некоторые регистры процессоров 80х86. Эти
                  процессора имеют и другие регистры, но непосредственно к ним обращаться нельзя, поэтому они здесь не показаны.


                  Модификация и опрос комбинированного блока


                  TComboBox определяет несколько функций-элементов для списка
                  комбинированного блока и области редактирования: SetText, SetEditSel, Clear, ShowList, HideList и SetExtendedUI. Для опроса содержимого редактируемого элемента комбинированного блока и областей списка TComboBox наследует несколько функций-элементов из
                  TListBox: GetTextLen, GetText, GetEditSel, GetDroppedControlRect,
                  GetDroppedState, GetExtendedUI.


                  Модификация объектов меню


                  После создания объекта меню вы можете использовать функции-элементы TMenu для его модификации. Этот такие функции как AppendMenu, InsertMenu (для добавления пунктов меню), ModifyMenu (для модификации пункта меню), EnableMenu (для разрешения и запрещения пунктов меню), DeleteMenu и RemoveMenu (для удаления
                  пунктов меню), CheckMenu и SetMenuItemBitMaps (для отметки пунктов меню) и TrackPopupMenu (для вывода всплывающих меню).
                  После модификации объекта меню вам следует вызвать для обновления строки меню функцию-элемент DrawMenuBar.


                  Модификация окон-рамок


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

                  Функция Назначение
                  AssignMenu Обычно используется перед созданием интерфейсного элемента для задания меню окна.
                  SetMenu Устанавливает описатель меню.
                  SetMenuDescr Задает описание меню.
                  GetMenuDescr Возвращает описание меню.
                  MergeMenu Объединяет текущее описание меню с заданным.
                  RestoreMenu Восстанавливает меню окна из Attr.Menu.
                  SetIcon Устанавливает пиктограмму согласно заданному
                  ресурсу.



                  Модификация существующих шаблонов


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

                  Функция Назначение
                  GetFileFilter и SetFileFilter Получают и задают строку, используемую для фильтрации имен файлов в текущем каталоге.
                  GetDescription и SetDescription Получают и задают текст описания шаблона класса.
                  GetDirectory и SetDirectory Используются для получения и задания назначенного по умолчанию каталога.
                  GetFlags, SetFlag, IsFlagSet, ClearFlag Служат для получения и установки значений флага.



                  Модификаторы макрокоманд утилиты MAKE



                  Модификатор Какую часть имени файла он определяет Пример
                  D Диск и каталог. $(
                  F Базовое имя файла и расширение. $(
                  B Только базовое имя файла. $(
                  R Диск, каталог и расширение. $(



                  Модификаторы макрокоманд


                  Если нет предопределенной макрокоманды имени файла, которая
                  позволяет вам задавать части нужного имени файла, для выделения
                  частей имени файла вы можете использовать модификаторы макрокоманд. Они имеют следующий формат:
                  $(макрокоманда[D F B R])
                  где "макрокоманда" - одна из предопределенных макрокоманд имени
                  файла (показанных выше), а R, B, D и F - модификаторы. Заметим,
                  что поскольку макрокоманда теперь имеет длину более одного символа, необходимы круглые скобки. Каждый из модификаторов описывается в следующей таблице. В примерах предполагается, что $< возвращает C:\OBJS\BOB.OBJ.


                  - N -

                  На передовой Borland С++


                  Чтобы нашу программу, написанную на языке Си, преобразовать в
                  программу, написанную в стиле Borland С++, необходимо, во-первых, -
                  перестроить нашу структуру декомпрессора в класс:
                  typedef struct { class decompressor {
                  int srclen, c, rcnt; int srclen, c, rcnt;
                  unsigned char *p; ===>> unsigned char *p;
                  } decompressor; public:
                  decompressor(unsigned char *s, int len);
                  int next(void);
                  };
                  Заметьте, что наш класс включает, как функции, так и данные,
                  используемые при декомпрессии. Давайте более пристально исследуем эти
                  функции. Первая функция является конструктором, она эквивалента нашей
                  функции на Си - decompressor_init().


                  Наблюдение за классами


                  Чтобы трассировать сообщения для одного или более классов,
                  выберите эти классы в области списка классов (используя Shift или
                  Ctrl и щелчок кнопкой "мыши"), затем выберите Messages Selected
                  Classes. Трассировка сообщений позволяет видеть все сообщения для
                  окон данного класса, включая сообщения создания.


                  Наблюдение за окнами


                  После выбора окна из дерева окон с помощью команды Messages
                  Selected Windows вы можете выполнить трассировку сообщений, приходящих в это окно. Изменение выбора в дереве окна немедленно
                  сменит окно, для которого должны трассироваться сообщения.
                  С помощью команды Messages All Windows вы можете также выбрать наблюдение за всеми окнами, независимо от того, что выбрано
                  в области списка классов или в области дерева окон.
                  Выбор команды Messages Selected Windows или Windows All Windows, когда область трассировки сообщений является скрытой, приводит в выводу области трассировки сообщений.
                  Выбор команды Messages Trace запрещает трассировку сообщений, не убирая с экрана область трассировки сообщений.


                  Начальный и завершающий код


                  Когда вам нужно скомпилировать модуль для Windows, компилятору требуется знать, какой начальный и завершающих код требуется
                  создавать для каждой функции модуля. Созданием этого кода управляют установки IDE и параметры компилятора режима командной строки. Начальный и завершающий код выполняет несколько функций,
                  включая обеспечение активности корректного сегмента при обратном
                  вызове и поддержку границ стека в механизме обеспечения стека
                  Windows.
                  Начальный и завершающий код генерируется компилятором автоматически в соответствии с параметрами компилятора и установками
                  IDE. Ключевое слово _export в определении сообщает компилятору,
                  что нужно компилировать функцию как экспортируемую. В описании
                  функции или класса _export непосредственно предшествует имени
                  функции или класса.
                  Ключевое слово _import в функции или классе сообщает компилятору, что функция или класс будут импортироваться из DLL.
                  _import также указывается перед именем функции или класса.


                  Начало работы


                  При двойном нажатии кнопки "мыши" на пиктограмме WinSight
                  выводится основное окно с используемой по умолчанию конфигурацией, что представляет собой список всех окон, активных в данный
                  момент в оперативной области. В окне WinSignt выводится дерево
                  окон, в котором перечислены все активные в оперативной области
                  окна.
                  WinSignt позволяет просматривать список классов, дерево окон
                  и трассировку сообщений.
                  Когда в основном окне у вас выводится два или более окон, вы
                  можете расположить их в виде стека (одно за другим) или в виде
                  массива (одно рядом с другим). Данные конфигурации переключаются
                  с помощью команды меню View Split Vertical (Вертикальное разбиение) и Split Horizontal (Горизонтальное разбиение).


                  Начнем с алгоритма декомпрессии на языке Cи


                  Ниже представлен типичный фрагмент программы декомпрессии, написанной на языке Си. Данная версия выбирает символьную строку длины
                  srclen и выводит ее на экран.
                  void decomp(unsigned char *s, int srclen)
                  {
                  int c, rcnt;
                  while(srclen-- > 0) {
                  c = *s++;
                  if (c == 0xff) { /* групповая декомпрессия */
                  rcnt = *s++; c = *s++; srclen -= 2;
                  while(rcnt--) putchar(c);
                  }
                  else putchar(c);
                  }
                  }


                  Написание переносимого кода Windows


                  В данном разделе обсуждаются конструкции (введенные в
                  Windows 3.1), обеспечивающие переносимость кода Windows. Существующий 16-разрядный код Windows можно переносить с минимальными
                  изменениями в Win32 и Windows NT. Большинство изменений предусматривают подстановку вместо старых новых макрокоманд и типов и
                  замену специфических 16-разрядных вызовов API аналогичными API
                  Win32. После внесения этих изменений ваш программный код сможет
                  компилироваться и выполняться в 16-разрядной и 32-разрядной среде
                  Windows.
                  Чтобы облегчить создание переносимого кода, предусмотрена
                  переменная среду этапа компиляции STRICT. Windows 3.1 поддерживает определение STRICT в windows.h. Например, если не определена
                  переменная STRICT, то передача HWND функции, требующей HDC, не
                  приведет к выводу компилятором предупреждающего сообщения. Если
                  вы определите STRICT, то получите ошибку компиляции.
                  Использование STRICT позволяет:
                • выполнять строгую проверку типов;

                • корректировать и согласовывать описания типа параметра и
                  возвращаемого значения;

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

                • согласовывать с ANSI описания структур COMM, DCB и
                  COMSTAT.

                • STRICT обладает обратной совместимостью с Windows 3.0, то
                  есть ее можно использовать для создания приложений, работающих в
                  Windows 3.0. Определение STRICT поможет вам находить и корректировать несовместимость типов при переносе программ в 32-разрядную среду и поможет обеспечить переносимость между 16- и 32-разрядной Windows.
                  Чтобы вы могли изменить свою программу в соответствии со
                  STRICT, предусмотрены новые типы, константы и макрокоманды

                  Типы и константы Описание
                  CALLBACKИспользуется вместо FAR PASCAL в подпрограммах обратного вызова (например, оконных и диалоговых процедурах).
                  LPARAM Описывает все 32-разрядные полиморфические параметры.
                  LPCSTR То же, что LPSTR, но используется для доступ-
                  ных только по чтению строковых указателей.
                  LRESULT Описывает все 32-разрядные возвращаемые значения.
                  UINT Переносимый беззнаковый целочисленный тип,
                  размер которого определяется целевой средой.
                  (В Windows 3.1 представляет 16-битовое значение, а в Win32 - 32-битовое.)
                  WINAPI Используется вместо FAR PASCAL для описаний API. Если вы пишете DLL с экспортируемыми точками входа API, то можете использовать ее для описаний API.
                  WPARAM Описывает 16-битовые полиморфические параметры.
                  <


                  Макрокоманда Описание






                  RELDOFFSET(тип, поле) Вычисляет смещение поля в структуре. "Тип" - это тип структуры, а "поле" - это имя поля.
                  WAKELP(селект,смещ) Воспринимая селектор и смещение, создает FAR VOID*.
                  WAKELPARAM(мин,макс) Из двух 16-битовых значений создает LPARAM.
                  WAKELRESULT(мин,макс) Из двух 16-битовых значений создает LRESULT.
                  OFFSETOF(указ) Выделяет из дальнего указателя смещение и возвращает UINT.
                  SELECTOROF(указ) Выделяет из дальнего указателя селектор и возвращает UINT.
                  Описатели Значение












                  HACCEL Описатель таблицы акселератора.
                  HDRVR Описатель драйвера (Windows 3.1).
                  HDWP Описатель DeferWindowPost().
                  HFILE Описатель файла.
                  HGDIOBJ Общий описатель объекта GDI.
                  HGLOBAL Глобальный описатель.
                  HINSTANCE Описатель экземпляра.
                  HLOCAL Локальный описатель.
                  HMETAFILE Описатель метафайла.
                  HMODULE Описатель модуля.
                  HPSRC Описатель ресурса.
                  HTASK Описатель задачи.
                  Чтобы сделать ваше приложение согласованным со STRICT, нужно:

                • Определить, какой программный код вы хотите согласовать

                  со STRICT.


                • Включить наивысший уровень вывода ошибок/предупреждений.

                  В IDE используйте команду

                  Options Compiler Messages Display All. В BCC32 укажите

                  параметр -w.


                • Перед включением windows.h и компиляцией определить

                  STRICT с помощью #define или использовать в командной

                  строке параметр -DSTRICT.


                • Перечислим некоторые рекомендации, которые могут оказаться

                  полезными при преобразовании вашего программного кода в соответствии со STRICT:

                • Измените HANDLE на соответствующий тип описателя, например, HMODULE, HINSTANCE и др.


                • Измените WORD на UINT (за исключением тех мест, где вы

                  хотите получить 16-битовое значение на 32-разрядной платформе).


                • Измените WORD на WPARAM.


                • Измените LONG на LPARAM или LRESULT.


                • Измените FARPROC на WNDPROC, DLGPROC или HOOKPROC.


                • В 16-разрядной Windows всегда описывайте указатели функций

                  с помощью подходящего типа функции, а не с помощью

                  FARPROC. При использовании MakeProcInstance,

                  FreeProcInstance и других функций, воспринимающих или



                  возвращающих FARPROC, вам нужно приводить типы указателей

                  функции, например:

                  BOOL CALLBACK DlgProc(HWND hwnd, UINT msg,

                  WPARAM wParam,

                  LPARAM lParam);

                  DLGPROC lpfnDlg;

                  lpfnDlg=(DLGPROC)MakeProcInstance(DlgProc, hinst);

                  ...

                  FreeProcInstance((FARPROC)lpfnDlg);


                • Особое внимание обратите на HMODULE и HINSTANCE. Функции

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

                  только HMODULE.


                • Если вы копируете какие-то описания функций API из

                  WINDOWS.H, они могут быть изменены, и ваши описания могут

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


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

                  приводиться к LOCALHANDLE или GLOBALHADLE.


                • Приведите результат GetWindowWord и GetWindowLong и параметры к SetWindowWord и SetWindowsLong.


                • При приведении типа SendMessage, DefWinmdowProc и

                  SendDlgItemMsg или любых других функций, которые возвращают LRESULT или LONG к какому-либо описателю вы должны сначала привести результат к UINT:

                  HBRUSH hbr;

                  hbr = (HBRUSH)(UINR)

                  SendMessage(hwnd WM_CTLCOLOR, ..., ...);


                • Параметр CreateWindow и CreateWindowEx функции hmenu иногда используются для передачи целочисленного управляющего

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

                  HMENU:

                  HWND hwmd;

                  int id;

                  hwnd = CreateWindow("Button", "Ok", BS_PUSBUTTON,

                  x, y, cx, cy, hwndParent,

                  (HMENU)id, // здесь требуется приведение типа

                  hinst, NULL);


                • Полиморфические типы данных (WPARAM, LPARAM, LRESULT, void

                  FAR*) следует возможно скорее присваивать переменным. Избегайте использовать их в своих программах, когда тип значения известен. Это минимизирует число потенциально небезопасных и непереносимых в 32-разрядный режим преобразований типов. Макрокоманды API и механизмы обработки сообщений, предусмотренные в windowsx.h, будут выполнять практически всю упаковку и распаковку этих типов данных способом, обеспечивающим переносимость в 32-разрядный режим.


                • Ознакомьтесь с наиболее общими предупреждениями и ошибками

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

                  STRICT.



                • Наш декомпрессор в стиле фильтра


                  Декомпрессор, работающий в посимвольном режиме будет выглядеть
                  так:
                  int decompressor_next(decompressor* dc)
                  {
                  if (dc->rcnt && dc->rcnt-- > 0) /* Контроль декомпрессии */
                  return dc->c; /* Возврат повторного символа */
                  if (!dc->srclen || dc->srclen-- <= 0) /* Пропуск ... */
                  return -1;
                  dc->c = *(dc->p)++; /* Обработка следующего символа буфера */
                  if (dc->c == 0xff) {
                  dc->rcnt = (*(dc->p)++)-1; /* Сброс первого символа в записи */
                  dc->c = *(dc->p)++; /* Здесь повторить символ */
                  dc->srclen -= 2;
                  }
                  return dc->c;
                  }


                  Наследование


                  Наследование - это способность брать существующий - базовый
                  класс и порождать из него новый класс - потомок, с наследованием всех
                  его атрибутов и поведения. Это пожалуй самая впечатляющая возможность
                  объектно-ориентированного программирования и, возможно, единственное
                  коренное отличие С++ от Си.
                  Рассмотрим отвлеченный пример из реальной жизни - классификационную схему живых организмов. По этой схеме растительные и живые
                  царства делятся на группы, так называемые типы. Каждый тип, в свою
                  очередь, делится на классы, отряды, семейства и далее. Группы более
                  низкого уровня наследуют характеристики групп более высоких уровней.
                  Так, из утверждения о том, что волк относится к семейству псовых, вытекает сразу несколько положений. Из него следует, что у волков хорошо развиты слух и обоняние, поскольку таковы характеристики псовых.
                  Так как псовые входят в отряд хищных, это утверждение говорит еще о
                  том, что волки питаются мясом. Поскольку хищные относятся к млекопитающим, это утверждение говорит и о том, что волки имеют волосяной
                  покров и регулируемую температуру тела. Наконец, так как млекопитающие являются позвоночными, мы узнаем и то, что у волков есть позвоночник.
                  Волк -> Псовые -> Хищники -> Млекопитающие -> Позвоночные
                  Подобные схемы наследования можно проследить в классификации
                  языков программирования, классификации типов компьютеров и других.
                  Рассмотрим существующие в объектно-ориентированных языках иерархии
                  порождаемых объектов.


                  и Windows NT. ObjectWindows позволяет


                  ObjectWindows 2.0 - это прикладная среда Borland С++ для

                  Windows 3.1, Win32S и Windows NT. ObjectWindows позволяет быстро

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

                • Легкую переносимость между 16- и 32-разрядными платформами.


                • Автоматизированную обработку сообщений.


                • Надежную обработку особых ситуаций и ошибок.


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


                • Инкапсулирует объекты GDI Windows.


                • Имеет классы Doc/View для простой абстракции и вывода данных.


                • Содержит классы для работы с принтером и предварительного

                  просмотра печатаемой информации на экране.


                • Поддерживает управляющие элементы VisualBasic.


                • Имеет средства проверки допустимости ввода.



                • Настройка конфигурации IDE


                  Вы можете настроить конфигурацию IDE для автоматического вы-
                  полнения отдельных задач или обработки событий. Диалоговое окно
                  Options Enviroment позволяет вам настроить конфигурацию редактора, средства просмотра, отладчика, подсистемы управления проектами и других элементов IDE. Заданные параметры сохраняются в файле
                  BCCONFIG.BCW. Список параметров в окне можно сжимать и расширять
                  с помощью + и -.
                  Команда Options Enviroment позволяет также настроить вид
                  оперативной полосы окон Editor, Browser, Debugger, Project, Message, Desktop и ClassExpert. При выборе одного из этих окон выводится оперативная полоса SpeedBar с комплектом инструментальных
                  средств. Вы можете ее настроить. Чтобы включить в нее или удалить
                  командные кнопки, сделайте следующее:
                • Выберите в основном меню команду Options Enviroment.

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

                • Выберите под SpeedBar Customize. В параметрах справа выводится информация о полосах SpeedBar.

                • Выберите тип оперативной полосы, которую вы хотите изменить
                  Editor, Browser, Debugger, Project, Message, Desktop или
                  ClassExpert). В столбце Avaliable Buttons выводятся все
                  доступные (доступные) командные кнопки, а в столбце Active
                  Buttons - кнопки выбранной оперативной полосы.

                • Чтобы добавить командную кнопку, дважды щелкните на ней
                  "мышью" в столбце Avaliable Buttons, а чтобы удалить, выберите кнопку в Active Buttons и щелкните "мышью" на указывающей влево стрелке.

                • Для переупорядочения позиций командных кнопок в SpeedBar
                  используйте стрелки вверх и вниз. Выбранная в Active Buttons кнопка перемещается вверх или вниз по списку.

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


                  Настройка конфигурации WinSpector


                  WinSpector можно настроить таким образом, чтобы она лучше
                  соответствовала вашим потребностям. Это позволяет управлять выводом информации в файл WINSPCTRL.LOG.
                  Параметры WinSpector можно устанавливать в диалоговом окне
                  Preferences или с помощью ввода команд непосредственно в файл
                  WINSPCTR.INI.
                  Параметр Directory в диалоговом окне Preferences позволяет
                  вам решить, куда записывается файл регистрации. Если вы не задаете каталог, то по умолчанию используется каталог Windows.
                  Для задания каталога сделайте следующее:
                • Откройте диалоговое окно Preferences.

                • Введите в поле ввода Directory имя каталога.

                • Выберите командную кнопку OK.

                  либо добавьте запись LogDir=[каталог] в файл WINSPCTR.INI.

                • Параметр Viewer диалогового окна Preferences позволяет задать, какое программное средство нужно использовать для просмотра
                  файла регистрации. Если вы не задаете каталог, то по умолчанию
                  используется Windows Notepad.
                  Если исключительная ситуация возникает в процессе сеансе с
                  текущим окном Windows, чтобы увидеть файл регистрации, выберите
                  View Log (Просмотр файла регистрации) диалогового окна Latest UAE
                  или диалоговое окно Preferences. Команда View Log запускает выбранную программу просмотра и передает файл WINSPCTR.LOG в качестве аргумента командной строки.
                  Чтобы просмотреть предыдущий файл регистрации, выберите в
                  системном меню WinSpector команду View Log file.
                  Чтобы задать средство просмотра, сделайте следующее:
                • Откройте диалоговое окно Preferences.

                • Введите средство просмотра в текстовом диалоговом окне Viewer.

                • Выберите командную кнопку OK.

                  либо добавьте LogViewer=[имя_файла_программы_просмотра] к файлу
                  WINSPCTR.INI.

                • Параметры Append New Reports и Overwrite Previous Reports в
                  диалоговом окне Preferences позволяет вам либо добавить отчеты к
                  предыдущему файлу регистрации, либо затереть предыдущий файл регистрации при генерации нового отчета. По умолчанию задается затирание предыдущего файла.
                  Если вы выбираете перезапись предыдущего файла регистрации,
                  то при первом возникновении исключительной ситуации предыдущий



                  файл регистрации затирается. Последующие исключительные ситуации,

                  возникающие в процессе текущего сеанса работы с Windows, будут

                  добавлять информацию к этому файлу.

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

                • Откройте диалоговое окно Preferences.


                • Установите Log File в Append New Reports.


                • Выберите командную кнопку OK.

                  либо нужно добавить Add CreateNewLog=0 в файл WINSPCTR.INI.


                • Чтобы затирать предыдущие файлы регистрации, сделайте следующее:

                • Откройте диалоговое окно Preferences.


                • Установите Log File в Overwrite Previous Reports.


                • Выберите командную кнопку OK.

                  либо добавьте Add CreateNewLog=1 в файл WINSPCTR.INI.


                • Параметр System Information в диалоговом окне Preferences

                  позволят вам добавить в файл регистрации список задач Task List,

                  список модулей Module List, и информацию о динамически распределяемой области памяти пользователя (USER) и GDI. По умолчанию в

                  отчет включается системная информация.

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

                • Откройте диалоговое окно Preferences


                • В Report Information выберите System Info.


                • Выберите командную кнопку OK.

                  либо нужно добавить Add ShowSystemInfo=1 в файл WINSPCTR.INI.


                • Чтобы системная информация не включалась в файл регистрации,

                  сделайте следующее:

                • Откройте диалоговое окно Preferences


                • В Report Information отмените System Info.


                • Выберите командную кнопку OK.

                  либо нужно добавить Add ShowSystemInfo=0 в файл WINSPCTR.INI.


                • Параметр AUX Summary в диалоговом окне Preferences указывает

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

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

                  на второй монитор. По умолчанию информация на AUX не выводится.

                  Для передачи итогового отчета на устройство AUX сделайте

                  следующее:

                • Откройте диалоговое окно Preferences.


                • В Report Information, выберите Summary To AUX.


                • Выберите командную кнопку OK.

                  либо добавьте LogToStdAux=1 в файл WINSPCTR.INI.




                • Чтобы итоговый отчет не передавался на устройство AUX сделайте следующее:

                • Откройте диалоговое окно Preferences.


                • Under Report Information, отмените Summary To AUX.


                • Choose OK.

                  либо добавьте LogToStdAux=0 в файл WINSPCTR.INI.


                • Параметр Stack Frame Data в диалоговом окне Preferences позволяет вам выполнить подробную трассировку стека в файл регистрации. Для кадра стека не превышающего 256 байт выполняется шестнадцатиричный дамп, начиная с SS:BP для кадра стека. Если между двумя последовательными кадрами стека больше 256 байт, то показ

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

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

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

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

                  трассировка стека. Чтобы добавить данные трассировки стека в файл

                  регистрации, сделайте следующее:

                • Откройте диалоговое окно Preferences.


                • В Report Information, выберите Stack Frame Data.


                • Выберите командную кнопку OK.

                  либо добавьте ShowStackInfo=1 в файл WINSPCTR.INI.


                • Чтобы не включать данные кадра стека в файл регистрации,

                  сделайте следующее:

                • Откройте диалоговое окно Preferences.


                • В Report Information, отмените Stack Frame Data.


                • Выберите командную кнопку OK.

                  либо добавьте ShowStackInfo=0 в файл WINSPCTR.INI.


                • Параметр PostMortem Dump в диалоговом окне Preferences генерирует файл WINSPCTR.BIN.

                  Утилита DFA воспринимает файл WINSPCTR.BIN и информацию Турбо отладчика (файлы .TDS) и транслирует непосредственные двоичные

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

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

                  Генерация файла WINSPCTR.BIN:

                • Откройте диалоговое окно Preferences.


                • В Report Information выберите PostMortem Dump.


                • Выберите командную кнопку OK.




                  либо добавьте PostMortemDump=1 в файл WINSPCTR.INI.


                • Чтобы не генерировать файл WINSPCTR.BIN, сделайте следующее:

                • Откройте диалоговое окно Preferences.


                • В Report Information, отмените PostMortem Dump


                • Выберите командную кнопку OK.

                  либо добавьте PostMortemDump=0 в файл WINSPCTR.INI.


                • Параметр User Comments в диалоговом окне Preferences позволяет вам ввести информацию о том, что происходило во время возникновения исключительной ситуации. Диалоговое окно выводится

                  немедленно после записи файла регистрации, и в это время можно

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

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

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

                  сделайте следующее:

                • Откройте диалоговое окно Preferences.


                • В Report Information, выберите User Comments.


                • Выберите командную кнопку OK.

                  либо добавьте ShowUserInfo=1 в файл WINSPCTR.INI.


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

                • Откройте диалоговое окно Preferences.


                • В Report Information, отмените User Comments.


                • Выберите командную кнопку OK.

                  либо добавьте ShowUserInfo=0 в файл WINSPCTR.INI.



                • Настройка Turbo Debugger


                  Вы можете конфигурировать параметры вывода Turbo Debugger и
                  программные установки с помощью файлов конфигурации и меню Option
                  отладчика. Параметры, установленные в файлах конфигурации, начинают действовать после загрузке Turbo Debugger. Чтобы изменить
                  параметры после загрузки, используйте команды в меню Options.


                  Назначение интерфейсных объектов


                  Одна из наибольших трудностей программирования в Windows
                  состоит в том, что можно запутаться в управляющих элементах.
                  Иногда вы посылаете окну сообщение, в другой раз вызываете функцию API. При работе с различными видами элементов внешне похожие
                  операции часто различаются. ObjectWindows значительно уменьшает
                  эти трудности, предусматривая объекты, инкапсулирующие интерфейсные элементы. Это избавляет вас от необходимости иметь дело непосредственно с Windows и обеспечивает более единообразный интерфейс для управления интерфейсными элементами.
                  Интерфейсные объекты предусматривают функции-элементы для
                  создания, инициализации, уничтожения и управления соответствующим
                  интерфейсным элементом. Многие детали программирования в Windows
                  берут на себя функции-элементы.
                  Интерфейсные объекты инкапсулируют также данные, необходимые
                  для взаимодействия с интерфейсным элементом. Связь между интерфейсным объектом и интерфейсными элементами аналогична связи между файлом на диске и потоком С++. Объект потока только представляет файл на диске: вы можете манипулировать этим файлом, манипулируя объектом потока.


                  Нехватка памяти при выполнении


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


                  Неклиентные сообщения



                  WM_NCACTIVATE WM_NCMBUTTONDOWN
                  WM_NCCREATE WM_NCMBUTTONUP
                  WM_NCCALCSIZE WM_NCMOUSEMOVE
                  WM_NCDESTROY WM_NCMMOUSEMOVE
                  WM_NCHITTEST WM_NCPAINT
                  WM_NCLBUTTONDBLCLK WM_NCRBUTTONDBLCLK
                  WM_NCLBUTTONDOWN WM_NCRBUTTONDOWN
                  WM_NCMBUTTONDBLCLK WM_NCRBUTTONUP



                  Несколько явных правил для одного целевого файла


                  Для одного целевого файла можно задать несколько явных правил. Множественные явные правила вы можете использовать для создания с помощью TLIB библиотечного модуля. Например, поскольку
                  файлы объектных модулей .OBJ могут строиться по-разному (некоторые с помощью компилятора BCC, а другие, например, с помощью
                  TASM).
                  Здесь используется тот же формат, что и для обычных явных
                  правил, но за целевым файлом указывается два двоеточия. Второе
                  двоеточие сообщает утилите MAKE, что для данного целевого файла
                  ожидаются дополнительные явные правила.
                  В следующем примере MYLIB.LIB состоит из четырех объектных
                  модулей, два из которых являются модулями С++. Первое явное правило компилирует модули С++ и обновляет библиотеку. Второе явное
                  правило ассемблирует файлы ASM и также обновляет библиотеку.
                  mylib.lib:: f1.cpp f2.cpp
                  bcc -c f1.cpp f2.cpp
                  tlib mylib -+f1.obj -+f2.obj
                  mylib.lib:: f3.asm f4.asm
                  tasm /mx f3.asm f4.asm
                  tlib mylib -+f3.obj -+f4.obj


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


                  Важно отметить, что программисты, создавая классы, создают, по
                  сути, абстрактную основу - шаблоны для создания объектов. Из шаблона,
                  когда нужно, создается объект, который и используется. Но, прежде чем
                  вы напишете хотя бы одну строку программы на С++, необходимо хорошо
                  продумать необходимые вам классы и уровни их использования.
                  Не существует "идеальной" иерархии классов для каждой конкретной
                  программы. По мере продвижения разработки может оказаться, что вам
                  потребуется ввести новые классы, которые коренным образом изменят всю
                  иерархию классов. Каждая иерархия классов представляет собой сплав
                  экспериментальных исследований и интуиции, основанной на практике.
                  Так, потребовались сотни лет для создания классификации животных, и
                  тем не менее, вокруг нее, до сих пор, ведутся горячие споры и дела-
                  ются попытки ее изменения.
                  Умелое использование наследования позволяет с небольшими усилиями модифицировать огромные по объему программы. К тому же необходимо
                  помнить, что постоянно растущее число поставщиков предоставляют пользователям объектно-ориентированные библиотеки, совместимые с Турбо и
                  Borland С++. Так что не следует "высасывать их из пальцев".


                  Несколько слов об идее, заложенной в книге.


                  Поскольку каждая новая версия Borland C++ включает самую
                  подробную техническую информацию, трудно написать то, чего в ней
                  нет. Однако, многим программистам вместо чтения толстых толмутов,
                  для начального программирования необходима информация, изложенная
                  в кратком виде, доступная по цене и удобная для чтения дома и на
                  работе. С другой стороны, возникает потребность и в справочной
                  информации, которая была бы доступна в любой момент времени в виде книги. По замыслу, эта книга предназначена для программистов
                  уже владеющих профессионально хотя бы одним языком программирования. Первой ознакомительной главы им будет вполне достаточно для
                  понимания концепции языка С++, а последующие дадут более конкретизированное представление о версии языка Borland C++ 4.0.
                  В 1 главе книги "Азы C++" Вы бегло ознакомитесь с основными
                  возможностями языка С++.
                  Во 2 главе "Наставление пользователю по Borland С++ 4.0" вы
                  узнаете о порядке инсталяции и работе с интегрированными средствами компилятора Borland.
                  Глава 3 "Справочная информация по программированию" говорит сама за себя.
                  "Справочник по программированию для DOS" вы найдете в главе 4.
                  В главе 5 Вы вкратце ознакомитесь с отладчиком Borland C++
                  Turbo Debugger 4.0.
                  Глава 6 включает справочную информацию о функциях в таком
                  виде:
                  abort Экстренно завершает программу
                  DOS UNIX Win16 #include
                  OS/2 Win32 void abort(void);
                  ANSI C++ ANSI C
                  и т.д.

                  Глава 7 расскажет о Objects Windows 2.0.
                  Жуть сколько много информации, но оригинальная документация
                  содержит в 3 раза больше. Так что настраивайтесь посерьезней.
                  Надеюсь книга окажется полезной и нужной Вам, уважаемый Читатель!
                  М.Вахтеров
                  Содержание | Вперед


                  Ниже описан главный фрагмент нашей программы декомпрессии


                  char buff[] = {'a',0xff,3,'b','c'};
                  main()
                  {
                  int c;
                  decompressor dc;
                  decompressor_init(&dc, buff, sizeof(buff));
                  while ((c = decompressor_next(&dc)) != -1) putchar(c);
                  }
                  Отметим, что главная программа не знает как работает сам декомпрессор. Она только передает ему аргументы. Декомпрессор, обрабатывая
                  один символ за раз, может перенаправить его по множеству путей. Так,
                  он мог бы был выведен непосредственно на экран, как мы это делаем
                  здесь, передан подпрограмме поиска строки или анализатору ... в соответствии с концепцией.


                  - O -

                  Объект TWindow


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


                  Объектные элементы данных и функции


                  Эти элементы данных и функции используются для управления
                  контекстом устройства самого объекта. Они являются защищенными
                  (protected) и могут использоваться только в производных от TDC
                  классах.

                  Элемент данных Описание
                  ShouldDelete Указывает, должен ли объект удалять свой
                  описатель контекста устройства при вызове деструктора.
                  Handle Содержит фактический описатель контекста
                  устройства.
                  OrgBrush, OrgPen, OrgFont, OrgPalette Описатели исходных объектов при создании контекста устройства. В 32-разрядных приложениях присутствует также OrgTextBrush.
                  CheckValid Генерирует исключительную ситуацию при
                  недопустимости контекста устройства.
                  Init Устанавливает OrgBrush, OrgPen, OrgFont,
                  и OrgPalette при создании объекта. Если вы создаете производный от TDC класс без
                  явного вызова конструктора TDC, то в своем конструкторе вам следует сначала вызвать конструктор TDC::Init.
                  GetHDC Используя Handle возвращает HDC.
                  GetAttribute Используя Handle возвращает HDC. Если
                  создаете объект с несколькими контекстами устройства, то следует переопределить эту
                  функцию для обеспечения нужного возвращаемого значения. Эта функция использует
                  недокументированную функцию API Windows FastWindowFrame или PatBlt.



                  Объекты диалоговых блоков


                  Объекты диалоговых блоков - это интерфейсные объекты, которые инкапсулируют поведение диалоговых окон. Инициализацию, создание и выполнение всех типов диалоговых блоков поддерживает класс TDialog. Вы можете создать специализированные диалоговые
                  блоки, производные от TDialog. ObjectWindows поддерживает также
                  классы, инкапсулирующие общие диалоговые блоки Windows. Windows
                  предусматривает общие диалоговые блоки, позволяющие пользователям
                  выбирать имена файлов, шрифты, цвета и т.д.


                  Объекты Doc/View


                  ObjectWindows 2.0 предусматривает новый способ манипуляции с
                  данными - модель Doc/View, которая состоит из трех частей:
                • Объектов документов, которые могут содержать несколько
                  различных типов данных и предусматривают методы доступа к
                  этим данным.

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

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



                • Объекты меню


                  Большинство прикладных программ Windows поддерживают меню в
                  составе своего главного окна. Меню обеспечивает пользователю разнообразные возможности выбора, такие как Save, Open и Help. Иногда в приложениях требуются сложные меню. Объекты меню ObjectWindows (TMenu, TSystemMenu, TMenuDescr и TPopupMenu) дают вам простой способ создания меню и манипулирования ими.


                  Объекты приложений


                  ObjectWindows 2.0 инкапсулирует приложения Windows и DLL-модули с помощью классов TApplication и TModule соответственно.
                  Объекты TModule инкапсулируют функции инициализации и закрытия DLL Windows. Объект TModule также содержит параметры hInstance и lpCmdLine, эквивалентные параметрам с тем же именем, передаваемых функции WinMain в приложениях, которые строятся без использования
                  ObjectWindows.
                  Объект TAplication инкапсулирует инициализацию, управление этапом выполнения и функции закрытия приложения Windows. Объект TApplication содержит также значения параметров hPrevInstance и nCmdShow, которые эквивалентны параметрам с тем же именем, передаваемых функции WinMain в приложениях, которые строятся без использования ObjectWindows. Поскольку TApplication основывается на TModule, этот объект обладает всеми его функциональными возможностями. Кроме того, объект TApplication содержит функции для
                  простой загрузки и использования библиотеки специализированных
                  управляющих элементов Borland (Borland Custom Controls Library) и
                  библиотеку трехмерных управляющих элементов Microsoft (Microsoft 3-D Controls Library).
                  Явной функции WinMain в приложения ObjectWindows 2.0 не требуется. Вместо нее используется функция OwlMain, которая позволяет вам указывать параметры int argc и char** argv и возвращать int, как и обычная программа Си и С++ с функцией main.
                  В данном разделе описывается, как использовать объекты TApplication. Если вы не работаете с DLL, самостоятельно создавать объект TModule вам не потребуется.
                  Чтобы использовать объект TApplication, вы должны включить
                  нужный файл заголовка, создать объект и найти объект. TApplication определяется в файле заголовка owl\applicat.h. Так как TApplication является производным от TModule, owl\applicat.h включает файл owl\module.h.
                  Создать объект TApplication можно с помощью одного из двух
                  конструкторов. Наиболее общим конструктором является конструктор,
                  воспринимающий строку имени приложения, задавать которую не обязательно. Вторая версия конструктора позволяет задать ряд параметров, соответствующих параметрам, передаваемым обычно функции WinMain.



                  TApplication содержит обычно несколько функций-элементов и

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

                  данных этого класса.

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

                  #include

                  int

                  OwlMain(int argc, char* argv[])

                  {

                  return TApplication("ObjectWindows!").Run();

                  }

                  Оно создает приложение Windows, основное окно которого будет

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

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


                  Объекты принтера


                  В данной главе описываются классы ObjectWindows, которые
                  позволяют вам выполнить следующие задачи печати:
                • создание объекта принтера;

                • создание объекта распечатки;

                • печать содержимого окна;

                • печать документа;

                • выбор и настройка конфигурации принтера.

                • Эти задачи выполняют классы TPrinter и TPrintout.


                  Объекты проверки допустимости


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


                  Объекты управляющих элементов


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


                  Объекты управляющих элементов


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


                  Объявление ближних или дальних функций


                  В некоторых случаях вам может потребоваться переопределить
                  заданное по умолчание значение типа функции для модели памяти.
                  Например, вы используете модель памяти large, и в программе имеется рекурсивная функция:
                  double power(double x,int exp)
                  {
                  if (exp <= 0)
                  return(1);
                  else
                  return(x * power(x, exp-1));
                  }
                  Каждый раз, когда функция power вызывает сама себя, она
                  должна выполнить дальний вызов, причем используется дополнительное пространства стека и число тактовых циклов. Объявив power как
                  near, можно ускорить выполнение ее благодаря тому, что вызовы
                  этой функции будут ближними:
                  double __near power(double x,int exp)
                  Это гарантирует, что функция power может вызываться только
                  из того кодового сегмента, в котором она компилировалась, и что
                  все обращения к ней будут ближними.
                  Это означает, что при использовании большой модели памяти
                  (medium, large или huge) функцию power можно вызывать только из
                  того модуля, в котором она определена. Прочие модули имеют свои
                  собственные кодовые сегменты и не могут вызывать функции near из
                  других модулей. Более того, ближняя функция до первого к ней обращения должна быть либо определена, либо объявлена, иначе компилятор не знает о необходимости генерировать ближний вызов.
                  И наоборот, объявление функции как дальней означает генерацию дальнего возврата. В малых моделях кодовой памяти дальняя
                  функция должна быть объявлена или определена до первого к ней обращения, что обеспечит дальний вызов.
                  Вернемся к примеру функции power. Хорошо также объявить
                  power как static, поскольку предусматривается вызывать ее только
                  из текущего модуля. Если функция будет объявлена как static, то
                  имя ее не будет доступно ни одной функции вне данного модуля.


                  Объявление дальних объектов


                  Borland С++ позволяет объявлять дальние (far) объекты. Например:
                  int far x = 5;
                  int far z;
                  extern int far y = 4;
                  static long j;
                  Компилятор Borland C++ создает для каждого дальнего объекта
                  отдельный сегмент. Параметры компилятора командной строки -zE,
                  -zF и -zH (которые могут также задаваться директивой #pragma option) влияют на имя, класс и группу дальнего сегмента, соответственно. Изменяя эти значения при помощи указания #pragma option, вы тем самым распространяете новые установки на все объявления дальних объектов. Таким образом, для создания в конкретном сегменте дальнего объекта, можно использовать следующую последовательность:
                  #pragma option -zEmysegment -zHmygroup -zFmyclass
                  int far x;
                  #pragma option -zE* =zH* -zF*
                  Тем самым x будет помещен в сегмент MYSEGMENT с классом
                  'MYCLASS' в группе 'MYGROUP', после чего все дальние объекты будут сброшены в значения, используемые по умолчанию. Отметим, что
                  при использовании этих параметров можно поместить несколько дальних объектов в один сегмент:
                  #pragma option -zEcombined -zFmyclass
                  int far x;
                  double far y;
                  #pragma option -zE* -zF*
                  И x, и y окажутся в сегменте COMBINED 'MYCLASS', без группы.


                  Объявление указателей near, far или huge


                  Только что были рассмотрены случаи, в которых может понадобиться объявить функцию с другой моделью памяти, нежели остальная
                  часть программы. Зачем то же самое может понадобиться для указателей? По тем же причинам, что и для функций: либо для улучшения
                  характеристик быстродействия (объявив __near там, где по умолчанию было бы __far), либо для ссылки за пределы сегмента по умолчанию (объявив __far или __huge там, где по умолчанию бывает
                  __near).
                  Разумеется, при объявлении функций или указателей с другим
                  типом, нежели используемый по умолчанию, потенциально появляется
                  возможность ошибок. Предположим, имеется следующий пример программы с моделью small:
                  void myputs(s)
                  char *s;
                  {
                  int i;
                  for (i = 0; s[i] != 0; i++) putc(s[i]);
                  }
                  main()
                  {
                  char near *mystr;
                  mystr = "Hello, world\n";
                  myputs(mystr);
                  }
                  Эта программа работает удовлетворительно, хотя объявление
                  mystr как __near избыточно, поскольку все указатели, как кода,
                  так и данных, будут ближними (near) по умолчанию.
                  Однако, что произойдет, если перекомпилировать эту программу
                  с моделью памяти compact (либо large или huge)? Указатель mystr в
                  функции main останется ближним (16-битовым). Однако, указатель s
                  в функции myputs теперь будет дальним (far), поскольку по умолчанию теперь используется far. Это означает, что попытка создания
                  дальнего указателя приведет к извлечению из стека двух слов, и
                  полученный таким образом адрес, безусловно, не будет являться адресом функции mystr.
                  Как избежать этой проблемы? Решение состоит в том, чтобы определить myputs в современном стиле Си:
                  void myputs(char *s)
                  {
                  /* тело myputs */
                  }
                  Теперь при компиляции вашей программы Borland C++ знает, что
                  myputs ожидает указатель на char. Поскольку компиляция выполняется с моделью large, то известно, что указатель должен быть __far.
                  Вследствие этого Borland C++ поместит в стек регистр сегмента
                  данных (DS) и 16-битовое значение mystr, образуя тем самым дальний указатель.
                  Если вы собираетесь явно объявлять указатели как far или near, не забывайте использовать прототипы тех функций, которые могут работать с этими указателями.
                  Как быть в обратном случае: когда аргументы myputs объявлены
                  как __far, а компиляция выполняется с моделью памяти small? И в
                  этом случае без прототипа функции у вас возникнут проблемы, поскольку функция main будет помещать в стек и смещение, и адрес
                  сегмента, тогда как myputs будет ожидать приема только одного
                  смещения. При наличии определений функций в прототипах main будет
                  помещать в стек только смещение.


                  Объявление виртуальных функций элементов


                  Фактически, мы уже видели как это делается на примере класса
                  shape, однако, рассмотрим еще раз этот процесс:
                  class shape {
                  public:
                  double xo, yo;
                  shape(double x, double y); // Конструктор создания shape (фигуры)
                  virtual double area(void); // Функция вычисляющая поверхность
                  virtual draw(void); // Функция рисования shape
                  }; ^
                  Ключевое слово virtual
                  Виртуальные функции объявляются с использованием ключевого слова
                  virtual. Отметим, что virtual используется только в базовом классе, а
                  не в классах - потомках.


                  Область дампа


                  В этой области выводится в шестнадцатиричном виде содержимое
                  области памяти. В левой части каждой строки показан адрес (в виде
                  "сегмент:смещение" или 32-разрядного адреса). Порядок регистров в
                  области Dump имеет вид: DS, ES, SS, CS. Справа от адреса выводятся значения элементов данных в выбранном формате.
                  SpeedMenu области Dump содержит команды для перемещения по
                  области, модификации содержимого, перемещению по указателям, задания формата вывода и работы с блоками памяти.

                  Goto
                  Выводит диалоговое окно Enter Address to Position To, где вы
                  можете ввести выражение, при вычислении которого получается адрес
                  памяти, доступный программе.
                  Search
                  Ищет строку символов или список байт, начиная с адреса, указанного курсором.
                  Next
                  Ищет следующий экземпляр элемента, заданного в команде поиска.
                  Change
                  Позволяет модифицировать байты по текущему месту расположения курсора. При выводе в формате ASCII или шестнадцатиричном виде запрашивается список байт, в противном случае - элемент текущего формата вывода.
                  Follow
                  Открывает меню с командами, позволяющими проверить данные по
                  адресам указателей near и far. TD32 содержит команды для 32-разрядной адресации.

                  Команда Near Code этого меню интерпретирует
                  слово под курсором в области данных, как смещение в текущем сегменте кода (как это задается регистром CS). Область кода становится текущей областью и позиционируется на данный адрес.
                  Команда Far Code интерпретирует двойное слово под курсором в области данных, как адрес дальнего типа (сегмент и смещение). Область кода
                  становится текущей и позиционируется на данный адрес.

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

                  Команда Segment:Offset to Data позволяет следовать по цепочке указателей дальнего типа размером в двойное слово (где используется сегмент
                  и смещение). Область данных устанавливается в соответствии со
                  смещением, заданным двойным словом в памяти по текущей позиции
                  курсора.

                  Команда Base Segment:0 to Data команда интерпретирует
                  слово под курсором, как адрес сегмента, и позиционирует область
                  данных на начало сегмента.
                  Previous
                  Восстанавливает адрес области данных в адрес, который был до
                  последней команды, явно изменившей значение текущего адреса. Использование клавиш стрелок и клавиш перемещения курсора не приводит к запоминанию позиции. Отладчик поддерживает стек из пяти
                  последних адресов, поэтому вы можете вернуться назад после многократного (< 5) использования команд локального меню Follow, или команды Goto.
                  Display As
                  Позволяет выбирать формат вывода в области данных. Вы можете
                  выбирать один из форматов данных, использующихся в языке Си, Pascal или ассемблер. Эти форматы можно выбрать из меню. Команда Byte устанавливает область данных в режим вывода шестнадцатиричных
                  байтовых данных. Word устанавливает область данных в режим вывода
                  шестнадцатиричных слов. Long задает режим вывода длинных шестнадцатиричных целых чисел. Comp устанавливает режим вывода 8-байтовых целых чисел. Выводится десятичное значение числа. Float устанавливает режим вывода 6-байтовых чисел с плавающей точкой. Выводится значение числа с плавающей точкой в научном представлении.
                  Double выводит 8-байтовые числа с плавающей точкой. Выводится
                  значение числа в научном представлении. Extended устанавливает
                  режим вывода 10-байтовых чисел с плавающей точкой в научном
                  представлении.
                  Block
                  Позволяет работать с блоками памяти. Вы можете перемещать,
                  очищать, присваивать значения блокам памяти, а также записывать и
                  считывать блоки памяти из файлов на диске. По данной команде на
                  экран выводится всплывающее меню. Команда Clear этого меню устанавливает непрерывный блок в памяти в значение 0. Адрес блока и
                  число байт, которые требуется очистить, запрашиваются в выводимой
                  подсказке. Move копирует блок памяти из одного адреса в другой.
                  Адреса исходного и целевого блока, а также число копируемых байт,
                  будут запрашиваться в подсказке. Set присваивает непрерывному
                  блоку в памяти конкретное байтовое значение. Адрес блока, число
                  байт, которым требуется присвоить значение, а также само значение
                  запрашиваются в подсказке. Read считывает все содержимое или
                  часть файла в блок памяти. Вам выводится подсказка для ввода имени считываемого файла, затем адреса, куда требуется считать информацию, и числа считываемых байт. Write записывает блок памяти
                  в файл. Выводится подсказка для ввода имени файла, куда требуется
                  записать данные, затем блока памяти, который нужно записать, и
                  число считываемых байт.



                  Область дерева окон


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

                • Просмотреть статус окон, включая скрытые окна.

                • Увидеть, какие окна получают сообщения.

                • Выбрать окна для трассировки сообщений.



                • Область детализации


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


                  Область флагов


                  В области флагов показано значение каждого флага ЦП. Список
                  различных флагов и то, как они выводятся в области флагов, показан в следующей таблице:
                  Буква в области Название флага
                  c Флаг переноса
                  z Флаг нуля
                  s Флаг знака
                  o Флаг переполнения
                  p Флаг четности
                  a Флаг дополнитель-
                  ного переноса
                  i Флаг разрешения
                  прерывания
                  d флаг направления
                  SpeedMenu этой области содержит содержит команду Toggle, переключающую значение подсвеченного флага между 0 и 1.


                  Область иерархии


                  Здесь выводятся классы загруженного модуля и их иерархии.
                  Базовые классы размещаются по левому полю области. Классы, наследующие из нескольких базовых классов, отмечаются звездочками
                  (**), а все другие классы, являющиеся частью той же группы множественного наследования - одной.
                  Локальное меню этой области содержит две команды. Команда
                  Inspect (или клавиша Enter) открывает для подсвеченного класса
                  окно Class Inspector. При отладке программ С++ с множественным
                  наследованием здесь доступна также команда Parents, включающая и
                  выключающая вывод области порождающих классов окна Hierarchy.


                  Область классов


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


                  Область классов


                  Здесь перечисляются классы, найденные ClassExpert в текущем
                  приложении. Информация в областях событий и редактирования зависит от выбранных здесь классов. Чтобы перейти к конструктору
                  класса в исходном коде, вы можете дважды щелкнуть на классе
                  "мышью". При этом выводится область редактирования. Используя
                  оперативное меню, вы можете добавить классы, связать классы документов с классами отображаемых элементов, получить информацию о
                  классе, перейти к исходному коду класса или файла заголовка и запустить Resource Workshop.


                  Область кода


                  В левой части области кода выводятся адреса дизассемблированных инструкций. Для 16-разрядного кода они имеют вид "сегмент:смещение", а для 32-разрядного это 32-разрядные адреса. Стрелка (>) справа от адреса памяти указывает текущий адрес программы (следующую выполняемую инструкцию). Справа выводится шестнадцатиричный машинный код с соответствующей дизассемблированной
                  инструкцией. Глобальные идентификаторы выводятся в виде имени,
                  статические - в виде имени модуля с символов # и именем идентификатора, а номера строк представлены как имя модуля, # и номер
                  строки. Клавиша F2 позволяет устанавливать/отменять точки останова.
                  Меню SpeedMenu области кода содержит команды, позволяющие
                  перемещаться по ней и ассемблировать вводимые инструкции. TDW
                  имеет дополнительную команду ввода-вывода, а TD32 - команды Threads и OS Exceptions.

                  Goto
                  Вам выводит окно Enter Address to Position To для ввода нового адреса, на который вы хотите перейти. Вы можете ввести адрес, выходящий за пределы программы, что позволяет проверить базовую систему ввода-вывода (BIOS), внутренние области DOS и Windows.
                  Origin
                  Позиционирует вас на текущий адрес программы. Используется
                  для перемещения.
                  Follow
                  Позиционирует область кода по целевому адресу текущей подсвеченной инструкции. Используется в сочетании с инструкциями передачи управления (CALL, JMP, INT) и условного перехода (JZ, JNE, LOOP и др.).
                  Caller
                  Позиционирует вас на инструкцию, вызвавшую текущее прерывание или подпрограмму. Если текущая подпрограмма прерывания занесла данные в стек, то Turbo Debugger может не иметь возможности
                  определить, откуда она вызвана.
                  Previous
                  Восстанавливает позицию области кода в соответствии с адресом, который был текущим перед последней командой, явно изменившей его значение. Использование клавиш перемещения на команду не влияет.
                  Search
                  Позволяет вам вводить инструкцию или список байт, которые вы
                  хотите найти. Будьте внимательны при поиске инструкций. Следует
                  выполнять поиск только тех инструкций, которые не изменяют байт,
                  в которые они ассемблируются, в зависимости от того, где в памяти
                  они ассемблируются. Например, поиск следующих инструкций проблемы
                  не представляет:
                  PUSH DX
                  POP [DI+4]
                  ADD AX,100
                  <

                  а попытка поиска следующих инструкций может привести к непредсказуемым результатам: JE 123 CALL MYFUNC LOOP $-10 Вместо инструкции можно вводить также список байт.
                  View Source Для вывода исходного кода, соответствующего текущей дизассемблированной инструкции открывает окно Module. Если соответствующего исходного кода нет (например, вы находитесь в коде Windows, или отсутствует отладочная информация), вы просто остаетесь в области кода.
                  Mixed Позволяет выбрать один из трех способов вывода на экран дизассемблированных инструкций и исходного кода:
                  No (Нет) Исходный код не выводится, выводятся только дизассемблрованные инструкции.
                  Yes (Да) Перед первой дизассемблированной инструкцией, со ответствующей данной строке, выводится строка исходного кода. Область устанавливается в данный режим, если исходный модуль написан на языке высокого уровня.
                  Both (Оба) Для тех строк, которым соответствует исходный код, дизассемблированные строки заменяются строками исходного текста. В противном случае выводятся дизассемблированные инструкции. Используйте этот режим, когда вы отлаживаете модуль на ассемблере и хотите видеть строку исходного текста, а не соответствующую дизассемблированную инструкцию. Область устанавливается в данный режим вывода, если текущим модулем является исходный модуль ассемблера.
                  Thread Позволяет выбрать нить, выполнение которой вы хотите отладить. Открывает диалоговое окно Pick a Thread, из которого вы можете выбрать конкретную нить программы.
                  OS Exceptions Позволяет выбрать исключительные ситуации операционной системы, которые вы хотите обрабатывать. Подробнее об этом рассказывается ниже.
                  New EIP Изменяет текущий адрес программы, подсвеченный в области кода (в TDW команда называется New CS:IP). При возобновлении выполнения программы оно начинается по этому адресу. Эта команда полезна, когда нужно пропустить некоторые машинные инструкции, но использовать ее нужно аккуратно, так как она может вызвать нестабильность системы.
                  Assemble



                  Ассемблирует инструкцию, заменяя инструкцию по текущему адресу. Используется для внесения в программу минимальных изменений. Команда выводит диалоговое окно Enter Instruction to Assemble, где вы можете ввести выражение для ассемблирования. Если вы начнете набор в области кода, данная команда вызывается автоматически.
                  I/O Эта команда TDW считывает или записывает значения в пространство адресов ввода-вывода ЦП и позволяет вам проверить содержимое регистров ввода-вывода и записать в них значения. При этом выводится меню, показанное ниже:
                  In byte Ввести байт из порта
                  Out byte Вывести байт в порт
                  Read byte Прочитать байт из порта
                  Write byte Записать байт в порт Учтите, что эти команды могут нарушить нормальную работу устройств.

                  Область нитей


                  В этой области перечисляются все активные нити программы,
                  идентифицируемые по номеру нити (назначаемому Windows NT) и имени. Turbo Debugger генерирует имя нити, когда ваша программа создает нить. Первая создаваемая нить называется Thread 1, затем Thread 2 и т.д. Это имя можно изменить.
                  Окно Thread содержит единое SpeedMenu, которое активизируется из всех областей и содержит перечисленные ниже команды.

                  Options
                  Открывает диалоговое окно Thread Options, позволяющее задать
                  параметры отдельных нитей. Кнопка Freeze этого окна позволяет
                  "замораживать" и "размораживать" индивидуальные нити. Включение
                  этой кнопки означает, что нить выполняться не будет. Для выполнения программы необходима хотя бы одна активная нить. Кнопка Notify or Tremination позволяет задать, должен ли отладчик уведомлять
                  вас о завершении текущей (подсвеченной) нити (он генерирует сообщение и активизирует окно Module и CPU с текущим адресом программы). Чтобы задать уведомление для всех нитей, используйте команду
                  меню All Threads. Поле ввода Thread Name позволяет изменить имя
                  текущей нити.
                  Make Current
                  Команда Make Current позволяет сменить нить, обрабатываемую
                  отладчиком. Подсветите в области Threads List нить, которую вы
                  хотите проверить, и нажмите Ctrl+M (или выберите Make Current).
                  Inspect
                  Открывает окно Module или CPU, которое показывает для подсвеченной нити текущую точку выполнения. Этой команде эквивалентна
                  клавиша Enter.
                  All Threads
                  Открывает меню, команды которого относятся ко всем нитям
                  программы. Это команды Thaw, Freeze, Enable Exit Notification и
                  Disable Exit Notification.
                  Step
                  Позволяет переключаться между All и Single. При выборе All
                  клавиши F7 и F8 приводят к выполнению всех нитей программы, а
                  Single позволяет выполнять только одну нить.



                  Область порождающих классов


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



                  Эта область выводится только для программ с множественным
                  наследованием и при ее разрешении. Для классов, полученных путем
                  множественного наследования, она выводит все производные классы.
                  SpeedMenu этой области содержит единственную команду Inspect. При
                  ее выборе (или нажатии Enter) для подсвеченного класса выводится
                  окно Class Inspector.


                  Область редактирования


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


                  Область регистров и флагов


                  В области регистров (верхняя область справа от области кода)
                  выводится содержимое регистров процессора. Вид этой области зависит от отладчика (TD32 или TDW). По умолчанию TDW выводит 13
                  16-разрядных регистров, а TD32 - всегда выводит 15 регистров процессора 80386 и старше.
                  С помощью команд SpeedMenu области регистров вы можете модифицировать или сбрасывать содержимое регистров. Команда Increment
                  добавляет 1 к текущему подсвеченному регистру, Decrement вычитает
                  1 из содержимого текущего подсвеченного регистр, а Change позволяет изменить содержимое регистра, выводя диалоговое окно Enter
                  New Value для ввода нового значения. Последняя команда вызывается
                  автоматически, если вы начинаете набор в области регистров.
                  Команда Registers 32-bit, доступная только в TDW, переключает вывод регистров с 16-битовых на 32-битовые (сегментные регистры остаются 16-битовыми).


                  Область селектора


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

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

                • длина сегмента памяти, на которую ссылается селектор (в
                  байтах).

                • Если селектор ссылается на сегмент данных, то имеется дополнительная информация по полномочиям доступа (Read/Write - Чтение/
                  Запись или Read only - только чтение) и направление расширения
                  сегмента в памяти (Up - вверх или Down - вниз).
                  Локальное меню области можно использовать для перехода к новому селектору или просмотра содержимого подсвеченного. В зависимости от характера данных, содержимое выводится в области кода или области дампа.
                  Команда Selector выводит подсказку для ввода селектора, который нужно вывести в области. Для ввода селектора вы можете использовать полный синтаксис выражений. Если вы вводите числовое значение, то TDW подразумевает, что оно десятичное (если вы не
                  используете синтаксис текущего языка для указания того, что значение является шестнадцатиричным).
                  Другим методом ввода значения селектора является вывод окна
                  CPU и проверка содержимого сегментных регистров. Если регистр содержит интересующий вас селектор, то вы можете ввести имя регистра с предшествующим символом подчеркивания (_). Например, вы можете задать имя сегментного регистра данных, как _DS.
                  Команда Examine выводит содержимое области памяти, на которую ссылается текущий селектор, и переключается в область, где
                  выводится содержимое. Если селектор указывает на сегмент кода, то
                  содержимое выводится в области кода. Если содержимое представляет
                  собой данные, то оно выводится в области данных.


                  Область событий


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


                  Область списка классов


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


                  Область стека


                  Эта область показывает шестнадцатиричное содержимое программного стека. Текущий указатель стека отмечается указателем >.
                  SpeedMenu этой области содержит команды Goto, Origin, Follow,
                  Previous и Change, аналогичные описанным выше командам.


                  Обработка данных WinSpector


                  Утилита DFA обрабатывает информацию Турбо отладчика,
                  собранную WinSpector во время возникновения исключительной ситуации. Если во время исключительной ситуации информация отчета установлена в PostMortem Dump, то WinSpector записывает файл
                  WINSPCTR.BIN. После этого для трансляции файла WINSPCTR.BIN в полезный формат можно использовать утилиту DFA.


                  Обработка ошибок в графическом режиме


                  Ниже приведены функции обработки ошибок в графическом режиме:

                  Функция Описание
                  grapherrormsg Возвращает строку с сообщением об ошибке
                  для заданного кода ошибки.
                  graphresult Возвращает код ошибки для последней графической операции, в которой встретилась
                  ошибка.

                  Если ошибка произошла при вызове графической библиотечной
                  функции (например, не найден шрифт, запрошенный функцией settextstyle), устанавливается внутренний код ошибки. Доступ к коду
                  ошибки для последней графической операции, сообщившей об ошибке,
                  выполняется при помощи функции graphresult. Вызов grapherrormsg(graphresult()) возвращает строку сообщения об ошибке из
                  приведенной выше таблицы.
                  Код возврата ошибки накапливается, изменяясь только когда
                  графическая функция сообщает об ошибке. Код возврата ошибки сбрасывается в 0 только при успешном выполнении initgraph, либо при
                  вызове функции graphresult. Таким образом, если вы хотите знать,
                  какая графическая функция возвратила ошибку, нужно хранить значение graphresult во временной переменной и затем проверять ее.

                  Код ошибки Константа графической ошибки Соответствующая строка с сообщением об ошибке
                  0 grOk No error (нет ошибки)
                  -1 grNoInitGraph (BGI) graphics not installed
                  (use initgraph) (графика не инсталлирована используйте функцию initgraph)
                  -2 grNotDetected Graphics hardware not detecte
                  (графическое аппаратное обеспечение не обнаружено)
                  -3 grFileNotFound Device driver file not found
                  (не найден файл драйвера устройства)
                  -4 grInvalidDriver Invalid device driver file
                  (неверный файл драйвера устройства)
                  -5 grNoLoadMem Not enough memory to load driver
                  (не хватает памяти для загрузки
                  драйвера)
                  -6 grNoScanMem Out of memory in scan fill
                  (кончилась память при сканирующем заполнении)
                  -7 grNofloodMem Out of memory in flood fill
                  (кончилась память при лавинном
                  заполнении)
                  -8 grFontNotFound Font file not found (файл шрифта не найден)
                  -9 grNoFontMem Not enough memory to load font
                  (не хватает памяти для загрузки
                  шрифта)
                  -10 grInvalidMode Invalid graphics mode for
                  selеcted driver (недопустимый графический режим
                  для выбранного драйвера)
                  -11 grError Graphics error (графическая ошибка)
                  -12 grIOerror Graphics I/O error
                  (графическая ошибка ввода-вывода)
                  -13 grInvalidFont Invalid font file
                  (неверный файл шрифта)
                  -14 grInvalidFontNum Invalid font number (неверный номер шрифта)
                  -15 grInvalidDeviceNum Invalid device number (неверный номер устройства)
                  -18 grInvalidVersion Invalid version of file (неправильная версия файла)



                  Обработка событий Doc/View


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


                  Обработка событий TDocManager


                  Если при построении объекта TDocManager вы задаете параметр
                  mdMenu, администратор документа обрабатывает определенные события
                  от имени документов. Это делается путем обработки стандартных команд меню с помощью таблицы реакции. Команды меню администратора
                  документа доступны даже при отсутствии открытого документа и независимо от явного добавления в приложение ресурсов. Администратор документов может обрабатывать следующие события:

                  Сообщение Значение
                  CM_FILECLOSE Закрытие файла.
                  CM_FILENEW Создание нового файла.
                  CM_FILEOPEN Открытие файла.
                  CM_FILEREVERT Отмена изменений файла.
                  CM_FILESAVE Сохранение файла.
                  CM_FILESAVEAS Сохранение файла под новым именем.
                  CM_VIEWCREATE Создание отображаемого элемента.

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


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


                  Файл заголовка docview.h предусматривает ряд макрокоманд для
                  таблицы реакции, а также функции обработки и проверки типов. С
                  помощью NOTIFY_SIG и VN_DEFINE вы можете также определить собственные функции и события.
                  Имеется ряд предопределенных событий Doc/View. Каждое такое
                  событие имеет соответствующую макрокоманду таблицы реакции и сигнатуру функции-обработчика. Модель Dec/View не предусматривает
                  версий этих функций. Вы должны определить эти функции в своем
                  производном классе и задать соответствующие действия.

                  Макрокоманда Событие
                  EV_VN_VIEWOPENED Построение нового отображаемого элемента.
                  EV_VN_VIEWCLOSED Уничтожение нового отображаемого элемента.
                  EV_VN_DOCOPENED Открытие нового документа.
                  EV_VN_DOCCLOSED Закрытие нового документа.
                  EV_VN_COMMIT Изменения, внесенные в данные в отображаемом элементе должны быть зафиксированы в документе.
                  EV_VN_REVERT Изменения, внесенные в данные в отображаемом элементе должны быть отменены.
                  EV_VN_ISDIRTY Если изменения еще не зафиксированы в документе, следует возвратить True, иначе False.
                  EV_VN_ISWINDOWS Если параметр HWND совпадает с HWND окна отображаемого элемента, следует возвратить True.

                  Для генерации собственных событий отображаемых элементов и
                  определения соответствующих макрокоманд и функций обработки событий таблицы реакции вы можете использовать макрокоманды VN_DEFINE
                  и NOTIFY_SIG.
                  Во-первых, нужно определить имя события, которое вы хотите
                  обрабатывать. По соглашению оно должно начинаться с vn. Для задания сигнатуры функции обработки события используйте макрокоманду
                  NOTIFY_SIG, а для определения самой макрокоманды - VN_DEFINE. Эта
                  макрокоманда имеет три параметра: имя события, имя функции обработки события и размер параметра для функции обработки события.


                  Обработка событий в приложении


                  Объект приложения управляет обычно только несколькими событиями, указывающими на создание или уничтожение документа или
                  отображаемого элемента. Событие dnCreate генерируется при создании отображаемого элемента или документа, а dnClose - при их закрытии. Чтобы задать для этих событий таблицу реакции, добавьте в
                  нее макрокоманды EV_OWLDOCUMENT и EV_OWLVIEW.


                  Обработка событий


                  В данной главе описывается, как использовать таблицы реакции
                  ObjectWindows 2.0. Таблицы реакции - это методы, используемые для
                  обработки событий в приложении ObjectWindows. Для использования
                  таблицы реакции ObjectWindows нужно выполнить следующие шаги:
                • Описать таблицу реакции.

                • Определить таблицу реакции.

                • Определить записи таблицы реакции.

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

                • Для использования описываемых в данном разделе макрокоманд
                  вы должны включить файл заголовка owl\eventhan.h. Этот файл уже
                  включается файлами owl\module.h и owl\window.h, поэтому явно данный файл обычно включать не требуется.
                  Таблицы реакции ObjectWindows 2.0 - это значительное усовершенствование по сравнению с методами обработки событий Windows и
                  сообщениями, включая оператор switch (как в стандартных программах Си для Windows) и схемы, используемые в других прикладных
                  средах. Таблицы реакции ObjectWindows 2.0 предусматривают:
                • Автоматическую обработку сообщений для предопределенных
                  командных сообщений, что устраняет необходимость вручную
                  обрабатывать значения WPARAM и LPARAM.

                • Проверку ошибок и типов на этапе компиляции, при которой
                  проверяются типы параметров и типы результата функции обработки событий.

                • Возможность обрабатывать в одной функции несколько сообщений.

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

                • Переносимость на разные продукты без специальных расширений компилятора.

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



                • Обработка сообщений приложения


                  После инициализации приложения начинает выполняться цикл опроса сообщений объекта - MessageLoop. MessageLoop отвечает за обработку поступающих от Windows сообщений. Изменить обработку сообщений в ObjectWindows можно двумя способами: задать дополнительную обработку сообщений, переопределив функции обработки, и
                  выполняя обработку во время простоя.
                  TApplication имеет функции-элементы MessageLoop, IdleAction,
                  PreProcessMenu и ProcessAppMsg, обеспечивающие для любых приложений ObjectWindows функциональные возможности обработки сообщений.
                  Обработка во время простоя реализуется с помощью переопределения IdleAction. Такая обработка выполняется, когда пользователь
                  не выполняет никаких действий. Такая обработка должна быть краткосрочной. Длительные операции следует разбивать на несколько процессов.
                  Параметр функции IdleAction idleCount задает, сколько раз
                  между сообщениями должна вызываться IdleAction. idleCount можно
                  использовать для выбора между низкоприоритетной и высокоприоритетной обработкой во время простоя. Если idleCount достигает высокого значения, то ввода от пользователя не было уже длительный период, и надежнее выполнить низкоприоритетную обработку.
                  В дополнение к своей собственной обработке всегда следует
                  вызывать функцию IdleAction базового класса. Если вы пишете приложения для Windows NT, то можете для фоновой обработки использовать несколько нитей.


                  Обработка сообщений управляющих элементов VBX


                  Обрабатывать сообщения управляющих элементов VBX нужно через
                  родительский объект управляющего элемента. Чтобы родительский
                  объект мог обрабатывать эти сообщения, он должен быть производным
                  от класса TVbxEventHandler. Для этого вы можете смешать класс интерфейсного объекта, который хотите использовать для включения
                  VBX (например, TDialog, TFrameWindow или классы, производные от
                  интерфейсных классов ObjectWindows) с классом TVbxEventHandler.


                  Обратное выполнение


                  Каждую выполненную инструкцию Turbo Debugger регистрирует в
                  протоколе выполнения (при трассировки программы). С помощью окна
                  протокола выполнения Execution History вы можете просмотреть выполненные инструкции и вернуться в нужную точку программы. Команда обратного выполнения Reverse Execute выполняется по клавишам
                  Alt+F4. Turbo Debugger может регистрировать около 400 инструкций.
                  Здесь действуют следующие правила:
                • Регистрируются только те инструкции, которые выполнены с
                  помощью команды Trace Into (F7) или Instruction Trace
                  (Alt+F7). Однако, если не выполняются отдельные инструкции
                  (перечисленные ниже), то регистрируются также команды Step
                  Over.

                • Инструкция INT приводит к стиранию протокола выполнения.
                  Если вы не трассируете прерывание с помощью Alt+F7, то об ратное выполнение этой инструкции невозможно.

                • После выполнения команды Run или выполнения после прерыва ния протокол удаляется. (Регистрация начинается после во зобновления трассировки.)

                • При выполнении вызова функции без ее трассировки обратное
                  выполнение за инструкцию после возврата невозможно.

                • Обратное выполнение инструкций работы с портами невозможно
                  (отменить чтение и запись нельзя).

                • Невозможно также обратное выполнение вызываемого програм мой кода Windows (если только вы не находитесь в окне CPU
                  и не отлаживаете DLL).

                • В окне CPU обратное выполнение доступно всегда, а для обратного выполнения исходного кода нужно установить Full History в On
                  (в меню Execution History). Меню Execution History содержит также
                  команды Inspect и Reverse Execute. Команда Inspect переводит вас
                  к команде, подсвеченной в области Instruction. Если это строка
                  исходного кода, она выводится в окне Module. При отсутствии исходного кода открывается окно CPU и подсвечивается инструкция в
                  области Code. Действие инструкций IN, INSB, INSW, OUT, OUTSB,
                  OUTSW отменить невозможно, поэтому их обратное выполнение может
                  давать побочные эффекты.
                  TD.EXE имеет в окне Execution History дополнительную область, позволяющую вам вернуться в нужную точку программы при
                  случайной потере протокола. Область Keystroke Recording в нижней
                  части этого окна активизируется при разрешении регистрации нажатий клавиш (это можно сделать с помощью TDINST или параметра -k
                  командной строки).
                  Область Keystroke Recording показывает причину передачи управления отладчику (например, точка останова) и текущий адрес
                  программы с соответствующей строкой исходного кода или машинной
                  инструкцией. Turbo Debugger регистрирует все нажимаемые вами клавиши и записывает их в файл XXXX.TDK, где XXXX - это имя отлаживаемой программы. Локальное меню этой области содержит команды
                  Inspect и Keystroke Restore. По команде Inspect отладчик активизирует окно Model или CPU, в котором курсор позиционирован на ту
                  строку, где нажата клавиша. Команда Keystroke Restore перезагружает программу и выполняет ее до строки, подсвеченной в области
                  Keystroke Recording.


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


                  В данном разделе описываются некоторые наиболее общие ошибки
                  и предупреждения, обнаруживаемые компилятором.
                  Call to function имя_функции with no prototype

                  (Вызов функции без прототипа)
                  Данное предупреждение означает, что функция используется перед ее прототипизацией или описанием. Это предупреждение может
                  выводиться также, когда функция, не воспринимающая аргументов, не
                  описана прототипом с void.
                  Conversion may lose signifigant digits

                  (Преобразование может привести к потере значимых цифр)
                  Это предупреждение является результатом преобразования компилятором значения, например, LONG в int. Оно сообщает, что вы
                  можете потерять информацию. Если вы уверены, что таких проблем не
                  возникает, то с помощью соответствующего явного приведения типа к
                  меньшему размеру это предупреждение можно подавить.
                  Function should return a value

                  (Функция должна возвращать значение)
                  Функция, описанная как возвращающая значение, значения не
                  возвращает. В старом коде Си, отличном от стандарта ANSI, такое
                  предупреждение является общим для функций, не возвращающих значения и не имеющих типа возврата:
                  foo(i)
                  int i;
                  {
                  ...
                  }
                  Описанные таким образом функции интерпретируются компилятором, как возвращающие int. Если функция ничего не возвращает, ее
                  следует описать так:
                  void foo(int i)
                  {
                  ...
                  }
                  Lvalue required


                  (Требуется именующее значение)
                  Type mismatch in parameter


                  (Несовпадение типа в параметре)
                  Эти ошибки указывают, что вы пытаетесь передать тип, отличный от указателя, там, где требуется указатель. При определении
                  STRICT описателей, а также LRESULT, WPARAM и LPARAM внутренним
                  образом описываются как указатели, поэтому попытка передачи в качестве указателя int, WORD или LONG дает в результате подобные
                  ошибки.
                  Эти ошибки следует исправлять путем описания отличных от
                  указателя значения, используемых при передаче параметров или
                  присваивании. В случае специальных констант, таких как (HWND)1,
                  вам следует пользоваться новыми макрокомандами (такими как
                  HWND_BOTTOM). Ошибки несоответствия типов следует подавлять в



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

                  некорректный код).

                  Non-portable conversion

                  (Не переносимое преобразование)

                  Вы приводите указатель или описатель ближнего типа к 32-битовому значению, такому как LRESULT, LPARAM, LONG или DWORD. Это

                  предупреждение практически всегда указывает на ошибку, так как

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

                  Чтобы избежать этого предупреждения и обеспечить размещение

                  в старших 16 битах 0, нужно привести тип описателя к UINT:

                  HWND hwnd;

                  LRESULT result = (LRESULT)(UINT)hwnd;

                  В тех случаях, когда вы хотите, чтобы 32-битовое значение

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

                  char near* pch;

                  LPARAM lparam = (LPARAM)(LPSTR)pch;

                  Not an allowed type



                  (Не является допустимым типом)

                  Это сообщение об ошибке обычно выводится в результате попытки разыменования указателя void. Обычно это бывает при непосредственном использовании значения-указателя, возвращаемого GlobalLock или LocalLock. Чтобы решить данную проблему, перед использованием указателя присвойте возвращаемое значение переменной соответствующего типа (используя при необходимости приведение типа).

                  Size of the type is unknown or zero



                  (Размер типа неизвестен или равен нулю)

                  Вы пытаетесь с помощью + или += изменить значение пустого

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

                  отдельные функции Windows (например, GlobalLock или LocalLock)

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

                  значение void* описанной соответствующим образом переменной (приведя при необходимости тип):

                  BYTE FAR* lpb = (BYTE FAR*)GlobalLock(h);

                  lpb += sizeof(DWORD);

                  Type mismatch in redeclaration of имя_параметра



                  (Несовпадение типа при повторном описании параметра)

                  В вашей программе имеется несогласованное описание переменной, параметра или функции. Используя API Win32, вы можете внести

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

                  переносимой.


                  Обзор и важные концепции


                  Библиотека классов container, поставляемая в пакете Турбо и
                  Borland C++, содержит классы для часто используемых структур данных
                  (списки, стеки, очереди и т.д.). Классы организованы в соответствии с
                  иерархией классов, что позволяет иметь высокую степень модульности
                  благодаря свойствам наследования и полиморфизма. Вы можете использовать эти классы в том виде, как они есть, либо расширять и дополнять
                  их, получая объектно-ориентированные программные продукты, подходящие
                  для ваших задач.
                  В вершине иерархии классов conteiner находится абстрактный класс
                  Object. Он почти не содержит данных-элементов, а его функции элементы
                  являются "чистыми" виртуальными функциями (pure virtual - т.е. функциями, никогда не вызываемыми непосредственно, и служащими для задания местоположения функций с тем же именем, определяемых в производных классах). Неабстрактные классы, предназначенные для реализации
                  объектов, называются реализуемыми классами (абстрактные классы заключены в кавычки.)
                  Чтобы лучше освоить понятие классов, посмотрите их исходные
                  тексты в каталоге CLASSLIB дистрибутивной поставки компилятора.
                  "Object" Error
                  "Sortable" String
                  "BaseDate" Date
                  "BaseDate" Time
                  Association
                  "Container" "Collection" "AbstractArray" Array
                  SortedArray
                  HashTable Bad Set Dictionary
                  List
                  DoubleList
                  Stack
                  Queue
                  Deque
                  "ContainerIterator" HashTableIterator
                  ListIterator
                  DoubleListIterator
                  ArrayIterator
                  DoubleListElement
                  ListElement
                  Рис. Иерархия классов в CLASSLIB


                  Окна Class Inspector


                  Эти окна позволяют вам вывести детальную информацию по классам С++. Чтобы открыть это окно, выведите окно Hierarchy, подсветите класс и нажмите Enter.
                  [Ч] Class LinearGauge 4 [^][v]
                  int Range::Low ^
                  int Range::High
                  int Screen::MaxX v
                  < >
                  class Range *Range::ctr()
                  int Range::GetValue()
                  int Range::GetLow()
                  int Range::GetHigh()
                  Данное окно содержит две области. В верхней области выводится информация о элементах данных и их типах, в нижней - о функциях-элементах и возвращаемых типах. Однако это окно не отражает данных конкретного экземпляра. Если вы хотите проверить аргументы
                  функцию-элемента, подсветите ее и нажмите Enter. Откроется окно
                  Function Inspector.
                  Если подсвеченный элемент данных представляет собой указатель на класс, то нажатие Enter открывает другое окно Class Inspector. Таким образом вы можете проверять сложные вложенные классы. Как и в случае других окон Inspector клавиша Esc закрывает
                  текущее окно Inspector, а Alt+F3 закрывает их все.
                  SpeedMenu каждой области данного окна содержит три команды,
                  которые в каждой области ведут себя несколько по разному.

                  Inspect
                  В области элементов данных открывает для подсвеченного элемента данных окно Inspector. В области функций-элементов команда
                  открывает для подсвеченной функции окно Function Inspector. Для
                  вывода исходного кода функции позиционируйте курсор на адрес
                  функции-элемента и нажмите Enter. Откроется окно Module.
                  Hierarchy
                  Во всех областях открывает окно Hierarchy для текущего подсвеченного класса.
                  Show Inherited
                  В каждой области переключается между Yes (по умолчанию) и
                  No. При установке в Yes Turbo Debugger показывает для подсвеченного класса все функции-элементы или элементы данных, включая
                  наследуемые. В противном случае выводятся только элементы данного
                  класса.



                  Окна Inspector


                  Эти окна предоставляют наилучший способ просмотра элементов
                  данных, так как они автоматически форматируются в соответствии с
                  типом данных. Их особенно полезно использовать при проверке сложных объектов данных (массивов или связанных списков). Чтобы просмотреть данные в шестнадцатиричном виде, в активном окне Inpsector используйте команду View Dump. Окна Inspector открываются из
                  команды Data Inspector или SpeedMenu окон Wathes, Variables или
                  Inspector.
                  При открытии окна Inspector выводится диалоговое окно Enter
                  Variable с подсказкой на ввод выражений. Введите имя переменной
                  или выражение. Если в момент команды Inspect курсор находится на
                  идентификаторе, или вы выделили выражение, то они автоматически
                  помещаются в поле ввода. Заголовок окна Inspector содержит проверяемое выражение.
                  Скалярное окно Inspector показывает значения простых элементов данных, таких как char, int или long. Оно содержит две строки: в первой указан адрес переменной, а вторая показывает ее тип и значение (в десятичном/шестнадцатиричном виде).
                  [*] Inspecting wordcount 3 [^][v]
                  05A51:AA00
                  unsigned int 2 (0x02)
                  < >
                  Окно Inspector для указателей выводит значения переменных,
                  указывающих на другие элементы данных. В верхней строке указывается адрес переменной, а далее следует детальная информация об
                  указываемых данных. В нижней области показывается тип этих данных.
                  [*] Inspecting bufp 3 [^][v]
                  register ds:0874 [TCDEMO buffer] ^
                  [0] 'n' 110 (Ox88)
                  [1] '0' 111 (Ox6F)
                  [2] 'w' 119 (Ox77)
                  < >
                  char *
                  Если указатель ссылается на сложный объект данных, значения
                  заключаются в фигурные скобки (выводится столько данных, сколько
                  можно показать). При ссылке на строку символов выводится каждый
                  элемент символьного массива с указанием индексов и значений. Команда Range позволяет выводить несколько строк информации.
                  Окна Inspector для структур и объединений показывают значения элементов в сложных объектах данных. Такое окно имеет две области. В верхней области выводится адрес объекта данных с перечислением имен и значений элементов данных объекта. Нижняя область содержит одну строку. Если вы в верхней области подсветите



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

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

                  [*] Inspecting letterinfo[n] 3 [^][v]

                  $7937:0852 ^

                  count 2 (Ox2)

                  firstletter 2 (Ox2)

                  < >v

                  struct linfo

                  Область Inspector для массива показывает значения элементов

                  массива (каждому элементу соответствует строка). Слева выводится

                  индекс, справа - значение. Если значением является составной объект, Turbo Debugger выводит максимум данных объекта.

                  [*] Inspecting letterinfo 3 [^][v]

                  $7682:0852 ^

                  [0] {2,2}

                  [1] {2,0}

                  [2] {2,0}

                  [3] {1,1}

                  [4] {1,0}

                  < >

                  struct linfo [26]

                  Окно Inspector для функции показывает адрес функции, ее аргументы, а также возвращаемый функцией тип (в нижней области) и

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

                  [*] Inspecting analyzewords 3 [^][v]

                  071E9:02DD

                  char *bufp

                  < >

                  long ()


                  Окна Inspector


                  Выводят текущее содержимое выбранной переменной. Его можно
                  открыть с помощью команды Data Inspect или Inspect меню SpeedMenu. Закрывается оно обычно по Esc или щелчком "мышью" на блоке
                  закрытия. При последовательном открытии нескольких окон Inspector
                  нажатием Alt+F3 или командой Window Close вы можете закрыть сразу
                  все эти окна. Окна Inspector выводят простые скалярные величины,
                  указатели, массивы, объединения, структуры, классы и объекты. Выбором команды Inspect в этом окне вы можете создать дополнительные окна Inspector.


                  Окна MDI


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


                  Окна меню View


                  Меню View является точкой входа в большинство окон Turbo Debugger. Перечислим их кратко. С помощью команды View Another вы
                  можете дублировать на экране окна Dump, File и Module.


                  Окна Object Inspector


                  Это окно используется для просмотра структуры и значений
                  конкретного экземпляра класса. Чтобы открыть данное окно, поместите курсор на конкретный экземпляр класса (в окне Module) и нажмите Ctrl+I.
                  [*] Inspecting tw 3 [^][v]
                  @75C6:01E8 ^
                  Screen::MaxX 500 (Ox1F4)
                  Screen::MaxY 512 (Ox200) v
                  < >
                  Screen::Convert @0000:0000
                  Screen::VertVtoA @0000:0000
                  Screen::VertAtoV @0000:0000
                  class TextWindow
                  Данное окно содержит три области. Область элементов данных
                  (верхняя) показывает текущие значения элементов данных объектов.
                  Окно функций-элементов (среднее) выводит текущие значения и адреса функций-элементов объекта. Область типов показывает тип подсвеченного элемента данных или функции-элемента.
                  SpeedMenu верхних двух областей содержат идентичные команды,
                  только область элементов данных содержит дополнительную команду
                  Change.

                  Range
                  Позволяет вам задать диапазон выводимых элементов массива.
                  Если подсвеченный элемент не является массивом или указателем, то
                  команда недоступна.
                  Change
                  Позволяет изменить значение подсвеченного элемента данных.
                  Methods
                  Переключается между Yes (по умолчанию) и No. В состоянии Yes
                  отладчик выводит среднюю область окна Object Inspector с перечислением функций-элементов. No отменяет вывод средней области.
                  Show Inherited
                  Также переключается между Yes и No. В состоянии Yes показываются все функции-элементы, определенные в классе и наследуемые.
                  No позволяет вывести только функции-элементы, определенные в
                  классе.
                  Inspect
                  Открывает для текущего подсвеченного элемента окно Inspector. Проверка функции-элемента открывает окно Module, где курсор
                  позиционируется на определяющий эту функцию код.
                  Descend
                  Работает аналогично команде Inspect SpeedMenu, но заменяет
                  текущее окно Inspector. Это уменьшает число открытых на экране
                  окон inspector.
                  New Expression
                  Используется для проверки различных выражений. Данные в текущем окне Inspector заменяются данными нового вводимого выражения.
                  Type Cast
                  Позволяет задавать для текущего подсвеченного элемента данные различного типа. Эта команда полезна, если идентификатор не
                  имеет информации о типе и для явного задания типа указателей.
                  Hierarchy
                  Открывает окно Hierarchy с наследованием текущего класса.



                  Окна-рамки


                  Окна-рамки (объекты класса TFrameWindow) - это специализированные окна, поддерживающие клиентное окно. Они составляют основу
                  окон-рамок MDI и SDI, дочерних окон MDI и (вместе с TLayoutWindow) декорированных окон-рамок. Окна-рамки играют в ObjectWindows
                  важную роль и используются для управления такими элементами как
                  меню и полосы прокрутки. Их клиентные окна могут специализироваться для выполнения конкретных задач. Вносимые в окно-рамку изменения (например, добавление строки состояния) на клиентное окно
                  не влияет.


                  Окна реквизитов


                  Окна реквизитов основываются на производном от TWindow классе TGadgetWindow. Они предназначены для размещения в них реквизитов, задания схемы их расположения и вывода их в другом окне. Окна реквизитов обеспечивают функциональные возможности для включенных в них реквизитов. Так как реквизиты не являются окнами,
                  они не могут выставлять или принимать события, непосредственно
                  взаимодействовать с окнами или вызывать для себя функции Windows.
                  Все, что требуется делать реквизиту, должно выполняться через окно реквизитов.
                  Реквизит практически не может управлять своим расположением
                  в окне реквизитов. Окно реквизитов отвечает за размещение и расположение всех реквизитов, который оно содержит. Обычно реквизиты
                  располагаются в одну линию (вертикально или горизонтально).
                  Реквизиты обычно включаются в другое окно. Родительским окном окна реквизитов является как правило декорированное окно-рамка, такое как TDecoratedFrame или TDecoratedMDIFrame, хотя класс
                  TToolBox использует обычно TFloatingFrame.
                  В конструкторе TGadgetWindow задается указатель на объект
                  родительского окна, направление (горизонтальное и вертикальное),
                  указатель на объект шрифта TFont и параметр TModule базового
                  конструктора (по умолчанию 0). Функция ~TGadgetWindow удаляет
                  каждый из реквизитов окна реквизитов, а затем удаляет объект
                  шрифта.
                  TGadgetWindow переопределяет заданную по умолчанию функцию-элемент Create. Версия TGadgetWindow этой функции выбирает
                  начальный размер на основе следующих критериев:
                • Установлена ли для реквизитов в окне автоматическая настройка размера.

                • Размера реквизитов, содержащихся в окне.

                • Направления расположения реквизитов в окне.

                • Имеет ли окно реквизитов рамку, и размера этой рамки.

                • Функция Create определяет на основе этих факторов подходящий
                  размер окна, устанавливает размеры атрибутов окна, а затем для
                  создания интерфейсного элемента окна вызывает базовую функцию
                  TWindow::Create.
                  Чтобы окно реквизитов выполняло полезные функции, оно должно
                  содержать некоторые реквизиты. Чтобы поместить реквизит в окно,



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

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

                  Если окно реквизитов уже создано, вам нужно после вызова Insert вызвать LayoutSession. Реквизит появится в окне после задания его схемы (LayoutSession).

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

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

                  Изменить поля и схемы окна можно перед его выводом или после. Для этого используйте функции SetMargins и SetDirection. Обе

                  эти функции устанавливают соответствующие элементы данных, а затем вызывают функцию LayoutSession. Направление вывода реквизитов

                  определяется с помощью функции GetDirection.

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

                  действий. Если элемент окна уже создан, то LayoutSession выводит

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

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

                  или удалением реквизитов или изменением окна реквизитов.

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

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

                  схему расположения.

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

                  реквизитов функцию GedgetChangedSize со ссылкой на реквизит с измененным размером. Заданная по умолчанию версия этой функции

                  просто инициализирует сеанс задания схемы.

                  С помощью функции SetShrinkWrap вы можете задать автоматическую настройку размера окна реквизитов. Автоматическую настройку горизонтального и вертикального размера определяют параметры shrinkWrapWidth и shrinkWrapHeight.

                  Определить текущий шрифт и его размер можно с помощью функций GetFont и GetFontHeight.

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



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

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

                  функций GedgetSetCapture и GadgetReleaseCapture. Эти функции

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

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

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

                  режим устанавливается с помощью функции SetHintMode, параметр которой может иметь значения NoHints (подсказка не выводится),

                  PressHints (подсказка выводится при нажатии реквизита) и EnterHints (подсказка выводится при перемещении "мыши" на реквизит).

                  Определить текущий режим можно с помощью функции GetHintMode.

                  Вывод подсказки определяет функция SetHintCommand. Обычно

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

                  Чтобы эта функция правильно работала со стандартными классами ObjectWindows, нужно чтобы:

                • декорированное окно-рамка (родительское окно окна реквизитов) имело строку сообщений или строку состояния;


                • в окне-рамке должна быть разрешена подсказка;


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


                • Для поиска содержащихся в окне реквизитов вы можете использовать функции FirstGadget, NextGadget, GadgetFromPoint, GadgetWidthId.


                  Окна схемы


                  Окна схемы (разметки) инкапсулируют класс TLayoutWindow, инкапсулирующий производный от TWindow класс TLayoutWindow. Как и
                  TFrameWindow, TLayoutWindow создает основу для декорированных
                  окон-рамок и возможности упорядочения элементов в области рамки.
                  Окна схемы (или разметочные окна) называются так потому, что
                  могут упорядочивать дочерние окна в своей клиентной области. Расположение дочерних окон определяется относительно окна схемы или
                  другого дочернего окна ("братского" окна - окна равного уровня).
                  Расположение дочернего окна зависит от параметров схемы, которые
                  включат в себя ряд правил, описывающих координаты X и Y окон, их
                  высоту и ширину. Эти правила обычно основываются на координатах
                  братского окна и, в итоге, на размере и организации окна схемы.
                  Параметры схемы для дочерних окон содержатся в классе TLayoutMetrics. Объекты параметров схемы состоят из ряда ограничений
                  схемы. Каждое ограничение описывает правило определения конкретного изменения окна, например X-координаты или ширины окна. Эти
                  ограничения хранятся в структуре TLayoutConstraints, но обычно
                  используются производные от нее классы, такие как TEdgeConstraint.
                  Ограничения схемы определяют соотношение между краем или
                  размером одного окна и краем или размером братского или родительского окна схемы. Это соотношение может быть достаточно гибким.
                  Например, можно задать ширину окна как процент от ширины родительского окна. Ограничения задаются обычно с помощью функции
                  Set, которая определяется в классе TEdgeConstraint и в результате
                  наследуется из TEdgeOrWidthConstraint и TEdgeOrHeightConstraint.
                  Параметр edge функции Set определяет, какую часть окна вы
                  ограничиваете. Для этого используется enum TEdge с 5 возможными
                  значениями:
                • lmLeft определяет левый край окна.

                • lmTop определяет верхний край окна.

                • lmRight определяет правый край окна.

                • lmBottom определяет нижний край окна.

                • lmCenter определяет центрирование окна (горизонтальное или
                  вертикальное).

                • С помощью enum TWidthHeight можно задать ограничение высоты



                  или ширины окна:

                • lmWidth задает, что ограничением должна быть ширина окна.


                • lmHeight задает, что ограничением должна быть высота окна.


                • rel задает соотношение между краями окна (lmAsis, lmPersentOf, lmAbove, lmLeftOf, lmBelow, lmRightOf, lmSameAs, lmAbsolute).


                • otherWin задает окно, содержащее ваше дочернее окно. Для

                  спецификации родительского окна используется lmParent.


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


                • value имеет разный смысл в зависимости от значения rel и

                  Units.


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

                  связанных с теми, которые задаются в Set.

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

                  10 элементов изображения ниже другого окна ничего не говорит о

                  высоте и ширине окна, расположении его левого или правого края

                  или нижней границы. Комбинация ограничений схемы расположения может полностью определить расположение окна. TLayoutMetrics использует 4 ограничения расположения: два объекта TEdgeConstraint

                  (X и Y), TEdgeOrWidthConstraint (Width) и TEdgeOrHeightConstraint

                  (Height).

                  TLayoutMetrics - достаточно простой класс. Его конструктор

                  не имеет параметров и только устанавливает элемент каждого ограничения. Для каждого ограничения схемы ограничивающее окно обнуляется, соотношение устанавливается в lmAsIs, единицы устанавливаются в lmLayoutUnits, а значение - в 0.

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

                  можно использовать соответствующую функцию.

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

                  Его диалоговое окно позволяет изменить ограничения каждого из

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

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


                  Окна Turbo Debugger


                  Для вывода информации об отлаживаемой программе в Turbo Debugger используется набор окон. Для облегчения отладки служат команды управления окнами, которые находятся в меню Window и System. Каждое открываемое окно имеет номер, указанный в его правом
                  верхнем углу. Нажатием клавиши Alt в сочетании с номером окна вы
                  можете активизировать любое из первых 9 окон. Список открытых
                  окон содержится в нижней половине меню Window. Чтобы открыть
                  конкретное окно, нажмите в меню Window цифру номера окна. Если
                  окон больше 9, в этом меню выводится команда Window Pick, выводящая меню окон.
                  Клавиша F6 (или команда Window Next) позволяет циклически
                  перемещаться по открытым на экране окнам. Окно может иметь несколько областей. Для перемещения между областями используйте клавиши Tab или Shift+Tab, либо Window Next. Курсор в областях перемещается с помощью стандартных клавиш перемещения курсора.
                  При открытии нового окна оно выводится в месте текущего расположения курсора. Переместить его в другое место можно с помощью
                  команды Window Size/Move и клавиш стрелок, либо сразу нажмите
                  Shift и сдвигайте окно стрелками. Для быстрого увеличения или
                  уменьшения окна выберите Window Zoom (F5) или щелкните "мышью" на
                  кнопке минимизации/максимизации в верхнем правом углу окна.
                  Если вы по ошибке закрыли окно, вернуться в последнее окно
                  можно с помощью команды Window Undo Close (Alt+F6). Когда программа затирает своим выводом экран операционной среды (при выключенном переключении экрана), вы можете очистить его с помощью
                  System Repaint Desktop. Для возврата к используемой по умолчанию
                  схемы окон Turbo Debugger выберите System Restore Standard.
                  Каждое окно Turbo Debugger имеет специальное оперативное меню SpeedMenu, содержащее команды, относящиеся к данному окну. Области окон также могут иметь свои меню. Для доступа к SpeedMenu
                  активного окна или области вы можете нажать в окне правую кнопку
                  "мыши", либо нажать клавиши Alt+F10, либо нажать Ctrl и подсвеченную букву команды SpeedMenu (для этого должно быть разрешено
                  действие команд-сокращений).


                  Окно Breakpoints


                  Создать окно точек останова Breakpoints можно с помощью команды View Breakpoints основного меню. Это дает вам способ выбора
                  и установки условий, при которых срабатывает точка останова. Это
                  окно можно использовать для добавления новых точек останова, отмены (удаления) точек останова и изменения существующих точек останова.
                  [*] Breakpoints 3 [^][v]
                  TCDEMO.220 Breakpoint
                  TCDEMO.225 Always
                  TCDEMO.226 Enabled
                  < >
                  В левой области этого окна показан список всех адресов, где
                  установлены точки останова. В правой области показаны подробные
                  данные по текущим (подсвеченным в левой области) точкам останова.
                  Локальное меню SpeedMenu окна Breakpoints можно получить по
                  нажатию клавиш Alt+F10. Команды данного меню позволяют вам добавлять новые точки останова, отменять существующие или изменять характер поведения имеющихся точек останова.


                  Окно Breakpoints


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


                  Окно Clipboard


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


                  Окно CPU


                  Это окно открывается командой View CPU строки меню и использует различные области для описания состояния вашей программы на
                  нижнем уровне. Его можно использовать для
                • просмотра машинного кода и дизассемблированных инструкций
                  программы;

                • проверки и модификации байт структур данных программы;

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

                • область регистров
                  область кода область стека
                  [*] CPU 80486 3 [^][ ]
                  TCDEMO.120: Inc(NumLines); ^ ax 0004 c=0
                  cs:04C4:4F36063000 inc word ptr [TPDEMO bx 3EEE z=0
                  TCDEMO.121 i := 1; cx 0000 s=0
                  cs:04C8 C:43FE0100 word ptr [bp+02].000 dx 5920 o=0
                  TCDEMO.122: while i <= Length(S) do si 3CEC p=0
                  cs:04C0 C47ED4 les di,[bp+04] bp 3EF4 a=0
                  cs:0400 288A05 mov al,es:[di] sp 3EF4 i=1
                  cs:0403 3D84 xor ah,ah ds 5920 d=0
                  cs:0405 3B48FE cmp ax,[bp+02] es 5920
                  cs:0408 7D03 jnl TPDEMO.125 (04DD) ss 595A
                  cs:040A 898A00 jmp TPDEMO.148 cs 548A
                  TCDEMO.125 while (i <= Length(S)) and notv ip 04C8
                  < >
                  ds:0008 5A 5D 5A 5D 5A 5D 00 00 Э^$< < ss:3EF2 548A
                  ds:0010 00 00 00 00 00 00 5A 5D 6D vЖ ss:3EF0>04C1
                  ds:0018 00 00 5A 5D 00 00 00 90 7 ss:3EEE 0246
                  область дампа область стека
                  Область кода показывает машинный код и дизассемблированные
                  машинные инструкции вашей программы. Здесь могут также выводиться
                  строки исходного кода. В области регистров выводится содержимое
                  регистров ЦП. В области флагов показывается состояние 8 флагов
                  процессора. В области дампа выводится шестнадцатиричный дамп любой области памяти, доступной для программы. Область стека показывает шестнадцатиричное содержимое стека программы. Область селекторов доступна только для TDW и показывает все селекторы Windows.
                  Для адресных ссылок вне текущего сегмента в окне CPU выводятся знаки вопроса. Клавиша Ctrl в сочетании со стрелками позволяет сдвигать вывод на 1 байт. При выполнении кода Windows, модуля без отладочной информации, остановке программы на инструкции
                  внутри строки исходного кода или при трассировке инструкций с помощью Alt+F7 окно CPU выводится автоматически.


                  Окно CPU


                  Выводит текущее состояние процессора. Окно имеет 6 областей,
                  где выводятся дизассемблированные инструкции, селекторы Windows
                  (только в TDW), шестнадцатиричные данные, стек в шестнадцатиричном виде, регистры ЦП и флаги процессора. Это окно полезно использовать при отладке программ на ассемблере или просмотре точно последовательности инструкций.


                  Окно Dump


                  В этом окне выводится в непосредственном виде дамп любой области памяти. Оно работает так же, как область данных окна CPU.
                  [*] Dump 3 [^][v]
                  ds:0000 CD 20 00 A0 00 9A F0 FE = & U** ^
                  ds:0008 1B 02 B2 01 22 31 7C 01 <.^% .`
                  ds:0010 22 31 88 02 52 2B E2 1D * X 4-#
                  ds:0018 01 01 01 00 03 FF FF FF v
                  < >
                  С помощью команды View Another Dump вы можете одновременно
                  открыть несколько окон Dump.


                  Окно Dump


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


                  Окно Execution History


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


                  Окно File


                  Выводит содержимое любого файла на диске. В нем можно просматривать шестнадцатиричные байты или текст ASCII и искать нужные
                  байтовые последовательности.


                  Окно Hierarchy


                  Окно Hierarchy (открываемое командой View Hierarchy) служит
                  для проверки иерархии объектов или классов, которая выводится в
                  графическом виде.
                  Область классов Область иерархии
                  [*] Class Hierarchy 3 [^][v]
                  Devi e Point
                  GlowGauge Rectangle
                  HorzArrow Device
                  HorzBar TextWindow
                  LinearGauge Range
                  Point Device
                  Range GlowGauge
                  Rectangle
                  Screen Parents of Device
                  TextWindow Range
                  VertArrow Rectangle
                  VertBar Point
                  Screen
                  < >


                  Окно Hierarchy


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


                  Окно Log


                  Это окно отслеживает события, происходящие во время сеанса
                  отладки. Открывается оно по команде View Log и по умолчанию содержит до 50 строк текста (вы можете изменить это с помощью программы инсталляции).
                  [*] Log 3 [^][v]
                  At MCINPUT.124 ^
                  Breakpoint at TCDEMO.220
                  Breakpoint at TCDEMO.220
                  Breakpoint at TCDEMO.220
                  We are now entering procedure Params...
                  Breakpoint at TCDEMO.180 v
                  < >
                  В это окно записываются:
                • адрес программы при ее приостановке;

                • комментарий (при использовании команды Add Comment данного
                  окна);

                • значение выражения, определенного для активизированной
                  точки останова;

                • содержимое области или окна при выборе команды Edit Dump
                  to Log.

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

                • при установке в Yes параметра Send to Log Window окна Windows Messages в окно Log передаются все посылаемые данному
                  окну сообщения.

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

                  Open Log File
                  Эта команда записывает на дик все записи, регистрируемые в
                  окне Log. Вам выводится подсказка для ввода имени файла на диске.
                  По умолчанию он имеет расширение .LOG, а его имя соответствует
                  имени программы. При открытии файла в него записываются все уже
                  зарегистрированные записи. Если это нежелательно, выберите сначала команду Erase Log.
                  Close Log File
                  Закрывает файл, открытый с помощью команды Open Log File.
                  Logging
                  Разрешает/запрещает запись событий в окно Log. Используется
                  для управления регистрацией событий.
                  Add Comment
                  Позволяет включить в окно Log комментарии. Открывает диалоговое окно с подсказкой для ввода комментария.
                  Erase Log
                  Очищает окно Log. Файл журнала на диске не изменяется.
                  Display Windows Info
                  Доступна только для TDW и выводит на экран окно Windows Information. Позволяет вывести информацию о динамически распределяемой памяти и список модуля приложения.



                  Окно Log


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


                  Окно Module


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


                  Окно Numeric Processor


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


                  Окно Registers


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


                  Окно Registers


                  Показывает содержимое регистров (в области регистров) и флагов ЦП (в области флагов). С помощью команд SpeedMenu вы можете
                  изменить их значения.


                  Окно сообщений


                  При компиляции программ в окне сообщений выводятся ошибки и
                  предупреждения. С помощью команды Preferences в диалоговом окне
                  Enviroment Options вы можете настроить некоторые функциональные
                  возможности окон сообщений Message.
                  При выборе сообщения в окне Message редактор помещает курсор
                  в ту точку исходного кода, где произошла ошибка или предупреждение. Если файл с ошибкой не загружен в окне редактора, для его
                  загрузки нажмите пробел (можно воспользоваться и SpeedMenu). Окно
                  сообщений остается выбранным, так что вы можете перемещаться от
                  сообщения к сообщению. С помощью команды Remove all messages оперативного меню вы можете очистить окно сообщения. Клавиши Alt+F7
                  выводят следующее сообщение об ошибке, а Alt+F8 - предыдущее.


                  Окно Stack


                  Это окно позволяет проанализировать стек вызова и вывести в
                  удобном для чтения формате все активные функции и значения аргументов. Окно Stack вы можете создать с помощью команды View Stack. В окне стека выводится список всех активных процедур и
                  функций. Первой в списке указывается последняя вызванная процедуры, за которой следует вызвавшая ее процедура и предыдущая процедура, и так до самой первой функции программы (функция main в
                  Си). Это окно выводит также имена функций-элементов, перед которой указывается имя класса. При рекурсивном вызове окно Stack содержит несколько экземпляров функции.
                  [*] Stack 3 [^][v]
                  TCDEMO.PROCESSLINE.ISLETTER('A')
                  TCDEMO.PROCESSLINE('ABCDEF')
                  < >
                  SpeedMenu окна Stack содержит две команды: Ispect и Locals.
                  Команда Inspect открывает окно Module и позиционирует курсор на
                  активную строку подсвеченной функции. Если подсвеченная функция
                  находится в вершине стека вызова (последняя вызванная функция),
                  то в окне Module показывается положение счетчика команд. В противном случае курсор позиционируется на строку после вызова соответствующей функции. Вызвать эту команду можно также нажатием Enter после подстветки нужной функции. Команда Locals открывает окно Variables с идентификаторами, локальными для текущего модуля и
                  подсвеченной функции.


                  Окно Stack


                  Показывает текущее состояние программного стека. Первая вызванная функция показывается в нижней части окна, а выше ее - каждая последующая. Подсвечивая эти функции и нажимая Ctrl+I вы можете проверять исходный код. Кроме того, можно открыть окно Variables и вывести все локальные переменные и аргументы функции (Ctrl+L).


                  Окно Variables


                  В этом окне, которое открывается по команде View Variable,
                  показаны все локальные и глобальные переменные (с именами и значениями), доступные из текущего места программы. Его можно использовать, чтобы найти переменные, написание имен которых вы не помните. Для дальнейшего анализа или изменения их значений можно
                  использовать команды локальных меню. Это окно можно также использовать для проверки переменных, локальных по отношению к любой вызванной функции.
                  [*] Variables 3 [^][v]
                  TCDEMO.SHORESULTS @7129:01fA
                  TCDEMO.INIT @7129:0402
                  TCDEMO.PROCESSLINE @7129:04B5
                  TCDEMO.PARMSONHEAP @7129:0651
                  TCDEMO.NUMLINES 1 ($1)
                  TCDEMO.NUMWORDS 0 ($0)
                  < >
                  CH 'A'
                  ISLETTER True
                  S 'ABC DEF'
                  I 1 ($1)
                  WORDLEN 28969
                  Окно имеет две области. Область глобальных переменных (вверху), показывает все глобальные идентификаторы программы. Область
                  статических/локальных переменных (внизу) показывает все статические переменные (идентификаторы) текущего модуля. В обеих областях
                  выводится имя переменной (слева) и ее значение (справа). Если отладчик не может найти информации о типе данных идентификаторов,
                  то он выводит четыре вопросительных знака (????).
                  Меню окна Variables
                  Каждая область окна Variables имеет собственное SpeemMenu.
                  Оба меню содержат команды Inspect, Change и Wathes, а команда
                  Show имеется только в области локальных идентификаторов.

                  Inspect
                  Открывает окно Inspector, где выводится содержимое подсвеченного идентификатора. В отличие от обычных окон Inspector, если
                  вы проверяете глобальную переменную, имя которой совпадает с именем локальной переменной, то Turbo Debugger выводит значение глобальной переменной. При проверке имени функции активизируется окно Module, а курсор перемещается на имя этой функции в исходном
                  коде (при его отсутствии выводится окно CPU).
                  Change
                  Открывает диалоговое окно Change, в котором можно изменит
                  значение подсвеченного идентификатора.
                  Watch
                  Открывает окно Watches и добавляет в него подсвеченный идентификатор. При этом не отслеживается, глобальная это переменная
                  или локальная. В блоке локальной переменной локальная переменная
                  имеет старшинство.
                  Show
                  Выводит диалоговое окно Local Display. Кнопки с зависимой
                  фиксацией этого окна позволяют разрешить или изменить область
                  действия переменной в области локальных переменных.
                  Show Показывать только статические переменные.
                  Auto Только переменные, локальные для текущего блока.
                  Both И статические, и локальные (по умолчанию).
                  Module Смена текущего модуля. Выводит диалоговое окно со
                  списком модулей программы.



                  Окно Variables


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


                  Окно Watches


                  Это окно обеспечивает самый простой способ отслеживания элементов данных программы. В нем вы можете просматривать переменные
                  и выражения, значения которых нужно отслеживать.
                  [*] Watches 2 [^][v]
                  wordcount unsigned int 8 (Ox8) ^
                  wordcounts unsigned int [10] {1,2,4,6,1,1,2,0,0,0}
                  lettersinfo struct linfo [26] {(4,2),(1,1),(0,0),(1,1),(7,0),(.
                  nlines*nwords unsigned int 24 (Ox22)
                  totalcharacters unsigned long 88L (Ox42) v
                  < >
                  Это окно допускает просмотр значений как простых переменных,
                  так и составных объектов данных (например, массивов). Элементы
                  составных объектов выводятся в фигурных скобках ({}). Можно также
                  отслеживать выражения, не ссылающиеся непосредственно на память.
                  Отслеживаемые выражения перечисляются в левой части окна, соответствующие типы данных и значения - справа.
                  Чтобы задать отслеживаемые данные, выберите команду Data Add
                  Watch, либо команду Watch локального меню окна Module, Variable
                  или Watches. Turbo Debugger открывает диалоговое окно Enter Expression to Watch. Введите в нем имя переменной или выражение.
                  Если в окне Module курсор находится на переменной, то она
                  автоматические добавляется в окно Watch при выборе окна Wathes в
                  SpeedMenu. Это же относится к выражениям, выделенными с помощью
                  клавиш Ins и стрелок.
                  Если не переопределяется область действия, отладчик вычисляет выражения относительно текущего указателя команд. Если выражение содержит символ, недоступный в активной области действия, то выводятся символы ????. При вводе выражений вы можете использовать имена еще не определенных переменных, поэтому имена следует
                  вводить аккуратно (Turbo Debugger не распознает ошибок).
                  При трассировке внутри функции-элемента можно использовать
                  указатель this, который можно сопровождать спецификаторами формата и квантификаторами.


                  Окно Watches


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


                  Окно Windows Messages


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


                  Оконные объекты


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

                • Окна-рамки.

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

                • Окна MDI.

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


                  Операции в команде


                  В дополнение к операциям переназначения <, > и >>, утилита
                  MAKE добавляет операции << и &&. Эти операции для создания подаваемых на вход команды данных создают в оперативном порядке файл.
                  Операция << создает временный файл и переназначает поток стандартного ввода команды таким образом, что он поступает из созданного файла. Если у вас имеется программа, которая допускает ввод
                  данных из потока stdin, то команда:
                  MYPROG < Это лишь тест
                  !
                  будет создавать временный файл, содержащий строку "Это лишь тест
                  \n", переопределяя ее как единственный поток входной информации
                  для программы myрrog. Восклицательный знак (!) представляет собой
                  в данном примере разделитель; в качестве разделителя для этого
                  файла можно использовать любой символ за исключением символов #
                  или \. Первая строка, начальным символом которой является символ
                  разделителя, завершает файл. Остальная часть строки, следующая за
                  символом разделителя (в данном примере, восклицательным знаком)
                  считается часть предшествующей команды.
                  Операция && аналогична операции <<. Он создает временный
                  файл, но вместо того, чтобы сделать этот файл стандартным потоком
                  ввода для указанной команды, операция && заменяется именем временного файла. Это оказывается полезным в том случае, если вы хотите, чтобы утилита MAKE создала файл, который должен быть использован в качестве источника входных данных команды. В
                  приведенном ниже примере показывается, как создать "файл подсказки" для утилиты TLINK.
                  MYPROG.EXE: $(MYOBJS)
                  tlink /c @&&!
                  COS $(MYOBJS)
                  $*
                  $*
                  $(MYLIBS) EMU.LIB MATHS.LIB CS.LIB
                  Заметьте, что макрокоманда (которая обозначается с помощью
                  знака $) расширяется при создании файла. $* заменяется именем
                  создаваемого файла без расширения, а $(MYOBJS) и $(MYLIBS) заме-
                  няются значениями макрокоманд MYOBJS и MYLIBS. Таким образом, для
                  TLINK файл будет выглядеть следующим образом:
                  COS a.obj b.obj c.obj d.obj
                  MYPROG
                  MYPROG
                  w.lib x.lib y.lib z.lib EMU.LIB MATHS.LIB CS.LIB
                  Если не используется параметр командной строки -K, то все
                  временные файлы удаляются. Параметром -K следует пользоваться для
                  "отладки" временных файлов, если возникает впечатление, что эти
                  файлы работают неверно.


                  Операции ввода-вывода с плавающей точкой


                  Ввод вывод с плавающей точкой требует компоновки с подпрограммами преобразования, используемыми функциями printf и scanf.
                  Чтобы уменьшить размер выполняемого файла, форматы с плавающей
                  точкой автоматически не компонуются. Однако такая компоновка автоматически выполняется при использовании в программе математической подпрограммы или получении адреса некоторого числа с плавающей точкой. Если не выполняется ни одно из этих действий не
                  выполняется, то отсутствие форматов с плавающей точкой может дать
                  в результате ошибку ввода-вывода. Правильно оформить программу
                  можно, например, следующим образом:
                  /* Подготовка к выводу чисел с плавающей точкой */
                  #include
                  #pragma extref _floatconvert
                  void main() {
                  printf(*d = %f\n", 1.3);
                  }


                  Оперативная помощь


                  В отладчик встроен контекстно-зависимый оперативный справочник. Он доступен как при работе в системе меню, так и при выводе
                  сообщения об ошибке или подсказки. Для вывода справочного экрана
                  с информацией, относящийся к текущему контексту (окну или меню)
                  нажмите клавишу F1. При наличие "мыши" вы можете вывести справочный экран, выбрав F1 в строке состояния. Некоторые справочные экраны содержат подсвеченные слова, которые позволяют вам получить
                  дополнительную информацию по данной теме. Для перемещения к нужным ключевым словам используйте клавиши Tab или Shift+Tab и нажмите клавишу Enter. Для перемещения к первому или последнему слову на экране используйте клавиши Home и End. Доступ к оперативным
                  справочным средствам можно получить также с помощью команды Help
                  из строки меню (оперативные клавиши Alt+H).
                  Если вы хотите вернуться к предыдущему справочному экрану,
                  нажмите клавиши Alt+F1 или выберите команду Previous из меню
                  Help. В справочной системе для просмотра последних 20 экранов
                  можно пользоваться клавишей PgUp (клавиша PgDn работает, когда вы
                  находитесь в группе связанных экранов). Для доступа к индексному
                  указателю справочной системы нажмите Shift+F1 (или F1 в справочной системе) или выберите команду Index в меню Help. Для получения информации о самой справочной системе выберите в меню Help
                  команду Help Help. Для выхода из справочной системы нажмите клавишу Esc.
                  При работе в отладчике в нижней части экрана выводится краткая справочная строка. В этой строке состояния кратко описаны
                  клавиши или команды меню для текущего контекста.


                  Оператор CODE


                  Оператор CODE определяет стандартные атрибуты сегментов кода. Сегменты кода могут иметь любое имя, но должны принадлежать
                  классам сегментов, имена которых оканчиваются на CODE. Например,
                  корректными именами классов сегментов являются CODE и MYCODE.
                  Оператор имеет следующий синтаксис:
                  Для TLINK:
                  CODE [FIXED MOVEABLE]
                  [DISCARDABLE NONDISCARDABLE]
                  [PRELOAD LOADONCALL]
                  Для TLINK32:
                  [PRELOAD LOADONCALL]
                  [EXECUTEONLY EXECUDEREAD]
                  FIXED означает, что сегмент занимает фиксированное положение
                  в памяти; MOVEABLE означает, что сегмент может перемещаться.
                  DISCARDABLE означает, что сегмент может отбрасываться, если
                  он больше не нужен. DISCARDABLE подразумевает MOVEABLE.
                  NONDISCARDABLE означает, что сегмент не может отбрасываться.
                  PRELOAD означает, что сегмент загружается при первой загрузке модуля; LOADONCALL означает, что сегмент загружается, когда
                  вызывается код, находящийся в этом сегменте. Компилятор ресурсов
                  и загрузчик Windows устанавливают сегмент кода, содержащий начальную точку входа в программу, в значение PRELOAD независимо от
                  содержания файла определения модуля.
                  EXECUTEONLY означает, что сегмент кода может быть только выполняемым. EXECUTEREAD означает, что сегмент кода может считываться и выполняться.


                  Оператор DATA


                  Оператор DATA определяет стандартные атрибуты сегментов данных и имеет синтаксис:
                  DATA [NONE SINGLE MULTIPLE]
                  [READONLY LOADCALL]
                  [PRELOAD LOADONCALL]
                  [SHARED NONSHARED]
                  NONE означает отсутствие сегмента данных. Если задается
                  NONE, то другие параметры использовать нельзя. Этот параметр
                  используется только для библиотек.
                  READONLY означает, что сегмент данных может только считыватьcя. READWRITE означает чтение и запись в сегмент данных.
                  PRELOAD означает, что сегмент данных загружается при первой
                  загрузке модуля. LOADONCALL (по умолчанию) означает, что сегмент
                  данных загружается при первом обращении (для 32-разрядных приложений это игнорируется).
                  SHARED (по умолчанию для 16-разрядных приложений) означает,
                  что одна копия сегмента данных совместно используется всеми процессами. NONSHARED (по умолчанию для программ и 32-разрядных DLL)
                  означает, что копия сегмента данных загружается для каждого процесса, которому требуется использовать сегмент данных.


                  Оператор DESCRIPTION


                  DESCRIPTION вставляет текст в модуль прикладной программы.
                  Оператор DESCRIPTION обычно используется для вставки автора, даты
                  или информации о копировании. Оно является необязательным параметром. Оператор имеет синтаксис:
                  DESCRIPTION 'текст'
                  где "текст" является строкой ASCII, разделенной одинарными кавычками.


                  Оператор EXETYPE


                  EXETYPE задает стандартный тип заголовка (Windows или OS/2)
                  выполняемого файла (.EXE) для 16-разрядных приложений. В 32-разрядных приложениях для обратной совместимости этот оператор можно
                  сохранить. В данной версии Borland C++ можно задавать только значение WINDOWS. Оператор имеет синтаксис:
                  EXETYPE WINDOWS


                  Оператор EXPORTS


                  EXPORTS определяет имена и атрибуты экспортируемых функций.
                  Ключевое слово EXPORTS отмечает начало определений. После него
                  может следовать любое число определений экспорта, каждое в отдельной строке. Оператор имеет синтаксис:
                  EXPORTS
                  имя_эксп [номер] [RESIDENTNAME] [параметр]
                  где "имя_эксп" задает строку ASCII, которая определяет экспортируемый идентификатор. Она имеет следующую форму:
                  имя_точки_входа [=внутр_имя]
                  где "внутр_имя" является именем, используемым внутри прикладной
                  программы для ссылки на эту точку входа. "Имя_точки_входа" является именем, приведенным в таблице точек входа выполняемого файла, и может быть "видимо" извне.
                  "Номер" определяет значение перечисления функции. Оно имеет
                  следующую форму:
                  @номер
                  где "номер" является целым значением, которое определяет значение
                  перечисления функции.
                  Когда модуль прикладной программы или модуль DLL вызывает
                  функцию, экспортируемую из DLL, вызывающий модуль может ссылаться
                  на функцию по имени или по значению перечисления. С точки зрения
                  скорости, ссылка на функцию по перечислению является более быстрой, так как сравнения строк не требуют определения местоположения функции. С точки зрения распределения памяти, экспортирование
                  функции по перечислению (с точки зрения DLL этой функции) и импортирование/вызов функции по перечислению (с точки зрения модуля
                  вызова) являются более эффективными.
                  Когда функция экспортируется по номеру, имя располагается в
                  нерезидентной таблице имен, а когда по имени, то в резидентной
                  таблице имен. Резидентная таблица имен для модуля является резидентной в памяти всякий раз, когда модуль загружен; с нерезидентной таблицей имен этого не происходит.
                  Параметр RESIDENTNAME позволяет указывать, что имя функции
                  должно быть всегда резидентным. Это используется только тогда,
                  когда производится экспортирование по перечислению (когда имя не
                  будет резидентным по умолчанию).
                  "Параметр" является необязательным целым значением, задающим
                  число слов, ожидаемых функцией в качестве параметров.


                  Оператор IMPORTS


                  IMPORTS определяет имена и атрибуты функций, импортируемых
                  из библиотеки динамической компоновки. Вместо перечисления функций DLL в IMPORTS, вы можете задать библиотеку импорта для DLL в
                  командной строке TLINK или (в IDE) включить библиотеку импорта
                  для DLL в проект.
                  Ключевое слово IMPORTS указывает начало определений. После
                  него может идти любое число определений импорта, каждое в отдельной строке. Оператор имеет синтаксис:
                  IMPORTS [внутр_имя=]имя_модуля.точка_входа
                  где "внутр_имя" является строкой ASCII, определяющей уникальное
                  имя, которое будет использоваться прикладной программой для вызова функции.
                  Поле "имя_модуля" задает один или несколько символов ASCII в
                  верхнем регистре, которые определяют имя выполняемого модуля, со-
                  держащего функцию. Имя модуля должно быть согласовано с именем
                  исполнимого файла. Например, файл SAMPLE.DLL имеет имя модуля
                  SAMPLE.
                  Поле "точка_входа" задает импортируемую функцию. Она может
                  быть строкой ASCII, которая именует функцию, или целым, которое
                  задает значение перечисления функции.


                  Оператор LIBRARY


                  LIBRARY определяет имя модуля DLL. Файл определения модуля
                  может содержать или оператор NAME для указания прикладной программы или утверждение LIBRARY для указания DLL, но не оба оператора одновременно.
                  Подобно имени модуля прикладной программы, имя модуля библиотеки должно соответствовать имени выполняемого файла. Например,
                  библиотека MYLIB.DLL имеет имя модуля MYLIB. Оператор имеет следующий синтаксис:
                  LIBRARY имя_библиотеки [INITGLOGAL INITINSTANCE]
                  где "имя_библиотеки" задает строку ASCII, которая определяет имя
                  модуля библиотеки. Если вы не указываете имя, то TLINK использует
                  имя исходного файла без расширения. Если файл определения модуля
                  не содержит операторов NAME или LIBRARY, то TLINK подразумевает
                  оператор NAME без параметра имени библиотеки.
                  INITGLOBAL означает, что подпрограмма инициализации модуля
                  вызывается только при первой загрузки библиотечного модуля в память. INITINSTANCE означает, что подпрограмма инициализации модуля вызывается каждый раз, когда новый процесс использует библиотеку.


                  Оператор NAME


                  NAME определяет имя выполняемого модуля прикладной программы. Имя модуля идентифицирует модуль, который экспортирует функции. Оператор имеет синтаксис:
                  NAME имя_модуля [WINDOWSAPI] [WINDOWCOMPAT]
                  где "имя_модуля" задает один или несколько символов ASCII в
                  верхнем регистре, которые определяют имя выполняемого модуля. Имя
                  модуля должно соответствовать имени выполняемого файла. Например,
                  прикладная программа с выполняемым файлом SAMPLE.EXE имеет имя
                  модуля SAMPLE.
                  Параметр "имя_модуля" не является обязательным. Если параметр не включен, TLINK считает, что имя модуля соответствует имени выполняемого файла. Например, если вы не задали имя модуля, а
                  выполняемый файл имеет имя MYAPP.EXE, то TLINK считает, что модуль имеет имя MYAPP.
                  Если файл определения модуля не включает ни утверждения
                  NAME, ни утверждения LIBRARY, TLINK использует утверждение NAME
                  без параметра "имя_модуля".
                  WINDOWSAPI задает выполняемый файл Windows (эквивалент пара-
                  метра /aa TLINK32).
                  WINDOWCOMPAT определяет совместимый с Windows выполняемый
                  файл символьного режима (эквивалент параметр /ap TLINK32).


                  Оператор SEGMENTS


                  SEGMENTS определяет атрибуты добавочных сегментов кода и
                  данных и имеет синтаксис:
                  SEGMENTS
                  имя_сегмента [CLASS 'имя_класса'] [мин_распр]
                  [SHARED NONSHARED]
                  [PRELOAD LOADONCALL]
                  где имя_сегмента задает символьную строку, именующую новый сегмент. Это может быть любое имя, включая стандартные имена сегментов _TEXT и _DATA, представляющее стандартные сегменты кода и данных.
                  Поле "имя_класса" является необязательным ключевым словом,
                  задающим имя класса для указанного сегмента. Если не задано имя
                  класса, то TLINK использует стандартное имя класса CODE.
                  Поле "мин_распр" является необязательным целым значением,
                  задающим минимальный размер распределения для сегмента. Обычно
                  TLINK это значение игнорирует.
                  SHARED (задается по умолчанию для 16-разрядных DLL) означает, что одна копия сегмента совместно используется процессами.
                  NONSHARED (задается по умолчанию для программ и 32-разрядных DLL)
                  означает, что каждого процесса требуется своя копия сегмента.
                  PRELOAD означает, что сегмент загружается сразу же;
                  LOADONCALL означает, что сегмент загружается, когда к нему происходит обращение или осуществляется доступ (в TLINK32 игнорируется). Компилятор ресурсов может переопределить параметр LOADONCALL и загружать сегменты предварительно.


                  Оператор STACKSIZE


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


                  Оператор STUB


                  STUB присоединяет выполняемый файл DOS, заданный с помощью
                  поля "имя_файла", в начало модуля. Если пользователь не загрузил
                  Windows, то выполняемый фиктивный модуль должен выдавать предупреждающее сообщение и прекращать выполнение программы.
                  Если в операторе STUB не указан другой фиктивный модуль,
                  Borland C++ добавляет в начало прикладной программы встроенный
                  фиктивный модуль. Поэтому, оператор STUB не нужно использовать
                  для того, чтобы просто включить WINSTUB.EXE, так как компоновщик
                  будет делать это для вас автоматически.
                  Оператор имеет синтаксис:
                  STUB "имя_файла"
                  где "имя_файла" задает имя выполняемого файла DOS, который будет
                  присоединен к модулю. Имя должно иметь формат файла DOS.
                  Если файл с именем "имя_файла" не находится в текущем каталоге, TLINK ищет файл в каталогах, заданных с помощью пользовательской переменной среды PATH.


                  Описание и определение таблиц реакции


                  Поскольку таблица реакции является членом класса ObjectWindows, вы должны описать эту таблицу при определении класса. ObjectWindows предусматривает для этого макрокоманду DECLARE_RESPONSE_TABLE, имеющую единственный аргумент - имя класса, для которого описывается таблица реакции. Добавьте эту макрокоманду в
                  конец определения класса.
                  После описания таблицы реакции вы должны определить ее (вне
                  определения класса). Помочь вам в этом может макрокоманда DEFINE_RESPONSE_TABLEx, где x зависит от наследования класса и равно
                  числу его непосредственных базовых классов. Данная макрокоманда
                  имеет x+1 аргумент - имя класса, для которого определяется таблицей, и имена каждого непосредственного базового класса. Таблица
                  реакции заполняется записями и завершается макрокомандой END_RESPONSE_TABLE. Приведем пример:
                  DEFINE_RESPONSE_TABLE(TMyFrame, TFrameWindow)
                  EV_WM_LBUTTONDOWN,
                  EV_WM_LBUTTONUP,
                  EV_WM_MOOUSEMOVE,
                  EV_WM_RBUTTONDOWN,
                  EV_WM_RBUTTONUP,
                  END_RESPONSE_TABLE;


                  Описание операций


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


                  Определение буфера передачи


                  Буфер передачи - это структура, каждый элемент которой соответствует участвующему в передаче управляющему элементу. Эти элементы называются переменными экземпляра. В передаче могут участвовать не все управляющие элементы.
                  Чтобы определить буфер передачи, определите для каждого
                  участвующего управляющего элемента переменную экземпляра. Каждый
                  тип управляющего элемента имеет разную информацию для хранения.
                  Так как блокам списков требуется передавать различные части
                  информации (строки, элементы данных и индексы выбора), буфер передачи использует класс TListBoxData с несколькими функциями-элементами для работы с информацией блока списка (AddItemData, AddString, AssStringItem, GetSelString, GetSelStringLenght, ResetSelections, Select и SelectString) и элементами данных (ItemDatas,
                  SelIndices и Strings).
                  Для передачи данных комбинированного блока используется
                  класс TComboBoxData с элементами данных ItemDatas, Selection и
                  Strings и функциями-элементами AddItemData, AddString и AddStringItem.


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


                  Макроопределение имеет следующую форму:
                  имя_макрокоманды = текст_макрорасширения
                  Здесь "имя_макрокоманды" представляет имя данной макрокоманды. "Имя_макрокоманды" должно являться строкой из букв и цифр, не
                  содержащей символов пробела, хотя пробелы между "именем_макрокомандЫ" и знаком равенства (=) допустимы. "Текст_макрорасширения"
                  представляет собой произвольную строку, содержащую буквы, цифры,
                  символы пробела и знаки пунктуации. Эта строка завершается символом перехода на новую строку.
                  Если "имя_макрокоманды" уже было определено ранее (либо с
                  помощью макроопределения в формирующем файле, либо с помощью параметра -D командной строки утилиты MAKE), то новое описание макрокоманды заменяет старое.
                  При задании макрокоманд регистр букв учитывается; то есть,
                  model, Model и MODEL определяют разные макрокоманды.


                  Определение соответствующего окна или диалогового блока


                  Окно или диалоговый блок, использующие механизм передачи,
                  должны строить свои объекты управляющих элементов в том порядке,
                  в котором определены элементы соответствующего буфера передачи.
                  Для разрешения передачи используйте вызов SetTransferBuffer с
                  указателем на буфер передачи.
                  Так как объекты диалоговых окон получают свои определения и
                  определения своих управляющих элементов из ресурса, вам следует
                  строить объекты управляющих элементов с помощью конструкторов,
                  использующих идентификаторы ресурса. Чтобы явно исключить управляющий элемент из механизма передачи, используйте функцию-элемент
                  DisableTransfer.
                  Для управляющих элементов, которые строятся в окне, механизм
                  передачи по умолчанию запрещен. Чтобы разрешить его, вызовите
                  функцию-элемент EnableTransfer.


                  Определение записей таблицы реакции


                  Записи таблицы реакции связывают событие Windows с конкретной функцией. Когда окно или управляющий элемент получает сообщение, оно проверяет свою таблицу реакции и находит запись для данного сообщения. Если она присутствует, то сообщение передается
                  данной функции. Если нет, то оно передается выше родительскому
                  объекту, и выполняется обработка, предусмотренная в ObjectWindows
                  по умолчанию. ObjectWindows предусматривает для таблицы реакции
                  набор макрокоманд:
                • Макрокоманды стандартных сообщений, которые позволяют обрабатывать командные сообщения и маршрутизировать их заданной функции.

                • Стандартные макрокоманды Windows для обработки сообщений
                  Windows.

                • Зарегистрированные макрокоманды (сообщения, возвращаемые
                  RegisterWindowMessage).

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

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

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

                • Уведомления управляющих элементов VBX.



                • Опрос объектов меню


                  TMenu имеет ряд функций-элементов и операций, с помощью которых вы можете получать информацию об объекте и его меню. Это operator UINT и operator HMENU (возврат описателя меню), IsOK (проверка допустимости описателя меню), GetMenuItemCount (число
                  пунктов меню), GetMenuCheckMarkDimensions (размер битового массива для вывода отметки меню), GetMenuItemID (идентификатор пункта в заданной позиции), GetMenuState (флаги состояния заданного пункта), GetMenuString (текст заданного пункта меню), GetSubMenu
                  (описатель меню в заданной позиции).


                  Оптимальное использования оверлеев Borland C++


                  Для полного использования преимуществ оверлейных структур,
                  создаваемых Borland C++, сделайте следующее:
                • Минимизируйте резидентный код (резидентные библиотеки исполняющей системы, обработчики прерываний и драйверы устройств).

                • Установите размер оверлейного пула таким образом, чтобы
                  добиться наиболее комфортных условий для создаваемой программы (начните со 128К и регулируйте этот размер вверх и
                  вниз, пока не установите желаемое соотношение между быстродействием и размером программы).

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



                • Организация класса GDI


                  Большинство классов, инкапсулирующих функциональные возможности GDI, являются производными от класса TGdiObject. Это абстрактный класс для объектов GDI ObjectWindows. Он обеспечивает
                  базовый деструктор, операцию преобразования HGDIOBJ и базовую
                  функцию GetObject.
                  Другими классами GDI ObjectWindows являются классы:
                • TDC - корневой класс для инкапсуляции контекста устройства
                  GDI ObjectWindows. Вы можете создать объект TDC непосредственно или в производных классах, определив более специализированное поведение.

                • TPen реализует функциональные возможности перьевых объектов Windows. Вы можете построить объект пера сначала или
                  используя существующий оператор пера, объект пера или логическое перо.

                • TBrush реализует объекты кисти Windows. Вы можете построить специальную кисть, создать непрерывную, стилизованную
                  или шаблонную кисть, или использовать описатель существующей кисти, объект кисти или логическую кисть.

                • TFont позволяет вам легко использовать шрифты Windows. Вы
                  можете построить шрифт со специальной спецификацией, либо
                  задать существующий описатель шрифта, объект шрифта или
                  логический шрифт (структуру LOGFONT).

                • TPalette инкапсулирует палитру GDI. Вы можете построить
                  новую палитру или использовать существующие таблицы цветов
                  из различных DIB.

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

                • TRegion определяет область окна. Вы можете построить области различной формы. Это псевдо GDI-объект, он не является производными от TGdiObject.

                • TIcon инкапсулирует пиктограммы Windows. Вы можете построить пиктограмму из ресурса или на основе явной информации.

                • TCursor инкапсулирует курсор Windows. Вы можете построить
                  курсор из ресурса или на основе явной информации.

                • TDib инкапсулирует класс битового массива, независимого от
                  устройства (DIB). DIB не имеет не имеет описателя Windows.
                  Это просто структура, содержащая формат и информацию о палитре, а также битовый набор. Этот класс обеспечивает удобный способ, работы с DIB, как и другие объекты GDI.

                • Многие из функций классов GDI ObjectWindows могут показаться
                  вам знакомыми, но это не совсем так. Поскольку классы GDI ObjectWindows дублируют функции многих объектов Windows, то существующая терминология сохранилась. Однако в функции внесены некоторые улучшения.


                  Основные типы


                  Непосредственно поддерживаются основные типы char, short,
                  int, long, char* (интерпретируется как строка), float, double,
                  long double и void*. Интегральные типы форматируются в соответствии заданными по умолчанию типами для printf (если вы не изменили эти правила установками флагов ios).


                  Отладка библиотек DLL


                  Динамически компонуемая библиотека DLL - это библиотека
                  подпрограмм и ресурсов, компонуемая с приложением Windows на этапе выполнения. Это позволяет подпрограммам использовать одну копию подпрограмм, ресурсов и драйверов устройств. Когда приложению
                  требуется доступ к DLL, Windows проверяет, загружена ли DLL в память. Если это так, то вторая копия не загружается.
                  DLL может загружаться программой в память двумя различными
                  способами:
                • при загрузке программы (DLL загружается при статической
                  компоновке ее с программой с помощью утилиты IMPLIB);

                • когда ваша программа обращается с вызовом LoadLibrary.



                • Отладка драйвера устройства


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

                • С помощью утилиты TDSTRIP (см. файл TD_UTILS.TXT) выделите из драйвера устройства отладочную информацию.

                • Скопируйте драйвер устройства на удаленную систему.

                • Измените файл CONFIG.SYS удаленной системы, чтобы он загружал драйвер удаленной системы. Затем перезагрузите уда ленную систему.

                • Для получения адреса драйвера загрузите на удаленной системе TDMEM.

                • Загрузите на удаленной системе TDREMOTE.

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

                • Загрузите в отладчике с помощью команды File Symbol Load
                  таблицу идентификаторов драйвера устройства.

                • Используйте команду File Table Relocate для помещения
                  первого идентификатора из таблицы идентификаторов в соответствующую ячейку памяти. Таким образом, имеющаяся ин формация об идентификаторах будет соответствовать вашему
                  коду (программе). Для этого в ответ на подсказку отладчика задайте адрес сегмента Seg вашей резидентной программы, который можно определить с помощью TDMEM.

                • Задайте в начале драйвера устройства точку останова.

                • Выберите команду File Resident, чтобы сделать резидентным
                  сам отладчик. Это не нарушит резидентности вашего драйвера: когда он будет выполняться в отладчике, он сам станет
                  резидентным при загрузке удаленной системы в результате
                  выполнения файла CONFIG.SYS. Единственная резидентной
                  загрузки отладчика заключается в том, что вы можете перейти обратно в DOS и вызвать ваш драйвер устройства.

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

                • Когда в вашей программе-драйвере встретится точка останова, инициализируется отладчик, а код вашей программы вы ведется в соответствующей точке. Теперь вы можете начать
                  отладку вашей программы. (Кроме того, вы можете повторно
                  войти в отладчик из DOS, дважды нажав клавиши Ctrl-Bre ak.)



                • Отладка кода запуска DLL


                  Когда ваша программа загружает DLL, выполняется код запуска
                  DLL. По умолчанию Turbo Debugger не выполняет по шагам этот код.
                  Однако, если вам нужно проверить корректность загрузки DLL, то
                  нужно отладить код запуска. Отладчик позволяет отлаживать два вида такого кода: код инициализации, непосредственно следующий за
                  LibMain (по умолчанию) и скомпонованный с DLL код ассемблера.
                  Этот код инициализирует процедуры запуска и эмулирует математические пакеты (этот режим отладки выбирается параметром -l командной строки отладчика).
                  Чтобы начать отладку кода запуска DLL, нужно перезагрузить
                  программу (Run Program Reset или F2), а затем выполнить следующие
                  шаги:
                • вывести диалоговое окно Load Module Source or DLL Symbols (F3);

                • подсветите в блоке списка DLL & Programs DLL, код запуска
                  которой вы хотите отладить;

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

                • повторите эти шаги, если нужно задать отладку для нескольких DLL;

                • для перезагрузки приложения выберите команду Run Program
                  Reset или F2.

                • При отладке имейте в виде следующее:
                • Перед перезагрузкой текущего приложения выполняйте до конца код запуска DLL, иначе Windows может зависнуть.

                • Установка точек останова на первой строке приложения или
                  первой строке после вызова LoadLibrary гарантирует возврат
                  управления в Turbo Debugger.

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



                • Отладка мультинитевых программ


                  Окно Thread, которое открывается по команде View Thread,
                  поддерживает мультинитевую среду Windows NT. Это окно содержит
                  три области: списка нитей, детализации и информационную.
                  В информационной области перечисляется общая информация о
                  нити. Поле Last указывает последнюю нить, выполненную перед передачей управления в Turbo Debugger, поле Current показывает нить,
                  которая выводится в окнах отладчика, поле Total - общее число активных программных нитей, а поле Notify - Yes или No для статуса
                  Notifu или Termination отдельных нитей. Общий статус устанавливается с помощью команды All Threads.


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


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


                  Отладка объектно-ориентированных программ


                  В Turbo Debugger предусмотрен ряд средств для отладки объектно-ориентированных программ С++.


                  Отладка оверлейных программ


                  Большинство отладчиков либо имеет весьма ограниченные средства отладки программ с оверлейной структурой, либо вообще не имеет таких средств. Иначе дело обстоит с интегрированным со средой
                  разработки программ отладчиком Borland C++ и автономным отладчиком фирмы Borland (Turbo Debugger). Оба эти отладчика полностью
                  поддерживают пошаговую отладку и установку точек останова в оверлеях совершенно "прозрачным" для вас способом. Благодаря использованию оверлеев вы имеете возможность легко разрабатывать и отлаживать громоздкие прикладные программы - как в интегрированной
                  среде, так и при помощи Turbo Debugger.


                  Отладка программ ObjectWindows


                  Если вы применяете TDW для отладки программ, использующих
                  ObjectWindows 1.0х, то нужно конфигурировать отладчик, чтобы он
                  распознавал систему диспетчеризации сообщений Objecwindows DDVT.
                  Для этого запустите TDWINST, для вывода диалогового окна Source
                  Debugging выберите команду Options Source Debugging, включите
                  кнопку с независимой фиксацией OWL 1.0X Window Messages, затем
                  сохраните конфигурацию и выйдите из TDWINST.


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


                  Отладка рабочей части резидентной программы эквивалентна отладке любого другого файла. Новое появляется только тогда, когда
                  вы начинаете отлаживать резидентную часть. Давайте рассмотрим
                  процесс отладки резидентной программы.
                  С помощью Turbo Debugger вы можете отлаживать драйвер клавиатуры. При этом для перемещения по отладчику пользуйтесь "мышью".
                • При компиляции или ассемблировании резидентной программы
                  обеспечьте наличие в ней отладочной информации.

                • Запустите отладчик и загрузите программу.

                • Установите точку останова в начале резидентной части кода.

                • С помощью команды Run Run запустите рабочую часть программы.

                • Отладьте рабочую часть программы с помощью обычных методов.

                • Затем выйдите из TSR. Резидентная часть остается в памяти.

                • Чтобы сделать резидентным отладчик, выберите команду File Resident. На TSR это не повлияет. После этого вы можете вернуться в DOS и вызвать TSR.

                • В командной строке DOS нажмите оперативные клавиши вызова
                  резидентной программы и работайте с ней как обычно.

                • Выйдите из TSR. Теперь выполняется резидентная часть TSR,
                  и отладчик обнаруживает точку останова. Вы можете отлаживать резидентный код.

                • Второй метод отладки резидентной части TSR предусматривает выполнение ее из командной строки DOS и использование
                  окна CPU отладчика для отладки содержащей TSR области ОЗУ.
                • Скомпилируйте программу с отладочной информацией.

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

                • Запустите TSR из командной строки.

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

                • Загрузите отладчик и с помощью команды File Symbol Load
                  загрузите таблицу идентификаторов TSR (файл .TDS).

                • Установите в начале резидентной части TSR точку останова.

                • Чтобы сделать отладчик резидентным, выберите команду File Resident.

                • В командной строке DOS выполните резидентную часть TSR,
                  нажав ее оперативную клавишу, и работайте с программой



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

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

                  друга на корректное число байт, но абсолютный адрес первого идентификатора не определен, так как DOS загрузила

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

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


                • Используйте команду File Table Relocate для помещения

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

                  коду (программе). Для этого в ответ на подсказку отладчика задайте адрес сегмента Seg вашей резидентной программы, который определен с помощью утилиты TDMEM, плюс шестнадцатиричное значение 10 (для PSP размером 256 байт).


                • Дизассемблированные из памяти операторы синхронизированы

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

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

                • Для перехода к сегменту оперативной памяти, где находится

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

                  (клавиши Ctrl-G). Это можно сделать, используя адрес сегмента вашей программы TSR, за которым следует смещение

                  0000H, или с помощью перехода на конкретную метку вашей

                  программы.


                • Отладьте резидентную часть программы.


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


                  С помощью TD.EXE вы можете отлаживать не только обычные выполняемые файлы, но также резидентные в памяти программы (TSR) и
                  драйверы устройств. Вы можете кроме того выполнять сам отладчик,
                  как резидентную программу (в то время, как работаете на уровне
                  DOS или запускаете другие программы).


                  Отладка в Windows


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


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


                  По умолчанию программа Borland C++ в случае переполнения или
                  деления на ноль в операциях с плавающей точкой аварийно прерывается. Вы можете замаскировать эти особые ситуации для операций с
                  плавающей точкой, вызывая в main _control87 перед любой операцией
                  с плавающей точкой. Например:
                  #include
                  main() {
                  _control87(MCW_EM,MCW_EM);
                  ...
                  }
                  Можно определить особую ситуацию для операции с плавающей
                  точкой, вызвав функции _status87 или _clear87.
                  Определенные математические ошибки могут также произойти в
                  библиотечных функциях, например, при попытке извлечения квадратного корня из отрицательного числа. По умолчанию в таких случаях
                  выполняется вывод на экран сообщений об ошибке и возврат значения
                  NAN (код IEEE "not-a-number" - "не число"). Использование NAN
                  (нечисловых значений) скорее всего приведет далее к возникновению
                  особой ситуации с плавающей точкой, которая в свою очередь вызовет, если она не замаскирована, аварийное прерывание программы.
                  Если вы не желаете, чтобы сообщение выводилось на экран, вставьте
                  в программу соответствующую версию matherr.
                  #include
                  int cdecl matherr(struct exception *e)
                  {
                  return 1; /* ошибка обработана */
                  }
                  Любое другое использование matherr для внутренней обработки
                  математических ошибок недопустимо, так как она считается устаревшей и может не поддерживаться последующими версиями Borland C++.


                  Отображаемые элементы


                  Объекты отображаемых элементов служат для представления объектов документов. Без такого объекта вы не могли бы видеть документ и работать с ним. Когда вы в шаблоне документа связываете
                  документ с объектом отображаемого элемента, то получаете функциональный блок данных и кода, которые обеспечивает графическое
                  представление записанных в документе данных и способ взаимодействия с этими данными и их изменения.
                  Отделение документа от отображаемого элемента допускает также значительную гибкость в том, как и когда модифицируются данные
                  документа. Хотя работа с данными осуществляется через отображаемый элемент, отображаемый элемент только передает изменения в документ. Затем он позволяет определить, нужно ли зафиксировать изменения в документе, или отбросить их.
                  Еще одно преимущество использования объектов отображаемых
                  элементов по сравнению с методом фиксированного вывода текста
                  состоит в том, что такие объекты предлагают программисту и пользователю ряд различных способов вывода и работы с одним и тем же
                  документом. Вы можете предусмотреть для документа три или четыре
                  отображаемых элемента.
                  Базовые функции отображаемого элемента обеспечивает класс
                  TView.


                  Отображение интерфейсного элемента


                  Создание объекта и соответствующего элемента не означает,
                  что вы будете что-то видеть на экране. Когда создается интерфейсный элемент, Windows проверяет, включает ли стиль элемента WS_VISIBLE. Если да, то он выводится на экран. В противном случае элемент создается, но не выводится. WS_VISIBLE и другие стили устанавливаются или сбрасываются в конструкторе, путем их установки
                  или сброса в элементе данных интерфейсного объекта Attr.Style.
                  Создаваемый интерфейсный элемент выводится на экран только в случае установки стиля WS_VISIBLE.
                  Определить видимость интерфейсного объекта можно с помощью
                  вызова IsWindowVisible. В случае видимости объекта эта функция
                  возвращает True.
                  В любое время после создания, элемент может быть показан или
                  спрятан вызовом функции-элемента интерфейсного объекта Show.


                  Отслеживание версий объектов


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


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


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

                • Шаблоны функций.

                • Функции-элементы или шаблоны классов.

                • Конструкция обработки исключительной ситуации включает в себя написанный пользователем блок try/catch и __try/__except. Кроме того, компилятор также может включать обработчики исключительных ситуаций и блоки с локальными динамическими переменными, спецификациями исключительных ситуаций и некоторые выражения new/delete.
                  Если вы пытаетесь использовать в оверлее вышеуказанные конструкции обработки исключительных ситуаций, компоновщик идентифицирует функцию и модуль следующим сообщением:
                  Error: Illegal local public in функция in module модуль
                  Когда эта ошибка вызывается подставляемой функцией, вы можете переписать функцию таким образом, чтобы она не была подставляемой. Если это вызвано шаблоном функции, можно сделать следующее:
                • удалить из функции все конструкции обработки исключитель ной ситуации;

                • удалить функцию их оверлейного модуля.

                • Особенно внимательно нужно строить оверлейную программу, которая использует множественное наследование. Попытка создать
                  оверлейный модуль, который определяет или использует конструкторы
                  или деструкторы классов с множественным наследованием может привести к тому, что компоновщик будет генерировать следующее сообщение об ошибке:
                  Error: Illegal local public in класс: in module модуль
                  Когда генерируется такое сообщение, идентифицированный компоновщиком модуль не следует делать оверлейным.
                  В классе контейнера (в BIDS?.LIB) есть механизм обработки
                  исключительной ситуации, который по умолчанию выключен. Однако
                  диагностическая версия генерирует исключительные ситуации и не
                  может использоваться в оверлеях. По умолчанию класс string может
                  генерировать исключительные ситуации, и его не следует использовать в программах с оверлеями.


                  Оверлеи (VROOMM)


                  Оверлеями называются части кода программы, совместно использующие общую область памяти. Одновременно в памяти находятся
                  только те части программы, которые в текущий момент нужны данной
                  функции.
                  Оверлеи могут существенно снизить во время выполнения программы требования к выделяемой программе памяти. При помощи оверлеев можно создавать программы, значительно превышающие по размеру общую доступную память системы, поскольку одновременно в памяти находится лишь часть данной программы.
                  Оверлеи используются только в 16-разрядных программах DOS. В
                  приложениях Windows для сокращения объема используемой памяти вы
                  можете пометить сегменты как Discardable (выгружаемые).


                  _Ovrbuffer (dos.h)


                  Данная переменная изменяет размер оверлейного буфера и имеет
                  следующий синтаксис:
                  unsigned _ovrbuffer = size;
                  Используемый по умолчанию размер оверлейного буфера равен удвоенному размеру наибольшего оверлея. Для большинства приложений этого достаточно. Однако конкретная функция программы может реализовываться через несколько модулей, каждый из которых является оверлейным. Если общий размер этих модулей больше оверлейного буфера, то при частом вызове модулями друг друга будет происходить
                  дополнительный свопинг.
                  Решением здесь будет увеличения размера оверлейного буфера,
                  так что в каждый момент времени памяти будет достаточно, чтобы
                  вместить все оверлеи с частыми перекрестными вызовами. Сделать
                  это можно с помощью установки в требуемый размер (в параграфах)
                  глобальной переменной _ovrbuffer в 128К:
                  unsigned _ovrbuffer = 0x2000;
                  Для определения оптимального размера оверлейного буфера общего метода не существует.


                  - P-

                  Память и списки модулей


                  В TDW вы можете записать в окно Log содержимое глобальной
                  и локальной динамической памяти или список используемых программой модулей. Окно Windows Information (доступное с помощью команды Display Windows Info в SpeedMenu окна Log) позволяет выбрать тип выводимого списка и где вы хотите его начать.
                  Глобальная динамически распределяемая область памяти - это
                  память, которую Windows делает доступной для всех приложений. Эта
                  память используется при распределении ресурсов. Чтобы увидеть
                  список объектов данных в глобальной области, выберите в Windows
                  Information кнопку с зависимой фиксацией Global Heap и щелкните
                  "мышью" на OK. Объекты данных выводятся в окне Log.
                  Кнопка с зависимой фиксацией Start At позволяет вам выводить
                  список с нужного места динамически распределяемой области (с начала, с конца или с места, заданного начальным описателем, устанавливаемым вызовом GlobalAlloc).
                  Чтобы вывести список всех задач и модулей DLL, загруженных в
                  Windows, выберите в диалоговом окне Windows Information кнопку
                  Module List, затем OK. Модули будут перечисляться в окне Log.


                  Параметр быстрых вычислений с плавающей точкой


                  Borland C++ имеет параметр быстрых вычислений с плавающей
                  точкой (параметр компилятора режима командной строки -ff). Выключить этот параметр можно при помощи параметра командной строки
                  -ff-. Его назначение состоит в выполнении некоторой оптимизации,
                  противоречащей правильной семантике языка Си. Например:
                  double x;
                  x = (float)(3.5*x);
                  Для вычисления по обычным правилам x умножается на 3.5, давая точность результата double, которая затем усекается до точности float, после чего x записывается как double. При использовании параметра быстрых вычислений с плавающей точкой произведение типа long double преобразуется непосредственно в double. Поскольку лишь очень немногие программы чувствительны к потере точности при преобразовании от более точного к менее точному типу с
                  плавающей точкой, то данный параметр используется по умолчанию.


                  Параметр совместимости -N


                  Параметр командной строки -N увеличивает совместимость с
                  утилитой фирмы Microsoft NMAKE. Его следует использовать только в
                  том случае, если вам требуется построить проект с использованием
                  формирующих файлов, созданных для утилиты NMAKE. Предпочтительнее
                  запускать утилиту MAKE без параметра -N, так как данный параметр
                  вносит в утилиту MAKE некоторые трудноуловимые отличия:
                • $$ расширяется в один символ $, а $ расширяется в "пусто".

                • Символ каре (^) приводит к литеральной обработке последующего символа, если это специальный символ. Например, макрокоманда:
                  TEST = this is ^
                  a test
                  приведет к тому, что TEST будет расширяться в this is \na
                  test, где \n - это символ языка Си перевода на новую строку. Это особенно полезно, когда вам нужно закончить строку символом продолжения строки:
                  SOURCEDIR = C:\BOB\OBJ^\

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

                • Макрокоманда $d не будет специально определяемой текстовой
                  макрокомандой. Используйте вместо нее директивы !ifdef и
                  !ifndef.

                • Предопределенные макрокоманды, которые возвращают маршрут,
                  не будут заканчиваться обратной косой чертой. Например,
                  без параметра -N переключатель $( C:\OBJS\, а с параметром -N переключатель $( бы C:\OBJS.

                • Без соответствующей директивы .suffixes утилита MAKE будет
                  искать неявные правила от конца формирующего файла к его
                  началу.

                • Макрокоманда $* всегда расширяется в имя целевого файла.
                  (В обычном режиме $* расширяется в имя файлов зависимостей
                  в неявном правиле.)



                • Параметр TLINK


                  Если не указано обратное, описываемые ниже параметры действуют как для TLINK, так и для TLINK32. Регистр параметров различается. Перед параметрами нужно указывать - или /. Отключить заданный по умолчанию параметр можно указанием после него символа
                  "-", например -P-.

                  Параметр Команда IDE Linker Описание
                  /3 Linker 16-bit
                  Linker Enable 32-bit processing
                  Выполняет компоновку 32- разрядного кода, создаваемого TASM или совместимого с ним ассемблера.
                  /aa Target Attributes
                  Target Model
                  Задает целевое приложение
                  Windows.
                  /ap Target Attributes
                  Target Model
                  Задает целевое консольное
                  приложение.
                  /A:dd 16-bit Segment Alignment Задает выравнивание страницы в файле .EXE.
                  /B:xxxxxx 32-bit Linker Image base address Задает базовый адрес образа для 16-разрядных
                  приложений (в шестнадцатиричном виде).
                  /c General Case-sensitive link Различает регистр символов в идентификаторах.
                  /C General Case-sensitive exports, imports Различает регистр в секциях EXPORTS и IMPORTS файла определения модуля.
                  /d Warnings Warn duplicate symbol in .LIB Предупреждает о дублировании идентификатора в
                  библиотеке.
                  /E 16-bit Linker Process extended dictionaries Разрешает обработку в библиотеке расширенных
                  словарей.
                  /Enn 32-bit Linker Maximum linker errors Задает максимальное число
                  ошибок, после которого
                  обработка прекращается.
                  /e 16-bit Process extended Dictionaries Игнорирует расширенные
                  словари в библиотеках. (отмена)
                  /f 16-bit Linker Inhibit optimizing far to near Запрещает оптимизацию вызовов ближних данных.
                  /Gn 16-bit Linker Discard nonresident name table Выгрузка нерезидентной
                  таблицы имен.
                  /Gr 16-bit Transfer resident to nonresident table Преобразует резидентные
                  имена в нерезидентную
                  таблицу имен.
                  /Gm Map File Print mangled names in map file Включает в файл map правленные имена.
                  /i 16-bit Linker Initialize segments Инициализирует все сегменты.
                  /l Map File Include source line numbers Включает номера строк исходного текста.
                  /L Directory Library (кроме IDE) Задает маршруты поиска
                  библиотек.
                  /m Map File Public Создает файл map с общедоступными идентификаторами.
                  /m General Default Libraries Не использует заданные по
                  умолчанию библиотеки.
                  /o Overlay module (атри бутокна) Оверлейные модули или
                  узла диалогового библиотеки
                  /P General Pack code segments Упаковка сегментов кода.
                  /Rk Resource Pack fast load area (не в Linker) Задает параметры RLINK.

                  .EXE.
                  /Rv нет ресурсов. Расширенная компоновка
                  /Rexxxx нет Переименовывает выполняемый файл в xxxx.
                  /S:xxxxx 32-bit Linker Stack size Задает размер стека (в
                  шестнадцатиричном виде).
                  /s Map File Detailed Создает детальную схему
                  сегментов.
                  /t нет Создает файл .COM для
                  DOS (модель tiny).
                  /Tdc нет Построение файла .COM
                  DOS.
                  /Tde нет Построение файла .EXE
                  DOS.
                  /Tpc TargetExpert Platform Задает в качестве целевого приложения 32-разрядный файл .EXE.
                  /Tpd TargetExpert Platform Задает в качестве целевого приложения 32-разрядный файл .DLL.
                  /Twd TargetExpert Target Type Задает целевое приложение
                  Windows (файл .EXE).
                  /Twd TargetExpert Target Type Задает целевое приложение
                  Windows (файл .DLL).
                  /v General Include debug information Включает полную отладочную информацию.
                  /wxxx Уровень предупреждений Разрешает или запрещает
                  предупреждения.
                  /x Map File Off Не создает файл map.
                  /ye нет Использует для свопинга
                  дополнительную память.
                  /yx нет Использует для свопинга
                  TLINK расширенную память.



                  Параметр -WE


                  Параметр -WE создает объектный модуль, содержащий только
                  функции, отмеченные как _export. Так как в любом прикладном модуле многие функции экспортироваться не будут, компилятору нет необходимости включать начальный и завершающий код, пока функция не
                  будет указана как экспортируемая явным образом (с помощью ключевого слова _export). Все функции, не помеченные как _export, получают сокращенный начальный и завершающий код. В результате получается выполняемый файл меньшего размера и выполняющийся несколько быстрее.
                  Параметр -WE работает только в сочетании с ключевым словом
                  _export. Этот параметр не экспортирует данные функции, перечисленные в секции EXPORTS или в файле определения модуля. Фактически, этот параметр не работает в сочетании с секцией EXPORTS. В
                  этом случае компилятор будет генерировать начальный и завершающий
                  код, не совместимый с экспортируемыми функциями, и вызовы их приведут к некорректному поведению.


                  Параметр -WS


                  Параметр -WS создает объектный модуль с функциями, использующими эффективные обратные вызовы. Эта форма начального и завершающего кода подразумевает, что DS==SS, то есть используемый по
                  умолчанию сегмент данных совпадает с сегментом стека. Это устраняет необходимость использовать специальный код Windows, создаваемый для экспортируемых функций. Использование эффективных обратных вызовов может улучшить производительность, так как вызовы
                  функций в модуле не перенаправляются через специальный код
                  Windows).
                  Экспортируемым функциям, которые используют этот параметр,
                  не требуется ключевое слово _export. Их не нужно также перечислять в секции EXPORTS файла определения модуля, так как компоновщику не нужно создавать для них запись в выполняемом файле.
                  Когда вы используете функции, скомпилированные и скомпонованные с помощью эффективных обратных вызовов, вам не нужно вызывать перед ними функцию MakeProcInstance (которая переписывает
                  начальный код функции таким образом, что он использует эффективные обратные вызовы).
                  Для DLL эффективные обратные вызовы отсутствуют, так как для
                  DKLL DS != SS. Из-за предположения о равенстве DS == SS вы можете
                  использовать этот параметр только в приложениях. Кроме того DS не
                  следует изменять в программе явным образом (в любом случае в
                  Windows этого делать не следует).


                  Параметр -WSE


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


                  Параметры дочерних окон и отображаемых элементов MDI


                  Параметры дочерних окон и отображаемых элементов MDI определяют класс для дочернего окна или документа/отображаемого элемента.


                  Параметры генерации кода


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


                  Параметры идентификационной информации


                  Параметры идентификационной информации Admin Options идентифицируют информацию, помещаемую в начало всех генерируемых проектом файлов.


                  Параметры экспорта и импорта


                  Экспорт функции состоит из двух этапов. Во-первых, компилятор должен создавать для функции корректный начальный и завершающий код. Благодаря этому функция становится экспортируемой.
                  Во-вторых, компоновщик должен для каждой экспортируемой функции
                  создавать запись в заголовке выполняемого файла. Это позволяет в
                  16-разрядном режиме Windows связать с функцией на этапе выполнения корректный сегмент данных. В 32-разрядной Windows связывание
                  сегментов данных не применяется. Однако DLL должны иметь записи в
                  заголовке, благодаря которым загрузчик сможет найти функции для
                  компоновки при загрузке в .EXE библиотеки DLL.


                  Параметры клиентной области многодокументального интерфейса


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


                  Параметры клиентной области однодокументального интерфейса


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


                  Параметры командной строки


                  Параметры командной строки управляют поведением утилиты MAKE. Заметьте, что имеет значение регистр букв (верхний или нижний); параметр -d не является допустимой заменой параметру -D.
                  Кроме того, для указания параметров можно задавать либо косую
                  черту (/), либо дефис (-).

                  Параметр Действие
                  -? или -h Выводит информационное сообщение. Отображаются стандартные параметры, за которыми следует
                  знак плюс.
                  -B Осуществляет полную перекомпиляцию всех результирующих файлов вне зависимости от дат создания файлов.
                  -Dмакро Определяет "макро" как один символ - выражение !ifdef макро будет возвращать True.
                  [-D]ид=[стр] Определяет названный идентификатор "ид" как строку "стр", стоящую после знака равенства. Эта строка не может содержать ни пробелов, ни знаков табуляции.
                  -fимя_файла Использует "имя_файла" в качестве формирующего файла для утилиты MAKE. Если "имя_файла" не существует и не задано расширение имени файла, то утилита MAKE пытается найти файл FILENAME.MAK.
                  -Iкаталог Осуществляет поиск файлов включения в указанном каталоге (а также в текущем каталоге).
                  -K Сохраняет (не стирает) временные файлы, созданные утилитой MAKE. Все временные файлы имеют формат MAKEnnnn.$$$, где nnnn лежит в диапазоне от 0000 до 9999.
                  -N Выполняет MAKE как Microsoft NMAKE.
                  -Uидентиф Отменяет все заданные ранее описания названного идентификатора.
                  -W Заносит в файл MAKE.EXE заданные в настоящий момент нестроковые параметры (типа -s или -a).
                  -a Проверяет зависимости включаемых файлов и вложенных включаемых файлов, связанных с файлами .OBJ, и обновляет файл .OBJ, если файл .H изменен.
                  -c Кэширует информацию о зависимостях, что улучшает
                  производительность MAKE. Не используйте его с -a а также если MAKE изменяет включаемые файлы.
                  -dкаталог Используется с -S для задания диска и каталога, который MAKE использует для свопинга (для MAKER не действует).
                  -e Игнорирует макрокоманду, если ее имя совпадает с
                  именем переменной операционной среды.
                  -i Игнорирует состояние завершения всех запускаемых
                  из MAKE программ и продолжает процесс построения.
                  -m Выводит дату и время каждого файла при обработке
                  его MAKE.
                  -n Выводит команды, но не выполняет их (полезно использовать при отладке).
                  -p Перед выполнением формирующего файла выводит все макроопределения и неявные правила.
                  -q Возвращает 0, если цель имеет новую дату и время
                  и не 0 в противном случае (используется в командных файлах).
                  -r Игнорирует все правила, определенные в BUIL-
                  TINS.MAK.
                  -s Подавляет вывод команд на экран.
                  -S Выгружает MAKE из памяти при выполнении команд,
                  что уменьшает использование памяти и позволяет компилировать большие модули. Для MAKER не действует.



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



                  Параметр Команда IDE Описание
                  @имя_файла имя файла проекта Ввод компилятора считывается из указанного файла подсказки.
                  +имя_файла нет Используется указанный файл конфигурации.
                  -1 нет Указывает системе Borland C++, что нужно генерировать расширенный набор команд процессора 80186.
                  -2 16-bit Compiler Processor 80286 Указывает системе Borland C++, что нужно генерировать команды, совместимые с защищенным режимом работы процессора 80286.
                  -3 16-bit Compiler Processor 80386 Указывает системе Borland C++, что нужно генерировать 16-разрядные команды, совместимые с защищенным режимом работы процессора 80386.
                  -3 32-bit Compiler Processor 80386 Указывает системе Borland C++, что нужно генерировать 32-разрядные инструкции защищенного режима процессора 80386.
                  -4 16-bit Compiler Processor i486 Указывает системе Borland C++, что нужно генерировать 16-разрядные команды защищенного режима процессора 80486.
                  -4 32-bit Compiler Processor i486 Указывает системе Borland C++, что нужно генерировать 32-разрядные команды защищенного режима процессора 80486.
                  -5 32-bit Compiler Processor Pentium Указывает системе Borland C++, что нужно генерировать 32-разрядные команды защищенного режима процессора Pentium.
                  -A Compiler Source ANSI Согласование со стандартом ANSI.
                  -A-, -AT Compiler Source Borland extensions Согласование со стандартом Borland C++.
                  -AK Compiler Source Kernighan and Ritchie Согласование со стандартом языка, определенными Кегниганом и Риччи.
                  -AU Compiler Source UNIX V Согласование со стандартом языка UNIX V.
                  -an 16-/32-bit Compiler Processor Byte, Word, Double Word Выравнивание на n: 1=байт, 2=слово, 4=двойное слово (для 32-разрядного режима).
                  -a- 16-bit Compiler Processor Byte Выравнивание на 1 байт.
                  -B нет Компиляция и вызов ассемблера для обработки кода ассемблера.
                  -b Compiler Code Generation Allocate enums and ints Указывает компилятору, что для перечислимых типов всегда нужно выделять целое слово.
                  -b- Compiler Code Generation Allocate enums and ints (отмена) Этот параметр указывает компилятору, что нужно выделять
                  для перечислимого типа байтовый размер (когда это возможно).
                  -C Compiler Source Nested Comments Включает вложенные комментарии.
                  -C- Compiler Source Nested Comments (отмена) Выключает вложенные комментарии.
                  -c Компиляция в .OBJ без компоновки.
                  -Dимя Compiler Defines Определяет имя нулевой строкой.
                  -Dимя=стр Compiler Defines Определяет имя заданной строкой "стр".
                  -d Compiler Code Generation Duplicate strings merged Объединяет дублируемые строки.
                  -d- Compiler Code Generation Duplicate strings merged (отмена) Не объединяет дублируемые строки.
                  -dc 16-bit Compiler Memory Model Put strings in segments Перемещает строковые литералы из сегмента данных в сегмент кода (16-разрядный режим).
                  -eимя_файла Редактирования атрибутов узла в администраторе проекта. Компоновка для получения файла с указанными именем.
                  -Eимя_файла нет Использование указанного файла с указанными именем.
                  -Fc Compiler Compiler Output Generate COMDEFs Генерирует COMDEF.
                  -Ff 16-bit Compiler Memory Mode Automatic far data Автоматическое создание переменных (16-разрядный режим).
                  -Ff=размер 16-bit Compiler Memory Mode Far data Threshold Автоматическое создание переменных. Устанавливает порог в значение размера (16-разрядный режим).
                  -Fm нет Разрешает параметры -Fc, -Ff и -Fs.
                  -Fs Во всех моделях памяти предполагается, что DS=SS (только 16-разрядный режим).
                  -f Compiler Floating point No floating (отмена) Разрешает плавающую точку.
                  -f- Compiler Floating point No floating Запрещает плавающую точку.
                  -ff Compiler Floating point Fast floating point Быстрые операции с плавающей точкой.
                  -ff- Compiler Floating point Fast floating point (отмена) Операции с плавающей точкой
                  строго в формате ANSI.
                  -f87 нет Использование аппаратных инструкций 8087.
                  -f287 Использование аппаратных инструкций 80287 (для приложений DOS).
                  -G Optimizations Specific Executable Speed Оптимизация по скорости.
                  -G- Optimizations Specific Executable Size Оптимизация по размеру.
                  -gn Messages Stop after n warnings Предупреждения: остановка после n сообщений (по умолчанию 100).
                  -H Compiler Precompiled headers Generate and use Генерация и использование предварительно скомпилированных заголовков.
                  -Hc нет Кэширование предварительно скомпилированных заголовков. Используется с -H или -Hxxx.
                  -Hu Compiler Precompiled headers Use but don't generate Использовать, но не генерировать предварительно скомпилированные заголовки.
                  -H"xxx" Compiler Precom piled headers Stop precompiling after header Остановить генерацию предварительно скомпилированных заголовков в файле "xxx" (32-разряднгый режим). Долиспользоваться с параметрами -H, -Hu или -H=имя_файла.
                  -H=им_файла Compiler Precompiled headers Precompiled headers file name Задает имя файла для предварительно скомпилированных заголовков.
                  -h 16-bit Compiler Memory Model Fast huge pointers Использует быстрые арифметические операции с указателями huge (16-разрядный режим).
                  -lмаршрут Directories Include Задать маршрут поиска для
                  каталогов и включаемых файлов.
                  -in Compiler Source Identifier length Определяет длину идентификаторов как n символов (по умолчанию 32).
                  -Jg C++ Options Template Smart Генерирует определения для
                  всех экземпляров шаблонов и
                  объединяет дубликаты.
                  -Jgd C++ Options Template Global Генерирует определения public для всех экземпляров
                  шаблонов и дублирует результат в случае ошибок переопределения.
                  -Jgx C++ Options Templates External Для всех экземпляров шаблонов генерирует все экземпляры шаблонов.
                  -jn Messages Stop after n errors Останов после n ошибок.
                  -K Compiler Code Generation Unsigned characters По умолчанию используется
                  символьный тип unsigned.
                  -K- Compiler Code Generation Unsigned characters (отмена) По умолчанию используется
                  символьный тип signed.
                  -K2 C++ Options C++ Compatibility Mode Don't treat char as distinct Допускает только 2 символьных типа - signed и unsigned
                  (char интерпретируется как
                  signed). Применяется для
                  совместимости с Borland С++
                  3.1 и младше.
                  -k Compiler Debugging Standard stack frame Включает стандартный кадр
                  стека.
                  -Lмаршрут Compiler Library Использует маршрут поиска
                  библиотечных файлов.
                  -lx <параметры компоновщика> Передает компоновщику параметр x (можно указывать несколько параметров).
                  -l-x <параметр компоновщика> Запрещает для комповновщика
                  параметр x.
                  -M выбор Linker Map File Segment, Public или Detailed Задает создание компоновщиком map-файла.
                  -mc 16-bit Compiler Memory Model Compact Компиляция с использованием
                  компактной модели памяти
                  (16-разрядный режим).
                  -mh 16-bit Compiler Memory Model Huge Компиляция с использованием
                  огромной модели памяти
                  (16-разрядный режим).
                  -ml 16-bit Compiler Memory Model Large Компиляция с использованием
                  большой модели памяти
                  (16-разрядный режим).
                  -mm 16-bit Compiler Memory Model Medium Компиляция с использованием
                  cредней модели памяти
                  (16-разрядный режим).
                  -mml 16-bit Compiler Memory Model Medium and Never Компиляция с использованием
                  средней модели памяти
                  (16-разрядный режим). Предполагается, что DS!=SS.
                  -ms 16-bit Compiler Memory Model Small Компиляция с использованием
                  малой модели памяти
                  (16-разрядный режим).
                  -ms! 16-bit Compiler Memory Model Small and Never Компиляция с использованием
                  малой модели памяти
                  (16-разрядный режим). Предполагается, что DS!=SS.
                  -mt 16-bit Compiler Memory Model Tiny Компиляция с использованием
                  крошечной модели памяти
                  (16-разрядный режим).
                  -mt! 16-bit Compiler Memory Model Tiny and Never Компиляция с использованием
                  крошечной модели памяти
                  (16-разрядный режим). Предполагается, что DS!=SS.
                  -N Compiler Debugging Test stack overflow Проверка переполнения стека.
                  -nмаршрут Directories Final Задает выходной каталог.
                  -O Optimization Size Jump optimizations Оптимизирует переходы.
                  -O1 Optimizations Specific Executable size Генерирует код минимального объема.
                  -O2 Optimizations Specific Executable size Генерирует код с оптимизацией по выполнению.
                  -Oa Optimizations Specific Assume no pointer aliasing Оптимизация предполагает,
                  что выражения с указателями
                  не имеют псевдонимов или общих подвыражений.
                  -Ob Optimizations Size Dead code eliminations Исключает не используемый
                  код.
                  -Oc Optimizations Spe cific Optimize locally Устраняет дублирование выражений в базовых блоках.
                  -Od Optimizations Disable all optimizations Запрещает все виды оптимизазации.
                  -Oe Optimizations Size Global register allocation Распределяет глобальные регистры и определяет диапазон
                  действия переменной.
                  -Og Optimizations Specific Optimize globally Устаняет дублирование выражений в функциях.
                  -Oi Optimizations Speed Inline intristic functions Расширяет общие встроенные
                  функции как подставляемые.
                  -Ol Optimizations Size Loop optimizations Оптимизация циклов.
                  -Om Optimizations Speed Invariant code motions Перемещает из циклов инвариантный код.
                  -Op Optimizations Speed Copy propagations Распространение копий.
                  -Os Optimizations Specific Executable size Генерирует код минимального
                  размера.
                  -Ot Optimizations Specific Executable speed Генерация кода с максимальной скоростью выполнения.
                  -Ov Optimizations Speed Induction variables Разрешает индукцию переменых
                  цикла.
                  -OW Optimizations Size Windows prolog/ epilog Подавляет inc bp/dec bp в
                  инструкциях far Windows.
                  -Ox Optimizations Specific Executable
                  speed
                  Генерация кода с максимальной скоростью выполнения.
                  -oимя_файла нет Компилирует исходные файлы в
                  файл с указанными именем.
                  -P <использование Tools> Выполняет компиляцию С++ независимо от расширения исходного файла.
                  -Pрасшир <использование Tools> Выполняет компиляцию С++ и
                  устанавливает заданное п
                  о умолчанию расширение в "рас
                  шир".
                  -P- <использование Tools> В зависимости от расширения
                  исходного файла выполняет
                  компиляцию Си или С++.
                  -P-расшир <использование Tools> В зависимости от расширения
                  исходного файла выполняет
                  компиляцию Си или С++. Устанавливает заданное по умолчанию расширение в "расшир".
                  -p 16-bit Compiler Calling Convention Pascal Используется в 16-разрядных
                  приложениях соглашения по
                  вызову Паскаля.
                  -p 32-bit Compiler Calling Convention Pascal Используется в 32-разрядных
                  приложениях соглашения по
                  вызову Паскаля.
                  -p- -pc 16-bit Compiler Calling Conmvention C Использует соглашения по вызову языка Си.
                  -p- -pc 32-bit Compiler Calling Conmvention C Использует соглашения по вызову языка Си.
                  -po Compiler Code Generation FastThis Для передачи параметра this
                  в регистре использует соглашение по вызову fastthis.
                  -pr 16-bit Compiler Calling Convention Register Для передачи параметров в
                  регистре используется соглашение по вызову fastcall.
                  -pr 32-bit Compiler Calling Convention Register Для передачи параметров в
                  регистре используется соглашение по вызову fastcall.
                  -ps 32-bit Compiler Calling Convention Standard call Использует стандартное соглашение по вызову stdcall
                  (32-разрядный режим).
                  -r Compiler Code Generation Automatic Использует регистровые переменные.
                  -r- Compiler Code Generation None Запрещает использование регистровых переменных.
                  -rd Compiler Code Generation Register keyword Допускает размещение в регистрах только описанные регистровые переменные.
                  -R Compiler Debugging Browser reference information in OBJs Включает в генерируемые обектные файлы информацию для
                  просмотра.
                  -RT C++ options Exceptions handling/RTTI Enable run-time type info Разрешает информацию о типах
                  этапа выполнения.
                  -S <оперативное меню администратора проекта> Создает выходной файл .ASM.
                  -Tстрока <использование Tools> Передает TASM, TASM32 или
                  другому ассемблеру указанный
                  строковый параметр.
                  -T- <использование Tools> Удаляет все предыдущие параметры ассемблера.
                  -tD Формирует файл .EXE DOS.
                  -tDc Формирует файл .COM DOS.
                  Параметры компиляции (продолжение)
                  -tDe Формирует файл .EXE DOS.
                  -tW 16- Compiler Entry/Exit Windows all functions exportable Формирует целевой файл GUI
                  .EXE.
                  -tWC Создает целевой консольный
                  файл .EXE со всеми функциями, заданными как экспортируемые.
                  -tWCD Создает целевой консольный
                  файл .DLL со всеми функциями, заданными как экспортируемые.
                  -tWCDE Создает целевой консольный файл .DLL с явными экспортируемыми функциями.
                  -tWD 16-bit Compiler Entry/Exit Windows DLL, all functions exported Создает целевой файл GUI
                  .DLL со всеми функциями,
                  описанными как экспортируемые.
                  -tWDE 16-bit Compiler Entry/Exit Windows DLL, explicit funs exported Создает целевой файл GUI
                  .DLL с явными функциями,
                  описанными как экспортируемые.
                  -tWE 16-bit Compiler Entry/Exit Windows explicit funs exported Создает целевой файл GUI
                  .EXE с явными функциями,
                  описанными как экспортируемые.
                  -tWM Создает мультинитевый модуль
                  (32-разрядный режим).
                  -tWS 16-bit Compiler Entry/Exit Windows smart callbacks, all funcs Определяет целевой файл, как
                  файл .EXE Windows, использующий эффективные обратные
                  вызовы (16-битовый режим).
                  -tWSE 16-bit Compiler Entry/Exit Windows smart callbacks, explicit Формирует целевой файл .EXE,
                  использующий обратные вызовы, с явными экспортируемыми
                  функциями (16-разрядный ре жим).
                  -Uимя <использовать в проекте Local Override> Отменяет все ранее заданные
                  определения указанного имени.
                  -u Compiler Compiler Output Generate underscores Генерирует подчеркивания.
                  -v, -v- Compiler Debugging Debug information in OBJs Включает в объектные файлы
                  отладочную информацию.
                  -vi, -vi- Compiler Debugging Out-of-line inline functions Управляет расширением подставляемых функций.
                  -V0 C++ Options Virtual Tables External Внешние виртуальные таблицы
                  C++.
                  -V1 C++ Options Virtual Tables Public Общедоступные виртуальные
                  таблицы C++.
                  -V C++ Options Virtual Tables Smart Использует эффективные виртуальные таблицы С++.
                  -Va C++ Options C++ Comp Pass class values via reference to temp Передает аргументы класса по
                  ссылке на временную переменную.
                  -Vb C++ Options C++ Compatibility Same size as 'this' pointer Создает указатель на виртуальный базовый класс того же
                  размера, что и указатель
                  'this' этого класса (16-разрядный режим).
                  -Vb- C++ Options C++ Compatibility Always near Создает указатель виртульного базового класса всегда
                  типа near (16-разрядный режим).
                  -Vc C++ Options C++ Compatibility Disable constructor displacement Не изменяет схему классов
                  для ослабления ограничений,
                  накладываемых на указатели
                  элементов (16-разрядный режим).
                  -Vt 16-bit Compiler Memory Model Far virtual tables Виртуальные таблицы С++ типа
                  far (16-разрядный режим).
                  -Vmd C++ Options Member Pointer Smallest for class Использует для указателей
                  элементов минимальное представление.
                  -Vmm C++ Options Member Pointer Support multiple inheritance Указатели элементов поддерживают множественное наследование.
                  -Vmp C++ Options Member Pointer Honor precision of member function Задает описанную точность для всех указателей функций-элементов.
                  -Vms C++ Options Member Pointer Support single inheritance Указатели элементов поддерживают одинарное наследование.
                  -Vmv C++ Options Member Pointer Support all cases Указатели элементов не имеют
                  ограничений.
                  -Vo нет Разрешает все параметры обратной совместимости.
                  -Vp C++ Options C++ Compatibility Push "this" first to Pascal Передает указатель "this"
                  "паскалевским" функциям-элементам как первый параметр в
                  стеке.
                  -Vs C++ Options C++ Comp Virtual table Pointer follows data members Размещает указатель виртуальной таблицы после нестатических элементов данных.
                  -Vv C++ Options C++ Compatibility 'deep' virtual bases Не добавляет к классам с
                  указателями на элементы виртуального базового класса
                  скрытые элементы и код.
                  -W 16-bit Compiler Entry/Exit Windows all functions exportable Целевой файл .EXE GUI создается со всеми экспортируемыми функциями.
                  -WD 16-bit Compiler Entry/Exit Windows DLL, all functions exportable Создает целевой файл .DLL
                  Windows со всеми экспортируемыми функциями.
                  -WDE 16-bit Compiler Entry/Exit Windows DLL, all functions exported Создает целевой файл .DLL
                  Windows со явными экспортируемыми функциями.
                  -WDE 16-bit Compiler Entry/Exit Windows explicit functions exported
                  Целевой файл .EXE Windows
                  создается с явными экспортируемыми функциями.
                  -WM Создает мультинитевый целевой модуль (32-разрядный режим)
                  -WSE 16-bit Entry/Exit Win smart callbacks, explicit functions exported Создает целевой файл .EXE
                  для Windows, в котором экспортируемые функции используют эффективные обратные
                  вызовы (16-разрядный режим).
                  -w! Make Break Make on warnings При наличии предупреждений
                  компилятор возвращает ненулевой код и не создает файл
                  .OBJ.
                  -w Messages All Выводит предупрежления.
                  -w- Messages None Не выводит предупреждения.
                  -wxxx Messages Selected Разрешает предупреждающие
                  сообщения xxx.
                  -w- xxx Messages Selected Запрщшает предупреждающие
                  сообщения xxx.
                  -X Compiler Compiler Output Autodependency information (выбор) Не использовать вывод компилятора с автоматической зависимости.
                  -X- Compiler Compiler Output Autodependency information (отмена) Использовать вывод компилятора с автоматической зависимости.
                  -x C++ Options Exception handling Enable exceptions Разрешение обработки исключительных ситуаций.
                  -xd C++ Options Exception handling
                  Enable destructor
                  cleanup
                  Разрешение очистки деструктора.
                  -xp C++ Options Exception handling Enable exception location info Разрешение размещения информации исключительных ситуаций.
                  -Y Разрешает генерацию оверлейного кода.
                  -Yo <редактирование атрибутов узла и
                  выбор Overlay this
                  module>
                  Создает оверлей из компили руемого файла.
                  -y Compiler Debugging Line numbers Включает нумерацию строк.
                  -Z Optimizations Size Supress redundant loads Разрешение загрузки регистра.
                  -zAимя 16-bit Compiler Segment Names Code
                  Code Class
                  Класс кода.
                  -zBимя 16-bit Compiler Segment Names Data
                  Uninitialized Data
                  Class
                  Класс BSS.
                  -zCимя 16-bit Compiler Segment Names Code
                  Code Segment
                  Сегмент кода.
                  -zDимя 16-bit Compiler Segment Names Data
                  Uninitialized Data
                  Segment
                  Сегмент BSS.
                  -zEимя 16-bit Compiler Segment Names Far
                  Data Far Data
                  Segment
                  Сегмент Far (16-разрядный
                  режим).
                  -zFимя 16-bit Compiler Segment Names Far
                  Data Far Data Class
                  Класс Far (16-разрядный режим).
                  -zGимя 16-bit Compiler Segment Names Data
                  Uninitialized Data
                  Group
                  Группа BSS.
                  -zHимя 16-bit Compiler Segment Names Far
                  Data Far Data Group
                  Группа Far (16-разрядный режим).
                  -zPимя 16-bit Compiler Segment Names Code
                  Code Group
                  Группа кода.
                  -zRимя 16-bit Compiler Segment Names Data Initialized Data
                  Segment
                  Сегмент данных.
                  -zSимя 16-bit Compiler Segment Names Data Initialized Data
                  Group
                  Группа данных.
                  -zTимя 16-bit Compiler Segment Names Data Initialized Data
                  Class
                  Класс данных.
                  -zVимя 16-bit Compiler Segment Names Far
                  Data Virtual Table Segment
                  Виртуальный сегмент far
                  (16-разрядный режим).
                  -zWимя 16-bit Compiler Segnment Far Data
                  Virtual Table Class
                  Виртуальный класс far (16-разрядный режим).
                  -zX нет Для X используется заданно
                  по умолчанию имя (X - это A-
                  или R, P, S, T, V, W).

                  Параметры компиляции


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


                  Параметры компилятора


                  Параметры BCC воспринимаются последовательно слева направо.
                  При этом действуют следующие правила:
                • Если вы дублируете параметр, то последний параметр переопределяет предыдущий (за исключением -I и -L).

                • При указании в командной строке нескольких параметров -I и
                  -L результат будет кумулятивным (компилятор выполняет поиск по всем перечисленным каталогам слева направо).



                • Параметры основного окна


                  Параметры основного окна Main Window управляют характеристи-
                  ками основного окна приложения (его типом и внешним видом).


                  Параметры приложения


                  Параметры приложения позволяют управлять его внешним видом.


                  Параметры проекта


                  После создания проекта вам может потребоваться изменить заданные по умолчанию параметры. Эти параметры указывают администратору проекта, как нужно строить проект. Чтобы изменить их:
                • Выберите Options Project. Выводится диалоговое окно.

                • Отредактируйте параметры и выберите OK.

                • Установленные параметры применяются ко всему проекту. При
                  создании нового проекта ему назначаются параметры последнего открытого проекта. Чтобы выбрать другие параметры, используйте Local Override или Style Sheet.


                  Параметры редактора


                  Окна редактора (всего их может быть до 32) позволяют вам
                  создавать и редактировать исходный код программы. При редактировании файла строка состояния IDE выводит текущую позицию в файле
                  и позицию курсора. С помощью команды Edit Undo (или Alt+пробел)
                  вы можете отменять изменения. Число допустимых команд Undo (уровень отмены) можно задать с помощью Options Enviroment Editor Options и установки Undo Limit.
                  Можно настроить конфигурацию редактора таким образом, чтобы
                  он выглядел и вел себя аналогично редакторам Brief и Epsilon. Редактор интегрированной среды использует файл конфигурации клавиатуры .CKB, который задает для редактора клавиатурные сокращения.


                  Параметры -W и -WC


                  Параметр -W создает прикладной объектный модуль Windows, в
                  котором все функции будут экспортироваться. Компилятор генерирует
                  начальный и завершающий код для каждой функции, обеспечивая ее
                  экспортируемость. Это не означает, что все функции действительно
                  будут экспортироваться. Для фактического экспорта одной из этих
                  функций вы должны использовать ключевое слово _export или добавить запись этой функции в секцию EXPORTS файла определения модуля. Эквивалентный параметр -WC используется для 32-разрядных приложений консольного режима.


                  Параметры -WD и -WCD


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


                  Параметры -WDE и -WCDE


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


                  Печать документа


                  Windows интерпретирует распечатку как последовательность команд, поэтому объект распечатки должен превращать документ в последовательность образов страниц. Объект распечатки должен иметь
                  возможность делать следующее:
                • устанавливать параметры печати;

                • вычислять общее число страниц;

                • отображать каждую страницу в контекст устройства;

                • указывать, что больше страниц нет.



                • Печать каждой страницы


                  После того, как объект принтера дает документу возможность
                  разбивки на страницы, он вызывает для каждой печатаемой страницы
                  функцию-элемент PrintPage объекта распечатки. При написании функций PrintPage нужно учитывать следующее:
                • Независимость от устройства. Убедитесь, что ваш код не основывается на конкретном масштабе, коэффициенте относительного удлинения или цветах. Для различной видеоаппаратуры и принтеров эти характеристики могут быть различными,
                  поэтому из программы следует исключить зависимость от устройств.

                • Возможности устройства. Хотя большинство видеоустройств
                  поддерживают все операции GDI, некоторые принтеры этого не
                  делают. Для выполнения сложных задач вывода ваша программа
                  должна вызывать функцию API Windows GetDeviceCaps, которая
                  возвращает важную информацию о возможностях конкретного
                  устройства вывода.



                • Перечень сообщений


                  ')' missing in macro invocation in command команда

                  Фатальная ошибка утилиты MAKE
                  (в вызове макрокоманды в команде команда пропущена ')')

                  В вызове макрокоманды требуется левая скобка.
                  ) expected

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

                  В конце списка параметров ожидается правая круглая скобка.
                  ( expected

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

                  Перед списком параметров ожидается левая круглая скобка.
                  , expected

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

                  В списке объявлений, инициализации или параметров ожидается запятая.
                  : expected alter private/protected/publlc

                  Сообщение об ошибке этапа компиляции
                  (требуется : после private/protected/public)

                  При использовании резервированных слов private/ protected/public для того, чтобы начать соответствующий раздел класса С++, за ними должно следовать двоеточие.
                  < expected

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

                  За < не следует ключевое слово template. Каждое описание
                  шаблона должно включать в себя формальные параметры шаблона, заключенные в <>, за которыми непосредственно следует ключевое слово template.
                  @ seen, expecten a response-files name

                  Ошибка TLIB
                  (обнаружено @, предполагается имя командного файла)


                  Непосредственно после @ не задан командный файл утилиты.
                  { expected


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


                  В качестве начала блока или инициализации ожидается левая
                  фигурная скобка.
                  } expected


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


                  В конце блока или инициализации ожидается правая фигурная
                  скобка.
                  16-bit segments not supported in module модуль


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


                  16-разрядные сегменте не поддерживаются в 32-разрядных приложениях. Возможно вы компилируете свое 32-разрядное приложение
                  16-разрядным компилятором.
                  286/287 instructions not enabled


                  Cообщение об ошибке этапа компиляции
                  (Команды 286/287 не разрешены)


                  Чтобы разрешить использование команд 286/287, используйте
                  параметр командной строки компилятора -2 или параметр 80286 диалогового окна Options Compiler Code Generation (Параметры Компилятор Генерация кода). Учтите, что полученный при этом код не может использоваться на машинах с процессорами 8086 или 8088.
                  32-record encountered


                  Сообщение об ошибке утилиты TLINK
                  (обнаружена 32-разрядная запись)


                  Обнаружен объектный файл, содержащий 32-битовые записи
                  80386, а параметр /3 не используется.


                  Передача данных


                  В большинстве случаев передача данных в окно и из него выполняется автоматически, но вы можете в любой момент передать
                  данные явным образом.
                  Передача в окно происходит автоматически при построении
                  оконного объекта. Для создания интерфейсного элемента, представляющего оконный объект, конструктор вызывает SetupWindow. Затем
                  для загрузки данных из буфера передачи вызывается TransferData.
                  SetupWindow оконного объекта вызывает функции SetupWindow каждого
                  дочернего окна, так что дочерние окна также могут передавать свои
                  данные. Так как родительское окно устанавливает свои дочерние окна в порядке их построения, данные в буфере передачи должны появляться в том же порядке.
                  Когда режимный диалоговый блок получает командное сообщение
                  с идентификатором ID или IDOK, он автоматически передает данные
                  из управляющих элементов в буфер передачи. Обычно это сообщение
                  указывает, что пользователь выбрал для закрытия диалогового блока
                  кнопку OK, так что диалоговый блок автоматически обновляет буфер
                  передачи. Затем, если вы снова выполняете диалоговое окно, они
                  передаются из буфера передачи в управляющие элементы.
                  В любой момент вы можете явно передать данные в любом направлении. Для этого используется функция-элемент TransferData,
                  параметре которой задается tdSetData (передача из буфера) или
                  tdGetData (передача в буфер).
                  Вы можете модифицировать способ передачи конкретным управляющим элементом своих данных или включить в механизм передачи новый определяемый вами управляющий элемент. В любом случае это
                  требуется написания для вашего объекта управляющего элемента
                  функции-элемента Transfer.


                  Передача значений в C++


                  Как на самом деле передаются значения в C++? Они передаются с
                  вызовом функции. Но это сможет сделать не любая функция, а только
                  функция которая встроена в объект. Этот тип функций называется функцией элементом или методом.
                  Тип объекта Объект
                  v v
                  sber_bank my_bank;
                  double paycheck = 100.0; < Старый стиль передачи
                  double party_money; значения по переменной, а
                  не по ссылке
                  Объект Метод (выбранное сообщение)
                  v v
                  my_bank.deposit(paycheck); Значение
                  v
                  party_money = my_bank.withdraw(500.00);


                  Переименование элемента AppExpert


                  Чтобы переименовать класс, функцию обработки события, экземпляр переменной или идентификатор диалога, сделайте следующее:
                • Используйте редактор IDE для поиска и замены всех вхождений исходного имени новым именем. Проверьте все связанные
                  с проектом исходные файлы.

                • В окне проекта выберите цель AppsExpert, щелкните на ней
                  правой кнопкой "мыши", затем выберите Special Rescan. После завершения Rescan возвращает вас в окно проекта IDE.



                • Переключатель Integer Format


                  Кнопки с зависимой фиксацией Integer Format (Формат целых
                  чисел) позволяет вам определить один из трех форматов, управляющих выводом целых чисел:

                  Decimal (Десятичный) Целые числа выводятся, как
                  обычные десятичные значения.
                  Hex (Шестнадцатиричный) Целые числа выводятся в
                  шестнадцатиричном виде в формате, принятом в соответствующем языке.
                  Both (Оба) Целые числа выводятся и как десятичные, и как шестнадца тиричные значения (которые указываются в скобках после шестнадцатиричных значений).

                  Переключатель Screen Lines (Размер экрана) можно использовать для того, чтобы определить, использует ли Turbo Debugger
                  обычный 25-строчный режим экрана или 40- или 50-строчный режим,
                  доступный при работе с адаптерами EGA и VGA.
                  Поле Tab Size (Размер табуляции) позволяет определить позиции при каждой табуляции. Вы можете уменьшить число позиций табуляции, чтобы можно было видеть больше исходного текста в файлах,
                  выравнивание кода выполнено с помощью табуляции. Размер позиции
                  табуляции можно установить в значения от 1 до 32.
                  Поле Background Delay, которое выводится только в TD32.EXE,
                  позволяет вам задать, как часто обновляются экраны отладчика. При
                  использовании этого параметра в сочетании с командой Run Wait for
                  Child вы можете наблюдать действия программы в экранах Turbo Debugger при ее выполнении.
                  Поле User Screen Delay, которое выводится только в TD32,
                  позволяет задать время вывода экрана программы при нажатии Alt+F5
                  (команда Windows User Screen). Это полезно использовать при работе с TD32 в режиме полного экрана, когда вам нужно видеть окна
                  приложения. Определив задержку, вы можете задать, как должно будет выводиться экран программы, прежде чем управление вернется к
                  Turbo Debugger.
                  Команда Path for Source (Маршрут доступа к исходному файлу)
                  задает каталоги, в которых Turbo Debugger будет искать исходные
                  файлы. Чтобы задать несколько каталогов, разделите их точкой с
                  запятой. Хотя поле ввода Enter Source Directory Path может содержать максимум 256 символов, для задания более длинных маршрутов



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

                  введите символ @, затем задайте имя файла.

                  Команда Save Options (Сохранить параметры) открывает диалоговое окно, с помощью которого вы можете сохранить текущие параметры на диске в файле конфигурации. В этом файле сохраняются:

                • ваши макрокоманды (кнопка Options);


                • текущая схема окон и форматы областей окон (Layout);


                • все значения параметров, заданные в меню Options (кнопка

                  Options).


                • [*] Save configuration

                  [X] Options OK

                  [ ] Layout Cancel

                  [ ] Macros

                  Save to Help

                  tdconfig.tdw

                  Поле ввода Save To позволяет также задать имя файла конфигурации. По умолчанию TDW.EXE использует TDCONFIG.TDW, а TD32.EXE TDCONFIG.TD2.

                  Команда Restore Options позволяет восстановить параметры из

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

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

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


                  Переменная _8087 (dos.h)


                  Флаг микропроцессора (для DOS, Win16, Win32). Устанавливается в ненулевое значение, если логика автообнаружение кода запуска
                  обнаруживает наличие сопроцессора. Эту логику можно переопределить установкой переменной операционной среды 87.


                  Переменная _argc (dos.h)


                  Содержит число аргументов командной строки (для DOS, Win16,
                  Win32 и OS/2) - значение argc, переданное main при запуске программы.


                  Переменная _argv (dos.h)


                  Массив указателей на аргументы командной строки (для DOS,
                  Win16, Win32 и OS/2). Элементы этого массива передаются программе
                  при ее запуске.


                  Переменная _ctype (ctype.h)


                  Информационных массив символьных атрибутов (для DOS, Win16,
                  Win32 и OS/2), индексируемых значением ASCII +1. Каждая запись это битовый набор, описывающий символ.


                  Переменная _daylight (time.h)


                  Указывает, требуется ли сохранение настраиваемого времени
                  суток (для DOS, Win16, Win32 или OS/2). Используется функциями
                  даты и времени. Принимает значения 1 (сохраненное время) и 0
                  (стандартное).


                  Переменная _directvideo (cohio.h)


                  Флаг, управляющий видеовыводом (для DOS, Win16, Win32). Определяет вывод непосредственно в видеопамять (1) или через вызовы
                  BIOS в ПЗУ (0). По умолчанию равна 1. Эту переменную следует использовать только в символьных приложениях.


                  Переменная _environ (dos.h)


                  Позволяет обращаться к системным переменным операционной
                  среды и представляет собой массив указателей на строки "переменная=значение" (для DOS, Win16, Win32 и OS/2). Значение в строке
                  может быть пустым. При выполнении значения переменных среды передаются непосредственно программе.
                  Обращаться к _environ можно через getenv, а добавлять, изменять или удалять записи массива _environ - с помощью getenv.


                  Переменная _floatconvert (stdio.h)


                  Компонует форматы с плавающей точкой (для DOS, Win16, Win32
                  и OS/2). Вывод с плавающей точкой требует компоновки подпрограмм
                  преобразования. Для уменьшения размера такая компоновка автоматически не выполняется. Однако, она выполняется автоматически при
                  использовании в программе математической подпрограммы или получении числа с плавающей точкой.


                  Переменная _fmode (fcntl.h)


                  Определяет заданный по умолчанию режим трансляции - текстовый или двоичный (для DOS, Win16, Win32 и OS/2). По умолчанию задается текстовый режим: при вводе возврат каретки/перевод строки
                  транслируется в перевод строки, а при выводе наоборот.


                  Переменная _new_handler


                  Перехватывает операции распределения (для DOS, Win16, Win32
                  и OS/2). Содержит указатель на функцию без аргументов, возвращающую void. При невозможности распределения памяти будет вызываться
                  функция, на которую указывает данная переменная. В качестве альтернативы можно использовать функцию _set_new_handler.


                  с эмуляцией сопроцессора 80x87, которая


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

                  Существует ряд ситуаций, в которых вам может понадобиться

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

                  по умолчанию. Например, ваша собственная исполняющая система может иметь сопроцессор 80х87, но вам требуется проверить, будет ли

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

                  совместимой с PC, но данная конкретная система возвращает логике

                  автоматического определения наличия сопроцессора неверную информацию (либо при отсутствии сопроцессора 80х87 говорит, что он на

                  месте, либо наоборот).

                  Borland C++ имеет параметр для переопределения логики определения наличия сопроцессора при загрузке программы. Этот параметр - соответствующая переменная операционной среды системы 87.

                  Переменная операционной среды 87 устанавливается в ответ на подсказку DOS при помощи команды SET:

                  C>SET 87=N

                  или

                  C>SET 87=Y

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

                  Установка переменной операционной среды 87 в N говорит загрузочному коду исполняющей системы о том, что вы не хотите использовать сопроцессор 80х87 даже в том случае, если он установлен в

                  системе.

                  Установка переменной операционной среды в значение Y означает, что сопроцессор на месте и вы желаете, чтобы программа его

                  использовала. Программист должен знать следующее: если установить

                  87=Y, а физически сопроцессор 80х87 в системе не установлен, то

                  система "зависнет".

                  Если переменная операционной среды 87 была определена (с любым значением), и вы желаете сделать ее неопределенной, введите в

                  ответ на подсказку DOS:

                  C>SET=

                  Непосредственно после знака равенства нажмите клавишу Enter,

                  и переменная 87 станет неопределенной.


                  Переменная _psp (dos.h)


                  Содержит адрес сегмента PSP для текущей программы (для DOS,
                  Win16, Win32 и OS/2). PSP - это дескриптор процесса DOS, который
                  содержит начальную информацию о программе.


                  Переменная _threadid (stddef.h)


                  Указатель на идентификатор нити (для DOS, Win32 и OS/2).
                  Это значение длинного целого типа, идентифицирующее текущую выполняемую нить.


                  Переменная _timezone (time.h)


                  Содержит разницу в секундах между местным временем и временем по Гринвичу (для DOS, Win16, Win32 и OS/2). Используется
                  функциями даты и времени.


                  Переменная _tzname (time.h)


                  Массив указателей на имена временных поясов (для DOS, Win16,
                  Win32 и OS/2).


                  Переменная _version (dos.h)


                  Содержит номер версии операционной системы (для DOS, Win16,
                  Win32 и OS/2). Основной номер версии находится в старшем байте
                  (или слове для 32-разрядного приложения).


                  Переменная _wscroll (conio.h)


                  Разрешает или запрещает прокрутку в консольных функциях ввода-вывода (для DOS, Win16, Win32 и OS/2). По умолчанию прокрутка
                  разрешена - переменная имеет значение 1. При установке в 0 прокрутка запрещается. Данную переменную следует использовать только
                  в текстовых приложениях.


                  Переменные alias


                  Переменные alias являются псевдонимами для других переменных.
                  Работая, как указатели, они (при обращении к ним) получают автоматически значение объекта, на который они ссылаются. Объявляются они с
                  помощью операции '&':
                  int i = 42;
                  int &k = i; // k принимает значение i
                  printf("%d\n", k); // k разыменовывается автоматически, печатает 42
                  k = 55; // Присваивает значение и i, и k = 55
                  Здесь уточняется как это переводится на Cи:

                  Cи Tурбо и Borland C++
                  int i = 42; int i = 42;
                  int *k = &i; int &k = i;
                  printf("%d\n", *k); printf("%d\n", k);
                  *k = 55; k = 55;



                  Переменные errno, _doserrno, _sys_errlist, _sys_nerr (dos.h, errno.h)


                  Для печати сообщений об ошибке разрешает perror (для DOS,
                  Win16, Win32 и OS/2). Функция perror использует эти переменные
                  для вывода сообщений об ошибках.

                  Переменная Назначение
                  errno Указывает тип ошибки при математическом
                  или системном вызове. В других ситуациях
                  не содержит кода ошибки.
                  _doserrno Содержит фактический код ошибки операционной системы, когда вызов операционной системы дает ошибку.
                  _sys_errlist Массив строк сообщений. В качестве индекса
                  массива для поиска строки по номеру ошибки
                  можно использовать errno.
                  _sys_nerr Число строковых сообщений в _sys_nerr.

                  Мнемонические обозначения в _sys_errlist показаны в следующей таблице:

                  Мнемоника Описание
                  E2BIG Слишком длинный список аргументов.
                  EACCES В разрешении отказано.
                  EBADF Неверный номер файла.
                  ECHILD Нет дочернего процесса (Ч).
                  ECONTR Попытка удаления текущего каталога CurDir.
                  EDEADLOCK Нарушение блокировки (Ч).
                  EDOM Ошибка домена (*) или математического аргумента (Ч).
                  EEXIST Файл уже существует.
                  EFAULT Неизвестная ошибка.
                  EINTR Прерванный функциональный вызов (Ч).
                  EINVACC Недопустимый код доступа.
                  EINVAL Недопустимый аргумент.
                  EINVDAT Недопустимые данные.
                  EINDRV Недопустимая спецификация диска.
                  EINVENV Недопустимая операционная среда.
                  EINVFMP Недопустимый формат.
                  EINVFNC Недопустимый номер функции.
                  EINVMEM Недопустимый адрес блока памяти.
                  EIO Ошибка ввода-вывода (Ч).
                  EMFILE Открыто слишком много файлов.
                  EMATOOLONG Слишком длинное имя файла (Ч).
                  ENFILE Слишком много открытых файлов.
                  ENMFILE Файлов больше нет.
                  ENODEV Нет такого устройства.
                  ENOENT Нет такого файла или каталога.
                  ENOEXEC Ошибка формата выполняемого файла.
                  ENOMEM Не хватает памяти.
                  ENOPATH Маршрут не найден.
                  ENOSPC На устройстве не осталось места (Ч).
                  ENOTSAM Не то же устройство.
                  ENXIO Нет такого устройства или адреса (Ч).
                  EPERM Операция не разрешена (Ч).
                  EPIPE Нарушение конвейера (Ч).
                  ERANGE Результат вне диапазона (*) или слишком велик (Ч).
                  EORFS Файловая система доступна только по чтению (Ч).
                  ESPIPE Неразрешенная операция установки позиции (Ч).
                  EXDEV Перекрестная связь между устройствами.
                  EZER0 Ошибка 0.
                  <


                  (Ч) - только для 32-разрядных приложений.

                  (*) - только для 16-разрядных приложений.

                  Ниже перечислены мнемоники фактических кодов ошибок DOS, в

                  которые может устанавливаться _doserrno (это значение может не

                  отображаться через errno):

                  Мнемоника Код ошибки DOS
                  E2BIG Неверная операционная среда.
                  EACCES Доступ запрещен.
                  EACCES Неверный доступ.
                  EACCES Это текущий каталог.
                  EBADF Неверный описатель.
                  EFAULT Зарезервирован.
                  EINVAL Неверные данные.
                  EINVAL Неверная функция.
                  EMFILE Слишком много открытых файлов.
                  ENOENT Такого файла или каталога нет.
                  ENOEXEC Неверный формат.
                  ENOMEM Нет памяти.
                  ENOMEM Плохой блок.
                  EXDEV Неверный диск.
                  EXDEV Не то же устройство.

                  Переменные _osmajor, _osminor_, _osversion (dos.h)


                  Содержит основной и дополнительный номера версии операционной системы (для DOS, Win16, Win32 и OS/2).


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


                  Одним из нововведений в С++ является новый вид переменных -
                  ссылки. Ссылка - переменная, задаваемая указателем. Чтобы сделать переменную ссылкой, необходимо после описателя типа поставить операцию
                  '&'. Ссылка схожа с переменной во всем, однако, на самом деле она
                  совпадает с другой переменной, адрес которой указывается при объявлении ссылки.
                  В Си, если вы хотите непосредственно работать с передаваемой в
                  функцию переменной, вам нужно передать указатель на эту переменную.
                  При этом нужно соблюдать соответствующий синтаксис и помнить о том,
                  что указатель требуется разыменовать. С++ позволяет вам с помощью
                  ссылки передавать и модифицировать действительное значение переменной.
                  Си Турбо и Borland C++
                  typedef struct { struct rect { // Определение структуры
                  int wd, ht; int wd, ht; // Ширина и высота
                  } rect; }; // прямоугольника
                  Передача ссылки
                  v
                  int area(rect *r) int area(rect& r) // Вычисление
                  { { // площади прямоугольника
                  return r->wd*r->ht; return r.wd * r.ht;
                  } } ^
                  - Использование раздели-
                  теля вместо '->'
                  rect r; rect r;
                  int k = area(&r); int k = area(r);
                  В данном примере, для вычисления площади прямоугольника, после
                  определения структуры rect описана функция элемент area с параметром-ссылкой r. После инициализации переменной r типа rect, выполняется вызов функции элемента area с аргументом r, который будет
                  использоваться не явно, а в качестве ссылки. Таким образом, незаметно
                  для нас, аргумент передан в функцию элемент, через его адрес. Отметим, что rect& r, rect &r и rect & r эквивалентны.
                  Отличием C++ от языка Си является смена разделителя с '->' на '.'.


                  Переменные стека


                  С помощью окна Stack вы можете проверить любые переменные
                  или функции, которые находятся в стеке (включая рекурсию). Для
                  этого откройте окно стека и подсветите проверяемую функцию. Затем
                  нажмите F10 и выберите Locals. Область Statis окна Variables показывает значения аргументов.


                  Переменные __throwExceptionName, __throwFileName, __throwLineNumber (except.h)


                  Генерируют информацию о порожденной исключительной ситуации
                  (для DOS, Win16, Win32 и OS/2). Эти глобальные переменные позволяют получить имя и место возникновения особой ситуации (в виде
                  текстовой строки).


                  Перемещение класса


                  Чтобы переместить класс из одного исходного файла в другой,
                  сделайте следующее:
                • Переместите (вырезанием и вставкой) исходный код класса в
                  новый файл. Если файл не записан в проекте как узел под целью AppsExpert, добавьте его. Если перемещенный класс был собственным исходным файлом, вы можете удалить из проекта пустой исходный файл.

                • Выберите в проекте целевой файл AppsExpert, щелкните правой кнопкой "мыши" для просмотра SpeedMenu, затем выберите
                  Special Rescan. После завершения Rescan возвращает вас в
                  окно проекта IDE.



                • Перемещение узлов и целей


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

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



                • Переносимость системных вызовов DOS


                  Для вызова функций файлового ввода-вывода DOS Windows 3.0
                  предусматривает функцию API DOS3Call. Эта и другие функции INT
                  21H заменены в Win32 соответствующими 32-разрядными вызовами.

                  Функция
                  21H Операция
                  DOS Эквивалент API
                  Win32
                  OEH Выбор диска. SetCurrentDirectory
                  19H Получение текущего диска. GetCurrentDirectory
                  2AH Получение даты. GetDateAndTime
                  2BH Установка даты. SetDateAndTime
                  2CH Получение времени. GetDateAndTime
                  3DH Установка времени. SetDateAndTime
                  36H Получение свободного GetDiskFreeSpace
                  пространства на диске.
                  39H Создание каталога. CreateFile
                  3AH Удаление каталога. RemoveDirectory
                  3BH Установка текущего каталога. SetCurrentDirectory
                  3CH Создание описателя. CreateFile
                  3DH Открытие описателя. CreateFile
                  3EH Закрытие описателя. CloseHandle
                  3FH Чтение описателя. ReadFile
                  40H Запись описателя. WriteFile
                  41H Удаление файла. DeleteFile
                  42H Получение атрибутов файла. SetFilePointer
                  43H Получение атрибутов файла. GetAttributesFile
                  43H Установка атрибутов файла. SetAttributesFile
                  47H Получение текущего каталога. GetCurrentDirectory
                  4EH Поиск первого файла. FindFirstFile
                  4FH Поиск следующего файла. FindNextFile
                  56H Изменение записи каталога. MoveFile
                  57H Получение даты/времени файла. GetDateAndTimeFile
                  57H Установка даты/времени файла. SetDateAndTimeFile
                  59H Получение расширенной ошибки. GetLastError
                  5AH Создание уникального файла. GetTempFileName
                  5BH Создание нового файла. CreateFile
                  5CH Блокировка файла. LockFile
                  5CH Разблокировка файла. UnlockFile
                  67H Установка описателя счетчика. SetHandleCount



                  Переопределение функций-элементов класса проверки допустимости


                  Хотя стандартные объекты проверки допустимости обычно удовлетворяют большинство требований по проверке данных, вы можете
                  также модифицировать стандартные механизмы проверки допустимости
                  и написать свои собственные объекты проверки допустимости. Если
                  вы решили это сделать, то вам потребуются функции Valid, IsValid,
                  IsValidInput и Error. Кроме понимания каждой из этих функций-элементов вы должны знать, как их используют редактируемые управляющие элементы и каким образом их можно при необходимости переопределить.


                  Переопределение области действия


                  Область действия идентификатора - это та область программы,
                  в которой на него можно ссылаться. Заданные в выражении идентификаторы Turbo Debugger ищет в следующем порядке:
                • идентификаторы в стеке текущей функции;

                • идентификаторы в модуле, содержащем текущую функцию;

                • глобальные идентификаторы (вся программа);

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

                • Для определения области действия идентификатора отладчик использует текущую позицию курсора. Если вы измените в отладчике
                  область действия, это может дать непредсказуемые результаты, поэтому для возврата к текущей точке используйте команду Origin окна Module.
                  Синтаксис переопределения области действия зависит от выбранного в окне Options Language языка. В Си, С++ и ассемблере для
                  этого используется символ #, в Pascal - точка. Таким образом, для
                  переопределения области действия используется следующий синтаксис
                  (в квадратные скобки заключены необязательные элементы):
                  [#модуль[#имя_файла]]#номер_строки[#номер_переменной]
                  или
                  [#модуль[#имя_файла]][#имя_функции]#имя_переменной


                  Переопределение операций


                  Поскольку в С++ операции, рассматриваются как функции, то очевидно, что и их можно переопределять так, что они будут работать не
                  только с числами, а даже с графическими объектами, строками и вообще
                  с чем угодно. В С++ число операций ограничено стандартным набором:
                  [] () . -> ++ --
                  & * + - ~ !
                  sizeof / % << >> <
                  > <= >= == != ^
                  | && || ?: = *=
                  /= %= += -= <<= >>=
                  &= ^= |= , # ##
                  Чтобы определить операцию, необходимо определить функцию, именем
                  которой является специальное ключевое слово oрerator, за которым сле-
                  дует символ операции.
                  Допустим нам удалось определить тип переменных time - время, так
                  что появилась возможность записывать операции со временем в виде, не
                  разрушающем привычный формат (например: 20.04 + 05.57 = 02.01).
                  Переопределяемые операции
                  v v
                  time operator+(time a, time b) <
                  { ^
                  time c; операция +
                  return c = a.val + b.val;
                  }
                  time work_time, busy_time, birth_time;
                  > вызывает переопределенную операцию
                  work_time = busy_time + goof_off_time;
                  Тип операнда определяет какую из переопределенных операций необ-
                  ходимо использовать.
                  При переопределении операции действуют следующие ограничения:
                • С++ не различает префиксные и постфиксные версии операций ++ и
                  --.

                • операция, которую вы хотите определить, уже должна существо-
                  вать в языке. Например, вы не можете определить операцию #.

                • нельзя переопределить следующие операции:
                  . .* :: ?:

                • переопределенные операции сохраняют свое первоначальное старшинство.

                • если @ обозначает любую унарную операцию, то выражения x@ и @x
                  можно интерпретировать либо как x.операция@(), либо как опера-
                  ция@(x). Если описаны обе формы, то компилятор попытается раз-
                  решить неоднозначность путем сравнения аргументов. Аналогично,
                  переопределение бинарной операции @ в x@y может толковаться
                  либо x.операция@(y), либо операция@(x,y), и если определены
                  обе формы, то компилятору требуется анализировать аргументы.
                  Пример бинарной операции уже был: это версия операции +, для
                  сложения времени, где a.val + b.val интерпретируется, как:
                  a.val.(операция + (b.val)).



                • Перестроение файла базы данных .APX


                  Чтобы перестроить потерянный или запорченный файл .APX, сделайте следующее:
                • Откройте файл проекта, содержащий цель AppsExpert и зависимые узлы (.IDE).

                • Выберите цель AppsExpert, щелкните на ней правой кнопкой
                  "мыши" и выберите в оперативном меню Special Rescan. После
                  завершения Rescan возвращает вас в окно проекта IDE.

                • Утилита WinSight

                • Начало работы

                • Запуск и приостановка обновления экрана

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

                • Область списка классов

                • Использование области списка классов

                • Наблюдение за классами

                • Область дерева окон

                • Поиск окна

                • Наблюдение за окнами

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

                • Использование области трассировки сообщений

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

                • Сообщения от "мыши"

                • Сообщения Windows

                • Сообщения ввода

                • Системные сообщения

                • Сообщения инициализации

                • Сообщения буфера вырезанного изображения

                • Сообщения DDE

                • Неклиентные сообщения

                • Сообщения печати

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

                • Сообщения пера

                • Сообщения мультимедиа

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

                • Сообщения, не документированные Microsoft



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


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


                  Поддержка этапа выполнения


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


                  Поддержка объектно-ориентированного программирования


                  ООП в корне меняет положение, снабжая программные объекты,
                  встроенными характеристиками, которые помогают справиться со все возрастающей сложностью разработки программного обеспечения.
                  Большинство новых возможностей Borland С++ - это поддержка ООП,
                  с его важнейшими понятиями: инкапсуляцией, наследованием и полиморфизмом.
                  Компилятор Borland C++ имеют и другие - не объектно-ориентированные расширения, улучшающие программирование по сравнению с последней версией компилятора фирмы Borland языка Си - Турбо Си версии 2.0.
                  Это - прототипы функций, встроенные функции, переопределяемые функции, функции-операции, предопределяемые аргументы, переменные-указатели, шаблоны, средства обработки исключительных ситуаций и другие.
                  Для информации ниже приводятся последние возможности, введенные
                  в четвертой версии компилятора.


                  Подготовка программ для отладки


                  Когда вы выполняете компиляцию и компоновку с помощью одного
                  из языков фирмы Borland, вам следует указать компилятору, что
                  нужно генерировать полную информацию для отладки. Если вы скомпилируете объектные модули своей программы без информации для отладки, вам придется перекомпилировать все эти модули, чтобы можно
                  было полностью использовать все средства отладки на уровне исходного кода. Можно также сгенерировать информацию для отладки только для отдельных модулей (это позволит сократить объем программы), но потом будет крайне неприятно попасть в модуль, где информация для отладки недоступна. Поэтому мы рекомендуем перекомпилировать все модули, если, конечно, вам это позволяет имеющаяся память. В случае нехватки памяти или уверенности в правильной работе отдельных модулей можно перекомпилировать только конкретные
                  модули. При компиляции программ для отладки лучше исключить оптимизацию, иначе вы запутаетесь при отладке отдельных частей кода,
                  оптимизированных компилятором.
                  При компиляции из интегрированной среды для включения в файлы .OBJ отладочной информации выберите команду Options Project
                  (для вывода блокноте Style Sheet), в блоке списка Topic выберите
                  Compiler Debugging и включите в OBJs кнопку с независимой фиксацией Debug. Чтобы включить отладочную информацию в выполняемые
                  файлы, выберите команду Options Project, затем команду Linker General в блоке списка Topic. Выводятся кнопки с независимой фиксацией General. Включите кнопку Debug Information.
                  При компиляции программ с использованием компилятора режима
                  командной строки используйте для включения отладочной информации
                  директиву компилятора -v.
                  После полной отладки программы вы можете скомпилировать и
                  скомпоновать ее заново с оптимизацией и исключением отладочной
                  информации.


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


                  Поскольку палитра CGA является предопределенной, подпрограмму setallpalette использовать в данном случае нельзя. Также не
                  следует использовать setpalette(индекс, фактический_цвет), за исключением индекс=0. (Это альтернативный способ установки фонового
                  цвета CGA равным фактическому цвету)


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


                  Эти подпрограммы обеспечивают динамическое распределение памяти для моделей данных small и large.

                  allocmem (dos.h) coreleft (alloc.h,
                  stdlib.h)
                  _dos_freemem (alloc.h, stdlib.h) _dos_allocmem (dos.h)
                  brk (alloc.h) farheapchecknode (alloc.h)
                  _dos_setblock (dos.h) farheapfree (alloc.h)
                  farcoreleft (alloc.h) farheapwalk (alloc.h)
                  farheapcheck (alloc.h) farrealloc (alloc.h)
                  farheapcheckfree (alloc.h) sbrk (alloc.h)



                  Подробная информация об окне


                  Двойное нажатие кнопки "мыши" или нажатие клавиши Enter на
                  элементе дерева окон приводит к выводу окна Window Detail (Подробная информация об окне), в котором кроме информации о классе окна показана полная информация об окне.


                  Подстановки с помощью макрокоманд


                  Используя специальный формат вызова макрокоманды, вы можете
                  вызвать макрокоманду, изменив ее текст. Вместо стандартной формы
                  вызова используйте следующую:
                  $(имя_макрокоманды:текст_1=текст_2)
                  При использовании такой формы вызова каждое вхождение в макрокоманду "текста_1" будет заменяться "текстом_2". "Имя_макрокоманды'" может быть одной из предопределенных макрокоманд. Это полезно использовать, если вы предпочитаете использовать в
                  макрокоманде один список файлов.В приведенном ниже примере макрокоманда SOURCE содержит список файлов C++, от которых зависит целевой файл. Командная строка TLINK изменяет все расширения .CPP
                  на соответствующие расширения .OBJ объектных файлов и компонует
                  их.
                  SOURCE = f1.cpp f2.cpp f3.cpp
                  myapp.exe: $(SOURCE)
                  bcc -c $(SOURCE)
                  tlink c0s $(SOURCE:.cpp=.obj),myapp,,cs
                  Между : и = не нужно включать лишних пробелов. Если после
                  двоеточия указывается пробел, MAKE будет пытаться найти строку,
                  включающую предшествующий пробел.


                  Поиск информации о событии


                  Стандартный способ интерпретации возвращаемой событием информации можно найти в документации по управляющему элементу VBX.
                  TVbxControl предусматривает ряд методов для получения информации
                  о событии.
                  Вы можете определить общее число событий, которые посылает
                  управляющий элемент VBX, с помощью функции GetNumEvents. События
                  индексируются начиная с 0.
                  Получить имя любого события в данном диапазоне вы можете с
                  помощью функции-элемента TVbxControl GetEventName, которая имеет
                  один параметр (индекс) и возвращает строку с именем события. Индекс события по его имени можно получить с помощью GetEventIndex.


                  Поиск окна


                  Утилита WinSight имеет специальный режим для поиска окон.
                  Она может работать двумя способами: идентифицируя строку в области дерева, соответствующую окну, на которое вы указываете, или
                  подсвечивая окно, выбираемое вами в дереве окон.
                  В любом случае режим поиска окна Find Window задается путем
                  выбора команды Spy Find Window. В данном режиме, когда "мышь" попадает на границы окна, вокруг окна появляется жирная рамка, и
                  окно в области дерева окон становится выделенным. Когда вы находитесь в режиме Find Window, все другие прикладных программы приостанавливаются.
                  Либо, находясь в режиме поиска окна, вы можете с помощью
                  "мыши" или клавиш управления курсором выбрать окно в области дерева окон, и утилита WinSight изобразит жирную рамку вокруг выбранного окна (или окон).


                  Полиморфизм


                  В переводе с греческого polymorphos - многообразный. Если один и
                  тот же объект может по-разному использоваться, в зависимости от
                  обстоятельств, то он обладает полиморфизмом. В какой-то степени
                  свойствами полиморфизма обладают, например, автомобили-амфибии -
                  используются для передвижения и по суше, и по воде. Чтобы достичь таких "чудес" в ООП используют "ранее" и "позднее связывание".
                  В результате получаются функции элементы, обладающие полиморфизмом, которые ведут себя по-разному, за счет своих различных свойств.

                  Например, как функция элемент draw():
                  rectangle.draw(); jigsaw.draw();


                  Полосы прокрутки


                  Полосы прокрутки - это основной механизм изменения пользовательского отображаемого элемента в окне приложения, блока списка
                  или комбинированного блока. Однако для выполнения специальной задачи вы можете построить отдельную полосу прокрутки. Для этого
                  используются объекты TScrollBar. Примеры вы можете найти в подкаталоге EXAMPLES\OWL\OWLAPI\SCROLLER.
                  Конструктор TScrollBar имеет 7 стандартных параметров конструктора объекта управляющего элемента (родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, и
                  также необязательный идентификатор библиотеки), а также параметр
                  флага, определяющий, является ли полоса прокрутки горизонтальной.
                  Если вы задаете нулевую высоту или ширину полосы прокрутки, то
                  Windows устанавливает стандартные ширину или высоту.
                  Конструктор TScrollBar строит полосы прокрутки со стилем
                  SBS_HORZ (горизонтальная) или SBS_VERT (вертикальная полоса). С
                  помощью Attr.Style объектов полосы прокрутки вы можете задать дополнительные стили.


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


                  При отсутствии в программе операций с плавающей точкой вы
                  можете сэкономить немного времени компиляции, выбрав значение параметра генерации операций с плавающей точкой None ("отсутствуют") (или параметр компилятора командной строки -f-). Тогда Borland C++ не будет выполнять компоновку ни с библиотекой
                  EMU.LIB, ни с FP87.LIB, ни с MATHx.LIB.


                  Получение справочной информации


                  Turbo Debugger предлагает несколько способов получения в ходе отладки справочной информации. - С помощью клавиши F1 вы можете получить доступ к развитой контекстной справочной системе. По
                  данной клавише на экран выводится список тем, из которых вы можете выбрать необходимую.
                  Индикатор активности в левом правом углу экрана всегда показывает текущее состояние. Например, если курсор находится в окне,
                  в индикаторе активности выводится READY. Если выводится меню, в
                  нем указывается MENU, а если вы находитесь в диалоговом окне PROMPT. Если вы, запутаетесь и не можете понять, что происходит в
                  отладчике, взгляните на индикатор активности.
                  В строке состояния в нижней части экрана всегда дается краткая информация об используемых клавиатурных командах. При нажатии
                  клавиши Alt или Ctrl данная строка изменяется. Когда вы находитесь в системе меню, эта строка предлагает вам оперативное описание текущей команды меню.


                  Последовательность поиска файлов в каталогах


                  При поиске библиотечных и включаемых файлов Borland С++ использует следующий алгоритм.
                • Если в исходный файл включен оператор #include ,
                  то Borland С++ ищет указанный в нем файл только в заданном
                  каталоге включаемых файлов (заголовков или библиотечных
                  файлов).

                • С другой стороны, если в программе содержится оператор
                  #include "file.h.", то Borland С++ ищет этот файла сначала
                  в текущем каталоге, а затем в каталогах включаемых файлов,
                  заданных в командной строке.

                • Неявные библиотеки Borland С++ ищет только в заданных библиотечных каталогах. Неявные библиотеки - это такие библиотеки, которые Borland С++ компонует автоматически, и объектный файл запуска (C0x.OBJ). Поиск Borland С++ явных библиотек зависит от того, как указано имя библиотечного файла. Явные библиотеки имеют
                  расширение .LIB. Если библиотека указывается без диска и каталога, то Borland С++ ищет ее сначала в текущем каталоге, а затем в
                  заданных библиотечных каталогах.
                • Построение приложений с помощью AppExpert

                • Использование AppExpert

                • Создание приложения

                • Параметры приложения

                • Базовые параметры

                • Продвинутые параметры

                • Параметры генерации кода

                • Параметры идентификационной информации

                • Параметры основного окна

                • Базовые параметры

                • Параметры клиентной области однодокументального интерфейса

                • Параметры клиентной области многодокументального интерфейса

                • Параметры дочерних окон и отображаемых элементов MDI

                • Базовые параметры дочерних окон и отображаемых элементов MDI



                • Построение администратора документа


                  Конструктор TDocManager имеет единственный параметр, который
                  используется для установки режима администратора документа:
                • Однодокументального интерфейса (SDI), в котором вы можете
                  каждый раз открывать только один документ. При открытии
                  нового документа администратор документа пытается закрыть
                  предыдущий документ.

                • Многодокументального интерфейса (MDI), где вы можете одновременно работать с несколькими документами и отображаемыми элементами или одним документом, представленным разными типами.

                • Чтобы открыть администратор документа в режиме SDI, нужно
                  вызвать конструктор с параметром dmSDI, а в режиме MDI - с параметром dmMDI. Другие параметры конструктора задает построение для
                  администратора документа собственное меню File, разрешают в меню
                  File команду Save даже если документ не изменен и запрещают в меню File команду Revert. После построения администратора документа
                  вы не можете изменить режим.


                  Построение части проекта


                  Часть проекта можно построить 3 способами:
                • Построением узла и зависимых от него узлов (выберите узел,
                  щелкните правой кнопкой "мыши" и выберите в SpeedMenu команду Build).

                • Для построения проекта с помощью MAKE выберите узел, который хотите построить, щелкните на узле правой кнопкой "мыши" и выберите в оперативном меню Make.

                • Для трансляции отдельного узла выберите узел, выберите команду Project Compile в основном меню или заданную по
                  умолчанию команду трансляции в SpeedMenu.



                • Построение и уничтожение объектов управляющих элементов


                  Построение объекта управляющего элемента отличается от построения любого другого дочернего окна. Обычно конструктор родительского окна вызывает конструкторы всех его дочерних окон. Кроме обычных связей, управляющие элементы взаимодействуют с родительскими окнами с помощью уведомлений. Чтобы построить и инициализировать объект управляющего элемента нужно:
                • добавить в родительское окно элемент данных - указатель на
                  родительское окно;

                • вызвать конструктор объекта управляющего элемента;

                • изменить атрибуты управляющего элемент;

                • инициализировать управляющий элемент в SetupWindow.

                • Часто при построении в окне управляющего элемента нужно сохранять указатель на управляющий элемент в элементе данных оконного объекта. Это делается для удобства доступа к функциям-элементам управляющего элемента. Для тех управляющих элементов, с которыми вы манипулируете редко (таких как статические элементы и
                  групповые блоки), такой указатель не требуется.
                  Некоторым конструкторам управляющих элементов передаются параметры, определяющие характеристики объектов управляющих элементов. Это следующие параметры:
                • указатель на объект родительского окна;

                • идентификатор ресурса;

                • координаты x и y верхнего левого угла;

                • высота и ширина;

                • идентификатор библиотеки (не обязательно).

                • Существуют также конструкторы, связывающие объект управляющего элемента с интерфейсным элементом, созданными из определения
                  ресурса.
                  Все управляющие элементы получают используемые по умолчанию
                  стили окна WS_CHILD, WS_VISIBLE, WS_GROUP и WS_TABSTOP. Для изменения стиля управляющего элемента используется его Attr.Style.
                  Каждый тип управляющего элемента имеет также собственные стили,
                  определяющие его конкретные характеристики. Стили окна наследуются из базовых классов. С помощью операций |= и &= вы можете задать маску стиля.
                  Интерфейсный элемент управляющего объекта автоматически создается функцией-элементом SetupWindow, которая наследуется из
                  объекта родительского окна. Инициализировать управляющие элементы
                  в конструкторе объекта родительского окна нельзя, так как в этот
                  момент они еще не созданы.
                  Для вывода управляющих элементов на экране вызывать функцию
                  Show не нужно. Управляющие элементы - это дочерние окна, и Windows автоматические выводит и отображает их вместе с родительским
                  окном. Однако Show можно использовать для вывода или сокрытия управляющего элемента, когда это требуется сделать.
                  За уничтожение управляющих элементов отвечает родительское
                  окно - они уничтожаются вместе с этим окном.


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


                  Конструктор TComboBox имеет 7 стандартных параметров конструктора объекта управляющего элемента (родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, а
                  также необязательный идентификатор библиотеки), а также стиль и
                  максимальную длину текста.
                  Комбинированный блок имеет стили WS_CHILD, WS_VISIBLE,
                  WS_GROUP, WS_TABSTOP, CBS_SORT (для сортировки элементов списка),
                  CBS_AUTOHSCROLL (позволяет пользователю вводить больше текста,
                  чем помещается в видимой области редактирования) и WS_VSCROLL
                  (вертикальная полоса прокрутки). Параметр стиля определяет тип
                  комбинированного блока Windows и может задаваться как CBS_SIMPLE,
                  CBS_DROPDOWN или CBS_DROPDOWNLIST. Длина текста задает максимальное число символов, выводимых в области редактирования.


                  Построение объекта диалогового блока


                  Диалоговые блоки строятся и создаются с помощью ресурса диалогового блока. Для создания ресурсов диалоговых блоков и связывания их с приложением можно использовать Resource Workshop или
                  другой редактор ресурсов. Ресурс диалогового блока описывает
                  внешний вид и расположение управляющих элементов, таких как управляющие элементы, командные кнопки, блоки списков и т.д. Ресурс
                  диалогового блока не отвечает за его поведение. Поведение определяется приложением.
                  Каждый ресурс диалогового блока имеет идентификатор, который
                  позволяет объекту диалогового блока задать, какой ресурс диалогового блока будет использоваться. Идентификатор может быть строкой
                  или целым числом. Вы можете передать этот идентификатор конструктору диалогового блока.
                  Для построения объекта диалогового блока создайте его, используя указатель на родительское окно и идентификатор ресурса.
                  Родительское окно почти всегда задается как this. Можно также использовать основное окно приложения (это единственное окно, всегда присутствующее в приложении ObjectWindows). Исключением является ситуация, когда вы задаете объект диалогового блока как клиентное окно в конструкторе TFrameWindow. Конструктор передает
                  объект диалогового блока функции TFrameWindow::Init, которая автоматически устанавливает родительский объект диалогового блока.


                  Построение объектов декорированных окон-рамок


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


                  Построение объектов меню


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

                  Конструктор Описание
                  TMenu() Создает пустое меню.
                  TMenu(HWND) Создает объект меню, представляющий текущее меню окна.
                  TMenu(HMENU) Создает объект меню из уже загруженного меню.
                  TMenu(LPCVOID*) Создает объект меню из шаблона меню в памяти.
                  TMenu(HINSTANCE, TResID) Создает объект меню из ресурса.



                  Построение объектов TFrameWindow


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


                  Построение оконных объектов


                  Оконные объекты представляют интерфейсные элементы. Объекты
                  подключаются к элементу через описатель, записанный в элемент
                  данных HWindow, который наследуется из TWindow. Когда вы строите
                  оконный объект, интерфейсный элемент еще не существует. Вы должны
                  создать его на отдельном шаге. TWindow создает также конструктор,
                  который можно использовать в DLL для создания оконного объекта с
                  уже существующим интерфейсным элементом.
                  Некоторые классы ObjectWindows 2.0 (TDialog, TMDIFrame, TTinyCaption, TMDIChild, TDecoratedFrame, TLayoutWindow, TClipboardViewer, TKeyboardModeTracker и TFrameWindow) используют TWindow
                  или TFrameWindow в качестве виртуально базы. В C++ сначала строятся виртуальные базовые классы. Это означает, что конструктор
                  производного класса не может задавать для конструктора базового
                  класса аргументы, используемые по умолчанию. Решить эту проблему
                  можно двумя способами:
                • При построении производных классов явным образом построить
                  промежуточный базовый класс или классы и все виртуальные
                  базовые классы.

                • Используя заданный по умолчанию конструктор виртуального
                  базового класса. Такой конструктор имеют и TWindow, и
                  TFrameWindow. Они имеют также функцию Init, которая позволяет задать параметры для базового класса. Ее можно вызвать в конструкторе базового класса для задания параметров
                  базового класса.



                • Построение приложений MDI


                  Для построения приложения MDI в ObjectWindows выполните следующие шаги:
                • Создайте окно-рамку MDI.

                • Задайте нужное поведение клиентного окна MDI.

                • Создайте дочерние окна MDI.

                • Специфическое для MDI поведение реализуется классами
                  TMDIXxx, поэтому вы можете сосредоточиться на специфическом для
                  приложения поведения.
                  Окно-рамка MDI всегда является основным окном приложения,
                  так что вы можете построить его в функции-элементе InitMainWindow
                  объекта приложения. Окна-рамки MDI отличаются от других окон-рамок (обрамляющих окон) следующим:
                • Рамка MDI всегда является основным окном и не имеет родительского окна.

                • Рамка MDI должна иметь меню, поэтому для конструктора
                  TMDIFrame в качестве параметра задается идентификатор ресурса меню. В других окнах-рамках вы можете для установки меню вызывать AssignMenu.

                • Поскольку в качестве окна-рамки MDI обычно используется экземпляр TMDIFrame, вам нужно добавить к своим клиентным оконным
                  классам MDI специфическое для приложения поведение. Окно-рамка
                  является владельцем меню и комплектов инструментальных средств и
                  передает в клиентное окно и приложение генерируемые ими команды.
                  Для манипуляции с дочерними окнами MDI TMDIClient имеет несколько функций-элементов. Команды меню дочернего окна приложения
                  MDI управляют клиентными окнами. TMDIClient автоматически отвечает на эти команды и выполняет соответствующие действия, задавая
                  вывод окон с перекрытием или без, упорядочивая пиктограммы или
                  закрывая их. Команды меню определены в файле заголовка ресурса
                  mdi.rh. При построении меню в сценарии ресурса не забудьте включить этот файл.
                  Дочерние окна MDI не должны отвечать на команды меню какого-либо дочернего окна. Это делает клиентное окно MDI. Создать
                  дочерние окна MDI можно двумя способами: автоматически в TMDIClient::InitChild или в другом месте.


                  Построение приложений с помощью AppExpert


                  В данном разделе рассказывается, как с помощью AppExpert
                  создавать приложения на базе ObjectWindows 2.0. AppExpert работает с Resource Workshop, классами ObjectWindows 2.0. Это позволяет
                  использовать при генерации приложения визуальный подход. AppExpert позволяет создавать программы Windows с такими средствами
                  как оперативное меню SpeedBar, строка состояния, структура меню,
                  оперативный справочник, средство предварительного просмотра на
                  экране печатаемой информации и средства работы с документами.


                  Построение проекта


                  Для построения проекта следует:
                • Открыть проект с помощью команды Project Oрen Project.

                • Для построения всех узлов проекта выберите в основном меню
                  Project Build all. Для построения только измененных - Project Make.

                • Если не задана другая таблица стилей, то используется таблица, заданная по умолчанию. Администратор проекта начинает работать с первой цели и прорабатывает проект сверху вниз, пока не
                  дойдет до узла без зависимостей. Этот узел строится первым, а затем дерево обрабатывается в обратном направлении.


                  Построение TView


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


                  Для построения приложения Win32 вы


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

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

                  Параметры Параметры Библиотеки Код Создаваемый

                  BCC32 TLINK запуска файл

                  -W, -WE /Tpe cw32.lib c0w32.obj GUI.EXE

                  import32.lib

                  -WD, -WDE /Tpd cw32.lib c0x32.obj GUI.DLL

                  imprtw32.lib

                  -WC /Tpe/ap cx32.lib c0d32.obj Console.EXE

                  import32.lib

                  -WCD, -WCDE /Tpd/ap cx32.lib c0d32.obj Console.DLL

                  imprtw32.lib


                  Потоки ввода-вывода


                  Потоком ввода-вывода называется абстрактное понятие, относящееся
                  к любому переносу данных от источника (или поставщика данных) к приемнику (или потребителю) данных.
                  В Турбо и Borland C++ используется новый способ работы с потоками ввода-вывода, который заключается в использовании операций '>>' и
                  '<<'. Функции потоков сокращают время разработки программы, избавляя
                  от необходимости непосредственно иметь дело с различными типами форматов, которые требуются для функций рrintf и scanf. Ниже показан сравнительный пример:
                  Си Турбо и Borland C++
                  #include #include
                  main() main()
                  { {
                  int k; int k;
                  printf("Введите число: "); cout << "Введите число: ";
                  scanf("%d", &k); cin >> k;
                  printf("Число: %d\n", k); cout << "Число: " << k;
                  } }
                  cout - стандартный выходной поток (по умолчанию - экран). Данные
                  (например, значения переменных и строки) посылаются в поток с помощью
                  операции <<. Операция << (читающаяся как "поместить в...") пересылает
                  данные справа от нее в поток слева.
                  cin - стандартный входной поток (обычно - клавиатура). Значения,
                  вводимые с клавиатуры, присваиваются переменным с помощью операции
                  >>. Использование операций >> и << для потоков ввода/вывода является
                  типичным примером переопределения операций в С++ (см. "Переопределение операций").
                  Кроме cout и cin в библиотеке iostream предопределены - cerr
                  (стандартное устройство для вывода сообщений об ошибках, соответствующее stderr в Си) и clog (полностью буферизованная версия cerr (в Си
                  эквивалента нет).
                  Реальное преимущество при работе с потоками С++ заключается в
                  той простоте, с какой можно переопределять операторы << и >> при работе с собственными типами данных. В C++ есть два класса, istream и
                  ostream, которые можно использовать для ввода в объекты и вывода из
                  них. Возможно написание собственных функций элементов работы с потоками, что и демонстрируется в следующем примере:



                  struct clock { // Простая структура данных

                  int hr, min, sec;

                  clock( int h, int m, int s) { hr = h; min = m; sec = s; }

                  };

                  Для переопределения << для вывода объектов типа clock требуется

                  следующее определение:

                  Поток вывода из объекта и '<<'

                  v v v

                  ostream& operator<<(ostream& strm, clock& c)

                  {

                  strm << c.hr << ":" << c.min << ":" << c.sec;

                  } ^

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

                  операции

                  Заметим, что переопределенная операция << должна возвращать

                  ostream&, то есть ссылку на ostream, Теперь можно организовать вывод

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

                  clock c(12,31,55);

                  cout << c;

                  Вывод на принтере будет следующим:

                  12:31:55

                  Дополнительную информацию о потоках ввода-вывода можно получить

                  в руководстве программиста Турбо и Borland C++. В нем дана детальная

                  информация: по библиотеке iostream (определенной в файле iostream.h);

                  о форматировании ввода и вывода; о манипуляторах потока; вводе-выводе

                  в файл; режимах открытия файла; строковой обработке потока, а также

                  всех классах потоков: filebuf, fstream, fstreambase, ifstream, ios,

                  iostream, iostream_withassign, istream, istream_withassign,

                  istrstream, ofstream, ostream, ostream_withassign, ostrstream,

                  streambuf, strstreambase, strstreambuf, strstream.


                  Потоковые классы С++


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

                  Файл заголовка Классы
                  constrea.h conbuf, constream (только для приложений консольного режима).
                  iostream.h ios, iostream, iostream_withassign, istream,
                  istream_withassign, streambuf
                  fstream.h filebuf, fstream, ostream, strstream, strstre-
                  ambase, strstreambuf.



                  Потоковый ввод


                  Потоковый ввод аналогичен выводу, но использует переопределенную операцию сдвига вправо, >>, и называется операцией извлечения, или извлечением. Левый операнд операции >> представляет
                  собой объект типа класса istream. Как и для вывода, правый операнд может быть любого типа, для которого определен вывод потоком.
                  По умолчанию операция >> опускает пробельные символы (как
                  определено функцией isspace в ctype.h), а затем считывает символы, соответствующие типу объекта ввода. Пропуск пробельных символов управляется флагом ios::skipws в перечислимой переменной состояния. Флаг skipws обычно устанавливает пропуск пробельных
                  символов. Очистка этого флага (например, при помощи setf) выключает пропуск пробельных символов. Отметим также специальный манипулятор "приемника", ws, который позволяет игнорировать пробельные символы.
                  Рассмотрим следующий пример:
                  int i;
                  double d;
                  cin >> i >> d;
                  Последняя строка вызывает пропуск пробельных символов. Цифры, считываемые со стандартного устройства ввода (по умолчанию
                  это клавиатура), преобразуются затем во внутренний двоичный формат и записываются в переменную i. Затем снова пропускаются пробельные символы, и наконец считывается число с плавающей точкой, которое преобразуется и записывается в переменную d.
                  Для типа char (signed или unsigned) действие операции >>
                  состоит в пропуске пробельных символов и записи следующего
                  (непробельного) символа. Если вам требуется прочесть следующий
                  символ, неважно, является ли он пробельным или нет, то можно использовать одну из функций-элементов get.
                  Для типа char* (рассматриваемого как строка) действие операции >> состоит в пропуске пробельных символов и записи следующих
                  (непробельных) символов до тех пор, пока не встретится следующий
                  пробельный символ. Затем добавляется завершающий нулевой (0) символ.


                  Потоковый вывод


                  Потоковый вывод выполняется с помощью операции включения <<.
                  Стандартная операция сдвига влево << для операций вывода переопределяется. Ее левый операнд - это объект типа ostream, а правый
                  операция может иметь любой тип, для которого определен потоковый
                  вывод (то есть основной тип или любой из переопределенных для него типа). Операция << ассоциируется слева направо и возвращает
                  ссылку на объект ostream, для которого она вызывается. Это позволяет выполнять каскад операций.


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


                  В случае переопределяемых функций компилятор умеет отличать один
                  вызов от другого по типу их аргументов. Используя эту информацию, он
                  "жестко" связывает коды программы с соответствующими функциями элементами. С другой стороны, бывает необходимо отличить один вызов от
                  другого, при наличии аргументов одного типа на этапе выполнения, и
                  обеспечить потомки класса разными версиями функций базового класса.
                  Именно использование ключевого слова virtual приводит к отсрочке связывания, и вызову нужной функции на этапе выполнения.
                  Виртуальная функция элемент - это функция, которая будучи описана в потомках, замещает собой соответствующую функцию элемент везде -
                  даже в предке, если она вызывается для потомка. В отличии от раннего
                  связывания с использованием переопределяемых функций элементов, виртуальные функции элементы должны иметь аргументы одного типа.
                  Синтаксис определения виртуальных функций элементов очень прозрачный: добавьте слово virtual к первому определению функции элементу:
                  virtual void Show();
                  virtual void Hide();
                  Внимание! Только встроенные функции элементы могут быть объявлены как виртуальные. Как только функция объявлена виртуальной, она не
                  может быть переопределена ни в каком наследуемом классе с однотипным
                  перечнем аргументов, но с другим типом возвращаемого значения. Если
                  вы переопределяете Show с тем же перечнем однотипных аргументов и таким же типом возвращаемого значения, то новая функция Show автоматически становится виртуальной, независимо от того, используется ключевое слово virtual или нет. В этом случае говорят, что новая виртуальная Show замещает Show в своем базовом классе.
                  Вы можете свободно переопределять Show с другим перечнем разнотипных аргументов (изменяя при этом тип возвращаемого значения или
                  нет), но виртуальный механизм не задействуется для такой версии Show.
                  Какая именно функция элемент Show будет вызвана - зависит только
                  от класса объекта, для которого вызывается Show, даже если вызов производится через указатель на базовый класс. Например,
                  Circle ACircle
                  Point* APoint_рointer = &ACircle; // указатель на Circle,
                  // которому присваивается
                  // значение указателя на
                  // базовый класс, Point
                  APoint_рointer->Show(); // вызывает Circle::Show!
                  Так как вызов невиртуальной функции-элемента выполняется несколько быстрее, чем виртуального, то в общем случае рекомендуется,
                  когда не встает вопрос о расширяемости, но существенное значение имеет производительность, пользоваться обычными функциями элементами. В
                  противном случае, нужно пользоваться виртуальными.


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


                  Borland C++ имеет следующие предопределенные глобальные
                  идентификаторы. За исключением __cplusplus и _WINDOWS, каждый из
                  них и начинается, и заканчивается двумя символами подчеркивания
                  (__). Эти макрокоманды также называют именованными константами.

                  __BCOPT__
                  Эта макрокоманда определена (как строка "1") в любом компиляторе, имеющем оптимизатор.
                  __BCPLUSPLUS__
                  Эта макрокоманда специфична для семейства компиляторов
                  Borland Си и C++. Она определена только для компиляции с помощью
                  C++. Если вы выбрали компиляцию С++, то данная макрокоманда определена как шестнадцатиричная константа 0x0320. Это численное значение в последующих версиях будет увеличено.
                  __BORLANDC__
                  Эта макрокоманда специфична для семейства компиляторов
                  Borland Си и C++. Она определена как шестнадцатиричная константа
                  0x0400. Это численное значение в последующих версиях будет увеличено.
                  __CDECL__
                  Данная макрокоманда специфична для компилятоpов Borland Си и
                  C++. Она сообщает о том, что флаг соглашения по вызову языка Паскаль не использовались. Она устанавливается равной целочисленной
                  константе 1, если вызов не использовался; в противном случае она
                  не определена.
                  Следующие символические имена определяются согласно выбранной во время компиляции модели памяти:

                  __COMPACT__
                  __MEDIUM__

                  __HUGE__
                  __SMALL__

                  __LARGE__
                  __TINY__
                  Для конкретной компиляции определенным является только одна
                  из этих макрокоманд. Прочие по определению не определены. Например, если при компиляции выбрана малая модель памяти (small), то
                  макрокоманда __SMALL__ определена, а остальные не определены, поэтому директива:
                  #if defined(__SMALL__)
                  даст значение True (истина), а:
                  #if defined(__HUGE__)
                  (либо любая другая из оставшихся) даст значение False (ложь).
                  Фактическое значение любой из этих макрокоманд, когда она определена, равно 1.
                  __cplusplus
                  Данная макрокоманда в pежиме C++ имеет значение 1; в пpотивном случае, она не опpеделена. Она позволяет написать модуль, который в некоторых случаях будет компилироваться в Си, а в некоторых - в С++. Использование условных директив компиляции позволяет
                  управлять тем, какие части программы для Си и С++ будут включаться в компиляцию.
                  __DATE__
                  Данная макрокоманда дает дату начала обработки препроцессором данного исходного файла (в виде строкового литерала). Каждое
                  включение __DATE__ в данный файл дает одно и то же значение, независимо от того, сколько времени продолжается обработка файла
                  препроцессором. Дата имеет форму mmmddyyyy, где mmm это месяц
                  (Jan, Feb и т.д.), dd равно числу месяца (от 1 до 31, причем если
                  это число меньше 10, то первый символ d равен пробелу), а yyyy это год (1990, 1991 и т.д.)
                  __DLL__
                  Эта макрокоманда специфична для семейства компиляторов
                  Borland Си и С++. Она определена как 1, если компилятоp командной
                  стpоки выполняет компиляцию модуля с параметром -WD или в меню
                  O|C|Entry/Exit Code выбиpается селективная кнопка Windows DDL All
                  Functions Exportable для генерации кода библиотек DLL Windows. В
                  противном случае макрокоманда не определена.
                  __FILE__
                  Данная макрокоманда дает имя текущего обрабатываемого препроцессором исходного файла (в виде строкового литерала). Когда
                  препроцессор обрабатывает директиву #include или #line, либо при
                  завершении обработки включаемого файла, данная макрокоманда соответствующим образом меняет свое значение.
                  __LINE__
                  Данная макрокоманда дает количество обработанных препроцессором к данному моменту строк текущего исходного файла. Обычно
                  первая строка исходного файла определяется с номером 1, хотя на
                  это может повлиять директива #line. Информацию о директиве #line
                  см. выше.
                  __MSDOS__
                  Данная макрокоманда специфична для Borland Си и C++. Он дает
                  целочисленную константу 1 для всех случаев компиляции.
                  __MT__
                  Эта макрокоманда может использоваться только 32-разрядными
                  компиляторами. Если используется параметр -WM (он задает компоновку мультинитевой библиотеки), эта макрокоманда определена как 1.
                  __OVERLAY__
                  Данная макрокоманда специфична для Borland Cи и С++. Она
                  предопределена как 1, если модуль компилируется с параметром -Y
                  (включена поддержка оверлейных структур). Если оверлейные структуры не поддерживаются, то данная макрокоманда не определена.
                  __PASCAL__
                  Данная макрокоманда специфична для Borland Cи и С++. Она
                  сообщает о том, что был использован флаг -p или из меню
                  O|C|C|Exit/Entry была выбpана команда Pascal calling conventions.
                  В этом случае макрокоманда установлена равной целочисленной
                  константе 1; в противном случае она не определена.
                  __STDC__
                  Данная макрокоманда определена равной константе 1, если компиляция выполняется при установленном флаге совместимости со
                  стандаpтом ANSI (-A) или выбpанной из меню Source Options селективной кнопке ANSI. В противном случае макрокоманда не определена.
                  __TCPLUSPLUS__
                  Данная макрокоманда специфична для Borland Cи и С++. Она определена только для компиляции С++. Если вы выбрали компиляцию
                  С++, она определена как шестнадцатиричная константа 0x0320.
                  __TEMPLATES__
                  Данная макрокоманда специфична для Borland Cи и С++. Она определена как 1 для файлов С++ (это означает, что C++ поддеpживает
                  шаблоны); в пpотивном случае, она не опpеделена.
                  __TIME__
                  Данная макрокоманда дает время начала обработки препроцессором текущего исходного файла (в виде строкового литерала).
                  <


                  Как и в случае макрокоманды __DATE__, каждое включение

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

                  hh:vv:ss, где hh - это часы (от 00 до 23), mm - это минуты (от 00

                  до 59), а ss - это секунды (от 00 до 59).



                  __TLC__



                  Эта макрокоманда всегда имеет значение True при использовании 32-битового компилятора. См. описание ключевого слова __thread.


                  __TURBOC__



                  Данная макрокоманда специфична для Borland Cи и С++. Она

                  опpеделена как шестнадцатиричная константа 0x0410. Это числовое

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


                  __WIN32__



                  Для 32-разрядного компилятора эта макрокоманда всегда определена. Она определена для консольных приложений и приложений

                  GUI.


                  _Windows



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

                  с любым включенным параметром -W (генерация прикладной программы

                  для Windows). Если ни один из этих параметров не включен, то данная макрокоманда не определена.

                  Предопределенные макрокоманды утилиты MAKE



                  Макрокоманда Описание
                  __MSDOS__ Имеет значение 1, если MAKE выполняется в DOS.
                  __MAKE__ Номер версии MAKE в шестнадцатиричном виде (для
                  данной версии "Ox0370").
                  MAKE Имя выполняемого файла MAKE (обычно MAKE или MAKER.
                  MAKEFLAG Все параметры, используемые в командной строке
                  утилиты MAKE.
                  MAKEDIR Каталог, из которого запущена утилита MAKE.



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


                  Утилита MAKE содержит в себе несколько специальных встроенных макрокоманд: $d, $*, $<, $:, $. и $&. Первая из них осуществляет проверку на существование макрокоманды с заданным именем.
                  Он используется в директивах !if и !elif. Остальные представляют
                  собой макрокоманды имен файлов, используемые в явных и неявных
                  правилах. В дополнение к этому, в качестве макрокоманд автоматически загружаются строки установленной к настоящему моменту среды
                  DOS (строки, которые можно просматривать и задавать в DOS с помощью команды SET). Наконец, в MAKE определяются несколько предопределенных макрокоманд, показанных ниже:


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


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

                  Префиксы команд


                  Префиксы, допустимые в команде, модифицирует интерпретацию
                  этих команд утилитой MAKE. Префиксом является либо символ @, либо
                  дефис (-), за которым непосредственно следует какое-либо число.

                  Префикс Действие
                  @ Указывает утилите MAKE, что не нужно отображать
                  команды перед их выполнением. Отображение не осуществляется даже в том случае, если в командной строке утилиты MAKE не задается параметр -s. Этот
                  префикс применяется только к тем командам, перед
                  которыми он указывается.
                  -num Оказывает влияние на то, как утилита MAKE интерпретирует коды выхода. Если задается какое-либо число num, то утилита MAKE прекращает обработку
                  только в том случае, если полученный код выхода превышает заданное число. В приведенном ниже примере утилита MAKE прекращает работу только в том случае, если код выхода превышает 4:
                  -4myрrog samрle.x
                  Если префикс -num не задается, а код выхода является ненулевым, то утилита MAKE прекращает работу и удаляет текущий результирующий файл.

                  Примечание: Коды выхода являются значениями, которые возвращаются выполняемыми командами (внутри программы).
                  - Если задается дефис, но не задается никакого числа, то утилита MAKE совсем не будет проверять код выхода. Независимо от кода выхода выполнение утилиты MAKE будет продолжено.



                  Префиксы


                  Допустимы следующие префиксы:
                  lock rep repe repne repnz repz


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


                  В IDE вы можете конвертировать файлы проекта (.IDE) в формирующие файлы (.MAK). Для этого откройте файл проекта и выберите
                  Project Generate Makefile.


                  Преобразование старых проектов


                  Администратор проектов данной версии может загружать и использовать проекты предыдущих версий Borland С++ for Windows. Выберите Project Open Project и наберите имя старого файла проекта.
                  Администратор проектов преобразует старый проект в новый. С помощью Options Save сохраните проект. Он сохраняется со старым
                  именем и новым расширением .IDE.


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


                  Тип bcd - это определяемый тип, отличный от float, double
                  или long double. Десятичная арифметика выполняется только когда
                  хотя бы один операнд имеет тип bcd.
                  Для преобразования двоично-десятичного числа обратно к обычной системе счисления с основанием 2 (тип float, double или long
                  double), служит функция-элемент real класса bcd. Функция real выполняет все необходимые преобразования к типам long, double или
                  lognd double, хотя такое преобразование не выполняется автоматически. Функция real выполняет все необходимые преобразования к
                  типу long double, который может быть затем преобразован к другим
                  типам при помощи обычных средств языка Си. Например:
                  /* Печать чисел BCD */
                  #include
                  #include
                  #include
                  void main(void) {
                  bcd a = 12.1;
                  double x = real(a); /* преобразование для печати
                  printf("\na = %Lg", real(a));
                  printf("\na = %g", (double)real(a));
                  cout << "\na =" << a; /* рекомендуемый метод
                  Отметим, что поскольку printf не выполняет контроль типа аргументов, спецификатор формата должен иметь L, если передается
                  значение real(a) типа long double.


                  Прерывание выполнения программы


                  При выполнении программы вы можете получить доступ к отладчику, нажав клавишу прерывания программы. Используемые клавиши зависят от типа отлаживаемого приложения:
                • при отладке программ Windows 3.х используйте клавиши
                  Ctrl+Alt+SysRq;

                • при отладке программ Windows 32s используйте клавиши
                  Ctrl+Alt+F11;

                • при отладке программ Windows NT используйте клавишу
                  F12;

                • при отладке программ DOS используйте клавиши Ctrl+Break.

                • Это полезно использовать, когда в программе не установлены
                  точки останова.
                  Если при возврате в Turbo Debugger вы увидите окно CPU без
                  соответствующих программе инструкций, то возможно вы находитесь в
                  коде ядра Windows. При этом следует установить точку останова в
                  том месте, где должна выполняться ваша программа. Затем выполните
                  программу до точки останова (F9). После этого можно возобновить
                  отладку. Находясь в ядре Windows, не следует пытаться выполнять
                  программу по шагам или пытаться перезагрузить приложение. Это может привести к краху системы.


                  Приложения MDI


                  В каждом приложении MDI присутствуют определенные компоненты. Это основное окно (окно-рамка MDI), клиентное окно MDI в окне-рамке, содержащее дочерние окна (окна MDI) и др. При использовании классов Doc/View приложение может помещать в окна MDI отображаемые элементы.
                  Приложение MDI обычно имеет пункт меню Window, который управляет дочерними окнами MDI. Меню Window обычно имеет такие
                  пункты как Tile, Cascade, Arrange и Close All. Имя каждого открытого окна MDI автоматически добавляется в конец данного меню, а
                  текущее выбранное окно отмечается.
                  Дочерние окна MDI имеют некоторые характеристики перекрывающегося окна. Их можно максимизировать до полного размера клиентного окна MDI или минимизировать в пиктограмму внутри клиентного окна. Дочерние окна MDI никогда не выводятся вне своих клиентных
                  окон и окон-рамок. Хотя дочерние окна MDI не могут иметь меню,
                  можно использовать меню окна-рамки.
                  Для каждого типа окна MDI в ObjectWindows определены классы
                  TMDIFrame, TMDIClient и TMDIChild. В ObjectWindows окно-рамка MDI
                  владеет клиентным окном MDI, а клиентное окно MDI является владельцем каждого дочернего окна MDI.
                  Функции-элементы TMDIFrame управляют окном-рамкой и его меню. ObjectWindows сначала передает команды активному окну, а затем - его родительскому окну, поэтому клиентное окно может обрабатывать команды окна-рамки. Обычно создается экземпляр TMDIFrame. Так как TMDIChild является производным от TFrameWindow, оно
                  может быть окном-рамкой с клиентным окном. Таким образом, вы можете создать специализированные окна TMDIChild. Стиль их может
                  зависеть от конкретного приложения.


                  Пример класса с виртуальными функциями элементами


                  Определим класс shape с двумя виртуальными функциями элементами:
                  class shape {
                  public:
                  double xo, yo;
                  shape(double x, double y); // Конструктор создания shape (фигуры)
                  virtual double area(void); // Функция вычисляющая поверхность
                  virtual void draw(void); // Функция рисования shape
                  };
                  Ниже показано, как устроен просмотр таблицы виртуальных функций
                  объектами данного класса.
                  Данные объекта Таблица Нужная
                  shape виртуальных функция
                  функций
                  >
                  xo, yo (*area)() * > shape::area()
                  vptr * (*draw)() * > shape::draw()
                  При вызове объектов shape функцией draw(), выполняется подстановка кода следующим образом:
                  My_shape.draw() > *my_shape.vptr1([]);
                  Каждая виртуальная функция элемент проиндексирована в таблице.
                  Это индексирование выполняется во время компиляции.

                  Для создания новых классов из shape можно использовать наследование и порождение.
                  class circle : public shape {
                  public:
                  double radius;
                  circle(double x, double y, double r);
                  double area(void); // Переопределяет shape::area()
                  void draw(void); // Переопределяет shape::draw()
                  };
                  Ниже показано, как устроен будет устроен просмотр таблицы виртуальных функций элементов сейчас:
                  Данные объекта Таблица Нужная
                  circle виртуальных функция
                  функций
                  >
                  xo, yo (*area)() * > circle::area()
                  radius
                  (*draw)() * > circle::draw();
                  vptr *
                  Класс circle копируют таблицу виртуальных функций элементов из
                  класса shape. Каждая виртуальная функция переопределяется классом
                  circle путем передачи входов модифицированной таблице.
                  Таблицы виртуальных функций элементов позволяют однозначно
                  использовать указатели на объекты и гарантировать точность вызова
                  виртуальных функций.
                  shape *p; // Объявление родового указателя shape
                  shape s(0,0); // исходной точки фигуры shape
                  circle c(10,10,50); // и круга circle фигуры shape
                  p = &s; // Точка фигуры shape
                  p->draw(); // Вызов shape::draw()
                  p = &c; // Точка круга circle
                  p->draw(); // Вызов circle::draw()
                  Так c помощью виртуальных функций мы можем управлять поведением
                  объектов. Вот таков полиморфизм в действии.
                  Обсудим порядок объявления виртуальных функций элементов.


                  Пример наследования


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

                  В этом примере из базового класса shape порождается класс
                  circle:
                  class shape { < Объявление класса
                  public:
                  double xo, yo; < Данные (координаты)
                  shape(double x, double y); < Конструктор
                  virtual double area(void); < Виртуальная функция элемент
                  };
                  Связывание порожденного класса с базовым
                  v
                  class circle : public shape { < Объявление порожденного класса
                  public:
                  double radius; < Дополнительные данные
                  double area(void); < Заимствованная функция элемент
                  circle(double x, double y, double r); < Конструктор
                  };


                  Ниже приведены некоторые примеры явных


                  Ниже приведены некоторые примеры явных правил:
                  1. рrog.exe: myрrog.obj рrog2.obj
                  BCC myрrog.obj рrog2.obj
                  2. myрrog.obj: myрrog.c include\stdio.h
                  BCC -c myрrog.c
                  3. рrog2.obj: рrog2.c include\stdio.h
                  BCC -c -K рrog2.c
                  Эти три примера взяты из одного и того же формирующего файла. Повторно будут обрабатываться только те модули, которые подвергались модификациям. Если был модифицирован файл PROG2.C, то будет перекомпилироваться только этот файл. То же самое справедливо для файла MYPROG.C. Но если был изменен файл включения stdio.h, то будут перекомпилированы оба файла. Перекомпоновка будет осуществляться в том случае, если был модифицирован хотя бы один из объектных файлов, указанных в списке зависимости. Это имеет место в том случае, если в результате изменения исходного файла была произведена перекомпиляция.

                  Ниже приводится несколько простых примеров,


                  Ниже приводится несколько простых примеров, демонстрирующих
                  различные операции, которые могут быть выполнены утилитой TLIB.
                • Чтобы создать библиотеку с именем MYLIB.LIB, в которую
                  должны входить модули X.OBJ, Y.OBJ и Z.OBJ, введите:
                  tlib mylib +x +y +z

                • Чтобы создать библиотеку как в примере #1, но наряду с
                  этим получить файл списка MYLIB.LST, введите:
                  tlib mylib +x +y +z, mylib.lst

                • Чтобы получить файл списка CS.LST существующей библиотеки
                  CS.LIB, введите:
                  tlib cs, cs.lst

                • Чтобы заменить модуль X.OBJ на новую версию, добавить модуль A.OBJ и удалить модуль Z.OBJ из библиотеки
                  MYLIB.LIB, введите:
                  tlib mylib -+x +a -z

                • Чтобы извлечь модуль Y.OBJ из библиотеки MYLIB.LIB и получить файл списка MYLIB.LST, введите:
                  tlib mylib *y, mylib.lst

                • Чтобы создать при помощи файла подсказки новый файл библиотеки с именем ALPHA, в который войдут модули A.OBJ,
                  B.OBJ,... , G.OBJ:
                  Сначала создайте текстовый файл ALPHA.RSP, содержащий
                  строки:
                  +a.obj +b.obj +c.obj &
                  +d.obj +e.obj +f.obj &
                  +q.obj
                  Затем введите команду TLIB, которая создает файл списка
                  ALPHA.LST:
                  tlib alрha @alрha.rsр, alрha.lst

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

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


                  001: #include
                  002:
                  003: class decompressor {
                  004: int srclen, c, rcnt;
                  005: unsigned char *p;
                  006: public:
                  007: decompressor(unsigned char *s, int len);
                  008: int next(void);
                  009: };
                  010:
                  011: decompressor::decompressor(unsigned char *s, int len)
                  012: {
                  013: p = s; srclen = len; rcnt = 0;
                  014: }
                  015:
                  016: int decompressor::next(void)
                  017: {
                  018: if (rcnt && rcnt-- > 0) return c; // Декомпрессия
                  019: if (!srclen || srclen-- <= 0) return -1;
                  020:
                  021: c = *p++; // Поместить следующий символ в буфер
                  022: if (c == 0xff) {
                  023: rcnt = *p++ - 1; // Отсчитать один записанный символ
                  024: c = *p++; // Здесь символ повторен
                  025: srclen -= 2;
                  026: }
                  027: return c;
                  028: }
                  029:
                  030: unsigned char buff[] = {'a',0xff,3,'b','c'};
                  031:
                  032: main()
                  033: {
                  034: int c;
                  035: decompressor dc(buff, sizeof(buff));
                  036:
                  037: while ((c = dc.next()) != -1) putchar(c);
                  038: return 0;
                  039: }


                  Продвинутые параметры


                  Продвинутые параметры определяют поведением приложения и его
                  внешним видом.


                  Проектирование шаблона документа


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


                  Программирование для Windows


                  В данном разделе описываются различные вопросы, касающиеся
                  16- и 32-разрядному программированию в Windows, включая файлы
                  сценариев ресурсов, файлы определения модулей, библиотеки импорта, файлы проектов и администратор проектов, администратор динамически распределяемой области памяти и 32-разрядное программирование в Windows.
                  Кроме компиляции исходного кода и компоновки файлов .OBJ,
                  программист, работающий в Windows, должен компилировать файлы
                  сценария ресурсов и связывать ресурсы с выполняемым файлом. Он
                  должен также иметь представление о динамической компоновки, библиотеках динамической компоновки (DLL) и библиотеках импорта.
                  Кроме того, при работе с интегрированной средой Borland C++ (IDE)
                  полезно знать, как использовать администратор проектов, который
                  автоматизирует построение приложения. Процесс построения приложения в Windows иллюстрируется следующей схемой:
                  4
                  .C v
                  .ASM
                  RW
                  1 .CPP BCC TASM
                  .INC
                  v
                  .H v v
                  .RC
                  .H .H
                  v v v v
                  2 .DEF TLINK .LIB BRC RW
                  -
                  v v v
                  .EXE .RES 5
                  v v
                  BRC
                  v
                  .EXE 6
                  При компиляции и компоновке программы Windows выполняются
                  следующие шаги:
                • Исходный код компилируется или ассемблируется и создаются
                  файлы .OBJ.

                • Файлы определения модулей (.DEF) сообщают компоновщику,
                  какой вид выполняемых файлов вы хотите получить.

                • Resource Workshop (или какой-либо другой редактор ресурсов) создает ресурсы, такие как пиктограмммы или битовые
                  массивы. Создается файл ресурса (.RC).

                • Файл .RC компилируется компилятором ресурсов или с помощью Resource Workshop. На выходе получается двоичный
                  файл .RES.

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



                • Программирование со смешанными моделями и модификаторы адресации


                  Borland C ++ вводит восемь новых ключевых слов, отсутствующих в языке Си стандарта ANSI (near, far, huge, _cs, _ds, _es, _ss и _seg), которые с некоторыми ограничениями и предупреждениями могут использоваться в качестве модификаторов для указателей
                  (и в некоторых случаях, для функций).
                  В Borland C++ при помощи ключевых слов near, far или huge вы
                  можете модифицировать объявления функций и указателей. Указатели
                  данных near, far и huge рассматривались в выше. Объекты far объявляются при помощи ключевого слова far. Функции near запускаются
                  при помощи ближних вызовов (near), а выход из них происходит с
                  использованием ближних команд возврата. Аналогичным образом,
                  функции far вызываются дальними вызовами (far) и выполняют дальний (far) возврат. Функции huge похожи на функции far, за исключением того, что функции huge устанавливают регистр DS в новое значение, тогда как функции far не изменяют значения этого регистра.
                  Существует также четыре специальных ближних (near) указателя
                  данных: __cs, __ds, __es и __ss. Имеются 16-битовые указатели,
                  конкретно связанные с соответствующими сегментными регистрами.
                  Например, если вы объявите указатель следующим образом:
                  char _ss *p;
                  то p будет содержать 16-битовое смещение в сегмент стека.
                  Функции и указатели в данной программе по умолчанию бывают
                  ближними или дальними, в зависимости от выбранной модели памяти.
                  Если функция или указатель являются ближними, то они автоматически связываются с регистром CS или DS.
                  В следующей таблице показано, как это происходит. Отметим,
                  что размер указателя соответствует предельному размеру памяти,
                  равному 64К (ближний, в пределах сегмента) или 1 Мб (дальний, содержит собственный адрес сегмента).


                  Программирование в графическом режиме


                  В данном разделе приводится краткое изложение функций, используемых в графическом режиме.
                  Borland C++ имеет отдельную библиотеку с более чем 70 графическими функциями, начиная от функций высокого уровня (таких как
                  setviewport, bar3d и drawpoly) и кончая бит-ориентированными
                  функциями (типа getimage и putimage). Графическая библиотека поддерживает многочисленные типы линий и заполнителей, а также предоставляют вам различные текстовые шрифты, которые вы можете изменять по размерам, способу выравнивания, а также ориентировать
                  их либо по горизонтали, либо по вертикали.
                  Эти функции находятся в библиотечном файле GRAPHICS.LIB, а
                  их прототипы - в файле заголовка graphics.h. Кроме этих двух файлов, в состав графического пакета входят драйверы графических устройств (файлы *.BGI) и символьные шрифты (файлы *.CHR). Эти дополнительные файлы рассматриваются в следующих разделах.
                  Если вы используете компилятор BCC.EXE, нужно в командной
                  строке указать библиотеку GRAPHICS.LIB. Например, если ваша программа, MYPROG.C, использует графику, то командная строка компилятора BCC должна иметь вид:
                  BCC MYPROG GRAPHICS.LIB
                  При построении программы компоновщик автоматически компонует
                  графическую библиотеку С++.
                  Поскольку графические функции используют указатели far, графика в случае модели памяти tiny не поддерживается.
                  Графическая библиотека только одна и не имеет версий по моделям памяти (по сравнению со стандартными библиотеками CS.LIB,
                  CC.LIB, CM.LIB и т.д., которые зависят от используемой модели памяти). Каждая функция в файле GRAPHICS.LIB является far (дальней)
                  функцией, а графические функции, использующие указатели работают
                  с дальними указателями. Для правильной работы графических функций
                  в каждом использующем графические функции модуле требуется директива #include graphics.h.


                  Производные классы


                  Создав класс, производный от TGadgetWindow, вы можете создать собственное специализированное окно реквизитов. Как и обычные окна, TGadgetWindow реализует функцию Paint, которая выбирает
                  в контексте устройства шрифт окна и вызывает функцию PaintGadget,
                  выполняющую итерацию по реквизитам окна и запрашивающую отображение каждого из них.
                  Для определения общего необходимого размера используйте
                  функции GetDesiredSize и GetInnerRect (то есть размер, необходимый для размещения всех рамок, полей и реквизитов наибольшего
                  размера). GetInnerRect вычисляет область внутри рамок и полей и
                  помещает результат в rect.
                  В окне реквизитов могут использоваться следующие единицы измерения:
                • Элементы изображения.

                • Единицы схемы окна, определяемые делением шрифта "em" окна
                  на 8 вертикальных и 8 горизонтальных сегментов.

                • Единицы рамки основываются на толщине рамки окна. Обычно
                  они эквивалентны одному элементу изображения.

                • Обычно лучше использовать единицы схемы окна, так как они
                  основываются на размере шрифта (вам не нужно будет беспокоиться о
                  масштабировании). Для преобразования этих единиц в элементы изображения используется функция LayoutUnitsToPixels.
                  TGadgetWindow перехватывает следующие события:
                • WM_CTLCOLOR;

                • WM_LBUTTONDOWN;

                • WM_LBUTTONUP;

                • WM_MOUSEMOVE;

                • MW_SIZE;

                • WM_SYSCOLORCHANGE;

                • и реализуется соответствующие функции обработки событий.
                  ObjectWindows предусматривает ряд производных от TGadgetWindow классов, которые предусматривают ряд способов для вывода и
                  задания схемы расположения реквизитов. Это классы TControlBar,
                  TMessageBar, TStatusBar и TToolsBox.


                  Производные классы


                  TGadget предусматривает ряд функций protected, которые вы
                  можете использовать для создания производных классов, а также пару виртуальных функция для инициализации и очистки реквизита Inserted и Remove. Inserted вызывается после включения реквизита в оно реквизитов, a Removed вызывается перед удалением реквизита
                  из окна реквизитов. Заданные по умолчанию версии этих функций никаких действий не выполняют.
                  Функция PaintBorder рисует границу реквизита. Она реализует
                  стандартные стили границы. Для создания нового стиля нужно переопределить эту функцию. Для использования стандартных стилей нужно также вызывать версию TGadget этой функции.
                  Функция Paint аналогична функции Paint TWindow. Paint описывается как virtual. Функция PaintGadgets в TGadget при изображении окна реквизита вызывает функцию Paint каждого реквизита. Заданная по умолчанию функция Paint только вызывает функцию PaintBorder. Вам нужно переопределить эту функцию.
                  При самостоятельном изображении реквизита с помощью функции
                  Paint часто требуется найти область внутри границ и полей реквизита. Эта область называется внутренним прямоугольником. Его можно определить с помощью функции GetInnerRect, которая помещает в
                  передаваемую ей структуру TRect координаты внутреннего прямоугольника.
                  Как и окно, реквизит можно сделать недопустимым (в этом случае он требуется повторного отображения). Для этого предусмотрены
                  две функции - Invalidate и InvalidateRect, аналогичные соответствующим функциям TWindow. Invalidate работает как соответствующая
                  функция API Windows, но не требуется параметра HWND. Родственной
                  функцией является функция Update, которая пытается обновить реквизит. Она аналогичная функции API Windows UpdateWindow.
                  Вы можете отслеживать события "мыши", происходящие внутри и
                  вне реквизита. Это делается с помощью псевдообработчиков событий
                  класса TGadget. Эти функции во многом аналогичны стандартным
                  функциям обработки событий ObjectWindows, но имена функций не
                  имеют префикса ev.
                  Так как реквизит на самом деле не является окном, он не имеет таблиц реакции, как другие классы ObjectWindows. Вся связь



                  реквизита с внешним миром осуществляется через окно реквизитов.

                  Когда в окне реквизитов происходит событие "мыши", окно пытается

                  определить, на какой из реквизитов оно влияет. C этой целью вы

                  можете вызвать функцию PtIn, которая возвращает True, если заданная аргументом точка находится внутри ограничивающего прямоугольника реквизита. Когда "мышь" попадает внутрь ограничивающего прямоугольника реквизита, окно реквизита вызывает функцию MouseEnter, первый аргумент которой содержит ключевую информацию, необходимую для передачи стандартного сообщения ObjectWindows EvMouseMove. Это указывает на нажатие различных виртуальных клавиш.

                  После того как окно реквизита вызывает функцию реквизита MouseEnter и информирует реквизит, что "мышь" вошла в его область.

                  Реквизит перехватывает перемещения "мыши", вызывая функцию GadgetSetCapture, обеспечивая вызов функции MouseLeave (эта функция

                  вызывается после выхода "мыши" за пределы ограничивающего прямоугольника). Функции LButtonDown и LButtonUp позволяют определить

                  положение левой кнопки "мыши".


                  Просмотр других файлов


                  Для просмотра любого файла на диске, включая двоичные и
                  текстовые, используйте окно File. При выборе в строке меню команды View File отладчик выводит диалоговое окно Enter Name of File.
                  Вы можете задать в нем трафаретные символы или конкретное имя
                  файла. В зависимости от содержимого файла в открываемом окне File
                  файлы выводятся в текстовом или шестнадцатиричном виде.


                  Просмотр и модификация файлов


                  Turbo Debugger предусматривает два способа просмотра файлов
                  на диске: окно Module и окно File. Окно Module чаще всего используется в отладчике. Его можно применять для просмотра исходного
                  кода выполняемого модуля, скомпилированного с отладочной информацией. Строка заголовка этого окна показывает имя текущего загруженного модуля, имя текущего исходного файла и номер строки курсора. Выполняемая строка в этом окне помечается символом точки
                  (.), а стрелка (>) в первой позиции показывает указатель команд.
                  Он всегда отмечает следующий выполняемый оператор. При загрузке
                  программы в отладчик окно Module загружается автоматически
                  При выполнении программы по шагам окно Module автоматически
                  показывает исходный код, соответствующий выполняемой инструкции.
                  Перемещаясь по исходному коду, вы можете установить точки останова и задать отслеживаемые выражения, а также проверить значения
                  переменных. Если в строке заголовка выводится opt, то программа
                  оптимизирована компилятором. Это может затруднить поиск переменных. Если файл модифицирован после последней компиляции, то в заголовке выводится modified. Это может привести к несоответствию
                  строк исходного текста. Перекомпилируйте программу.


                  Просмотр исходного кода класса


                  Чтобы просмотреть исходный код класса, выберите класс в области классов. Исходный код выводится в области редактирования.
                  Чтобы переместить курсор на конструктор, дважды щелкните "мышью"
                  на имени в области классов. Для перехода на обрабатываемое события дважды щелкните "мышью" на событии в области событий.


                  Просмотр элементов исходного кода


                  Средство просмотра позволяет просматривать иерархию объектов, классов, функций, переменных, констант и типов в используемых программах. Перед использованием средства просмотра установите в диалоговом окне Project Options следующие параметры:
                • Выберите Compiler Debugging и установите Debug information
                  in OBJs.

                • Выберите Compiler Debugging и отметьте Browser reference
                  information in OBJs.

                • Выберите Linker General и отметьте Include debug information.

                • Чтобы запустить средство просмотра, выберите Search Browse
                  Symbol, View Classes или View Globals. Вы можете также поместить
                  курсор на идентификатор в исходном коде и выбрать для вывода окна
                  просмотра Search Browse. Если программа в текущем окне просмотра
                  еще не скомпилирована, нужно скомпилировать и скомпоновать программу с включенной отладочной информацией.
                  В окне Enviroment Options вы можете установить несколько параметров просмотра. Выберите Options Enviroment, щелкните "мышью"
                  на Browser и выберите нужные параметры.
                  Чтобы увидеть "общий план" иерархии объектов в приложении,
                  выберите View Classes. Средство просмотра показывает объекты в
                  горизонтальном дереве, отображая отношения "родитель-потомок".
                  Красные линии в иерархии позволяют увидеть прямые связи текущего
                  выбранного объекта. Чтобы просмотреть информацию о конкретном
                  объекте, дважды щелкните на нем "мышью" или выберите объект с помощью клавиш стрелок и нажмите Enter.
                  Тип просматриваемых идентификаторов можно определить с помощью матрицы фильтрации Filters matrix. Чтобы увидеть описание
                  конкретного выводимого в списке идентификатора, дважды щелкните
                  на нем "мышью", выберите идентификатор и нажмите Enter. Выберите
                  идентификатор, нажмите Alt|+F10 и выберите в оперативном меню
                  Browse Symbol.
                  Чтобы открыть окно со списком глобальных идентификаторов,
                  выберите View Globals. Одна или две буквы слева от идентификатора
                  описывают вид идентификатора. Вы можете отфильтровать идентификаторы с помощью матрицы фильтрации.



                  Буква Идентификатор







                  F Функции
                  T Типы
                  V Переменные
                  C Целочисленные константы
                  ? Отлаживаемые
                  I Наследуется от предка
                  V Виртуальный метод
                  Чтобы получить более подробную информацию о конкретном идентификаторе, щелкните на нем "мышью" или выделите с помощью клавиш

                  стрелок. Поле ввода Search в нижней части окна позволяет быстро

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

                  первые несколько букв имени.

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

                  Символ Функция




                  . Совпадает с любым символом.
                  * Совпадает с 0 или более предыдущих символов. Например, fo* совпадает со всем, что начинается с

                  fo, а fo*x - c fx, fox или fooox.
                  + Совпадает с 0 или более предыдущих символов. Например, fo+ совпадает со всем, что начинается с

                  fo, а fo+x - c fx, fox или fooox.
                  ? Совпадает с 0 или более предыдущих символов. Например, fo? совпадает со всем, что начинается с

                  fo, а fo?x - c fx или fox.
                  Можно также просмотреть любой идентификатор в исходном коде.

                  Для этого подсветите его в программе и выберите Search Browse

                  Symbol или щелкните в окне редактора правой кнопкой "мыши" или

                  нажмите Alt+F10 для вывода оперативного меню, затем выберите

                  Browse Symbol.


                  Просмотр параметров проекта


                  Так как каждый узел может иметь свой собственный набор Style
                  Sheet, который можно переопределять, требуется быстрый способ
                  просмотра параметров каждого узла.
                  Чтобы просмотреть иерархию параметров, сделайте следующее:
                • Щелкните на узле правой кнопкой "мыши" и выберите View options hierarchy. Выводится диалоговое окно Options Hierarchy с перечнем узлов проекта и их параметров. Просмотр
                  списка можно настраивать как в окне проекта.

                • Щелкните "мышью" на узле, который вы хотите просмотреть.
                  Справа выведутся его параметры.

                • Если вы хотите отредактировать параметр, дважды щелкните
                  на параметре "мышью" или выделите его и щелкните на кнопке
                  Edit. Если параметр принадлежит к Style Sheet, то придется
                  редактировать весь набор Style Sheet. В противном случае
                  редактируется Local Override.

                • Когда закончите просмотр узлов, щелкните "мышью" на Close.



                • Простые ссылки


                  Для объявления ссылок вне функции может использоваться описатель ссылки:
                  int i = 0;
                  int &ir = i; // ir является псевдонимом i
                  ir = 2; // то же, что i = 2
                  В данном примере создается именующее значение ir, являющееся
                  псевдонимом i, при условии, что инициализатор имеет тот же тип,
                  что и ссылка. Выполнение операций с ir имеет тот же результат,
                  что и выполнение их с i. Например, ir = 2 присваивает значение 2
                  переменной i, а &ir возвращает адрес i.
                  Отметим, что type& var, type &var и type & var эквивалентны.


                  Прототипы функций


                  Прототипы функций в С++ записываются ранее того места, где эта
                  функция будет использована. Это позволяет компилятору контролировать
                  типы вызываемых функций. Рассмотрим, например, ошибочную функцию по
                  вычислению налога на добавленную стоимость:
                  int nalog(int, int, int);
                  Прототипы сообщают транслятору о количестве и типах параметров,
                  которые могут быть переданы внешне определенным функциям. В список
                  аргументов можно внести имена параметров:
                  int nalog(int priceOld, int priceNew, int nalog1);
                  priceOld=150.5;
                  priceNew=135.7;
                  delta=nalog(priceOld, priceNew, 0.28);
                  Такая запись будет ошибочной в стандартном Си, так как все аргументы приведутся к типу float и будут переданы в тело функции, которая ожидает передачу чисел типа int. В С++ это выражение преобразуется согласно прототипу функции. Таким образом, небольшое изменение
                  делает программы на С++ более надежными и позволяет избежать множества ошибок.
                  int nalog(int priceOld, int priceNew, int nalog1)
                  {
                  return (priceNew - priceOld)*nalog1;
                  }
                  Это реализация функции. Она может быть подключена из другого
                  файла.

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


                  Пунктуаторы


                  В Borland C++ пунктуаторы, также называемые разделителями,
                  определяются следующим образом:
                  пунктуатор: одно из
                  [ ] ( ) { } , ; : ... * = #


                  - R -

                  R79_2.shtml


                  Глава 6. Справочник по библиотеке Borland C++ 4.0

                  gcvt Преобразует число с плавающей точкой в строку
                  DOS UNIX Win16 #include
                  OS/2 Win32 char *gcvt(double value,int ndec,char
                  *buf)
                  geninterrupt Вызывает программное прерывание
                  DOS Win16 #include
                  OS/2 Win32 void geninterrupt(int intr_num)
                  getc Получает символ из потока
                  DOS UNIX Win16 #include
                  OS/2 Win32 int getc(FILE *stream)
                  ANSI C++ ANSI C
                  getcbrk Получает параметры контроля прерывания по

                  DOS Win16
                  #include
                  int getcbrk(void);
                  getch Вводит символ с консоли без эхо-отображения на
                  экране
                  DOS
                  Win32 #include
                  int getch(void);
                  getchar Получает символ из потока stdin
                  DOS UNIX #include
                  OS/2 Win32 int getchar(void);
                  ANSI C++ ANSI C
                  getche Получает символ с клавиатуры и отображает его
                  на экран
                  DOS
                  OS/2 Win32 #include
                  ANSI C int getche(void);
                  getcurdir Определяет текущий каталог для указанного диска
                  DOS Win16 #include
                  OS/2 Win32 int getcurdir(int drive,char *directory);
                  getcwd Получает текущий рабочий каталог
                  DOS Win16 #include
                  OS/2 Win32 char *getcwd(char *buf,int buflen);
                  getdate Смотpи _dos_getdate
                  _getdcwd Определяет текущий каталог для указанного диска
                  DOS Win16 #include
                  OS/2 Win32 char* _getdcwd(int drive, char *buffer,
                  int buflen);
                  getdfree Получает размер свободного места на диске
                  DOS Win16 #include
                  OS/2 Win32 void getdfree(unsigned char drive,
                  struct dfree *dtable);
                  getdis,setdisk Получает или устанавливает текущий номер диска
                  DOS Win16 #include
                  OS/2 Win32 int getdisk(void);
                  int setdisk(int drive)
                  getdta Получает адрес пересылки диска
                  DOS Win16 #include
                  char far *getdta(void);
                  getenv Получает строку из среды
                  DOS UNIX Win16 #include
                  OS/2 Win32 char *getenv(const char *name);
                  ANSI C++ ANSI C
                  getfat Получает информацию из таблицы размещения файлов указанного диска
                  DOS Win16
                  #include
                  void getfat(unsigned char drive,
                  struct fatinfo *dtable);
                  getfatd Получает информацию из таблицы размещения файлов
                  DOS Win16
                  #include
                  void getfatd(struct fatinfo *dtable);
                  getftime,setftime Получает и устанавливает дату и время создания
                  файла
                  DOS Win16
                  OS/2 Win32 #include
                  int getftime(int handle,struct ftime *ftimep);
                  int setftime(int handle,struct ftime *ftimep);
                  getpass Считывает пароль
                  DOS UNIX #include
                  OS/2 Win32 char *getpass(const char *prompt);
                  getpid Получает идентификатор процесса программы
                  DOS UNIX Win16 #include
                  OS/2 Win32 unsighned getpid
                  getpsp Получает префикс программного сегмента
                  DOS Win16 #include
                  unsigned *getpsp(void);
                  gets Получает строку из потока stdin
                  DOS UNIX Win16 #include
                  OS/2 Win32 char *gets(char *s);
                  ANSI C++ ANSI C
                  gettext Копирует текст c экрана в текстовом режиме в
                  память
                  DOS
                  OS/2 Win32 #include
                  int gettext(int left, int top, int right,
                  int bottom, void *destin);
                  gettextinfo Получает видеоинформацию о текстовом режиме
                  DOS #include
                  OS/2 Win32 void gettextinfo(struct text_info *r);
                  gettime,settime Получает и устанавливает системное время
                  gettime #include
                  void gettime(struct time *timep);
                  DOS Win16
                  OS/2 Win32
                  ---***---
                  settaime #include
                  void settime(struct time *timep);
                  DOS Win16
                  OS/2 Win32
                  getvect,setvect Получает и устанавливает вектор прерывания
                  DOS Win16 #include
                  OS/2 void interrupt(*getvect(int interruptno))();
                  void setvect(int interruptno, void
                  nterrupt (*isr) ());
                  getverify Получает состояние флага проверки DOS
                  DOS Win16 #include
                  OS/2 Win32 int getverify(void);
                  getw Получает целое число из потока
                  DOS UNIX Win16 #include
                  OS/2 Win32 int getw(FILE *stream);
                  gmtime Преобразует дату и время во время по стандарту
                  Гринвича (GMT)
                  DOS UNIX Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C struct tm *gmtime(const time_t *timer);
                  gotoxy Позиционирует курсор в текстовом окне
                  DOS Win16 #include
                  OS/2 Win32 void gotoxy(int x, int y);
                  _heapadd Пpисоединяет блок к куче.
                  #include
                  OS/2 Win32 int _heapadd(void *block, size_t size);
                  heapcheck Просматривает и проверяет кучу
                  DOS #include
                  OS/2 Win32 int heapcheck (void);
                  heapcheckfree Проверяет свободные блоки кучи на заполнение
                  заданным значением
                  DOS
                  OS/2 Win32 #include
                  int heapcheckfree (unsigned int fillvalue);
                  heapchecknode Ищет и проверяет отдельный узел кучи
                  DOS UNIX Win16 #include
                  OS/2 Win32 int heapchecknode (void *node);
                  ANSI C
                  _heapchk Ограничивает и верифицирует кучу.
                  DOS UNIX Win16 #include
                  OS/2 C++ Win32 int _headpchk(void);
                  heapfillfree Заполняет свободные блоки кучи заданным значением
                  DOS #include
                  OS/2 Win32 int heapfillfree(unsigned int fillvalue);
                  _heapmin Освобождает неиспользованное
                  пространство кучи
                  DOS UNIX Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C int _headpmin(void);
                  _heapset Заполняет свободные блоки кучи константами
                  UNIX Win16 #include
                  OS/2 Win32 int _heapset (unsigned int fillvalue);
                  ANSI C
                  heapwalk Используется для перемещения по куче от узла к
                  узлу
                  DOS UNIX Win16
                  OS/2 Win32 #include
                  ANSI C int heapwalk(struct heapinfo *hi);
                  _heapwalk Смотри _rtl_heapwalk
                  highvideo Устанавливает режим вывода символов высокой яркости
                  DOS #include
                  OS/2 Win32 void highvideo(void);
                  hypot,hypotl Вычисляет гипотенузу прямоугольного треугольника
                  hypot
                  #include
                  DOS UNIX Win16 double hypot(double x,double y);
                  OS/2 Win32
                  ---***----
                  hupotl #include
                  long double hypotl(long double x,
                  DOS Win16 long double y);
                  OS/2 Win32
                  initEasyWin Инициализирует "удобный" Windous
                  используется только в 16-pазpядном
                  Win16 Windous
                  #include
                  void _intEasyWin (void);
                  inp Читает байт из аппаратного порта
                  DOS Win16 #include
                  int inp(unsigned portid);
                  inport Считывает слово из аппаратного порта
                  DOS Win16 #include
                  int inport(int portid);
                  inportb Считывает байт из аппаратного порта
                  DOS Win16 #include
                  OS/2 unsigned char inportb(int portid);
                  inpw Считывает слово из аппаратного порта
                  DOS Win16 #include
                  OS/2 unsigned inpw(unsigned portid);
                  insline Вставляет в текстовое окно пустую строку
                  DOS #include
                  OS/2 Win32 void insline(void);
                  int86 Общее программное прерывание процессора 8086
                  DOS Win16 #include
                  OS/2 int int86(int intno,union REGS *inregs,
                  union REGS *outregs);
                  int86x Общий интерфейс с программными прерываниями
                  процессора 8086
                  DOS #include
                  Win32 int int86x(int intno, union REGS *inregs,
                  union REGS *outregs,
                  union SREGS *segregs);
                  intdos Интерфейс с прерываниями DOS
                  DOS Win16 #include
                  int intdos(union REGS *intregs,
                  union REGS *outregs);
                  intdosx Общий интерфейс с функциями прерывания DOS
                  DOS Win16 #include
                  int intdosx(union REGS *inregs,
                  union REGS *outregs,
                  struct SREGS *segregs);
                  intr Альтернативный интерфейс программных прерываний
                  процессора 8086
                  DOS Win16 #include
                  int intr(int intno,struct REGPACK *preg);
                  ioctl Управляет устройствами ввода-вывода
                  DOS UNIX Win16 #include
                  int ioctl(int handle, int func[, void
                  *argdx, int argcx]);
                  isalnum Макрос классификации символов
                  DOS UNIX Win16 #include
                  OS/2 Win32 int isalnum(int c);
                  ANSI C++ ANSI C
                  isalpha Макрос классификации символов
                  DOS UNIX Win16 #include
                  OS/2 Win32 int isalpha(int c);
                  ANSI C++ ANSI C
                  isascii Макрос классификации символов
                  DOS UNIX Win16 #include
                  OS/2 Win32 int isascii(int c);
                  isatty Проверяет тип устройства
                  DOS UNIX Win16 #include
                  OS/2 Win32 int isatty(int handle);
                  iscntrl Макро классификации символов
                  DOS UNIX Win16 #include
                  OS/2 Win32 int iscntrl(int c);
                  ANSI C++ ANSI C
                  isdigit Макро классификации символов
                  DOS UNIX Win16 #include
                  OS/2 Win32 int isdigit(int c);
                  ANSI C++ ANSI C
                  isgraph Макро классификации символов
                  DOS UNIX Win16 #include
                  OS/2 Win32 int isgraph(int c);
                  ANSI C++ ANSI C
                  islower Макро классификации символов
                  DOS UNIX Win16 #include
                  OS/2 Win32 int islower(int c);
                  ANSI C++ ANSI C
                  isprint Макро классификации символов
                  DOS UNIX Win16 #include
                  OS/2 Win32 int isprint(int c);
                  ANSI C++ ANSI C
                  ispunct Макро классификации символов
                  DOS UNIX Win16 #include
                  OS/2 Win32 int ispunct(int c);
                  ANSI C++ ANSI C
                  isspace Макрос классификации символов
                  DOS UNIX Win16 #include
                  OS/2 Win32 int isspace(int c);
                  ANSI C++ ANSI C
                  isupper Макро классификации символов
                  DOS UNIX Win16 #include
                  OS/2 Win32 int isupper(int c);
                  ANSI C++ ANSI C
                  isxdigit Макро классификации символов
                  DOS UNIX Win16 #include
                  OS/2 Win32 int isxdigit(int c);
                  ANSI C++ ANSI C
                  itoa Преобразует целое в строку
                  DOS Win16 #include
                  OS/2 Win32 char *itoa(int value, char *string,int radix);
                  kbhit Контролирует нажатие клавиши
                  DOS Win16 #include
                  OS/2 Win32 int kbhit(void);
                  labs Возвращает абсолютное значение числа типа long
                  DOS UNIX Win16 #include
                  OS/2 Win32 long int labs(long int x);
                  ANSI C++ ANSI C
                  ldexp,ldexpl Вычисляет значение X x 2**exp
                  ldexp #include
                  double ldexp(double x,int exp);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  ldexpl #include
                  long double ldexpl(long double x, int exp);
                  DOS Win16
                  OS/2 Win32
                  ldiv Делит два числа типа long и возвращает частное
                  и остаток
                  DOS Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C ldiv_t ldiv(long int numer, long int denom);
                  lfind Выполняет линейный поиск
                  DOS UNIX Win16 #include
                  OS/2 Win32 void *lfind(const void *key, const void
                  ANSI C++ ANSI C *base, size_t *num, size_t width, int
                  (_USENTRY *fcmp)(const void *,
                  const void *));
                  loсaleconv Возвращает указатель на текущую структуру local
                  DOS Win16 #include
                  OS/2 Win32 struct lconv *loсaleconv (void);
                  ANSI C++ ANSI C
                  loсaltime Превращает дату и время в структуру
                  DOS UNIX Win16 #include
                  OS/2 Win32 struct tm *localtime(const time_t *timer);
                  ANSI C++ ANSI C
                  lock Блокирует файл коллективного доступа
                  DOS Win16 #include
                  OS/2 Win32 int lock(int handle, long offset, long
                  length);
                  locking Устанавливает или сбрасывает блокировку файла
                  коллективного доступа
                  DOS Win16 #include
                  OS/2 Win32 #include
                  int locking(int handle, int cmd, long length);
                  log,logl Вычисляет натуральный логарифм х
                  logl #include
                  double log(double x);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  logl #include
                  long double log(long double x);
                  DOS Win16
                  OS/2 Win32
                  log10,log10l Вычисляет десятичный логарифм log10(x)
                  log10 #include
                  double log10(double x);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  log10l #include
                  long double log10l(long double x)
                  DOS Win16
                  OS/2 Win32
                  longjmp Выполняет нелокальный переход
                  DOS UNIX Win16 #include
                  OS/2 Win32 void longjmp(jmp_buf jmpb, int retval);
                  ANSI C++ ANSI C
                  lowvideo Устанавливает режим вывода символов низкой яркости
                  DOS #include
                  OS/2 Win32 void lowvideo(void);
                  _lrotl,_lrotr Выполняет циклический сдвиг влево
                  беззнакового целого типа long
                  DOS Win16 #include
                  OS/2 Win32 unsigned long_lrotl(unsigned long val,
                  int count);
                  ---***---
                  DOS UNIX Win16 #include
                  OS/2 Win32 unsigned long_lrotr(unsigned long val,
                  ANSI C++ ANSI C int count);
                  lsearch Выполняет линейный поиск
                  DOS UNIX Win16 #include
                  OS/2 Win32 void *lsearch(const void *key, void *base,
                  ANSI C++ ANSI C size_t *num, size_t width, int
                  (_USENTRY*fcmp) (const void *, const
                  void *));
                  lseek Перемещает указатель файла
                  DOS UNIX Win16 #include
                  OS/2 C++ Win32 long lseek(int handle, long offset,
                  int fromwhere)
                  ltoa Преобразует значение типа long в строку
                  DOS Win16 #include
                  OS/2 Win32 char *ltoa(long value,char *string,int radix);
                  _makepath Строит маршрут доступа из его компонентов
                  DOS Win16 #include
                  OS/2 Win32 void _makepath(char *path, const char
                  *drive, const char *dir, const char
                  *name, const char *ext);
                  malloc Выделяет оперативную память
                  DOS UNIX Win16 #include
                  OS/2 Win32 void *malloc(size_t size);
                  ANSI C++ ANSI C
                  matherr,_matherrl Функция обработки математических ошибок, модифицируемая пользователем
                  DOS Win16
                  OS/2 Win32 #include
                  int matherr(struct exeption *e);
                  int_matherrl(struct_exceptionl *e);
                  max Возвращает большее из двух значений
                  DOS Win16 #include
                  OS/2 Win32 (type)max(a,b);
                  mblen Определяет длину многобайтового символа
                  DOS Win16 #include
                  OS/2 Win32 int mblen(const char *s, size_t n);
                  ANSI C++ ANSI C
                  mbstowcs Преобразует многобайтовую строку в массив
                  wchar_t
                  DOS Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C size_t mbstowcs(wchar_t *pwcs, const char *s,
                  size_t n);
                  mbtowc Преобразует многобайтовый символ в код wchar_t
                  DOS Win16 #include
                  OS/2 Win32 int mbtowc(wchar_t *pwc, const char *s,
                  ANSI C++ ANSI C size_t n);
                  memccpy,_fmemccpy Копирует блок размером n байт
                  memccpy #include
                  Короткий вызов функции:
                  DOS UNIX Win16 void *memccpy(void *dest,const void *src,
                  OS/2 Win32 int c,size_t n);
                  ---***---
                  _memccpy #inlcude
                  Длинный вызов функции:
                  DOS Win16 void far * far _fmemccpy(void far * dest,
                  const void far *src, int c, size_t n)
                  memchr,_fmemchr Просматривает n байт в поисках символа "c"
                  memchr #include
                  void *memchr(const void *s,int c, size_t n);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  _fmemchr #include
                  void far*far _fmemchr(const void far *s, int c,
                  DOS Win16 size_t n);
                  memcmp,_fmemcmp Сравнивает два блока размером n байт
                  memcmp #include
                  int memcmp(const void *s1, const void *s2,
                  DOS UNIX Win16 size_t n);
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  _fmemcmp #include
                  int far _fmemcmp(cons void far *sl,
                  DOS Win16 const void far *s2, size_t n)
                  memcpy,fmemcpy Копирует блок размером n байт
                  memcpy #include
                  void *memcpy(void *dest, const void *src,
                  DOS UNIX Win16 size_t n);
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  fmemcpy #include
                  void far *far_fmemcpy(void far*dest,
                  DOS Win16 const void far *src, size_t n);
                  memicmp,_fmemicmp Сравнивает n байт двух массивов символов, игнорируя различия регистров
                  DOS UNIX Win16
                  OS/2 Win32 #include int memicmp(const void *s1, const void *s2,
                  size_t n)
                  ---***---
                  _fmemicmp #include
                  int far _fmemicmp(const void far *s1,
                  DOS Win16 const void far *s2, size_t n)
                  Win32
                  memmove,_fmemmove Копирует блок размером n байт
                  DOS UNIX Win16 #include
                  OS/2 Win32 void *memmove(void *dest,const void *src,
                  ANSI C++ ANSI C size_t n);
                  ---***----
                  DOS Win16 #include
                  void far * far _fmemmove (void far dest,
                  const void far *src , saze_t n)
                  memset,_fmemset Устанавливает значения n байт блока памяти
                  равными значению c
                  memset #include
                  void *memset(void *s,int c, size_t n)
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  _fmemset #include
                  void far * far_fmemset(void far *s, int c,
                  DOS Win16 size_t n)
                  min Возвращает меньшее из двух значений
                  DOS Win16 #include
                  OS/2 Win32 (type) min(a,b)
                  mkdir Создает каталог
                  DOS UNIX Win16 #include
                  OS/2 Win32 int mkdir(const char *path);
                  MK_FP Формирует указатель с дальней адресацией
                  DOS Win16 #include
                  Win32 void far *MK_FP(unsigned seg, unsigned ofs);
                  mktemp Создает уникальное имя файла
                  DOS UNIX Win16 #include
                  OS/2 Win32 char *mktemp(char *template);
                  mktime Преобразует время к календарному времени
                  DOS Win16 #include
                  OS/2 Win32 time_t mktime (struct tm *t);
                  ANSI C++ ANSI C
                  modf,modfl Разделяет число типа double или long double на
                  целую и дробную части
                  modf #include
                  double modf(double x,double *ipart);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  modfl #include
                  long double modfl(long double x,
                  DOS UNIX Win16 long double *ipart);
                  OS/2 Win32
                  ANSI C++ ANSI C
                  movedata Копирует n байт
                  DOS Win16 #include
                  void movedata(unsigned srcseg, unsigned srcoff,
                  unsigned dstseg, unsigned dstoff, size_t n);
                  movmem,fmovmem Перемещает блок размером length байт
                  DOS Win16 #include
                  void movmem(void *src, void *dest,unsigned
                  length);
                  void _fmovmem(const void far *src,
                  void far *dest, unsigned length);
                  movetext Копирует текст на экране из одного окна в другое
                  DOS #include
                  OS/2 Win32 int movetext(int left,int top,
                  int right,int bottom,
                  int destleft,int desttop);
                  _msize Возвpащает pазмеp кучи блоков
                  OS/2 Win32 #include
                  size_t _msize(void *block);
                  normvideo Устанавливает нормальную яркость для символов
                  DOS Win16 #inсlude
                  OS/2 Win32 void normvideo(void);
                  offsetof Выдает байт принадлежности к группе
                  DOS UNIX Win16 #include
                  OS/2 Win32 size_t offsetof(struct_type,struct_member);
                  ANSI C++ ANSI C
                  _open Смотри _rtl_open.
                  open Открывает файл для чтения или записи
                  DOS UNIX Win16 #include
                  OS/2 Win32 int open(const char *path,int access
                  [,unsigned mode]);
                  opendir Открывает поток каталога для чтения
                  DOS UNIX Win16 #include
                  OS/2 Win32 DIR *opendir(char *dirname);
                  outp Выводит байт в аппаратный порт
                  DOS Win16 #include
                  int outp(unsigned portid, int value);
                  outport,outportb Выводит слово или байт в аппаратный порт
                  DOS Win16 #include
                  void outport(int portid,int value)
                  void outportb(int portid, unsigned char value);
                  outpw Выводит слово в аппаратный порт
                  DOS Win16 #include
                  unsigned outpw(unsigned portid,unsigned
                  value);



                  R79_3.shtml


                  Глава 6. Справочник по библиотеке Borland C++ 4.0

                  parsfnm Анализирует имя файла
                  DOS Win16 #include
                  char *parsfnm(const char *cmdline,
                  struct fcb *fcb, int opt);
                  _pclose Ожидает объекта управляющего окончанием работы
                  OS/2 Win32 #include
                  int _pclose(FILE * steam);
                  peek Возвращает слово памяти с адресом
                  segment:offset
                  DOS Win16
                  #include
                  int peek (unsigned segment, unsigned offset);
                  peekb Возвращает байт памяти c адресом segment:offset
                  DOS Win16 #include
                  OS/2 char peekb (unsigned segment, unsiged
                  offset);
                  perror Выводит системное сообщение об ошибке
                  DOS UNIX #include
                  OS/2 Win32 void perror(const char *s);
                  ANSI C++ ANSI C
                  _pipe Создает объект записи/чтения
                  OS/2 Win32 #include
                  #include
                  int _pipe (int *handles, unsigned int
                  syze,int mode);
                  poke Записывает целочисленное значение в память по
                  адресу segment:offset
                  DOS Win16 #include
                  void poke(unsigned segment, unsigned offset,
                  int value);
                  pokeb Записывает заданный байт в память по адресу
                  segment:offset
                  DOS Win16 #include
                  void pokeb(unsigned segment,
                  unsigned offset, char value);
                  poly,polyl Формирует полином из заданных аргументов
                  poly #include
                  double poly (double x, int degree,
                  DOS UNIX Win16 double coeffs[]);
                  OS/2 Win32
                  ---***---
                  polyl #include
                  long double polyl(long double x, int degree,
                  DOS Win16 long double coeffs[]);
                  OS/2 Win32
                  _popen Создает объект управляющий процессом.
                  #include
                  OS/2 Win32 FILE * _popen(const char *command, const
                  char * mode);
                  pow,powl Вычисляет значения х в степени y
                  pow #include
                  double pow(double x, double y);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  powl #include
                  long double powl(long double x, double y);
                  DOS Win16
                  OS/2 Win32
                  pow10,pow10l Вычисляет значение 10 в степени p
                  pow10 #include
                  double pow10(int p);
                  DOS UNIX Win16
                  OS/2 Win32
                  ---***---
                  pow10l #include
                  long double pow10l(int p);
                  DOS Win16
                  OS/2 Win32
                  printf Осуществляет форматный вывод в поток stdout
                  DOS UNIX #include
                  OS/2 Win32 int printf(const char *format[,аргумент,...]);
                  ANSI C++ ANSI C
                  putc Выводит символ в поток
                  DOS UNIX Win16 #include
                  OS/2 Win32 int putc (int c, FILE *stream);
                  ANSI C++ ANSI C
                  putch Выводит символ на экран
                  DOS Win16 #include
                  OS/2 Win32 int putch(int c);
                  putchar Выводит символ в поток stdout
                  DOS UNIX Win16 #include
                  OS/2 Win32 int putchar (int c);
                  ANSI C++ ANSI C
                  putenv Добавляет строку в текущее описание среды
                  DOS UNIX Win16 #include
                  OS/2 Win32
                  int putenv(const char *name);
                  puts Выводит строку в поток stdout
                  DOS UNIX Win16 #include
                  OS/2 Win32 int puts (const char *s);
                  ANSI C
                  puttext Копирует текст из памяти на экран в текстовом
                  режиме
                  DOS
                  OS/2 Win32 #include
                  int puttext(int left, int top, int right,
                  int bottom, void *source);
                  putw Выводит целое в поток
                  DOS UNIX Win16 #include
                  OS/2 Win32 int putw (int w,FILE *stream);
                  qsort Производит сортировку по ускоренному алгоритму
                  DOS UNIX Win16 #include
                  OS/2 Win32 void qsort (void *base, size_t nelem
                  ANSI C++ ANSI C size_t width,int(*fcmp)
                  (const void *,const void *));
                  raise Посылает программный сигнал выполняющейся
                  программе
                  DOS UNIX Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C int raise(int sig);
                  rand Генератор случайных чисел
                  DOS UNIX Win16 #include
                  OS/2 Win32
                  ANSI C++ ANSI C int rand(void);
                  random Генератор случайных чисел
                  DOS Win16 #include
                  OS/2 Win32 int random(int num);
                  randomize Инициализирует генератор случайных чисел
                  DOS Win16 #include
                  OS/2 Win32 #include
                  ANSI C++ ANSI C void randomize(void);
                  _read Смотри _rtl_read
                  read Читает из файла
                  DOS UNIX Win16 #include
                  OS/2 Win32 int read(int handle,void *buf,unsigned len);
                  readdir Считывает текущий элемент потока каталога
                  DOS UNIX Win16 #include
                  OS/2 Win32 struct dirent readdir(DIR *dirp);
                  realloc Перераспределяет основную память.
                  DOS UNIX Win16 #include
                  OS/2 Win32 void *realloc(void *block, size_t size);
                  ANSI C++ ANSI C
                  remove Удаляет файл
                  DOS UNIX Win16 #include
                  OS/2 Win32 int remove(const char *filename);
                  ANSI C++ ANSI C
                  rename Переименовывает файл
                  DOS UNIX Win16 #include
                  OS/2 Win32 int rename (const char*oldname,
                  ANSI C++ ANSI C const char*newname);
                  rewind Устанавливает указатель текущего байта
                  на начало файла
                  DOS UNIX Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C void rewind(FILE *stream);
                  rewinddir Устанавливает указатель на первый элемент
                  каталога
                  DOS UNIX Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C void rewinddir(DIR *dirp);
                  rmdir Удаляет каталог файлов DOS
                  DOS UNIX Win16 #include
                  OS/2 Win32 int rmdir (const char *path);
                  rmtmp Уничтожает временные файлы
                  DOS Win16 #include
                  OS/2 C++ Win32 int rmtmp(void);
                  _rot,rotl Поразрядный сдвиг беззнакового целого числа
                  влево
                  DOS Win16
                  OS/2 Win32 #include
                  unsigned _rotl(unsigned value, int count);
                  unsigned _rotr(unsigned value, int count);
                  _rtl_chmod Пpисваивает и выдает атpибуты файла
                  DOS Win16 #include
                  Win32 #include
                  int _rtl_mode (const char *path, int func
                  [, int attrib]);
                  rtl_close Закpывает файл
                  DOS Win16 #include
                  Win32 int _rtl_close(int handle);
                  _rtl_creat Создает новый файл или записывает его на
                  уже имеющийся
                  DOS
                  Win16 Win32 #include
                  #include
                  int _rtl_creat_(const char *path, int
                  attriib);
                  _rtl_heapwalk Пpовеpяет кучу один за одним
                  #include
                  Win32 int _rtl_heapwalc (_HEAINFO #hi);
                  _rtl_open Открывает существующий файл для чтения
                  и записи.
                  DOS Win16
                  Win32 #include
                  #include
                  #include
                  int _rtl_open(const char *filename, int
                  oflags);
                  _rtl_open Читает из файла
                  DOS Win16 #include
                  #include
                  int _rtl_read (int hadle,void *buf,
                  unsigned len);
                  _rtl_write Записывает в файл
                  DOS Win16 #include
                  Win32 int _rtl_write(int handle, void *buf,
                  unsigned len);
                  scanf Выполняет форматный ввод из потока stdin
                  DOS UNIX #include
                  OS/2 Win32 int scanf(const char *format[,adress,...]);
                  ANSI C++ ANSI C
                  _searchenv Поиск файла по маршруту, указанному в окружении
                  DOS Win16 #include
                  OS/2 Win32 char *_searchenv(const char *file,
                  const char *varname, char *buf);
                  searchpath Ищет маршрут доступа к файлу в DOS
                  DOS Win16 #include
                  OS/2 Win32 char *searchpath (const char *file);
                  _searchstr Устанавливает каталог для файла.
                  DOS Win16 #include
                  OS/2 Win32 void _searhstr(const char *file, const
                  char *ipath,char *buf);
                  segread Читает сегментные регистры
                  DOS Win16 #include
                  Win32 void segread(struct SREGS *segp);
                  ANSI C++
                  setbuf Устанавливает буферизацию потока
                  DOS UNIX Win16 #include
                  OS/2 Win32 void setbuf(FILE *stream, char *buf);
                  ANSI C++ ANSI C
                  setcbrk Устанавливает режим проверки control-break
                  DOS Win16 #include
                  OS/2 int setcbrk(int cbrkvalue);
                  _setcursortype Устанавливает наличие и вид куpсоpа
                  DOS #include
                  OS/2 Win32 void _setcurcortype(int cur_t);
                  setdate Смотpи _dos_getdate.
                  setdisk Смотpи getdisk.
                  setdta Устанавливает адрес передачи диска
                  DOS Win16 #include
                  void setdta(char far *dta);
                  settime Смотpи getftime.
                  setjmp Выполняет нелокальный переход
                  DOS UNIX Win16 #include
                  OS/2 Win32 int setjmp(jmp_buf env);
                  ANSI C++ ANSI C
                  setlocale Определяет локализацию
                  DOS Win16 #incude
                  OS/2 Win32 char*setlocale (int category, char*locale);
                  ANSI C++ ANSI C
                  setmem Заполняет область памяти определенным символом
                  DOS UNIX Win16 #include
                  OS/2 Win32 void setmem(void *dest, unsigned
                  length, char value);
                  setmode Устанавливает тип открытого файла
                  DOS Win16 #include
                  OS/2 Win32 int setmode(int handle, int amode);
                  setvbuf Назначает буферизацию потока
                  DOS UNIX Win16 #include
                  OS/2 Win32 int setvbuf(FILE *stream, char *buf, int type,
                  ANSI C++ ANSI C size_t size);
                  setvect Смотpи getvect
                  setverify Устанавливает проверочный флаг в DOS
                  DOS Win16 #include
                  OS/2 Win32 void setverify(int value);
                  signal Определяет действия по сигналу
                  DOS UNIX Win16 #include
                  OS/2 Win32 void(*signal(int sig,void(*func)
                  ANSI C++ ANSI C (int sig[,intsubocde])))(int);
                  sin,sinl Вычисляет тригонометрическую функцию синуса
                  sin #include
                  double sin(double x);
                  DOS UNIX Win16
                  OS/2 Win32
                  ----***----
                  sinl #include
                  long double sinl(long double x);
                  DOS Win16
                  OS/2 Win32
                  sinh,sinhl Вычисляет гиперболическую функцию синуса
                  sinh #include
                  double sinh(double х);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  sinhl #include
                  long double sinhl(long double x)
                  DOS Win16
                  OS/2 Win32
                  sleep Приостанавливает выполнение процесса на
                  указанный интервал времени (в секундах)
                  DOS UNIX
                  OS/2 Win32B #include
                  void sleep(unsigned seconds);
                  sopen Открывает разделяемый файл
                  DOS UNIX Win16 #include
                  OS/2 Win32 #include
                  #include
                  #include
                  int sopen(char *path, int access,
                  int shflag, int mode);
                  spawnl, (...) Создает и запускает порожденный процесс
                  spawnle
                  spawnlp #include
                  spawnlpe #include
                  spawnnv int spawnl(int mode, char *path, char
                  spawnve *arg0, arg1, ...,argn, NULL);
                  spawnvp int spawnle(int mode, char *path, char
                  spawnvpe *arg0, arg1, ..., argn, NULL, char *envp[]);
                  OS int spawnlp(int mode, char *path, char
                  OS/2 Win32 *arg0, arg1, ...,argn,NULL);
                  int spawnlpe(int mode, char *path, char
                  *arg0, arg1, ..., argn, NULL, char
                  *envp[]);
                  int spawnv(int mode, char *path, char
                  *argv[]);
                  int spawnve(int mode, char *path, char
                  *argv[], char *envp[]);
                  int spawnvp(int mode, char *path,
                  char argv[]);
                  int spawnvpe(int mode, char *path,
                  char *argv[], char envp[]);
                  _splitpath Разбивает полное имя маршрута на компоненты
                  DOS Win16 #include
                  OS/2 Win32 void_splitpath(const char *path, char
                  *drive, char *dir,char *name,char *ext);
                  sprintf Выполняет форматный вывод в строку
                  DOS UNIX Win16 #include
                  OS/2 Win32 int sprintf(char *buffer,
                  ANSI C++ ANSI C cnst char *format[,аргумент,...]);
                  sqrt,sqrtl Для аргумента, выраженного натуральным числом
                  вычисляет положительный квадратный корень входного значения
                  sqrt #include
                  double sqrt(double х);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++
                  ---***---
                  sqrtl #include
                  lond double sqrtl(long double x);
                  DOS Win16
                  OS/2 Win32
                  srand Инициализирует генератор случайных чисел
                  DOS UNIX Win16 #include
                  OS/2 Win32 void srand(unsigned seed);
                  ANSI C++ ANSI C
                  sscanf Выполняет форматированный ввод из строки
                  DOS UNIX Win16 #include
                  OS/2 Win32 int sscanf(const char *buffer,
                  ANSI C++ ANSI C const char *format[,addres,...]);
                  stackavail Получает объем доступной памяти
                  DOS Win16 #include
                  OS/2 Win32 size_t stackavail(void);
                  stat Смотpи fstat
                  _status87 Выдает статус обработки чисел с плавающей
                  точкой
                  DOS Win16 #include
                  OS/2 Win32 unsigned int _status87(void);
                  stime Устанавливает системные дату и время
                  DOS UNIX Win16 #include
                  OS/2 int stime(time_t *tp);
                  stpcpy Копирует одну строку в другую
                  DOS UNIX Win16 #include
                  OS/2 Win32 char *stpcpy(char *dest, const char *src);
                  strcat,_fstrcat Добавляет одну строку к другой
                  #include
                  DOS UNIX Win16 Короткий вызов функции:
                  OS/2 Win32 char *strcat(char *dest, const char *src);
                  ANSI C++ ANSI C Длинный вызов функции:
                  char far * far_fstrcat(char far *dest,
                  const char far *src);
                  strchr,_fstrchr Ищет в строке 1-ое вхождение заданного символа
                  DOS UNIX Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  ANSI C++ ANSI C char *strchr(const char *s, int c);
                  Длинный вызов функции:
                  char far *far_fstrchr(const char far *s,int c);
                  strcmp,_fstrcmp Сравнивает одну строку с другой
                  DOS UNIX Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  ANSI C++ ANSI C char *strcpy(char *dest, const char *src);
                  Длинный вызов функции:
                  int far _fstrcmp(const char far *s1, const
                  char far *s2);
                  strcmpi Сравнивает одну строку с другой без различения
                  больших и маленьких букв
                  DOS UNIX #include
                  OS/2 Win32 int strcmpi(const char *s1, const char *s2);
                  strcoll Сравнивает две строки
                  DOS Win16 #include
                  OS/2 Win32 int strcoll(char* s1,char* s2)
                  ANSI C++ ANSI C
                  strcpy,_fstrcpy Копирует одну строку в другую
                  DOS UNIX Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  ANSI C++ ANSI C char *strcpy(char *dest, const char *src);
                  Длинный вызов функции:
                  char far * _fstrcpy(char far *dest, const
                  char far *src);
                  strcspn,_fstrcspn Ищет в строке первый сегмент, не содержащий ни
                  одного символа из заданного набора символов
                  DOS UNIX Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  ANSI C++ ANSI C size_t strcspn(const char *s1, const char *s2);
                  Длинный вызов функции:
                  size_t far _fstrcspn(const char far *s1,
                  const char far *s2);
                  _strdate Преобразует текущую дату в строку
                  DOS Win16 #include
                  OS/2 Win32 char *_strdate(char *buf);
                  strdup,_fstrdup Копирует строку во вновь создаваемую область
                  памяти
                  DOS UNIX Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  char *strdup(const char *s);
                  Длинный вызов функции:
                  char far *far _fstrdup(const char far *s);
                  _strerror Позволяет адаптировать сообщение об ошибке
                  DOS Win16 #include
                  OS/2 Win32 char *_strerror(const char *s);
                  strerror Возвращает указатель на строку сообщения об
                  ошибке
                  DOS Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C char *strerror(int errnum);
                  strftime Форматирует время для выходных данных
                  DOS UNIX Win16 #inciude
                  OS/2 Win32 size_t_cdecl strftime(char*s, size_t
                  ANSI C++ ANSI C maxcsize, const char*fmt,const struct
                  tm*t);
                  stricmp,_fstricmp Cравнивает одну строку с другой без различения
                  больших и маленьких букв
                  DOS UNIX Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  ANSI C++ ANSI C int stricmp(const char *s1, const char *s2);
                  Длинный вызов функции:
                  int far _fstricmp(const char far *s1,
                  const char far *s2);
                  strlen,_fstrlen Вычисляет длину строки
                  DOS UNIX Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  ANSI C++ ANSI C size_t strlen(const char *s);
                  Длинный вызов функции:
                  size_t far _fstrlen(const char far *s);
                  strlwr,_fstrlwr Преобразует в строке большие буквы (буквы верхнего регистра) в маленькие буквы (буквы нижнего регистра)
                  DOS UNIX Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  ANSI C++ ANSI C char *strlwr(char *s);
                  Длинный вызов функции:
                  char far *far _fatrlwr(char char far *s);
                  strncat,_fstrncat Добавляет часть одной строки к другой
                  DOS UNIX Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  ANSI C++ ANSI C char *strncat(char *dest, const char*src,
                  size_t maxlen);
                  Длинный вызов функции:
                  char far * far _fstrncat(char far *dast,
                  const char far *src,
                  size_t maxlen)
                  strncmp,_fstrrncmp Сравнивает часть одной строки с частью другой
                  DOS UNIX Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  ANSI C++ ANSI C int strncmp(const char *s1, constchar *s2,
                  size_t maxlen);
                  Длинный вызов функции:
                  int far _fstrncmp(const char far *s1,
                  const char far *s2,
                  size_t maxlen)
                  strncmpi Сравнивает часть одной строки с частью другой
                  без различения больших и маленьких букв
                  DOS UNIX Win16 #include
                  int strncmpi(const char *s1, const char *s2,
                  size_t n);
                  strncpy,_fstrncpy Копирует заданное число байт из одной строки в
                  другую, при необходимости производится отбрасывание или приращение
                  DOS UNIX Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  ANSI C++ ANSI C char *strncpy(char *des, const char *src,
                  size_t maxlen);
                  Длинный вызов функции:
                  char far * far _fstrncpy(char far *dest,
                  const char far *src, size_t maxlen)
                  strnicmp,_fstrnicmp Сравнивает часть одной строки с частью другой
                  без учета различия больших и маленьких букв
                  DOS Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  ANSI C++ ANSI C int strnicmp(const char *s1,
                  const char *s2, size_t maxlen);
                  Длинный вызов функции:
                  int far _fstrnicmp(const char far *s1,
                  const char far *s2, size_t maxlen);
                  strnset,_fstrnset Заменяет заданное количество символов в строке
                  на указанный символ
                  DOS Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  char *strnset(char *s, int ch,size_t n);
                  Длинный вызов функции:
                  char far * far _fstrnset(char far *s, int ch,
                  size_t n);
                  strpbrk,_fstrpbrk Ищет в строке первое вхождение любого символа
                  из переданного функции набора символов
                  DOS UNIX Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  ANSI C++ ANSI C char *strpbrk(const char *s1, const char *s2);
                  Длинный вызов функции:
                  char far * far _fstrpbrk(const char far *s1,
                  const char far *s2);
                  strrchr,_fstrrchr Ищет в строке последнее вхождение заданного
                  символа
                  DOS UNIX Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  ANSI C++ ANSI C char *strrchr(const char *s, int c);
                  Длинный вызов функции:
                  char far * _fstrrchr(const char far *s, int c);
                  strrev,_fstrrev Перевертывает строку
                  DOS Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  char *strrev(char *s);
                  Длинный вызов функции:
                  char far * far _fstrrev(char far *s);
                  strset,_fstrset Заменяет все символы строки на заданный символ
                  DOS Win16 #include
                  OS/2 Win32 Короткий вызов функции:
                  char *strset(char *s, int ch);
                  Длинный вызов функции:
                  char far * far _fstrset(char far *s, int ch);
                  strspn,_fstrspn Ищет в строке первый сегмент, который является
                  подмножеством заданного функции набора символов
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C #include
                  Короткий вызов функции:
                  size_t strspn(const char *s1, const char *s2);
                  Длинный вызов функции:
                  size_t far _fstrspn(const char far *s1, const
                  char far *s2);
                  strstr,_fstrstr Ищет в строке вхождение заданной подстроки
                  DOS UNIX Win16 #include < string.h>
                  OS/2 Win32 Короткий вызов функции:
                  ANSI C++ ANSI C char *strstr(const char *s1, const char *s2);
                  Длинный вызов функции:
                  char far * far _fstrstr(const char far *s1,
                  const char far *s2);
                  _strtime Преобразует текущее время в строку
                  DOS UNIX Win16 #include
                  OS/2 Win32 char *_strtime(char *buf);
                  ANSI C++ ANSI C
                  strtod,_strtold Преобразует строку в числовое значение типа
                  double
                  strtod
                  #include
                  DOS UNIX Win16 double strtod(const char *s, char **endptr);
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  _strtold #include
                  long double _strtold(const char *s, char
                  DOS Win16 **endptr);
                  OS/2 Win32
                  strtok,_fstrtok Ищет в первой строке лексемы, которые разделены
                  любым из символов, входящих во вторую строку
                  DOS UNIX Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C Короткий вызов функции:
                  char *strtok(char *s1, const char *s2);
                  Длинный вызов функции:
                  char far * far _fstrtok(char far *s1,
                  const char far *s2);
                  strtol Преобразует строку в числовое значение типа
                  long
                  DOS Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C long strtol(const char *s, char **endptr,
                  int radix);
                  _strtold Смотpи strtod
                  strtoul Преобразует строку в число типа usigned long c
                  заданным основанием
                  DOS Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C unsigned long strtoul(const char *s,
                  char **endptr, int radix);
                  strupr,_fstrupr Преобразует маленькие буквы (буквы нижнего ре-
                  гистра) в строке в большие (верхнего регистра)
                  DOS Win16
                  OS/2 Win32 #include
                  ANSI ANSI C Короткий вызов функции:
                  char *strupr(char *s);
                  Длинный вызов функции:
                  char far * far _fstrupr(char far *s);
                  strxfrm Трансформирует часть строки
                  DOS Win16 #include
                  OS/2 Win32 size_t strxfrm(char*s1,char*s2,size_t n);
                  ANSI C++ ANSI C
                  swab Меняет местами байты
                  DOS UNIX Win16 #include
                  OS/2 Win32 void swab(char *from, char *to, int
                  nbytes);
                  system Вызывает команду DOS
                  DOS UNIX #include
                  OS/2 Win32 int system(const char *command);
                  tan,tanl Вычисляет тангенс
                  tan #include
                  double tan(double x);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  tanl #include
                  long double tanl(long double x);
                  DOS UNIX Win16
                  OS/2 Win32
                  tanh,tanhl Вычисляет гиперболический тангенс
                  tanh #include
                  double tanh(double x);
                  ---***---
                  tanhl #include
                  версия long double tanhl(long double x);
                  DOS Win16
                  OS/2 Win32
                  tell Получает текущую позицию указателя файла
                  DOS UNIX Win16 #include
                  OS/2 Win32 ANSI C long tell(int handle);
                  tempnam Создает уникальное имя файла в специфицированном каталоге
                  DOS UNIX Win16
                  OS/2 Win32 #include
                  char *tempnam(char *dir, char *prefix);
                  textattr Устанавливает текстовые атрибуты
                  DOS #include
                  OS/2 Win32 void textattr(int newattr);
                  textbackground Устанавливает новый цвет фона
                  DOS #include
                  OS/2 Win32 void textbackground(int newcolor);
                  textcolor Устанавливает новый цвет символов в текстовом
                  режиме
                  DOS
                  OS/2 Win32 #include
                  void textcolor(int newcolor);
                  textmode Переводит экран в текстовый режим
                  DOS #include
                  OS/2 Win32 void textmode(int newmode);
                  time Получает время дня
                  DOS UNIX Win16 #include
                  OS/2 Win32 time_t time(time_t *timer);
                  ANSI C++ ANSI C
                  tmpfile Открывает временный файл в двоичном режиме
                  DOS UNIX Win16 #include
                  OS/2 Win32 FILE *tmpfile(void);
                  ANSI C++ ANSI C
                  tmpnam Создает уникальное имя файла
                  DOS UNIX Win16 #include
                  OS/2 Win32 char *tmpnam(char *s);
                  ANSI C++ ANSI C
                  toascii Преобразует символ в формат ASCII
                  DOS UNIX Win16 #include
                  OS/2 Win32 int toascii(int c);
                  _tolower Преобразует символы в символы нижнего регистра
                  DOS UNIX Win16 #include
                  OS/2 Win32 int _tolower(int ch);
                  tolower Преобразует символы в символы нижнего регистра
                  DOS UNIX Win16 #include
                  OS/2 Win32 int tolower(int ch);
                  ANSI C++ ANSI C
                  _toupper Преобразует символы в символы верхнего регистра
                  DOS UNIX Win16 #include
                  OS/2 Win32 int _toupper(int ch);
                  toupper Преобразует символы в символы верхнего регистра
                  DOS UNIX Win16 #include
                  OS/2 Win32 int toupper(int ch);
                  ANSI C++ ANSI C
                  tzset Устанавливает значение глобальных переменных
                  daylight, timezone и tzname
                  DOS UNIX Win16
                  OS/2 Win32 #include
                  void tzset(void);
                  ultoa Преобразует значение типа unsigned long в строку
                  DOS Win16
                  OS/2 Win32 #include
                  char *ultoa(unsigned long value,
                  char *string, int radix);
                  umask Устанавливает маску, разрешающую чтение/запись
                  DOS Win16 #include
                  OS/2 Win32 unsigned umask(unsigned mode);
                  ungetc Возвращает символ обратно во входной поток
                  DOS UNIX Win16 #include
                  OS/2 Win32 int ungetc(int c, FILE *stream);
                  ANSI C++ ANSI C
                  ungetch Возвращает символ обратно в буфер клавиатуры
                  DOS UNIX #include
                  OS/2 Win32 int ungetch(int ch);
                  unixtodos Преобразует дату и время из UNIX к формату DOS
                  DOS Win16 #include
                  OS/2 Win32 void unixtodos(long time, struct date *d,
                  struct time *t);
                  unlink Уничтожает файл
                  DOS UNIX Win16 #include
                  OS/2 Win32 int unlink(const char *filename);
                  unlock Разрешает совместное использование файла
                  DOS Win16 #include
                  OS/2 Win32 int unlock(int handle, long offset,
                  long length);
                  utime Устанавливает время и дату работы с файлом
                  DOS UNIX Win16 #include
                  OS/2 Win32 int utime(char *path, struct utimebuf *times);
                  va_arg
                  va_end
                  va_start
                  Позволяет использовать переменный список
                  аргументов
                  #include
                  DOS UNIX Win16 void va_start(va_list ap, lastfix);
                  OS/2 Win32 type va_arg(va_list ap,type);
                  ANSI C++ ANSI C void va_end(va_list ap);
                  vfprintf Пересылает форматированный вывод в поток
                  DOS UNIX Win16 #include
                  OS/2 Win32 int vfprintf(FILE *stream, const char *format,
                  ANSI C++ ANSI C va_list arglist);
                  vfscanf Осуществляет форматированный ввод из потока
                  DOS UNIX Win16 #include
                  OS/2 Win32 int vfscanf(FILE *stream, const char
                  *format, va_list arglist);
                  vprintf Пересылает форматированный вывод в stdout
                  DOS UNIX #include
                  OS/2 C++ Win32 int vprintf(const char *format,
                  ANSI C++ va_list arglist);
                  vscanf Осуществляет форматированный ввод из stdin
                  DOS UNIX Win16 #include
                  OS/2 Win32 int vscanf(const char *format,va_list
                  arglist);
                  vsprintf Посылает форматированный вывод в строку
                  DOS UNIX Win16 #include
                  OS/2 Win32 int vsprintf(char *buffer,const char *format,
                  ANSI C++ ANSI C va_list arglist);
                  vsscanf Осуществляет форматированный ввод из потока
                  DOS UNIX Win16 #include
                  OS/2 Win32 int vsscanf(const char *buffer,
                  const char *format, va_list arglist);
                  wait Пpиостанавливает один и более подпpоцессов
                  пpи их выполнении.
                  OS/2 Win32 #include
                  int wait (int *statloc)
                  wcstombs Преобразует массив типа wchar_t в байтовую
                  строку
                  DOS UNIX Win16 #include
                  OS/2 Win32 size_t wcstombs(char *s,const wchar_t *pwcs,
                  ANSI C++ ANSI C size_t n);
                  wctomb Преобразует код типа wchar_t в многобайтовый
                  символ
                  DOS UNIX Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C int wctomb(char *s, wchar_t wc);
                  wherex Возвращает горизонтальную позицию курсора внутри окна
                  DOS Win16 #include
                  OS/2 Win32 int wherex(void);
                  wherey Возвращает вертикальную позицию курсора внутри
                  окна
                  DOS Win16 #include
                  OS/2 Win32 int wherey(void);
                  window Описывает активное в текстовом режиме окно
                  DOS #include
                  OS/2 Win32 void window(int left, int top, int right,
                  int bottom);
                  _write Смотpи _rtl_write
                  write Записывает в файл
                  DOS UNIX Win16 #include
                  OS/2 Win32 int write(int handle, void *buf, unsigned len);



                  Работа программ с оверлеями


                  Программа управления оверлеями (VROOMM, или Virtual Run-time
                  Object-Oriented Memory Manager) выполняет за вас большую часть
                  работы по организации оверлеев. В обычных оверлейных системах модули группируются в базовый и набор оверлейных модулей. Подпрограммы в данном оверлейном модуле могут вызывать подпрограммы из
                  этого же модуля и из базового модуля, но не из других модулей.
                  Оверлейные модули перекрывают друг друга, т.е. одновременно в памяти может находиться только один оверлейный модуль, и все они
                  при активизации занимают один и тот же участок физической памяти.
                  Общий объем памяти, необходимой для запуска данной программы, определяется размером базового, плюс максимального оверлейного модуля.
                  Эта обычная схема не обеспечивает достаточной гибкости. Она
                  требует полного учета всех возможных обращений между модулями
                  программы и, соответственно, планируемой вами, группировки оверлеев. Если вы не можете разбить вашу программу в соответствии со
                  взаимозависимостью обращений между ее модулями, то вы не сможете
                  и разбить ее на оверлеи.
                  Схема VROOMM совершенно иная. Она обеспечивает динамический
                  свопинг сегментов. Основной единицей свопинга является сегмент.
                  Сегмент может состоять из одного или нескольких модулей. И что
                  еще более важно, любой сегмент может вызывать любой другой сегмент.
                  Вся память делится на базовую область и область свопинга.
                  Как только встречается вызов функции, которая не находится ни в
                  базовой, ни в области свопинга, сегмент, содержащий вызываемую
                  функцию, помещается в область свопинга, возможно, выгружая оттуда
                  при этом другие сегменты. Это мощное средство - подобное виртуальной программной памяти. От вас больше не требуется разбивать
                  код на статические, отдельные оверлейные блоки. Вы просто запускаете программу!
                  Что происходит, когда возникает необходимость поместить сегмент в область свопинга? Если эта область имеет достаточно свободного места, то данная задача выполняется просто. Если же нет,
                  то из области свопинга, чтобы искомая свободная область освободилась, должен быть выгружен один или более сегментов. Как выбрать



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

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

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

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

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

                  работает программа. Область свопинга работает как кэш-память: чем

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

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

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

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

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

                  программы, но его можно изменить при помощи глобальной переменной

                  _ovrbuffer. Если достаточный размер памяти недоступен, то появляется либо сообщение об ошибке DOS ("Program too big to fit in memory" - "Программа слишком велика для имеющейся памяти").

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

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

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

                  не считываться с диска, а просто копироваться из этой памяти. Это

                  существенно ускоряет свопинг.

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


                  Работа с администратором документа и отображаемыми элементами


                  TDocument имеет две функции для работы с отображаемыми элементами - NotifyViews и QueryViews, для которых указывается три
                  параметра (событие, параметр события, и TView*). Последний параметр позволяет вам исключить из запроса или уведомления и передать функции указатель на отображаемый элемент. Эти две функции
                  являются основными средствами передачи информации между документом и его отображаемыми элементами.
                  Обе функции могут работать с таблицами реакции отображаемого
                  элемента. Функцию NotifyViews можно использовать для уведомления
                  дочерних документов, их отображаемых элементов или вашего корневого документа об изменении данных, их обновлении или других событиях, которые должны отражаться на экране. Сначала эта функция
                  вызывает с теми же параметрами функции NotifyViews всех дочерних
                  документов. После этого событие и параметр передается отображаемым элементам документа. Функция возвращает булевское значение,
                  передаваемое соответствующим отображаемым элементом.
                  QueryViews также передает событие и сопровождающий параметр,
                  но вместо True или False возвращает указатель на первый отображаемый документ, возвращающий True. Это позволяет найти отображаемый элемент, отвечающий некоторым условиям, а затем выполнить с
                  ним некоторые действия. QueryViews останавливается на первом
                  отображаемом элементе, возвращающим True.


                  Работа с буфером Clipboard


                  Чтобы скопировать элемент в буфер Clipboard, позиционируйте
                  на элементе курсор, нажмите клавишу Ins для его подсветки, затем
                  нажмите клавиши Shift+F3. Чтобы вставить содержимое буфера в окно
                  или диалоговое окно, нажмите Shift+F4. Выводится диалоговое окно
                  Pick, содержащее список всех элементов буфера Clipboard и набор
                  кнопок с зависимой фиксацией, позволяющих вам выполнять различным
                  образом вставку элементов: String, Location и Contents. Это позволяет вам интерпретировать элемент, как вставляемый одним из
                  трех способов: как строку, как адрес, или как содержимое по адресу. Категории, которые вы можете использовать для вставки элемента, зависят от его типа и назначения.
                  Для вставки элемента в диалоговое окно, подсветите элемент,
                  выделите соответствующую категорию, затем нажмите клавишу Enter
                  или активизируйте кнопку OK (для редактирования записи) или Paste
                  (если вы хотите отредактировать запись).
                  Выбор команды View Clipboard выводит на экран окно Clipboard, в котором перечисляются все вырезанные элементы.
                  [*] Clipboard
                  Module : @#TCDEMO#36 nlines ^
                  Inspector : nlines 0 (0x0)
                  Module : @#TCDEMO#38 totalcharacters
                  Inspector : totalcharacters 0 (0x0)
                  v
                  < >
                  В левом поле этого окна описывается тип записи, за которым
                  следует двоеточие и вырезанный элемент. Если вырезанный элемент
                  представляет собой выражение из окна Watch, переменную из окна
                  Inspector или данные, регистр или флаг из окна CPU то за элемен-
                  том следует его значение или значения.

                  Тип Описание
                  Address Адрес без соответствующих данных или кода.
                  Control flag Значение управляющего флага сопроцессора.
                  Coprocessor Регистр арифметического сопроцессора 80х87.
                  CPU code Адрес и список байт выполняемых инструкций из
                  области кода окна CPU.
                  CPU data Адрес и список байт данных в памяти из области
                  данных в окне CPU или в окне Dump.
                  CPU flag Значение флага ЦП из области флагов окна CPU.
                  CPU register Имя регистра и значение из области регистров
                  окна CPU или окна Register.
                  CPU stack Исходная позиция и кадр стека из области стека
                  окна CPU.
                  Expression Выражение из окна Watches.
                  File Позиция в файле (в окне File), которая не является модулем в программе.
                  Inspector Одно из следующих:

                  • имя переменной из окна Inspector;

                  • значение константы из окна Inspector или Watch;

                  • регистровая переменная окна Inspector.;

                  • битовое поле окна Inspector.
                  Module Содержимое модуля, включая позицию в исходном
                  коде, аналогично переменной из окна Module.
                  Status flag Значение флага состояния сопроцессора 80х87.
                  String Текстовая строка, например, отмеченный блок из
                  окна File.

                  При вставке элементов из буфера Clipboard их тип должен со-
                  ответствовать типу поля ввода. SpeedMenu окна Clipboard содержит
                  следующие команды:

                  Команда Описание
                  Inspect Позиционирует курсор в то окно, из которого был
                  извлечен элемент.
                  Remove Удаляет подсвеченный элемент или элементы. Тот
                  же эффект для подсвеченного элемента имеет клавиша Del.
                  Delete all Удаляет все в буфере Clipboard.
                  Freeze Приостанавливает динамическое обновление элемента Clipboard.



                  Работа с контекстами устройств


                  При работе с GDI Windows для доступа ко всем устройства, от
                  окон до принтеров и графопостроителей, следует использовать контекст устройства (DC) - поддерживаемую GDI структуру, которая содержит важную информацию об устройстве (основной и фоновый цвет,
                  шрифт, палитру и др.). ObjectWindows 2.0 инкапсулирует информацию
                  контекста устройства в нескольких классах контекста. Для всех
                  этих классов базовым классом является TDC. TDC содержит большую
                  часть необходимых для работы с контекстом устройства функций.


                  Работа с меню


                  Команды глобальных меню Turbo Debugger выводятся в верхней
                  части экрана в строке меню. Если вы не находитесь в диалоговом
                  окне, то эти команды всегда доступны. Чтобы открыть меню Turbo
                  Debugger, нажмите F10, с помощью стрелой переместитесь в нужному
                  пункту и нажмите Enter. После F10 для перехода к нужному пункту
                  можно также нажать его подсвеченную букву, либо сразу нажмите
                  Alt+буква (без F10). Системное меню выбирается по Alt+пробел. Меню открывается также щелчком "мышью" на соответствующем пункте.


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


                  Действие механизма переопределяемых функций несколько сходно с
                  механизмом функции переключателя switch, используемого в Паскале. Однако, если switch, в зависимости от значения, выполняет тот или иной
                  блок процедур, то переопределяемые функции, в зависимости от заданных
                  аргументов вызывают и выполняют, тот или иной код, используя одно и
                  то же имя функции. Дело в том, что компиляторы Турбо и Borland С++,
                  различают функции не только по их именам, но и по типу их аргументов.
                  Достичь полиморфизма через "игру" с аргументами можно: потерей
                  одного из аргументов (осторожно, так чтобы компилятор не спутал
                  отсутствие аргумента с особой "потерей" аргументов, принимаемыми "по
                  умолчанию", описываемыми далее), изменить тип аргумента, или использовать различное число аргументов. Например, функцию, вычисляющую
                  площадь прямоугольника
                  double sqr (double x, double y){return x*y;}
                  можно дополнить одноименной, но вычисляющей площадь квадрата, имеющую
                  отличный тип у аргумента x и меньшее число параметров:
                  int sqr (int x){return x*x;}
                  Компилятор предварительно просматривает содержащиеся в функции
                  типы и по отличию в типе аргумента определяет ту или иную функцию.
                  Переопределяемые функции
                  v v v
                  double sqr (double x, double y); int sqr(int x);
                  { { ^
                  return x*y; return x * x;
                  } }
                  int i, k;
                  Проверка типов
                  v v
                  k = add(i);
                  Как вы видите наблюдается некоторая дополнительная работа (компилятора языка С++ по отношению к Си), при раннем связывании функций
                  объектов - проверка типов.
                  Однако нужно иметь в виду, что компилятор не отличит эти же
                  функции, если тип аргумента сделать одинаковым, а изменить лишь тип
                  возвращаемого значения, например:
                  double sqr (double x){return x*x;};
                  и
                  int sqr (double x){return x*x;}


                  Распределение памяти для оверлейных структур


                  Модель MEDIUM Модель LARGE
                  класс CODE Резидентный класс CODE
                  код
                  Эти сегменты класс OVRINFO Данные для класс OVRINFO
                  генерируются управления
                  компоновщиком оверлеями
                  автоматически
                  класс STUBSEG Один сегмент класс STUBSEG
                  stub для
                  каждого
                  оверлейного
                  сегмента
                  _DATA _DATA
                  Ближняя динами- класс DATA класс DATA
                  чески распреде-
                  ляемая область и ближняя куча Отдельный
                  стек совместно ^ сегмент ^
                  используют сег- стек стека стек
                  мент данных
                  оверлейный буфер оверлейный буфер
                  (распределяется (распределяется
                  при загрузке) при загрузке)
                  дальняя дальняя
                  динамически динамически
                  распределяемая распределяемая
                  v область v область
                  Модель HUGE
                  Резидентный класс CODE
                  код
                  Эти сегменты Данные для класс OVRINFO
                  генерируются управления
                  компоновщиком оверлеями
                  автоматически
                  Один дополни- класс STUBSEG
                  тельный сег-
                  мент для
                  каждого
                  оверлейного
                  сегмента
                  . . . Несколько
                  сегментов
                  данных
                  Отдельный
                  сегмент ^
                  стека стек
                  оверлейный буфер
                  (распределяется
                  при загрузке)
                  дальняя
                  динамически
                  распределяемая
                  v область


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


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


                  Расширение TDib


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

                  Элемент данных Описание
                  Info Указатель на структуру BITMAPINFO или BIT-
                  MAPCOREINFO, содержащую атрибуты, таблицу
                  цветов и другую информацию о DIB.
                  Bits Указатель на область памяти с фактическими
                  графическими данными для DIB.
                  NumClrs Содержит фактическое число используемых в
                  DIB цветов (не возможных, а фактически используемых).
                  W Ширина DIB в элементах изображения.
                  H Высота DIB в элементах изображения.
                  Mode Режим DIB (RGB или палитра).
                  IsCore Имеет значение True, если Info указывает на
                  структуру BITMAPCOREINFO.
                  IsResHandle Указывает, был ли DIB загружен из ресурса,
                  и, следовательно, является ли Handle описателем ресурса.

                  Функция InfoFromHandle позволяет заполнить структуру Info.
                  Она выделяет информацию из Handle и заполняет атрибуты в структуре Info. Эта функция не имеет параметров и не возвращает значения.
                  Функция Read считывает из файла, указываемого объектом TFile, DIB, совместимые с Windows 3.0 или Presentation Manager. При
                  загрузке Read проверяет заголовок DIB, атрибуты, палитры и битовый массив. Совместимые с Presentation Manager DIB сразу преобразуются в DIB Windows. При удачном чтении возвращается True.
                  Чтобы загрузить DIB из приложения или модуля DLL, вы можете
                  использовать функцию LoadResource. Эта функция имеет два параметра, первый из которых - это HINSTANCE приложения или модуля DLL,
                  из которого вы загружаете DIB, а TResId указывает конкретный ресурс в модуле, который вы хотите загрузить. Для загрузки DIB из
                  файла можно использовать функцию LoadFile с единственным параметром - строкой имени файла.


                  Расширения Borland C++ по сравнению с Си стандарта ANSI



                  __asm __except __import (2) pascal
                  _asm __export _import (2) __saveregs (1)
                  __cdecl __far (1) _interrupt (1) _saveregs (1)
                  _cdecl _far (1) interrupt (1) __seg (1)
                  cdecl far (1) __loadds (1) _seg (1)
                  __cs (1) __fastcall _loadds (1) ___ss (1)
                  _cs (1) _fastcall __near (1) __ss (1)
                  __ds (1) __finally _near (1) __rtti
                  _ds (1) __huge (1) near (1) __thread (2)
                  __es (1) _huge (1) __pascal __try
                  _es (1) huge (1) _pascal


                  (1) - доступны только для 16-разрядных компиляторов

                  (2) - доступны только для 32-разрядных компиляторов


                  Расширенные макрокоманды диагностики



                  Макрокоманда Назначение
                  CHECKX Выводит заданное сообщение и генерирует
                  исключительную ситуацию, если определенное в аргументе условие равно 0.
                  Данную макрокоманду можно использовать
                  для проверки значения в функции.
                  PRECONDITIONX Выводит заданное сообщение и генерирует
                  исключительную ситуацию, если определенное в аргументе условие равно 0.
                  Данную макрокоманду можно использовать
                  на входе в функцию для проверки корректности ее вызова.
                  TRACEX Трассирует только при разрешении за данных в аргументах группы и уровня.
                  WARNX Выводит предупреждение только при раз решении заданных в аргументах группы и уровня.
                  DIAG_DECLARE_GROUP Описывает группу с заданным в аргументе именем.
                  DIAG_DEFINE_GROUP Определяет группу с заданным в аргументе именем.
                  DIAG_CREATE_GROUP Определяет и описывает группу с заданным в аргументе именем.
                  DIAG_ENABLE Устанавливает флаг разрешения указанной
                  группы в заданное значение.
                  DIAG_ISENABLED Если заданная группа разрешена, возвращает ненулевое значение.
                  DIAG_SETLEVEL Устанавливает пороговый уровень задан ной группы в указанное значение.
                  DIAG_DETLEVEL Получает пороговый уровень заданной группы.

                  При использовании TRACEX и WARNX требуется возможность создания групп. Пороговые уровни представляют собой произвольные
                  числовые значения, устанавливающие порог разрешения макрокоманд.
                  Макрокоманда с большим пороговым уровнем, чем пороговый уровень
                  группы, выполняться не будет. Например, если группа имеет пороговый уровень 0 (значение по умолчанию), то все макрокоманды в
                  группе с уровнем 1 или выше игнорируются.


                  Расширяемость кода


                  Наследование позволяет повторно использовать существующие исходные тексты программ, подправлять их и перекомпилировать. Эта способность готового к компиляции исходного текста названа расширяемостью.
                  Наследование >
                  Новый класс
                  shape.h + circle.h = circle.h
                  shape.obj circle.c circle.obj
                  Для дополнения класса shape (фигура) классом circle (круг),
                  достаточно лишь объявления его в классе shape (без изменения функций
                  элементов класса) в модуле shape.h и скомпилировать исходный текст в
                  shape.obj. Таким образом нет необходимости изменять исходный текст
                  shape.c.
                  Успешное создание потомков позволяет увеличивать программу за
                  счет накопления уже готовых текстов программ. Так, круг наследуют все
                  свойства фигуры, а цилиндры наследуют все свойства круга и фигуры.
                  Цилиндр: cylinder() ht area() vol()
                  Круг: circle() radius area()
                  Фигура: shape() xo yo area()
                  Возможно вы заметили по картинке, что класс цилиндр имеет три
                  функции area(). Действительно, унаследована одна функция area() у окружности, и одна у фигуры. Заимствование этих двух функций, для цилиндра оставляет возможность доступа к ним.
                  Примечание: порожденный класс может только наращивать базовый класс,
                  но не способен удалять какие-либо элементы.
                  Программист, без исходного текста программы, располагая лишь
                  описанием интерфейса с некоторым классом, может определить новый
                  класс, наследующий все свойства базового. После этого он может выборочно переопределить поведение некоторых функций элементов базового
                  класса так, как ему нужно.


                  Раздел дизассемблирования


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


                  Раздел модулей


                  В разделе модулей файла регистрации перечисляются модули,
                  которые выполнялись во время возникновения исключительной ситуации. Здесь приводится следующая информация:
                • маршрут для программы, выполняющей файл;

                • дату;

                • размер файла;

                • имя модуля;

                • описатель модуля;

                • счетчик ссылок (сколько элементов использует модуль).



                • Раздел очереди сообщений


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

                • номер идентификатора сообщений (идентифицирует, каким он
                  был);

                • два параметра (присутствующие для любого заданного окна).

                • То, что записывается в разделе очереди сообщений, может фактически не быть реальным последним сообщением, полученным программой. Windows может обходить очередь сообщений (используя, например, функцию SendMessage). При использовании информации об
                  очереди сообщений нужно иметь это в виду.
                  Раздел задач
                  В разделе задач файла регистрации перечисляются все программы, работающие в системе во время возникновения исключительной
                  ситуации. Здесь приводится следующая информация:
                • полный маршрут выполняемого файла;

                • имя модуля;

                • описатель окна модуля;

                • описатель задачи;

                • каким было значение сегмента данных для задачи (описатель
                  экземпляра).



                • Раздел регистров


                  Раздел регистров файла регистрации представляет значения,
                  которые находились в стандартных регистрах во время исключительной ситуации. Для регистров CS, DS, ES и SS даны ограничения и
                  полномочия доступа.


                  Раздел трассировки стека


                  Первая строка раздела трассировки стека файла регистрации
                  идентифицирует функцию или процедуру, которая выполнялась во время исключительной ситуации. Stack Trace information включает в
                  себя:
                • номер кадра стека;

                • имя модуля;

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

                • логический или физический адрес кадра стека;

                • куда ваша программа возвращается после вызова.

                • Когда WinSpector дает имена функций, он ищет в файле .SYM
                  ближайший идентификатор, который встречается перед адресом стека
                  вызова. Некоторые файлы .SYM не содержат информации обо всех инструкциях. Таким образом, имя функции в файле регистрации будет
                  представлять ближайшую функцию в файле .SYM с адресом, предшествующим адресу стека. Если поле смещение показывает слишком большое значение, то имя функции подозрительно.


                  Различимость регистра символов в идентификаторе: параметр /C


                  Когда вы добавляете к библиотеке какой-либо модуль, утилита
                  TLIB корректирует словарь всех общедоступных идентификаторов, которые описаны в модулях библиотеки. Все идентификаторы в конкретной библиотеке должны быть различными. Если попытаться добавить к библиотеке какой-либо модуль, в котором содержится дублирующий
                  идентификатор, то утилита TLIB выдаст сообщение, но модуль не добавит.
                  Обычно когда утилита TLIB проверяет библиотеку на наличие дублируемых идентификаторов, буквы верхнего и нижнего регистров обычно не различаются. Например, идентификаторы lookuр и LOOKUP будут восприниматься как дубликаты. Так как Си обрабатывает буквы верхнего и нижнего регистров как различным образом, для добавления в библиотеку модуля, содержащего идентификатор, отличающийся от другого, уже имеющегося в библиотеке идентификатора, только регистром букв, нужно пользоваться параметром /C. Параметр /C указывает утилите TLIB, что нужно считать допустимыми модули, в
                  которых идентификаторы отличаются от уже имеющихся в библиотеке
                  только регистром букв.
                  Если вы хотите использовать эту библиотеку с другими компоновщиками (или позволить другим лицам использовать эту библиотеку с другими компоновщиками), то во избежание "неприятностей", параметр /C использовать не рекомендуется.


                  Разные подпрограммы


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

                  delay (dos.h) sound (dos.h)
                  nosound (dos.h)



                  Разработка программ с оверлеями


                  Этот раздел содержит важные сведения о разработке программ с
                  оверлеями с хорошими характеристиками.
                  При компиляции оверлейного модуля вы должны использовать
                  большую модель памяти (medium, large или huge). При всяком вызове
                  функции из оверлейного модуля вы обязаны гарантировать, что все
                  активные в текущий момент функции являются дальними.
                  Вы обязаны компилировать все оверлейные модули с параметром
                  -Y, что обеспечит оверлейную структуру генерируемого кода.
                  Невыполнение требования дальних вызовов в оверлейной программе приведет при выполнении программы к непредсказуемым и возможно, катастрофическим результатам.
                  Размер оверлейного буфера по умолчанию в два раза превышает
                  размер самого большого оверлея. Для большинства прикладных программ такое умолчание вполне адекватно. Однако, представим себе
                  ситуацию, когда какая-либо функция программы реализована несколькими модулями, каждый из которых является оверлейным. Если общий
                  размер этих модулей превышает размер оверлейного буфера, то если
                  модули часто вызывают друг друга, это приведет к интенсивному
                  свопингу.
                  Очевидно, что решение здесь заключается в увеличении размера
                  оверлейного буфера до таких размеров, чтобы в любой момент времени в нем помещались все часто вызывающие друг друга оверлеи. Это
                  можно сделать, установив через глобальную переменную _ovrbuffer
                  требуемый размер в параграфах. Например, для установки размера
                  оверлейного буфера равным 128К, включите в ваш код следующий оператор:
                  unsigned _ovrbuffer = 0x2000;
                  Общей формулы для определения идеального размера оверлейного
                  буфера не существует.
                  Не создавайте оверлейных модулей, содержащих обработчики
                  прерываний, а также в случаях небольших или критичных к быстродействию программ. Вследствие нереентерабельной природы операционной системы DOS модули, которые могут вызываться функциями прерываний, не должны быть оверлейными.
                  Программа управления оверлеями Borland C++ полностью поддерживает передачу оверлейных функций как аргументов, присвоение и
                  инициализацию переменных типа указателя функции, адресующих оверлейные функции, а также вызов оверлейных подпрограмм через указатели функций.


                  Реакция на блоки списка


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


                  Реакция на сообщения полосы прокрутки


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


                  Реализация потоковых классов


                  Большинство функций-элементов, добавляемых к вашему классу с
                  функцией DECLARE_STREAMABLE, - это поставляемые функции. Однако
                  некоторые из них являются исключением и должны реализовываться
                  вне класса. Для таких определений также предусмотрены макрокоманды.
                  Макрокоманда IMPLEMENT_CASTABLE обеспечивает рудиментарный
                  надежный по типу механизм приведения. При построении с помощью
                  Borland C++ 4.0 вам не нужно это использовать, так как Borland
                  C++ 4.0 поддерживают информацию о типе этапа выполнения. Однако,
                  если вам нужно построить свой программный код с помощью компилятора, не поддерживающего информацию о типе, то нужно использовать
                  макрокоманду IMPLEMENT_CASTABLE. Макрокоманда DECLARE_CASTABLE
                  имеет несколько вариантов:
                  DECLARE_CASTABLE( cls )
                  DECLARE_CASTABLE( cls, base1 )
                  DECLARE_CASTABLE( cls, base1, base2 )
                  DECLARE_CASTABLE( cls, base1, base2, base3 )
                  DECLARE_CASTABLE( cls, base1, base2, base3, base4 )
                  DECLARE_CASTABLE( cls, base1, base2, base3, base4, base5 )
                  В некоторой точке своей программы вам следует вызвать эту
                  макрокоманду, указав в качестве параметра имя своего потокового
                  класса, а в качестве последующих параметров - имена потоковых базовых классов, например:
                  class Base1 : public virtual TStreamableBase
                  {
                  ...
                  DECLARE_STREAMABLE( IMPEXMACRO, Base1, 1 );
                  };
                  IMPLEMENT_CASTABLE( Base1 ); // нет потоковой базы
                  class Derived : public Base1, public virtual Base2
                  {
                  ...
                  DECLARE_STREAMABLE( IMPEXMACRO, Derived1, 1 );
                  };
                  IMPLEMENT_CASTABLE2( Derived, Base1, Base2 );
                  // две потоковых базы
                  class MostDerived : public Derived
                  {
                  ...
                  DECLARE_STREAMABLE( IMPEXMACRO, MostDerived, 1 );
                  };
                  IMPLEMENT_CASTABLE1( MostDerived, Derived );
                  // одна потоковая база
                  Класс Derived использует IMPLEMENT_CASTABLE2, т.к. имеет два
                  потоковых базовых класса.
                  Кроме макрокоманд IMPLEMENT_CASTABLE где-либо в программе
                  вам следует вызвать макрокоманды IMPLEMENT_STREAMABLE. Эти макро-
                  команды выглядят аналогично:
                  DECLARE_STREAMABLE( cls )
                  DECLARE_STREAMABLE( cls, base1 )
                  DECLARE_STREAMABLE( cls, base1, base2 )
                  DECLARE_STREAMABLE( cls, base1, base2, base3 )
                  DECLARE_STREAMABLE( cls, base1, base2, base3, base4 )
                  DECLARE_STREAMABLE( cls, base1, base2, base3, base4, base5 )
                  Однако макрокоманда IMPLEMENT_STREAMABLE имеет одно важное
                  отличие от макрокоманд IMPLEMENT_CASTABLE: при использовании макрокоманд IMPLEMENT_STREAMABLE вам следует в списке параметров перечислить все потоковые классы и перечислить все виртуальные базовые классы, являющиеся потоковыми. Это связано с тем, что макрокоманда IMPLEMENT_STREAMABLE определяет специальный конструктор, который использует объектный потоковый код. Этот конструктор
                  должен вызывать все соответствующие конструкторы для всех прямых
                  базовых классов и всех соответствующих виртуальных классов.


                  Редактирование атрибутов с помощью TargetExpert


                  Целевые атрибуты описывают тип цели. Вы можете изменить атрибуты цели для типов Standard и AppExpert (но не для Source Pools). Чтобы изменить атрибуты:
                • Выберите в окне проекта цель и щелкните на ней правой
                  кнопкой "мыши".

                • Выберите в SpeedMenu TargetExpert. Выводится диалоговое
                  окно TargetExpert.

                • Измените атрибуты цели, затем выберите OK.



                • Редактирование атрибутов узла


                  Параметры узла описывают узел и определяют параметры и
                  трансляторы, используемые при трансляции узла. Для редактирования
                  атрибутов сделайте следующее:
                • Выберите узел в окне проекта и щелкните на нем правой
                  кнопкой "мыши".

                • Выберите в SpeedMenu Edit node attributes. Выводится диалоговое окно Node Attributes.

                • Измените атрибуты узла, затем выберите OK. Атрибуты определяются следующим образом:


                • Атрибут Описание
                  Name Имя узла.
                  Description Любой описывающий узел текст.
                  Style Sheet Имя таблицы стилей, используемых администратором проекта при трансляции узла.
                  Translator Используемый для узла транслятор.
                  Node Type Определяет узел и доступные для узла трансляторы.



                  Редактирование дерева проекта


                  Редактировать дерево проекта можно с помощью оперативных
                  клавиш или команд меню. Некоторые команды меню выводятся только в
                  SpeedMenu. Чтобы вывести в окне Project оперативное меню SpeedMenu, щелкните на узле правой кнопкой "мыши". Доступные в SpeedMenu
                  команды отражают тип выбранного режима.
                  При редактировании проектов вы можете добавлять, удалять и
                  перемещать целевые файлы и узлы, а также копировать узлы. Можно
                  также изменять атрибуты узла и цели.


                  Редактирование Style Sheet


                  Существующие наборы Style Sheet вы можете редактировать, переименовывать и копировать. Для просмотра диалогового окна Style
                  Sheet выберите Options Style Sheets.
                  Compose позволяет вам создавать Style Sheet, комбинируя несколько наборов параметров:
                • Создайте новый набор Style Sheet (щелкнув на New и набрав
                  имя), затем щелкните "мышью" на Compose.

                • Выберите Style Sheet, включаемый в новый набор Style Sheet, затем щелкните "мышью" на Add.

                • Продолжайте добавлять наборы Style Sheet, затем выберите OK.

                • Для копирования Style Sheet:
                • Выберите Style Sheet и щелкните "мышью" на Copy.

                • Наберите имя для скопированного набора Style Sheet и щелкните "мышью" на OK. С помощью кнопки Edit вы можете отредактировать набор.

                • Для редактирования Style Sheet:
                • Выберите Style Sheet и щелкните "мышью" на Edit.

                • Внесите изменения и щелкните на OK.

                • Для переименования Style Sheet:
                • Выберите Style Sheet и щелкните "мышью" на Rename.

                • Наберите имя Style Sheet и щелкните на OK.

                • Удалить Style Sheet можно с помощью Remove.


                  Редактируемые управляющие элементы


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

                • динамический вывод текста (приложением);

                • вырезание, копирование и вставку из буфера обмена;

                • многострочное редактирование (для текстовых редакторов).

                • Примеры содержатся в подкаталоге EXAMPLES\OWL\OWLAPI\VALIDATE.
                  Один из конструкторов TEdit имеет параметры начальной строки
                  текста, максимальной длины строки текста и флаг, определяющий,
                  является ли текстовый управляющий элемент многострочным.
                  По умолчанию редактируемый управляющий элемент имеет стили
                  ES_LEFT (выравнивание влево), ES_AUTOHSCROLL (автоматическая горизонтальная прокрутка) и WS_BORDER (видимое обрамление управляющего элемента). Многострочные элементы имеют дополнительно стили
                  ES_MULTILINE (многострочный), ES_AUTOSCROLL (автоматическая вертикальная прокрутка), WS_VSCROLL (вертикальная полоса прокрутки)
                  и WS_HSCROLL (горизонтальная полоса прокрутки).
                  С помощью функций-элементов TEdit вы можете передавать текст
                  между редактируемым управляющим элементом и буфером обмена Clipboard. Обычно пользователи могут обращаться к этим функциям через
                  выводимое в окне меню Edit. Редактируемые управляющие элементы
                  имеют встроенную реакцию на пункты этого меню, такие как Copy или
                  Undo.

                  Функция-элемент Команда меню Описание
                  Copy CM_EDITCOPY Копирование текста в
                  буфер Clipboard.
                  Cut CM_EDITCUT Вырезание текста включение его в буфер.
                  Undo CM_EDITUNDO Отмена последнего редактирования.
                  Paste CM_EDITPASTE Вставка текста из буфера.
                  DeleteSelection CM_EDITDELETE Удаление выделенного текста.
                  Clear CM_EDITCLEAR Очистка всего редактируемого элемента.

                  Чтобы добавить в окно меню редактирования, определите ресурс
                  меню. Писать новые функции-элементы не потребуется.
                  TEdit имеет ряд функций опроса. Это функции IsModified, GetText, GetLine, GetNumLines, GetLineLength, GetSelection, GetSubText, GetLineIndex, GetLineFromPos, GetRect, GetHandle, GetFirstVisibleLine, GetPasswordChar, GetWordBreakProc и CanUndo.
                  Текст, который занимает в редактируемом управляющем элементе
                  несколько строк, содержит дополнительные символы - возврат каретки и перевод строки. При возврате текста из такого управляющего
                  элемента функции элементы TEdit сохраняют это форматирование.
                  TEdit поддерживает операции изменения текста, а также позволяет прокручивать редактируемый управляющий элемент. Для этих
                  операций используются функции Clear, DeleteSelection, DeleteSubText, DeleteLine, Insert, Paste, SetText, SetSelection,
                  Scroll, ClearModify, Search, SetRect, SetRectNP, FormatLines,
                  SetTabStops, SetHandle, SetPasswordChar, SetReadObly, SetWordBreakProc и EmptyUndoBuffer.


                  Регистрация оконных классов


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


                  Регистрация сообщений


                  Окно Windows Messages имеет ряд команд для трассировки и
                  проверки получаемых программой оконных сообщений. С его помощью
                  вы можете устанавливать точки останова по сообщениям (выполнение
                  программы будет приостанавливаться при получении сообщения конкретным окном). Вы можете также регистрировать получаемые окном
                  сообщения. Данное окно открывается командой View Message и имеет
                  три области: область выбора окна, область класса сообщения и область регистрации.


                  Регистровые псевдопеременные Borland C++



                  _AH _CL _EAX (*) _ESP
                  _AL _CS _EBP (*) _FLAGS
                  _AX _CX _EBX (*) _FS
                  _BH _DH _ECX (*) _GS (*)
                  _BL _DI _EDI (*) _SI
                  _BP _DL _EDX (*) _SP
                  _BX _DS _ES _SS
                  _CH _DX _ESI (*)

                  (*) - для 32-разрядного компилятора эти псевдопеременные всегда
                  доступны. 16-разрядный компилятор может их использовать только
                  при указании параметра генерации инструкций 80386.


                  с плавающей точкой вы должны


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

                • В режиме эмуляции сопроцессора 80х87 циклический переход

                  в регистрах, а также ряд других особенностей 80х87 не

                  поддерживается.


                • Если вы смешиваете операции с плавающей точкой и встроенные коды на языке Ассемблера, то при использовании регистров следует должны принимать некоторые меры предосторожности. Это связано с тем, что набор регистров сопроцессора 80х87 перед вызовом функции в Borland C++ очищается. Вам может понадобиться извлечь из стека и сохранить

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



                • Регистры общего назначения



                  SP Указатель стека
                  BP Указатель базы
                  SI Индекс источника
                  DI Индекс приемника

                  Общие регистры чаще всего используются для работы с данными.
                  Каждый из них выполняет некоторые специальные функции, которые
                  доступны только ему, например, некоторые математические операции
                  могут использовать только регистр AX, регистр BX может служить
                  базовым регистром, CX применяется инструкцией LOOP и некоторыми
                  строковыми инструкциями, а DX используется некоторыми математическими операциями неявно. Однако во многих операциях можно использовать все эти регистры и заменять один из них на другой.
                  Сегментные регистры содержат начальный адрес каждого из 4
                  сегментов. Как описывается ниже, 16-разрядное значение в сегментном регистре для получения 20-разрядного адреса сегмента сдвигается влево на 4 (умножается на 16).
                  16-разрядный сегментный 16-разрядное
                  регистр смещение
                  V
                  умножение на 16
                  /сдвиг влево на 4/
                  V
                  Значение сегмента,
                  умноженное на 16,
                  равно 20-разрядно-
                  му значению
                  > + <
                  V
                  20-разрядное значение адреса памяти
                  Процессоры 80х86 имеют также некоторые специальные регистры:
                • Регистры SI и DI могут выполнять многие функции общих регистров, но могут также использоваться в качестве индексных регистров. Они используются и в регистровых переменных Borland С++.

                • Регистр SP указывает на текущую вершину стека и представляет смещение в сегменте стека.

                • Регистр BP - это вспомогательный указатель стека, применяемый для индексирования в стеке с целью извлечения аргументов или локальных динамических переменных.

                • Функции Borland С++ используют регистр базы (BP) в качестве
                  базового регистра для аргументов и переменных. Параметры имеют
                  положительные смещения от BP, зависящие от модели памяти. При наличии кадра стека BP указывает на сохраненное предыдущее значение BP. Если параметр Standard Stack Frame выключен (Off), то функции без аргументов не используют и не сохраняют BP.
                  16-разрядный регистр флагов содержит все необходимую информацию о состоянии процессора 80х86 и результатах последних инструкций.



                  только 80386 286/386 все процессоры 80х86

                  31 23 15 7 0

                  V R N IOP O D I T S Z A P C

                  Виртуальный режим 80х86

                  Возобновление

                  Вложенная задача

                  Уровень защиты ввода-вывода

                  Переполнение

                  Направление

                  Разрешение прерывания

                  Прерывание

                  Знак

                  Признак нуля

                  Вспомогательный перенос

                  Четность

                  Перенос

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

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

                  арифметических и логических операций.

                  Прочие флаги управляют режимом операций процессора 80х86.

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

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

                  как клавиатура или модем, временно приостанавливать текущий код

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

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

                  служит для отладки другого программного обеспечения (отладчики).

                  Регистр флагов не считывается и не модифицируется непосредственно. Вместо этого регистр флагов управляется в общем случае с помощью специальных инструкций (таких, как CLD, STI и CMC), а также с помощью арифметических и логических инструкций, модифицирующих отдельные флаги. И наоборот, содержимое отдельных разрядов регистра флагов влияет на выполнение инструкций (например, JZ, RCR и MOVSB). Регистр флагов не используется на самом деле,

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


                  Регистры общего назначения



                  Аккумулятор (математические операции) Базовый регистр (индексирование)
                  Счетчик (индексирование)
                  Регистр данных
                  AX AH AL
                  BX BH BL
                  CX CH CL
                  DX DH DL



                  Регуляторы и индикаторы


                  Регуляторы (slider) - это специализированные объекты прокрутки. Класс TSlider является производным от TScrollBar. Регуляторы используются для позиционирования информации без прокрутки.
                  TSlider имеет два производных класса - THSlider и TVSlider (вертикальная и горизонтальная версия).
                  Индикаторы - это управляющие элементы, которые выводят на
                  экран информацию о продолжительности или другую информацию о выполняющемся процессе. Индикаторы реализует класс TGauge, производный от TControl. Параметр конструктора определяет, хотите вы
                  получить вертикальный или горизонтальный индикатор (вертикальные
                  обычно используются для вывода аналоговой информации). Примеры
                  таких управляющих элементов вы можете найти в подкаталоге
                  EXAMPLES\OWL\OWLAPI\SLIDER.


                  Реквизиты и объекты окон реквизита


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


                  Родительские и дочерние интерфейсные элементы


                  В Windows-приложениях интерфейсные элементы (окна, блоки диалога и управляющие элементы) связаны между собой отношениями родитель-потомок. Два интерфейсных элемента являются связанными,
                  когда один из них является родительским окном, а другой дочерним.
                  Не путайте эти родительские взаимоотношения с наследованием или
                  владением экземпляров, которые являются отношениями между объектами. Дочернее окно не обязательно происходит из своего родительского окна или наследует его свойства.
                  Дочернее окно - это интерфейсный элемент, управляемый другим
                  интерфейсным элементом. Например, блоки списков управляются окном
                  или блоком диалога в котором они появляются. Они выводятся только
                  в случае вывода их родительских окон. И наоборот, блоки диалога
                  являются дочерними окнами, управляемыми порождающими их окнами.
                  При закрытии родительского окна, дочерние окна закрываются автоматически. Аналогично, при перемещении родительского окна, все
                  его дочерние окна перемещаются вместе с ним.
                  Все интерфейсные элементы (окна, блоки диалога и управляющие
                  элементы) могут выступать как родительские и как дочерние окна.


                  - S -

                  Считывание и запись базовых классов


                  В своем текущем программном коде вы можете считывать и записывать базовые классы непосредственно, например:
                  void Derived::write( opstream& out )
                  {
                  Base::write( out );
                  ...
                  }
                  void *Derived::read( ipstream& in )
                  {
                  Base::read( in );
                  ...
                  }
                  Этот метод продолжает работать, но не будет записывать в базовый класс никакого номера версии. Чтобы использовать все преимущества отслеживания версий, измените эти вызовы и используете
                  новые шаблоны функций, которые работают с версиями:
                  void Derived::Write( opstreams& out )
                  {
                  WriteBaseObject( (Base *)this, out );
                  ...
                  }
                  void *Derived::Read( ipstream& in, uint32 ver )
                  {
                  ReadBaseObject( (Base *)this, out );
                  ...
                  }
                  Важно привести указатель к базовому классу, иначе ваша программа может аварийно завершиться.


                  Сегментация для модели памяти compact


                  Сегментные регистры: Размер сегмента:
                  Младший ^ CS
                  адрес _TEXT класс 'CODE'
                  код до 64К
                  DS
                  _DATA класс 'DATA'
                  инициализированные данные
                  DGROUP до 64К
                  _BSS класс 'BSS'
                  не инициализирован.данные
                  SS Свободная
                  область
                  SP(TOS) памяти
                  ^
                  стек до 64К
                  Начало SP
                  динамически До конца
                  распределя- памяти
                  емая область v
                  Свободная
                  Старший область
                  адрес v памяти


                  Сегментация для модели памяти Huge


                  Несколько
                  sfile
                  sfile A
                  sfile B
                  CS sfile Z
                  Сегментные регистры: Размер сегмента:
                  Младший ^
                  адрес sfile_TEXT класс 'CODE' до 64К
                  код каждый
                  sfile
                  Несколько
                  sfile
                  sfile_DATA класс 'DATA' до 64К
                  sfile A инициализированные данные каждый
                  DS sfile B sfile
                  sfile Z
                  SS Свободная
                  область
                  SP(TOS) памяти
                  ^
                  стек До 64К
                  Начало SP
                  динамически До конца
                  распределя- памяти
                  емая область v
                  Свободная
                  Старший область
                  адрес v памяти
                  В следующей таблице сведены различные модели и их сравнение
                  друг с другом. Модели часто группируются по модели кода или данных на малые (64К) и большие (16М); эти группы соответственно отражены в столбцах и строках таблицы.
                  Модели tiny, small и compact относятся к малым моделям кода,
                  поскольку по умолчанию указатели кода являются ближними (near).
                  Аналогичным образом, модели compact, large huge относятся к большим моделями данных, поскольку по умолчанию указатели на данные
                  являются дальними (far).


                  Сегментация для модели памяти large


                  Несколько
                  sfile
                  sfile A
                  CS sfile B
                  sfile Z
                  Сегментные регистры: Размер сегмента:
                  Младший ^
                  адрес _TEXT класс 'CODE' до 64К
                  sfile код каждый
                  DS sfile
                  _DATA класс 'DATA'
                  инициализирован. данные
                  DGROUP до 64К
                  _BSS класс 'BSS'
                  не инициализирован.данные
                  SS Свободная
                  область
                  SP(TOS) памяти
                  ^
                  стек до 64К
                  Начало SP
                  динамически До конца
                  распределя- памяти
                  емая область v
                  Свободная
                  Старший область
                  адрес v памяти
                  CS и DS указывают одновременно только на один sfile.


                  Сегментация для модели памяти medium


                  Сегментные регистры: Размер сегмента:
                  Младший ^
                  адрес _TEXT класс 'CODE' до 64К
                  sfile код каждый
                  DS,SS sfile
                  _DATA класс 'DATA'
                  Несколько инициализирован. данные
                  sfile
                  _BSS класс 'BSS'
                  CS sfile A не инициализирован.данные до 64К
                  sfile B
                  динамически распределяе-
                  sfile Z мая область памяти
                  v
                  DGROUP Свободная
                  область
                  SP(TOS) памяти
                  ^
                  стек
                  Начало SP
                  дальняя
                  динамически До конца
                  распределя- памяти
                  емая область v
                  Свободная
                  Старший область
                  адрес v памяти
                  CS указывает одновременно только на один sfile.


                  Сегментация для модели памяти small


                  Сегментные регистры: Размер сегмента:
                  Младший ^ CS
                  адрес _TEXT класс 'CODE'
                  код до 64К
                  DS,SS
                  _DATA класс 'DATA'
                  инициализированные данные
                  _BSS класс 'BSS'
                  DGROUP не инициализирован.данные до 64К
                  динамически
                  распределя-
                  емая об-
                  ласть памя-
                  ти v
                  Свободная
                  область
                  SP(TOS) - памяти
                  ^
                  стек
                  Начало SP
                  дальняя
                  динамически До конца
                  распределя- памяти
                  емая область v
                  Свободная
                  Старший область
                  адрес v памяти


                  Сегментация для модели памяти tiny


                  Сегментные регистры: Размер сегмента:
                  Младший ^ CS,DS,SS
                  адрес _TEXT класс 'CODE'
                  код
                  _DATA класс 'DATA'
                  инициализированные данные
                  _BSS класс 'BSS'
                  DGROUP не инициализирован.данные до 64К
                  динамически
                  распределя-
                  емая область v
                  Свободная
                  область
                  SP(TOS) памяти
                  ^
                  Старший стек
                  адрес v Начало SP


                  Сегментация памяти


                  Память микропроцессора Intel 80x86 имеет сегментированную
                  архитектуру. Непосредственно можно адресоваться к 64К памяти сегменту. Процессор 80x86 отслеживает 4 различных сегмента: сегмент кода, сегмент данных, сегмент стека и дополнительный сегмент. В сегменте кода находятся машинные инструкции, а в дополнительном сегменте - дополнительные данные. Процессор 80x86 имеет 4
                  16-разрядных сегмента (по одному на сегмент) - CS, DS, SS и ES,
                  которые указывают на сегмент кода, данных, стека и дополнительный
                  сегмент соответственно. Сегмент может находиться в любом месте
                  памяти, но начинаться должен по адресу, кратному 10. Сегменты могут перекрываться. Например, все четыре сегмента могут начинаться
                  с одного адреса.
                  Стандартная запись адреса имеет форму "сегмент:смещение",
                  например, 2F84:0546. Начальный адрес сегмента всегда представляет
                  собой 20-битовое число, но так как сегментный регистр содержит
                  только 16 бит, нижние 4 бита полагаются равными 0. Это значит,
                  что сегменты могут начинаться только с тех адресов, у которых
                  последние 4 бита равны 0.


                  Сегментные адресные регистры



                  CS Сегментный регистр кода
                  DS Сегментный регистр данных
                  SS Указатель сегмента стека
                  ES Дополнительный регистр сегмента



                  Секция системной информации


                  В разделе системной информации файла регистрации показывается режим и версия Windows, под которой выполняется ваша программа. Показывается также следующее:
                • информация процессора:

                • наибольший свободный блок памяти;

                • общее пространство линейной памяти;

                • свободное пространство линейной памяти;

                • страницы свопинга файлов.



                • Шаблон TArrayAsVector (arrays.h)


                  Реализует массив объектов типа T, используя в качестве основы реализации вектор. Для управления памятью используется TStandardAllocator.


                  Шаблон TArrayAsVectorIterator (arrays.h)


                  Реализует объект итератора для перебора объектов TArrayAsVector. Элементы см. в TMArrayAsVectorIterator.


                  Шаблон TBagAsVector (bags.h)


                  Реализует множество объектов типа T, используя в качестве
                  основы реализации вектор. Для управления памятью используется
                  TStandardAllocator. Элементы описываются в TMBagAsVector.


                  Шаблон TBinarySearchTreeImp (binimp.h)


                  Реализует несбалансированное двоичное дерево. Класс T должен
                  иметь операции < и == и заданный по умолчанию конструктор.


                  Шаблон TBinarySearchTreeIteratorImp (binimp.h)


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


                  Шаблон TCVectorImp (vectimp.h)


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


                  Шаблон TCVectorIteratorImp (vectimp.h)


                  Реализует итератор вектора, работающий с непосредственным
                  счетным вектором объектов типа T. Функции-элементы см. в TMCVectorIteratorImp.


                  Шаблон TDDAssociation (assoc.h)


                  Реализует управляемую ассоциацию, связывая косвенный ключ K
                  с косвенным значением L. Предполагается, что K имеет функцию-элемент HashValue, или что существует глобальная функция со следующим прототипом:
                  unsigned HashValue( K & );
                  K должно также иметь допустимую операцию ==. Класс A представляет администратор хранения, заданный пользователем.


                  Шаблон TDDAssociation (assoc.h)


                  Стандартная ассоциация (непосредственный ключ, непосредственное значение). Реализует ассоциацию, связывая непосредственный ключ K с непосредственным (прямым) значением L. Предполагается, что K имеет функцию-элемент HashValue, или что существует
                  глобальная функция со следующим прототипом:
                  unsigned HashValue( K & );
                  K должно также иметь допустимую операцию ==. Элементы см. в
                  TMDDAssociation.


                  Шаблон TDequeAsDoubleList (deques.h)


                  Реализует управляемую двунаправленную очередь косвенных объектов T, используя в качестве основы реализации двусвязанный список, а в качестве администратора памяти - TStandardAllocator.
                  Элементы см. в TMDequeAsDoubleList.


                  Шаблон TDequeAsDoubleListIterator (deques.h)


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


                  Шаблон TDequeAsDoubleListIterator (deques.h)


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


                  Шаблон TDequeAsVector (deques.h)


                  Реализует управляемую двунаправленную очередь объектов T,
                  используя в качестве основы реализации вектор. Для управления
                  памятью используется TStandardAllocator. Элементы см. в TMDequeAsVector.


                  Шаблон TDequeAsVectorIterator (deques.h)


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


                  Шаблон TDIAssociation (assoc.h)


                  Реализует ассоциацию, связывая непосредственный ключ K с непосредственным (прямым) значением L. Предполагается, что K имеет
                  функцию-элемент HashValue, или что существует глобальная функция
                  со следующим прототипом:
                  unsigned HashValue( K & );
                  K должно также иметь допустимую операцию ==. Элементы см. в
                  TMDIAssociation.


                  Шаблон TDictionary (dict.h)


                  Упрощенное имя для TIDictionaryAsHashTable. Функции-элементы
                  см. в TIDictionaryAsHashTable.


                  Шаблон TDictionaryAsHashTable (dict.h)


                  Используя в качестве основы хеш-таблицу и стандартное средство распределения TStandardAllocator, реализует словарь объектов T. Подразумевается, что T - это один из четырех ассоциативных типов, который имеет используемый по умолчанию конструктор и операцию ==. Функции-элементы см. в TMDictionaryAsHashTable.


                  Шаблон TDictionaryAsHashTableIterator (dict.h)


                  Реализует итератор, который выполняет перебор по объектам
                  TDictionaryAsHashTable, используя стандартное средство распределения памяти TStandardAllocator.


                  Шаблон TDictionaryIterator (dict.h)


                  Упрощенное имя для TDictionaryAsHashTableIterator. Функции-элементы см. в TDictionaryAsHashTableIterator.


                  Шаблон TDoubleListImp (dlistimp.h)


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


                  Шаблон TDoubleListIteratorImp (dlistimp.h)


                  Реализует итератор двусвязанного списка. Этот итератор работает с непосредственными двунаправленными списками. Функции-элементы см. в TMDoubleListIteratorImp.


                  Шаблон THashTableImp (hashimp.h)


                  Используя заданный распределитель памяти TStandardAllocator,
                  реализует управляемую хеш-таблицу объектов типа T. Предполагается, что T имеет операцию копирования и заданный по умолчанию конструктор.


                  Шаблон THashTableIteratorImp (hashimp.h)


                  Реализует итератор для перебора контейнеров THashTableImp.
                  Функции-элементы см. в TMHashTableIteratorImp.


                  Шаблон TIArrayAsVector (arrays.h)


                  Реализует косвенный массив объектов типа T, используя в качестве основы реализации вектор. Для управления памятью используется TStandardAllocator. Элементы см. в TMIArrayAsVector.


                  Шаблон TIArrayAsVectorItetator (arrays.h)


                  Реализует объект итератора для перебора объектов TIArrayAsVector. Для управления памятью использует TSrandarsAllocator.
                  Элементы и операции см. в TMIArrayAsVectorIterator.


                  Шаблон TIBagAsVector (bags.h)


                  Реализует множество объектов типа T, используя в качестве
                  основы реализации вектор. Для управления памятью используется
                  TStandardAllocator. Элементы описываются в TMIBagAsVector.


                  Шаблон TIBagAsVectorIterator (bags.h)


                  Реализует итератор объекта для перебора объектов TIBagAsVector. Для управления памятью используется TStandardAllocator. Элементы описываются в TMBagAsVector. Элементы описываются в TMArrayAsVectorIterator.


                  Шаблон TIBinarySearchTreeImp (binimp.h)


                  Реализует косвенное несбалансированное двоичное дерево.
                  Класс T должен иметь операции < и == и заданный по умолчанию
                  конструктор.


                  Шаблон TIBinarySearchTreeIteratorImp (binimp.h)


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


                  Шаблон TICVectorImp (vectimp.h)


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


                  Шаблон TICVectorIteratorImp (vectimp.h)


                  Реализует итератор вектора, работающий с косвенным счетным
                  вектором объектов типа T. Функции-элементы см. в TMIVectorIteratorImp.


                  Шаблон TIDAssociation (assoc.h)


                  Реализует ассоциацию, связывая косвенный ключ K с косвенным
                  значением L. Предполагается, что K имеет функцию-элемент HashValue, или что существует глобальная функция со следующим прототипом:
                  unsigned HashValue( K & );
                  K должно также иметь допустимую операцию ==. Элементы см. в
                  TMDIAssociation.

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



                  Шаблон TIDequeAsDoubleList (deques.h)


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


                  Шаблон TIDequeAsVector (deques.h)


                  Реализует двунаправленную очередь косвенных объектов T, используя в качестве основы реализации вектор. Элементы см. в TMIDequeAsVector.


                  Шаблон TIDictionaryAsHashTable (dict.h)


                  Используя в качестве основы хеш-таблицу и стандартное распределение TStandardAllocator, реализует косвенный словарь. Подразумевается, что T - это один из четырех ассоциативных типов.
                  Функции-элементы см. в TMIDictionaryAsHashTable.


                  Шаблон TIDictionaryAsHashTableIterator (dict.h)


                  Реализует итератор, который выполняет перебор по объектам
                  TIDictionaryAsHashTable, используя заданное пользователем средство распределения памяти. Функции-элементы см. в TMIDictionaryAsHashTable.


                  Шаблон TIDoubleListImp (dlistimp.h)


                  Реализует двусвязанный список указателей на объекты типа T,
                  используя для управления памятью TStandardAllocator. Обрабатывает
                  любые типы объектов.


                  Шаблон TIDoubleListIteratorImp (dlistimp.h)


                  Реализует итератор двусвязанного списка. Этот итератор работает с любыми косвенными двунаправленными списками. Функции-элементы см. в TMIDoubleListIteratorImp.


                  Шаблон TIHashTableImp (hashimp.h)


                  Используя стандартные распределитель памяти TStandardAllocator, реализует хеш-таблицу указателей на объекты типа T. Функции-элементы см. в TMIHashTableImp.


                  Шаблон TIHashTableIteratorImp (hashimp.h)


                  Используя системный распределитель памяти TStandardAllocator, реализует итератор объектов для перебора контейнеров TIHashTableImp. Функции-элементы см. TMIHashTableIteratorImp.


                  Шаблон TIIAssociation (assoc.h)


                  Реализует управляемую ассоциацию, связывая косвенный ключ K
                  с косвенным значением L. Предполагается, что K имеет функцию-элемент HashValue, или что существует глобальная функция со следующим прототипом:
                  unsigned HashValue( K & );
                  K должно также иметь допустимую операцию ==. Элементы см. в
                  TMIIAssociation.


                  Шаблон TIListImp (listimp.h)


                  Реализует список указателей на объекты типа T. Так как указатели всегда имеют операцию копирования, этот класс может обрабатывать любой тип объектов. Функции-элементы см. в TMListImp.


                  Шаблон TIListIteratorImp (listimp.h)


                  Реализует итератор списка, работающий с любым косвенным управляемым списком. Функции-элементы см. в TMListIteratorImp.


                  Шаблон TIQueueAsDoubleList (queues.h)


                  Реализует косвенную очередь объектов типа T, используя в качестве основы реализации двусвязанный список. Функции-элементы см. в TMIDequeueDoubleList.


                  Шаблон TIQueueAsVector (queues.h)


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


                  Шаблон TIQueueAsVectorIterator (queues.h)


                  Реализует итератор для косвенных очередей, построенных на
                  основе списка. Функции-элементы см. в TMDequeueAsVectorIterator.


                  Шаблон TISArrayAsVector (arrays.h)


                  Реализует косвенный отсортированный массив объектов типа T,
                  используя в качестве основы реализации вектор. Функции-элементы
                  см. в TMIArrayAsVector.


                  Шаблон TISArrayAsVectorItetator (arrays.h)


                  Реализует объект итератора для перебора объектов TISArrayAsVector. Элементы и операции см. в TMArrayAsVectorIterator.


                  Шаблон TISDoubleListImp (dlistimp.h)


                  Реализует отсортированный двусвязанный список указателей на
                  объекты типа T, используя для управления памятью TStandardAllocator. Обрабатывает любые типы объектов. Наследует функции-элементы
                  TMIDoubleListImp.


                  Шаблон TISDoubleListIteratorImp (dlistimp.h)


                  Реализует итератор двусвязанного списка. Этот итератор работает с любыми косвенными отсортированными двунаправленными списками. Функции-элементы см. в TMIDoubleListIteratorImp.


                  Шаблон TISetAsVector (sets.h)


                  Реализует очередь указателей на объекты типа T, используя в
                  качестве основы реализации вектор. Для управления памятью используется TStandsardAllocator. См. также функции-элементы в TMIBagAsVector.


                  Шаблон TISetAsVectorIterator (sets.h)


                  Реализует итератор для перебора объектов TISetAsVector.
                  Функции-элементы см. в TMIArrayAsVectorIterator.


                  Шаблон TISListImp (listimp.h)


                  Реализует отсортированный список указателей на объекты типа
                  T. Так как указатели всегда имеют операцию копирования, этот
                  класс может обрабатывать любой тип объектов. Функции-элементы см.
                  в TMISListImp.


                  Шаблон TIStackAsList (stacks.h)


                  Реализует управляемый стек указателей на объекты типа T, используя в качестве основы реализации список. Функции-элементы см.
                  в TMIStackAsVector.


                  Шаблон TIStackAsListIterator (stacks.h)


                  Реализует итератор для управляемых стеков, построенных на
                  основе вектора. Функции-элементы см. в TMIVectorIteratorImp.


                  Шаблон TIStackAsVector (stacks.h)


                  Реализует косвенный стек указателей на объекты типа T, используя в качестве основы реализации вектор. Функции-элементы см.
                  в TMIVectorIteratorImp.


                  Шаблон TIStackAsVectorIterator (stacks.h)


                  Реализует итератор для косвенных стеков, построенных на основе вектора. Функции-элементы см. в TMVectorIteratorImp.


                  Шаблон TISVectorImp (vectimp.h)


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


                  Шаблон TISVectorIteratorImp (vectimp.h)


                  Реализует итератор вектора, работающий с косвенным управляемым и отсортированным вектором объектов типа T. Функции-элементы
                  см. в TMIVectorIteratorImp.


                  Шаблон TIVectorImp (vectimp.h)


                  Реализует вектор указателей на объекты типа T. Указатели
                  всегда имеют операцию копирования, поэтому данный класс может работать с любым типом объектов. Функции-элементы могут работать с
                  TMIVectorImp.


                  Шаблон TIVectorIteratorImp (vectimp.h)


                  Реализует итератор вектора, работающий с косвенным управляемым вектором объектов типа T. Функции-элементы см. в TMIVectorIteratorImp.


                  Шаблон TListIteratorImp (listimp.h)


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


                  Шаблон TMArrayAsVectorIterator (arrays.h)


                  Реализует объект итератора для перебора объектов TMArrayAsVector.


                  Шаблон TMArrayVector (arrays.h)


                  Реализует управляемый массив объектов типа T, использующий в
                  качестве основы вектор. Для типа T требуется операция ==.


                  Шаблон TMBagAsVector (bags.h)


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


                  Шаблон TMBagAsVectorIterator (bags.h)


                  Реализует итератор объекта для перебора объектов TBagAsVector. Для управления памятью используется TStandardAllocator. Элементы описываются в TMArrayAsVectorIterator.


                  Шаблон TMBagAsVectorIterator (bags.h)


                  Реализует итератор объекта для перебора объектов TMBagAsVector. Элементы см. в TMArrayAsVectorIterator.


                  Шаблон TMCVectorImp (vectimp.h)


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


                  Шаблон TMCVectorIteratorImp (vectimp.h)


                  Реализует итератор вектора, работающий с непосредственным
                  управляемым и счетным вектором объектов типа T. Функции-элементы
                  см. в TMVectorIteratorImp.


                  Шаблон TMDAssociation (assoc.h)


                  Реализует управляемую ассоциацию, связывая непосредственный
                  ключ K с непосредственным (прямым) значением L. Предполагается,
                  что K имеет функцию-элемент HashValue, или что существует глобальная функция со следующим прототипом:
                  unsigned HashValue( K & );
                  K должно также иметь допустимую операцию ==. Класс A представляет администратор хранения, заданный пользователем.


                  Шаблон TMDequeAsDoubleList (deques.h)


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


                  Шаблон TMDequeAsDoubleListIterator (deques.h)


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


                  Шаблон TMDequeAsVector (deques.h)


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


                  Шаблон TMDequeAsVectorIterator (deques.h)


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


                  Шаблон TMDictionaryAsHashTable (dict.h)


                  Используя в качестве основы хеш-таблицу и заданное пользователем распределение A реализует управляемый словарь. Подразумевается, что T - это один из четырех ассоциативных типов, который имеет используемый по умолчанию конструктор и операцию ==.


                  Шаблон TMDictionaryAsHashTableIterator (dict.h)


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


                  Шаблон TMDoubleListElement (dlistimp.h)


                  Определяет узлы для двусвязанного списка TMDoubleListImp и TMIDoubleListImp.


                  Шаблон TMDoubleListImp (dlistimp.h)


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


                  Шаблон TMDoubleListIteratorImp (dlistimp.h)


                  Реализует итератор двусвязанного списка объектов. Этот итератор работает с непосредственными двунаправленными списками. Для косвенных списков см. TMIDoubleListIteratorImp.


                  Шаблон TMIArrayAsVector (arrays.h)


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


                  Шаблон TMIArrayAsVectorIterator (arrays.h)


                  Реализует объект итератора для перебора объектов TMIArrayAsVector. Базируется на TMVectorIteratorImp.


                  Шаблон TMIBagAsVector (bags.h)


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


                  Шаблон TMIBagAsVectorIterator (bags.h)


                  Реализует итератор объекта для перебора объектов TMIBagAsVector. Элементы описываются в TMArrayAsVectorIterator.


                  Шаблон TMICVectorImp (vectimp.h)


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


                  Шаблон TMICVectorIteratorImp (vectimp.h)


                  Реализует итератор вектора, работающий с косвенным управляемым и счетным вектором объектов типа T. Функции-элементы см. в
                  TMIVectorIteratorImp.


                  Шаблон TMIDAssociation (assoc.h)


                  Реализует управляемую ассоциацию, связывая косвенный ключ K
                  с косвенным значением L. Предполагается, что K имеет функцию-элемент HashValue, или что существует глобальная функция со следующим прототипом:
                  unsigned HashValue( K & );
                  K должно также иметь допустимую операцию ==. Класс A представляет администратор хранения, заданный пользователем.


                  Шаблон TMIDequeAsDoubleList (deques.h)


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


                  Шаблон TMIDequeAsDoubleListIterator (deques.h)


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


                  Шаблон TMIDequeAsVector (deques.h)


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


                  Шаблон TMIDequeAsVectorIterator (deques.h)


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


                  Шаблон TMIDictionaryAsHashTable (dict.h)


                  Используя в качестве основы хеш-таблицу и заданное пользователем распределение A реализует управляемый косвенный словарь.
                  Подразумевается, что T - это один из четырех ассоциативных типов.


                  Шаблон TMIDictionaryAsHashTableIterator (dict.h)


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


                  Шаблон TMIDoubleListImp (dlistimp.h)


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


                  Шаблон TMIDoubleListIteratorImp (dlistimp.h)


                  Реализует итератор двусвязанного списка. Этот итератор работает с любыми непосредственными двунаправленными списками. Функции-элементы см. в TMDoubleListIteratorImp.


                  Шаблон TMIHashTableImp (hashimp.h)


                  Используя заданный пользователем распределитель памяти Alloc, реализует управляемую хеш-таблицу объектов типа T. Предполагается, что T имеет операцию ==, операцию копирования и заданный по умолчанию конструктор.


                  Шаблон TMIHashTableIteratorImp (hashimp.h)


                  Реализует итератор для перебора контейнеров TMIHashTableImp.


                  Шаблон TMIIAssociation (assoc.h)


                  Реализует управляемую ассоциацию, связывая косвенный ключ K
                  с косвенным значением L. Предполагается, что K имеет функцию-элемент HashValue, или что существует глобальная функция со следующим прототипом:
                  unsigned HashValue( K & );
                  K должно также иметь допустимую операцию ==. Класс A представляет администратор хранения, заданный пользователем.


                  Шаблон TMIListImp (listimp.h)


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


                  Шаблон TMiListIteratorImp (listimp.h)


                  Реализует итератор списка, работающий с любым косвенным управляемым списком. Функции-элементы см. в TMListIteratorImp.


                  Шаблон TMIQueueAsDoubleList (queues.h)


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


                  Шаблон TMIQueueAsDoubleListIterator (queues.h)


                  Реализует итератор для косвенных очередей, построенных на
                  основе списка. Функции-элементы см. в TMIDequeueAsVectorIterator.


                  Шаблон TMIQueueAsVector (queues.h)


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


                  Шаблон TMIQueueAsVectorIterator (queues.h)


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


                  Шаблон TMISArrayAsVector (arrays.h)


                  Реализует управляемый косвенный отсортированный массив объектов типа T, используя в качестве основы реализации вектор.
                  Функции-элементы см. в TMIArrayAsVector.


                  Шаблон TMISDoubleListImp (dlistimp.h)


                  Реализует управляемый отсортированный двусвязанный список
                  указателей на объекты типа T. Обрабатывает любые типы объектов.
                  Наследует функции-элементы TMIDoubleListImp.


                  Шаблон TMISDoubleListIteratorImp (dlistimp.h)


                  Реализует итератор двусвязанного списка. Этот итератор работает с любыми косвенными отсортированными двунаправленными списками. Функции-элементы см. в TMIDoubleListIteratorImp.


                  Шаблон TMISetAsVector (sets.h)


                  Реализует управляемую очередь указателей на объекты типа T,
                  используя в качестве основы реализации вектор. Для управления памятью используется TStandsardAllocator. См. также функции-элементы в TMIBagAsVector.


                  Шаблон TMISetAsVectorIterator (sets.h)


                  Реализует итератор для перебора объектов TMISetAsVector.
                  Функции-элементы см. в TMIArrayAsVectorIterator.


                  Шаблон TMISListImp (listimp.h)


                  Реализует управляемый отсортированный список указателей на
                  объекты типа T. Так как указатели всегда имеют операцию копирования, этот класс может обрабатывать любой тип объектов. Функции-элементы см. в TMIListImp.


                  Шаблон TMISListIteratorImp (listimp.h)


                  Реализует итератор списка, работающий с любым косвенным
                  списком. Функции-элементы см. в TMIListIteratorImp.


                  Шаблон TMISListIteratorImp (listimp.h)


                  Реализует итератор списка, работающий с любым управляемым
                  косвенным списком. Функции-элементы см. в TMListIteratorImp.


                  Шаблон TMIStackAsList (stacks.h)


                  Реализует управляемый стек указателей на объекты типа T, используя в качестве основы реализации список. Функции-элементы см.
                  в TMIStackAsVector.


                  Шаблон TMIStackAsListIterator (stacks.h)


                  Реализует итератор для управляемых стеков, построенных на
                  основе вектора. Функции-элементы см. в TMIListIteratorImp.


                  Шаблон TMIStackAsVector (stacks.h)


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


                  Шаблон TMIStackAsVectorIterator (stacks.h)


                  Реализует итератор для управляемых косвенных стеков, построенных на основе вектора. Функции-элементы см. в TMVectorIteratorImp.


                  Шаблон TMISVectorImp (vectimp.h)


                  Реализует управляемый отсортированный вектор указателей на
                  объекты типа T. Предполагается, что указатели всегда имеют операцию копирования, поэтому данный класс может работать с любым типом объектов. Функции-элементы см. в TMICVectorIteratorImp.


                  Шаблон TMISVectorIteratorImp (vectimp.h)


                  Реализует итератор вектора, работающий с косвенным управляемым и отсортированным вектором объектов типа T. Функции-элементы
                  см. в TMIVectorIteratorImp.


                  Шаблон TMIVectorImp (vectimp.h)


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


                  Шаблон TMIVectorIteratorImp (vectimp.h)


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


                  Шаблон TMListElement (listimp.h)


                  Определяет узлы TMListImp, TMIListImp и родственных классов.


                  Шаблон TMListImp (listimp.h)


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


                  Шаблон TMListImp (listimp.h)


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


                  Шаблон TMListIteratorImp (listimp.h)


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


                  Шаблон TMQueueAsDoubleList (queues.h)


                  Реализует управляемую очередь объектов типа T, используя в
                  качестве основы реализации двусвязанный список. Функции-элементы
                  см. в TMDequeueAsDoubleList.


                  Шаблон TMQueueAsDoubleListIterator (queues.h)


                  Реализует итератор для очередей, построенных на основе списка. Функции-элементы см. в TMDequeueAsVectorIterator.


                  Шаблон TMQueueAsVector (queues.h)


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


                  Шаблон TMQueueAsVectorIterator (queues.h)


                  Реализует итератор для управляемых очередей, построенных на
                  основе списка. Функции-элементы см. в TMDequeueAsVectorIterator.


                  Шаблон TMSArrayAsVector (arrays.h)


                  Реализует отсортированный массив объектов типа T, используя
                  в качестве основы реализации вектор. За исключением AddAt все
                  функции-элементы наследуются из TMArrayAsVector.


                  Шаблон TMSArrayAsVectorItetator (arrays.h)


                  Реализует объект итератора для перебора объектов TMSArrayAsVector. Элементы и операции см. в TMArrayAsVectorIterator.


                  Шаблон TMSDoubleListImp (dlistimp.h)


                  Реализует управляемый двусвязанный список объектов типа T.
                  Предполагается, что T имеет операцию ==, операцию < и заданный по
                  умолчанию конструктор. Функции-элементы см. в TMDoubleListIteratorImp.


                  Шаблон TMSDoubleListIteratorImp (dlistimp.h)


                  Реализует итератор двусвязанного списка. Этот итератор работает с непосредственными двунаправленными списками. Функции-элементы см. в TMDoubleListIteratorImp.


                  Шаблон TMSetAsVector (sets.h)


                  Реализует управляемую очередь объектов типа T, используя в
                  качестве основы реализации вектор. В отличие от мультимножества,
                  множество не может содержать дублируемых элементов. Кроме перечисленных ниже функций-элементов, TMSetAsVector наследует функции-элементы из TMBagAsVector. См. также функции-элементы в TMBagAsVector.


                  Шаблон TMSetAsVectorIterator (sets.h)


                  Реализует итератор для перебора объектов TMSetAsVector.
                  Функции-элементы см. в TMArrayAsVectorIterator.


                  Шаблон TMSListImp (listimp.h)


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


                  Шаблон TMSListIteratorImp (listimp.h)


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


                  Шаблон TMStackAsList (stacks.h)


                  Реализует управляемый стек объектов типа T, используя в качестве основы реализации список. Функции-элементы см. в TMStackAsVector.


                  Шаблон TMStackAsListIterator (stacks.h)


                  Реализует итератор для управляемых стеков, построенных на
                  основе вектора. Функции-элементы см. в TMListIteratorImp.


                  Шаблон TMStackAsVectorIterator (stacks.h)


                  Реализует итератор для управляемых стеков, построенных на
                  основе вектора. Функции-элементы см. в TMVectorIteratorImp.


                  Шаблон TMSVectorImp (vectimp.h)


                  Реализует управляемый отсортированный вектор объектов типа
                  T. Предполагается, что T имеет операцию копирования и используемый по умолчанию конструктор. Функции-элементы см. в TMCVectorImp.


                  Шаблон TMSVectorIteratorImp (vectimp.h)


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


                  Шаблон TMVectorImp (vectimp.h)


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


                  Шаблон TMVectorIteratorImp (vectimp.h)


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


                  Шаблон TQueueAsDoubleList (queues.h)


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


                  Шаблон TQueueAsDoubleListIterator (queues.h)


                  Реализует итератор для очередей, построенных на основе списка. Функции-элементы см. в TMDequeueAsDoubleListIterator.


                  Шаблон TQueueAsVectorIterator (queues.h)


                  Реализует итератор для очередей, построенных на основе списка. Функции-элементы см. в TMDequeueAsVectorIterator.


                  Шаблон TSArrayAsVector (arrays.h)


                  Реализует отсортированный массив объектов типа T, используя
                  в качестве основы реализации вектор. За исключением AddAt все
                  функции-элементы наследуются из TMArrayAsVector.


                  Шаблон TSArrayAsVectorItetator (arrays.h)


                  Реализует объект итератора для перебора объектов TSArrayAsVector. Элементы и операции см. в TMArrayAsVectorIterator.


                  Шаблон TSDoubleListImp (dlistimp.h)


                  Реализует отсортированный двусвязанный список объектов типа
                  T. Предполагается, что T имеет операцию ==, операцию < и заданный
                  по умолчанию конструктор. Функции-элементы см. в TMSDoubleListIteratorImp.


                  Шаблон TSDoubleListIteratorImp (dlistimp.h)


                  Реализует итератор двусвязанного списка. Этот итератор работает с любыми непосредственными двунаправленными списками. Функции-элементы см. в TMDoubleListIteratorImp.


                  Шаблон TSetAsVector (sets.h)


                  Реализует множества объектов типа T, используя в качестве
                  основы реализации вектор. Для управления памятью используется
                  TStandsardAllocator. См. также функции-элементы в TMBagAsVector.


                  Шаблон TSetAsVectorIterator (sets.h)


                  Реализует итератор для перебора объектов TSetAsVector. Функции-элементы см. в TMArrayAsVectorIterator.


                  Шаблон TSListImp (listimp.h)


                  Используя для распределения памяти TStandardAllocator, реализует отсортированный список объектов типа T. Предполагается,
                  что T имеет операцию копирования, операцию < и заданный по умолчанию конструктор. Функции-элементы см. в TMListImp.


                  Шаблон TSListIteratorImp (listimp.h)


                  Реализует итератор списка, работающий с непосредственным от-
                  сортированным списком. Функции-элементы см. в TMListIteratorImp.


                  Шаблон TStackAsList (stacks.h)


                  Реализует управляемый стек объектов типа T, используя в качестве основы реализации список. Функции-элементы см. в TMStackAsVector.


                  Шаблон TStackAsListIterator (stacks.h)


                  Реализует итератор для управляемых стеков, построенных на
                  основе вектора. Функции-элементы см. в TMVectorIteratorImp.


                  Шаблон TStackAsVector (stacks.h)


                  Реализует стек объектов типа T, используя в качестве основы
                  реализации вектор, а для управления памятью - TStandardAllocator.


                  Шаблон TStackAsVector (stacks.h)


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


                  Шаблон TStackAsVectorIterator (stacks.h)


                  Реализует итератор для стеков, построенных на основе вектора. Функции-элементы см. в TMVectorIteratorImp.


                  Шаблон TSVectorImp (vectimp.h)


                  Реализует отсортированный вектор объектов типа T. Предполагается, что T имеет операцию копирования и используемый по умолчанию конструктор. Функции-элементы см. в TMCVectorImp.


                  Шаблон TSVectorIteratorImp (vectimp.h)


                  Реализует итератор вектора, работающий с непосредственным
                  отсортированным вектором объектов типа T. Функции-элементы см. в
                  TMVectorIteratorImp.


                  Шаблон TVectorImp (vectimp.h)


                  Реализует управляемый вектор объектов типа T. TVectorImp
                  предполагает, что T имеет операцию копирования и используемый по
                  умолчанию конструктор. Функции-элементы см. в TMVectorImp.


                  Шаблон TVectorIteratorImp (vectimp.h)


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


                  Шаблоны документов


                  Шаблоны документа объединяют вместе классы документа и классы отображаемого элемента, создавая новый класс. Администратор
                  документа поддерживает список шаблонов документа, который используется при создании нового экземпляра Doc/View. Ниже поясняется,
                  как создавать и использовать шаблоны документов.


                  Си с классами


                  C++ - это Си с классами. Borland C++ - это версия фирмы Borland
                  языка С++, разработанного Брайоном Страуструпом из фирмы AT&T, как
                  расширение языка Си.
                  В целом язык С++ является надмножеством языка Си. Это означает,
                  что программы Си можно компилировать в среде С++, однако компилировать программы С++ в среде Си, при наличии в них каких-либо специфических для С++ конструкций, нельзя. Некоторые ошибочные ситуации возникают из-за различий этих двух родственных языков. Так, одна и та же
                  функция, дважды объявленная в Си с различными значениями аргументов,
                  вызовет ошибку повторения имен. Однако, в С++ допустимо это или нет,
                  зависит от других обстоятельств.
                  Главная возможность C++ - это классы, которые позволяют "упрятывать" функции и данные в отдельные конструкции. Отдельные конструкции называются объектами, а программирование с использованием объектов называют объектно-ориентированным программированием (ООП).
                  Почему бы не рассмотреть каков Турбо и Borland С++ немедленно?

                  Вот наша первая программа:
                  #include
                  main()
                  {
                  int i, j;
                  i = 25; j = 17;
                  printf("Итого: %d\n", i+j);
                  return 0;
                  }
                  Сюрприз! В этой программе вы не увидели никаких отличий от программирования на Си. Чудесно! Это вселяет оптимизм, так как программы,
                  написанные на языке Си, можно компилировать в Турбо и Borland C++.
                  Зато Borland C++ имеет многочисленные расширения.
                  Указание комментариев
                  v
                  #include // Новая библиотека потоков
                  // ввода-вывода
                  class sber_bank { // Новый способ создавать структуры
                  int memory_bank; // с данными и функциями.
                  public:
                  void add(int a, int b) { // Встроенная функция
                  memory_bank = a + b; // Сохранение данных в объекте
                  cout << "Итог: "; // Новый способ ввода-вывода
                  cout << memory_bank;
                  }; ^
                  }; Операция вывода потока
                  main()
                  {
                  sber_bank deep_thought; // Создание объекта и
                  deep_thought.add(25, 17); // обращение к нему
                  }
                  В общем случае семантика С++ намного более сложная по сравнению
                  с Си, однако, это ведет к большей надежности и заставляет программистов быть более "дисциплинированными".


                  Символические цели


                  Символическая цель вынуждает MAKE строить в формирующем файле несколько целей (вам не нужно будет полагаться на сцепленные
                  зависимости). В строке зависимости перечисляются все цели, которые вы хотите построить. Никаких команд для символических целей
                  указывать не нужно.
                  Например, в следующем формирующем файле символические цели
                  Files строятся из FILE1.EXE и FILE2.EXE.
                  Files: file1.exe file2.exe #Эта цель не имеет команд
                  file1.exe: file1.obj
                  bcc file1.obj
                  file2.exe: file2.obj
                  bcc file2.obj
                  Для символических целей действуют следующие правила:
                • Символические цели не требуют командной строки.

                • Символической цели нужно давать уникальное имя (оно не может быть именем файла в текущем каталоге).

                • Именует символические цели согласно с правилами операционной системы.



                • Синтаксис явных правил


                  Явное правило - это правило, которое явным образом задает
                  полные имена файлов. Явные правила имеют следующий вид:
                  целевой_файл[целевой_файл]...:[{маршрут}][исходный_файл...]
                  [команда]
                  .
                  .
                  .
                  Здесь "целевой_файл" представляет собой файл, который должен
                  быть обновлен, "исходный_файл" представляет собой файл, от которой зависит файл "целевой_файл", а "команда" представляет собой
                  любую команду, допустимую в DOS (включая вызовы .BAT файлов и выполнение .EXE и .COM файлов).
                  Явные правила определяют одно или несколько имен результирующих файлов, ноль или более исходных файлов, а также необязательный перечень команд, которые должны быть выполнены. Имена результирующего (целевого) и исходного файлов, указываемые в явных правилах, могут содержать обычные спецификации дисковода и каталога,
                  допустимые в DOS, а также содержать трафаретные символы.
                  Обязательны для соблюдения следующие указанные ниже синтаксические правила:
                • "Целевой_файл" должен начинаться с самого начала строки (в
                  столбце 1);

                • Исходному файлу (файлам) "исходный_файл" должны предшествовать по меньшей мере один символ пробела или табуляции,
                  расположенные после двоеточия;

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

                • Наличие как имен исходных файлов, так и команд является необязательным; возможно существование явных правил, которые состоят
                  только из строки целевой_файл[целевой_файл...], за которой следует символ двоеточия.
                  Идея использования явного правила заключается в том, что команда или перечень команд будут осуществлять создание или обновление результирующего файла целевой_файл как правило на основе
                  исходного файла "исходный_файл". Когда утилита MAKE обнаруживает



                  явное правило, она сначала проверяет, не являются ли сами исходные файлы "исходный_файл" результирующим файлом "целевой_файл" в
                  каком-либо другом правиле формирующего файла. Если это так, то
                  сначала утилита MAKE анализирует это второе правило.
                  После того, как на основе других правил были созданы или обновлены все исходные файлы "исходный_файл", утилита MAKE проверяет наличие результирующего файла "целевой_файл". Если "целевой_файл" не существует, то все команды выполняются в том порядке, в котором они заданы. Если "целевой_файл" существует, то дата
                  и время его последней модификации сравниваются с датой и временем
                  каждого исходного файла "исходный_файл". Если какой-либо исходный
                  файл был модифицирован после того, как был модифицирован файл
                  "целевой_файл", то выполняется заданный перечень команд.
                  Имя файла может указываться в левой части явного правила
                  файла описания утилиты MAKE лишь один раз.
                  Каждая командная строка в явном правиле начинается с символа
                  пробела. Утилита MAKE рассматривает все строки, которые следуют
                  за явным правилом и продолжаются до очередной строки, начинающейся со столбца 1 (которой не предшествуют символы пробела) или до
                  конца файла, как часть списка команд для этого правила. Пустые
                  строки игнорируются.
                  Явное правило, за которым не следуют командные строки, интерпретируется несколько иначе, чем явное правило с командными
                  строками.
                • Если в состав явного правила входят команды, то результирующий файл зависит только от тех файлов, которые перечислены в явном правиле.

                • Если в явном правиле не заданы никакие команды, результирующий файл зависит от двух наборов файлов: тех файлов,
                  которые заданы в явном правиле, и от всех файлов, которые
                  подходят под определение неявного правила для результирующего файла (файлов). Это позволяет задавать зависимости,
                  которые будут обрабатываться неявным правилом. Например:
                  .c.obj
                  BCC -c $<
                  рrog.obj:

                • Файл рrog.obj зависит от файла рrog.c; если не совпадают даты этих файлов, то будет выполняться командная строка:
                  BCC -c рrog.c

                  Синтаксис команд


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


                  Синтаксис неявных правил


                  Утилита MAKE позволяет на ряду с явными правилами задавать
                  неявные правила. Неявные правила представляют собой обобщение явных правил; они применяются ко всем файлам, которые имеют соответствующие расширения имен файлов.
                  Ниже приводится пример, который иллюстрирует отношение между
                  двумя правилами. Рассмотрим явное правило из предыдущего примера.
                  Данное правило является типичным, поскольку оно следует общему
                  принципу: объектный файл(с расширением имени .OBJ) зависит от
                  файла с тем же основным именем и расширением .C и создается путем
                  выполнения программы BCC. Фактически, можно создать формирующий
                  файл для утилиты MAKE, который будет содержать несколько(или
                  несколько десятков) явных правил, соответствующих одному и тому
                  же формату.
                  Переписывая явное правило в виде неявного правила, вы можете
                  убрать все явные правила, которые подчиняются одинаковому форма ту. Неявное правило будет иметь следующий вид:
                  .c.obj:
                  BCC -c $<
                  Это правило означает следующее: "Любой файл с расширением .C
                  может быть оттранслирован в файл с тем же основным именем и расширением .OBJ с помощью следующей последовательности команд".
                  Создание файла .OBJ происходит с помощью второй строки этого правила, где $< означает имя файла с расширением, присущим исходному
                  файлу (.C). (Символ $< представляет макрокоманду особого вида.
                  Объяснение макрокоманд приводится далее. Макрокоманда $< при каждом выполнении команды будет заменена полным именем соответствующего исходного файла .C).
                  Идентификатор $< представляет собой специальную макрокоманду. Макрокоманды обсуждаются ниже. Макрокоманда $< при каждом выполнении команды будет заменяться полными именем соответствующего
                  исходного файла .С.
                  Ниже приводится синтаксис неявного правила:
                  [{исходный_каталог}].исх_расшир.[{целевой_каталог}]цел_расшир:
                  [команда]
                  ...
                  Как и ранее, использование команды является необязательным.
                  Если команда используется, то перед ней должны стоять один или
                  несколько символов пробелов.



                  "Исх_расшир" ( расширение имени файла, которое должно начинаться точкой в столбце 1) представляет собой расширение имени
                  исходного файла; то есть, оно относится к любому файлу, который
                  имеет следующий формат:
                  имя_файла.исх_расшир
                  Аналогично, "цел_расшир" относится к файлу, который удовлетворяет спецификации:
                  имя_файла.цел_расшир
                  Здесь "имя_файла" является одинаковым для обоих файлов. Другими словами, данное неявное правило заменяет все явные правила,
                  которые соответствуют следующему формату:
                  имя_файла.исх_расшир:имя_файла.цел_расшир
                  [команда]
                  ...
                  для любого имени файла.
                  Если утилита MAKE не может обнаружить явное правило для заданного результирующего файла, или если имя результирующего файла
                  появляется в явном правиле, у которого отсутствуют команды, то
                  она использует неявные правила.
                  Расширение имени интересующего утилиту MAKE файла используется для определения того неявного правила, которое должно использоваться. Это неявное правило применяется в том случае, если
                  обнаружен файл с тем же самым основным именем, что и у результирующего файла, но с заданным расширением исходного файла.
                  Предположим, например, что у вас имеется формирующий файл
                  утилиты MAKE (с именем MAKEFILE), который имеет следующее содержимое:
                  c.obj:
                  BCC -c $<
                  Если у вас имеется написанная на Си программа с именем
                  RATIO.C, которую вы хотите скомпилировать в файл RATIO.OBJ, то вы
                  можете воспользоваться командой:
                  make ratio.obj
                  Утилита MAKE будет рассматривать файл RATIO.OBJ в качестве
                  результирующего файла. Поскольку явное правило для создания файла
                  RATIO.OBJ не существует, утилита MAKE применяет неявное правило и
                  генерирует следующую команду:
                  BCC -c ratio.c
                  которая, естественно, выполняет компиляцию для создания файла
                  RATIO.OBJ.
                  Утилита MAKE использует неявные правила и в том случае, когда ей задаются явные правила, не сопровождающиеся никакими командами. Предположим, что в начале файла описания вы задали следующее неявное правило:
                  .c.obj:


                  BCC -c $<
                  Если это правило задано, вы можете удалить команду из приведенного ниже явного правила:
                  myрrog.obj: myрrog.c include\stdio.h
                  BCC -c myрrog.c
                  Процесс обработки будет прежним.
                  Если вы используете систему Borland C++ и разрешаете утилите
                  MAKE выполнять автоматическую проверку зависимостей, вы можете
                  удалить все явно заданные зависимости, в которых объектные файлы
                  указываются в качестве результирующих. Если задана автоматическая
                  проверка зависимостей, и используются неявные правила, то представленный в начале раздела по явным правилам пример с тремя правилами превращается в следующий:
                  c.obj:
                  BCC -c $<
                  рrog.exe: myрrog.obj рrog2.obj
                  tlink lib\c0s myрrog рrog2, рrog, ,lib\cs
                  Вы можете создать несколько неявных правил с одним и тем же
                  расширением имени результирующего файла. Если для заданного расширения имени результирующего файла имеется более одного неявного
                  правила, то правила проверяются в том порядке, в котором они появляются в файле описания, до тех пор, пока не найдется правило,
                  подходящее для расширения имени исходного файла, или до тех пор,
                  пока утилита MAKE не осуществит проверку всех применимых правил.
                  Утилита MAKE использует первое неявное правило, в котором
                  указан файл с расширением имени исходного файла. Даже если выполнение команды, заданной в этом правиле, заканчивается безуспешно,
                  никакие неявные правила больше не проверяются.
                  Все строки, следующие за неявным правилом вплоть до очередной строки, которая не начинается с символа пробела, или до конца
                  файла, считаются частью списка команд для этого правила.
                  Цель в явном правиле получает свою командную строку из явного правила. Следующий пример показывает неявное правили и явное
                  правило без командной строки:
                  .c.obj
                  bcc -c $< #использует макрокоманду $<
                  myprog.obj: #явное правило, использующее команду
                  # bcc -c myprog.c

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


                  Чтобы включить в код Си/С++ инструкции ассемблера, используйте ключевое слово asm и следующий формат:
                  asm код_операции операнды;
                  где "код_операции" - допустимая инструкция процессора 80х86,
                  "операнды" содержат операнды (операнд), допустимые для указанной
                  операции (константы, переменные и метки). Концом оператора asm
                  является символ ; или новая строка. После точки с запятой на той
                  же строке может размещаться новый оператор asm, но на следующей
                  строке оператор продолжаться не может. Для включения нескольких
                  операторов asm их можно заключить в фигурные скобки (первая скобка должна быть на той же строке, что и asm):
                  asm {
                  pop ax; pop ds
                  iret
                  }
                  Точки с запятой для комментария здесь не используются (как в
                  TASM). При комментировании таких операторов применяйте стандартные комментарии Си. Ассемблерная часть оператора копируется непосредственно в вывод и включаются в операторы языка ассемблера,
                  которые Borland С++ генерирует для инструкций Си и С++. Все идентификаторы Си заменяются на соответствующие эквиваленты ассемблера. Каждый оператор asm рассматривается как оператор Си.
                  Оператор asm может использоваться в функции или как внешнее
                  описание вне функции. Оператор asm, размещенные внутри функции,
                  помещаются в сегмент кода, а операторы asm вне функции - в сегмент данных.


                  Системные сообщения



                  WM_COMPACTING WM_QUEUESYNC
                  WM_DEVMODECHANGE WM_SPOOLERSTATUS
                  WM_ENTERIDLE WM_SYSCOLORCHANGE
                  WM_FONTCHANGE WM_SYSCOMMAND
                  WM_NULL WM_TIMECHANGE
                  WM_PALETTECHANGED WM_WININICHANGE
                  WM_PALETTEISCHANGING WM_POWER



                  Скрытие данных в потомках


                  При порождении потомка класса у вас есть выбор в определении типа элементов. По умолчанию элементы базового класса автоматически получают приватный тип, если только вы не захотите иначе. Использование
                  же ключевого слова public, при порождении потомка класса, делает все
                  элементы базового класса общими в порожденном классе. Приватные элементы базового класса остаются приватными, и не будут доступны из потомков. Вот где требуются защищенные элементы (protect).
                  Замечание. Если вы хотите использовать в потомке класса элементы базового класса, то они должны быть объявлены как защищенные
                  или общие. Доступ к приватным элементам базового класса
                  невозможен никак иначе, как из их приватных функций элементов или с помощью дружественных функций, объявленных
                  как friend.
                  В приведенной ниже таблице показана доступность элементов базового класса для его потомка (в зависимости от определенного типа
                  доступа в базовом классе и потомке):
                  Тип доступа в Тип доступа Доступность элеме-
                  базовом классе в потомке нта базового класса
                  приватный приватный недоступен
                  защищенный приватный приватный
                  общий приватный приватный
                  приватный общий недоступен
                  защищенный общий защищенный
                  общий общий общий
                  По мере изучения материала вы познакомитесь с многочисленными
                  примерами использования управления доступом.


                  Содержимое окон печати


                  Простейшим видом генерируемой распечатки является копия окна
                  (оконные объекты состоят из одной страницы и знают, как отображаться в контексте устройства). Чтобы создать объект распечатки
                  окна, постройте объект и передайте строку заголовка и указатель
                  на нужное окно.
                  Часто требуется, чтобы окно создавало распечатку в ответ на
                  команду меню. Пример вы найдете в программе PRINTING.CPP.


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


                  В справочнике по функциям Borland С++ приняты следующие соглашения:
                • в левой части заголовочной строки указано имя функции, а в
                  правой - ее назначение;

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

                • Вот так, примерно, выглядит описание функции:
                  Имя_функции Назначение. Краткое изложение действий, выпол-
                  няемых функцией.
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C Синтаксис #include <имя_заголовка.h>
                  В этой части перечисляются файлы заголовков,
                  содержащие прототип функции или описания констант, перечисляемых типов и т.д. (т.е. то, что
                  использует данная функция).
                  имя_функции(параметр[,...]);
                  Подобная запись описывает синтаксис функции.
                  Расшифровка значков-пpедупpеждений под
                  именем функции:

                  DOS Функция позволяет pаботать в DOS
                  Win16 Функция позволяет pаботать в 16-pазpядном Windous
                  Win32 Функция позволяет pаботать в 32-pазpядном Windous
                  OS/2 Функция позволяет pаботать в OS/2
                  ANSI C Функция позволяет pаботать в aNsI C
                  ANSI C++ Функция позволяет pаботать в aNsI C++
                  UNIX Функция позволяет pаботать в UNIX



                  Сообщения буфера вырезанного изображения



                  WM_ASKCBFORMATNAME WM_PASTE
                  WM_CHANGECBCHAIN WM_PAINTCLIPBOARD
                  WM_CLEAR WM_RENDERALLFORMATS
                  WM_CUT WM_RENDERFORMAT
                  WM_COPY WM_SIZECLIPBOARD
                  WM_DESTROYCLIPBOARD WM_UNDO
                  WM_DRAWCLIPBOARD WM_VSCROLLCLIPBOARD
                  WM_HSCROLLCLIPBOARD



                  Сообщения DDE



                  WM_DDE_ACK WM_DDE_POKE
                  WM_DDE_ADVICE WM_DDE_REQUEST
                  WM_DDE_DATA WM_DDE_TERMINATE
                  WM_DDE_EXECUTE WM_DDE_UNADVISE
                  WM_DDE_INITIATE



                  No such file or directory


                  Сообщение Сообщение













                  Error 0
                  Ошибка 0
                  Invalid data

                  Неверные данные
                  Invalid function number
                  Неверный номер функции
                  No such device

                  Такого устройства нет
                  No such file or directory
                  Такого файла или каталоге нет
                  Attempt to remove current

                  directory

                  Попытка удалить текущий каталог
                  Path not found
                  Путь не найден
                  Not same device

                  Другое устройство
                  Too many open files
                  Слишком много открытых файлов
                  No more files

                  Файлов больше нет
                  Permission denied
                  Разрешение не дано
                  Invalid argument

                  Неверный аргумент
                  Bad file number
                  Неверный номер файла
                  Arg list too big

                  Список аргументов слишком велик
                  Memory arena trashed
                  Испорчена память
                  Exec format error

                  Ошибка формата запуска
                  Not enough memory
                  Недостаточно памяти
                  Cross-device link

                  Кросс-компоновка устройств
                  Invalid memory block address
                  Неверный адрес блока памяти
                  Math argument

                  Математический аргумент
                  Invalid environment
                  Неверная операционная среда
                  Result too large

                  Результат слишком велик
                  Invalid format
                  Неверный формат
                  File already exists

                  Файл уже существует
                  Invalid access code

                  Неверный код доступа


                  No space left in device


                  Сообщение Смысл






















                  Bad address Неверный адрес
                  Block device required Требуется блочное устройство
                  Broken pipe Нарушение конвейера
                  Executable file in use Выполняемый файл используется
                  File too large Файл слишком велик
                  Illegal seek Недопустимая установка
                  Inapropriate I/O control operation Неподходящая операция управле

                  ния вводом-выводом
                  Input/output error Ошибка ввода-вывода
                  Interrupted function call Прерванный вызов функции
                  Is a directory Является каталогом
                  Name too long Слишком длинное имя
                  No child processes Нет дочерних процессов
                  No space left in device На устройстве не осталось места
                  No such device or address Нет такого адреса или устройства
                  No such process Нет такого процесса
                  Not a directory Не является каталогом
                  Operation not permitted Операция не разрешена
                  Possible deadlock Возможен клинч
                  Read-only file system Файловая система доступна только по чтению
                  Resource busy Ресурс занят
                  Resource temporary Ресурс временно недоступен

                  unavailable
                  Too manu links Слишком много связей
                  См. описание perror в "Справочнике по библиотеке".

                  Поведение calloc, malloc или realloc, если запрошен

                  нулевой размер



                  calloc и malloc проигнорируют такой запрос и возвратят 0.

                  realloc освободит блок.

                  Поведение функции abort в отношении открытых и временных

                  файлов



                  Буферы файлов не очищаются, а файлы не закрываются.

                  Статус, возвращаемый функцией exit при ненулевом

                  значении аргумента, EXIT_SUCCESS или EXIT_FAILURE



                  Особые действия не предусмотрены. Статус возвращается в том

                  виде, в котором он передан. Статус представлен как signed char.

                  Набор имен операционной среды и способ изменения значений переменных операционной среды при помощи getenv



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

                  программы служит putenv, но для постоянного изменения их нужно

                  использовать команду SET.

                  Содержимое и режим обработки строки функцией system



                  Строка интерпретируется как команда операционной системы.

                  Используется COMSPEC или запускается COMMAND.COM (для 16-разрядных программ) или CMD.EXE (для 32-разрядных программ), и аргумент

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

                  .EXE.

                  Содержимое строк сообщений об ошибке, возвращаемых

                  функцией strerror



                  См. выше.

                  Использование локального таймера и хранение времени в

                  форме "AM/PM"



                  Определяются локальные время и данные PC.

                  Отсчет времени системными часами



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

                  Форматы даты и времени



                  Borland C++ реализует форматы ANSI.

                  Сообщения инициализации



                  WM_INITDIALOG WM_INITMENUPOPUP
                  WM_INITMENU



                  Сообщения компилятора Help об ошибках


                  Компилятор справочников выводит на экран сообщение, когда в процессе построения файла ресурсов обнаруживается та или иная ошибка. Ошибки, обнаруживаемые при обработке файла описания проекта, имеют коды, начинающиеся с префикса P, а соответствующие сообщения выглядят следующим образом:
                  Error P1025: line...7 of filename.HPJ : Section heading sectionname unrecognized.
                  Warning P1039: line...38 of filename.HPJ : [BUILDTAGS] section missed.
                  Ошибки, обнаруживаемые при обработке информационных файлов (.RTF), имеют коды, начинающиеся с префикса R, а соответствующие сообщения выглядят следующим образом:
                  Error R2025 : File environment error. Warning R2501 : Using old-key phrase table.
                  Если это возможно, компилятор сообщает номер статьи и/или имя информационного файла, где обнаружена ошибка. Номер статьи, сообщаемый компилятором, представляет собой ее порядковый номер в файле .RTF (первая, вторая и т.д.). Эти номера могут совпадать с номером страницы, показываемым текстовым процессором, в зависимости от того, какую длину гипотетической страницы (в строках) вы установили. Напомним, что статьи в информационных файлах отделяются знаком "конец страницы", хотя в справочной системе понятие "страница" не используется.
                  Сообщения, начинающиеся со слова Error (Ошибка) соответствуют серьезным (фатальным) ошибкам. Сообщения о таких ошибках выводятся на экран всегда и при их возникновении построение справочного файла не производится. Сообщения, начинающиеся с Warning (Предупреждение), связаны с менее серьезными ошибками. При наличии ошибок только второго типа, процесс компиляции проходит до конца и создается соответствующий справочный файл, который может быть использован в рамках системы интерактивной документации Windows. Однако при этом справочник Help может функционировать не совсем так, как задумывалось разработчиком. Количество предупредительных сообщений, выводимых компилятором на экран, может регулироваться пользователем.
                  При обработке файла описания проекта компилятор игнорирует ошибочные строки и пытается продолжить компиляцию. Это означает, что ошибки, обнаруженные на начальном этапе обработки, могут приводить к лавине наведенных ошибок на следующих этапах. Аналогично обрабатываются ошибки в информационных файлах: если ошибка, которая произошла при обработке файлов тем справочника, не очень серьезная, то компиляция продолжается. В качестве реакции на единственную ошибку в информационном файле компилятор может выдавать сразу несколько сообщений. Так при ошибке в идентификаторе определенной статьи на экран будет выводиться сообщение об ошибке всякий раз, когда компилятор будет встречать в информационном файле ссылку на эту статью. Такая ошибка легко устраняется путем простой коррекции текста сноски, определяющего контекстную строку этой статьи.


                  Сообщения мультимедиа



                  MM_ADLIB MM_MOM_CLOSE
                  MM_JOY1BUTTONDOWN MM_MOM_DONE
                  MM_JOY1BUTTONUP MM_MOM_OPEN
                  MM_JOY1MOVE MM_MPU401_MIDIN
                  MM_JOY1ZMOVE MM_MPU401_MIDIOUT
                  MM_JOY2BUTTONDOWN MM_PC_JOYSTICK
                  MM_JOY2BUTTONUP MM_SNDBLST_MIDIN
                  MM_JOY2MOVE MM_SNDBLST_MIDIOUT
                  MM_JOY2ZMOVE MM_SNDBLST_SYNTH
                  MM_MCINOTIFY MM_SNDBLST_WAVEN
                  MM_MICROSOFT MM_SNDBLST_WAVEOUT
                  MM_MIDI_MAPPER MM_WAVE_MAPPER
                  MM_MIM_CLOSE MM_WIM_CLOSE
                  MM_MIM_DATA MM_WIM_DATE
                  MM_MIM_ERROR MM_WIM_OPEN
                  MM_MIM_LONGDATA MM_WOM_CLOSE
                  MM_MIM_LONGERROR MM_WOM_DONE
                  MM_MIM_OPEN MM_WOM_OPEN



                  Сообщения, не документированные Microsoft



                  WM_ALTTABACTIVE WM_ISACTIVEICON
                  WM_BEGINDRAG WM_LBTRACKPOINT
                  WM_CONVERTREQUEST WM_NEXTMENU
                  WM_CONVERTRESULT WM_QUERYDROPOBJECT
                  WM_DRAGLOOP WM_QUERYPARKICON
                  WM_DRAGMOVE WM_SETHOTKEY
                  WM_DRAGSELECT WM_SETVISIBLE
                  WM_DROPOBJECT WM_SIZEWAIT
                  WM_ENTERMENULOOP WM_SYNCPAINT
                  WM_ENTERSIZEMOVE WM_SYNCSTACK
                  WM_EXITMENULOOP WM_SYSTIMER
                  WM_EXITSIZEMOVE WM_TESTING
                  WM_FILESYSCHANGE WM_YOMICHAR
                  WM_GETHOTKEY

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


                  Сообщения об ошибках


                  Сообщения об ошибках могут генерироваться компилятором, ком- поновщиком, утилитой MAKE или библиотекарем. Кроме того, такие ошибки может генерировать программа на этапе выполнения.
                  Нефатальные ошибки, генерируемые компилятором, указывают на синтаксические ошибки в программе, ошибки командной строки или ошибки, вызванные ситуациями на диске или в памяти. Компилятор завершает текущую фазу компиляции и прекращает работу. На каждой фазе компиляции (препроцессорная обработка, синтаксический анализ, оптимизация и генерация кода) компилятор пытается найти максимально возможное число ошибок.
                  Ошибки, генерируемые компоновщиком, не приводят к удалению файлов .EXE или .MAP, однако выполнять такой файл .EXE не следует. При компиляции из IDE сообщения компоновщика об ошибках рассматриваются как фатальные ошибки.
                  Утилита MAKE генерирует ошибки при неверном синтаксисе или семантических ошибках формирующего файла. Чтобы исправить их, нужно отредактировать формирующий файл.
                  Сообщения об ошибках на этапе выполнения обычно вызываются логическими ошибками в программе. Нужно исправить причину и перекомпилировать программу.


                  Сообщения об ошибках


                  Ниже приводятся сообщения об ошибках, генерируемые Borland С++. В Borland C++ имеются следующие категории ошибок: ошибки этапа выполнения, ошибки этапа компиляции, ошибки компилятора справочников Help, ошибки TLIB и ошибки TLINK. Эти ошибки поясняются в данном приложении. Сообщения об ошибках, выводимые системой интерфейса с пользователем, поясняются в файлах документации на дистрибутивных дисках.
                  Сначала указывается тип сообщения (например, сообщение этапа компиляции или сообщение утилиты Help). В большинстве пояснений указывается возможная причина ошибки, как можно от нее избавиться или приводится предупреждающее сообщение.
                  Сообщения об ошибках перечислены в алфавитном порядке, по старшинству символов ASCII; обычно первыми идут сообщения, начинающиеся символами (равенство, запятая, фигурная скобка и т.д.).
                  Поскольку сообщения, в которых на первом месте выводится имя, специфическое для данной программы, не могут быть расставлены по алфавиту, то они также находятся в начальной части каждого списка сообщений.
                  Например, если у вас имеется функция С++ goforit, то фактически вы можете получить сообщение об ошибке:
                  goforit must be declared with no arguments
                  Для того, чтобы найти описание данного сообщения в этой главе, искать следует сообщение:
                  функция must be declared with no arguments
                  в начале списка сообщений об ошибках. Сообщение упорядочивается по алфавиту по слову "must".
                  Если же некоторая переменная включается в текст сообщения позже (например, "Address of overloaded function функция doesn't match типу"), то такое сообщение можно найти по алфавиту, в данном случае на букву A.


                  Сообщения от "мыши"



                  WM_HSCROLL WM_MOUSEACTIVATE
                  WM_LBUTTONDCLICK WM_MOUSEMOVE
                  WM_LBUTTONDOWN WM_RBUTTONDBLCLK
                  WM_LBUTTONUP WM_RBUTTONDOWN
                  WM_MBUTTONDCLICK WM_RBUTTONUP
                  WM_MBUTTONDOWN WM_SETCURSOR
                  WM_MBUTTONUP WM_VSCROLL
                  WM_BUTTONUP WM_MOUSEFIRST
                  WM_MOUSELAST



                  Сообщения печати



                  DM_COLOR DM_PAPERLENGTH
                  DM_COPIES DM_PAPERSIZE
                  DM_COPY DM_PAPERWIDTH
                  DM_DEFAULTSOURCE DM_PRINTQUALITY
                  DM_DUPLEX DM_PROMPT
                  DM_IN_BUFFER DM_SCALE
                  DM_INPROMPT DM_SPECVERSION
                  DM_MODIFY DM_TTOPION
                  DM_ORIENTATION DM_UPDATE
                  DM_OUT_BUFFER DM_YRESOLUTION
                  DM_OUTDEFAULT



                  Сообщения пера



                  WIN_USER WM_RCRESULT
                  WM_GLOBALRCCHANGE WM_SKB
                  WM_HEDITCTL WM_PENWINFIRST
                  WM_HOOKRCRESULT



                  Сообщения ввода



                  WM_CHAR WM_MENUSELECT
                  WM_CHARTOITEM WM_PARENTNOTIFY
                  WM_COMMAND WM_SYSCHAR
                  WM_DEADCHAR WM_SYSDEADCHAR
                  WM_KEYDOWN WM_SYSKEYDOWN
                  WM_KEYLAST WM_SYSKEYUP
                  WM_KEYUP WM_TIMER
                  WM_MENUCHAR WM_VKEYTOITM



                  Сообщения Windows



                  WM_ACTIVATE WM_KILLFOCUS
                  WM_ACTIVATEAPP WM_MOVE
                  WM_CANCELMODE WM_PAINT
                  WM_CLOSE WM_PAINTICON
                  WM_CREATE WM_Q



                  Соответствие цветов интерфейса системным цветам


                  DIB часто используются для улучшения и декодирования интерфейса с пользователем. Чтобы согласовать свой интерфейс с пользовательской системой своего приложения, следует использовать функцию MapUIColors, которая заменяет стандартные цвета интерфейса на
                  собственные системные цвета пользователя. В первом параметре этой
                  функции с помощью операции OR комбинируются из 5 флагов:

                  Флаг Замена Заменяется на
                  TDib::MapText TColor::Black COLOR_BTNTEXT
                  TDib::MapFace TColor::LtGray COLOR_BTNFACE
                  TDib::MapFace TColor::Gray COLOR_BTNSHADOW
                  TDib::MapFace TColor::White COLOR_BTNHIGHLIGHT
                  TDib::MapFrame TColor::LtMagenta COLOR_WINDOWFRAME

                  Второй параметр, если он задается, приводит к замене TColor::LtYellow на bkColor. Так как эта функция ищет и заменяет записи таблицы TColor, ее полезно использовать с DIB только в режиме RGB. Поскольку она заменяет отдельные цвета, вы должны проектировать свой интерфейс с использованием стандартный цветовой
                  схемы.


                  Сопроцессор


                  Си работает с двумя числовыми типами: целыми (int, short,
                  long и т.д.) и с плавающей точкой (float double и long double).
                  Процессор вашего компьютера легко справляется с обработкой чисел
                  целых типов, однако числа с плавающей точкой отнимают больше времени и усилий.
                  Семейство процессоров iAPx86 имеет сопутствующее ему семейство математических сопроцессоров - 8087, 80287 и 80387. Мы будем
                  обозначать все семейство математических сопроцессоров 80x87 термином "сопроцессор". (В случае процессора 80487 вы имеете математический сопроцессор уже встроенным в основной.)
                  Процессор 80х87 представляет собой специальный аппаратно реализованный числовой процессор, который можно установить на вашем
                  PC. Он служит для выполнения с большой скоростью команд с плавающей точкой. При большом количестве в вашей программе операций с
                  плавающей точкой вам, безусловно, нужен сопроцессор. Блок центрального процессора в вашем компьютере осуществляет интерфейс с
                  80х87 по специальным шинам интерфейса.


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


                  В данном разделе описываются основные принципы модели
                  Doc/View. Эта модель освобождает программиста и пользователя от
                  необходимости думать от типах данных и о том, как они представляются на экране. Doc/View связывает типы файлов данных с классом
                  документа и классом просмотра. Администратор документов поддерживает список ассоциаций между классами документа и классами просмотра. Каждая ассоциация называется шаблоном документа (не путайте его с шаблонами С++).
                  Класс документа управляет хранением данных и манипулированием ими. Он содержит информацию, которая выводится на экран. Объекты документов управляют изменениями данных и передачей их в постоянную память (например, на диск).
                  Когда пользователь открывает документ (существующий или создавая новый документ), он выводится с помощью соответствующего
                  (ассоциированного с ним) класса отображаемого элемента. Класс
                  отображаемого элемента управляет выводом данных на экран и тем,
                  как пользователь взаимодействует с данными на экране. Фактически,
                  отображаемый элемент формирует интерфейс между окном на экране и
                  документом. Некоторые типы документов могут иметь только один ассоциированный с ними класс отображаемого элемента, другие - несколько. Различные типы отображаемых элементов определяют различных характер взаимодействия пользователя с документом.


                  Совместное использование Style Sheet


                  Если вы создаете для проекта набор Style Sheet, а затем выбираете Project New project, то новый проект наследует Style Sheet (а также инструментальные средства и параметры) из старого
                  проекта. Однако, если вы закроете проект или перезапустите IDE,
                  то вам придется заново открыть проект со Style Sheet, а затем
                  создать новый проект, наследующий Style Sheet.
                  Совместно использование Style Sheet в проектах можно обеспечить и другим способом. При каждом создании файла проекта вы создаете также файл языка описания проекта (.PDL), который содержит
                  информацию об используемых в проекте наборах Style Sheet и Tools.
                  Этот файл нужно редактировать аккуратно, иначе администратор проекта не сможет его считывать.
                  При открытии файла проекта администратор проекта отрывает
                  файл .PDL с тем же именем, что и имя файла .IDE. Чтобы совместно
                  использовать в проектах Style Sheet, сделайте следующее:
                • Откройте файл .PDL, содержащий Style Sheet, используя
                  обычный текстовый редактор.

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

                • Откройте файл .PDL, в который нужно скопировать Style Sheet.

                • Найдите секцию Style Sheet и вставьте скопированный текст
                  в конец существующего списка Style Sheet.

                • Сохраните файл .PDL со скопированной секцией Style Sheet.

                • Когда вы откроете проект, связанный с обновленным файлом
                  .PDL, то увидите при выборе Options Style Sheet новый набор Style Sheet.


                  Создание DLL


                  DLL создаются аналогично файлам .EXE: компилируются файлы
                  исходного кода, затем выполняется компоновка объектных файлов.
                  Однако, DLL не имеют функции main и компонуются по другому. Ниже
                  рассказывается, как следует писать DLL.
                  LibMain, DllEntryPoint и WEP
                  В качестве основной точки входа для DLL должны предусматриваться функция LibMain (для 16-разрядных программ) или DllEntryPoint (для 32-разрядных). В случае 32-разрядных программ Windows
                  вызывает DllEntryPoint при каждой загрузке или выгрузке DLL, при
                  каждом присоединении или отсоединении от DLL дополнительных процессов или при создании/уничтожении внутри процесса нити.
                  Инициализация DLL практически целиком зависит от функции
                  конкретной DLL и может включать в себя следующие основные задачи:
                • Разблокировку сегмента данных с помощью UnlockData, если
                  она описывается как MOVEABLE (только для 16-битовых приложений).

                • Задание для DLL глобальных переменных (если она их использует).

                • Код инициализации выполняется только для первого приложения,
                  использующего DLL. Код запуска DLL автоматически инициализирует
                  локальную динамически распределяемую область памяти, поэтому в
                  LibMain не нужно включать соответствующий код. Функции LibMain
                  передаются следующие параметры:
                  int FAR PASCAL LibMain (HINSTANCE hInstance, WORD wDataSeg;
                  WORD cbHeapSize, LPSTR lpSmdLine)
                  hInstance - это описатель экземпляра DLL.
                  wDataSeg - это значение регистра сегмента данных (DS).
                  cbHeapSize - размер локальной динамически распределяемой
                  области памяти, заданной для DLL в файле определения модуля.
                  lpCmdLine - это дальний указатель командной строки, задан ной при загрузке DLL. Он почти всегда нулевой, так как DLL
                  обычно загружается автоматически и без параметров.
                  LibMain обычно возвращает значение 0 (успешная инициализация) или 1 (неуспешная инициализация). В последнем случае Windows
                  выгружает DLL из памяти.
                  Точкой выхода для 16-битовой DLL является функция WEP (Windows Exit Procedure). Эта функция для DLL не обязательна, так как
                  библиотеки исполняющей системы Borland C++ предусматривают ее по
                  умолчанию, но для выполнения какой-либо очистки перед выгрузкой
                  DLL из памяти вы можете указать свою собственную функцию.
                  В Borland С++ WEP экспортировать не требуется. Borland С++
                  определяет свою собственную WEP, которая вызывает вашу WEP (если
                  она определена), а затем выполняет очистку системы. WEP имеет
                  следующий прототип:
                  int FAR PASCAL WEP (int nParameter)
                  где nParameter - это WEP_SYSTEMEXIT или WEP_FREE_DLL. WEP_SYSTEMEXIT указывает на завершение работы Windows, а WEP_FREE_DLL
                  только на выгрузку DLL. В случае успешного выполнения WEP возвращает 1. По этому значению Windows в настоящее время не выполняет
                  никаких действий.


                  Создание дочерних интерфейсных элементов


                  Как и все интерфейсные объекты, объекты дочерних окон создаются в два этапа: построение интерфейсного объекта и создание интерфейсного элемента. Если вы строите дочерний объект в конструкторе родительского окна, их интерфейсные элементы создаются автоматически (при разрешении автоматического создания для дочерних
                  окон). По умолчанию автоматическое создание разрешено для всех
                  объектов ObjectWindows на базе TWindow, за исключением TDialog.
                  Если вы не строите в родительском окне дочерние объекты, они
                  не будут автоматически создаваться и выводиться вместе с родительским окном. Вы можете создать их самостоятельно с помощью
                  Create или (в случае режимного окна) Execute. При этом создание
                  означает создание экземпляра интерфейсного элемента.


                  Создание интерфейсных элементов окна


                  После построения оконного объекта вам нужно сообщить Windows
                  о создании соответствующего интерфейсного элемента. Это можно
                  сделать путем вызова функции-элемента Create объекта, которая делает следующее:
                • Создает интерфейсный элемент.

                • Устанавливает HWindow в описатель интерфейсного элемента.

                • Устанавливает элементы Attr в фактическое состояние интерфейсного элемента (Style, ExStyle, X, Y, H, W).

                • Вызывает SetupWindow.

                • При создании интерфейсного элемента оконного объекта возможны две особых ситуации С++. Таким образом, для обработки проблем
                  с ресурсами или памятью вы должны заключить вызовы Create в блок
                  try/catch. Если окно создать невозможно, Create порождает особую
                  ситуацию TXInvalidWindow, а при невозможности создания дочернего
                  окна - TXInvalidChildWindow. Обе особых ситуации обычно вызываются нехваткой памяти или других ресурсов.
                  Основное окно приложения автоматически создается TApplication::InitInstance. Для создания основного окна вызов Create не требуется.


                  Создание интерфейсных объектов


                  Создание интерфейсного объекта с соответствующими интерфейсными элементами требует следующих шагов:
                • Вызова одного из конструкторов интерфейсных объектов, который строит интерфейсный объект и устанавливает его атри буты.

                • Создания интерфейсного элемента и информирования Windows о
                  создании нового интерфейсного объекта с новым интерфейсным элементом:

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

                • При создании режимного диалогового окна вы создаете интерфейсный элемент вызовом функции-элемента Execute интерфейсного объекта.

                • Связь между интерфейсным объектом и интерфейсным элементом
                  поддерживается через элемент данных HWindow - описатель окна.
                  Обычно в Windows вновь создаваемый интерфейсный элемент получает от Windows сообщение WM_CREATE и отвечает на него своей
                  инициализацией. Интерфейсный объекты ObjectWindows перехватывают
                  это сообщение и отвечают на него вызовом SetupWindow, где вы можете выполнить собственную инициализацию.
                  Если при инициализации интерфейсного объекта требуется описатель окна интерфейсного элемента, то вы должны выполнить эту
                  инициализацию после вызова функции SetupWindow базового класса.
                  До вызова функции SetupWindow базового класса и создания его дочерних окон HWindow будет недействительным (имеет значение NULL).
                  Из-за того, что большая часть инициализации выполняется в
                  конструкторе интерфейсного объекта, после создания этого объекта
                  вы не сможете изменить его характеристики. Таким образом, требуется двухэтапная инициализация: до создания интерфейсного элемента (конструктор) и после него (SetupWindow).


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


                  После определения шаблона класса вы можете создать любое
                  число экземпляров этого класса. Эти экземпляры можно использовать
                  для различных описаний шаблона, поиска различных заданных по
                  умолчанию файлов, просмотра различных каталогов и т.д. Сигнатура
                  конструктора шаблона класса всегда одинакова и имеет вид:
                  TplName name(LPCSTR desc, LPCSTR filt, LPCSTR dir, LPCSTR
                  ext, long flags);
                  где TplName - имя класса, заданного при определении шаблона класса, name - имя данного экземпляра, desc - описание текста шаблона, filt - строка, используемая для фильтрации имен файлов в текущем каталоге (одно или более выражений, разделенных точкой с
                  запятой), dir - заданный по умолчанию каталог для файлов документов, ext - расширение, задаваемое по умолчанию при сохранении
                  файлов, flags - режим открытия и создания документа:

                  Флаг Функция
                  dtAutoDelete Закрывает и удаляет объект документа при закрытии последнего отображаемого элемента.
                  dtNoAutoView Не создает автоматически заданный по умолчанию отображаемый элемент.
                  dtSingleView Допускает только один отображаемый элемент на документ.
                  dtAutoOpen Открывает документ при создании.
                  dtHidden Скрывает шаблон в списке выбора пользователя.



                  Создание класса документа


                  Основной функцией класса документа является обеспечение обратных вызовов для изменений в отображаемом элементе нужных данных, обработки действий пользователей через соответствующие отображаемые элементы и сообщения отображаемым элементам об изменении
                  соответствующих данных.
                  TDocument - это абстрактный базовый класс, обеспечивающий
                  данные функциональные возможности. Непосредственно создать его
                  экземпляр нельзя, поэтому необходимы производные классы. При
                  построении производного класса вызывается конструктор TDocument.
                  Этот конструктор воспринимает только один параметр TDocument*,
                  который указывает на родительский документ нового документа или
                  равен 0 (по умолчанию).
                  Обычно следует избегать переопределения функций TDocument,
                  так как они не описаны как virtual. Администратор документа обращается ко всем производным объектам TDocument как к фактическим
                  объектам TDocument. Если вы переопределяете невиртуальную функцию, она не вызывается, когда к ней обращается администратор документа. Вместо этого администратор документа вызывает версию
                  TDocument этой функции. Однако при переопределении виртуальной
                  функции TDocument (~TDocument, InStream, OutStream, Open, Close,
                  Commit, Revert, RootDocument, SetDocPath, SetDocPath, SetTitle,
                  GetProperty, IsDirty, IsOpen, CanClose, AttachStream и DetachStream) администратор документа корректно вызывает вашу функцию.
                  Если функция базового класса выполняет какие-то важные действия,
                  то ее следует вызывать внутри определяемой вами функции.


                  Создание класса отображаемого элемента


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


                  Создание многоцелевого проекта


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

                • Выберите Project New target. Выводится диалоговое окно New
                  Target.

                • Наберите имя для второй целевой платформы и выберите тип
                  (по умолчанию Standard). Выберите OK.



                • Создание новых классов sber_bank


                  Класс sber_bank может стать основой по которой будут созданы
                  другие классы:
                  Класс Потомки класса sber_bank
                  v v v
                  sber_bank broke_bank, cold_cash_inc;
                  Объекты - на самом деле только переменные, созданные из структур. Так же как и в любой структуре, вы можете сохранять данные в
                  объекте.
                  class sber_bank {
                  Объект sber_bank public:
                  double big_bucks;
                  ...
                  < Deposit << };
                  $$$ <-------------------------------
                  <<
                  Данные > Withdraw >>
                  Функции элементы
                  Доступ к данным объекта выполняется подобно обращению к элементу
                  структуры в языке Си через селектор '.'.

                  Например:
                  class sber_bank {
                  public:
                  double big_bucks;
                  ...
                  };
                  sber_bank my_bank;
                  Объект Данные
                  v v
                  my_bank.big_bucks = 1000000.00;
                  ^
                  Селектор


                  Создание объекта принтера


                  Простейший способ создания объекта принтера состоит в описании в оконном объекте TPrinter*, который другие объекты в программе смогут использовать в целях печати (см. пример программы
                  PRINTING.CPP в каталоге OWLAPI\PRINTING).
                  Основное окно приложения инициализирует объект принтера и
                  использует заданный по умолчанию в WIN.INI. Однако в некоторых
                  случаях вы можете задать другие принтеры. В этом случае постройте
                  объект принтера в конструкторе каждого соответствующего окна. Затем измените устройство принтера. Рекомендуется всегда использовать конструктор по умолчанию, а потом изменять связанное с объектом устройство.


                  Создание объекта распечатки


                  Создание объекта распечатки аналогично написанию функции-элемента Paint для оконного объекта: для генерации нужного
                  образа в контексту устройства используйте графические функции
                  Windows. Объект окна выводит содержимое и управляет взаимодействием с экраном устройства. Контекст устройства объекта распечатки аналогичным образом изолирует вас от устройства печати. Чтобы создать объект распечатки:
                • Создайте из TPrintout новый тип объекта и переопределите
                  функцию-элемент PrintPage. В простейшем случае этого достаточно.

                • Если документ имеет более одной страницы, нужно также определить функцию-элемент HasPage. При наличии другой страницы для печати она должна возвращать ненулевое значение.
                  Текущая страница печати передается PrintPage в качестве параметра.

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


                  Создание потоковых объектов


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

                • Добавьте в определение класса макрокоманду
                  DECLARE_STREAMABLE.

                • Добавьте в один из своих исходных файлов макрокоманду
                  IMPLEMENT_STREAMABLE. Рекомендуется также добавление макрокоманды IMPLEMENT_CASTABLE.

                • Запишите в одном из своих исходных файлов определения
                  функций-элементов Read и Write.

                • Чтобы определить потоковый класс, вам нужно:
                • Включить файл objstrm.h.

                • Основывать свой класс на классе TStreamableBase.

                • Включите в свое определение класса макрокоманду
                  DECLARE_STREAMABLE, например:
                  #include
                  class Sample : public TStreamableBase
                  {
                  public:
                  // функции-элементы и т.д.
                  private:
                  int i;
                  DECLARE_STREAMABLE(IMPEXPMACRO, Sample, 1);
                  };

                • Классы, шаблоны и макрокоманды, необходимые для определения
                  потокового класса, предусмотрены в файле objstrm.h. Каждый потоковый класс должен наследовать (прямо или косвенно) из класса
                  TStreamableBase. В данном примере класс Sample наследует непосредственно из TStreamable. Класс, производный из Sample, не будет
                  явно наследовать из TStreamableBase, поскольку это уже делает
                  Sample. Если вы используете множественное наследование, то следует сделать TStreamableBase виртуальной базой. Это несколько увеличит классы, но никакого отрицательного эффекта не окажет.
                  В большинстве случае для определения потокового класса достаточно макрокоманды DECLARE_STREAMABLE. Эта макрокоманда воспринимает три параметра. Первый из них используется при компиляции
                  DLL. Второй параметр - это имя определяемого класса, а третий номер версии для этого класса. Потоковый код не обращает внимание
                  на номер версии класса.
                  DECLARE_STREAMABLE добавляет в ваш класс конструктор, воспринимающий параметр типа Streamable. Он предназначен для применения в потоковом коде, и непосредственно не используется.



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

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

                  Sample эти функции имеют следующие прототипы:

                  opstream& operator << { opstream&, const Sample& };

                  opstream& operator << { opstream&, const Sample* };

                  opstream& operator >> { opstream&, Sample& };

                  opstream& operator >> { opstream&, Sample*& };

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

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

                  есть полностью записывать объекты типов, производных от Sample.

                  Затем эти объекты считываются обратно с помощью экстрактора, который будет считывать их фактический тип. (Экстрактор выполняет

                  действие, обратное инсертеру.)

                  Наконец, DECLARE_STREAMABLE создает на базе класса TStreamer

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


                  Создание приложения


                  Создание приложения с помощью AppExpert предусматривает следующие этапы:
                • Запустите IDE и выберите команду Project AppExpert. При
                  этом выводится диалоговое окно.

                • Наберите имя файла проекта.

                • Выберите маршрут каталога, куда будет записываться файл
                  проекта AppExpert (если он не существует, то создается). В
                  нем по умолчанию будут размещаться все исходные файлы.
                  Щелкните "мышью" на OK. Выводится диалоговое окно AppExpert Application Generation Options.

                • Для генерации приложения Windows по умолчанию вы можете
                  щелкнуть "мышью" на кнопке Generate диалогового окна Options. Диалоговое окно Application Generation Options содержит слева список тем, а справа - краткое описание темы.
                  Кнопка Help позволяет вывести справочную информацию по теме.

                • Просмотрите параметры, щелкнув на + для выборе подтемы
                  ("+" указывает на наличие подтемы, а "-" говорит о том,
                  что выведены все подтемы).

                • Выберите для приложения нужные параметры

                • Щелкните "мышью" на кнопке Generate диалогового окна Options.

                • Выводится диалоговое окно, подтверждающее генерацию кода.
                  Для генерации кода щелкните "мышью" на Yes. No возвращает
                  вас к выбору параметров. Когда AppExpert генерирует приложение, выводится окно сообщений. AppExpert создает для приложения все файлы и помещает их в базовый каталог. После генерации кода и ресурсов вы можете редактировать и добавлять их, но вернуться в AppExpert и изменить параметры нельзя.

                • Выводится окно проекта, в котором перечислены некоторые из
                  необходимых приложению файлов (битовые массивы, пиктограммы и справочный текст не показывается). Для модификации приложения можно использовать ClassExpert. Чтобы построить
                  приложение, выберите Project Make all. По умолчанию все
                  выполняемые файлы сохраняются в базовом каталоге.



                • Создание проекта


                  Использование администратора проектов не представляет затруднений. Для построения проекта:
                • Выберите имя для файла проекта (с помощью команды Project New Project. Наберите имя проекта и нажмите Tab.

                • Наберите имя первого целевого файла в проекте и выберите
                  его тип (.EXE, .DLL, .LIB, .HLP или файл EasyWin).

                • Выберите целевую платформу (Windows 3.x, DOS Standard или
                  DOS Overlay для 16-разрядных приложений или Win32 для
                  32-разрядных).

                • Если ваше приложение предназначено для DOS, задайте, если
                  это необходимо:

                • плавающую точку (компоновку F87.lib);

                • эмуляцию (компоновка EMU.LIB);

                • компоновку математических библиотек DOS (если требуется);

                • альтернативный способ компоновки C0Fx.OBJ (для всех моделей SS будет равно DS);

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

                • библиотеки ObjectWindows;

                • библиотеку классов Borland С++;

                • библиотеки этапа выполнения;

                • библиотеки BWCC;

                • графический интерфейс Borland (BGI).

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

                • Если необходима мультинитевая версия библиотеки исполняющей системы, выберите Multithread (в Win32).

                • Выберите модель памяти (Target Model).

                • Чтобы создать проект, щелкните "мышью" на OK.


                  Создание расширенного словаря: параметр /E


                  Для ускорения процесса компоновки больших файлов библиотек
                  (таких, как стандартная библиотека Cx.LIB), можно указать утилите
                  TLIB, что нужно создать расширенный словарь и подсоединить его к
                  файлу библиотеки. Данный словарь в крайне компактной форме содержит информацию, которая не вносится в стандартный словарь библиотеки. Эта информация позволяет компоновщику TLINK быстрее обрабатывать файлы библиотек, особенно в том случае, когда они находятся на гибком диске или на медленном жестком диске. Все библиотеки
                  на ваших дистрибутивных дисках содержат расширенный словарь.
                  Для создания расширенного словаря модифицируемой библиотеки
                  необходимо при добавлении, удалении или замене модулей в этой
                  библиотеке задать параметр /E при вызове утилиты TLIB. Для создания расширенного словаря существующей библиотеки, которую вы не
                  хотите модифицировать, нужно задать параметр /E и указать TLIB
                  удаление из библиотеки несуществующего модуля. При этом утилита
                  TLIB выдаст предупреждающее сообщение о том, что заданный модуль
                  в библиотеке не найден, но наряду с этим создаст расширенный словарь заданной библиотеки. Например, введите следующую строку:
                  tlib /E mylib -bogus
                  Если не использовать в командной строке TLIB параметр /e, то
                  утилита TLIB будет игнорировать отладочную информацию в библиотеке, имеющей расширенный словарь.


                  Создание Style Sheet


                  Чтобы создать Style Sheet, сделайте следующее:
                • Выберите в основном меню Options Style Sheet.

                • Щелкните "мышью" на Create. Наберите имя Style Sheet и
                  нажмите Enter.

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

                • Отредактируйте параметры и выберите OK.



                • Создание типов документа


                  При создании приложения AppExpert, поддерживающего модуль
                  Doc/View, вы можете использовать ClassExpert создания классов
                  отображаемых документов и типов документов. Чтобы создать тип документа, сделайте следующее:
                • Создайте класс отображаемого элемента или используйте один
                  из трех предопределенных классов (TEditView, TListView или
                  TWindowView).

                • Запустите из своего проекта ClassExpert. Щелкните правой
                  кнопкой "мыши" в области классов, затем выберите в оперативном меню Create doc types.

                • Выберите View class. По умолчанию это класс TEditView,
                  TListView, TWindowView или ваш собственный класс.

                • Наберите описание типов файлов вашего документа. Этот
                  текст выводится в диалоговом окне File Open.

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

                • Наберите используемое по умолчанию расширение файла. Оно
                  будет использоваться при сохранении.

                • Чтобы задать стили документа/отображаемого элемента, щелкните "мышью" на командной кнопке Styles. Вы можете выбирать следующие стили:


                • Стиль Описание
                  dtAutoDelete Удалять объект документа при закрытии последнего отображаемого элемента.
                  dtNoAutoView Не создавать автоматически заданный по умолчанию тип отображаемого элемента.
                  dtSingleView Обеспечивать только один отображаемый элемент на каждый документ.
                  dtAutoOpen Открывает документ при его создании.
                  dtUpdateDir Обновляет каталог диалога.
                  dtHidden Скрывает шаблон в списке выбираемых пользователем шаблонов.
                  dtSelected Указывает последний выбранный шаблон.
                  dtReadOnly Выбирает при создании диалогового окна доступную только по чтению кнопку с независимой фиксацией.
                  dtOverWritePrompt Запрашивает пользователя, можно ли перезаписать существующий файл (в диалоге Save As).
                  dtHideReadOnly Скрывает кнопки с независимой фиксацией, доступные только по чтению.
                  dtPathMustExist Позволяет пользователю набирать только существующие маршруты.
                  dtFileMusttExist Позволяет пользователю набирать имена только существующих файлов.
                  dtCreatePrompt Перед созданием нового документа выводит пользователю подсказку.
                  dtNoReadOnly Возвращает заданный файл как доступный для записи.

                • Чтобы добавить тип документа в приложение, щелкните
                  "мышью" на Add. При этом будет обновлена структура основного исходного файла, в котором описываются типы документов. Документ/отображаемый элемент выводится в списке доступных типов.

                • Чтобы вернуться в ClassExpert, щелкните "мышью" на Close.



                • Создание указателя данного адреса "сегмент:смещение"


                  Как создать дальний указатель на конкретный адрес памяти
                  (конкретный адрес "сегмент:смещение")? Для этого можно воспользоваться встроенной библиотечной подпрограммой MK_FP, которая в качестве аргумента воспринимает сегмент и смещение, и возвращает дальний указатель. Например:
                  MK_FP(segment_value, offset_value)
                  Имея дальний указатель fp, вы можете получить значение сегмента полного адреса с помощью FP_SEG(fp) и значение смещения с
                  помощью FP_OFF(fp). Более полную информацию об этих трех библиотечных функциях Borland C++ можно найти в справочнике по библиотеке.


                  Спецификаторы формата


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

                  Спецификатор Формат
                  c Символ или строка выводятся на экран в виде необработанных символов. Обычно непечатаемые символы выводятся в виде управляющих символов или в числовом формате. Этот параметр приводит к тому, что при выводе символов будет использоваться полный набор символов дисплея IBM.
                  d Целое число выводится в виде десятичного значения.
                  f[#] Формат с плавающей точкой с заданным числом цифр.
                  Если вы не задаете число цифр, то используется столько цифр, сколько необходимо.
                  m Выражение со ссылкой на память выводится в виде
                  шестнадцатиричных байт.
                  md Выражение со ссылкой на память выводится в виде
                  десятичных байт.
                  P Выводится необработанное значение указателя, показывающее сегмент, как имя регистра (если это возможно). Показывается также объект, на который указатель ссылается. Если управление форматом не задано, то это используется по умолчанию.
                  s Выводится массив или указатель на массив символов
                  (строка, заключенная в кавычки). Строка завершается нулевым символом.
                  x или h Целое выводится в виде шестнадцатиричного значения.

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


                  Списки дочерних окон


                  Вы задаете родителя интерфейсного элемента во время его
                  конструирования. Родительский оконный объект является параметром
                  конструктора интерфейсного объекта. Дочерний оконный объект хранит в своем элементе данных Parent адрес своего родительского
                  оконного объекта как указатель на этот объект. Он также автоматически сохраняет адреса своих дочерних оконных объектов в частном
                  элементе данных ChildList.
                  Получить доступ к дочерним окнам объекта вы можете с помощью
                  функций-итераторов. Функции элементы ForEach и FirstThat получают
                  в качестве первого аргумента указатель на функцию. Подробнее о
                  них рассказывается ниже.


                  Список операций


                  Список операций определяет, какие действия должна выполнять
                  утилита TLIB. Он состоит из последовательности заданных одна за
                  другой операций. Каждая операция состоит из одно- или двухсимвольного обозначения операции, за которым следует имя файла или имя модуля. Пробельные символы могут окружать либо обозначение операции, либо имя файла или модуля, но их нельзя использовать в
                  середине двухсимвольного обозначения операции или внутри имени.
                  В командной строке можно указывать любое число операций но
                  суммарная длина строки не должна превышать предел в 127 символов,
                  установленный в DOS (в COMMAND.COM). Порядок следования операций
                  не имеет значения. Утилита TLIB всегда выполняет операции в следующем порядке:
                • Сначала выполняются все операции извлечения.

                • Затем выполняются все операции удаления.

                • И, наконец, выполняются все операции добавления.

                • Замена какого-либо модуля может быть произведена путем удаления его с последующим добавлением заменяющего модуля.
                  Утилита TLIB распознает три символа действия (-, + и *), которые могут использоваться самостоятельно или объединенными в пары, образуя в совокупности пять различных операций. Для тех операций, в которых используются пары символов, порядок расположения символов не играет роли. Обозначения операций и выполняемые этими
                  операциями действия указаны ниже (для создания библиотеки, добавьте модули к библиотеке, которая еще не существует):

                  Символ Имя Описание действия
                  + Добавление Утилита TLIB добавляет заданный файл в библиотеку. Если расширение имени файла не задается, то подразумевается расширение .OBJ. Если сам файл является библиотекой (с расширением .LIB), то в результате выполнения операции все модули указанной библиотеки будут добавлены в полученную в результате библиотеку. Если добавляемый модуль уже существует, то TLIB отображает сообщение, но не добавляет новый модуль.
                  - Удаление Утилита TLIB удаляет заданный модуль из библиотеки. Если этот модуль в библиотеке не существует, то TLIB отображает сообщение. Операция удаления требует задания только имени модуля. TLIB допускает ввод полного имени маршрута с указанием имени дисковода и расширения, но игнорирует все, за исключением имени модуля.
                  * Извлечение Утилита TLIB создает заданный файл путем копирования соответствующего модуля из библиотеки в файл. Если этот модуль не существует, то TLIB отображает сообщение, но файла не создает. Если файл с заданным именем уже существует, то он затирается, а на его место записывается новый.
                  -*
                  *-
                  Извлечение и удаление Утилита TLIB копирует заданный модуль в файл с соответствующим именем, а затем удаляет его из библиотеки. Данная операция представляет собой сокращенный путь для последовательного выполнения операции извлечения с последующей операцией удаления.
                  -+
                  +-
                  Замена Утилита TLIB заменяет заданный модуль на соответствующий файл. Данная операция представляет собой сокращенный путь для последовательного выполнения операции удаления с последующей операцией добавления.

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


                  Справочная библиотека по функциям для DOS



                  absread Читает секторы диска с абсолютной адресацией
                  #include
                  int absread(int drive, int nsects, long lsect,
                  void *buffer);
                  abswrite Записывает секторы диска с абсолютной адресацией
                  #include
                  int abswrite (int drive,int nsects,int lsect,
                  void *buffer);
                  allocmem, _dos_allocmem Выделяет сегмент памяти DOS
                  #include
                  int allocmem(unsigned size, unsigned *segp);
                  unsigned _dos_allocmem(unsigned size,
                  unsigned *segp);
                  bioscom Выполняет последовательный ввод/вывод
                  #include
                  int bioscom(int cmd, char abyte, int port);
                  _bios_ disk Запрашивает дисковые операции BIOS
                  #include
                  insigned _bios_disk(unsigned cmd,
                  struct diskinfo_t*dinfo);
                  biosdisk Вызывает дисковые операции BIOS
                  #include
                  int biosdisk(int cmd, int drive, int head,
                  int track, int sector, int nsects,
                  void *buffer);
                  bioskey Интерфейс клавиатуры, напрямую использующий
                  операции BIOS
                  #include
                  int bioskey(int cmd);
                  _bios_keybrd Интерфейс клавиатуры, напрямую использующий
                  операции BIOS
                  #include
                  unsigned _bios_keybrd(unsigned cmd);
                  biosprint Управляет вводом/выводом принтера при помощи
                  BIOS
                  #include
                  int biosprint(int cmd,int abyte,int port);
                  _bios_printer Управляет вводом-выводом принтера при помощи
                  BIOS
                  #include
                  unsigned _bios_printer(int cmd,int port,
                  int abyte);
                  _bios_serialcom Выполняет последовательный ввод-вывод
                  #include
                  unsigned _bios_serialcom(int cmd,
                  int port, char abyte);
                  brk Изменяет объем памяти, выделенный для сегмента
                  данных
                  #include
                  int brk(void *addr);
                  coreleft Возвращает размер свободной оперативной памяти
                  в крохотной (tiny), малой (small) и средней
                  (medium) моделях памяти:
                  #include
                  unsigned coreleft(void);
                  в компактной (compact), большой(large) и огром-
                  ной (huge) моделях памяти:
                  #include
                  unsigned long coreleft(void);
                  delay Приостанавливает выполнение программы на заданный интервал (в миллисекундах)
                  #include
                  void delay(unsigned milliseconds);
                  farcoreleft Возвращает размер свободной памяти в куче с
                  дальней адресацией
                  #include
                  unsigned long farcoreleft(void);
                  farheapcheck Пpосматривает и проверяет кучу с дальней адресацией
                  #include
                  int farheapcheck(void);
                  farheapcheckfree Проверяет свободные блоки кучи c дальней адресацией на постоянное значение
                  #include
                  int fsrheapcheckfree (unsigned int fillvalue)
                  farheapchecknode Просматривает и проверяет отдельный узел кучи
                  с дальней адресацией
                  #include
                  int farheapchecknode (void *node)
                  farheapfillfree Заполняет свободные блоки кучи с дальней адресацией определенным значением
                  #include
                  int farheapfillfree (unsigned int fillvalue)
                  farheapwalk Используется для перемещения по куче с дальней
                  адресацией от узла к узлу
                  #include
                  int farheapwolk(struct farheapinfo *hi)
                  freemem,_dos_freemem Освобождает предварительно выделенный блок памяти DOS
                  #include
                  int freemem(unsigned segx);
                  unsigned _dos_freemem(unsigned segx);
                  harderr,hardresume,hardreth Устанавливает и обрабатывает аппаратную ошибку подпрограммы взаимодействия с внешним устройством
                  #include
                  void harderr(int(*handler)());
                  void hardresume(int axret);
                  void hardreth(int retn);
                  _harderr Устанавливает обработчик аппаратной ошибки
                  #include
                  void _harderr(int (far *handler)());
                  _hardresume Функция обработки ошибок аппаратуры
                  #include
                  void _hardresume(int rescode);
                  _hardretn Функция обработки ошибки аппаратуры
                  #include
                  void _hardretn(int retn);
                  keep,_dos_keep Осуществляет выход в DOS, оставляя программу
                  резидентной
                  #include
                  void keep(unsigned char status,
                  unsigned size);
                  void _dos_keep(unsigned char status,
                  unsigned size);
                  nosound Отключает динамик компьютера
                  #include
                  void nosound(void);
                  _OvrInitEms Инициализирует систему подкачки отображаемой
                  памяти для программы менеджера оверлеев
                  #include
                  int cdecl far _OvrlnitEms (unsigned emsHandle,
                  unsigned fistPage,
                  unsigned pages);
                  _OvrlnitExt Инициализирует систему подкачки отображаемой
                  памяти для программы менеджера оверлеев
                  #include
                  int cdecl far _OvrlnitExt(unsigned long
                  startAddress, unsigned long length);
                  randbrd Чтение произвольного блока
                  #include
                  int randbrd(struct fcb *fcb, int rcnt);
                  randbwr Запись произвольного блока
                  #include
                  int randbwr (struct fcb *fcb, int rcnt);
                  sbrk Изменяет размещение сегмента данных
                  #include
                  void *sbrk(int incr);
                  setblock
                  _dos_setblock
                  Изменяет размер предварительно распределенной
                  области памяти
                  #include
                  int setblock(unsigned segx, unsigned newsize);
                  unsigned_dos_setblock(unsigned newsize,
                  unsigned segx,unsigned *maxp);
                  sound Устанавливает динамик на заданную частоту
                  #include
                  void sound(unsigned frequency);



                  Справочная библиотека по графическим функциям DOS



                  arc Рисует дугу
                  #include
                  void far arc (int x, int y, int stangle,
                  int endangle, int radius);
                  bar Рисует двумерную полосу
                  #include
                  #include
                  void far bar(int left, int top, int right,
                  int bottom);
                  bar3d Рисует трехмерный столбец
                  #include
                  void far bar3d (int left, int top, int right,
                  int bottom, int depth, int topflag);
                  circle Вычерчивает окружность заданного радиуса из заданного центра
                  #include
                  void far circle(int x, int y, int radius);
                  cleardevice Очищает графический экран
                  #include
                  void far cleardevice(void);
                  clearviewport Очищает текущее окно (viewport)
                  #include
                  void far clearviewport(void);
                  closegraph Завершает работу с графической системой
                  #include
                  void far closegraph(void);
                  detectgraph Определяет путем проверки аппаратуры - какой
                  графический драйвер и режим использовать
                  #include
                  void far detectgraph(int far *graphdriver,
                  int far *graphmode);
                  drawpoly Вычерчивает контур многоугольника
                  #include
                  void far drawpoly(int numpoints,
                  int far *polypoints);
                  ellipse Рисует эллиптическую дугу
                  #include
                  void far ellipse(int x, int y, int stangle,
                  int endangle, int xradius, int yradius);
                  fillellipse Чертит и закрашивает эллипс
                  #include
                  void far fillellipse(int x, int y, int xradius,
                  int yradius);
                  fillpoly Вычерчивает и закрашивает многоугольник
                  #include
                  void far fillpoly(int numpoints,
                  int far *polypoints);
                  floodfill Заполняет методом "лавины" ограниченную область
                  #include
                  void far floodfill(int x, int y, int border);
                  getarccoords Возвращает координаты последнего обращения к
                  функции arc
                  #include
                  void far getarccoords(struct arccoordstype
                  far *arccoords);
                  getaspectratio Возвращает коэффициент сжатия текущего графиче-
                  ского режима
                  #include
                  void far getaspectratio(int far *xasp,
                  int far *yasp);
                  getbkcolor Возвращает текущий цвет фона
                  #include
                  void far getbkcolor(void);
                  getcolor Возвращает текущий цвет рисования
                  #include
                  int far getcolor(void);
                  getdefaultpalette Возвращает структуру определения палитры
                  #include
                  struct palettetype *far getdefaultpalette(void)
                  getdrivername Возвращает указатель на строку, содержащую имя
                  текущего графического драйвера
                  #include
                  char *far getdrivername(void)
                  getfillpattern Копирует в память описанный пользователем шаблон заполнения
                  #include
                  void far getfillpattern(char far *pattern);
                  getfillsettings Получает информацию о текущих шаблоне и цвете
                  заполнения
                  #include
                  void far getfillsettings(struct
                  fillsettingstype far *fillinfo);
                  getgraphmode Возвращает текущий графический режим
                  #include
                  int far getgraphmode(void);
                  getimage Сохраняет битовый образ некоторой области экрана в памяти
                  #include
                  void far getimage(int left, int top, int right,
                  int bottom, void far *bitmap);
                  getlinesettings Получает текущий тип линии, шаблон и толщину
                  #include
                  void far getlinesettings(struct
                  linesettingstype far *lineinfo);
                  getmaxcolor Возвращает максимальное значение цвета, которое
                  можно передать функции setcolor
                  #include
                  int far getmaxcolor(void);
                  getmaxmode Возвращает максимальный номер режима для текущего драйвера
                  #include
                  int far getmaxmode(void);
                  getmaxx Возвращает максимальную координату экрана по x
                  #include
                  int far getmaxx(void);
                  getmaxy Возвращает максимальную координату экрана по y
                  #include
                  int far getmaxy(void)
                  getmodename Возвращает указатель на строку, содержащую имя
                  заданного графического режима
                  #include
                  char *far getmodename(int mode_number);
                  getmoderange Получает диапазон режимов для заданного графического драйвера
                  #include
                  void far getmoderange(int graphdriver,
                  int far *lomode, int far *himode);
                  getpalette Получает информацию о текущей палитре
                  #include
                  void far getpalette(struct palettetype far
                  *palette);
                  getpalettesize Возвращает размер таблицы просмотра цветов палитры
                  #include
                  int far getpalettesize(void);
                  getpixel Возвращает цвет заданной точки
                  #include
                  unsigned far getpixel(int x, int y);
                  gettextsettings Получает информацию о текущем графическом текстовом шрифте
                  #include
                  void far gettextsettings(struct textsettingstype
                  far *texttypeinfo);
                  getviewsettings Получает информацию о текущем окне (viewport)
                  #include
                  void far getviewsettings(struct viewporttype
                  far *viewport);
                  getx Возвращает координату x текущей графической позиции
                  #include
                  int far getx(void);
                  gety Возвращает координату y текущей графической позиции
                  #include
                  int far gety(void);
                  graphdefaults Сбрасывает все графические параметры в их значения по умолчанию
                  #include
                  void far graphdefaults(void);
                  grapherrormsg Возвращает указатель на строку сообщения об
                  ошибке
                  #include
                  char *far grapherrormsg(int errorcode);
                  _graphfreemem Подключает функции пользователя для освобождения графической памяти
                  #include
                  void far _graphfreemem(void far *ptr,
                  unsigned size);
                  _graphgetmem Подключает функции пользователя для освобождения графической памяти
                  #include
                  void far *far _graphgetmem(unsigned size);
                  graphresult Возвращает код ошибки последней неудачной графической операции
                  #include
                  int far graphresult(void);
                  imagesize Возвращает количество байт, необходимых для
                  хранения битового образа
                  #include
                  unsigned far imagesize(int left, int top,
                  int right, int bottom);
                  initgraph Инициализирует графическую систему
                  #include
                  void far initgraph(int far *graphdriver,
                  int far *graphmode,
                  char far *pathtodriver);
                  installuserdriver Устанавливает дополнительный драйвер устройства
                  в таблицу драйверов устройства BGI
                  #include
                  int far installuserdriver( char far *name,
                  int huge (*detect)(void));
                  installuserfont Загружает шрифтовый файл (.CHR), который не
                  встроен в систему BGI
                  #include
                  int far installuserfont(char far *name);
                  line Вычерчивает линию между двумя заданными точками
                  #include
                  void far line(int x1, int y1, int x2, int y2);
                  linerel Чертит линию на заданное расстояние от текущей
                  позиции (CP)
                  #include
                  void far linerel(int dx, int dy);
                  lineto Чертит линию от текущей позиции (CP) в точку
                  (x,y)
                  #include
                  void far lineto(int x, int y);
                  moverel Перемещает текущую позицию (CP) на заданное относительное расстояние
                  #include
                  void far moverel(int dx,int dy);
                  moveto Перемещает текущую позицию (СР) в точку (x,y)
                  #include
                  void far moveto(int x,int y);
                  outtext Выводит строку в окно (viewport)
                  #include
                  void far outtext(char far *textstring);
                  outtextxy Выводит строку в указанной области
                  #include
                  void far outtextxy(int x, int y,
                  char far *textstring);
                  pieslice Вычерчивает и заполняет сектор круга
                  #include
                  void far pieslice(int x, int y, int stangle,
                  int endangle, int radius);
                  putimage Выводит на экран битовый образ
                  #include
                  void far putimage(int left, int top,
                  void far *bitmap, int op);
                  putpixel Выводит пиксель в заданной точке экрана
                  #include
                  void far putpixel(int x, int y,int color);
                  rectangle Вычерчивает прямоугольник
                  #include
                  void far rectangle(int left, int top,
                  int right,int bottom);
                  registerbgidriver Связывает загруженный пользователем или
                  встроенный в систему драйвер графической
                  системы с самой графической системой
                  #include
                  int registerbgidriver(void (*driver)(void));
                  registerbgifont Регистрирует скомпонованные коды шрифта
                  #include
                  int registerbgifont(void (*font)(void));
                  restorecrtmode Восстанавливает режим монитора таким, каким он
                  был до вызова initgraph
                  #include
                  void far restorecrtmode(void);
                  sector Вычерчивает и заполняет сектор эллипса
                  #include
                  void far sector(int x, int y,
                  int stangle, int endangle,
                  int xradius, int yradius);
                  setactivepage Устанавливает активную для графического вывода
                  страницу
                  #include
                  void far setactivepage(int page);
                  setallpalette Изменяет все цвета палитры на заданные
                  #include
                  void far setallpalette(struct palettetype
                  far *palette);
                  setaspectratio Изменяет значение по умолчанию коэффициента
                  сжатия
                  #include
                  void far setaspectratio(int xasp, int yasp);
                  setbkcolor Устанавливает текущий цвет фона, используя
                  палитру
                  #include
                  void far setbkcolor(int color);
                  setcolor Устанавливает текущий цвет вычерчивания,
                  используя палитру
                  #include
                  void far setcolor(int color);
                  setfillpattern Устанавливает определенный пользователем шаблон
                  заполнения
                  #include
                  void far setfillpattern(char far *upattern,
                  int color);
                  setfillstyle Устанавливает шаблон и цвет заполнения
                  #include
                  void far setfillstyle(int pattern, int color);
                  setgraphbufsize Изменяет размер внутреннего графического буфера
                  #include
                  unsigned far setgraphbufsize(unsigned bufsize);
                  setgraphmode Переводит систему в графический режим и очищает
                  экран
                  #include
                  void far setgraphmode(int mode);
                  setlinestyle Устанавливает текущие толщину и тип линии
                  #include
                  void far setlinestyle(int linestyle, unsigned
                  apattern, int thickness);
                  setpalette Изменяет один цвет палитры
                  #include
                  void far setpalette(int colornum, int color);
                  setrgbpalette Позволяет пользователю определять цвета для
                  IBM 8514
                  #include
                  void far setrgbpalette(int clornum,int red,
                  int green,int blue);
                  settextjustify Выравнивает строки текста для графических
                  функций
                  #include
                  void far settextjustify(int horiz, int vert);
                  settextstyle Устанавливает текущие текстовые характеристики
                  для графического вывода
                  #include
                  void far settextstyle(int font, int direction,
                  int charsize);
                  setusercharsize Задает пользовательский коэффициент увеличения
                  ширины и высоты символов для штриховых шрифтов
                  #include
                  void far setusercharsize(int multх, int divх,
                  int multy, int divy);
                  setviewport Устанавливает для графического вывода текущее
                  графическое окно
                  #include
                  void far setviewport(int left, int top, int
                  right, int bottom, int clip);
                  setvisualpage Устанавливает номер отображаемой страницы
                  #include
                  void far setvisualpage(int page);
                  setwritemode Устанавливает режим записи для рисуемой линии в
                  графическом режиме
                  #include
                  void far setwritemode(int mode);
                  textheight Возвращает высоту строки в точках растра
                  #include
                  int far textheight(char far *textstring);
                  textwidth Возвращает ширину строки в точках растра
                  #include
                  int far textwidth(char far *textstring);



                  Справочная библиотека по языку Borland C++


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


                  Справочная информация по программированию


                  Примечание: настоящий раздел представляет собой сводный обзор основных правил, обычно, используемых для написания программы, и обзор некоторых тем, часто необходимых в качестве справочного материала. Более строгую информацию можно найти в руководстве по Borland C++ 4.0 или в быстрой интерактивной помощи Help. В основном информация этого раздела применима и для Турбо С++ и Borland C++ 4.0.
                  Версия 4.0 Borland C++ поможет вам создавать 16- и 32-битовые приложения для операционных систем Chicago и Windows NT. Это очень гибкая и открытая среда разработчика, обеспечивающая простое взаимодействие с ней. Интегрированная среда Borland C++ обладает по-настоящему открытой архитектурой и имеет большой набор
                  инструментов визуального программирования.
                  Такие новые возможности, как обработка исключительных ситуаций, интегрированный отладчик графического пользовательского интерфейса (GUI), клавиатурная эмуляция и собственный текстовый редактор Borland (Brief) делают версию более гибкой. В Borland C++ реализован очень гибкий доступ к утилитам. В частности, эта среда
                  позволяет программистам приспособить под свои нужды панель инструментальных средств.
                  В Borland C++ 4.0 предлагаются графические меню, подобные
                  используемым в Quattro Pro и Paradox. При нажатии правой кнопки
                  "мыши" появляется панель с другим набором инструментальных средств программирования.
                  В исключительных ситуациях версия 4.0 перехватывает и распознает ошибки, позволяя программистам аккуратно выходить из любого затруднения. Новая версия включает в себя Object Windows 2.0 - объектно-ориентированную библиотеку, поддерживающую 32-разрядное программирование и перенос приложений между 16- и 32-разрядным режимом Windows.
                  Работа компилятора Borland C++ начинается с просмотра текста
                  программы препроцессором, который ищет в нем специальные директивы. Например, директива #include <включаемый_файл> добавляет (или включает) в программу перед фазой компиляции содержимое файла <включаемый_файл>. Препроцессор также выполняет расширение любых обнаруженных в программах или файлах включений макрокоманд.
                  Ниже, в справочных таблицах, даются наиболее важные сведения
                  по конкретной реализации С++ фирмы Borland. Начинаются они с перечня ключевых слов, которые не должны использоваться в качестве обычных имен идентификаторов.


                  Справочник по функциям Borland С++



                  abort Экстренно завершает программу
                  DOS UNIX Win16 #include
                  OS/2 Win32 void abort(void);
                  ANSI C++ ANSI C
                  abs Вычисляет абсолютное значение целочисленного аргумента
                  DOS UNIX Win16 #include
                  OS/2 Win32 int abs(int x)
                  ANSI C++ ANSI C
                  access Определяет доступность файла
                  DOS UNIX Win16 #include
                  OS/2 Win32 int access(const char *filename,int amode);
                  acos, acosl Вычисляет арккосинус
                  acos #include
                  double acos(double x);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  acosl #include
                  long double acosl(long double x);
                  DOS Win16
                  OS/2 Win32
                  alloca Выделяет временную область стека
                  DOS UNIX Win16 #include
                  OS/2 Win32 void *alloca(size_t size);
                  asctime Преобразует дату и время в формат ASCII
                  DOS UNIX Win16 #include
                  OS/2 Win32 char *asctime(const struct tm *tblock);
                  ANSI C++ ANSI C
                  asin, asinl Вычисляет арксинус
                  asin #include
                  double asin(double x);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  asinl #inclyde
                  long double asinl(long double x);
                  DOS Win16
                  OS/2 C++ Win32
                  assert Проверяет условия и прерывает, при необходимости, выполнение программы
                  DOS UNIX Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C void assert(int test);
                  atan,atanl Вычисляет арктангенс
                  atan #include
                  double atan(double x)
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  atanl #include
                  long double atanl(long double x);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  atan2, atan2l Вычисляет арктангенс y/x
                  atan2 #include
                  double atan2(double y, double x);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  atan2l #include
                  long double atan2l(long double y,
                  DOS UNIX Win16 long double x);
                  OS/2
                  atexit Регистрирует функцию выхода
                  DOS Win16 #include
                  OS/2 Win32 int atexit(_USERENTRY * func)(void));
                  ANSI C++ ANSI C
                  atof, _atold Преобразует строку в число с плавающей точкой
                  atof #include
                  double atof(const char *s);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  _atold #include
                  long double _atold(const char *s);
                  DOS Win16
                  OS/2 Win32
                  atoi Преобразует строку в число типа integer
                  DOS UNIX Win16 #include
                  OS/2 Win32 int atoi(const char *s);
                  ANSI C++ ANSI C
                  atol Преобразует строку в число типа long
                  DOS UNIX Win16 #include
                  OS/2 Win32 long atol(char *s);
                  ANSI C++ ANSI C
                  _atold смотpи atof
                  bdos Обеспечивает доступ к системным вызовам DOS
                  DOS Win16 #include
                  int bdosptr(int dosfun,void *argument,
                  unsigned dosal);
                  bdosptr Обеспечивает доступ к системным вызовам DOS
                  DOS UNIX Win16 #include
                  OS/2 int bdosptr(int dosfun, void *argument,
                  unsigned dosal);
                  _beginthread Начинает обработку новой последовательности
                  #include
                  OS/2 C++ Win32 unsigned long _begihthread (_USERENTRY
                  (*start_adress)(void *),unsigned stack_size,
                  void *arglist)
                  _beginthreadNT Начинает обработку новой последовательности
                  под WindowsNT
                  Win32 #include
                  unsigned long _beginthreadNT (void(_USENTRY *
                  start_adress) (void *),unsigned stack_size,
                  void *arglist, void *security_attrib,
                  unsignet long create_fiagss, unsigned
                  long *thead_id);
                  biosequip Проверяет оборудование
                  DOS Win16 #include
                  int biosequip(void);
                  _bios_equiplist Проверяет оборудование
                  DOS Win16 #include
                  unsigned _bios_equiplist(void);
                  bioskey Интерфейс клавиатуры, напрямую использующий
                  операции BIOS
                  DOS Win16
                  #include
                  int bioskey(int cmd);
                  biosmemory Возвращает размер памяти
                  DOS Win16 #include
                  int biosmemory(void);
                  _bios_memsize Возвращает размер памяти
                  DOS Win16 #include
                  unsigned _bios_memsize(void);
                  biostime Читает или устанавливает таймер BIOS
                  DOS Win16 #include
                  long biostime(int cmd, long newtime);
                  _bios_timeofday Читает или устанавливает таймер BIOS
                  DOS Win16 #include
                  unsigned _bios_timeofday(int cmd,long *timep);
                  bsearch Осуществляет двоичный поиск в массиве
                  DOS UNIX Win16 #include
                  OS/2 Win32 void *bsearch(const void *key,const void *base,
                  ANSI C++ ANSI C size_t nelem, size_t width,
                  int (_USERENTRY *fсmp)(const void *,
                  const void *));
                  cabs, cabsl Вычисляет абсолютные значения комплексного
                  числа
                  cabs #include
                  DOS UNIX Win16 double cabs(struct complex z); D
                  OS/2 Win32
                  ---***---
                  cabcl #include
                  DOS Win16 long double cabsl(struct _complexl z);
                  OS/2 Win32
                  calloc Выделяет оперативную память
                  DOS UNIX Win16 #include
                  Win32 ANCI C void *calloc(size_t nitems, size_t size);
                  ANCI C++ OS/2
                  ceil, ceill Округляет значение аргумента в большую сторону
                  ceil #include
                  double ceil(double x);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  ceill #include
                  long double ceill(long double x);
                  DOS Win16
                  Win32 OS/2
                  _c_exit Освобождает системные ресурсы (как _exit), но
                  не завершает программу.
                  DOS Win16
                  OS/2 Win32 #include
                  void _c_exit(void);
                  _cexit Освобождает системные pесуpсы
                  но не завеpшает пpогpамму.
                  DOS Win16 #include
                  OS/2 Win32 void _cexit(void)
                  cgets Считывает строку с консоли
                  DOS #include
                  OS/2 Win32 char *cgets(char *str);
                  _chain_intr Обеспечивает связь с новым обработчиком
                  прерываний
                  DOS Win16 #include
                  void _chain_intr(void(interrupt
                  far *newhandler)());
                  chdir Изменяет текущий каталог
                  DOS UNIX Win16 #include
                  OS/2 Win32 int chdir (const char *path);
                  _chdrive Устанавливает текущий диск
                  DOS Win16 #include
                  OS/2 Win32 int _chdrive(int drive);
                  _chmod смотpи _rtl_chmod

                  Изменяет атрибуты файла DOS
                  chmod Изменяет режим доступа к файлу
                  DOS UNIX Win16 #include
                  OS/2 Win32 int chmod(const char *path, int amode);
                  chsize Изменяет размер файла
                  DOS Win16 #include
                  OS/2 Win32 int chsize(int handle, long size);
                  _clear87 Очищает слово состояния операций с плавающей
                  точкой
                  DOS Win16
                  OS/2 Win32 #include
                  clearerr Сбрасывает индикацию ошибки
                  DOS UNIX Win16 #include
                  OS/2 Win32 void clearerr(FILE *stream);
                  ANSI C++ ANSI C
                  clock Определяет процессорное время
                  DOS Win16 #include
                  OS/2 Win32 clock_t clock(void);
                  ANSI C++ ANSI C
                  _close Смотpи _rtl_close

                  Закрывает файл
                  close Закpывает файл
                  DOS Win16 UNIX #include
                  OS/2 Win32 int close(int handle);
                  closedir Закрывает поток ввода-вывода каталога
                  DOS UNIX Win16 #include
                  OS/2 C++ Win32 void closedir(DIR *dirp);
                  clreol Очищает конец строки в текстовом окне
                  DOS Win16 #include
                  OS/2 Win32 void clreol(void);
                  clrscr Очищает окно в текстовом режиме
                  DOS Win16 #include
                  OS/2 Win32 void clrscr(void);
                  complex conj(complex x);
                  _control87 Манипулирует словом управления операций с плавающей точкой
                  DOS Win16 #include
                  OS/2 Win32 unsigned int _control87(unsigned int newcw,
                  unsigned int mask);
                  cos, cosl Вычисляет косинус
                  cos Вещественная версия
                  #include
                  DOS UNIX Win16 double cos(double x);
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  cosl #include
                  long double cosl(long double x);
                  DOS Win16
                  OS/2 Win32
                  cosh, coshl Вычисляет гиперболический косинус
                  cosh #include
                  double cosh(double x);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  coshl #include
                  long double coshl(long double x);
                  DOS Win16
                  OS/2 Win32
                  country Возвращает информацию, зависящую от страны
                  DOS Win16 #include
                  OS/2 struct country *country(int xcode, struct
                  COUNTRY *cp);
                  cprintf Осуществляет форматированный вывод на экран
                  DOS #include
                  OS/2 Win32 int cprintf(const char *format[,аргумент,...]);
                  cputs Выводит строку на экран
                  DOS #include
                  OS/2 Win32 int cputs(const char *str);
                  _creat Смотpи _rtl_crerat
                  creat Создает новый файл или перезаписывает
                  существующий
                  DOS UNIX Win16 #include
                  OS/2 Win32 int creat(const char *path, int amode);
                  creatnew Создает новый файл
                  DOS Win16 #include
                  OS/2 Win32 int creatnew(const char *path, int mode);
                  creattemp Создает уникальный файл в каталоге, определенном в маршруте
                  DOS Win16 #include
                  OS/2 Win32 int creattemp(char *path, int attrib);
                  _crotl,_crotr Пеpевоpачивает и изменяет символы в
                  пеpеменных налево или напpаво.
                  DOS Win16 #include
                  OS/2 Win32 unsigned char _crotl(unsigned char val,
                  int count)
                  unsigned char _crotr(unsigned char val,
                  int count)
                  cscanf Просматривает и форматирует ввод с консоли
                  DOS Win16 #include
                  OS/2 Win32 int cscanf(char *format[,адрес,...]);
                  ctime Преобразует дату и время в строку
                  DOS UNIX Win16 #include
                  OS/2 Win32 char *ctime(const time_t *time);
                  ANSI C++ ANSI C
                  ctrlbrk Устанавливает программу обработки Ctrl/Break
                  DOS Win16 #include
                  Win32 void ctrlbrk(int (*handler)(void));
                  cwait Заканчивает пpиостановку подпpогpамм
                  OS/2 Win32 #include
                  int cwit(int *statloc, int pid, int
                  action);
                  delline Удаляет строку в текстовом окне
                  DOS Win16 #include
                  OS/2 Win32 void delline(void);
                  difftime Вычисляет разницу между двумя моментами времени
                  DOS UNIX Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C double difftime(time_t time2, time_t time1);
                  disable, _disable, enable, _enable
                  Запрещает и разрешает прерывания
                  DOS Win16
                  Win32 #include
                  void disable(void);
                  void _disable(void);
                  void enable(void);
                  void _enable(void);
                  div Делит два целых числа, возвращая частное и остаток
                  DOS Win16
                  OS/2 Win32 #include
                  ANSI C++ ANSI C div_t div(int numer, int denom);
                  _dos_close Закрывает файл
                  DOS Win16 #include
                  OS/2 C++ Win32 unsigned _dos_close(int handle);
                  _dos_commit Записывает файл на диск
                  DOS Win16 #include
                  unsigned _dos_commit(int handle);
                  _dos_creat Создает новый файл на месте уже существующего
                  DOS Win16 #include
                  OS/2 unsigned _dos_creat (const shar *path,int
                  attrib,int *handhelp);
                  _dos_creatnew Cоздает новый файл
                  DOS Win16 #include
                  OS/2 unsigned _dos_creatnew(const char *path,
                  int attrib,int *handlep);
                  dosexterr Получает расширенную информацию об ошибке DOS
                  DOS Win16 #include
                  int dosexterr(struct DOSERROR *eblkp);
                  _dos_findfirst Выполняет поиск в каталоге диска
                  DOS Win16 #include
                  OS/2 unsigned _dos_findfirst(const char
                  *pathname, int attrib,struct find_t
                  *ffblk);
                  _dos_findnext Продолжает поиск, начатый _dos_findfirst
                  DOS Win16 #include
                  OS/2 unsigned _dos_findnext(struct find_t
                  *ffblk);
                  _dos_getdate, Изменяет системную дату.
                  _dos_setdate,
                  getdate,setdate #include
                  void _dos_getdate(struct dosdate_t *datep);
                  DOS Win16 unsigned _dos _setdate(struct dosdate_t *datep);
                  OS/2 void getdate(struct date *datep);
                  void setdate(struct date *datep);
                  _dos_getdiskfree Определяет свободное пространство на диске
                  DOS Win16 #include
                  OS/2 unsigned _dos_getdiskfree(unsigned char
                  drive, struct diskfree_t *dtable);
                  _dos_getdrive, Заменяет текущий диск
                  _dos_setdrive
                  #include
                  DOS Win16 void _dos_getdrive(unsigned *drivep);
                  OS/2 void _dos_setdrive(unsigned drivep,
                  unsigned *ndrives);
                  _dos_getfileattr, Изменяет pежим доступа к файлу.
                  _dos_setfileattr
                  #include
                  DOS Win16 int _dos_getfileattr(const char *path,
                  OS/2 unsigned *attribp);
                  int _dos_setfileattr(const char path,
                  unsigned attrib);
                  _dos_getftime, Изменяет дату и время создания файла
                  _dos_setftime
                  #include
                  DOS Win16 unsigned _dos_getftime(int handle,
                  OS/2 unsigned *datep,unsigned *timep);
                  unsigned _dos_setftime(int handle,
                  unsigned date,unsigned time);
                  _dos_gettime, Изменяет системное время
                  _dos_settime
                  #include
                  DOS Win16 void _dos_gettime(struct dostime_t *timep);
                  OS/2 unsigned _dos_settime(struct dostime_t *timep);
                  _dos_getvect Получает вектор прерывания
                  DOS Win16 #include
                  OS/2 void interrupt(*_dos_getvect(unsigned
                  interruptno)) ();
                  _dos_open Открывает и подготавливает заданный файл для
                  чтения или записи
                  DOS Win16 #include
                  #include
                  #include
                  unsigned _dos_open(const char *filename,
                  unsigned oflags,int *handlep);
                  _dos_read Считывает данные из файла
                  DOS Win16 #include
                  OS/2 unsigned _dos_read(int handle,void
                  far *buf, unsigned *nread);
                  _dos_setdate Смотpи _dos_getdate
                  _dos_setdrive Смотpи _dos_getdrive
                  _dos_setfileattr Смотpи _dos_getfileattr
                  _dos_setftime Смотpи _dos_setftime
                  _dos_gettime Смотpи _dos_gettime
                  _dos_setvect Устанавливает значение вектоpа прерывания
                  DOS UNIX Win16 #include
                  void _dos_setvect(unsigned interruptno,
                  void iterrupt (*isr) ());
                  dostounix Преобразует дату и время в формат UNIX
                  DOS Win16 #include
                  long dostounix(struct date *d, struct time *t);
                  _dos_write Записывает в файл
                  DOS Win16 #include
                  OS/2 unsigned _dos_write (int handle, const
                  void_ _far *buf,unsigned len unsigned
                  *nwritten);
                  dup Дублирует описатель файла
                  DOS UNIX Win16 #include
                  OS/2 Win32 int dup(int handle);
                  dup2 Дублирует описатель файла (oldhandle) в новый
                  (newhandle)
                  DOS UNIX Win16
                  OS/2 Win32 #include
                  int dup2(int oldhandle,int newhandle);
                  ecvt Преобразует число с плавающей точкой в строку
                  DOS UNIX Win16 #include
                  OS/2 Win32 char *ecvt(double value, int ndig, int
                  *dec, int *sign);
                  __emit__ Вставляет литерные значения прямо в объектный
                  код
                  DOS UNIX Win16
                  OS/2 Win32 #include
                  void __emit__(аргумент,...);
                  enable,_enable Смотpи disable
                  _endtfread Заканчивает обpаботку подпpогpаммы
                  #include
                  OS/2 Win32 void _endthread (void);
                  eof Контролирует достижение конца файла
                  DOS Win16 #include
                  OS/2 Win32 int eof(int handle);
                  exec... Загружает и выполняет другие программы
                  DOS #include
                  OS/2 Win32 int execl(char *path, char *arg0,*arg1,...,
                  *argn, NULL );
                  int execle(char *path, char
                  *arg0,*arg1,..., *argn, NULL,
                  char **env);
                  int execlp(char *path, char *arg0,*arg1,...,
                  *argn, NULL );
                  int execlpe(char *path, char *arg0,*arg1,...,
                  *argn, NULL, char **env);
                  int execv(char *path, char *arg[]);
                  int execve(char *path, char *arg[],char **env);
                  int execvp(char *path, char *arg[]);
                  int execvpe(char *path,char *arg[],char **env);
                  _exit Завершает выполнение программы
                  DOS UNIX Win16 include
                  OS/2 Win32 void _exit(int status);
                  exit Завершает выполнение программы
                  DOS UNIX Win16 #include
                  OS/2 Win32 void exit(int status);
                  ANSI C++ ANSI C
                  exp, expl Вычисляет экспоненту (е в степени х)
                  exp #include
                  double exp(double x);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  expl #include
                  long double expl(long double x);
                  DOS Win16
                  OS/2 Win32
                  _expand Пpоизводит сжатие нескольких блоков
                  #inclue
                  OS/2 Win32 void *_expand(void *block, size_t size);
                  fabs, fabsl Определяет абсолютное значение числа с плавающей точкой
                  fabs #include
                  double fabs(double x);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ----***---
                  fabsl #include
                  long double fabls(long double x);
                  DOS Win16
                  OS/2 Win32
                  farcalloc Выделяет память из кучи c дальней адpесацией
                  DOS Win16 #include
                  OS/2 void far *farcalloc(unsigned long nunits,
                  unsigned long unitsz);
                  farfree Освобождает блок из кучи с дальней адpесацией
                  DOS Win16 #include
                  void farfree(void far *block);
                  farmalloc Выделяет память в куче с дальней адресацией
                  DOS Win16 #include
                  void far *farmalloc(unsigned long
                  nbytes);
                  farrealloc Регулирует размер блока в куче с дальней адресацией
                  DOS Win16
                  OS/2 #include
                  void far *farrealloc(void far *oldblock,
                  unsigned long nbytes);
                  fclose Закрывает поток
                  DOS UNIX Win16 #include
                  OS/2 Win32 int fclose(FILE *stream);
                  ANSI C++ ANSI C
                  fcloseall Закрывает открытые потоки
                  DOS UNIX Win16 #include [
                  OS/2 Win32 int fcloseall(void);
                  fcvt Преобразует число с плавающей точкой в строку
                  DOS UNIX Win16 #include
                  OS/2 Win32 char *fcvt(double value,int ndig,int *dec,
                  int *sign);
                  fdopen Связывает поток с описателем файла
                  DOS UNIX Win16 #include
                  OS/2 Win32 FILE *fdopen(int handle, char *type);
                  feof Обнаруживает конец файла в потоке
                  DOS UNIX Win16 #include
                  OS/2 Win32 int feof(FILE *stream);
                  ANSI C++ ANSI C
                  ferror Обнаруживает ошибки в потоке
                  DOS UNIX Win16 #include
                  OS/2 Win32 int ferror(FILE *stream);
                  ANSI C++ ANSI C
                  fflush Очищает поток
                  DOS UNIX Win16 #include
                  OS/2 Win32 int fflush(FILE *stream);
                  ANSI C++ ANSI C
                  fgetc Получает символ из потока
                  DOS UNIX Win16 #include
                  OS/2 Win32 int fgetc(FILE *stream);
                  ANSI C++ ANSI C
                  fgetchar Получает символ из потока stdin
                  DOS UNIX Win16 #include
                  OS/2 Win32 int fgetchar(void);
                  ANSI C++ ANSI C
                  fgetpos Получает текущий указатель файла
                  DOS Win16 #include
                  OS/2 Win32 int fgetpos(FILE *stream, fpos_t *pos);
                  ANSI C++ ANSI C
                  fgets Получает строку из потока
                  DOS UNIX Win16 #include
                  OS/2 Win32 char *fgets(char *s, int n, FILE *stream);
                  ANSI C++ ANSI C
                  filelength Получает размер файла в байтах
                  DOS Win16 #include
                  OS/2 C++ Win32 long filelength(int handle);
                  fileno Получает описатель файла
                  DOS UNIX Win16 #include
                  OS/2 Win32 int fileno(FILE *stream);
                  findfirst Выполняет поиск в каталоге диска
                  DOS Win16 #include
                  OS/2 Win32 int findfirst(const char *pathname,
                  struct ffblk *ffblk, int attrib);
                  findnext Продолжает поиск функции findfirst
                  DOS Win16 #include
                  OS/2 Win32 int findnext(struct ffblk *ffblk);
                  floor,floorl Округляет в меньшую сторону
                  floor #include
                  double floor(double x);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  floorl #include
                  long double floorl(long double x);
                  DOS Win16
                  OS/2 Win32
                  flushall Очищает все потоки
                  DOS UNIX Win16 #include
                  OS/2 C++ Win32 int flushall(void);
                  _fmemccpy Смотpи memccpy.
                  _fmemchr Смотpи memchr.
                  _fmemcmp Смотpи memcmp.
                  _fmemcpy Смотpи memcpy.
                  _fmemicmp Смотpи memicmp.
                  _fmemset Смотpи memset.
                  fmod, fmodl Вычисляет x по модулю y, остаток от х/y
                  fmod #include
                  double fmod(double x, double y);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  fmodl #include
                  long double fmodl(long double x,long
                  DOS Win16 double y);
                  OS/2 Win32
                  fnmerge Создает из составных частей полное имя файла
                  DOS Win16 #include
                  OS/2 Win32 void fnmerge(char *path, const char
                  *drive, const char *dir, const char
                  *name, const char *ext);
                  fnsplit Расщепляет полное имя файла на компоненты
                  DOS Win16 #include
                  OS/2 Win32 void fnsplit(char *path, char *drive,
                  char *dir, char *name,
                  char *ext);
                  fopen Открывает поток
                  DOS UNIX Win16 #include
                  OS/2 Win32 FILE *fopen(const char *filename,
                  ANSI C++ ANSI C const char *mode);
                  FP_OFF,FP_SEG Получает смещение или сегмент с дальней адресацией
                  DOS Win16 #include
                  Win32 unsigned FP_OFF(void far *p);
                  unsigned FP_SEG(void far *p);
                  _fpreset Инициализирует заново математический пакет для
                  работы с плавающей точкой
                  DOS Win16 #include
                  OS/2 Win32 void _fpreset(void);
                  fprintf Записывает форматированный вывод в поток
                  DOS UNIX Win16 #include
                  OS/2 Win32 int fprintf(FILE *stream,
                  ANSI C++ ANSI C const char *format[,аргумент,...]);
                  fputc Выводит символ в поток
                  DOS UNIX Win16 #include
                  OS/2 Win32 int fputc(int c, FILE *stream);
                  fputchar Выводит символ в поток stdout
                  DOS UNIX #include
                  OS/2 Win32 int fputchar(int c)
                  ANSI C++
                  fputs Выводит строку в поток
                  DOS UNIX Win16 #include
                  OS/2 Win32 int fputs(const char *s, FILE *stream);
                  ANSI C++ ANSI C
                  fread Cчитывает данные из потока
                  DOS UNIX Win16 #include
                  OS/2 Win32 size_t fread(void *ptr, size_t size,
                  ANSI C++ ANSI C size_t n, FILE *stream);
                  free Освобождает выделенный блок памяти
                  DOS UNIX Win16 #include
                  OS/2 Win32 void free(void *block);
                  ANSI C++ ANSI C
                  freopen Соединяет новый файл с открытым потоком
                  DOS UNIX Win16 #include
                  OS/2 Win32 FILE *freopen(const char *filename,
                  ANSI C++ ANSI C const char *mode, FILE *stream);
                  frexp,frexpl Расщепляет число типа double на мантиссу и показатель
                  frexp #include
                  double frexp(double x,int *exponent);
                  DOS UNIX Win16
                  OS/2 Win32
                  ANSI C++ ANSI C
                  ---***---
                  frexpl #include
                  long double frexpl(long double x,
                  DOS UNIX Win16 int *exponent);
                  OS/2 Win32
                  fscanf Просматривает и форматирует ввод из потока
                  DOS UNIX Win16 #include
                  OS/2 Win32 int fscanf(FILE *stream,
                  ANSI C++ ANSI C const char *format[,address,...]);
                  fseek Перемещает указатель файла по потоку
                  DOS UNIX Win16 #include
                  OS/2 Win32 int fseek(FILE *stream,long int offset,
                  ANSI C++ ANSI C int whence);
                  fsetpos Позиционирует указатель файла потока
                  DOS Win16 #include
                  OS/2 Win32 int fsetpos(FILE *stream, const fpos_t *pos);
                  ANSI C++ ANSI C
                  _fsopen Открывает поток с коллективным использованием
                  файла
                  DOS Win16 #include
                  OS/2 Win32 #include
                  FILE *_fsopen(const char *filename,
                  const char *mode, int shflg);
                  fstat,stat Получает информацию об открытом файле
                  DOS UNIX Win16 #include
                  OS/2 Win32 int fstat(int handle, struct stat *statbuff);
                  int stat(char *path,ctruct stat *statbuf);
                  _fstr* Работа с потоками
                  DOS Win16 См. описание функций strcat, strchr,
                  OS/2 strcspn, strdup, stricmp, strlen,
                  strlwr, strncat, strncmp, strncpy,
                  strnicmp, strnset, strpbrk, strrchr,
                  strrev, strset, strspn, strstr, strtok и
                  strupr для версий с дальней адресацией.
                  ftell Возвращает текущий указатель файла
                  DOS UNIX Win16 #include
                  OS/2 Win32 long int ftell(FILE *stream)
                  ANSI C++ ANSI C
                  ftime Сохраняет текущее время в структуре timeb
                  DOS UNIX Win16 #include
                  OS/2 Win32 void ftime (struct timeb *buf);
                  _fullpath Преобразует полное имя файла из относительного
                  в абсолютное
                  DOS Win16
                  OS/2 C++ Win32 #include
                  char* _fullpath(char *buffer, const char *path,
                  int buflen);
                  fwrite Записывает в поток
                  DOS UNIX Win16 #include
                  OS/2 Win32 size_t fwrite(const void *ptr, size_t size,
                  ANSI C++ ANSI C size_t n, FILE *stream);



                  Справочник по работе с DOS


                  Ниже представлена информация, которая будет полезной при
                  разработке 16-разрядных приложений для работы в DOS.


                  Справочное руководство по ObjectWindows 2.0 для С++


                  В данном руководстве в алфавитном порядке перечислены классы
                  и структуры ObjectWindows с указанием соответствующих файлов-заголовков. Многие из характеристик данных классов иерархически
                  наследуются из базовых классов.
                  Примечание: Если класс имеет несколько конструкторов,
                  то описывается только наиболее общий из них.


                  Ссылки на данные и функции


                  В операторах asm вы можете использовать любой идентификатор
                  Си, включая динамические локальные переменные, регистровые переменные и параметры функции. Borland С++ автоматически преобразует
                  эти символы в соответствующие операнды ассемблера и добавляет к
                  именам идентификаторов символы подчеркивания.
                  В общем случае вы можете использовать идентификатор Си в любой позиции, где допускается операнд адреса. Там, где допустим
                  регистровый операнд, вы можете использовать регистровую переменную. Если ассемблер обнаруживает идентификатор при анализе операторов инструкции встроенного ассемблера, то он ищет идентификатор
                  в таблице идентификаторов Си. Имена регистров 80х86 из поиска
                  исключаются. Имена регистров можно задавать символами в верхнем
                  регистре.
                  При программировании вам не нужно заботиться о точных смещениях локальных переменных - использование имени переменной предусматривает корректные смещения. Однако, может оказаться необходимым включить в инструкции ассемблера WORD PTR, BYTE PTR или
                  другие переопределения размера. Для косвенных инструкций вызова
                  типа FAR или LES необходимо переопределение DWORD PTR.


                  Ссылки


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


                  Стандартные объекты проверки допустимости


                  Стандартные классы проверки допустимости ObjectWindows автоматизируют проверку данных. ObjectWindows определяет в validate.h
                  6 классов проверки допустимости:

                  Класс Назначение
                  TValidator Базовый класс, из которого создаются все другие производные классы.
                  TFilterValidator Класс фильтра проверки допустимости.
                  TRangeValidator Класс проверки допустимости по целочисленному диапазону.
                  TLookupValidator Класс проверки по таблице.
                  TStringLookupValidator Класс проверки допустимости строки.
                  TPXPictureValidator Класс проверки допустимости по
                  шаблону.



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


                  Файл определения модуля не является строго обязательным для
                  создания выполняемой программы Windows с использованием Borland
                  C++. Если файл определения модуля не задан, по умолчанию принимается следующее:
                  CODE PRELOAD MOVEABLE DISCARDABLE
                  DATA PRELOAD MOVEABLE MULTIPLE (для прикладных про-
                  грамм) или
                  PRELOAD MOVEABLE SINGLE (для DLL)
                  HEAPSIZE 4096
                  STACKSIZE 5120 (для TLINK32 1048576)
                  Для замены утверждения EXETYPE компоновщик Borland C++ может
                  определять вид выполняемой программы, которую вы хотите создать с
                  помощью IDE или компилятора командной строки.
                  Вы можете включать библиотеку импорта для замены секции
                  IMPORTS определения модуля.
                  Для того, чтобы не нужно было указывать секцию EXPORTS, вы
                  можете использовать ключевое слово _exрort в определениях функций
                  экспорта в вашей исходной программе на языке Си или C++. Заметим,
                  однако, что если для экспорта функции используется _exрort, то
                  функция будет экспортироваться по имени, а не по перечислению
                  (перечисление обычно более эффективно).
                  Если вы хотите изменить стандартные атрибуты, вам необходим
                  файл определения модуля.


                  Стандарты ANSI, зависящие от реализации


                  Некоторые аспекты языка Си стандарта ANSI не определены
                  ANSI достаточно подробно. В таких случаях каждая реализация компилятора Си может сама определять отношение к этим аспектам. Ниже
                  говорится о том, как эти зависящие от реализации стандарты определены фирмой Borland. Номера разделов соответствуют здесь публикации стандарта ANSI от февраля 1990 года, которая является самой
                  новой. Отметим, что между Си и С++ имеются различия, а данное
                  приложение относится исключительно к Си.
                  Как идентифицировать диагностические сообщения
                  При запуске с правильной комбинацией параметров любое сообщение, выдаваемое компилятором и начинающееся словами Fatal,
                  Error или Warning, считается диагностическим в смысле, определяемом ANSI. Ниже приводятся параметры, необходимые для того, чтобы
                  обеспечивалась данная интерпретация:
                  Идентификация диагностических сообщений в C++

                  Опция Действие
                  -A Разрешает только ключевые слова ANSI.
                  -C- Запрещает вложенные комментарии.
                  -i32 Устанавливает минимум 32 значащих символа в идентификаторах.
                  -p- Устанавливает использование соглашения о связях Си.
                  -w- Выключает все предупреждения, кроме следующего.
                  -wbei Включает предупреждение о несоответствии инициализаторов.
                  -wbig Включает предупреждение о слишком большой константе.
                  -wcpt Включает предупреждение о немобильных сравнениях указателей.
                  -wdcl Включает предупреждение об объявлениях без типа или класса памяти.
                  -wdup Включает предупреждение о дублирующихся неидентичных определениях макрокоманды.
                  -wext Включает предупреждение о переменных, определенных
                  сразу как external и static.
                  -wfdt Включает предупреждение об определениях функции, использующих typedef
                  -wrpt Включает предупреждение о немобильных преобразованиях
                  указателей.
                  -wstu Включает предупреждение о неопределенных структурах.
                  -wsus Включает предупреждение о подозрительном преобразовании указателя.
                  -wvrt Включает предупреждение о функции void, возвращающей
                  значение.
                  -wucp Включает предупреждение о смешанном использовании указателей signed и unsigned char.
                  <


                  Использование следующих параметров запрещено:






                  -ms! Для моделей данных small SS и DS должны совпадать.
                  -mm! Для моделей данных small SS и DS должны совпадать.
                  -mt! Для моделей данных small SS и DS должны совпадать.
                  -zGxx Имя группы BSS не может быть изменено.
                  -zSxx Имя группы данных data не может быть изменено.
                  Прочие параметры, не упомянутые здесь специально, могут устанавливаться по вашему желанию.

                  Семантика аргументов функции main



                  Когда программа выполняется в операционной системе DOS версий до 3.0, значение argv[0] представляет собой указатель на нулевой байт. Для версии DOS 3.0 и старше argv[0] указывает на имя программы.

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

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

                  строка, которая может содержать пробелы.)

                  Что считается интерактивным устройством

                  Это любое устройства, работающее как консоль.

                  Схема упорядочения набора символов времени выполнения

                  Схема упорядочения набора символов времени выполнения

                  использует знаковое ASCII-значение символа.

                  Элементы наборов символов - исходного и этапа выполнения

                  Наборы символов, исходный и времени выполнения, представляют

                  собой расширенный набор символов ASCII, поддерживаемый IBM PC. В

                  строковых литералах, символьных константах или комментариях, может находиться любой символ, кроме ^Z (Control-Z).

                  Многобайтовые символы

                  Многобайтовые символы в Borland C++ не поддерживаются.

                  Направление печати

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

                  PC направлении.

                  Число бит в символе из набора воспринимаемых символов

                  Символ из набора символов этапа выполнения имеет длину 8

                  бит.

                  Число значащих начальных символов идентификатора

                  Значащими являются только первые 32 символа, хотя это значение может быть изменено при помощи параметров командной строки (l). И внешние, и внутренние символические имена имеют одинаковое



                  число значащих символов. (Число значащих символов в идентификаторах С++ не ограничено).

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

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

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

                  учет регистра, служит параметр командной строки (-l-c).

                  Представления и множества воспринимаемых значений для

                  различных типов целых чисел


                  Тип Минимальное значение Максимальное значение








                  signed char -128 127
                  unsigned char 0 255
                  signed short -32768 32767
                  unsigned short 0 65535
                  signed int -32768 32767
                  unsigned int 0 65535
                  signed long -2147483648 2147483647
                  unsigned long 0 4294967295
                  Все типы char используют для хранения значения 8-битовый

                  байт.

                  Все типы char используют 1 8-битовый байт памяти.

                  Все типы short и int используют 2 байта (в 16-разрядной

                  программе).

                  Все типы short и int используют 4 байта (в 32-разрядной

                  программе).

                  Все типы long используют 4 байта.

                  Если задано выравнивание в памяти (-a), все объекты целых

                  типов, кроме char, выравниваются по границе четных байт. Если задан параметр -a4, результатом будет 4-байтовое выравнивание. Символьные типы не выравниваются никогда.

                  Представления и множества принимаемых значений для

                  различных типов чисел с плавающей точкой


                  Для типов чисел с плавающей точкой Borland C++, допускаемых

                  сопроцессором Intel 8087 используются форматы плавающей точки

                  IEEE. Тип float использует 32-битовый формат действительных

                  чисел IEEE. Тип double использует 64-битовый формат

                  действительных чисел IEEE. Тип long double использует

                  80-битовый расширенный формат действительных чисел IEEE.

                  Соотношение между наборами символов - исходным и времени

                  выполнения


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

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

                  многобайтовых символов в соответствующие широкие символы

                  для широкой символьной константы



                  Широкие символьные константы распознаются.

                  Значение целочисленной константы, которая содержит более

                  одного символа, или широкая символьная константа, которая содержит более одного многобайтового символа

                  Символьные константы могут содержать 1 или 2 символа. В случае двух символов первый символ занимает младший байт константы,

                  а второй - старший.

                  Результат преобразования целого в более короткий тип целого со знаком, либо результат преобразования целого без

                  знака в целое со знаком равной длины, если значение не

                  может быть представлено полностью

                  Эти преобразования выполняются простым усечением бит старшего порядка. Целые со знаком хранятся в виде дополнения до 2, поэтому результирующее число интерпретируется как таковое. Если

                  старший бит более короткого целого ненулевой, то это значение интерпретируется как отрицательное. В противном случае оно считается положительным.

                  Направление усечения, когда число целого типа преобразуется в число с плавающей точкой, которое не может в точности представлять исходное число

                  Целое число округляется до ближайшего представимого значения. Например, значение типа long (2^32-1) преобразуется в значение float 2^31. Разрешение направления округления производится по

                  стандартным арифметическим правилам IEEE.

                  Направление усечения или округления при преобразовании

                  числа с плавающей точкой
                  в число с плавающей точкой

                  меньшей точности представления.

                  Число округляется до ближайшего представимого значения. Разрешение направления округления производится по стандартным арифметическим правилам IEEE.

                  Результаты поразрядных операций для целых со знаком

                  Поразрядные операции выполняются для целых со знаком так

                  же, как и для соответствующих типов без знака. Знаковый бит

                  рассматривается как обычный бит данных. Результат затем

                  интерпретируется как обычное двоичное целое со знаком,

                  представленное как дополнение.

                  Что происходит, когда доступ к элементу объекта типа

                  объединения происходит при помощи элемента другого типа


                  Доступ разрешен и будет происходить к хранимым там битам.



                  Для понимания доступа к элементу с плавающей точкой с использованием для этого компонента другого типа вы должны четко представлять себе битовую кодировку значений с плавающей точкой. Если

                  хранимый элемент короче, чем элемент, используемый для доступа к

                  значению, то лишние биты будут иметь значения, то они сохранят

                  значения, которые они имели до записи в память более короткого

                  элемента.

                  Тип целого числа, предназначенного для хранения максимального размера массива

                  Для обычного массива это тип unsigned int, а для массивов в

                  случае модели данных huge это тип signed long.

                  Результат приведения типа указателя в целое и обратно

                  При преобразованиях между целыми и указателями одинаковых

                  размеров ни один бит не изменяется. При преобразовании более

                  длинного типа к более короткому усекаются старшие биты. При преобразовании более короткого целого в более длинный указатель сначала целое расширяется в такой целый тип, который по длине соответствует данному указателю. Целые со знаком для заполнения новых

                  байтов расширяются по знаку. Аналогичным образом, более короткие

                  указатели для преобразования в более длинный целый тип сначала

                  расширяются до типа указателя, который по длине равен данному

                  целому типу.

                  Знак остатка при целочисленном делении

                  Когда только один из операндов отрицателен, остаток также

                  будет отрицательным. Если ни один из операндов не отрицателен,

                  или оба отрицательны, остаток будет положительным.

                  Целый тип, необходимый для хранения разности между двумя

                  указателями на элементы одного и того же массива,

                  ptrdiff_t

                  Для ближних (near) указателей это тип signed int, а для указателей far или huge - это signed long. Тип ptrdiff_t зависит от

                  используемой модели памяти. Для малых моделей памяти это тип int,

                  а для больших моделей памяти - это тип long.

                  Результат сдвига вправо отрицательного целого типа со

                  знаком


                  Отрицательные значения со знаком при сдвиге

                  вправо расширяются по знаку.

                  Степень вероятности фактического размещения в регистрах

                  объектов со спецификатором класса памяти register




                  В регистр могут быть помещены объекты, объявленные как двухбайтовые целые типы или указатели. Компилятор может помещать в

                  регистр динамические локальные переменные малого размера, но объявленные как register будут иметь приоритет. Для этого бывает

                  доступно не меньше двух, а вообще до шести регистров. Число фактически используемых для этой цели регистров зависит от числа регистров, необходимых для хранения промежуточных значений текущей функции.

                  Рассматривается ли линейное битовое поле int как signed

                  int, или же как unsigned int


                  Линейные битовые поля int рассматриваются как имеющие тип

                  signed int.

                  Порядок распределения битового поля в int

                  Битовое поле распределяется в направлении от позиции младшего бита к позиции старшего бита (младший бит - самый правый).

                  Заполнение и выравнивание компонентов структур

                  По умолчанию заполнение структур символами-заполнителями не

                  выполняется. При использовании параметра выравнивания (-a) структуры дополняются до четного размера, а любые компоненты, не имеющие символьного типа или типа символьного массива, выравниваются

                  по четным адресам смещения.

                  Может ли битовое поле пересекать границу блока памяти

                  Когда параметр выравнивания (-a) не запрашивается, битовое

                  поле может пересекать границу слова, но никогда не может занимать

                  более двух соседних байт.

                  Целый тип, которым представляются значения перечислимого типа

                  Если нумераторов столько, что хватает типа unsigned char, то

                  выбирается этот тип; в противном случае выбирается signed int.

                  Доступ к объекту типа volatile

                  Любая ссылка к объекту volatile приводит к доступу к этому

                  объекту. Приведет ли к доступу к объекту volatile доступ к смежным адресам памяти, зависит от конструктивной реализации памяти.

                  В случае памяти специальных устройств, например памяти видеодисплея, это зависит от конструкции устройства. Для обычной памяти PC объекты volatile используются только при условии доступа по

                  асинхронным прерываниям, так что доступ к соседним объектам не

                  оказывает влияния.



                  Максимальное число описателей, которые могут модифицировать арифметический тип, структуру или объединение

                  Специальных ограничений на число описателей нет. Число

                  разрешенных описателей достаточно велико, однако при глубоком

                  уровне вложенности в набор блоков функции число описателей

                  уменьшается. На файловом уровне это число не менее 50.

                  Максимальное число case-вариантов в операторе switch

                  На число вариантов оператора switch специальных ограничений

                  нет. Если памяти достаточно, то компилятор обработает все.

                  Соответствует ли значение односимвольной константы в

                  выражении типа константы
                  , управляющем условным включением, значению той же символьной константы в наборе

                  символов этапа выполнения; может ли такая символьная

                  константа принимать отрицательное значение

                  Все символьные константы, даже константы условных директив,

                  используют один и тот же набор символов (времени выполнения). Односимвольная константа будет отрицательной, если это символьный

                  тип со знаком signed char (по умолчанию и при -K не запрашивается).

                  Метод поиска включаемых исходных файлов

                  В случае имен включаемых файлов, заданных в угловых скобках,

                  если каталоги включаемых файлов указаны в командной строке, то

                  поиск файлов производится в каждом из этих каталогов. Просмотр

                  каталогов включаемых файлов происходит в следующем порядке. Сначала берутся каталоги, заданные в командной строке, а затем указанные в TURBOC.CFG или BCC32.CFG. Если каталоги включаемых файлов не заданы, то поиск выполняется только в текущем каталоге.

                  Поддержка задания в кавычках имен включаемых исходных

                  файлов


                  Если имя файла задано в кавычках, то поиск файла будет выполняться в текущей директории. Если файл не найден, то далее

                  Borland C++ будет выполнять поиск файла, как если бы его имя было

                  задано в угловых скобках.

                  Особенности последовательности символов в именах файлов

                  Символы обратной наклонной черты в именах включаемых файлов

                  рассматриваются как отдельные символы, а не как символы управляющей последовательности. Различия в регистре, в которым набрана та



                  или иная буква, игнорируются.

                  Определения __DATE__ и __TIME__ , когда они недоступны

                  Дата и время доступны всегда и используют системные дату и

                  время DOS.

                  Символ десятичной точки (для чисел с плавающей точкой).

                  Символом точки в десятичной записи чисел с плавающей

                  точкой является '.'.

                  Тип оператора sizeof, size_t

                  Тип size_t - unsigned int.

                  Константа - пустой указатель, в которую расширяется

                  макроопределение NULL


                  Для 16- разрядного приложения это int или long 0, в зависимости от модели памяти.

                  Для 32-разрядных приложений NULL расширяется в нулевое значение типа int или long (32-битовые числа со знаком).

                  Печатаемые диагностические сообщения и поведение при

                  завершении функции assert


                  Печатается диагностическое сообщение "Assertion failed:выражение, file имя_файла, line nn", где выражение - это выражение с

                  неудачно завершившейся функцией контроля особой ситуации,

                  имя_файла - это имя исходного файла, а nn - это номер строки, где

                  выполнялся контроль.

                  После вывода на дисплей данного диагностического сообщения

                  вызывается функция abort.

                  Определяемые реализацией аспекты проверки символов и

                  функции задания учета регистра


                  Отсутствуют, за исключением описанных в следующем пункте.

                  Наборы символов, проверяемые функциями isalnum,

                  isalpha, iscntrl, islower, isprint и isupper


                  Первые 128 ASCII-символов а режиме по умолчанию или все 256

                  символов.

                  Значения, возвращаемые математическими функциями при

                  ошибках, связанных с областью определения


                  IEEE NAN (не-число).

                  Устанавливают ли математические функции целочисленное

                  выражение errno
                  в значение макрокоманды ERANGE в случае

                  ошибки потери значимости

                  Нет, только для других ошибок - области переполнения, сингулярности, переполнения и общей потери точности.

                  Происходит ли ошибка области определения, или возвращается ноль, когда функция fmod имеет второй аргумент,

                  равный нулю

                  Нет. fmod(x, 0) возвращает 0.

                  Набор сигналов функции signal

                  SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM.

                  Семантика каждого сигнала, распознаваемого функцией



                  signal


                  См. описание функции signal в "Справочнике по библиотеке".

                  Обработка по умолчанию и обработка при загрузке программы каждого сигнала, распознаваемого функцией signal

                  См. описание функции signal в "Справочнике по библиотеке".

                  Блокирование сигнала, выполняемое если эквивалент

                  signal (sig,SIG_DFL); не выполнен перед вызовом обработчика сигналов

                  Эквивалент signal(sig,SID_DFL) выполняется всегда.

                  Будет ли отменена обработка сигнала по умолчанию при

                  получении сигнала SIGILL обработчиком, заданным функции

                  signal

                  Всегда выполняется эквивалент signal(sig,SIG_DGF).

                  Требуется ли в последней строке текстового потока оконечный символ новой строки

                  Нет, не требуется.

                  Появляются ли при чтении символы пробела, записанные в

                  текстовый поток непосредственно перед символом новой

                  строки

                  Да, появляются.

                  Число нулевых символов, которые могут быть добавлены к

                  данным, записываемым в двоичный поток


                  Не добавляются.

                  Устанавливается ли первоначально указатель позиции файла потока в режиме добавления (append) в начало или в конец файла

                  Указатель позиции файла для потока в режиме добавления

                  первоначально помещается в начало файла. Перед каждой операцией

                  записи он сбрасывается в конец файла.

                  Вызывает ли запись в текстовый поток усечение связанного с потоком файла за данной позицией

                  Запись 0 байт может привести, а может и не привести к усечению файла, в зависимости от буферизации файла. Безопаснее считать, что операция записи с нулевой длиной имеет непредсказуемое

                  поведение.

                  Характеристики буферизации файла

                  Файл может иметь полную буферизацию, строчную буферизацию

                  или не иметь таковой. Если файл буферизован, то перед открытием

                  файла по умолчанию создается буфер с размером 512 байт.

                  Существуют ли физически файлы нулевой длины

                  Да, существуют.

                  Может ли один и тот же файл быть открыт неоднократно

                  Да, может.

                  Действие функции remove на открытый файл

                  Никакой специальной проверки, является ли файл открытым, не

                  выполняется. Ответственность лежит на программисте.



                  Что произойдет, если файл с новым именем уже существовал перед вызовом rename

                  rename вернет значение -1, а errno будет установлена в значение EEXIST.

                  Вывод в случае преобразования %p в fprintf

                  В случае ближних моделей данных это четыре шестнадцатиричных

                  цифры (XXXX). В случае дальних моделей данных это четыре шестнадцатиричных цифры, двоеточие и еще четыре шестнадцатиричных

                  цифры (XXXX:XXXX). (Для 16-разрядных программ.)

                  Восемь шестнадцатиричных цифр (ХХХХХХХХ) (для 32-разрядных

                  программ).

                  Ввод в случае преобразования %p в fscanf

                  См. в предыдущем пункте.

                  Интерпретация символа дефис (-), который не является ни

                  первым, ни последним символом в списке сканирования в

                  случае преобразования %[ в fscanf

                  См. описание fscanf в "Справочнике по библиотеке".

                  Значение, в которое устанавливается макрокоманда errno

                  функциями fgetpos или ftell при неудачном завершении


                  EBADF - Неверный номер файла.

                  Сообщения, генерируемые функцией perror


                  Статические библиотеки ObjectWindows


                  В следующей таблице перечислены статические библиотеки ObjectWindows, их использование операционной системой, и в какой
                  операционной системе они доступны. Эти файлы находятся в вашем
                  библиотечном каталоге. Базовые версии файлов ObjectWindows содержатся на инсталляционных дискетах. Дополнительные версии вы можете построить с помощью формирующего файла ObjectWindows (который
                  находятся в каталоге SOURCE\OWL), используя параметры -DDIAGS и
                  -DMODEL.

                  Имя файла Приложение Использование
                  OWLWS.LIB Win1616-разрядная малая модель
                  OWLWM.LIB Win1616-разрядная средняя модель
                  OWLWL.LIB Win1616-разрядная большая модель
                  OWLDWS.LIB Win1616-разрядная диагностическая
                  малая модель
                  OWLDWM.LIB Win1616-разрядная диагностическая
                  средняя модель
                  OWLDWL.LIB Win1616-разрядная диагностическая
                  большая модель
                  OWLWF.LIB Win32s, Win32 32-разрядная библиотека
                  OWLDWF.LIB Win32s, Win32 32-разрядная диагностическая библиотека
                  OWLWI.LIB Win1616-разрядная библиотека
                  импорта для OWL200.DLL
                  OWLDWI.LIB Win1616-разрядная библиотека
                  импорта для OWL200D.DLL
                  OWLWFI.LIB Win32s, Win32 32-разрядная библиотека импорта для OWL200F.DLL
                  OWLDWFI.LIB Win32s, Win32 16-разрядная библиотека импорта для OWL200DF.DLL
                  OWL200.DLL Win1616-разрядная динамическая
                  библиотека
                  OWL200F.DLL Win3232-разрядная динамическая
                  библиотека
                  OWL200D.DLL Win16Диагностическая версия
                  16-разрядной динамической библиотеки
                  OWL200DF.DLL Win32Диагностическая версия
                  32-разрядной динамической библиотеки



                  Статические данные в 16-битовых DLL


                  С помощью функций DLL все приложения, использующие DLL, могут обращаться к глобальным данным DLL. В 16-разрядных DLL функция будет использовать одни и те же данные, независимо от вызывающего ее приложения (в 32-разрядных DLL данные являются частными
                  данными процесса). Если вы ходите защитить в 16-разрядной DLL
                  глобальные данные и ограничить их использование единственным приложением, эту защиту нужно написать самостоятельно. Сама DLL не
                  имеет такого механизма. Если вам нужно, чтобы данные были частными для данного вызывающего DLL приложения, их нужно распределить
                  и работать с ними вручную. Статические данные в 16-разрядной DLL
                  являются глобальными для всех вызывающих приложений.


                  Статические управляющие элементы


                  Статические управляющие элементы обычно представляют собой
                  неизменяемые блоки текста или простую графику. Пользователь не
                  взаимодействует с такими элементами, хотя ваше приложение может
                  изменять его текст. Примеры вы можете найти в подкаталоге EXAPMLES\OWL\OWLAPI\STATIC.
                  Так как пользователь не взаимодействует со статическим элементом, приложение не получает от статических управляющих элементов уведомляющих сообщений. Таким образом, если вы не собираетесь
                  им манипулировать, идентификатор управляющего элемента может не
                  указываться.
                  Конструктор TStatic воспринимает обычно стандартных 7 параметров объектов управляющих элементов и два специальных параметра
                  - текстовую строку статического управляющего элемента и ее максимальную длину (включая завершающий 0). TStatic получает заданные
                  по умолчанию стили управляющего элемента, добавляет SS_LEFT (для
                  выравнивания текста влево) и удаляет стиль WS_TABSTOP (чтобы предотвратить перемещение на данный элемент по клавише Tab). Чтобы
                  изменить стиль, модифицируйте в конструкторе объекта статического
                  управляющего элемента Attr.Style.
                  TStatic имеет две функции-элемента для изменения текста статического управляющего элемента: SetText задает текст элемента в
                  соответствии с переданной строкой, а Clear стирает текст. Изменить текст статического управляющего элемента, созданного со стилем SS_SIMPLE, вы не сможете.
                  Функция TStatic::GetTextLen возвращает длину текста статического управляющего элемента. Чтобы получить сам текст, используйте TStatic::GetText.


                  _Stklen (dos.h)


                  Данная переменная содержит размер стека и имеет следующий
                  синтаксис:
                  extern unsigned _stklen;
                  Переменная _stklen определяет размер стека для 6 моделей памяти. Минимально допустимый размер стека - 128 слов. По умолчанию назначается размер 4К.
                  В моделях данных small и medium сегмент данных вычисляется
                  следующим образом:
                  сегмент данных [small, medium] = глобальные данных +
                  динамически распределяемая область + стек
                  где размер динамически распределяемой области можно настроить с
                  помощью _heaplen.
                  В модели tiny все (включая код) находится в одном и том же
                  сегменте, поэтому размер сегмента данных вычисляется следующим
                  образом (с учетом 256 байт для PSP):
                  сегмент данных [tiny] = 256 + глобальные данные +
                  динамически распределяемая область + стек
                  В моделях compact и large ближней динамически распределяемой
                  области нет, и стек имеет собственный сегмент, поэтому сегмент
                  данных вычисляется так:
                  сегмент данных [compact, large] = глобальные данные
                  В модели huge стек находится в отдельном сегменте, и каждый
                  модуль имеет собственный сегмент данных.


                  Странные вызовы конструктора


                  Обратите внимание на забавные вызовы конструктора базового
                  класса - использование операции ':' после заголовка функции, и перед
                  телом функции. Конструктор порожденного класса вызывает конструктор
                  базового класса, используя синтаксис вызова функции.
                  circle::circle(double x, double y, double r)
                  : shape(x,y) < Заметьте как конструктор circle вызывает
                  конструктор shape с начальной установкой
                  {
                  radius = r;
                  }


                  Строковые инструкции


                  Помимо кодов операций, приведенных выше, возможно использование следующих строковых команд, как в исходном виде, так и с
                  префиксами циклического выполнения.
                  Строковые инструкции BASM
                  cmps insw movsb outsw stos
                  smpsb lods movsw scas stosb
                  smpsw lodsb scasb stosw
                  lodsw outsb scasw
                  insb movs


                  Структура TChooseColorDialog::TData (chooseco.h)


                  Содержит информацию, необходимую для инициализации диалогового окна выбранными пользователем цветами.


                  Структура TDialogAttr


                  Используется для записи атрибутов создания TDialog.


                  Структура TEdgeConstraint (layoutco.h)


                  Эта структура добавляет функции-элементы и устанавливает ограничения границ (но не размера). Она всегда помещает ваше окно
                  на один элемент изображения выше других окон и затем добавляет
                  поля.


                  Структура TEdgeOfSizeConstraint (layoutco.h)


                  Эта производная от TEdgeConstraint структура представляет
                  собой класс шаблона, поддерживающий дополнительно ко всем операциям TEdgeConstraint ограничения размера. Высота и ширина задаются при создании экземпляра данного класса.


                  Структура TFindReplaceDialog::TData (findrepl.h)


                  Эта структура определяет информацию, необходимую для инициализации диалогового окна TFindReplace.


                  Структура TLayoutConstraint (layoutco.h)


                  Эта структура, определяющие ограничения разметки (схемы) окна. Ограничения схемы окна задаются в виде соотношения между шириной и высотой или размером одного окна и краями или размером
                  другого (одного из братских или родительского окна). Если между
                  окнами существует связь родительское-дочернее, то размеры дочерних окон зависят от родительского окна. Высота/ширина окна может
                  зависеть от его противоположного измерения (ширины/высоты).


                  Структура TListBoxData (listbox.h)


                  Эта структура используется для передачи содержимого блока
                  списка.


                  Структура TOpenSaveDialog::TData (opensave.h)


                  Содержит информацию о выборе открытия или сохранения файла.


                  Структура TPrintDialog::TData (printdia.h)


                  Эта структура содержит информацию, необходимую для инициализации диалогового окна с выбранным пользователем принтером.


                  Структура TScrollBarStruct (scrollba.h)


                  Эта структура содержит целочисленные значения, представляющие диапазон скользящего маркера полосы прокрутки.


                  Структура TWindowAttr (window.h)


                  Содержит атрибуты TWindow, устанавливаемые при построении.
                  Ваша программа управляет созданием окна, передавая эти значения
                  подпрограммам создания TWindow.


                  Style Sheet


                  Style Sheet - это набор параметров для построения проекта.
                  Каждый проект использует заданный по умолчанию набор параметров.
                  Их значения сохраняются в Style Sheet, а по умолчанию проекты используют Style Sheet с именем "Default Project Options". Если все
                  компоненты проекта используют одни и те же параметры, вы можете
                  задать их с помощью диалогового окна Options Project (отредактировав тем самым заданную по умолчанию Style Sheet).
                  При построении проекта администратор проекта используется
                  параметры заданные в Style Sheet и Local Override. Если проект
                  еще не имеет Style Sheet, то используется набор параметров родительского объекта. Пример использования Style Sheet вы можете увидеть в STYLESHT.IDE в каталоге \EXAMPLES\IDE\STYLESHT.
                  Администратор проекта содержит несколько наборов Style Sheet, которые вы можете использовать, но можно создать для узла и
                  собственный набор Style Sheet:
                • Выделите узел и щелкните на нем правой кнопкой "мыши".

                • Выберите Edit node attributes.

                • Выберите в блоке списка Style Sheet и щелкните "мышью" на
                  OK.

                • Для создания нового комплекта Style Sheet вы можете также
                  щелкнуть "мышью" на кнопке Style.


                  Связь документов с классами отображаемых элементов


                  Класс документа можно связать с классами отображаемых элементов с помощью шаблона документа, который создается путем определения шаблона класса (класс документа ассоциируется с классом
                  отображаемого элемента) и созданием экземпляра шаблона из этого
                  определенного класса.
                  После определения шаблона класса вы можете создать любое
                  число его экземпляров. Каждый шаблон связывает единственный класс
                  документа и класс отображаемого элемента. Каждый шаблон имеет
                  имя, заданное по умолчанию расширение имени файла, каталог, флаги
                  и фильтры файла. Таким образом, вы можете создать единственный
                  шаблон класса, который связывает документ с отображаемым элементом. Затем вы можете создать несколько различных экземпляров этого шаблона, и каждый экземпляр будет работать с файлами с различными расширениями в своем заданном по умолчанию каталоге, используя одни и те же классы документа и отображаемого элемента.


                  Связь интерфейсных объектов с управляющими элементами


                  Так как диалоговый блок создается из ресурса, вам не нужно
                  использовать для задания его вида или вида его управляющих элементов код С++. Это позволяет создавать диалоговый блок визуально, но затрудняет управление управляющими элементами из приложения. ObjectWindows позволяет связать или ассоциировать управляющие элементы в диалоговом блоке с интерфейсными объектами. Такая
                  связь позволяет делать следующее:
                • Предусмотреть специальную реакцию на сообщения. Например,
                  вы можете отредактировать управляющий элемент или изменять
                  стиль командной кнопки при ее "нажатии".

                • Использовать для манипулирования управляющим элементом
                  функции-элементы и элементы данных. Это легче и больше
                  ориентировано на работу с объектами, чем использование сообщений.



                • Связывание функций


                  В случае раннего связывания адреса всех функций и процедур определяются на этапе компиляции и компоновки программы, т.е. до выполнения программы.
                  Вызовы функции: Описания функций:
                  func_down(); > my_first_metod();
                  my_metod(); > func_down();
                  my_first_metod(); > my_metod();
                  Так, в языке Cи компилятор прежде всего должен найти описание функции по заданному имени.
                  > описание функции
                  int my_first_metod(int a, int b)
                  {
                  return a + 2*b;
                  }
                  .......................
                  k = my_first_metod(12, 24);
                  < вызов функции
                  В противоположность этому, в случае позднего связывания адрес
                  функции элемента не связывается с обращением к нему до того момента,
                  пока обращение не произойдет фактически, то есть во время выполнения
                  программы.
                  Так в библиотеке Turbo Vision любой объект, порожденный от
                  TView, должен быть способен к самоизображению в любой момент времени.
                  Объект TView определяет виртуальную функцию элемент draw, и каждый
                  порожденный от него объект должен также иметь эту функцию элемент.
                  Это имеет большое значение, т.к. часто отображаемый объект может быть
                  закрыт другим отображаемым объектом (или на него может быть наложен
                  другой отображаемый объект) и когда другой отображаемый объект убирается или смещается, то отображаемый объект должен быть способен к изображению своей части, которая была скрыта.
                  File Window
                  Next F6 Demo Window 3
                  Zoom F5 Demo Window 7
                  Demo Window 8
                  Demo Window 1
                  Demo Window 4
                  Demo Window 6 Window 2
                  [*] Demo Window 9 [+]
                  Alt-X Exit F4 New Alt-F3 Close
                  Рисунок: программа, написанная с помощью библиотеки Turbo Vision
                  с множеством открытых окон.
                  В такой динамической системе нельзя заранее предсказать, сколько
                  отображаемых объектов будет на экране, каких они будут типов (окно,
                  меню, диалоговая панель и т.д.) и в какой последовательности пользователь будет с ними работать. В программе, где используется только
                  ранее связывание, вся информация о количестве, координатах и типах
                  отображаемых объектов хранится в основной программе. Все возможные



                  действия над ними тоже должны быть предусмотрены в этой программе.

                  Таким образом, программе приходится отслеживать очень многое, она

                  усложняется и теряет гибкость. Стоит добавить один новый тип отображаемого объекта или изменить поведения существующего, и придется

                  скорректировать программу во всех тех местах, где определяется, какие

                  подпрограммы подлежат вызову.

                  Каким же образом можно улучшить положение с помощью позднего

                  связывания? Рассмотрим случай, когда один отображаемый объект, например, - окно, частично перекрывает другое. Если "верхнее" окно будет

                  передвинуто или закрыто, то нижнее следует перерисовать для восстановления ранее перекрытой части.

                  Так как меню окно перерисовывается иначе, чем диалоговая панель

                  или окно, то каждый объект в отображаемой иерархии должен знать, как

                  перерисовать себя. В библиотеке Turbo Vision этим занимается функция

                  элемент draw, имеющийся в каждом объекте-потомке класса TView. Следовательно, если требуется перерисовать объект, то программе не нужно

                  анализировать, к какому типу отображаемого объекта он относится (как

                  это требовалось бы при раннем связывании). Она просто вызывает функцию элемент данного объекта draw. Функция исполняется и корректно перерисовывает свой объект на экране. Такая множественность действий, которую может выполнять функция элемент с одним и тем же именем, называется полиморфизмом.

                  Не смотря на то, что программисты, для достижения полиморфизма

                  предпочитают использовать позднее связывание, но его можно достичь и

                  ранним связыванием с помощью переопределяемых функций.


                  Связывание значения с функциями-элементами


                  Связывание переданного значения с соответствующей функций элементом подобно связыванию переопределяемых функций, за исключением
                  случаев, когда должны использоваться имена объектов класса для отметки правильных:
                  V V
                  void clock::tick(int sec) Динамическое
                  ^ связывание
                  { с функциями
                  val += sec; элементами
                  }
                  V
                  clock big_ben; // Объявление объекта
                  ^
                  v v v
                  big_ben.tick(25);
                  Позднее (динамическое) связывание происходит во время выполнения
                  программы. Его можно достигнуть путем использования наследования и
                  виртуальных функций элементов. Вы можете также использовать указатели
                  функций. Однако, с виртуальными функциями элементами, все эти опасные
                  операции с указателями обрабатываются компилятором, а не вами.
                  Кроме объектов, динамически размещаемых в памяти Турбо и Borland
                  C++ позволяют вводить статические объекты. Статические объекты размещаются в сегменте данных на этапе компиляции вместе с другими статическими переменными. Это улучшает эффективность использования памяти
                  и быстродействие по сравнению с динамически размещаемыми объектами.


                  Свопинг


                  Если в системе компьютера установлена дополнительная или расширенная память, вы можете сообщить программе управления оверлеев, что он должен использовать эту память при свопинге. В этом случае при удалении модуля из оверлейного буфера (когда туда требуется загрузить новый модуль, а буфер полон) программа управления оверлеями может поместить удаляемый модуль в эту память. При любой последующей загрузке этого модуля за счет того, что модуль перемещается в памяти, а не считывается с диска, экономится время.
                  В обоих случаях есть две возможности: программа управления оверлеями может либо обнаруживать наличие дополнительной или расширенной памяти самостоятельно и затем брать на себя управление этой памятью, либо использовать уже обнаруженную и распределенную часть такой памяти. В случае расширенной памяти обнаружение памяти не во всех случаях выполняется удачно, поскольку многие программы кэширования памяти и программы организации виртуального диска могут использовать эту память, не делая об этом никаких отметок. Чтобы избежать этих проблем, вы должны сообщить программе управления оверлеями начальный адрес расширенной памяти и какой участок ее можно безопасно использовать. Borland С++ предусматривает две функции, которые позволяют вам инициализировать расширенную и дополнительную память - _OvrInitEms и _OvrInitExt.


                  - T -

                  Таблица реакции на сообщения


                  После создания нового производного класса вам нужно построить для него таблицу реакции. Таблица реакции для данного класса
                  выглядит как обычная таблица реакции. Вам нужно обрабатывать в
                  ней те же командные сообщения, как и обычно. Единственным добавлением является макрокоманда EV_VBXEVENTNAME для обработки нового
                  класса сообщений от управляющих элементов VBX. Эта макрокоманда
                  имеет три параметра:
                • Идентификатор управляющего элемента.

                • Строку, идентифицирующую имя события. Эта строка зависит
                  от управляющего элемента и может быть одним из стандартных
                  имен событий VBX или специальным именем события.

                • EvHandler - функцию-обработчик для данного события и управляющего элемента.



                • Текстовое окно Get Info


                  Вы можете выбрать команду File Get Info для анализа использования памяти и определения того, почему получил управление отладчик. Эта и другая информация отображается в текстовом блоке, который удаляется с экрана при нажатии клавиши Enter, пробела или
                  Esc. В этом окне отображается следующая информация, в зависимости
                  от того, отлаживаетесь ли вы в DOS, или в Windows.
                  Если вы отлаживаете программу для DOS, то в блоке System
                  Information будет выведена следующая информация:
                • имя отлаживаемой вами программы;

                • описание причины остановки программы;

                • объемы памяти, используемой DOS, отладчиком и вашей програм мой;

                • версия DOS или Windows, под управлением которой вы работае те;

                • текущая дата и время.

                • TDW дает вам следующую информацию о глобальной памяти:

                  Mode (режим)
                  Режимами памяти могут быть: Large-frame EMS (EMS-память с
                  большим размером страничного блока), Small-frame EMS (EMS-память
                  с малым размером страничного блока), или non-EMS (дополнительная
                  память).
                  Banked (банкируемая)
                  Объем памяти в килобайтах выше линии банка EMS (которая может быть откачана в расширенную память, если ее использует система).
                  Not Banked (не банкируемая)
                  Объем памяти в килобайтах ниже линии банка EMS (которая не
                  может быть откачана в расширенную память).
                  Largest (наибольший)
                  Наибольший непрерывный блок памяти в килобайтах.
                  Symbols (идентификаторы)
                  Объем оперативной памяти, используемый для загрузки таблицы
                  идентификаторов программы.

                  Кроме перечисленной выше информации окно Windows System Information для Windows NT содержит также следующую информацию: Memory Load Factor (процент используемой оперативной памяти), Physical (доступный и общий объем системной памяти), Page file (размер текущего страничного файла и максимальный размер) и Virtual
                  (общая и доступная виртуальная память).


                  Текстовые и графические окна


                  Borland C++ обеспечивает функции для создания окон и управления ими в текстовом режиме (и графических окон в графическом
                  режиме). Если вы не знакомы с текстовыми и графическими окнами,
                  ознакомьтесь со следующим кратким их изложением. Функции Borland
                  C++, позволяющие управлять текстовыми и графическими окнами, описаны ниже в разделах "Программирование в текстовом режиме" и
                  "Программирование в графическом режиме".
                  Окно представляет собой прямоугольную область, определенную
                  на видеоэкране вашего компьютера PC, когда он находится в текстовом режиме. Когда ваша программа выполняет вывод на экран, то область вывода будет в таком случае ограничена активным окном. Остальная часть экрана (вне окна) остается без изменений.
                  По умолчанию размер окна равен всему экрану. При помощи
                  функции window ваша программа может изменить данное использование
                  по умолчанию полноэкранного текстового окна на текстовое окно,
                  меньшее, чем полный экран. Эта функция задает позицию окна в экранных координатах.
                  В графическом режиме вы также можете определить некоторую
                  прямоугольную область экрана PC. Эта область называется графическим окном или областью просмотра (viewport). Когда ваша графическая программа выполняет вывод рисунков и т.д., графическое окно
                  действует как виртуальный экран. Остальная часть экрана (вне графического окна) остается без изменений. Определить графическое
                  окно можно через экранные координаты, вызвав функцию setviewport.
                  За исключением функций определения текстовых и графических
                  окон, все остальные функции, как текстового, так и графического
                  режимов, даются в локальных координатах активного текстового или
                  графического окна, а не в абсолютных экранных координатах. При
                  этом верхний левый угол текстового окна будет представлять собой
                  начало координат (1,1). В графическом режиме начало координат
                  графического окна будет равно (0,0).


                  Текстовый вывод в графическом режиме


                  Ниже приводится краткое описание функций текстового вывода в
                  графическом режиме:

                  Функция Описание
                  gettextsettings Возвращает текущий текстовый шрифт, направление, размер и выравнивание.
                  outtext Посылает строку на экран в текущую позицию (CP).
                  outtextxy Посылает текст на экран в заданную позицию.
                  registerbgifont Регистрирует компонуемый или определяемый пользователем шрифт.
                  settextjustify Устанавливает значения выравнивания текста, используемые функциями outtext и
                  outtextxy.
                  settextstyle Устанавливает шрифт, тип и коэффициент увеличения текущего текста.
                  setusercharsize Устанавливает соотношение между высотой
                  и шириной штриховых шрифтов.
                  textheight Возвращает высоту строки в элементах изображения.
                  textwidth Возвращает ширину строки в элементах
                  изображения.

                  Графическая библиотека включает в себя матричный шрифт 8х8 и
                  несколько векторных шрифтов для вывода текста в графическом режиме.
                • В матричном битовом шрифте каждый символ определяется как
                  матрица элементов изображения.

                • В векторном шрифте каждый символ определяется как последовательность векторов, сообщающих графической системе, как
                  создается данный символ.

                • Преимущество использования векторных шрифтов становится очевидным, когда вы начинаете рисовать большие по размеру символы.
                  Поскольку векторный шрифт определяется как последовательность
                  векторов, при увеличении размера он сохранит хорошее разрешение и
                  качество изображения. И напротив, когда вы увеличиваете битовый
                  матричный шрифт, матрица умножается на соответствующий коэффициент масштабирования. Чем больше этот коэффициент, тем хуже становится разрешение символов. Для малых размеров такой вид шрифта
                  вполне удовлетворителен, однако для больших размеров вам лучше
                  выбрать векторный шрифт.
                  В графике текст выводится функциями outtext или outtextxy, а
                  управление его выравниванием (относительно текущей позиции) выполняет функция settextjustify. При помощи функции settextstyle
                  вы должны выбрать символьный шрифт, направление его размещения



                  (горизонтальное или вертикальное) и размер (масштаб). Узнать текущие установки вывода текстов можно при помощи функции

                  gettextsettings, которая возвращает текущий текстовый шрифт, выравнивание, увеличение и направление в структуре textsettings.

                  Функция setusercharsize позволяет модифицировать ширину и высоту

                  векторных шрифтов.

                  Если средство отсечения изображения включено, то выводимые

                  функциями outtext и outtextxy текстовые строки будут отсекаться

                  по границам графического окна. Если отсечение отключено, то тексты с матричным шрифтом, символы которых не помещаются целиком в

                  окне, отбрасываются полностью. В случае же векторных шрифтов не

                  поместившиеся тексты просто отсекаются по границе окна.

                  Для того, чтобы определить экранный размер данной текстовой

                  строки, вызовите функцию textheight (которая измеряет высоту

                  текста в элементах изображения) и textwidth (измеряющую его ширину в элементах изображения).

                  По умолчанию битовый матричный шрифт 8х8 встроен в графический пакет и поэтому всегда доступен во время выполнения. Векторные шрифты все хранятся в отдельных файлах .CHR. Они могут загружаться во время выполнения или преобразовываться в файлы .OBJ

                  (при помощи утилиты BGIOBJ) и затем компоноваться с вашим файлом

                  .EXE.

                  Обычно подпрограмма settextstyle загружает файл шрифта,

                  распределяя память для него и затем загружая с диска соответствующий .CHR-файл. В качестве альтернативы данной схеме динамической

                  загрузки вы можете скомпоновать файл шрифта (или несколько таких

                  файлов) непосредственно с выполняемым файлом программы. Для этого

                  сначала требуется преобразовать файл .CHR в файл .OBJ (с помощью

                  утилиты BGIOBJ - прочтите об этом в файле документации UTIL.DOC,

                  который находится на дистрибутивном диске), а затем поместить в

                  исходную программу вызовы registerbgifont (перед вызовом

                  функции settextstyle) для того, чтобы зарегистрировать данный

                  символьный шрифт(ы). При построении программы для всех зарегистрированных вами векторных шрифтов необходимо скомпоновать полученные файлы .OBJ.

                  Использование функции registerbgifont относится к сложным

                  методам программирования и не рекомендуется начинающим программистам. Более подробно эта функция описана в файле UTIL.DOC, который находится на дистрибутивном диске.


                  Типы комбинированных блоков


                  Существуют 3 типа комбинированных блока: простой, раскрывающийся и раскрывающийся со списком. Все эти комбинированные блоки
                  выводят свою область редактирования, но блок списка в некоторых
                  из них может быть скрыт.
                  Простой комбинированный блок не может скрывать свою область
                  списка. Его область редактирования ведет себя как редактируемый
                  управляющий элемент. Пользователь может вводить и редактировать
                  текст, не обязательно совпадающий с одним из элементов списка.
                  Комбинированный блок с раскрывающимся списком ведет себя как
                  простой комбинированный блок, однако в начальном состоянии область списка не выводится. Она появляется после щелчка "мышью" на
                  пиктограмме справа от области редактирования.
                  Область списка комбинированного блока с раскрывающимся списком ведет себя как область списка раскрывающегося блока и выводится только при необходимости. Эти два типа комбинированных
                  блоков отличаются только поведением области редактирования, которая в комбинированном блоке с раскрывающимся списком ограничивается выводом текста только одного из элементов списка.
                  Комбинированные блоки с раскрывающимся списком полезно использовать, когда нужно ограничить выбор только теми элементами,
                  которые содержатся в списке. Раскрывающиеся комбинированные блоки
                  могут воспринимать записи, отличные от элементов списка.


                  Типы ошибок



                  Ошибка Описание
                  SuspendBeforeRun Пользователь вызвал Suspend перед вы зовом Start.
                  ResumeBeforeRun Пользователь вызвал Resume перед вы зовом Start.
                  ResumeDuringRun Пользователь вызвал Resume для нити,
                  которая не была приостановлена.
                  SuspendAfterExit Пользователь вызвал Suspend для объекта, нить которого уже завершилась.
                  ResumeAfterExit Пользователь вызвал Resume для объекта, нить которого уже завершилась.
                  CreationFailure Операционная система не смогла создать нить.
                  DestroyBeforeExit Перед завершением нити вызван деструктор объекта.
                  AssignError Попытка присвоить объект, не находящий ся в состоянии Create или Finish.



                  Типы сообщений


                  Вы можете получать сообщения различного типа, в зависимости от того, откуда они поступают.


                  Типы UINT и WORD


                  Тип UINT создан и широко используется в API для создания типа данных, переносимого с Windows 3.x. UINT определяется как
                  typedef undigned int UINT;
                  UINT необходим из-за различий в размерах int между 16-разрядной Windows и Win32. Для 16-разрядной Windows int - это 16-битовое беззнаковое целое, а для Win32 - 32-битовое беззнаковое целое. Для описания целочисленных объектов, которые при компиляции
                  32-разрядных приложений предполагается расширить с 16 до 32 бит
                  используйте UINT.
                  Тип WORD определяется следующим образом:
                  typedef unsigned short WORD;
                  WORD описывает 16-битовое значение и в Windows, и в Word32.
                  Используйте этот тип для создания объектов, которые остаются
                  16-битовыми на обеих платформах. Поскольку описатели Win32 расширены до 32 бит, они больше не могут иметь тип WORD.


                  Типы указателей



                  Модель памяти Указатели функции Указатели данных
                  Tiny near, _cs near, _ds
                  Small near, _cs near, _ds
                  Medium far near, _ds
                  Compact near, _cs far
                  Large far far
                  Huge far far



                  Типы выражений


                  Вы можете использовать выражения для доступа к значением
                  идентификаторов программы, вычисления значений и изменения значений элементов данных. Допускается задавать шестнадцатиричные значения, адреса памяти, строки программы, байтовые списки и вызовы
                  функций. Формат записи шестнадцатиричного значения зависит от
                  выбранного механизма вычисления:

                  Язык 16-разрядный 32-разрядный
                  C 0xnnnn 0xnnnnnnnn
                  Pascal $nnnn $nnnnnnnn
                  Assembler 0nnnn 0nnnnnnnn

                  При отладке 16-битового кода для задания адреса памяти вы
                  можете использовать обозначение "сегмент:смещение", например:

                  Язык Формат Пример
                  C Oxnnnn Ox1234:Ox0010
                  Pascal $nnnn $1234:0010
                  Assembler nnnnh 1234h:0B234h

                  Чтобы задать номер строки программы, перед десятичным номером строки укажите символ #. Можно задавать также байтовые списки:

                  Язык Список Данные
                  C 1234"AB" 34 12 41 42
                  Pascal "ab"0x04"c" 61 62 04 63
                  Assembler 'ab'$04'c' 61 62 04 63

                  Функции из выражений вызываются также, как в исходном коде.
                  Это позволяет быстро проверить поведение функции.


                  Точки останова


                  В Turbo Debugger понятие точки останова включает в себя три
                  следующих элемента:
                • место в программе (адрес), где находится точка останова;

                • условие, при котором она срабатывает;

                • что происходит, когда срабатывает точка останова (действие).

                • Адрес может представлять собой отдельный адрес в программе
                  или быть глобальным (при этом останов может происходить на любой
                  строке исходного кода или инструкции программы). Под условиями
                  могут подразумеваться следующие условия, когда происходит останов:
                • всегда;

                • когда выражение принимает истинное значение;

                • когда объекты данных изменяют свое значение.

                • Можно также задавать "счетчик проходов", который определяет,
                  чтобы прежде чем сработает точка останова, "условие" должно принимать истинное значение определенное число раз.
                  При достижении точки останова может выполняться следующее
                  действие:
                • приостановка выполнения программы;

                • регистрация значения выражения;

                • выполнение выражения;

                • разрешение группы точек останова;

                • запрещение группы точек останова.

                • Обычно точка останова устанавливается на конкретной исходной
                  строке или машинной инструкции программы. Когда программа достигает точки останова, Turbo Debugger вычисляет ее. Однако точки
                  останова могут быть и глобальными. Глобальные точки останова вычисляются отладчиком после выполнения каждой строки исходного кода или инструкции. Это позволяет определить момент модификации переменной или указателя.
                  Когда программа доходит до точки останова, Turbo Debugger
                  проверяет условия точки останова и проверяет истинность заданного
                  условия. Если условие выполняется, точка останова срабатывает.
                  Такая точка останова называется условной.


                  Точку останова в шаблонах С++


                  Turbo Debugger поддерживает размещение точек останова в шаблонах С++, шаблонах функций и шаблонах экземпляров классов и объектов. Для установки таких точек останова используются следующие методы:
                • Если точка останова устанавливается нажатием F2 в окне Module, то точки останова задаются для всех экземпляров классов в шаблонах. Это позволяет вам отладить поведение
                  шаблона.

                • Если для установки точки останова в шаблоне используются
                  клавиши Alt+F2, то активизируется диалоговое окно Breakpoint Options, и в поле ввода Address вы можете задать адрес
                  шаблона. Открываемое диалоговое окно позволяет вам выбрать
                  конкретный экземпляр класса.

                • Установить точку останова на конкретном экземпляре класса
                  шаблона можно также с помощью окна CPU. Позиционируйте
                  курсор на строке кода шаблона и нажмите F2.

                • Удаляются такие точки останова аналогично другим: позиционируйте курсор на точке останова в окне Module и нажмите F2. Удаляются все точки останова соответствующих экземпляров классов. Конкретные точки останова можно удалить с помощью окна CPU.


                  Трансляторы


                  Транслятор - это любая программа, которая преобразует один
                  тип файла в другой. Администратор проекта позволяет вам определить собственные трансляторы. Эти добавляемые трансляторы остаются в файле проекта и не добавляются как перманентные части IDE.
                  Однако трансляторы, средства просмотра, другие инструментальные
                  средства и Style Sheet можно передать другому проекту - следующий
                  выбираемый с помощью команды Project New project проект их наследует. С помощью Options Tools вы можете просмотреть заданные по
                  умолчанию трансляторы.


                  Трассировка исключительных ситуаций операционной системы


                  В TD32 команда OS Exceptoions (в SpeedMenu области кода окна
                  CPU) открывает диалоговое окно Specify Exception Handling, в котором вы можете задать, как Turbo Debugger должен обрабатывать
                  исключительные ситуации операционной системы, генерируемые программой.
                  В блоке списка Exceptions показаны все исключительные ситуации операционной системы, обрабатываемые отладчиком. Для каждой
                  из них вы можете задать обработку отладчиком или программой обработки исключительных ситуаций. По умолчанию они обрабатываются в
                  Turbo Debugger. Он приостанавливает программу и активизирует окно
                  Module или CPU, устанавливая курсор на соответствующую строку кода.
                  Чтобы изменить это заданное по умолчанию поведение, откройте
                  окно Specify Exception Handling, подсветите исключительную ситуацию, которую вы хотите обрабатывать вы программе, и щелкните
                  "мышью" на кнопке с независимой фиксацией User Program.
                  Если вы хотите, чтобы программа обрабатывала все исключительные ситуации операционной системы, используйте кнопку User
                  All.


                  Требования к программному и аппаратному обеспечению


                  Для сеанса удаленной отладки вы можете выбрать соединение
                  через последовательный порт или через локальную сеть. В этих случаях используются разные аппаратные средства, однако должны соблюдаться следующие общие требования:
                • Рабочая система с памятью, достаточной для загрузки отладчика (локальная система).

                • Другой компьютер РС (удаленная система), имеющий достаточный для отлаживаемых программ DOS и TDREMOTE объем памяти
                  (или для отлаживаемой программы Windows и WREMOTE). Это
                  удаленная система.

                • Две системы должны соединяться через последовательный порт
                  нуль-модемным кабелем. При соединении через локальную сеть потребуется программное обеспечение, совместимое с Novell Netware.
                  программное обеспечение, совместимое с Novell Netware (версии IPX
                  и NETBIOS 3.0 или старше).


                  Требования


                  При создании оверлеев следует помнить несколько простых правил, а именно:
                • Минимальная часть программы, которая может выделяться в
                  качестве оверлея, это сегмент.

                • Прикладные программы с оверлейной структурой должны иметь
                  одну из трех следующих моделей памяти: medium , large или
                  huge; модели tiny, small и compact оверлеи не поддерживают.

                • Перекрывающиеся сегменты подчиняются обычным правилам слияния сегментов. То есть, в одном и том же сегменте может участвовать несколько объектных файлов.

                • Генерация оверлеев во время компоновки полностью не зависит
                  от управления сегментами во время исполнения программы; компоновщик не включает автоматически каких-либо кодов для управления
                  оверлеями. Действительно, с точки зрения компоновщика программа
                  управления оверлеями является просто одним из подлежащих компоновке участков кода. Единственное предположение, которое делает
                  компоновщик, состоит в том, что программа управления оверлеями
                  воспринимает вектор прерываний (обычно INT 3FH), через который
                  происходит управление динамической загрузкой. Такой уровень
                  "прозрачности" упрощает создание пользовательских программ управления оверлеями, наилучшим образом управляющих требованиям конкретной прикладной программы.


                  - U -

                  Удаление класса


                • Удалите исходный класс файла из проекта IDE (выбрав исходный узел, щелкнув правой кнопкой "мыши" и выбрав Delete
                  node). Если исходный файл используется в других классах,
                  удалите ссылки на класс в других исходных файлах.

                • Выберите в проекте AppsExpert, щелкните на нем правой
                  кнопкой "мыши" и выберите Special Rescan. Rescan сканирует
                  исходные файлы, перечисленные как зависимые файлы, и использует для построения целевого файла AppsExpert. После завершения Rescan вы возвращаетесь в обновленный исходный
                  файл проекта и можете построить свое приложение с помощью
                  ClassExpert.



                • Удаление точек останова


                  Удалить точки останова можно с помощью локального меню (SpeedMenu) окна Breakpoints или меню Breakpoints. Команда Remove меню окна Breakpoints или клавиша Del стирают точку останова, подсвеченную в области списка. Команда Delete All меню Breakpoint и
                  локального меню окна Breakpoints удаляют все установленные точки
                  останова.


                  Удаление записей-комментариев: параметр /O


                  Параметр /O указывает библиотекарю, что из библиотеки нужно
                  удалить все записи комментария "Comment". Записи комментария применяются обычно для хранения информации, используемой отладчиком
                  или другими инструментальными средствами, и не требуются для создания выполняемого файла. Использование данного параметра позволит уменьшить объем ваших библиотек (и создаваемых с их использованием программ).


                  Удаленная отладка


                  Удаленная отладка означает с соответствии со своим названием
                  следующее: вы запускаете отладчик на одном компьютере, а отлаживаемую программу - на другом. Две системы могут соединяться через
                  последовательный порт или через локальную сеть LAN, совместимую с
                  NETBIOS. Удаленную отладку полезно использовать в следующих ситуациях:
                • Вашей программе требуется много памяти, и вы не можете за пускать программу и отладчик на одном компьютере.

                • Ваша программа загружается с отладчиком, но для ее правильного функционирования памяти недостаточно. В этом случае в процессе отладки вы будете получать сообщения об
                  ошибках распределения памяти.

                • Нужно отладить специальные программы (резидентные программы или драйверы устройств).

                • Вы отлаживаете программу Windows.

                • В случае отладки прикладной программы Window у вас есть выбор: вы можете либо запустить на одной машине программу и отладчик для Windows (TDW), либо запустить Windows, утилиту WREMOTE и
                  прикладную программу на одной машине, а отладчик - на другой.


                  Указатели сегментов


                  В объявлениях типа указателя сегмента используется __seg. В
                  результате получаются 16-битовые указатели сегментов. Синтаксис
                  __seg следующий:
                  тип_данных _seg *идентификатор
                  Например,
                  int _seg *name
                  Любое обращение по ссылке через "идентификатор" предполагает
                  смещение 0. В арифметических операциях с указателями выполняются
                  следующие правила:
                • Нельзя использовать с указателями сегментов операции ++,
                  --, +- или -=.

                • Нельзя вычитать один указатель сегмента из другого.

                • При сложении сегментного указателя с ближним (near) указателем результатом будет дальний (far) указатель, который формируется из сегмента, задаваемого сегментным указателем, и смещения из ближнего указателя. Эта операция
                  разрешена только в том случае, если два указателя указывают на один и тот же тип, либо если один из указателей
                  указывает на тип void. Независимо от указываемого типа
                  умножение смещения не происходит.

                • Когда сегментный указатель используется в выражении обращения по ссылке, он также неявно преобразуется в дальний
                  указатель.

                • При выполнении операции сложения или вычитания целочисленного операнда и сегментного указателя результатом является дальний указатель, где сегмент берется из сегментного указателя, а смещение получается умножением размера
                  объекта, на который указывает целочисленный операнд.
                  Арифметическая операция выполняется таким образом, как
                  если бы целое складывалось с указателем far или вычиталось из него.

                • Сегментные указатели могут присваиваться, инициализироваться, передаваться в функции и из функций, сравниваться, и т.д. (Сегментные указатели сравниваются по правилам
                  для unsigned int). Другими словами, за исключением перечисленных выше ограничений, они обрабатываются так же, как и любые другие указатели.



                • Указатели


                  Хотя указатель или функция могут иметь конкретный тип независимо от используемой модели, вы можете выбрать заданный по
                  умолчанию тип указателя, используемый для кода и данных. Существует 4 типа указателей: near (16 бит), far (32 бита), huge (32
                  бита) и segment (16 бит).
                  В указателях near (ближние указатели) для вычисления адреса
                  используется один сегментный регистр, например, 16-битовое значение указателя функции складывается со сдвинутым влево содержимым
                  регистра кода CS. С такими указателями легко работать.
                  Указатели far (дальние указатели) содержат не только смещение в сегменте, но и адрес сегмента (другое 16-битовое значение).
                  Такие указатели позволяют иметь несколько сегментов кода и программы, превышающие по размеру 64К. Здесь нужно учитывать, что в
                  операциях == и != используются 32-битовые значения unsigned long,
                  а не полный адрес памяти. В операциях сравнения <=, >=, < и > используется только смещение.
                  При прибавлении к указателю значения изменяется только смещение. Если смещение превышает FFFF (максимально возможное значение), то указатель возвращается к началу сегмента. При сравнении
                  указателей лучше использовать ближние указатели или указатели huge.
                  Указатели huge также занимают 32 бита. Аналогично указателям
                  far, они содержат и адрес сегмента и смещение. Однако, чтобы избежать проблем с указателями, такие указатели нормализуются. Нормализованный указатель - это 32-битовый указатель с максимально
                  возможным значением в сегментном адресе. Так как сегмент может
                  начинаться с каждых 16 байт, это означает, что данное смещение
                  будет иметь значение от 0 до 15. Для нормализации указателя он
                  конвертируется в 20-битовый адрес, а затем используются правые 4
                  бита смещения и левые 16 бит адреса сегмента. Например, 2F84:0532
                  преобразуется в абсолютный адрес 2FD72, который нормализуется в
                  2FD7:0002. Нормализация важна по следующими причинам:
                • Каждому сегментному адресу соответствует при этом только
                  одна возможная адресная пара "сегмент:смещение". Это означает, что операции == и != возвращают корректный ответ.

                • В операциях сравнения <=, >=, < и > используется при этом
                  полные 32-битовые значения. Нормализация обеспечивает корректность результатов.

                • Благодаря нормализации смещение в указателях huge автоматически циклически возвращаются каждые 16 байт, но настраивается также и сегмент. Например, при инкрементации 811B:000F результатом будет 811C:0000. Это обеспечивает,
                  что, например, при наличии массива структур типа huge >
                  64К индексирование массива и выбор поля struct будет работать для структур любого размера.

                • Однако работа с указателями huge связана с дополнительными
                  издержками. Из-за этого арифметические операции с указателями huge выполняются намного медленнее, чем с указателями far.


                  Улучшение алгоритма


                  Хотя наш алгоритм работает чудесно, но он довольно ограничен в
                  своих возможностях, так как может декомпрессировать только непосредственно на экран. Поскольку цикл while находится в функции, то
                  ограничения на время декомпрессии один шаг за цикл. Например, предположим вы хотите работать декомпрессором как фильтром (в стиле UNIX),
                  и пропускаете текст для декомпрессии один символ за цикл времени к
                  анализатору:
                  сжатый текст -> Декомп > Анализ. > лексемы
                  фильтр симв.
                  Это сделает наш декомпрессор весьма гибким и переносимым. Как мы
                  можем изменить наш алгоритм, написанный на Си?
                  Чтобы алгоритм на Си сделать более гибким необходимо воспользоваться возможностями ООП. Сперва дополним нашу функцию decomp() локальными переменными, и поместим их в структуру. Эта структура будет
                  также содержать указатель на строку, которую необходимо декомпрессировать, и длину этой строки:
                  typedef struct {
                  > int srclen, c, rcnt; <
                  > unsigned char *p;
                  } decompressor;
                  void decomp(unsigned char *s, int srclen)
                  { ----------
                  int | c, rcnt; |
                  ----------
                  ...
                  }
                  Примечание:
                  Теперь попробуем расщепить нашу функцию decomp() на две части:
                  функцию инициализации и функцию возвращающую следующий символ, с автоматическим включением его в процесс декомпрессии. Далее передадим
                  указателю структуру, которую мы только что определили. Эта структура проинициализирована нашей функцией инициализации и хранит информацию, которая необходима нам между каждым вызовом функции.
                  Сначала опишем функцию инициализации:
                  void decompressor_init(decompressor* dc, unsigned char* s, int len)
                  {
                  dc->p = s; /* Место сжатия строки */
                  dc->srclen = len; /* Инициализация переменной содержащей длину */
                  dc->rcnt = 0; /* Обнуление счетчика длины строки */
                  }


                  Унарные операции



                  Операция Смысл
                  & Операция адресации
                  * Операция обращения по ссылке
                  + Унарный плюс
                  - Унарный минус
                  ~ Поразрядное дополнение (дополнение
                  до единицы)
                  ! Логическое отрицание
                  ++ Префикс: прединкрементация;
                  Постфикс: постинкрементация
                  -- Префикс: преддекрементация;
                  Постфикс: постдекрементация



                  Уничтожение интерфейсных объектов


                  Уничтожение интерфейсного объекта предусматривает два этапа:
                  уничтожение интерфейсного элемента и удаление интерфейсного объекта. Если создавать и выводить интерфейсный элемент требуется
                  снова, вы можете уничтожить интерфейсный элемент, не удаляя интерфейсного объекта.
                  Уничтожение интерфейсного элемента выполняет функция-элемент
                  Destroy интерфейсного объекта. Для уничтожения интерфейсных элементов Destroy вызывает функцию API DestroyWindow. При уничтожении интерфейсного элемента элемент данных HWindow устанавливается в 0.
                  При закрытии пользователем окна происходит следующее:
                • Windows уведомляет окно.

                • Возможность закрытия окна проверяется через механизм CanClose.

                • Если окно можно закрыть, интерфейсный элемент уничтожается, а интерфейсный объект удаляется.

                • Интерфейсный объект - это обычный объект С++, и вы можете
                  удалить его с помощью оператора delete.


                  Уничтожение окон


                  Уничтожение родительского окна означает уничтожение всех его
                  дочерних окон. Уничтожать дочерние окна или интерфейсные объекты
                  дочерних окон явным образом не требуется. Это же касается механизма CanClose: CanClose для родительского окна может вызывать CanClose для всех дочерних окон.
                  Когда вы уничтожаете интерфейсный элемент объекта, он разрешает автоматическое создание всех дочерних объектов независимо от
                  того, было ли оно до этого разрешено. Таким образом, при создании
                  родительского объекта все родительские объекты восстанавливаются
                  в то состояние, которое они имели перед уничтожением родительского объекта. Вы можете использовать это для уничтожения интерфейсного элемента и воссоздания его в том же состоянии, какое он имел
                  при уничтожении. Чтобы предотвратить это, вы должны явно отключить автоматическое создание для всех дочерних объектов, которые
                  не хотите автоматически создавать.


                  Управление цветом для EGA и VGA


                  В случае EGA палитра содержит 16 элементов из общего количества 64 возможных цветов, причем каждый из элементов палитры
                  может быть задан пользователем. Доступ к текущей палитре выполняется через функцию getpalette, которая заполняет структуру, включающую в себя размер палитры (16) и массив фактических элементов
                  палитры ("аппаратные номера цветов", хранимые в палитре). Элементы палитры можно изменять как по отдельности при помощи
                  setpalette, либо все сразу через функцию setallpalette.
                  Палитра EGA по умолчанию соответствует 16 цветам CGA, которые были даны в предыдущей таблице цветов: черный равен элементу
                  0, голубой равен элементу 1, ... , белый равен элементу 15. В
                  graphics.h определены константы, которые содержат соответствующие
                  цветам аппаратные значения: это EGA_BLACK, EGA_WHITE и т.д. Эти
                  значения могут быть также получены через функцию getpalette.
                  Подпрограмма setbkcolor(цвет) на EGA работает несколько иначе, чем на CGA. На EGA setbkcolor копирует фактическое значение
                  цвета, хранящееся в элементе #цвет, в элемент #0.
                  Что касается цветов, то драйвер VGA работает фактически так
                  же, как и драйвер EGA; он просто имеет более высокое разрешение
                  (и меньшие по размеру элементы изображения)


                  Управление цветом на CGA


                  Из-за различий в графическом аппаратном обеспечении фактическое управление цветами различно для CGA и EGA, что заставляет
                  нас рассмотреть их по отдельности. Управление цветом для драйвера
                  AT&T, а также режимы низкой разрешающей способности драйвера MCGA
                  аналогичны управлению цветом CGA.
                  В случае адаптера CGA вы можете выбрать либо режим низкой
                  разрешающей способности (320х200), который допускает использование четырех цветов, либо режим высокой разрешающей способностей
                  (640х200), где допускается использование двух цветов.


                  Управление цветом


                  Ниже приводится краткое описание функций для управления цветом изображений:

                  Функции получения информации о цвете Описание
                  getbcolor Возвращает текущий цвет фона.
                  getcolor Возвращает текущий цвет вычерчивания.
                  getdefaultpalette Возвращает структуру определения палитры.
                  getmaxcolor Возвращает максимальное значение цвета
                  доступное в текущем графическом режиме.
                  getpalette Возвращает текущую палитру и ее размер.
                  getpalettesize Возвращает размер просмотровой таблицы
                  палитры.


                  Функции установки одного или более цветов Описание
                  setallpalette Изменяет все цвета палитры, как задано.
                  setbkcolor Устанавливает текущий цвет фона
                  setcolor Устанавливает текущий цвет вычерчивания.
                  setpalette Изменяет один из цветов палитры, как
                  указано ее аргументами.

                  Прежде чем перейти к рассмотрению работы функций управления
                  цветом изображения, дадим базовое описание того, как эти цвета
                  фактически получаются на вашем графическом экране.


                  Управление диапазоном полосы прокрутки


                  Одним из атрибутов полосы прокрутки является диапазон, который устанавливает все возможные позиции скользящего маркера полосы прокрутки. Каждая позиция связывается с целым значением. Родительское окно использует это значение для установки или опроса
                  полосы прокрутки. По умолчанию диапазон объекта составляет от 1
                  до 100. Минимальная позиция скользящего маркера (верхний конец
                  вертикальной полосы или левый конец горизонтальной) устанавливается в 1. Другой диапазон можно задать с SetRange.
                  Полоса прокрутки имеет два важных атрибута - размер строки
                  (инициализируется значением 1) и размер страницы (по умолчанию
                  10). Эти значения задаются в единицах диапазона. Их можно изменить с помощью элементов данных TScrollBar LineMagnitude и PageMagnitude.
                  TScrollBar имеет две функции-элемента для опроса полосы
                  прокрутки: GetRAnge (получает диапазон) и GetPosition (получает
                  текущую позицию указателя). Модификация полос прокрутки обычно
                  выполняется пользователем, но ваше приложение может изменить их
                  непосредственно с помощью функций-элементов SetRange (устанавливает диапазон прокрутки), SetPosition (устанавливает позицию маркера) и DeltaPos (перемещает маркер).


                  Управление Doc/View


                  Администратор документа поддерживает список используемых в
                  приложении экземпляров шаблона и список текущих документов. Каждое использующее документы Doc/View приложение должно иметь администратор документа, но в каждый момент времени он только один.
                  Администратор документа объединяет модель Doc/View - классы
                  документа, классы отображаемых элементов и шаблоны. Администратор
                  документа предусматривает заданное по умолчанию меню File и обработку каждого его пункта:

                  Пункт меню Обработка
                  New Создает новый документ.
                  Open... Открывает существующий документ.
                  Save Сохраняет текущий документ.
                  As... Сохраняет текущий документ под новым именем.
                  Revert To Saved Отменяет изменения в последнем сохраненном документе.
                  Close Закрывает текущий документ.
                  Exit Выходит из приложения, выводя подсказку для сохранения документов.

                  После написания документа и классов отображаемых элементов,
                  определения всех необходимых шаблонов и создания экземпляров текущих шаблонов вам потребуется только создать свой администратор
                  документа. После создания администратора он создает список экземпляров шаблона и меню (если это задано в конструкторе). После
                  получения одного из обрабатываемых событий он выполняет заданную
                  для этого события команду.


                  Управление графической системой


                  Ниже приводится краткое перечисление всех функций управления
                  графической системой:

                  Функция Описание
                  closegraph Закрывает графическую систему.
                  detectgraph Проверяет аппаратное обеспечение и определяет, какие графические драйверы использовать; рекомендует предпочтительный
                  режим.
                  graphdefaults Сбрасывает все переменные графической
                  системы в значения по умолчанию.
                  _graphfreemem Отменяет выделенную графике память. Используется для определения собственной подпрограммы.
                  _graphgetmem Распределяет память графике; используется для определения собственной подпрограммы.
                  getgraphmode Возвращает текущий графический режим.
                  getmoderange Возвращает минимальный и максимальный допустимые режимы для заданного драйвера.
                  initgraph Инициализирует графическую систему и переводит аппаратное обеспечение в графический режим.
                  installuserdriver Устанавливает дополнительный драйвер устройства в таблице драйверов устройства BGI.
                  installuserfont Загружает поставляемый файл векторного
                  (штрихового) шрифта в таблицу символьных файлов BGI.
                  registerbgldriver Регистрирует внешний или загруженный
                  пользователем файл драйвера для включения во время компоновки.
                  restorecrtmode Восстанавливает первоначальный (существовавший до Initgraph) режим экрана.
                  setgraphbufsize Задает размер внутреннего графического
                  буфера.
                  setgraphmode Выбирает заданный графический режим, очищает экран и восстанавливает все умолчания.

                  Графический пакет компилятора Borland C++ обеспечивает графические драйверы для следующих графических адаптеров (и полностью совместимых с ними):
                • Цветной/графический адаптер (CGA);

                • Многоцветная графическая матрица (MCGA);

                • Улучшенный графический адаптер (EGA);

                • Видеографическая матрица (VGA);

                • Графический адаптер Hercules;

                • Графический адаптер серии AT&T 400;

                • Графический адаптер 3270 PC;

                • Графический адаптер IBM 8514.

                • Для запуска графической системы вы должны прежде всего вызвать функцию initgraph. Функция initgraph загружает графический
                  драйвер и переводит систему в графический режим.



                  Вы можете указать для функции initgraph использование конкретного графического драйвера и конкретный режим, либо задать автообнаружение установленного видеоадаптера и выбор соответственного драйвера уже во время выполнения. Если вы задали в функции

                  initgraph автообнаружение, то она сама вызовет функцию detectgraph для выбора графического драйвера и режима. Если вы задали в

                  initgraph использование конкретного графического драйвера и режима, то вы сами отвечаете за физическое присутствие соответствующего аппаратного обеспечения. Если заставить initgraph пытаться использовать отсутствующее аппаратное обеспечение, то результат в

                  таком случае непредсказуем.

                  После того, как графический драйвер загружен, вы можете определить его имя при помощи функции getdrivename, а число поддерживаемых драйвером режимов - при помощи функции getmaxmode. Функция getgraphmode сообщит вам, в каком графическом режиме вы находитесь в текущий момент. Имея номер режима, вы можете определить

                  его имя при помощи функции getmodename. Вы также имеете возможность изменить графический режим при помощи функции setgraphmode

                  и вернуть исходный видеорежим (тот, который был установлен до

                  инициализации графики) с помощью restorecrtmode. Функция restorecrtmode вернет экран в текстовый режим, но не закроет при этом

                  графическую систему (загруженные шрифты и драйверы останутся в

                  памяти).

                  Функция graphdefaults сбрасывает установки состояния графической системы (размеры графического окна, цвет линий, цвет и

                  шаблон заполнителя и т.д.) в исходное состояние. Функции installuserdriver и installuserfont позволяют установить в графической

                  системе новые драйверы устройства и шрифты.

                  И наконец, закончив работу в графике, вы должны вызвать

                  функцию closegraph для того, чтобы закрыть графическую систему.

                  Функция closegraph выгружает драйвер из памяти и восстанавливает

                  первоначальный видеорежим (через обращение к restorecrtmode).

                  Обычно подпрограмма initgraph загружает графический драйвер,

                  распределяя для этого драйвера память и затем загружая туда с



                  диска соответствующий файл .BGI. В качестве альтернативы данной

                  схеме динамической загрузки вы можете скомпоновать нужный файл

                  графического драйвера (или несколько таких файлов) непосредственно с файлом выполняемой программы. Для этого файл .BGI сначала

                  преобразуется в файл .OBJ (при помощи утилиты BGIOBJ - см. документацию в файле UTIL.DOC, который поставляется на одном из дистрибутивных дисков), после чего в исходный код помещается вызов

                  функции registerbgidriver (до вызова initgraph), чтобы зарегистрировать графический драйвер(ы) в системе. При построении программы вы должны выполнить компоновку файлов .OBJ всех зарегистрированных драйверов.

                  После определения того, какой графический драйвер должен использоваться (посредством detectgraph) функция initgraph проверяет, был ли желаемый драйвер зарегистрирован. Если был, то initgraph обращается к зарегистрированному драйверу непосредственно в памяти. В противном случае функция initgraph распределяет память для драйвера и загружает нужный файл .BGI с диска.

                  Использование функции registerbgidriver относится к более

                  сложным методам программирования, не рекомендуемым для начинающих

                  программистов.

                  Во время выполнения графической системе может понадобиться

                  распределить память для драйверов, шрифтов и внутренних буферов.

                  При необходимости она вызывает функцию _graphgetmem для распределения памяти и функцию _graphfreemem для ее освобождения. По

                  умолчанию данные подпрограммы просто вызывают функции malloc и

                  free, соответственно.

                  Действие этих функций по умолчанию можно переопределить, определив собственные функции _graphgetmem и _graphfreemem. Благодаря этому вы можете сами управлять распределением памяти для

                  графики. Однако, ваши варианты функций управления распределением

                  памяти должны иметь те же имена: они заменят собой используемые

                  по умолчанию функции с теми же именами из стандартных библиотек

                  языка Си.

                  Определив собственные функции _graphgetmem и _graphfreemem,

                  вы можете получить предупреждение "duplicate symbols" ("повторение символических имен"). Это предупреждение можно игнорировать.


                  Управление памятью


                  Контейнеры позволяют вам контролировать управление памятью.
                  Например, следующий контейнер позволяет передавать объект управления памятью:
                  TMQueueVector MyQueue (100);
                  TMQueueVector воспринимает два типа параметров: объект, который будет содержать очередь (MyClass), и имя класса управления
                  памятью (MyMemManage), который вы хотите использовать. M в имени
                  шаблона означает, что вы должны для реализации данного контейнера
                  задать администратор памяти. Если в именах шаблонов M не указывается, то используется стандартный распределитель памяти
                  TStandardAllocator, найденный в alloctr.h.
                  TStandardAllocator предусматривает операции new, new[],
                  delete и delete[], которые вызывают соответствующие глобальные
                  функции. Пользовательское распределение памяти должно предусматривать специфическую для класса операцию new. В качестве примера
                  для построения можно использовать содержимое alloctr.h.


                  Управление выполнением программы


                  В процессе отладки управление периодически передается между
                  вашей программой и отладчиком. Когда управление передается Turbo
                  Debugger, он может использовать свои средства для поиска по ис ходному коду и структурам данных программы и выявления причины
                  неправильного выполнения программы. Для этого можно использовать
                  меню и окна отладчика. Отладчик предоставляет вам много способов
                  управления выполнением программы. Вы можете:
                • выполнять программу по шагам (по одной машинной инструкции
                  или строке исходного кода);

                • выполнять как один шаг вызовы функций;

                • выполнять программу до заданного места;

                • выполнять программу до возврата из текущей функции;

                • трассировать программу;

                • выполнять программу в обратном направлении;

                • выполнять программу до точки останова;

                • выполнять программу до появления определенного сообщения
                  Windows;

                • приостанавливать программу при возникновении исключитель ной ситуации С++ или Си.

                • Кроме точек останова, сообщений Windows и исключительных си туаций С++ все механизмы управления выполнением находятся в меню Run.


                  Управляющие объекты Visual Basic


                  ObjectWindows позволяет вам использовать в приложениях Windows управляющие элементы, совместимые с управляющими элементами
                  Visual Basic 1.0 (VBX). Использовать их также легко, как стандартные управляющие элементы Windows или ObjectWindows.
                  Управляющие элементы VBX представляют большой диапазон функциональных возможностей, не предусмотренных в стандартных управляющих элементах Windows.


                  Управляющие сообщения



                  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 выводится .
                  Чтобы глобальная точка останова проверялась после выполнения
                  каждой машинной инструкции, а не каждой строки исходного кода, в
                  активном окне 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 -

                  Версии объектов


                  Различным реализациям одного и того же класса, изменяемым
                  при обслуживание, вы можете присваивать различные номера версий.
                  Это не означает, что в одной и той же программе вы можете использовать различные версии одного класса, но позволяет писать потоковый код таким образом, что программа, использующая более новую
                  версию класса, может считывать поток, содержащий данные для старой версии класса, например:
                  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) в
                  поставляемых заголовочных файлах.


                  Встроенный ассемблер


                  Встроенный ассемблер позволяет включать в ваши программы на
                  языке Си и С++ операторы ассемблера. Инструкции встроенного ассемблера компилируются и ассемблируются с вашей программой, и вам
                  не потребуется писать отдельные модули.


                  Турбо отладчик 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); < Еще одна функция элемент
                  };


                  Сейчас совершенно ясно, что на


                  Сейчас совершенно ясно, что на смену традиционному программированию, переживающему трудные времена, пришло объектно-ориентированное. Властелины софта переключили производства на выпуск
                  объектно-ориентированных сред и языков программирования. В срочном порядке переписываются под объектно-ориентированное представление многие известные программы, например FoxPro.
                  Успех объектно-ориентированного программирования (ООП) объясняется предоставляемой им возможностью естественно имитировать
                  реалии нашего мира. Решая сложные проблемы, выдвигаемые жизнью,
                  человек постепенно развил в себе замечательные способности к
                  обобщению, классификации и созданию абстракций. В живых реалиях
                  мы находим общие признаки, свойства, способы поведения и по ним
                  создаем классификационные словари.
                  Долгое время идеи ООП сдерживало ограниченное быстродействие
                  персональных компьютеров. Первые объектно-ориентированные языки,
                  поддерживающие эту технологию, носили больше исследовательских
                  характер. Однако, с приходом 386-ых процессоров процесс пошел,
                  как по маслу. На смену пришли новые языки, предназначенные для
                  широкомасштабного промышленного ООП. С их помощью стало возможным
                  обобщать свойства, классифицировать объекты, абстрагировать из
                  них новые, управлять ими, используя различные методы.
                  Эта книга посвящена Borland C++ - новому мощному объектно-ориентированному расширению языка Си.
                  С++ лучше, чем Си. Он удобней при написании программ, более
                  читаемый. Подходы, примененные при программировании на С++ повышают надежность и расширяемость продуктов. C++ обладает исключительным свойством, которого нет у специализированных языков ООП
                  (Simula, Smalltalk): он обеспечивают обратную совместимость с
                  миллионами уже написанных строк на обычном Си. Добавить объектно-ориентированные элементы к действующей программе на знакомом
                  языке гораздо проще, чем всю ее переписать заново, используя совершенно другой язык. Кроме того, не пропадают ни средства, вложенные фирмой в подготовку программистов, ни накопленный ими
                  опыт, так как программистам нужно освоить не совершенно новую
                  систему основных конструкций, а лишь несколько дополнительных
                  особенностей.
                  В данной книге сделана попытка разложить С++ в понятных проекциях, в которых он бы воспринимался с первого взгляда, без остановок, в первом чтении.

                  Выбор другого принтера


                  В своем приложении вы можете связать объекты распечатки с
                  любым инсталлированным в 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.


                    это расширение операционной системы 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 Характеристика определена пользователем на
                    этапе выполнения.



                    

                        Биржевая торговля: Механические торговые системы - Создание - Программирование