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

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

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

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

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

При вызове функции элемента в С++, разрешается не указывать ее
последние аргументы в списке и, таким образом, избавить программиста
от необходимости указывать их каждый раз при обращении. Определить
такие аргументы лучше списком в начале программы. Например:
#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
// (красный)
Примечание: необходимо помнить, что этот "механизм" может конфликтовать с механизмом переопределения функций (см.
).

Азы С++

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

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

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

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

Начнем с того, что объекты можно сравнить, отвлеченно, с объектами физического мира - компьютерами, автомобилями, электронными платами. Они обладают свойствами, такими, как, например, размер, производительность. Детали автомобиля, компьютера можно использовать многократно. Стандартные элементы позволяет разработчику сосредоточиться над стоящей перед ним задачей вместо того, чтобы заново изобретать
средства для ее решения.
Наши объектно-ориентированные объекты - это объединение функций
и данных (включая простые переменные и структуры) в виде независимой
конструкции. Эти конструкции - строительные блоки вашей программы.
Ниже приведены простые примеры объектов:
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); // Еще одна функция-элемент
};

Деструкторы

Деструкторы, как следует из их названия, уничтожают объекты
класса, созданные перед этим конструктором, очищая значения и освобождая память. Деструкторы наследуют имена своих классов, с добавлением лидирующего знака тильда '~':
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);
};

Динамическое использование свободной памяти (операции 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 для выделения памяти.

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

Поскольку наш декомпрессор написан в объектно-ориентированном стиле, то мы могли бы иметь более чем один подход к декомпрессии, как
здесь. За счет того, что мы извлекли внутренние переменные и поместили их в структуру, и без остановки из имеющихся более чем одной копии
структуры:
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);
}

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

Обычно доступ к приватным элементам класса ограничивается методами этого класса. Но иногда возникает необходимость предоставить
доступ к приватным данным класса внешним функциям. Определить такие
внешние функции (которые могут даже находиться вне классов), которым
будет предоставлена возможность доступа к приватным элементам класса,
позволяет описание 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. Заметим, что в
С++, как и в жизни, дружественность не транзитивна: если А является
другом для Б, а Б является другом для И, то отсюда не следует, что А
является другом для И.
Дружественные описания следует использовать только в том случае,
когда это действительно необходимо, например, когда без этого пришлось бы использовать чересчур сложную иерархию классов. По своей природе дружественные описания уменьшают инкапсуляцию и модульность. В
частности, если нужно определить целый класс, как дружественный для другого класса, то вместо этого лучше рассмотреть возможность построения обоюдно порождаемого класса, который можно использовать для
доступа к нужным элементам.

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

Как вы уже видели раньше, классы С++ могут содержать в качестве
своих элементов не только данные, но и функции элементы. Функция эле
мент - это функция, объявленная внутри определения класса и тесно
связанная с типом этого класса. В нашем примере - это операции которые выполняются в сберегательных банках. Наш объект 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;
}

Иерархия классов

Наследование может использоваться множество раз при порождении
объектов. Порожденные классы могут наследовать готовые функции элементы своих классов-предков, набирая при каждом порождении все больше
и больше функций элементов.
Окно
^
Наследование Панель Порождение
классов
v
Меню
Вы можете также порождать несколько классов из базового класса:
^ Меню
Насле- Порождение
дование > < классов
v
Вертикальное Горизонтальное
Вертикальное и Горизонтальное меню имеют одного предка - Меню.
Общее свойство, унаследованное от Меню - это список элементов, расположение. Порождение нескольких классов из одного корня позволяет
использовать текст программ для многих классов.
Используя наследование, можно наращивать иерархию классов, создавая как-бы древовидные формы. Еще более сложные иерархии образуются
через множественное наследование.

Инкапсуляция или скрытие данных

Понятие инкапсуляция означает, что функции элементы и структуры
данных, определяющие некоторые свойства данного класса, рассматриваются в качестве единого целого. Это подразумевает "защиту" данных в
пределах класса таким образом, что только элементы класса получают к
ним доступ. То есть, для того чтобы получить значение одного из элементов данных класса, нужно вызвать функцию элемент этого класса, ко-
торый возвращает необходимое значение. Для присвоения элементу значения, вызывается соответствующая функция элемент данного класса. Вообще, в объектном программировании считается хорошим тоном закрывать
все данные и функции элементы описываемого класса для доступа "извне".
Borland C++ предоставляет программистам три уровня доступа к
элементам объектов:
- public (общий),
- private (приватный),
- protected (защищенный).
Элементы, объявленные общими, будут доступны любому внешнему
элементу класса, любой функции элементу или выражению в программе,
когда объект является видимым.
Приватные элементы доступны только другим элементам своего же
класса. Они не доступны извне, за исключением специальных функций,
называемых "дружественными".
К защищенным элементам имеют доступ лишь некоторые из объектов.
Они доступны только элементам своего класса и любым его потомкам. Поэтому защищенные элементы занимают промежуточное положение между общими и приватными.
Примечание: приватные элементы недоступны потомкам своего класса. Поэтому и понадобились защищенные элементы.
Уровень доступности к элементам класса проиллюстрирован ниже:
Общие элементы
(public)
Защищенные
элементы (protect)
Приватные
элементы
(private)
Умелое использование уровней доступа повышает надежность программ и их способность к изменениям, ослабляя взаимозависимость между
объектами. Правильно описанными функциями элементами типа public можно изменять приватные элементы, не затрагивая программный код других
объектов. В реальной жизни мы подобным образом взаимодействуем с различными предметами: телевизором, будильником, радиоприемником, автомобилем - знание внутреннего устройства которых нам не обязательно.
Однако, нам важны внешние кнопки и ручки управления.

Использование ключевого слова 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. Таким образом она работает с объектами любого типа.

Использование переменных 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;
};

Изучение ООП на маленьком примере

Одно из важных достоинств 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 элементов

Класс 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()
};

Класс 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); // Дополнительная функция вычисления объема
};

Класс 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); // Функция, вычисляет поверхность
};

Классы - как строительные блоки

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

На схеме показан процесс создания классов:
Данные Комплексирование
классов
double big_bucks;
Функции > Bank
void deposit();
double withdraw();
>
Создание классов
Подобно тому, как структуры в Си используют для своей спецификации внутренние переменные, так классы в С++ используют для своей спецификации элементы-данных и функции-элементы. Для каждого задействованного, при написании программы класса, транслятор порождает соответствующие строки кода.

Когда тип не проверяется

Как вы уже могли заметить, указатель базового класса, такой как
*p фигуры shape, может указывать не только на объект shape, но также
и на объект circle. Это делается без указания типа. Фактически, вы
можете использовать базовый указатель класса, для указания на любой
порожденный объект. Например, *p может указывать на rect, на box3d,
на cylinder и так далее. Вот такие возможности заложены в указателях.
Однако, преобразование неверно. Например, указатель круга circle
не может указывать на объект shape. Почему? Потому что радиус radius
круга отсутствует у фигуры shape. Так если вы попытались сделать из
фигуры круг, без радиуса, то вероятно будет ошибка.

Конструктор 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);
};

Максимальное заимствование!!

Функция area() вычисляет поверхность занимаемую цилиндром
(2pi*rh).
double cylinder::area()
{
return 6.283 * radius * ht;
}

Множественное наследование

Под множественным наследованием понимается способность наследования свойств и поведения не от одного базового класса, а от нескольких. Такое наследование легко проследить по классификации языков
программирования. У каждого из языков, как правило несколько предков.
Так язык программирования С++ является потомком Си и Симулы, язык Ада
потомком целого спектра языков и так далее.
Си Симула
^
< >
Насле- Порождение
дование классов
С++
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
Примечание: по установившейся практике стрелки показывают
от порожденного класса на базовый.
Выбрав любой из классов, вы можете найти в его определении
унаследованные и новые свойства.

На передовой 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().

Начнем с алгоритма декомпрессии на языке 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);
}
}

Наш декомпрессор в стиле фильтра

Декомпрессор, работающий в посимвольном режиме будет выглядеть
так:
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;
}

Наследование

Наследование - это способность брать существующий - базовый
класс и порождать из него новый класс - потомок, с наследованием всех
его атрибутов и поведения. Это пожалуй самая впечатляющая возможность
объектно-ориентированного программирования и, возможно, единственное
коренное отличие С++ от Си.
Рассмотрим отвлеченный пример из реальной жизни - классификационную схему живых организмов. По этой схеме растительные и живые
царства делятся на группы, так называемые типы. Каждый тип, в свою
очередь, делится на классы, отряды, семейства и далее. Группы более
низкого уровня наследуют характеристики групп более высоких уровней.
Так, из утверждения о том, что волк относится к семейству псовых, вытекает сразу несколько положений. Из него следует, что у волков хорошо развиты слух и обоняние, поскольку таковы характеристики псовых.
Так как псовые входят в отряд хищных, это утверждение говорит еще о
том, что волки питаются мясом. Поскольку хищные относятся к млекопитающим, это утверждение говорит и о том, что волки имеют волосяной
покров и регулируемую температуру тела. Наконец, так как млекопитающие являются позвоночными, мы узнаем и то, что у волков есть позвоночник.
Волк -> Псовые -> Хищники -> Млекопитающие -> Позвоночные
Подобные схемы наследования можно проследить в классификации
языков программирования, классификации типов компьютеров и других.
Рассмотрим существующие в объектно-ориентированных языках иерархии
порождаемых объектов.

Несколько слов о проектировании иерархии классов

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

Ниже описан главный фрагмент нашей программы декомпрессии

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);
}
Отметим, что главная программа не знает как работает сам декомпрессор. Она только передает ему аргументы. Декомпрессор, обрабатывая
один символ за раз, может перенаправить его по множеству путей. Так,
он мог бы был выведен непосредственно на экран, как мы это делаем
здесь, передан подпрограмме поиска строки или анализатору ... в соответствии с концепцией.

Объявление виртуальных функций элементов

Фактически, мы уже видели как это делается на примере класса
shape, однако, рассмотрим еще раз этот процесс:
class shape {
public:
double xo, yo;
shape(double x, double y); // Конструктор создания shape (фигуры)
virtual double area(void); // Функция вычисляющая поверхность
virtual draw(void); // Функция рисования shape
}; ^
Ключевое слово virtual
Виртуальные функции объявляются с использованием ключевого слова
virtual. Отметим, что virtual используется только в базовом классе, а
не в классах - потомках.

Обзор и важные концепции

Библиотека классов 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

Передача значений в 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);

Переменные 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;


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

Одним из нововведений в С++ является новый вид переменных -
ссылки. Ссылка - переменная, задаваемая указателем. Чтобы сделать переменную ссылкой, необходимо после описателя типа поставить операцию
'&'. Ссылка схожа с переменной во всем, однако, на самом деле она
совпадает с другой переменной, адрес которой указывается при объявлении ссылки.
В Си, если вы хотите непосредственно работать с передаваемой в
функцию переменной, вам нужно передать указатель на эту переменную.
При этом нужно соблюдать соответствующий синтаксис и помнить о том,
что указатель требуется разыменовать. С++ позволяет вам с помощью
ссылки передавать и модифицировать действительное значение переменной.
Си Турбо и 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++ от языка Си является смена разделителя с '->' на '.'.

Переопределение операций

Поскольку в С++ операции, рассматриваются как функции, то очевидно, что и их можно переопределять так, что они будут работать не
только с числами, а даже с графическими объектами, строками и вообще
с чем угодно. В С++ число операций ограничено стандартным набором:
[] () . -> ++ --
& * + - ~ !
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)).


  • Поддержка объектно-ориентированного программирования

    ООП в корне меняет положение, снабжая программные объекты,
    встроенными характеристиками, которые помогают справиться со все возрастающей сложностью разработки программного обеспечения.
    Большинство новых возможностей Borland С++ - это поддержка ООП,
    с его важнейшими понятиями: инкапсуляцией, наследованием и полиморфизмом.
    Компилятор Borland C++ имеют и другие - не объектно-ориентированные расширения, улучшающие программирование по сравнению с последней версией компилятора фирмы Borland языка Си - Турбо Си версии 2.0.
    Это - прототипы функций, встроенные функции, переопределяемые функции, функции-операции, предопределяемые аргументы, переменные-указатели, шаблоны, средства обработки исключительных ситуаций и другие.
    Для информации ниже приводятся последние возможности, введенные
    в четвертой версии компилятора.

    Полиморфизм

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

    Например, как функция элемент draw():
    rectangle.draw(); jigsaw.draw();

    Потоки ввода-вывода

    Потоком ввода-вывода называется абстрактное понятие, относящееся
    к любому переносу данных от источника (или поставщика данных) к приемнику (или потребителю) данных.
    В Турбо и 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.

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

    В случае переопределяемых функций компилятор умеет отличать один
    вызов от другого по типу их аргументов. Используя эту информацию, он
    "жестко" связывает коды программы с соответствующими функциями элементами. С другой стороны, бывает необходимо отличить один вызов от
    другого, при наличии аргументов одного типа на этапе выполнения, и
    обеспечить потомки класса разными версиями функций базового класса.
    Именно использование ключевого слова 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!
    Так как вызов невиртуальной функции-элемента выполняется несколько быстрее, чем виртуального, то в общем случае рекомендуется,
    когда не встает вопрос о расширяемости, но существенное значение имеет производительность, пользоваться обычными функциями элементами. В
    противном случае, нужно пользоваться виртуальными.

    Пример класса с виртуальными функциями элементами

    Определим класс 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); < Конструктор
    };

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

    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: }

    Прототипы функций

    Прототипы функций в С++ записываются ранее того места, где эта
    функция будет использована. Это позволяет компилятору контролировать
    типы вызываемых функций. Рассмотрим, например, ошибочную функцию по
    вычислению налога на добавленную стоимость:
    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;
    }
    Это реализация функции. Она может быть подключена из другого
    файла.

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

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

    Действие механизма переопределяемых функций несколько сходно с
    механизмом функции переключателя 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;}

    Расширяемость кода

    Наследование позволяет повторно использовать существующие исходные тексты программ, подправлять их и перекомпилировать. Эта способность готового к компиляции исходного текста названа расширяемостью.
    Наследование >
    Новый класс
    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() у окружности, и одна у фигуры. Заимствование этих двух функций, для цилиндра оставляет возможность доступа к ним.
    Примечание: порожденный класс может только наращивать базовый класс,
    но не способен удалять какие-либо элементы.
    Программист, без исходного текста программы, располагая лишь
    описанием интерфейса с некоторым классом, может определить новый
    класс, наследующий все свойства базового. После этого он может выборочно переопределить поведение некоторых функций элементов базового
    класса так, как ему нужно.

    Си с классами

    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); // обращение к нему
    }
    В общем случае семантика С++ намного более сложная по сравнению
    с Си, однако, это ведет к большей надежности и заставляет программистов быть более "дисциплинированными".

    Скрытие данных в потомках

    При порождении потомка класса у вас есть выбор в определении типа элементов. По умолчанию элементы базового класса автоматически получают приватный тип, если только вы не захотите иначе. Использование
    же ключевого слова public, при порождении потомка класса, делает все
    элементы базового класса общими в порожденном классе. Приватные элементы базового класса остаются приватными, и не будут доступны из потомков. Вот где требуются защищенные элементы (protect).
    Замечание. Если вы хотите использовать в потомке класса элементы базового класса, то они должны быть объявлены как защищенные
    или общие. Доступ к приватным элементам базового класса
    невозможен никак иначе, как из их приватных функций элементов или с помощью дружественных функций, объявленных
    как friend.
    В приведенной ниже таблице показана доступность элементов базового класса для его потомка (в зависимости от определенного типа
    доступа в базовом классе и потомке):
    Тип доступа в Тип доступа Доступность элеме-
    базовом классе в потомке нта базового класса
    приватный приватный недоступен
    защищенный приватный приватный
    общий приватный приватный
    приватный общий недоступен
    защищенный общий защищенный
    общий общий общий
    По мере изучения материала вы познакомитесь с многочисленными
    примерами использования управления доступом.

    Создание новых классов 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;
    ^
    Селектор

    Странные вызовы конструктора

    Обратите внимание на забавные вызовы конструктора базового
    класса - использование операции ':' после заголовка функции, и перед
    телом функции. Конструктор порожденного класса вызывает конструктор
    базового класса, используя синтаксис вызова функции.
    circle::circle(double x, double y, double r)
    : shape(x,y) < Заметьте как конструктор circle вызывает
    конструктор shape с начальной установкой
    {
    radius = r;
    }

    Связывание функций

    В случае раннего связывания адреса всех функций и процедур определяются на этапе компиляции и компоновки программы, т.е. до выполнения программы.
    Вызовы функции: Описания функций:
    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++ позволяют вводить статические объекты. Статические объекты размещаются в сегменте данных на этапе компиляции вместе с другими статическими переменными. Это улучшает эффективность использования памяти
    и быстродействие по сравнению с динамически размещаемыми объектами.

    Улучшение алгоритма

    Хотя наш алгоритм работает чудесно, но он довольно ограничен в
    своих возможностях, так как может декомпрессировать только непосредственно на экран. Поскольку цикл 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; /* Обнуление счетчика длины строки */
    }

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

    Поверхность фигуры shape в качестве исходного значения имеет 0.
    Порожденные классы вероятно подменят эту функцию.
    double shape::area()
    {
    return 0;
    }

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

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

    и поддержки приложений 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) в
    поставляемых заголовочных файлах.

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

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

    Ниже показана взаимосвязь старых структур Си, новых структур 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); < Еще одна функция элемент
    };

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

    Наследование это ключевая часть объектно-ориентированного программирования. Наследование экономит массу времени на изучение свойств
    всех классов. Каждый новый порожденный класс обладает уже известными
    унаследованными свойствами, оставляя для изучения только дополнительные поля и свойства. Наследование позволяет на хорошем уровне разделять код и данные, а также разрешает полиморфизм (см. далее).
    Другая выгода от наследования заключается в модульности классов.
    Так, вы можете распространять ваши классы в объектном виде среди других программистов. На их базе они смогут порождать новые, специализированные классы. При этом без знания вашего исходного текста. Уже появилось большое количество библиотек классов различных фирм (см. приложение 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); < Здесь вызывается конструктор
    ...

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

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

    Защита данных

    Банковская информация, как правило, доступна только ограниченному (разрешенному) кругу лиц. Делается это путем присвоения ей приватного уровня доступа. Например:
    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). В этом случае они открыты, даже функциям элементам
    других классов.

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

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

    Для отладки программного кода С++ предусмотрен ряд макрокоманд, которые находятся в 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Ч
    Чтобы создать диагностическую версию выполняемой программы,
    разместите в ее важнейших точках диагностические макрокоманды и
    скомпилируйте а разрешением соответствующего идентификатора. Диагностическая версия библиотек классов строится аналогично.

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


    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 Вычисляет гиберболический тангенс.


    Функции-элементы


    Constructor Строит объект TCriticalSection.
    Destructor Уничтожает этот объект.


    Функции-элементы


    Constructor Запрашивает блокировку объекта TCriticalSection. Если не установлена блокировка этого объекта другим объектом, то блокировка разрешается, и выполнение продолжается.
    Destructor Снимает блокировку.


    Функции-элементы


    Constructor Строит объект TMutex.
    Destructor Уничтожает объект TMutex.
    HANDLE Возвращает описатель соответствующего объекта
    семафора Windows NT.


    Функции-элементы


    Constructor Запрашивает блокировку объекта TMutex. Если
    никакой объект в другой нити не установил блокировку на объекте TMutex, то блокировка
    допускается и выполнение продолжается. В противном случае запрашивающая нить блокируется, пока блокировка не будет снята.
    Release Отменяет блокировку объекта TMutex.


    Функции-элементы


    Constructor Используемый по умолчанию конструктор или
    конструктор копирования. Не копирует объект
    TCriticalSection.
    Operator = Присваивает объект цели и не копирует объект
    TCriticalSection.


    Функции-элементы


    Constructor Запрашивает блокировку критической секции
    объекта TSync, на который указывает параметр.
    Если никакой объект в другой нити не установил блокировку на объекте TCriticalSection,
    то блокировка допускается и выполнение продолжается. В противном случае запрашивающая
    нить блокируется, пока блокировка не будет
    снята.
    Destructor Снимает блокировку.


    Функции-элементы


    Constructor Строит объект TThread.
    Destructor Уничтожает объект TThread.
    GetPriority Получает приоритет нити.
    GetStatus Возвращает текущее состояние нити.
    Resume Возобновляет выполнение приостановленной нити.
    Start Возобновляет выполнение нити и возвращает ее
    описатель.
    SetPriority Устанавливает приоритет нити.
    Suspend Приостанавливает выполнение нити.
    Terminate Устанавливает внутренний флаг, который указывает, что нить должна завершиться. Производный класс может проверять состояние с помощью
    ShouldTerminate.
    TerminateAndWait Комбинирует поведение Terminate и WaitForExit. Устанавливает внутренний флаг завершения нити и блокирует вызывающую нить на время существования внутренней нити или пока не истечет время тайм-аута.
    WaitForExit Блокирует вызывающую нить на время существования внутренней нити или пока не истечет
    время тайм-аута.
    ShouldTerminate Возвращает ненулевое значение, показывающее
    что вызвана функция Terminate или TerminateAndWait, и что нить завершила обработку и завершилась.
    operator = Операция присваивания нити.


    Функции-элементы


    Constructor Строит объект TTime.
    AsString Возвращает строковый объект, содержащий время.
    BeginDST Возвращает начало ввода летнего времени для
    текущего года.
    Between Возвращает 1, если заданное время находится
    между установленными значениями, и 0 в противном случае.
    CompareTo Сравнивает заданное время с объектом TTime и
    возвращает 0, если они совпадают, 1, если заданное время меньше, и -1, если больше.
    EndDST Возвращает время, когда для текущего года заканчивается летнее время.
    Hash Число секунд с 1 января 1901 года.
    Hour Часы в локальном времени.
    HourGMT Возвращает часы по Гринвичу.
    IsDST Возвращает 1, если время указано в летнем
    времени.
    IsValid Возвращает время, если TTime содержит допустимое время.
    Max Возвращает объект TTime или заданное время t,
    в зависимости от того, что из них больше.
    Minute Возвращает минуты в локальном времени.
    MinuteGMT Возвращает минуты по Гринвичу.
    PrintDate Устанавливает параметр в 1 для печати даты
    вместе со временем и 0 в противном случае.
    Second Возвращает секунды.
    Seconds Возвращает секунды с 1 января 1901 года.
    AssertDate Возвращает 1, если дата находится между минимальной допустимой датой (RefDate) и максимальной допустимой датой (MaxDate).

    Кроме того, для данного класса определены операции <, <==,
    >, <=, >=, ==, !=, -, +, ++, --, +=, -=, << и >>.

    Функции-элементы


    Constructor Создает из double числовой тип complex с мнимой и вещественной частью.


    Функции-элементы


    Constructor Обеспечивает сравнение информации о типах.
    before Используется для сравнения лексического порядка типов
    frame Возвращает печатаемую строку, идентифицирующую имя операнда typeid.
    name Аналогична frame, но frame используется в
    большой модели памяти.


    Функции-элементы


    Constructor Этот класс не имеет заданного по умолчанию
    конструктора. Каждое использование xalloc
    должно определять сообщение, выводимое при
    невозможности выделения памяти заданного размера.
    raise Приводит к вызову xalloc.
    requested Возвращает число байт, запрошенных при распределении.


    Функции-элементы


    Constructor Этот класс не имеет заданного по умолчанию
    конструктора. Каждый объект xmsg должен определять сообщение явным образом.
    raise Приводит к вызову xmsg.
    why Выводит строку, использованную для построения
    xmsg. Каждый экземпляр должен иметь уникальное сообщение.


    Функции-элементы


    Constructor Строит объект TDate.
    AsString Конвертирует объект TDate в строку.
    Between Возвращает 1, если объект TDate находится
    между двумя заданными датами.
    CompareTo Возвращает 1, если целевой TDate больше параметра TDate, или -1, если меньше.
    Day Возвращает день в году (от 1 до 365).
    DayName Возвращает строку с именем дня недели.
    DayOfMonth Возвращает число месяца (от 1 до 31).
    DayOfWeek Возвращает число, связанное с именем дня недели.
    DaysInYear Возвращает число дней в указанном году.
    DayWithinMonth Возвращает 1, если заданный день года находится в указанном месяце.
    FirstDayOfMonth Для заданного TDate возвращает номер первого
    дня в месяце.
    Hash Возвращает для даты хеш-значение.
    IndexOfMonth Возвращает номер указанного месяца (от 1 до
    12).
    IsValid Возвращает 1, если TDate является допустимым,
    и 0 в противном случае.
    Jday Преобразует дату григорианского календаря в
    соответствующую дату юлианского.
    Leap Возвращает 1, если год TDate является високосным, и 0 в противном случае.
    Max Сравнивает данный TDate с заданным аргументом
    даты и возвращает дату с большим юлианским числом.
    Min Сравнивает данный TDate с заданным аргументом
    даты и возвращает дату с меньшим юлианским числом.
    Month Возвращает для данного TDate номер месяца.
    MonthName Возвращает название месяца по его номеру.
    NameOfDay Возвращает для данного TDate название дня.
    NameOfMonth Возвращает для данного TDate название месяца.
    Previous Возвращает для TDate предыдущий dayTime или
    наоборот.
    SetPrintOption Устанавливает для всех объектов TDate параметр печати и возвращает старые значения.
    WeekDay Возвращает номе дня недели.
    Year Возвращает для данного TDate год.
    AssertIndexOf-Month Возвращает 1, если заданный аргумент лежит между 1 и 12 включительно, иначе возвращается 0.
    AssertWeekDay-Number Возвращает 1, если заданный аргумент лежит между 1 и 7 включительно, иначе возвращается 0.

    Кроме того, для данного класса определены операции <, <==,
    >, <=, >=, ==, !=, -, +, ++, --, +=, -=, << и >>.

    Функции-элементы


    Constructor Создает объект TFile с заданными атрибутами.
    Close Закрывает файл. В случае успешного выполнения
    возвращается 0.
    Flush Выполняет все незавершенные операции ввода-вывода.
    GetHandle Возвращает описатель файла.
    GetStatus Возвращает текущий статус файла.
    IsOpen Возвращает 1, если файл открыт, и 0 в противном случае.
    Lenght Возвращает длину файла.
    LockRange Блокирует заданное число байт, начиная с указанной позиции.
    Open Открывает файл и указанным именем и атрибутами.
    Position Возвращает текущую позицию от начал файла.
    Read Считывает из файла в буфер заданное число
    байт.
    Remove Переименовывает заданный файл, присваивая ему
    указанное имя.
    Seek Изменяет позицию указателя файла, устанавливая его в заданное смещение от начала.
    SeekToBegin Перепозиционирует указатель файла на начало
    файла.
    SeekToEnd Перепозиционирует указатель файла на конец
    файла.
    SetStatus Устанавливает статус заданного файла.
    UnlockRange Разблокирует диапазон байт в заданной позиции.
    Write Записывает заданное число байт из буфера в
    файл.


    Функции-элементы


    Constructor Строит строку различных видов.
    Destructor Уничтожает строку и освобождает все выделенные объекту ресурсы.
    ansi_to_oem Преобразует целевую строку из ANSI в OEM.
    append Присоединяет строку к целевой строке.
    assign Присваивает строку целевой строке.
    compare Сравнивает целевую строку с заданной строкой.
    В зависимости от результата сравнения возвращается результат больший, равный или меньший
    нулю.
    contain Возвращает 1, если заданная строка содержится
    в целевой строке, и 0 в противном случае.
    copy Копирует заданное число символов из целевой
    строки в указываемый массив и возвращает число скопированных символов.
    c_str Возвращает указатель на завершающийся нулем
    массив символов, который содержит те же символы, что и строка. Возвращаемый указатель
    должен указывать на фактическое содержимое
    строки или на массив.
    find Находит первое вхождение строки в целевой
    строке, возвращая позицию в этой строке. Допускает использование регулярных выражений.
    find_first_of Находит первое вхождение в целевой строке любого символа, содержащегося в заданной строке. В случае успешного поиска возвращает позицию символа.
    find_first_not_of Находит первое вхождение в целевой строке любого символа, не содержащегося в заданной строке. В случае успешного поиска возвращает позицию символа.
    find_last_of Находит последнее вхождение в целевой строке любого символа, содержащегося в заданной строке. В случае успешного поиска возвращает позицию символа.
    find_last_not_of Находит последнее вхождение в целевой строке любого символа, не содержащегося в заданной строке. В случае успешного поиска возвращает позицию символа.
    get_at Возвращает символ в заданной позиции.
    get_case_sensitive_flag Возвращает 0, если при в операциях сравнения строк различается регистр символов, и 1 в противном случае.
    get_initial_capacity Возвращает число символов, которые поместятся в строке без изменения ее размера.
    per_max_size Возвращает размер доступного свободного пространства после изменения размера строки.
    get_paranoid_checkid Возвращает 1 при разрешении проверки parano.
    get_resize_increment Возвращает величину увеличения строки.
    get_skipwhitespace_flag Возвращает 1 при пропуске пробелов и 0 в
    противном случае.
    hash Возвращает хеш-значение.
    initial_capacity Устанавливает емкость начальной строки.
    is_null Возвращает 1, если строка пуста, и 0 в противном случае.
    length Возвращает число символов в целевой строке.
    max_waste Устанавливает максимальный размер свободного
    пространства и изменять размер строки.
    oem_to_ansi Функция Windows для преобразования целевой
    строки из ANSI и OEM.
    prepend Присоединяет к заданной строке целевую строку.
    put_at Заменяет символ в заданной позиции указанным
    символом.
    read_file Считывает данные из входного потока, пока не
    встретится EOF или нулевой символ.
    read_line Считывает данные из входного потока, пока не
    встретится EOF или символ новой строки.
    read_string Считывает данные из входного потока, пока не
    встретится EOF или нулевой символ.
    read_to_delim Считывает данные из входного потока, пока не
    встретится EOF или ограничитель.
    read_token Считывает данные из входного потока, пока не
    встретится пробел (начальные пробелы пропускаются).
    rfind Находит последнее вхождение заданной строки в
    целевой строке, возвращая позицию начала этой строки.
    remove Удаляет символы, начиная с заданной позиции
    до конца целевой строки и возвращает ссылку на результат.
    replace Удаляет из целевой строки заданное число символов, начиная заданной позиции, и заменяет их копией указанной строки.
    reserve Возвращает зависящее от реализации значение,
    указывающее текущий внутренний размер хранения (всегда больше длины length()).
    resize Изменяет размер строки на заданное число символов, при необходимости усекая или добавляя пробелы.
    resize_increment Устанавливает размер приращения для автоматического изменения размера.
    set_case_sensitive Задает различимость регистра символов.
    set_paranoid_check При поиске строки используется хеш-значение. Есть вероятность, что две строки будут иметь одно хеш-значение. Вызов этой функции обеспечивает проверку такой ситуации.
    skip_whitespace Задает пропуск символов при считывании лексемы или интерпретацию их как значащих символов.
    strip Отсекает заданное число символов, начиная с
    конца или начала строки.
    substr Создает строку, содержащую копию символов,
    начиная с заданной позицию до конца целевой строки.
    substring Создает объект TSubString, содержащий копию
    символов, на которые указывает параметр.
    to_lower Преобразует строку в нижний регистр.
    to_upper Преобразует строку в верхний регистр.
    assert_element Если задан недопустимый элемент, порождает
    исключительную ситуацию outrange.
    assert_index Если задан недопустимый индекс, порождает
    исключительную ситуацию outrange.
    valid_element Возвращает 1, если позиция задает элемент
    строки, и 0 в противном случае.
    valid_index Возвращает 1, если позиция задает допустимый индекс строки, и 0 в противном случае.

    Для строк определены также операции =, +=, +, [], (), ==,
    !=, <, <=, >, >=, >> и <<.

    Функции-элементы


    get_at Возвращает символ в заданной позиции. Если
    позиция > length()-1, то генерируется исключительная ситуация.
    is_null Возвращает 1, если строка пуста, и 0 в противном случае.
    length Возвращает длину подстроки.
    put_at Заменяет символ в заданной позиции. Если позиция > length(), то генерируется исключительная ситуация.
    start Возвращает индекс начального символа.
    to_lower Преобразует подстроку в нижний регистр.
    to_upper Преобразует подстроку в верхний регистр.
    assert_element Возвращает 1, если заданная позиция представляет допустимый индекс в подстроке, и 0 в противном случае.

    Для подстрок определены также операции =, (), [], ==, != и !.

    Функции-элементы


    Constructor Определяет переменную bcd различных типов.


    Функция 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 не возвращает управления, однако может генерировать исключительную ситуацию.

    Глобальные переменные и классы

  • Потоковые классы С++

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

  • Контейнерные классы С++ от TMArray... до TIHash...

  • Контейнерные классы С++ от TMList... до TShould...

  • Математические классы С+

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


  • Используемые по умолчанию макрокоманды диагностики


    Макрокоманда Назначение
    CHECK Выводит заданное в аргументе условие и генерирует исключительную ситуацию, если это условие равно 0. Используйте ее для проверки
    значений в функции.
    PRECONDITION Выводит заданное в аргументе условие и генерирует исключительную ситуацию, если это условие равно 0. Используйте ее для проверки
    допустимости аргументов функции или проверки
    корректности вызова функции.
    TRACE Выводит заданное в аргументе сообщение. Используется для вывода общих сообщений, не зависящих от конкретного условия.
    WARN Выводит заданное сообщение, если определенное
    в аргументе условие не равно 0. Используется
    для условного вывода сообщений.


    Элементы данных


    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.


    Класс 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.

    Класс complex (comnplex.h)

    Создает комплексные числа. Вы можете свободно использовать
    эти числа в выражениях совместно с числами int, double и другими
    числовыми типами, а также стандартными математическими функциями Си.
    Класс complex переопределяет операции +, -, *, /, +=, -=,
    *=, /=, == и !=. Для потокового ввода-вывода переопределяются
    операции >> и <<.

    Класс String (cstring.h)

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

    Класс TCriticalSection::Lock (thread.h)

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

    Класс TCriticalSection (thread.h)

    Этот класс обеспечивает системно-независимый интерфейс для
    критических секций нитей. Объект этого класса может использоваться в сочетании с объектами TCritical::Lock чтобы гарантировать,
    что в каждый момент времени в критической части кода может выполняться только одна нить.

    Класс TDate (date.h)

    Класс TDate представляет дату. Он имеет элементы для чтения,
    записи и преобразования даты.

    Класс TFileStatus (file.h)

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

    Класс TMutex::Lock (thread.h)

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

    Класс TMutex (thread)

    Этот класс обеспечивает системно-независимый интерфейс для
    критических секций в нитях. Объекты этого класса можно использовать в сочетании с TMutex::Lock и обеспечивать выполнение любой
    защищенной блокировкой секции кода только одной нитью.
    Разница между классами TMutex и TCritical в том, что при
    создании блокировки с использованием TMutex можно задать
    тайм-аут, и объект TMutex имеет описатель HANDLE, который может
    использоваться вне класса.

    Класс TSync::Lock (thread.h)

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

    Класс TSync (thread.h)

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

    Класс TThread (thread.h)

    Обеспечивает для нитей системно-независимый интерфейс. Состояния нити определяются следующим образом:

    Состояние Описание
    Created Объект создан, но нить не запущена. Это состояние может перейти только в Running, что происходит при вызове Start.
    Running Нить успешно запущена. Пользователь может вызвать Suspend, приостановив выполнение нити. Resume возобновляет выполнение. Когда нить завершается, объекты переходят в состояние Finished.
    Suspended Нить приостановлена пользователем. Resume возобновляет выполнение.
    Finished Нить завершила выполнение. Допустимые переходы
    из этого состояния отсутствуют.


    Класс TTread::TThreadError (thread.h)

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

    Класс xalloc (except.h)

    Сообщает об ошибке при запросе распределения памяти.

    Класс xmsg (except.h)

    Выводит сообщение, соответствующее исключительной ситуации.

    Математические классы С+

    Данный раздел описывает математические операции Borland С++
    на основе классов С++. Эти операции можно использовать только в
    программах C++. Однако программа С++ может использовать любые
    стандартные математические подпрограммы Си ANSI.
    Числовые типы строятся на основе двух классов - bcd и complex. Наряду с этими числовыми типами каждый класс определяет
    функции для выполнения операций с соответствующими типами. Каждый
    класс также переопределяет все необходимые операции.

    Поддержка этапа выполнения

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

    Расширенные макрокоманды диагностики


    Макрокоманда Назначение
    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 или выше игнорируются.

    Типы ошибок


    Ошибка Описание
    SuspendBeforeRun Пользователь вызвал Suspend перед вы зовом Start.
    ResumeBeforeRun Пользователь вызвал Resume перед вы зовом Start.
    ResumeDuringRun Пользователь вызвал Resume для нити,
    которая не была приостановлена.
    SuspendAfterExit Пользователь вызвал Suspend для объекта, нить которого уже завершилась.
    ResumeAfterExit Пользователь вызвал Resume для объекта, нить которого уже завершилась.
    CreationFailure Операционная система не смогла создать нить.
    DestroyBeforeExit Перед завершением нити вызван деструктор объекта.
    AssignError Попытка присвоить объект, не находящий ся в состоянии Create или Finish.


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

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

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

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

    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).


    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.


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

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

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

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

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

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

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

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

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

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

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

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


  • Директива !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, она открывает заданный файл и считывает его содержимое, как если бы
    строки файла включения являлись бы строками самого формирующего
    файла.

    Директивы 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 Задает отмену описания заданной макрокоманды.


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

    Чтобы добавить к проекту цель, сделайте следующее:
  • Выберите в основном меню 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.


  • 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.

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


    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


    Файл 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".

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

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

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

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

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

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

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

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

    Описатель {Класс} Модуль Позиция "Заголовок"
    Линии слева показывают структуру дерева. С помощью этих линий каждое окно соединяется с его предком, "братскими" окнами и
    потомками. Линии рисуются таким же образом, как в администраторе
    файлов. Ромб после каждого окна показывает, имеет ли окно дочерние окна. Если он пустой, то дочерних окон нет. Если он содержит
    символ +, то дочерние окна имеются, но они не показаны. Если он
    содержит символ -, то имеются дочерние окна, и они выведены в
    древовидной схеме (видим по крайней мере один уровень дочерних
    окон, другие уровни могут быть скрыты).
    "Описатель" - это описатель окна, возвращаемый 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) она перехватывает эти структуры и включает их в
    вывод.


  • Функции в 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 файла определения модуля.











  • Импорт класса

    Чтобы импортировать класс из одного проекта 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, что позволит отследить за один сеанс более одной исключительной ситуации.

    Инсталляция и настройка 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
    значительно улучшит производительность работы (при отсутствии
    сопроцессора он эмулируется).

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

    В пакет 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
    Помогают обслуживать проекты и компонуют
    только те файлы, которые были изменены после последней генерации программы.


    Использование AppExpert

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

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

  • Использование Resource Workshop для редактирования или добавления ресурсов.

  • Использование администратора проекта для построения выполняемой программы.

  • Для каждого приложения AppExpert создает следующие файлы:

    Тип файла Описание
    .IDE Файл проекта.
    .CPP Основной исходный файл.
    .H Основной файл заголовка.
    .RC Файл сценария ресурса.
    .RH Файл заголовка ресурса.
    .APX Файл базы данных для AppExpert.
    .RC Файл сценария ресурса
    .RTF Исходные файлы справочника.
    .HPJ Файл проекта справочника.
    .ICO Файлы пиктограмм.
    .BMP Файлы битовых массивов.


    Использование библиотек

    Данный раздел описывает несколько инструментальных средств,
    которые позволяют вам работать с библиотечными файлами. Вы можете
    использовать эти инструментальные средства в IDE или в командной
    строке.
  • Утилита IMPLIB создает библиотеки импорта, а IMPDEF - файлы определения модуля (.DEF). Библиотеки импорта и файлы
    определения модулей задают для компоновщика информацию об
    импортируемых из библиотек DLL функциях.

  • Утилита TLIB управляет библиотеками отдельных файлов .OBJ.
    Библиотека - это удобный инструмент для работы с набором
    объектных модулей.


  • Использование ClassExpert

    ClassExpert позволяет вам создавать новые классы, редактировать и обновлять реализацию классов, а также перемещаться по
    классам в исходном коде приложений AppExpert. Чтобы связать классы с ресурсами, вы можете использовать ClassExpert с Resource
    Workshop.

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

    При работе с большим числом операций или при многократном
    повторении определенного числа операций удобно пользоваться файлами подсказки. Файл подсказки представляет собой текстовый файл
    в обычном формате ASCII (который может быть создан с помощью редактора системы Borland C++), содержащий все команды утилиты TLIB
    или какую-то их часть. С помощью файлов подсказки вы можете создавать команды утилиты TLIB, размер которых превышает размер командной строки DOS (128 символов).
    Для использования файла подсказки "имя_маршрута", в любой
    позиции командной строки утилиты TLIB нужно задать @"имя_маршрута".
  • Файл подсказки может состоять из нескольких строк текста;
    чтобы показать, что за данной строкой следует еще одна, в
    конце текущей строки необходимо набить символ "логического
    И" (&).

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

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


  • Использование формирующих файлов

    Формирующий файл содержит описания и отношения, необходимые
    программе MAKE для поддержания самых последних версий ваших программ. Вы можете создавать столько формирующих файлов, сколько вам
    требуется и присваивать им произвольные имена; MAKEFILE представляет собой лишь имя, используемое по умолчанию, на которое ориентируется утилита MAKE, если при ее запуске имя формирующего файла
    не задано.
    Формирующий файл можно создать с помощью любого текстового
    редактора, который поддерживает формат ASCII, например, встроенного редактора интегрированной среды, редакторов Sрrint,
    MicroStar или SideKick. Все правила, описания и директивы завершаются концом строки. Если строка является слишком длинной, то вы
    можете продолжить ее на следующей строке, поместив на текущей
    строке в качестве последнего символа обратную косую черту (\).
    Для разделения соседних идентификаторов (например, при задании последовательностей) и для задания структурного отступа команд внутри правила следует пользоваться пробельными символами
    (пробелами и знаками табуляции). Формирующий файл может содержать комментарии, явные и неявные правила, макрокоманды и директивы.

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

    Компиляторы BCC.EXE (компилирует 16-разрядные приложения) и
    BCC32.EXE (компилирует 32-разрядные приложения) работают одинако-
    во, но используют по умолчанию разные параметры. BCC можно ис-
    пользовать для передачи файлов TLINK или TASM. Общий синтаксис
    команды имеет вид:
    BCC [параметр [параметр...]] имя_файла [имя_файла]
    Чтобы увидеть список параметров, наберите просто BCC и нажмите Enter. Параметры в командной строке разделяются пробелами, и
    перед ними указывается символ - или /. Параметры командной строки
    переопределяют параметры, заданные в файле конфигурации.
    По умолчанию BCC компилирует файлы без расширений и файла с
    расширениями .CPP. Файлы с расширениями .C или с расширениями,
    отличными от .CPP, .ASM, .OBJ или .LIB компилируются как файлы
    Си.
    Некоторые параметры BCC и BCC32 задаются по умолчанию. Чтобы
    отключить эти параметры, наберите BCC -параметр-. По умолчанию
    BCC пытается выполнить компоновку с файлом определения модуля,
    имя которого совпадает с именем исходного файла. Можно использовать несколько файлов определения.

    Использование макрокоманд

    При вызове макрокоманды в формирующем файле должен соблюдаться следующий формат:
    $(имя_макрокоманды)
    Круглые скобки должны использоваться во всех случаях вызова
    макрокоманд, даже в том случае, если имя макрокоманда состоит из
    единственной буквы (за исключением предопределенных макрокоманд).
    Данная конструкция - $(имя_макрокоманды) - называется вызовом
    макрокоманда.
    Когда утилита MAKE обнаруживает вызов макрокоманды, она заменяет ее на текст, раскрывающий макрокоманду (текст макрорасширения). Если текст макрорасширения не определен, то MAKE заменяет
    ее пустой (нулевой) строкой.

    Использование области списка классов

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

    Использование области трассировки сообщений

    По умолчанию WinSignt трассирует все сообщения и выводит их
    в области трассировки сообщений. Ограничить число трассируемых
    сообщений можно несколькими способами:
  • Выберите Message Selected Classes или Messages Selected
    Windows, затем выберите классы (в области списка классов)
    или окна (в области дерева окон).

  • Выберите Message All Windows.

  • Выберите Message Options, затем любую из 4 групп сообщений
    (см. таблицы). Выбор параметра All Messages запрещает от-
    дельные подгруппы и будет трассировать все сообщения.


  • Использование 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.

    Использование 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 обновляет дату и время создания файла.

    Использование утилиты 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.

    Изменение режима просмотра проекта

    В окне проекта по умолчанию выводится имя проекта, цель и
    зависимость файлов. Управлять выводом можно с помощью 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.


    Явные и неявные правила

    Явные и неявные правила, инструктирующие MAKE, в общем случае определяются следующим образом:
  • Явные правила дают MAKE инструкции для конкретных файлов.

  • Неявные правила дают MAKE инструкции, которым она следует,
    когда не может найти явное правило.

  • Правило имеет следующий общий формат:
    Строка зависимости
    Команды
    .
    .
    .
    Строка зависимости для явных и неявных правил отличается, но
    команды одни и те же. MAKE поддерживает несколько правил на одну
    цель. После первого явного правила вы можете добавить файл, от
    которого зависит цель, например:
    Target1: dependent1 dep2 dep3 dep4 dep5
    Target2: dep6 del7 del8
    bcc -c $**

    Этапы инсталляции

    Программа инсталляции 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 использует в качестве явно заданного результирующего файла имя первого обнаруженного результирующего

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

    Классы в DLL

    Данная утилита удобна для DLL, использующей классы C++, по
    двум соображениям. Во-первых, если вы используете ключевое слово
    _exрort при определении класса, экспортируются все невстроенные
    функции-элементы и элементы статических данных для этого класса.
    Удобнее создать файл определения модуля с помощью IMPDEF, так как
    в нем будут перечислены все экспортируемые функции, включая функции-элементы и элементы статических данных.
    Поскольку имена данных функций являются "скорректированными", процесс перечисления всех имен функций в секции EXPORTS файла определения модуля для создания библиотеки импорта из файла
    определения модуля является очень утомительным. Если для создания
    файла определения модуля вы используете утилиту IMPDEF, она будет
    включать порядковое значение для каждой экспортируемой функции,
    так же как и исходное имя в комментариях, следующих за точкой
    входа функции, если экспортируемое имя является "скорректированным". Так, например, файл определения модуля, созданный утилитой
    IMPDEF для DLL, которая использует классы C++, будет выглядеть
    примерно следующим образом:
    LIBRARY имя_файла
    DESCRIPTION 'Описание'
    EXPORTS
    скоррект_имя_экпорт_функции @номер ; имя_экспорт_функции
    ...
    скоррект_имя_экпорт_функции @номер ; имя_экспорт_функции
    где "имя_файла" является корневым именем DLL, 'Описание' является
    значением утверждения DESCRIPTION, если DLL была предварительно
    скомпонована с файлом определения модулей, который включал ут-
    верждение DESCRIPTION, "скоррект_имя_экпорт_функции" представляет
    собой скорректированное имя, "номера" являются порядковыми значе-
    ниями (целыми) функций, а "имя_экпорт_функции" задает исходное
    имя функции.

    Командная строка утилиты 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.


    Командный процессор ресурсов: 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.


    Компиляция в интегрированной среде

    Оперативное меню 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.


    Компоновщик ресурсов 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 - для файлов ресурсов.

    Копирование узлов

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

  • Удерживая нажатой клавишу Ctrl, отбуксируйте выделенные
    узлы в нужное место.

  • Когда вы отпустите кнопку "мыши", узлы скопируются.

  • Копирование по ссылке позволяет взять узел и зависящие от
    него узлы и поместить их в другое место проекта. Такая копия
    идентичная оригиналу - при удалении оригинала она также удаляется. Для выполнения копирования по ссылке:
  • Выберите узел для копирования (зависимые объекты копируются автоматически).

  • Удерживая клавишу Alt, буксируйте выделенный узел в нужное
    место.

  • Когда вы отпустите кнопку "мыши", узлы скопируются.


  • Local Override

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

  • Щелкните правой кнопкой "мыши" (или нажмите Alt+F10) либо
    выберите в SpeedMenu Edit local options. Выводится диалоговое окно Style Sheet с выбранным параметром.

  • Выберите параметр, который нужно переопределить. Блок Local Override выбирается автоматически.

  • Выберите OK.

  • Чтобы отменить переопределение, отмените выбор Local Override. Если требуется переопределять несколько параметров, то удобнее использовать Style Sheet.

    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).

    Макрокоманда в макрокоманде

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

    Макрокоманда в правилах

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

    Макрокоманды MAKE

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

    Макрокоманды утилиты MAKE, используемые по умолчанию


    Макро- команда Расширение в неявных файлах Расширение в явных файлах
    $* маршрут\исходный_файл маршрут\целевой_файл
    $< маршрут\исходный_файл+расш маршрут\целевой_файл+расш
    $: маршрут исходных файлов маршрут целевых файлов
    $. исходный файл+расширение целевой файл+расширение
    $& исходный файл целевой файл
    $@ маршрут\целевой_файл+расш маршрут\целевой_файл+расш
    $** маршрут\исходный_файл+расш все исходные файлы+расш
    $? маршрут\исходный_файл+расш старые исходные файлы


    Макрокоманды в директивах

    Вызовы макрокоманд в директивах !if и !elif раскрываются немедленно. Если вызываемая в директивах !if или !elif макрокоманда
    в данный момент не определена, то она расширяется в значение 0
    (ложно).

    Макрокоманды в командах

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

    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.


    Модификаторы макрокоманд утилиты MAKE


    Модификатор Какую часть имени файла он определяет Пример
    D Диск и каталог. $(
    F Базовое имя файла и расширение. $(
    B Только базовое имя файла. $(
    R Диск, каталог и расширение. $(


    Модификаторы макрокоманд

    Если нет предопределенной макрокоманды имени файла, которая
    позволяет вам задавать части нужного имени файла, для выделения
    частей имени файла вы можете использовать модификаторы макрокоманд. Они имеют следующий формат:
    $(макрокоманда[D F B R])
    где "макрокоманда" - одна из предопределенных макрокоманд имени
    файла (показанных выше), а R, B, D и F - модификаторы. Заметим,
    что поскольку макрокоманда теперь имеет длину более одного символа, необходимы круглые скобки. Каждый из модификаторов описывается в следующей таблице. В примерах предполагается, что $< возвращает C:\OBJS\BOB.OBJ.

    Наблюдение за классами

    Чтобы трассировать сообщения для одного или более классов,
    выберите эти классы в области списка классов (используя Shift или
    Ctrl и щелчок кнопкой "мыши"), затем выберите Messages Selected
    Classes. Трассировка сообщений позволяет видеть все сообщения для
    окон данного класса, включая сообщения создания.

    Наблюдение за окнами

    После выбора окна из дерева окон с помощью команды Messages
    Selected Windows вы можете выполнить трассировку сообщений, приходящих в это окно. Изменение выбора в дереве окна немедленно
    сменит окно, для которого должны трассироваться сообщения.
    С помощью команды Messages All Windows вы можете также выбрать наблюдение за всеми окнами, независимо от того, что выбрано
    в области списка классов или в области дерева окон.
    Выбор команды Messages Selected Windows или Windows All Windows, когда область трассировки сообщений является скрытой, приводит в выводу области трассировки сообщений.
    Выбор команды Messages Trace запрещает трассировку сообщений, не убирая с экрана область трассировки сообщений.

    Начало работы

    При двойном нажатии кнопки "мыши" на пиктограмме WinSight
    выводится основное окно с используемой по умолчанию конфигурацией, что представляет собой список всех окон, активных в данный
    момент в оперативной области. В окне WinSignt выводится дерево
    окон, в котором перечислены все активные в оперативной области
    окна.
    WinSignt позволяет просматривать список классов, дерево окон
    и трассировку сообщений.
    Когда в основном окне у вас выводится два или более окон, вы
    можете расположить их в виде стека (одно за другим) или в виде
    массива (одно рядом с другим). Данные конфигурации переключаются
    с помощью команды меню View Split Vertical (Вертикальное разбиение) и Split Horizontal (Горизонтальное разбиение).

    Настройка конфигурации 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.


  • Неклиентные сообщения


    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

    Область дерева окон

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

  • Просмотреть статус окон, включая скрытые окна.

  • Увидеть, какие окна получают сообщения.

  • Выбрать окна для трассировки сообщений.


  • Область классов

    Здесь перечисляются классы, найденные ClassExpert в текущем
    приложении. Информация в областях событий и редактирования зависит от выбранных здесь классов. Чтобы перейти к конструктору
    класса в исходном коде, вы можете дважды щелкнуть на классе
    "мышью". При этом выводится область редактирования. Используя
    оперативное меню, вы можете добавить классы, связать классы документов с классами отображаемых элементов, получить информацию о
    классе, перейти к исходному коду класса или файла заголовка и запустить Resource Workshop.

    Область редактирования

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

    Область событий

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

    Область списка классов

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

    Обработка данных WinSpector

    Утилита DFA обрабатывает информацию Турбо отладчика,
    собранную WinSpector во время возникновения исключительной ситуации. Если во время исключительной ситуации информация отчета установлена в PostMortem Dump, то WinSpector записывает файл
    WINSPCTR.BIN. После этого для трансляции файла WINSPCTR.BIN в полезный формат можно использовать утилиту DFA.

    Окно сообщений

    При компиляции программ в окне сообщений выводятся ошибки и
    предупреждения. С помощью команды Preferences в диалоговом окне
    Enviroment Options вы можете настроить некоторые функциональные
    возможности окон сообщений Message.
    При выборе сообщения в окне Message редактор помещает курсор
    в ту точку исходного кода, где произошла ошибка или предупреждение. Если файл с ошибкой не загружен в окне редактора, для его
    загрузки нажмите пробел (можно воспользоваться и SpeedMenu). Окно
    сообщений остается выбранным, так что вы можете перемещаться от
    сообщения к сообщению. С помощью команды Remove all messages оперативного меню вы можете очистить окно сообщения. Клавиши Alt+F7
    выводят следующее сообщение об ошибке, а Alt+F8 - предыдущее.

    Операции в команде

    В дополнение к операциям переназначения <, > и >>, утилита
    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 следует пользоваться для
    "отладки" временных файлов, если возникает впечатление, что эти
    файлы работают неверно.

    Оператор 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.

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

    Макроопределение имеет следующую форму:
    имя_макрокоманды = текст_макрорасширения
    Здесь "имя_макрокоманды" представляет имя данной макрокоманды. "Имя_макрокоманды" должно являться строкой из букв и цифр, не
    содержащей символов пробела, хотя пробелы между "именем_макрокомандЫ" и знаком равенства (=) допустимы. "Текст_макрорасширения"
    представляет собой произвольную строку, содержащую буквы, цифры,
    символы пробела и знаки пунктуации. Эта строка завершается символом перехода на новую строку.
    Если "имя_макрокоманды" уже было определено ранее (либо с
    помощью макроопределения в формирующем файле, либо с помощью параметра -D командной строки утилиты MAKE), то новое описание макрокоманды заменяет старое.
    При задании макрокоманд регистр букв учитывается; то есть,
    model, Model и MODEL определяют разные макрокоманды.

    Параметр совместимости -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 расширенную память.


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

    Параметры дочерних окон и отображаемых элементов MDI определяют класс для дочернего окна или документа/отображаемого элемента.

    Параметры генерации кода

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

    Параметры идентификационной информации

    Параметры идентификационной информации Admin Options идентифицируют информацию, помещаемую в начало всех генерируемых проектом файлов.

    Параметры клиентной области многодокументального интерфейса

    Параметры клиентной области многодокументального интерфейса
    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 не действует.


    Параметры компилятора

    Параметры 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, который задает для редактора клавиатурные сокращения.

    Переименование элемента AppExpert

    Чтобы переименовать класс, функцию обработки события, экземпляр переменной или идентификатор диалога, сделайте следующее:
  • Используйте редактор IDE для поиска и замены всех вхождений исходного имени новым именем. Проверьте все связанные
    с проектом исходные файлы.

  • В окне проекта выберите цель AppsExpert, щелкните на ней
    правой кнопкой "мыши", затем выберите Special Rescan. После завершения Rescan возвращает вас в окно проекта IDE.


  • Перемещение класса

    Чтобы переместить класс из одного исходного файла в другой,
    сделайте следующее:
  • Переместите (вырезанием и вставкой) исходный код класса в
    новый файл. Если файл не записан в проекте как узел под целью AppsExpert, добавьте его. Если перемещенный класс был собственным исходным файлом, вы можете удалить из проекта пустой исходный файл.

  • Выберите в проекте целевой файл AppsExpert, щелкните правой кнопкой "мыши" для просмотра SpeedMenu, затем выберите
    Special Rescan. После завершения Rescan возвращает вас в
    окно проекта IDE.


  • Перемещение узлов и целей

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

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


  • Перестроение файла базы данных .APX

    Чтобы перестроить потерянный или запорченный файл .APX, сделайте следующее:
  • Откройте файл проекта, содержащий цель AppsExpert и зависимые узлы (.IDE).

  • Выберите цель AppsExpert, щелкните на ней правой кнопкой
    "мыши" и выберите в оперативном меню Special Rescan. После
    завершения Rescan возвращает вас в окно проекта IDE.





























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

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

    Подробная информация об окне

    Двойное нажатие кнопки "мыши" или нажатие клавиши 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 будет пытаться найти строку,
    включающую предшествующий пробел.

    Поиск окна

    Утилита WinSight имеет специальный режим для поиска окон.
    Она может работать двумя способами: идентифицируя строку в области дерева, соответствующую окну, на которое вы указываете, или
    подсвечивая окно, выбираемое вами в дереве окон.
    В любом случае режим поиска окна Find Window задается путем
    выбора команды Spy Find Window. В данном режиме, когда "мышь" попадает на границы окна, вокруг окна появляется жирная рамка, и
    окно в области дерева окон становится выделенным. Когда вы находитесь в режиме Find Window, все другие прикладных программы приостанавливаются.
    Либо, находясь в режиме поиска окна, вы можете с помощью
    "мыши" или клавиш управления курсором выбрать окно в области дерева окон, и утилита WinSight изобразит жирную рамку вокруг выбранного окна (или окон).

    Последовательность поиска файлов в каталогах

    При поиске библиотечных и включаемых файлов Borland С++ использует следующий алгоритм.
  • Если в исходный файл включен оператор #include ,
    то Borland С++ ищет указанный в нем файл только в заданном
    каталоге включаемых файлов (заголовков или библиотечных
    файлов).

  • С другой стороны, если в программе содержится оператор
    #include "file.h.", то Borland С++ ищет этот файла сначала
    в текущем каталоге, а затем в каталогах включаемых файлов,
    заданных в командной строке.

  • Неявные библиотеки Borland С++ ищет только в заданных библиотечных каталогах. Неявные библиотеки - это такие библиотеки, которые Borland С++ компонует автоматически, и объектный файл запуска (C0x.OBJ). Поиск Borland С++ явных библиотек зависит от того, как указано имя библиотечного файла. Явные библиотеки имеют
    расширение .LIB. Если библиотека указывается без диска и каталога, то Borland С++ ищет ее сначала в текущем каталоге, а затем в
    заданных библиотечных каталогах.















  • Построение части проекта

    Часть проекта можно построить 3 способами:
  • Построением узла и зависимых от него узлов (выберите узел,
    щелкните правой кнопкой "мыши" и выберите в SpeedMenu команду Build).

  • Для построения проекта с помощью MAKE выберите узел, который хотите построить, щелкните на узле правой кнопкой "мыши" и выберите в оперативном меню Make.

  • Для трансляции отдельного узла выберите узел, выберите команду Project Compile в основном меню или заданную по
    умолчанию команду трансляции в SpeedMenu.


  • Построение приложений с помощью AppExpert

    В данном разделе рассказывается, как с помощью AppExpert
    создавать приложения на базе ObjectWindows 2.0. AppExpert работает с Resource Workshop, классами ObjectWindows 2.0. Это позволяет
    использовать при генерации приложения визуальный подход. AppExpert позволяет создавать программы Windows с такими средствами
    как оперативное меню SpeedBar, строка состояния, структура меню,
    оперативный справочник, средство предварительного просмотра на
    экране печатаемой информации и средства работы с документами.

    Построение проекта

    Для построения проекта следует:
  • Открыть проект с помощью команды Project Oрen Project.

  • Для построения всех узлов проекта выберите в основном меню
    Project Build all. Для построения только измененных - Project Make.

  • Если не задана другая таблица стилей, то используется таблица, заданная по умолчанию. Администратор проекта начинает работать с первой цели и прорабатывает проект сверху вниз, пока не
    дойдет до узла без зависимостей. Этот узел строится первым, а затем дерево обрабатывается в обратном направлении.

    Предопределенные макрокоманды утилиты 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 будет продолжено.


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

    В IDE вы можете конвертировать файлы проекта (.IDE) в формирующие файлы (.MAK). Для этого откройте файл проекта и выберите
    Project Generate Makefile.

    Преобразование старых проектов

    Администратор проектов данной версии может загружать и использовать проекты предыдущих версий Borland С++ for Windows. Выберите Project Open Project и наберите имя старого файла проекта.
    Администратор проектов преобразует старый проект в новый. С помощью Options Save сохраните проект. Он сохраняется со старым
    именем и новым расширением .IDE.

    Ниже приводится несколько простых примеров,

    Ниже приводится несколько простых примеров, демонстрирующих
    различные операции, которые могут быть выполнены утилитой 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



  • Ниже приведены некоторые примеры явных правил:
    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, то будут перекомпилированы оба файла. Перекомпоновка будет осуществляться в том случае, если был модифицирован хотя бы один из объектных файлов, указанных в списке зависимости. Это имеет место в том случае, если в результате изменения исходного файла была произведена перекомпиляция.

    Продвинутые параметры

    Продвинутые параметры определяют поведением приложения и его
    внешним видом.

    Просмотр исходного кода класса

    Чтобы просмотреть исходный код класса, выберите класс в области классов. Исходный код выводится в области редактирования.
    Чтобы переместить курсор на конструктор, дважды щелкните "мышью"
    на имени в области классов. Для перехода на обрабатываемое события дважды щелкните "мышью" на событии в области событий.

    Просмотр элементов исходного кода

    Средство просмотра позволяет просматривать иерархию объектов, классов, функций, переменных, констант и типов в используемых программах. Перед использованием средства просмотра установите в диалоговом окне 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.


  • Раздел дизассемблирования

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

    Раздел модулей

    В разделе модулей файла регистрации перечисляются модули,
    которые выполнялись во время возникновения исключительной ситуации. Здесь приводится следующая информация:
  • маршрут для программы, выполняющей файл;

  • дату;

  • размер файла;

  • имя модуля;

  • описатель модуля;

  • счетчик ссылок (сколько элементов использует модуль).


  • Раздел очереди сообщений

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

  • номер идентификатора сообщений (идентифицирует, каким он
    был);

  • два параметра (присутствующие для любого заданного окна).

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

  • имя модуля;

  • описатель окна модуля;

  • описатель задачи;

  • каким было значение сегмента данных для задачи (описатель
    экземпляра).


  • Раздел регистров

    Раздел регистров файла регистрации представляет значения,
    которые находились в стандартных регистрах во время исключительной ситуации. Для регистров CS, DS, ES и SS даны ограничения и
    полномочия доступа.

    Раздел трассировки стека

    Первая строка раздела трассировки стека файла регистрации
    идентифицирует функцию или процедуру, которая выполнялась во время исключительной ситуации. Stack Trace information включает в
    себя:
  • номер кадра стека;

  • имя модуля;

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

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

  • куда ваша программа возвращается после вызова.

  • Когда WinSpector дает имена функций, он ищет в файле .SYM
    ближайший идентификатор, который встречается перед адресом стека
    вызова. Некоторые файлы .SYM не содержат информации обо всех инструкциях. Таким образом, имя функции в файле регистрации будет
    представлять ближайшую функцию в файле .SYM с адресом, предшествующим адресу стека. Если поле смещение показывает слишком большое значение, то имя функции подозрительно.

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

    Когда вы добавляете к библиотеке какой-либо модуль, утилита
    TLIB корректирует словарь всех общедоступных идентификаторов, которые описаны в модулях библиотеки. Все идентификаторы в конкретной библиотеке должны быть различными. Если попытаться добавить к библиотеке какой-либо модуль, в котором содержится дублирующий
    идентификатор, то утилита TLIB выдаст сообщение, но модуль не добавит.
    Обычно когда утилита TLIB проверяет библиотеку на наличие дублируемых идентификаторов, буквы верхнего и нижнего регистров обычно не различаются. Например, идентификаторы lookuр и LOOKUP будут восприниматься как дубликаты. Так как Си обрабатывает буквы верхнего и нижнего регистров как различным образом, для добавления в библиотеку модуля, содержащего идентификатор, отличающийся от другого, уже имеющегося в библиотеке идентификатора, только регистром букв, нужно пользоваться параметром /C. Параметр /C указывает утилите TLIB, что нужно считать допустимыми модули, в
    которых идентификаторы отличаются от уже имеющихся в библиотеке
    только регистром букв.
    Если вы хотите использовать эту библиотеку с другими компоновщиками (или позволить другим лицам использовать эту библиотеку с другими компоновщиками), то во избежание "неприятностей", параметр /C использовать не рекомендуется.

    Редактирование атрибутов с помощью 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.

    Секция системной информации

    В разделе системной информации файла регистрации показывается режим и версия Windows, под которой выполняется ваша программа. Показывается также следующее:
  • информация процессора:

  • наибольший свободный блок памяти;

  • общее пространство линейной памяти;

  • свободное пространство линейной памяти;

  • страницы свопинга файлов.


  • Символические цели

    Символическая цель вынуждает 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

    Системные сообщения


    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


    Сообщения буфера вырезанного изображения


    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


    Сообщения инициализации


    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


    Сообщения об ошибках

    Ниже приводятся сообщения об ошибках, генерируемые 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.

    Сообщения об ошибках могут генерироваться компилятором, ком- поновщиком, утилитой MAKE или библиотекарем. Кроме того, такие ошибки может генерировать программа на этапе выполнения.
    Нефатальные ошибки, генерируемые компилятором, указывают на синтаксические ошибки в программе, ошибки командной строки или ошибки, вызванные ситуациями на диске или в памяти. Компилятор завершает текущую фазу компиляции и прекращает работу. На каждой фазе компиляции (препроцессорная обработка, синтаксический анализ, оптимизация и генерация кода) компилятор пытается найти максимально возможное число ошибок.
    Ошибки, генерируемые компоновщиком, не приводят к удалению файлов .EXE или .MAP, однако выполнять такой файл .EXE не следует. При компиляции из IDE сообщения компоновщика об ошибках рассматриваются как фатальные ошибки.
    Утилита MAKE генерирует ошибки при неверном синтаксисе или семантических ошибках формирующего файла. Чтобы исправить их, нужно отредактировать формирующий файл.
    Сообщения об ошибках на этапе выполнения обычно вызываются логическими ошибками в программе. Нужно исправить причину и перекомпилировать программу.

    Сообщения от "мыши"


    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


    Совместное использование 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.

    Создание многоцелевого проекта

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

  • Выберите Project New target. Выводится диалоговое окно New
    Target.

  • Наберите имя для второй целевой платформы и выберите тип
    (по умолчанию Standard). Выберите OK.


  • Создание приложения

    Создание приложения с помощью 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.


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

    Список операций определяет, какие действия должна выполнять
    утилита TLIB. Он состоит из последовательности заданных одна за
    другой операций. Каждая операция состоит из одно- или двухсимвольного обозначения операции, за которым следует имя файла или имя модуля. Пробельные символы могут окружать либо обозначение операции, либо имя файла или модуля, но их нельзя использовать в
    середине двухсимвольного обозначения операции или внутри имени.
    В командной строке можно указывать любое число операций но
    суммарная длина строки не должна превышать предел в 127 символов,
    установленный в DOS (в COMMAND.COM). Порядок следования операций
    не имеет значения. Утилита TLIB всегда выполняет операции в следующем порядке:
  • Сначала выполняются все операции извлечения.

  • Затем выполняются все операции удаления.

  • И, наконец, выполняются все операции добавления.

  • Замена какого-либо модуля может быть произведена путем удаления его с последующим добавлением заменяющего модуля.
    Утилита TLIB распознает три символа действия (-, + и *), которые могут использоваться самостоятельно или объединенными в пары, образуя в совокупности пять различных операций. Для тех операций, в которых используются пары символов, порядок расположения символов не играет роли. Обозначения операций и выполняемые этими
    операциями действия указаны ниже (для создания библиотеки, добавьте модули к библиотеке, которая еще не существует):

    Символ Имя Описание действия
    + Добавление Утилита TLIB добавляет заданный файл в библиотеку. Если расширение имени файла не задается, то подразумевается расширение .OBJ. Если сам файл является библиотекой (с расширением .LIB), то в результате выполнения операции все модули указанной библиотеки будут добавлены в полученную в результате библиотеку. Если добавляемый модуль уже существует, то TLIB отображает сообщение, но не добавляет новый модуль.
    - Удаление Утилита TLIB удаляет заданный модуль из библиотеки. Если этот модуль в библиотеке не существует, то TLIB отображает сообщение. Операция удаления требует задания только имени модуля. TLIB допускает ввод полного имени маршрута с указанием имени дисковода и расширения, но игнорирует все, за исключением имени модуля.
    * Извлечение Утилита TLIB создает заданный файл путем копирования соответствующего модуля из библиотеки в файл. Если этот модуль не существует, то TLIB отображает сообщение, но файла не создает. Если файл с заданным именем уже существует, то он затирается, а на его место записывается новый.
    -*
    *-
    Извлечение и удаление Утилита TLIB копирует заданный модуль в файл с соответствующим именем, а затем удаляет его из библиотеки. Данная операция представляет собой сокращенный путь для последовательного выполнения операции извлечения с последующей операцией удаления.
    -+
    +-
    Замена Утилита TLIB заменяет заданный модуль на соответствующий файл. Данная операция представляет собой сокращенный путь для последовательного выполнения операции удаления с последующей операцией добавления.

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

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

    Файл определения модуля не является строго обязательным для
    создания выполняемой программы 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, то
    функция будет экспортироваться по имени, а не по перечислению
    (перечисление обычно более эффективно).
    Если вы хотите изменить стандартные атрибуты, вам необходим
    файл определения модуля.

    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.

    - T -

    Table limit exceeded

    Сообщение об ошибке утилиты TLINK
    (превышен размер таблицы)
    Переполнена одна из внутренних таблиц компоновщика. Обычно
    это означает, что компонуемые программы превышают возможности
    компоновщика в части общедоступных идентификаторов, внешних идентификаторов, или определений логических сегментов. Каждый экземпляр сегмента в объектном файле считается за логический сегмент.
    Если этот сегмент определяется в двух объектных файлах, то результатом будет два логических сегментов.
    Target index of FIXUP is 0 in module модуль

    Сообщение об ошибке утилиты TLINK
    (целевой индекс FIXUP в модуле равен 0)
    Ошибка транслятора.
    Template argument must be a constant expression

    Сообщение об ошибке этапа компиляции
    (аргумент шаблона должен быть выражением-константой)
    Нетипизированный фактический аргумент шаблона класса должен
    быть выражением-константой (соответствующего типа). Это включает
    в себя целочисленные выражения-константы, адреса объектов или
    функций с внешней компоновкой элементов.
    Template class nesting too deep: 'class'

    Сообщение об ошибке этапа компиляции
    (слишком глубокая вложенность шаблона класса)
    Компилятор накладывает определенные ограничения на уровень
    вложенности шаблонов классов, который можно обойти обычно только
    через рекурсивную зависимость шаблонов класса. Когда предел такой
    вложенности превышен, компилятор выводит данное сообщение об
    ошибке для всех вложенных шаблонов классов, что обычно позволяет
    легко выявить место рекурсии. Это всегда следует за фатальной
    ошибкой Out of memory (Нет памяти).
    Например, рассмотрим следующий набор шаблонов классов:
    template class A
    {
    friend class B;
    };
    template class B
    {
    friend class A;
    };
    A x;
    Что приведет к выводу следующих сообщений:

    Error: Template class nesting too deep: 'B'

    Error: Template class nesting too deep: 'B'

    Error: Template class nesting too deep: 'B'

    Error: Template class nesting too deep: 'B'

    Error: Template class nesting too deep: 'B'

    Error: Template class nesting too deep: 'B'

    Fatal: Out of memory

    Template function argument аргумент not used in argument types


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

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

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

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

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

    экземпляр шаблона функции на основе типов фактических аргументов.

    Template functions may only have type-arguments


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

    (в шаблонах функций могут быть только аргументы-типы)

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

    шаблоне функции это не допускается, так как нет способа задать

    значение при ее вызове.

    Templates can only be declared at file level


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

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

    Объявление в описании шаблона должно задавать тип класса или

    функцию.

    Templates must be clases or functions


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

    (шаблоны должны быть классами или функциями)

    Описание шаблона должны быть классом или функцией.

    Temporary used to initialize идентификатор



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

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

    переменная)

    См. следующее сообщение.

    Temporary used for parameter номер in call to функция



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

    (При вызове функции для параметра номер использовалась временная переменная) См. следующее сообщение.

    Temporary used for parameter параметр in call to функция



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

    (При вызове функции для параметра параметр использовалась временная переменная) См. следующее сообщение.

    Temporary used for parameter номер



    Предупреждение этапа компиляции (Для параметра номер использовалась временная переменная) См. следующее сообщение.

    Temporary used for parameter параметр

    Предупреждение этапа компиляции (Для параметра параметр использовалась временная переменная)


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

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

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

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

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

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

    Например, функция f требует ссылку на int, а c имеет тип char:

    f (int&);

    char c;

    f (c);

    Вместо вызова f с адресом c компилятор генерирует код, эквивалентный следующему исходному коду С++:

    int X = c, f (X);

    Terminated by user


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

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

    Вы прервали работу компоновщика.

    The '...' handler must be last


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

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

    Если в списке обработчиков присутствует '...', то это должен

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

    The combinations '+*' or '*+' not allowed


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

    (комбинации '+*' или '*+' не допускаются)

    Не допускается добавлять и извлекать модуль из библиотеки за

    одно действие. Возможно требуется действие '+-'.

    The constructor конструктор is not allowed


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

    (конструктор недопустим)

    Конструкторы вида X:: (X) недопустимы. Правильный способ записи конструктора: X:: (const X&)

    'this' can only be used within a member function

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

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

    В С++ this - это зарезервированное слово, которое можно использовать только в пределах функций-элементов класса.

    This initialization is only partly bracketed



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

    (данная инициализация заключена в скобки только частично)

    При инициализации структуры скобки могут использоваться,

    чтобы отметить инициализацию каждого элемента структуры. Если сам

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


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

    Too few arguments in template class name шаблон


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

    (слишком мало аргументов в шаблоне класса)

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

    Too few parameters in call


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

    (слишком мало параметров в вызове)

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

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

    Too few parameters in call to функция


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

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

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

    Too many commas on command-line


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

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

    В командной строке найдена недопустимая запись.

    Too many decimal points


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

    (слишком много десятичных точек)

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

    находится более одной десятичной точки.

    Too many default cases


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

    (слишком много операторов default)

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

    конструкции switch.

    Too many error or warning messages


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

    (слишком много сообщений об ошибке или предупреждений)

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

    Too many error or warning messages


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

    (слишком много ошибок или предупреждений)

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

    достиг этого предела.

    Too many errors


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

    (слишком много ошибок)

    Компилятор обнаружил больше ошибок, чем допускается параметром -E.

    Too many exponents


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

    (слишком много показателей степени)

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


    Too many initializers


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

    (слишком много инициализаторов)

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

    Too many LNAMEs


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

    (слишком много LNAME)

    В одном объектном модуле LNAME не может иметь более 256 LNAME.

    Too many rules for target цель


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

    (слишком много правил для цели)

    При построении цели MAKE не может определить, какому правилу

    следовать.

    Too many storage classes in declaration


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

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

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

    Too many suffixes in .SUFFIXES list


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

    (слишком много суффиксов в списке .SUFFIXES)

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

    Too many types in declaration


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

    (в объявлении слишком много типов)

    Объявление может содержать не более одного из следующих базовых типов: char, int, float, double, struct, union, enum или

    typedef-имя.

    Too much global data defined in file


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

    (в файле объявлено слишком много глобальных данных)

    Сумма объявленных глобальных данных превысила по размеру

    64К. Проверьте объявления массивов, которые могут быть причиной

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

    Trying to derive a far class from a huge base база


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

    (попытка объявить класс far, производный от базового класса

    huge)

    Если класс объявлен (или имеет по умолчанию) тип huge, то

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

    Trying to derive a far class from a near base база


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

    (Попытка объявить класс far, производный от базового класса

    near). Если класс объявлен (или имеет по умолчанию) тип near, то

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


    Trying to derive a near class from a far base база


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

    ( попытка объявить производный класс near от базового класса

    far). Если класс объявлен (или имеет по умолчанию) тип far, то все

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

    Trying to derive a huge class from a near base база


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

    (попытка объявить производный класс huge от базового класса

    near). Если класс объявлен (или имеет по умолчанию) тип near, то

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

    Trying to derive a near class from the huge base база


    Сообщение об ошибке этапа компиляции: (попытка объявить производный класс near от базового класса

    huge). Если класс объявлен (или имеет по умолчанию) тип huge, то

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

    Two consecutive dots


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

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

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

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

    Two operands must evaluate to the same type


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

    (два операнда должны давать при вычислении один и тот же

    тип)

    Типы выражений по обеим сторонам двоеточия в условной операции (?:) должны быть одинаковыми, за исключением тех, что позволяют взаимные преобразования типа - char в int, float в double

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

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

    Type тип is not a defined class with virtual functions


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

    (данный тип не является определенным типом для виртуальных

    функций)

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

    не определен или не имеет виртуальных функций.

    Примечание относительно сообщений Type mismatch: При компиляции программ в С++ перед следующими сообщениями всегда выводится другое сообщение, поясняющее точную причину несоответствия типов. Обычно это "Cannot convert 'тип_1' to 'тип_2'. Но могут быть


    и другие причины.

    Type mismatch in default argument value


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

    (несоответствие типа в используемом по умолчанию значении параметра). См. следующее сообщение.

    Type mismatch in default value for parameter параметр


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

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

    параметра параметр)

    Используемое по умолчанию значение параметра не может быть

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

    для параметра не задано имя.

    Type mismatch in parameter номер


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

    (несоответствие типа в параметре номер)

    Вызванная через указатель функция была объявлена с прототипом; данный параметр с указанным номером (отсчитывая слева направо от 1) не может преобразоваться к объявленному типу параметра.

    Type mismatch in parameter параметр


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

    (несоответствие типа в параметре параметр)

    Вызванная через указатель функция была объявлена с прототипом; указанный же параметр не может быть преобразован к объявленному типу параметра. См. выше сообщения о несоответствии типов.

    Type mismatch in parameter номер in call to функция


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

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

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

    Type mismatch in parameter параметр in call to функция


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

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

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

    типу параметра. См. сообщение

    .

    Type mismatch in parameter параметр in template class name шаблон

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

    (несоответствие типа в параметре в имени шаблона класса). См. следующее сообщение.

    Type mismatch in parameter число in template class name шаблон



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

    (несоответствие типа в параметре в имени шаблона класса)

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

    не соответствует в точности типу формального параметра шаблона.

    См. выше сообщения о несоответствии типов.

    Type mismatch in redeclaration of идентификатор


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

    (несоответствие типа в повторном описании идентификатора)

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

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

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

    с типом возврата, отличным от целочисленного. В этом случае вы

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

    Type name expected


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

    (требуется имя типа)

    Произошла одна из следующих ошибок:

  • в описании файлового уровня или поля структуры не задан

    класс памяти и имя типа;


  • в описании typedef не указан тип для имени;


  • в описании деструктора класса С++ имя деструктора не является именем типа (это должно быть то же имя, что и имя

    класса);


  • при указании имени базового класса С++ имя не является

    именем базового класса.


  • Type qualifier идентификатор must be a struct or class name


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

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

    именем класса)

    Квалификатор С++ в конструкторе квалификатор::идентификатор

    не является именем структуры или класса.

    Типы сообщений

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

    Трансляторы

    Транслятор - это любая программа, которая преобразует один
    тип файла в другой. Администратор проекта позволяет вам определить собственные трансляторы. Эти добавляемые трансляторы остаются в файле проекта и не добавляются как перманентные части IDE.
    Однако трансляторы, средства просмотра, другие инструментальные
    средства и Style Sheet можно передать другому проекту - следующий
    выбираемый с помощью команды Project New project проект их наследует. С помощью Options Tools вы можете просмотреть заданные по
    умолчанию трансляторы.

    - U -

    Unable to create output file имя_файла

    Фатальная ошибка этапа компиляции
    (невозможно создать выходной файл)
    Рабочий диск переполнен или защищен от записи, или выходной
    каталог не существует. Если диск переполнен, попробуйте удалить
    ненужные файлы и повторить компиляцию. Если диск защищен от записи, переместите исходные файлы на диск, доступный для записи, и
    повторите компиляцию.
    Unable to create torboc.$ln

    Сообщение об ошибке этапа компиляции
    (невозможно создать файл torboc.$ln)
    Компилятор не может создать временный файл TURBOC.$LN, так
    как не может получить доступ к диску, или диск переполнен.
    Unable to execute command: команда

    Фатальная ошибка утилиты MAKE
    (нет возможности выполнить команду)
    Это сообщение выдается после того, как команда должна была
    выполнена. Это могло произойти из-за того, что командный файл не
    был найден, или из-за того, что в нем были сделаны ошибки. Наименее вероятно, что команда существует, но каким-либо образом испорчена.
    Unable to execute command команда

    Сообщение об ошибке этапа компиляции
    (нет возможности выполнить команду команда)
    Невозможно найти TLINK или TASM, возможно диск запорчен.
    Unable to open file имя_файла

    Сообщение об ошибке утилиты TLINK или ошибка утилиты TLIB
    (нет возможности открыть файл имя_файла)
    Это происходит, если указанный файл не существует или задан
    неверно.
    Unable to open имя_файла

    Сообщение об ошибке утилиты TLINK или ошибка утилиты TLIB
    (нет возможности открыть файл имя_файла)
    Это происходит, если указанный файл не существует или задан
    неверно.
    unable to open имя_файла for output

    Сообщение об ошибке утилиты TLIB
    (невозможно открыть файл имя_файла для вывода)
    Утилита TLIB не может открыть указанный файл для вывода.
    Обычно это вызывается недостатком места в целевой библиотеке, на
    диске, или в файле листинга. Кроме того, данная ошибка происходит, если целевой файл существует, но он помечен как доступный
    только по чтению.
    Unable to open include file имя_файла

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

    ( нет возможности открыть включаемый файл имя_файла)

    Названный файл компилятором не найден. Это могло произойти

    из-за того, что включаемый файл (по директива #include) включает

    самого себя, или вы не установили в CONFIG.SYS переменную FILES

    (попробуйте FILES=20). Проверьте, существует ли найденный файл.

    Unable to open include file имя_файла


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

    (нет возможности открыть включаемый файл имя_файла)

    Названный файл не найден. Это могло произойти из-за того,

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

    CONFIG.SYS FILES (попробуйте FILES=20). Проверьте, существует ли

    найденный файл.

    Unable to open input file имя_файла


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

    (невозможно открыть входной файл имя_файла)

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

    Unable to open makefile


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

    (невозможно открыть формирующий файл)

    Текущий каталог не содержит файла с именем MAKEFILE или MAKEFILE.MAK, а также файл, заданный с помощью -f.

    Unable to redirect input or output


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

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

    Утилита MAKE не может открыть временные файлы, необходимые

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

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

    Unable to rename имя_файла in имя_файла


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

    (невозможно переименовать файл имя_файла в имя_файла)

    Утилита TLIB строит библиотеку во временном файле, а затем

    переименовывает временный файл в целевой библиотечный файл. Если

    данная ошибка вызывается недостатком места на диске, то это будет

    отмечено.

    Undefined label идентификатор


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

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

    Указанная метка присутствует в операторе goto в функции, но

    определения метки нет.

    Undefined structure идентификатор

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

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


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

    в указателе на структуру), но не имеет определения в исходном

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

    Undefined structure структура


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

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

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

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

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

    Undefined symbol идентификатор


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

    (неопределенный идентификатор)

    Указанный идентификатор не имеет описания. Это может вызываться опечаткой в данном месте или в точке описания. Причиной

    может быть также ошибка в идентификаторе.

    Unexpected }


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

    (непредвиденная скобка })

    Там, где она не требуется, обнаружена лишняя фигурная скобка. Проверьте пропущенную скобку {.

    Unexpected char X in command line


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

    (непредвиденный символ X в командной строке)

    Утилита TLIB обнаружила при анализе командной строки синтаксическую ошибку.

    Unexpected end of file


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

    (неправильное окончание файла)

    Достигнут конец формирующего файла, а временный встроенный

    файл не закрыт.

    Unexpected end of file in comment started on номер_строки


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

    (неправильное окончание файла в комментарии на строке номер_строки)

    Исходный файл заканчивается в комментарии. Обычно это вызывается отсутствием завершения комментария (*/).

    Unexpected end of file in conditional started on line номер_строки


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

    (Неправильное окончание файла в условном операторе на строке

    номер_строки)

    Исходный файл закончился перед тем, как обслуживающая программа МAKE (или компилятор) обнаружила !endif. Директива !endif

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


    union cannot be a base type


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

    ( объединение не может быть базовым типом)

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

    для класса другого типа.

    union cannot have a base type


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

    (объединение не может иметь базовый тип)

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

    Union member элемент is of type class with constructor


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

    (элемент объединения имеет тип класса с конструктором). См. ниже.

    Union member элемент is of type class with destructor


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

    (элемент объединения имеет тип класса с деструктором). См. ниже.

    Union member элемент is of type class with operator=


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

    (элемент объединения имеет тип класса с operator=)

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

    Unions cannot have virtual member functions


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

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

    Unknown assembler instruction



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

    (неизвестная инструкция Ассемблера).

    Компилятор обнаружил оператор встроенного Ассемблера с недопустимым кодом. Проверьте правильность кода операции. Данное предупреждение по умолчанию выключено.

    Unknown command line switch X ignored


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

    (недопустимый параметр командной строки игнорируется)

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

    Unknown language, must be C or C++


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

    (недопустимый язык, должен быть Си или С++)

    В конструкции C++:

    extern "name" type func { /* ... */ };

    Именем, указанным в кавычках, должно быть "C" или "C++".

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

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


    extern "C" int pascal func { /* ... */ };

    Функция С++ (возможно переопределяемая) должна описываться

    как Pascal, что допускает обычное переименование компилятора (и

    переопределение):

    extern int pascal func { /* ... */ };

    Unknown option -> параметр


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

    (неизвестный параметр)

    В командной строке или в файле подсказки обнаружен символ /

    или -, либо символ параметра DOS, за которым не следует ни один

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

    регистре.

    Unknown preprocessor directive: идентификатор


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

    (неизвестная директива препроцессора)

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

    сформирована остальная часть директивы.

    Unknown preprocessor statement


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

    (неизвестный оператор препроцессора)

    В начале строки обнаружен символ !, но следующим далее именем не является имя error, undef, if, elif, include, else или

    endif.

    Unreachable code


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

    (недостижимый код)

    За break, continue, goto или return не следует метка или конец цикла либо функции. Компилятор проверяет циклы while, do и

    for на анализ константы (условия) и пытается распознать циклы,

    которые не проходятся целиком.

    Unsupported option строка


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

    (неподдерживаемый параметр)

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

    Undeterminated string or character constant


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

    (незавершенная строка или символьная константа)

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

    строки или символьной константы.

    Use of . or -> to call функции


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

    (использование для вызова функции . или ->)

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

    Use of . or -> to call элемент, or & to take its address


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

    (использование для вызова элемента . или -> или операции &


    для получения его адреса)

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

    адрес должен получаться с помощью операции &.

    Use :: to take the address of a member function


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

    (для получения адреса функции-элемента используйте ::)

    Если f - это функция-элемент класса с, вы можете получить ее

    адрес с помощью синтаксиса &c::f. Обратите внимание на использование имени типа класса, а не имени объекта, и на операцию ::,

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

    use /e with TLINK to obtain debug information from library


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

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

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

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

    поддерживает расширенный словарь, следовательно в интегрированной

    среде параметры менять не нужно.

    Use of : and :: dependent for target цель


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

    (использование зависимости :: и : для целевого файла)

    Вы пытаетесь использовать целевой файл в одиночном и множественном блоке описания (с помощью операций : и ::). Например:

    filea: fileb

    filea:: filec

    Use qualified name to access nested type тип


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

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

    типу)

    В старых версиях Си и С++ определения typedef и имена признаков. описанные внутри классов, были непосредственно доступны в

    глобальной области действия. В последних спецификациях С++ этим

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

    класса, должен предшествовать квалификатор class::квалификатор.

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

    без class:: и выводит данное предупреждение.

    User break


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

    (прерывание пользователя)

    При компиляции или компоновке в интегрированной среде вы нажали клавиши Ctrl+Break, прервав процесс. (Это не ошибка, а просто подтверждение.)

    Удаление класса

  • Удалите исходный класс файла из проекта IDE (выбрав исходный узел, щелкнув правой кнопкой "мыши" и выбрав Delete
    node). Если исходный файл используется в других классах,
    удалите ссылки на класс в других исходных файлах.

  • Выберите в проекте AppsExpert, щелкните на нем правой
    кнопкой "мыши" и выберите Special Rescan. Rescan сканирует
    исходные файлы, перечисленные как зависимые файлы, и использует для построения целевого файла AppsExpert. После завершения Rescan вы возвращаетесь в обновленный исходный
    файл проекта и можете построить свое приложение с помощью
    ClassExpert.


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

    Параметр /O указывает библиотекарю, что из библиотеки нужно
    удалить все записи комментария "Comment". Записи комментария применяются обычно для хранения информации, используемой отладчиком
    или другими инструментальными средствами, и не требуются для создания выполняемого файла. Использование данного параметра позволит уменьшить объем ваших библиотек (и создаваемых с их использованием программ).

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


    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


    Установка параметров 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идентификатор

    Утилита 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.






















  • Утилита EXEMAP

    Файлы .MAP для выполняемых файлов Windows создает утилита
    EXEMAP. Файл .MAP можно использовать для создания файла .SYM, который затем используется WinSpector для улучшения отчета об ошибках. Это может быть особенно полезным для использования с .DLL
    или другими программами, для которых у вас нет исходного кода.
    Хотя полученный в результате файл .MAP не будет таким пол-
    ным, как сгенерированных компоновщиком, он содержит адреса экспортируемых общедоступных функций.
    Синтаксис: EXEMAP имя_выполняемого_файла [выходной_файл_map]
    Если [выходной_файл_map] и не задается, то по умолчанию это
    будет имя_выполняемого_файла.MAP.

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

    Утилита IMPDEF используется с IMPLIB для того, чтобы дать
    возможность настроить библиотеку импорта для необходимой комплектации заданной прикладной программы. Библиотека импорта используется для предоставления доступа к функциям DLL.
    Синтаксис вызова утилиты IMPDEF:
    IMPDEF имя_приемника.DEF имя_источника.DLL
    При этом из файла "имя_источника.DLL" создается файл определения модуля с именем "имя_приемника.DEF". Файл определения модуля будет выглядеть следующим образом:
    LIBRARY имя_файла
    DESCRIPTION 'Описание'
    EXPORTS
    имя_экспортируемой_функции @номер
    ...
    имя_экспортируемой_функции @номер
    где "имя_файла" является именем корневого файла DLL, 'Описание'
    является значением утверждения DESCRIPTON, если DLL была предварительно скомпонована с файлом определения модуля, который включает утверждение DESCRIPTION, "имя_экспортируемой_функции" являются именами экспортных функций, а "номера" являются порядковыми
    значениями (целыми) этих функций.

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

    Утилита IMPLIB создает библиотеку импорта, которая может замещать часть или всю секции IMPORTS файла определения модуля для
    прикладной программы Windows. IDE использует IMPLIB как транслятор для целевого файла DLL. Когда вы добавляете DLL в качестве
    цели, администратор проектов компилирует и компонует те файлы, от
    которых зависит DLL, а затем запускает IMPLIB для создания файла
    .LIB. Вы можете также запустить IMPLIB из IDE.
    Библиотеки импорта содержат записи. Каждая запись содержит
    имя DLL и определяет, где в DLL находятся импортируемые функции.
    Эти записи связываются с приложением с помощью компоновщика и
    обеспечивают для Windows информацию, нужную для выполнения вызова
    функций. Библиотека импорта может указываться в секции IMPORTS
    файла определения модуля.
    Если вы создали приложение Windows, то уже использовали по
    крайней мере одну библиотеку импорта, IMPORT.LIB, библиотеку для
    стандартных DLL Windows (она компонуется автоматически). Библиотека импорта перечисляет некоторые или все экспортируемые функции
    для одной или нескольких DLL. Чтобы создать библиотеку импорта
    для DLL, наберите:
    IMPLIB параметры имя_библиотеки [файлы_определ... DLL...]
    где "параметры" - это необязательный список из одного или более
    параметров IMPLIB, "имя_библиотеки" - это имя новой библиотеки
    импорта, "файлы_определ" - это список из одного или более файлов
    определения модуля для одной или более DLL, а DLL - список существующих DLL. Требуется задать по крайней мере одну DLL или
    файл определения модуля.

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


    Утилита MAKE

    Утилита MAKE фирмы Borland (MAKE - для защищенного режима и
    MAKER для реального режима) - это утилита управления проектами,
    работающая в режиме командной строки. Она помогает вам создавать
    выполняемую версию программы на основе самых последних версий исходных файлов. Многие программы состоят из значительного числа
    исходных файлов, каждый из которых, возможно, должен пропускаться
    через препроцессоры, ассемблеры, компиляторы и другие утилиты перед тем, как он будет объединяться с остальной частью программы.
    Если вы забудете перекомпилировать какой-либо модуль, который был
    модифицирован, или модуль, который зависит от какого-либо другого
    модифицированного исходного текста, то это может привести к разрушительным логическим ошибкам. С другой стороны, перекомпиляция
    всех исходных файлов лишь для того, чтобы обезопасить себя, может
    привести к слишком большим затратам времени.
    Эта задача разрешается утилитой MAKE. Утилите MAKE задается
    описание того, как должны обрабатываться исходные и объектные
    файлы вашей программы для того, чтобы получить результирующий
    продукт. Утилита MAKE анализирует эти описания и маркеры даты ваших файлов, а затем выполняет действия, необходимые для создания
    самой последней версии продукта. Во время выполнения этого процесса утилита MAKE может вызывать множество различных компиляторов, ассемблеров, компоновщиков и утилит, однако, для обновления
    результирующей программы она никогда не сделает ничего, что превышало бы необходимый минимум.
    Полезность утилиты MAKE выходит далеко за рамки чисто программных приложений. Вы можете воспользоваться утилитой MAKE для
    управления любым процессом, который связан с выбором файлов по
    имени и их обработкой для создания результирующего продукта. К
    числу некоторых широко распространенных приложений относится обработка текстов, автоматическое создание дубликатных копий, сортировка файлов по расширению имени с занесением их в другие каталоги, а также уничтожение временных файлов в ваших каталогах.

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

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

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

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

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

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

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

  • Когда утилита TLIB осуществляет модификацию существующей
    библиотеки, она всегда создает копию оригинальной библиотеки с
    расширением .BAK. При модификации существующей библиотеки TLIB
    всегда создает копию исходной библиотеки с расширением .BAK. Это
    делается для вашего удобства.
    Утилита TLIB может также создавать (и включать в файл библиотеки) расширенный словарь, который может использоваться для ускорения процесса компоновки.
    Хотя утилита TLIB не обязательна для создания выполняемых
    программ при работе с Borland C++, она представляет собой полезный инструмент повышения производительности труда программиста.
    Вы обнаружите, что утилита TLIB незаменима при создании больших
    проектов. Если вы работаете с библиотеками объектных модулей,
    созданных другими лицами, то при необходимости вы можете использовать TLIB для их сопровождения.

    Утилита TMAPSYM

    Утилита TMAPSYM создает файлы .SYM из существующих файлов
    .MAP. (созданных либо TLINK, либо утилитой EXEMAP). Результирующий файл .SYM содержит информацию о доступных для WinSpector
    функции public, именах переменных и функциях в таблице входа.
    Константы и информация о номерах строк в генерируемый утилитой
    TMAPSYM файл .SYM не включается.
    Синтаксис: TMAPSYM имя_файла[.MAP]
    Расширение .MAP не обязательно.
    Прекомпилированные файлы заголовков Borland C++ используют
    расширения .SYM и могут быть случайно затерты при генерации файла
    идентификаторов .SYM. Если вы используете компилятор, работающий
    в режиме командной строки, то можете указать параметр для переименования файла заголовка, чтобы избежать подобного конфликта
    имен.
    BUILDSYM перезаписывает любой существующий файл .SYM. Для
    надежности перед использованием утилиты BUILDSYM или TMAPSYM скопируйте существующие файлы .SYM.

    Утилита WinSight

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

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

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

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

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

    Утилита WinSpector

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

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

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

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

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


  • - V -

    Value of type void is not allowed


    Сообщение об ошибке этапа компиляции
    (значение типа void не допускается)
    Значение типа void на самом деле вовсе не является значением
    и, таким образом, не может появляться в контексте, где требуются
    фактические значения. Такой контекст включает в себя правую часть
    присваивания, аргумент функции, и управляющие выражения операто-
    ров if, for или while.
    VIRDEF Name Conflict for функция


    Сообщение об ошибке этапа компиляции
    (конфликт имен VIRDEF для функции)
    Компилятор должен усекать правленные имена до определенной
    длины, так как компоновщик имеет ограничение на длину имени. Это
    усечение может иногда приводить к тому, что два имени преобразу-
    ются в одинаковое имя. Если эти имена являются именами VIRDER, то
    компилятор выводит данное сообщение. Измените имя функции.
    Variable идентификатор is initialized more than once


    Сообщение об ошибке этапа компиляции
    (переменная инициализируется несколько раз)
    Данная переменная имеет более одной инициализации. Допуска-
    ется описывать файловую переменную несколько раз, но она может
    иметь только одну инициализацию.
    'virtual' can be used with member functions

    Сообщение об ошибке этапа компиляции
    ('virtual' можно использовать с функцией-элементом)
    Элемент данных описан со спецификатором virtual. Только
    функции элементы могут описываться как виртуальные.
    Virtual function функция conflict with base class база


    Сообщение об ошибке этапа компиляции
    (виртуальная функция противоречит базовому классу)
    Виртуальная функция имеет те же типы аргументов, что и функ-
    ция базового класса, но другой тип возврата. Это не допускается.
    Virtual specified more than once


    Сообщение об ошибке этапа компиляции
    (virtual задается несколько раз)
    Зарезервированное слово virtual С++ может встречаться только
    в описании функции-элемента.
    void& is not a valid type

    Сообщение об ошибке этапа компиляции
    (void& не является допустимым типом)
    Ссылка всегда ссылается на объект, но объект не может иметь
    тип void. Таким образом, тип void здесь не допускается.
    Void functions may not return a value


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

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

    WinSignt имеет три области (окна) просмотра, которые выводятся в ее основном окне: область списка классов, область дерева
    окон и область трассировки сообщений. Вы можете просматривать любую из них. WinSignt автоматически располагает эти области в основном окне с перекрытием.
  • Область списка классов показывает все зарегистрированные в
    данный момент классы окон.

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

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

  • Чтобы получить более подробную информацию об элементе в области дерева окон или списка классов, выберите окно или класс, а
    затем дайте команду Spy Open Detail, или дважды щелкните "мышью"
    на окне или классе. В окне Details выводится имя класса, выполняемого модуля и другая информация о классе или окне.

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

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

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

    После того, как вы нашли нужное окно, можно выйти из режима
    поиска окна, нажав кнопку "мыши" или клавиши Esc или Enter. При
    этом рамка будет удалена с экрана, а окно останется выделенным в
    дереве окон.

    Выполнение в 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(). После того, как произошло
    расширение всех макрокоманд, синтаксис выражения должен соответствовать установленным требованиям.

    - W -

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


    Сообщение об ошибке этапа компиляции
    (функция ранее была описана с языком язык)
    Для данной функции в операторе extern может использоваться
    один язык. В разных частях одного модуля эта функция была описана
    с разными языками.
    While statement missing (


    Сообщение об ошибке этапа компиляции
    (в операторе while пропущена скобка ()
    В операторе while после ключевого слова while компилятор не
    нашел левую скобку.
    While statement missing )

    Сообщение об ошибке этапа компиляции
    (в операторе while пропущена скобка ))
    В операторе while после ключевого слова while компилятор не
    нашел правую скобку.
    Write error on file имя_файла

    Сообщение об ошибке утилиты MAKE
    (ошибка записи в указанный файл)
    MAKE не может в формирующем файла открыть или записать имя
    файла. Обычно это вызывается переполнением диска.
    Wrong number of arguments in call macro макрокоманда


    Сообщение об ошибке этапа компиляции:
    (неверное число аргументов в вызове макрокоманды)
    В вашем исходном файле имеется макрокоманда с некорректным
    числом аргументов.

    Задание размера страницы: параметр /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.


  • Запуск 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.


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

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

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

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

    Описатель ссылки может также использоваться для объявления в
    функции параметров типа ссылки:
    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 Справа-налево
    .* ->* Слева-направо
    * / % Слева-направо
    + - Слева-направо
    << >> Слева-направо
    < <= > >= Слева-направо
    == != Слева-направо
    & Слева-направо
    ^ Слева-направо
    | Слева-направо
    && Слева-направо
    Слева-направо
    ?:(условное выражение) Справа-налево
    = *= /= := += -= &= ^= |= <<= >>= Справа-налево
    , Слева-направо


    Библиотека 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 полезно понимать, чем отличаются статическая и динамическая компоновка.

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

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

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

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

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


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


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

    Старые потоки записывают данные типов 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);

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

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

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

    В 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) обработчики сообщений используют
    разные методы выделения из сообщений данных. Использование макрокоманд обработки сообщений обеспечит функционирования кода выделения данных из сообщения на любой из двух платформ.

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

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

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

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

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

    Файлы описания проекта автоматизируют процесс построения
    приложений 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. Отмеченные этим ключевым словом функции будут идентифицироваться
    компоновщиком и вводиться компоновщиком в таблицу экспорта.

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

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

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

    Форматирование ввода и вывода определяется различными флагами состояний формата, перечисленными в классе 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.

    Функция 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 не используется, однако оно может быть полезным при отладке.

    Справочная информация по программированию

  • Ключевые слова Borland C++







  • Описание операций




  • Ссылки










  • Библиотечные классы Borland


















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


  • 32-разрядное программирование в Windows













  • Идентификаторы

    Характерным для Borland C++ и для других реализаций языка
    является учет регистра букв в идентификаторах. Последние могут
    содержать буквы от A до Z и от a до z, символ подчеркивания (_) и
    цифры от 0 до 9 и должны начинаться с буквы.
    Константы
    Константами называются лексемы, представляющие собой фиксированные числовые или символьные значения. Borland C++ поддерживает четыре класса констант: константы с плавающей точкой, целочисленные константы, константы перечислимого типа и символьные константы (включая строковые).
    Целочисленные константы представлены десятичным, восьмиричным и шестнадцатиричным форматом.
    Символьные константы записываются одним или более символами,
    заключенными в одинарные кавычки, например 'F', '=', '\n'.

    Имена контейнеров и комбинации 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 вы можете использовать шаблоны классов.

    Инструкции перехода

    Инструкции перехода рассматриваются отдельно. Поскольку метка не может быть включена в саму команду, переходы выполняются к
    меткам Си (см. выше раздел "Использование команд перехода и меток"). В следующей таблице перечислены допустимые инструкции перехода:
    Инструкции перехода
    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

    Использование 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

    Использование элементов структуры

    В операторах встроенного ассемблера вы можете ссылаться на
    элементы структуры (используя формат "переменная.элемент_структуры"). При этом вы работаете с переменными и можете сохранять и
    получать значения элементов структур. Однако, можно также ссылаться на элемент структуры непосредственно по имени (без имени
    переменно). Такая ссылка имеет форму числовой константы. При этом
    константы приравниваются смещению (в байтах) от начала структуры,
    содержащей данный элемент. Рассмотрим фрагмент программы:
    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

    Использование контейнеров

    Использование контейнеров с шаблонами позволяет вам построить приложение на основе стека (например, используя в качестве
    соответствующих структур вектора), что позволяет легко изменить
    реализацию связанного списка. Часто для этого требуется только
    изменить 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);
    }
    Результат будет тот же.

    Итераторы контейнера

    Каждый контейнер имеет соответствующий класс итераторов, которые предназначены для итерации конкретного вида контейнера.
    Например, итератор класса TArrayAsVector имеет соответствующий
    итератор TArrayAsVectorIterator, который отвечает за итерацию по
    всем элементам массива. Итератор контейнера реализуют для контейнера операции пред- и постинкрементации ++, а также функцию-элемент Current, возвращающую текущий объект, и функцию-элемент Restart, перезапускающую итерацию.

    Экспорт и импорт функций

    Чтобы сделать функции 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.

    Каталог 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-битовая библиотека импорта, диагностическая версия.


    Класс 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 обеспечивает общие методы буферизации и обработки потоков при небольшом объеме или отсутствии форматирования.
    streambuf это полезный базовый класс, используемый другими частями библиотеки iostream, хотя также вы можете создавать производные от него классы для собственных функций и библиотек. Классы strstreambuf и filebuf являются производными от streambuf.
    streambuf
    ^ ^ ^
    filebuf strstreambuf
    conbuf
    Класс streambuf обеспечивает интерфейс с памятью и физическими устройствами. Семейство функций-элементов streambuf используется классами, основанными на ios.

    Ключевые слова 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


    Коды операций

    В качестве операторов встроенного ассемблирования допускается включать любые коды операций 80х86. Существует четыре класса
    команд, позволяемых компилятором Borland C++:
  • обычные команды - стандартный набор кодов операций процессора 8086;

  • строковые команды - специальные коды обработки строк;

  • команды перехода - различные коды операций перехода;

  • директивы ассемблирования - размещения и определения данных.

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

    Компиляция со встроенным ассемблером

    Существует два способа, с помощью которых 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 может не
    идентифицировать место ошибки, так как номер строки исходного кода теряется.

    Контейнеры и файлы заголовков 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 - имя шаблона, указывающее соответствующий контейнер.
    В некоторых типах контейнеров содержимое записывается в отсортированном виде. Отсортированные контейнеры (как косвенные,
    так и прямые) должны иметь соответствующую операцию <, что позволяет определить порядок элементов. Эти операции предусмотрены для
    предопределенных типов. Для типов, определенных пользователем, вы
    должны обеспечить такую операцию. Для прямых объектов тип должен
    иметь допустимую операцию == - используемый по умолчанию конструктор. Для косвенных контейнеров сортируются объекты, а не указатели, которые содержит контейнер.

    Манипуляторы потока


    Манипулятор Действие
    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

    Метки и инструкции перехода

    Во встроенном ассемблере вы можете использовать любые условные и безусловные инструкции перехода и циклов. Эти инструкции
    допускаются только внутри функции. Поскольку метки в операторах
    asm определить нельзя, инструкции перехода должны использовать
    метки goto языка Си. Если метка находится слишком далеко, переход
    не будет автоматически преобразовываться в дальний переход. Поэтому работать с условными переходами нужно аккуратно. Для проверки переходов можно использовать параметр -B. Прямые переходы
    дальнего типа генерировать нельзя. Допускаются косвенные переходы. Чтобы использовать косвенные переходы, применяйте в качестве
    операнда инструкции перехода имя регистра.

    Мнемонические имена кодов операций

    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 );
    ...
    }

    Начальный и завершающий код

    Когда вам нужно скомпилировать модуль для Windows, компилятору требуется знать, какой начальный и завершающих код требуется
    создавать для каждой функции модуля. Созданием этого кода управляют установки IDE и параметры компилятора режима командной строки. Начальный и завершающий код выполняет несколько функций,
    включая обеспечение активности корректного сегмента при обратном
    вызове и поддержку границ стека в механизме обеспечения стека
    Windows.
    Начальный и завершающий код генерируется компилятором автоматически в соответствии с параметрами компилятора и установками
    IDE. Ключевое слово _export в определении сообщает компилятору,
    что нужно компилировать функцию как экспортируемую. В описании
    функции или класса _export непосредственно предшествует имени
    функции или класса.
    Ключевое слово _import в функции или классе сообщает компилятору, что функция или класс будут импортироваться из DLL.
    _import также указывается перед именем функции или класса.

    Написание переносимого кода 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.


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

    В данном разделе описываются некоторые наиболее общие ошибки
    и предупреждения, обнаруживаемые компилятором.
    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, вы можете внести

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

    переносимой.

    Описание операций

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

    Основные типы

    Непосредственно поддерживаются основные типы char, short,
    int, long, char* (интерпретируется как строка), float, double,
    long double и void*. Интегральные типы форматируются в соответствии заданными по умолчанию типами для printf (если вы не изменили эти правила установками флагов ios).

    Отслеживание версий объектов

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

    Параметр -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-разрядный
    режим).

    Параметры экспорта и импорта

    Экспорт функции состоит из двух этапов. Во-первых, компилятор должен создавать для функции корректный начальный и завершающий код. Благодаря этому функция становится экспортируемой.
    Во-вторых, компоновщик должен для каждой экспортируемой функции
    создавать запись в заголовке выполняемого файла. Это позволяет в
    16-разрядном режиме Windows связать с функцией на этапе выполнения корректный сегмент данных. В 32-разрядной Windows связывание
    сегментов данных не применяется. Однако DLL должны иметь записи в
    заголовке, благодаря которым загрузчик сможет найти функции для
    компоновки при загрузке в .EXE библиотеки DLL.

    Параметры -W и -WC

    Параметр -W создает прикладной объектный модуль Windows, в
    котором все функции будут экспортироваться. Компилятор генерирует
    начальный и завершающий код для каждой функции, обеспечивая ее
    экспортируемость. Это не означает, что все функции действительно
    будут экспортироваться. Для фактического экспорта одной из этих
    функций вы должны использовать ключевое слово _export или добавить запись этой функции в секцию EXPORTS файла определения модуля. Эквивалентный параметр -WC используется для 32-разрядных приложений консольного режима.

    Параметры -WD и -WCD

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

    Параметры -WDE и -WCDE

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

    Переносимость системных вызовов 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



    Для построения приложения 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

    Потоковый ввод

    Потоковый ввод аналогичен выводу, но использует переопределенную операцию сдвига вправо, >>, и называется операцией извлечения, или извлечением. Левый операнд операции >> представляет
    собой объект типа класса 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, для которого она вызывается. Это позволяет выполнять каскад операций.

    Предопределенные макрокоманды

    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). Если ни один из этих параметров не включен, то данная макрокоманда не определена.

    Префиксы

    Допустимы следующие префиксы:
    lock rep repe repne repnz repz

    Программирование для 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 и
    связанные с ним ресурсы.


  • Простые ссылки

    Для объявления ссылок вне функции может использоваться описатель ссылки:
    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 эквивалентны.

    Пунктуаторы

    В Borland C++ пунктуаторы, также называемые разделителями,
    определяются следующим образом:
    пунктуатор: одно из
    [ ] ( ) { } , ; : ... * = #

    Расширения 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-разрядных компиляторов

    Разрядное программирование в Windows

    В данном разделе кратко описывается программирование в среде
    Windows и Win32, и описывается, как можно перенести в эти среды
    программы. Такой перенос позволит компилировать ваши программы в
    16- и 32-разрядной версии Windows.
    32-разрядные инструментальные средства Borland C++ обеспечивают создание 32-разрядных файлов .OBJ и .EXE в формате переносимых выполняемых файлов PE. Это формат выполняемого файла для
    программ Win32 и Windows NT.

    Реализация потоковых классов

    Большинство функций-элементов, добавляемых к вашему классу с
    функцией 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 определяет специальный конструктор, который использует объектный потоковый код. Этот конструктор
    должен вызывать все соответствующие конструкторы для всех прямых
    базовых классов и всех соответствующих виртуальных классов.

    Регистровые псевдопеременные 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.

    Считывание и запись базовых классов

    В своем текущем программном коде вы можете считывать и записывать базовые классы непосредственно, например:
    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 );
    ...
    }
    Важно привести указатель к базовому классу, иначе ваша программа может аварийно завершиться.

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

    Чтобы включить в код Си/С++ инструкции ассемблера, используйте ключевое слово asm и следующий формат:
    asm код_операции операнды;
    где "код_операции" - допустимая инструкция процессора 80х86,
    "операнды" содержат операнды (операнд), допустимые для указанной
    операции (константы, переменные и метки). Концом оператора asm
    является символ ; или новая строка. После точки с запятой на той
    же строке может размещаться новый оператор asm, но на следующей
    строке оператор продолжаться не может. Для включения нескольких
    операторов asm их можно заключить в фигурные скобки (первая скобка должна быть на той же строке, что и asm):
    asm {
    pop ax; pop ds
    iret
    }
    Точки с запятой для комментария здесь не используются (как в
    TASM). При комментировании таких операторов применяйте стандартные комментарии Си. Ассемблерная часть оператора копируется непосредственно в вывод и включаются в операторы языка ассемблера,
    которые Borland С++ генерирует для инструкций Си и С++. Все идентификаторы Си заменяются на соответствующие эквиваленты ассемблера. Каждый оператор asm рассматривается как оператор Си.
    Оператор asm может использоваться в функции или как внешнее
    описание вне функции. Оператор asm, размещенные внутри функции,
    помещаются в сегмент кода, а операторы asm вне функции - в сегмент данных.

    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.

    Создание 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 в настоящее время не выполняет
    никаких действий.

    Создание потоковых объектов

    Простейший способ сделать класс потоковым состоит в использовании макрокоманд, предусмотренных в библиотеке постоянных потоков. Для большинства классов будут работать следующие шаги.
  • Сделайте 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, который определяет ядро потокового кода.

    Справочная информация по программированию

    Примечание: настоящий раздел представляет собой сводный обзор основных правил, обычно, используемых для написания программы, и обзор некоторых тем, часто необходимых в качестве справочного материала. Более строгую информацию можно найти в руководстве по 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. Начинаются они с перечня ключевых слов, которые не должны использоваться в качестве обычных имен идентификаторов.

    Ссылки на данные и функции

    В операторах asm вы можете использовать любой идентификатор
    Си, включая динамические локальные переменные, регистровые переменные и параметры функции. Borland С++ автоматически преобразует
    эти символы в соответствующие операнды ассемблера и добавляет к
    именам идентификаторов символы подчеркивания.
    В общем случае вы можете использовать идентификатор Си в любой позиции, где допускается операнд адреса. Там, где допустим
    регистровый операнд, вы можете использовать регистровую переменную. Если ассемблер обнаруживает идентификатор при анализе операторов инструкции встроенного ассемблера, то он ищет идентификатор
    в таблице идентификаторов Си. Имена регистров 80х86 из поиска
    исключаются. Имена регистров можно задавать символами в верхнем
    регистре.
    При программировании вам не нужно заботиться о точных смещениях локальных переменных - использование имени переменной предусматривает корректные смещения. Однако, может оказаться необходимым включить в инструкции ассемблера WORD PTR, BYTE PTR или
    другие переопределения размера. Для косвенных инструкций вызова
    типа FAR или LES необходимо переопределение DWORD PTR.

    Ссылки

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

    Стандарты 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

    Статические данные в 16-битовых DLL

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

    Строковые инструкции

    Помимо кодов операций, приведенных выше, возможно использование следующих строковых команд, как в исходном виде, так и с
    префиксами циклического выполнения.
    Строковые инструкции BASM
    cmps insw movsb outsw stos
    smpsb lods movsw scas stosb
    smpsw lodsb scasb stosw
    lodsw outsb scasw
    insb movs

    Типы 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.

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


    Операция Смысл
    & Операция адресации
    * Операция обращения по ссылке
    + Унарный плюс
    - Унарный минус
    ~ Поразрядное дополнение (дополнение
    до единицы)
    ! Логическое отрицание
    ++ Префикс: прединкрементация;
    Постфикс: постинкрементация
    -- Префикс: преддекрементация;
    Постфикс: постдекрементация


    Управление памятью

    Контейнеры позволяют вам контролировать управление памятью.
    Например, следующий контейнер позволяет передавать объект управления памятью:
    TMQueueVector MyQueue (100);
    TMQueueVector воспринимает два типа параметров: объект, который будет содержать очередь (MyClass), и имя класса управления
    памятью (MyMemManage), который вы хотите использовать. M в имени
    шаблона означает, что вы должны для реализации данного контейнера
    задать администратор памяти. Если в именах шаблонов M не указывается, то используется стандартный распределитель памяти
    TStandardAllocator, найденный в alloctr.h.
    TStandardAllocator предусматривает операции new, new[],
    delete и delete[], которые вызывают соответствующие глобальные
    функции. Пользовательское распределение памяти должно предусматривать специфическую для класса операцию new. В качестве примера
    для построения можно использовать содержимое alloctr.h.

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

    Различным реализациям одного и того же класса, изменяемым
    при обслуживание, вы можете присваивать различные номера версий.
    Это не означает, что в одной и той же программе вы можете использовать различные версии одного класса, но позволяет писать потоковый код таким образом, что программа, использующая более новую
    версию класса, может считывать поток, содержащий данные для старой версии класса, например:
    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.

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

    Косвенные контейнеры наследуют из 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. Длинная последовательность рекурсивных вызовов в итоге приведет к краху программы.

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

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

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

    Если функция отмечена ключевым словом _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 - эта комбинация также имеет смысл. Нет смысла компилировать все функции как экспортируемые, если реально вы экспортируете только некоторые из них.

    это расширение операционной системы 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.

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

    Библиотеки DOS

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

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

    В приложениях 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 Разработка оверлеев.


    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.

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

    Вы можете задать, сколько десятичных знаков должно участвовать в преобразовании из двоичного типа в 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.

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

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

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

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

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

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

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

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

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

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


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


    Функция Возвращаемое значение
    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 возвращают

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

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

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

    Справочник по работе с DOS

  • Управление памятью в DOS







  • Модели памяти








  • Программирование со смешанными моделями и модификаторы адресации








  • Оверлеи (VROOMM)











  • Математические операции














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
















  • Библиотеки DOS







  • Глобальные переменные DOS





  • Глобальные переменные DOS

    В данном разделе представлены глобальные переменные Borland
    С++, доступные только для 16-разрядных приложений DOS.

    Графические подпрограммы

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

    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)


    _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 стек находится в отдельном сегменте, и каждый
    модуль имеет собственный сегмент данных.

    Интерфейсные подпрограммы

    Следующие подпрограммы реализуют обращения к средствам 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)


    Использование библиотечных файлов

    Borland C++ предлагает для каждой из шести моделей памяти
    собственную версию библиотеки стандартных подпрограмм. Компилятор
    Borland C++ при этом проявляет достаточно "интеллекта", чтобы при
    последующей компоновке брать нужные библиотеки и в нужной последовательности, в зависимости от выбранной вами модели памяти. Однако, при непосредственном использовании компоновщика Borland C++
    TLINK (как автономного компоновщика) вы должны явно указывать используемые библиотеки.

    Использование двоично-десятичной арифметики (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.



  • Если вы планируете использовать вашу программу исключительно

    на машинах с установленным математическим сопроцессором 80х87, то

    можно сэкономить около 10К памяти программы, опустив из нее логику автоматического определения присутствия процессора 80х87 и

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

    кода операций с плавающей точкой при наличии сопроцессора 80х87

    (или параметр компилятора режима командной строки -f87). Borland

    C++ в этом случае скомпонует вашу программу с библиотекой

    FP87.LIB (вместо EMU.LIB).

    Использование оверлеев

    Для создания программы с оверлейной структурой все ее модули
    должны компилироваться с включенным параметром компилятора -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 с двумя
    оверлеями.

    Элементы изображения и палитры

    Графический экран представляет собой массив элементов изображения. Каждый элемент изображения соответствует одной (цветной)
    точке на экране. Значение элемента изображения не задает точный
    цвет этой точки напрямую; на самом деле это некоторый индекс таблицы цветов, называемой палитрой. Каждый элемент палитры, соответствующий данному значению элемента изображения, содержит точную информацию о цвете, которым будет отображен этот элемент
    изображения.
    Такая схема косвенных обращений имеет множество следствий.
    Хотя аппаратное обеспечение может позволять отображение множества
    цветов, одновременно на экране может находиться только некоторое
    их подмножество. Количество одновременно находящихся на экране
    цветов равно числу элементов палитры (размеру палитры). Например,
    EGA позволяет наличие 64 цветов, но лишь 16 из них может находиться на экране сразу; таким образом, размер палитры EGA равен 16.
    Размер палитры определяет диапазон значений, которые может
    принимать элемент изображения, от 0 до (размер-1). Функция
    getmaxcolor возвращает максимальное допустимое значение элемента
    изображения (размер-1) для текущего графического драйвера и режима.
    При обсуждении графических функций Borland C++ мы часто используем термин "цвет", например текущий цвет вычерчивания, цвет
    заполнения и цвет элемента изображения. Фактически цветом мы
    здесь называем значение элемента изображения: это некоторый индекс в палитре. Только палитра реально определяет фактический
    цвет на экране. Манипулируя палитрой, вы можете изменять фактические цвета, выводимые на дисплей, даже хотя значения элементов
    изображения (цвета вычерчивания, заполнения и т.д.) могут не изменяться.


    По умолчанию в Borland C++ устанавливается параметр генерации кода "эмуляция" (параметр компилятора режима командной строки

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

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

    80х87 не установлен.

    В случае параметра эмуляции компилятор генерирует код, как

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

    библиотеку эмуляции операций с плавающей точкой (EMU.LIB). При

    выполнении такой программы сопроцессор 80х87, если он установлен,

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

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

    обеспечение, эмулирующее процессор 80х87.

    Компоновка смешанных модулей

    Что произойдет, если вы компилируете один модуль с использованием модели памяти 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. Смешивание модулей с разными моделями - вещь экстравагантная, но допустимая. Будьте, однако, готовы к тому, что любые неточности здесь приводят к ошибкам, которые очень трудно найти и исправить при отладке.

    Манипулирование экраном и графическими окнами

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

    Функции работы с экраном Описание
    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 (которая отображает данный элемент

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

    цветом отдельных элементов изображения.

    Математические операции с комплексными числами

    Комплексными называются числа вида 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)

    Математические операции

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

    Модели памяти

    В 16-разрядных программах Borland С++ вы можете использовать
    6 моделей памяти: крохотную, малую, среднюю, компактную, большую
    и огромную.
  • (крохотная). Эта модель памяти используется в тех
    случаях, когда абсолютным критерием достоинства программы
    является размер ее загрузочного кода. Это минимальная из
    моделей памяти. Все четыре сегментных регистра (CS, DS, SS
    и ES) устанавливаются на один и тот же адрес, что дает общий размер кода, данных и стека, равный 64К. Используются
    исключительно ближние указатели. Программы со сверхмалой
    моделью памяти можно преобразовать к формату .COM (при
    компоновке с параметром /t).

  • (малая). Эта модель хорошо подходит для небольших
    прикладных программ. Сегменты кода и данных расположены
    отдельно друг от друга и не перекрываются, что позволяет
    иметь 64К кода программы и 64К данных и стека. Используются только указатели near.

  • (средняя). Эта модель годится для больших программ,
    для которых не требуется держать в памяти большой объем
    данных. Для кода, но не для данных используются указатели
    far. В результате данные плюс стек ограничены размером
    64К, а код может занимать до 1М.

  • (компактная). Лучше всего использовать эту модель
    в тех случаях, когда размер кода невелик, но требуется адресация большого объема данных. Указатели far используются
    для данных, но не для кода. Следовательно, код здесь ограничен 64К, а предельный размер данных - 1 Мб.

  • (большая). Модели large и huge применяются только в
    очень больших программах. Дальние указатели используются
    как для кода, так и для данных, что дает предельный размер
    1 Мб для обоих.

  • (огромная). Дальние указатели используются как для
    кода, так и для данных. 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. Эти
    процессора имеют и другие регистры, но непосредственно к ним обращаться нельзя, поэтому они здесь не показаны.

    Нехватка памяти при выполнении

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

    Объявление ближних или дальних функций

    В некоторых случаях вам может потребоваться переопределить
    заданное по умолчание значение типа функции для модели памяти.
    Например, вы используете модель памяти 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 будет
    помещать в стек только смещение.

    Обработка ошибок в графическом режиме

    Ниже приведены функции обработки ошибок в графическом режиме:

    Функция Описание
    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 (неправильная версия файла)


    Операции ввода-вывода с плавающей точкой

    Ввод вывод с плавающей точкой требует компоновки с подпрограммами преобразования, используемыми функциями printf и scanf.
    Чтобы уменьшить размер выполняемого файла, форматы с плавающей
    точкой автоматически не компонуются. Однако такая компоновка автоматически выполняется при использовании в программе математической подпрограммы или получении адреса некоторого числа с плавающей точкой. Если не выполняется ни одно из этих действий не
    выполняется, то отсутствие форматов с плавающей точкой может дать
    в результате ошибку ввода-вывода. Правильно оформить программу
    можно, например, следующим образом:
    /* Подготовка к выводу чисел с плавающей точкой */
    #include
    #pragma extref _floatconvert
    void main() {
    printf(*d = %f\n", 1.3);
    }

    Оптимальное использования оверлеев Borland C++

    Для полного использования преимуществ оверлейных структур,
    создаваемых Borland C++, сделайте следующее:
  • Минимизируйте резидентный код (резидентные библиотеки исполняющей системы, обработчики прерываний и драйверы устройств).

  • Установите размер оверлейного пула таким образом, чтобы
    добиться наиболее комфортных условий для создаваемой программы (начните со 128К и регулируйте этот размер вверх и
    вниз, пока не установите желаемое соотношение между быстродействием и размером программы).

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


  • Отладка оверлейных программ

    Большинство отладчиков либо имеет весьма ограниченные средства отладки программ с оверлейной структурой, либо вообще не имеет таких средств. Иначе дело обстоит с интегрированным со средой
    разработки программ отладчиком Borland C++ и автономным отладчиком фирмы Borland (Turbo Debugger). Оба эти отладчика полностью
    поддерживают пошаговую отладку и установку точек останова в оверлеях совершенно "прозрачным" для вас способом. Благодаря использованию оверлеев вы имеете возможность легко разрабатывать и отлаживать громоздкие прикладные программы - как в интегрированной
    среде, так и при помощи Turbo Debugger.

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

    По умолчанию программа 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++.

    Оверлеи и обработка исключительных ситуаций

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

  • Шаблоны функций.

  • Функции-элементы или шаблоны классов.

  • Конструкция обработки исключительной ситуации включает в себя написанный пользователем блок 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;
    Для определения оптимального размера оверлейного буфера общего метода не существует.

    Параметр быстрых вычислений с плавающей точкой

    Borland C++ имеет параметр быстрых вычислений с плавающей
    точкой (параметр компилятора режима командной строки -ff). Выключить этот параметр можно при помощи параметра командной строки
    -ff-. Его назначение состоит в выполнении некоторой оптимизации,
    противоречащей правильной семантике языка Си. Например:
    double x;
    x = (float)(3.5*x);
    Для вычисления по обычным правилам x умножается на 3.5, давая точность результата double, которая затем усекается до точности float, после чего x записывается как double. При использовании параметра быстрых вычислений с плавающей точкой произведение типа long double преобразуется непосредственно в double. Поскольку лишь очень немногие программы чувствительны к потере точности при преобразовании от более точного к менее точному типу с
    плавающей точкой, то данный параметр используется по умолчанию.

    с эмуляцией сопроцессора 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 станет неопределенной.

    Подпрограммы управления палитрой в случае 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)


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

    При отсутствии в программе операций с плавающей точкой вы
    можете сэкономить немного времени компиляции, выбрав значение параметра генерации операций с плавающей точкой None ("отсутствуют") (или параметр компилятора командной строки -f-). Тогда Borland C++ не будет выполнять компоновку ни с библиотекой
    EMU.LIB, ни с FP87.LIB, ни с MATHx.LIB.

    Преобразования двоично-десятичных чисел

    Тип 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.

    Программирование со смешанными моделями и модификаторы адресации

    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.

    Работа программ с оверлеями

    Программа управления оверлеями (VROOMM, или Virtual Run-time
    Object-Oriented Memory Manager) выполняет за вас большую часть
    работы по организации оверлеев. В обычных оверлейных системах модули группируются в базовый и набор оверлейных модулей. Подпрограммы в данном оверлейном модуле могут вызывать подпрограммы из
    этого же модуля и из базового модуля, но не из других модулей.
    Оверлейные модули перекрывают друг друга, т.е. одновременно в памяти может находиться только один оверлейный модуль, и все они
    при активизации занимают один и тот же участок физической памяти.
    Общий объем памяти, необходимой для запуска данной программы, определяется размером базового, плюс максимального оверлейного модуля.
    Эта обычная схема не обеспечивает достаточной гибкости. Она
    требует полного учета всех возможных обращений между модулями
    программы и, соответственно, планируемой вами, группировки оверлеев. Если вы не можете разбить вашу программу в соответствии со
    взаимозависимостью обращений между ее модулями, то вы не сможете
    и разбить ее на оверлеи.
    Схема VROOMM совершенно иная. Она обеспечивает динамический
    свопинг сегментов. Основной единицей свопинга является сегмент.
    Сегмент может состоять из одного или нескольких модулей. И что
    еще более важно, любой сегмент может вызывать любой другой сегмент.
    Вся память делится на базовую область и область свопинга.
    Как только встречается вызов функции, которая не находится ни в
    базовой, ни в области свопинга, сегмент, содержащий вызываемую
    функцию, помещается в область свопинга, возможно, выгружая оттуда
    при этом другие сегменты. Это мощное средство - подобное виртуальной программной памяти. От вас больше не требуется разбивать
    код на статические, отдельные оверлейные блоки. Вы просто запускаете программу!
    Что происходит, когда возникает необходимость поместить сегмент в область свопинга? Если эта область имеет достаточно свободного места, то данная задача выполняется просто. Если же нет,
    то из области свопинга, чтобы искомая свободная область освободилась, должен быть выгружен один или более сегментов. Как выбрать

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

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

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

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

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

    работает программа. Область свопинга работает как кэш-память: чем

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

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

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

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

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

    программы, но его можно изменить при помощи глобальной переменной

    _ovrbuffer. Если достаточный размер памяти недоступен, то появляется либо сообщение об ошибке DOS ("Program too big to fit in memory" - "Программа слишком велика для имеющейся памяти").

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

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

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

    не считываться с диска, а просто копироваться из этой памяти. Это

    существенно ускоряет свопинг.

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

    Распределение памяти для оверлейных структур

    Модель MEDIUM Модель LARGE
    класс CODE Резидентный класс CODE
    код
    Эти сегменты класс OVRINFO Данные для класс OVRINFO
    генерируются управления
    компоновщиком оверлеями
    автоматически
    класс STUBSEG Один сегмент класс STUBSEG
    stub для
    каждого
    оверлейного
    сегмента
    _DATA _DATA
    Ближняя динами- класс DATA класс DATA
    чески распреде-
    ляемая область и ближняя куча Отдельный
    стек совместно ^ сегмент ^
    используют сег- стек стека стек
    мент данных
    оверлейный буфер оверлейный буфер
    (распределяется (распределяется
    при загрузке) при загрузке)
    дальняя дальняя
    динамически динамически
    распределяемая распределяемая
    v область v область
    Модель HUGE
    Резидентный класс CODE
    код
    Эти сегменты Данные для класс OVRINFO
    генерируются управления
    компоновщиком оверлеями
    автоматически
    Один дополни- класс STUBSEG
    тельный сег-
    мент для
    каждого
    оверлейного
    сегмента
    . . . Несколько
    сегментов
    данных
    Отдельный
    сегмент ^
    стека стек
    оверлейный буфер
    (распределяется
    при загрузке)
    дальняя
    динамически
    распределяемая
    v область

    Разные подпрограммы

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

    delay (dos.h) sound (dos.h)
    nosound (dos.h)


    Разработка программ с оверлеями

    Этот раздел содержит важные сведения о разработке программ с
    оверлеями с хорошими характеристиками.
    При компиляции оверлейного модуля вы должны использовать
    большую модель памяти (medium, large или huge). При всяком вызове
    функции из оверлейного модуля вы обязаны гарантировать, что все
    активные в текущий момент функции являются дальними.
    Вы обязаны компилировать все оверлейные модули с параметром
    -Y, что обеспечит оверлейную структуру генерируемого кода.
    Невыполнение требования дальних вызовов в оверлейной программе приведет при выполнении программы к непредсказуемым и возможно, катастрофическим результатам.
    Размер оверлейного буфера по умолчанию в два раза превышает
    размер самого большого оверлея. Для большинства прикладных программ такое умолчание вполне адекватно. Однако, представим себе
    ситуацию, когда какая-либо функция программы реализована несколькими модулями, каждый из которых является оверлейным. Если общий
    размер этих модулей превышает размер оверлейного буфера, то если
    модули часто вызывают друг друга, это приведет к интенсивному
    свопингу.
    Очевидно, что решение здесь заключается в увеличении размера
    оверлейного буфера до таких размеров, чтобы в любой момент времени в нем помещались все часто вызывающие друг друга оверлеи. Это
    можно сделать, установив через глобальную переменную _ovrbuffer
    требуемый размер в параграфах. Например, для установки размера
    оверлейного буфера равным 128К, включите в ваш код следующий оператор:
    unsigned _ovrbuffer = 0x2000;
    Общей формулы для определения идеального размера оверлейного
    буфера не существует.
    Не создавайте оверлейных модулей, содержащих обработчики
    прерываний, а также в случаях небольших или критичных к быстродействию программ. Вследствие нереентерабельной природы операционной системы DOS модули, которые могут вызываться функциями прерываний, не должны быть оверлейными.
    Программа управления оверлеями Borland C++ полностью поддерживает передачу оверлейных функций как аргументов, присвоение и
    инициализацию переменных типа указателя функции, адресующих оверлейные функции, а также вызов оверлейных подпрограмм через указатели функций.

    с плавающей точкой вы должны

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

  • В режиме эмуляции сопроцессора 80х87 циклический переход

    в регистрах, а также ряд других особенностей 80х87 не

    поддерживается.


  • Если вы смешиваете операции с плавающей точкой и встроенные коды на языке Ассемблера, то при использовании регистров следует должны принимать некоторые меры предосторожности. Это связано с тем, что набор регистров сопроцессора 80х87 перед вызовом функции в Borland C++ очищается. Вам может понадобиться извлечь из стека и сохранить

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


  • Регистры общего назначения


    Аккумулятор (математические операции) Базовый регистр (индексирование)
    Счетчик (индексирование)
    Регистр данных
    AX AH AL
    BX BH BL
    CX CH CL
    DX DH DL


    только 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.

    Сегментация для модели памяти 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 Дополнительный регистр сегмента


    Сопроцессор

    Си работает с двумя числовыми типами: целыми (int, short,
    long и т.д.) и с плавающей точкой (float double и long double).
    Процессор вашего компьютера легко справляется с обработкой чисел
    целых типов, однако числа с плавающей точкой отнимают больше времени и усилий.
    Семейство процессоров iAPx86 имеет сопутствующее ему семейство математических сопроцессоров - 8087, 80287 и 80387. Мы будем
    обозначать все семейство математических сопроцессоров 80x87 термином "сопроцессор". (В случае процессора 80487 вы имеете математический сопроцессор уже встроенным в основной.)
    Процессор 80х87 представляет собой специальный аппаратно реализованный числовой процессор, который можно установить на вашем
    PC. Он служит для выполнения с большой скоростью команд с плавающей точкой. При большом количестве в вашей программе операций с
    плавающей точкой вам, безусловно, нужен сопроцессор. Блок центрального процессора в вашем компьютере осуществляет интерфейс с
    80х87 по специальным шинам интерфейса.

    Создание указателя данного адреса "сегмент:смещение"

    Как создать дальний указатель на конкретный адрес памяти
    (конкретный адрес "сегмент:смещение")? Для этого можно воспользоваться встроенной библиотечной подпрограммой MK_FP, которая в качестве аргумента воспринимает сегмент и смещение, и возвращает дальний указатель. Например:
    MK_FP(segment_value, offset_value)
    Имея дальний указатель fp, вы можете получить значение сегмента полного адреса с помощью FP_SEG(fp) и значение смещения с
    помощью FP_OFF(fp). Более полную информацию об этих трех библиотечных функциях Borland C++ можно найти в справочнике по библиотеке.

    Справочник по работе с DOS

    Ниже представлена информация, которая будет полезной при
    разработке 16-разрядных приложений для работы в DOS.

    _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 стек находится в отдельном сегменте, и каждый
    модуль имеет собственный сегмент данных.

    Свопинг

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

    Текстовые и графические окна

    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, который находится на дистрибутивном диске.

    Типы указателей


    Модель памяти Указатели функции Указатели данных
    Tiny near, _cs near, _ds
    Small near, _cs near, _ds
    Medium far near, _ds
    Compact near, _cs far
    Large far far
    Huge far far


    Требования

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

  • Прикладные программы с оверлейной структурой должны иметь
    одну из трех следующих моделей памяти: medium , large или
    huge; модели tiny, small и compact оверлеи не поддерживают.

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

  • Генерация оверлеев во время компоновки полностью не зависит
    от управления сегментами во время исполнения программы; компоновщик не включает автоматически каких-либо кодов для управления
    оверлеями. Действительно, с точки зрения компоновщика программа
    управления оверлеями является просто одним из подлежащих компоновке участков кода. Единственное предположение, которое делает
    компоновщик, состоит в том, что программа управления оверлеями
    воспринимает вектор прерываний (обычно INT 3FH), через который
    происходит управление динамической загрузкой. Такой уровень
    "прозрачности" упрощает создание пользовательских программ управления оверлеями, наилучшим образом управляющих требованиям конкретной прикладной программы.

    Указатели сегментов

    В объявлениях типа указателя сегмента используется __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.

    Управление цветом для 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 Изменяет один из цветов палитры, как
    указано ее аргументами.

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

    Управление графической системой

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

    Функция Описание
    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" ("повторение символических имен"). Это предупреждение можно игнорировать.

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

    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), с теми же направления возрастания координат.

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

    Подобно обычным функциям языка Си, внешние (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. Она не обязана устанавливать границ стека.
    Оверлейные подпрограммы на языке ассемблера не должны создавать переменные в кодовом сегменте, поскольку все изменения, внесенные в оверлейный кодовый сегмент, теряются при освобождении оверлея. Подобным же образом, указатели объектов, расположенных в оверлейных сегментах, не сохраняют достоверность после вызова других оверлеев, поскольку программа управления оверлеями свободно перемещает и освобождает оверлейные кодовые сегменты в памяти.

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

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

    Данные вашей программы - это глобальные и локальные переменные, а также определенные константы. Для проверки и модификации
    данных в 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 нужные
    действия.


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

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

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

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

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

    Драйвер устройства - это набор подпрограмм, используемых
    операционной системой 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
    также очень полезна.

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

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

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

    Кнопка с зависимой фиксацией 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 номер группы.


    Дерево меню

    Ниже показана полная структуру спускающихся меню отладчика
    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

    Доступ к 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 как одну команду.

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

    При запуске 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.

    Файлы, входящие в состав пакета 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 Пример программы.


    Трассировка исключительных ситуаций операционной



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










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

























  • Интерфейс отладчика























  • Точки останова



























  • Окно Log





  • Окно Watches





  • Окно Variables





  • Окна Inspector





  • Окно Stack







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





















  • Отладка на уровне ассемблера





















  • Отладка в 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 - все ее классы.

    Инициация связи

    После настройки TDW для удаленной отладки загрузите программу с помощью диалогового окна Load a New Program to Debug. TDW
    выводит уведомляющее сообщение. После установления связи выводится обычный экран отладчика, и команды его работают так же. Однако
    вывод программы на экран и ввод с клавиатуры происходит на удаленной системе.

    Инкрементальное сопоставление

    Это средство помогает вам находить записи в алфавитных списках. При наборе каждого символа полоса подсветки перемещается к
    первому элементу, начинающемуся с выбранных вами букв. Позиция
    курсора указывает, какую часть имени вы уже набрали. После подсветки вы можете нажать Alt+F10 или щелкнуть правой кнопкой "мыши". При этом выводится SpeedMenu, где вы можете выбрать команду,
    соответствующую подсвеченному элементу.

    Интерфейс отладчика

    Среда Turbo Debugger включает в себя набор меню, диалоговых
    окон и специальных окон отладчика.

    Экран пользователя

    Экран пользователя показывает полный экран вывода вашей
    программы. Этот экран имеет такой же вид, как при выполнении
    программы без Turbo Debugger. Чтобы переключиться в этот экран,
    выберите команду Window User Screen. Для возврата в экран отладчика нажмите любую клавишу.

    Клавиатурные макрокоманды

    Макрокоманды представляют собой просто определяемые вами
    оперативные клавиши. Одной клавише вы можете назначить любую последовательность команд и нажатий клавиш.
    Расположенная в меню Options команда Macros выводит всплывающее меню с командами для определения клавиатурных макрокоманд и
    удаления ненужных: Create (Alt+=), Stop Recording (Alt+-), Remove
    и Delete All. Команда Create начинает запись макрокоманды, а команда Stop Recording завершает ее (не используйте для завершения
    записи команду Options Macro Stop Recording, так как она добавится к вашей макрокоманде). Delete All удаляет все текущие макрокоманды.

    Команда 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.

    Команды меню окна 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.


    Механизм вычисления выражений 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 вы можете обращаться к отладчику

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

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

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

    Настройка Turbo Debugger

    Вы можете конфигурировать параметры вывода Turbo Debugger и
    программные установки с помощью файлов конфигурации и меню Option
    отладчика. Параметры, установленные в файлах конфигурации, начинают действовать после загрузке Turbo Debugger. Чтобы изменить
    параметры после загрузки, используйте команды в меню Options.

    Область дампа

    В этой области выводится в шестнадцатиричном виде содержимое
    области памяти. В левой части каждой строки показан адрес (в виде
    "сегмент:смещение" или 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 активизирует область иерархии, подсвечивая
    текущий класс.

    Область кода

    В левой части области кода выводятся адреса дизассемблированных инструкций. Для 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.

    Область регистров и флагов

    В области регистров (верхняя область справа от области кода)
    выводится содержимое регистров процессора. Вид этой области зависит от отладчика (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 выводит содержимое области памяти, на которую ссылается текущий селектор, и переключается в область, где
    выводится содержимое. Если селектор указывает на сегмент кода, то
    содержимое выводится в области кода. Если содержимое представляет
    собой данные, то оно выводится в области данных.

    Область стека

    Эта область показывает шестнадцатиричное содержимое программного стека. Текущий указатель стека отмечается указателем >.
    SpeedMenu этой области содержит команды Goto, Origin, Follow,
    Previous и Change, аналогичные описанным выше командам.

    Обратное выполнение

    Каждую выполненную инструкцию 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.

    Окна 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

    Выводят текущее содержимое выбранной переменной. Его можно
    открыть с помощью команды Data Inspect или Inspect меню SpeedMenu. Закрывается оно обычно по Esc или щелчком "мышью" на блоке
    закрытия. При последовательном открытии нескольких окон Inspector
    нажатием Alt+F3 или командой Window Close вы можете закрыть сразу
    все эти окна. Окна Inspector выводят простые скалярные величины,
    указатели, массивы, объединения, структуры, классы и объекты. Выбором команды Inspect в этом окне вы можете создать дополнительные окна 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 для структур и объединений показывают значения элементов в сложных объектах данных. Такое окно имеет две области. В верхней области выводится адрес объекта данных с перечислением имен и значений элементов данных объекта. Нижняя область содержит одну строку. Если вы в верхней области подсветите

    Окна меню 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 с наследованием текущего класса.


    Окна 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. Команды данного меню позволяют вам добавлять новые точки останова, отменять существующие или изменять характер поведения имеющихся точек останова.

    Окно Clipboard

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

    Окно CPU

    Выводит текущее состояние процессора. Окно имеет 6 областей,
    где выводятся дизассемблированные инструкции, селекторы Windows
    (только в TDW), шестнадцатиричные данные, стек в шестнадцатиричном виде, регистры ЦП и флаги процессора. Это окно полезно использовать при отладке программ на ассемблере или просмотре точно последовательности инструкций.

    Это окно открывается командой 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 выводится автоматически.

    Окно Dump

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

    В этом окне выводится в непосредственном виде дамп любой области памяти. Оно работает так же, как область данных окна 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.

    Окно 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
    < >

    Окно Log

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

    Это окно отслеживает события, происходящие во время сеанса
    отладки. Открывается оно по команде 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. Позволяет вывести информацию о динамически распределяемой памяти и список модуля приложения.


    Окно Module

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

    Окно Numeric Processor

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

    Окно Registers

    Показывает содержимое регистров (в области регистров) и флагов ЦП (в области флагов). С помощью команд SpeedMenu вы можете
    изменить их значения.

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

    Окно Stack

    Показывает текущее состояние программного стека. Первая вызванная функция показывается в нижней части окна, а выше ее - каждая последующая. Подсвечивая эти функции и нажимая Ctrl+I вы можете проверять исходный код. Кроме того, можно открыть окно Variables и вывести все локальные переменные и аргументы функции (Ctrl+L).

    Это окно позволяет проанализировать стек вызова и вывести в
    удобном для чтения формате все активные функции и значения аргументов. Окно 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 с идентификаторами, локальными для текущего модуля и
    подсвеченной функции.

    Окно 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 Смена текущего модуля. Выводит диалоговое окно со
    списком модулей программы.


    Окно Watches

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

    Это окно обеспечивает самый простой способ отслеживания элементов данных программы. В нем вы можете просматривать переменные
    и выражения, значения которых нужно отслеживать.
    [*] 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, который можно сопровождать спецификаторами формата и квантификаторами.

    Окно Windows Messages

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

    Оперативная помощь

    В отладчик встроен контекстно-зависимый оперативный справочник. Он доступен как при работе в системе меню, так и при выводе
    сообщения об ошибке или подсказки. Для вывода справочного экрана
    с информацией, относящийся к текущему контексту (окну или меню)
    нажмите клавишу 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.
    При работе в отладчике в нижней части экрана выводится краткая справочная строка. В этой строке состояния кратко описаны
    клавиши или команды меню для текущего контекста.

    Отладка библиотек 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 предусмотрен ряд средств для отладки объектно-ориентированных программ С++.

    Отладка программ 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.

    Память и списки модулей

    В 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.

    Переключатель 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 или утилиты установки отладчика.

    Переменные стека

    С помощью окна Stack вы можете проверить любые переменные
    или функции, которые находятся в стеке (включая рекурсию). Для
    этого откройте окно стека и подсветите проверяемую функцию. Затем
    нажмите F10 и выберите Locals. Область Statis окна Variables показывает значения аргументов.

    Переопределение области действия

    Область действия идентификатора - это та область программы,
    в которой на него можно ссылаться. Заданные в выражении идентификаторы Turbo Debugger ищет в следующем порядке:
  • идентификаторы в стеке текущей функции;

  • идентификаторы в модуле, содержащем текущую функцию;

  • глобальные идентификаторы (вся программа);

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

  • Для определения области действия идентификатора отладчик использует текущую позицию курсора. Если вы измените в отладчике
    область действия, это может дать непредсказуемые результаты, поэтому для возврата к текущей точке используйте команду Origin окна Module.
    Синтаксис переопределения области действия зависит от выбранного в окне Options Language языка. В Си, С++ и ассемблере для
    этого используется символ #, в Pascal - точка. Таким образом, для
    переопределения области действия используется следующий синтаксис
    (в квадратные скобки заключены необязательные элементы):
    [#модуль[#имя_файла]]#номер_строки[#номер_переменной]
    или
    [#модуль[#имя_файла]][#имя_функции]#имя_переменной

    Подготовка программ для отладки

    Когда вы выполняете компиляцию и компоновку с помощью одного
    из языков фирмы Borland, вам следует указать компилятору, что
    нужно генерировать полную информацию для отладки. Если вы скомпилируете объектные модули своей программы без информации для отладки, вам придется перекомпилировать все эти модули, чтобы можно
    было полностью использовать все средства отладки на уровне исходного кода. Можно также сгенерировать информацию для отладки только для отдельных модулей (это позволит сократить объем программы), но потом будет крайне неприятно попасть в модуль, где информация для отладки недоступна. Поэтому мы рекомендуем перекомпилировать все модули, если, конечно, вам это позволяет имеющаяся память. В случае нехватки памяти или уверенности в правильной работе отдельных модулей можно перекомпилировать только конкретные
    модули. При компиляции программ для отладки лучше исключить оптимизацию, иначе вы запутаетесь при отладке отдельных частей кода,
    оптимизированных компилятором.
    При компиляции из интегрированной среды для включения в файлы .OBJ отладочной информации выберите команду Options Project
    (для вывода блокноте Style Sheet), в блоке списка Topic выберите
    Compiler Debugging и включите в OBJs кнопку с независимой фиксацией Debug. Чтобы включить отладочную информацию в выполняемые
    файлы, выберите команду Options Project, затем команду Linker General в блоке списка Topic. Выводятся кнопки с независимой фиксацией General. Включите кнопку Debug Information.
    При компиляции программ с использованием компилятора режима
    командной строки используйте для включения отладочной информации
    директиву компилятора -v.
    После полной отладки программы вы можете скомпилировать и
    скомпоновать ее заново с оптимизацией и исключением отладочной
    информации.

    Получение справочной информации

    Turbo Debugger предлагает несколько способов получения в ходе отладки справочной информации. - С помощью клавиши F1 вы можете получить доступ к развитой контекстной справочной системе. По
    данной клавише на экран выводится список тем, из которых вы можете выбрать необходимую.
    Индикатор активности в левом правом углу экрана всегда показывает текущее состояние. Например, если курсор находится в окне,
    в индикаторе активности выводится READY. Если выводится меню, в
    нем указывается MENU, а если вы находитесь в диалоговом окне PROMPT. Если вы, запутаетесь и не можете понять, что происходит в
    отладчике, взгляните на индикатор активности.
    В строке состояния в нижней части экрана всегда дается краткая информация об используемых клавиатурных командах. При нажатии
    клавиши Alt или Ctrl данная строка изменяется. Когда вы находитесь в системе меню, эта строка предлагает вам оперативное описание текущей команды меню.

    Прерывание выполнения программы

    При выполнении программы вы можете получить доступ к отладчику, нажав клавишу прерывания программы. Используемые клавиши зависят от типа отлаживаемого приложения:
  • при отладке программ Windows 3.х используйте клавиши
    Ctrl+Alt+SysRq;

  • при отладке программ Windows 32s используйте клавиши
    Ctrl+Alt+F11;

  • при отладке программ Windows NT используйте клавишу
    F12;

  • при отладке программ DOS используйте клавиши Ctrl+Break.

  • Это полезно использовать, когда в программе не установлены
    точки останова.
    Если при возврате в Turbo Debugger вы увидите окно CPU без
    соответствующих программе инструкций, то возможно вы находитесь в
    коде ядра Windows. При этом следует установить точку останова в
    том месте, где должна выполняться ваша программа. Затем выполните
    программу до точки останова (F9). После этого можно возобновить
    отладку. Находясь в ядре Windows, не следует пытаться выполнять
    программу по шагам или пытаться перезагрузить приложение. Это может привести к краху системы.

    Просмотр других файлов

    Для просмотра любого файла на диске, включая двоичные и
    текстовые, используйте окно File. При выборе в строке меню команды View File отладчик выводит диалоговое окно Enter Name of File.
    Вы можете задать в нем трафаретные символы или конкретное имя
    файла. В зависимости от содержимого файла в открываемом окне File
    файлы выводятся в текстовом или шестнадцатиричном виде.

    Просмотр и модификация файлов

    Turbo Debugger предусматривает два способа просмотра файлов
    на диске: окно Module и окно File. Окно Module чаще всего используется в отладчике. Его можно применять для просмотра исходного
    кода выполняемого модуля, скомпилированного с отладочной информацией. Строка заголовка этого окна показывает имя текущего загруженного модуля, имя текущего исходного файла и номер строки курсора. Выполняемая строка в этом окне помечается символом точки
    (.), а стрелка (>) в первой позиции показывает указатель команд.
    Он всегда отмечает следующий выполняемый оператор. При загрузке
    программы в отладчик окно Module загружается автоматически
    При выполнении программы по шагам окно Module автоматически
    показывает исходный код, соответствующий выполняемой инструкции.
    Перемещаясь по исходному коду, вы можете установить точки останова и задать отслеживаемые выражения, а также проверить значения
    переменных. Если в строке заголовка выводится opt, то программа
    оптимизирована компилятором. Это может затруднить поиск переменных. Если файл модифицирован после последней компиляции, то в заголовке выводится modified. Это может привести к несоответствию
    строк исходного текста. Перекомпилируйте программу.

    Работа с буфером 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.


    Работа с меню

    Команды глобальных меню Turbo Debugger выводятся в верхней
    части экрана в строке меню. Если вы не находитесь в диалоговом
    окне, то эти команды всегда доступны. Чтобы открыть меню Turbo
    Debugger, нажмите F10, с помощью стрелой переместитесь в нужному
    пункту и нажмите Enter. После F10 для перехода к нужному пункту
    можно также нажать его подсвеченную букву, либо сразу нажмите
    Alt+буква (без F10). Системное меню выбирается по Alt+пробел. Меню открывается также щелчком "мышью" на соответствующем пункте.

    Регистрация сообщений

    Окно Windows Messages имеет ряд команд для трассировки и
    проверки получаемых программой оконных сообщений. С его помощью
    вы можете устанавливать точки останова по сообщениям (выполнение
    программы будет приостанавливаться при получении сообщения конкретным окном). Вы можете также регистрировать получаемые окном
    сообщения. Данное окно открывается командой View Message и имеет
    три области: область выбора окна, область класса сообщения и область регистрации.

    Спецификаторы формата

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

    Спецификатор Формат
    c Символ или строка выводятся на экран в виде необработанных символов. Обычно непечатаемые символы выводятся в виде управляющих символов или в числовом формате. Этот параметр приводит к тому, что при выводе символов будет использоваться полный набор символов дисплея IBM.
    d Целое число выводится в виде десятичного значения.
    f[#] Формат с плавающей точкой с заданным числом цифр.
    Если вы не задаете число цифр, то используется столько цифр, сколько необходимо.
    m Выражение со ссылкой на память выводится в виде
    шестнадцатиричных байт.
    md Выражение со ссылкой на память выводится в виде
    десятичных байт.
    P Выводится необработанное значение указателя, показывающее сегмент, как имя регистра (если это возможно). Показывается также объект, на который указатель ссылается. Если управление форматом не задано, то это используется по умолчанию.
    s Выводится массив или указатель на массив символов
    (строка, заключенная в кавычки). Строка завершается нулевым символом.
    x или h Целое выводится в виде шестнадцатиричного значения.

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

    Текстовое окно 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
    (общая и доступная виртуальная память).

    Типы выражений

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

    Язык 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.

    Трассировка исключительных ситуаций операционной системы

    В 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 или старше).

    Удаление точек останова

    Удалить точки останова можно с помощью локального меню (SpeedMenu) окна Breakpoints или меню Breakpoints. Команда Remove меню окна Breakpoints или клавиша Del стирают точку останова, подсвеченную в области списка. Команда Delete All меню Breakpoint и
    локального меню окна Breakpoints удаляют все установленные точки
    останова.

    Удаленная отладка

    Удаленная отладка означает с соответствии со своим названием
    следующее: вы запускаете отладчик на одном компьютере, а отлаживаемую программу - на другом. Две системы могут соединяться через
    последовательный порт или через локальную сеть LAN, совместимую с
    NETBIOS. Удаленную отладку полезно использовать в следующих ситуациях:
  • Вашей программе требуется много памяти, и вы не можете за пускать программу и отладчик на одном компьютере.

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

  • Нужно отладить специальные программы (резидентные программы или драйверы устройств).

  • Вы отлаживаете программу Windows.

  • В случае отладки прикладной программы Window у вас есть выбор: вы можете либо запустить на одной машине программу и отладчик для Windows (TDW), либо запустить Windows, утилиту WREMOTE и
    прикладную программу на одной машине, а отладчик - на другой.

    Управление выполнением программы

    В процессе отладки управление периодически передается между
    вашей программой и отладчиком. Когда управление передается Turbo
    Debugger, он может использовать свои средства для поиска по ис ходному коду и структурам данных программы и выявления причины
    неправильного выполнения программы. Для этого можно использовать
    меню и окна отладчика. Отладчик предоставляет вам много способов
    управления выполнением программы. Вы можете:
  • выполнять программу по шагам (по одной машинной инструкции
    или строке исходного кода);

  • выполнять как один шаг вызовы функций;

  • выполнять программу до заданного места;

  • выполнять программу до возврата из текущей функции;

  • трассировать программу;

  • выполнять программу в обратном направлении;

  • выполнять программу до точки останова;

  • выполнять программу до появления определенного сообщения
    Windows;

  • приостанавливать программу при возникновении исключитель ной ситуации С++ или Си.

  • Кроме точек останова, сообщений Windows и исключительных си туаций С++ все механизмы управления выполнением находятся в меню Run.

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

    Эти точки останова являются по существую точками останова
    двух описанных выше типов, но отслеживаются они непрерывно в течении всего периода выполнения программы. Так как 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 и задать используемые по умолчанию параметры у режимы вывода. Здесь рассказывается также о некоторых файлах, входящих в
    состав данного продукта.

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

    Когда вы впервые устанавливаете точку останова, 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.

    Турбо отладчик 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.

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

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

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

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

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

    Завершить сеанс отладки и вернуться в администратор программ
    Windows вы можете в любое время (за исключением передачи управления в программу или работы с диалоговым окном) с помощью клавиш
    Alt+X. Можно также выбрать команду File Quit.

    Выполнение 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.

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

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

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

    После спецификации окна и отслеживаемых сообщений нужно задать действие, выполняемое при поступлении сообщения. 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;

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


  • Задание пользовательских исключительных ситуаций

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

    Задание условий и действий

    Для задания активизации точки останова и того, что должно
    при этом происходить, используется окно 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 Не использовать файл состояния сеанса.

    Замечания по терминологии

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


    Запуск отладчика

    После компиляции и компоновки программ с включением отладочной информации вы можете начать процесс отладки, запустив 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.

    Завершение программы

    При завершении работы программы управление передается в Turbo Debugger, который выводит код выхода программы. После этого
    любая команда меню Run перезагружает программу. После завершения
    программы проверить или модифицировать ее переменные нельзя.
    При выполнении программы в отладчике легко случайно пропустить нужное место. В этом случае вы можете возобновить сеанс отладки с помощью команды Run Program Reset (Ctrl+F2), которая перезагружает программу с диска. Перезагрузка программы не влияет
    на точки останова и параметры просмотра.

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

    Функция 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[])

    R79_2.shtml


    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


    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);


    Соглашения принятые в справочнике по функциям 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


    Справочная библиотека по функциям для 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 С++


    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);


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

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

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

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

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

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

    С помощью такого блока пользователь может выбирать что-либо
    из списка. Класс 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.

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

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

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

    Эти общие диалоговые блоки используются в различных типах
    приложений для открытия файлов. 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.


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

    Сам 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 (описатель
    меню). Меню обычно задается в конструкторе отображаемого элемента.

    Документы

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

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

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

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

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

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

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

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

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

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

    Файлы-заголовки 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.


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

    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.

    Функции-элементы


    Constructor Строит и открывает объект сохранения диалога
    с указанным родительским окном, данными, идентификатором ресурса, заголовком и текущим объектом модуля.
    GetFileTitle Записывает имя сохраняемого или открываемого
    файла.
    CmLbSelChanged Указывает на изменение состояния выбора в диалоговом блоке GetOpenFileName или GetSaveFileName.
    CmOk Отвечает на щелчок "мышью" на кнопке OK диалогового окна. Вызывает CloseWindow.
    DialogFunction Возвращает True, если сообщение обработано.
    DoExecute Создает и выполняет режимное диалоговое окно.
    Init Инициализирует объект TOpenSaveDialog с текущим идентификатором ресурса.
    ShareViolation Вызывается для ответного действия при нарушении совместного использования при сохранении
    или открытии файла.


    Функции-элементы


    Constructor Строит структуру TOpenSaveDialog::TData.
    Destructor Уничтожает структуру TOpenSaveDialog::TData.
    SetFulter Создает копию фильтра, использованного для вывода имен файлов.


    Функции-элементы


    Constructor Строит объект TOutStream для указанного объекта документа.


    Функции-элементы


    Constructor Создает объект TPaintDC с заданным окном-владельцем.
    Destructor Уничтожает объект.


    Функции-элементы


    Constructor Создает объект TPalette и устанавливает описатель.
    AnimatePalette Заменяет записи в логической палитре записями
    из массива структур PALETTEENTRY (от заданной
    начальной до конечной записи).
    GetNearestPaletteIndex Возвращает индекс записи цвета, которая представляет наилучший цвет в данной палитре для данного цвета.
    GetObject Находит число записей в логической палитре и
    устанавливает в это значение аргумент.
    GetPaletteEntrites Получает диапазон записей в логической палитре и помещает их в массив. Первая запись и число
    записей задается аргументами.
    GetPaletteEntry Получает запись в данной логической палитре
    (позиция задается индексом) и помещает ее в массив.
    GetStock Обеспечивает доступ к стандартным объектам палитры Windows.
    operator<< Копирует в указанный аргумент заданную палитру. Возвращает ссылку на Clipbord.
    operator HPALETTE() Операция приведения типа, преобразующая описатель палитры в тип HPALETTE Windows.
    ResizePalette Изменяет размер данной логической палитры на
    заданный размер.
    SetPaletteEntries На основе массива записей устанавливает цвета
    RGB в данном палитре.
    SetPaletteEntry На основе заданного аргумента устанавливает
    значение цвета RGB в данной палитре (указанного индексом).
    ToClipboard Перемещает палитру в целевой аргумент.
    UnrealizeObject Указывает GDI, что логическую палитру нужно
    полностью и заново отобразить в системную палитру.
    Create На основе заданной структуры устанавливает
    значения в данной палитре.


    Функции-элементы


    Constructor Создает объект TPen и устанавливает описатель.
    GetObject Получает информацию о данном объекте пера и
    помещает ее в заданную структуру LOGPEN.
    GetStock Обеспечивает доступ к стандартным перьевым
    объектам Windows.
    operator HPEN() Операция приведения типа, преобразующая описатель пера в тип HPEN.


    Функции-элементы


    Constructor Используемый по умолчанию конструктор TPoint.
    Создает объект TPoint с заданными координатами.
    Offset Смещает данную точку в соответствии с заданными аргументами.
    OffsetBy Используя заданные аргументы, вычисляет смещение до заданной точки. Сама точка не изменяется.
    operator+ Используя заданный аргумент, вычисляет смещение точки.
    operator- Вычисляет отрицательное смещение точки.
    operator== Возвращает True, если данная точка эквивалентна другой точке.
    operator+= Смещает данную точку на основе аргумента и
    возвращает ссылку на точку.
    operator-= Отрицательное смещение точки на величину аргумента.
    operator!= Возвращает True, если данная точка равна другой точке.
    operator>> Выделяет из указанного объекта (входного потока) объект TPoint и копирует его в аргумент.
    operator<< Включает заданный объект TPoint в выходной поток.


    Функции-элементы


    Constructor Используемый по умолчанию или инициализированный конструктор, который инициализирует указатель нулем или заданным указателем.
    operator() Переопределенная операция преобразования типа,
    которая допускает передачу объекта TPointer
    как функции-аргумента или присваивает его аргументу, как если бы это был указатель.
    operator= Операция присваивания.
    operator! Операция проверки на 0.
    operator~ Переопределенная операция дополнения.
    operator delete Переопределенная операция удаления.
    T* operator Обеспечивает доступ указателю.


    Функции-элементы


    Constructor Строит пустое всплывающее меню.
    TrackPopupMenu Позволяет приложению создавать всплывающее меню в заданном месте окна.


    Функции-элементы


    Constructor Строит объект TPreviewPage с заданным родительским окном, ссылкой на соответствующий
    объект TPrintout и размером.
    Paint Выводит страницу в режиме предварительного
    просмотра. Для определения атрибутов страницы
    вызывает несколько функция TPrintout.
    SetPageNumber Устанавливает аргумент в номер страницы, выводимый в данный момент в окне предварительного просмотра.
    EvSize При изменении размера страницы, выводимой в
    окне предварительного просмотра делает недопустимым все окно.
    EvWindowPosChanging Задает позицию.


    Функции-элементы


    Constructor Создает объект TPrint для заданного DC.
    AbortDoc Прерывает текущее задание печати и стирает все
    нарисованное со времени последнего вызова
    StartDoc.
    BandInfo Получает информацию о возможности работы данного устройства с зонами и копирует ее в заданную структуру.
    DeviceCapabilities Получает информацию об указанной возможности
    драйвера принтера, устройства и порта и помещает результаты в выходной массив.
    EndDoc Завершает текущее задание печати. Вызывается
    после успешного завершения задания.
    EndPage Сообщает драйверу принтера, что приложение
    закончило запись страницы.
    Escape Позволяет приложению обращаться к средствам
    конкретного устройства, не доступных непосредственно через GDI данного DC.
    NextBand Сообщает драйверу принтера, что приложение
    закончило запись зоны.
    QueryAbort Пытается вызвать для данного принтера функцию
    обратного вызова AbortProc для определения необходимости прерывания задания печати.
    QueryEscSupport Возвращает True, если заданный управляющий код
    реализован в данном устройстве.
    SetAbortProc Устанавливает для данного принтера в качестве
    процедуры прерывания процедуру, заданную пользователем.
    SetCopyCount Устанавливает в параметре число копий каждой
    страницы, которые должны печататься на принтере.
    StartDoc Запускает задание печати для указанного документа в данном контексте принтера. Возвращает
    идентификатор задания.
    StartPage Подготавливает устройство к приему данных.


    Функции-элементы


    Constructor Строит диалоговое окно печати или установки
    принтера с заданными данными, родительским окном, заголовком и модулем.
    DoExecute В случае отсутствия ошибок копирует в data
    флаги и спецификации печати.
    GetDefaultPrinter Не выводя диалогового окна получает режим устройства и имя используемого по умолчанию
    принтера.
    CmSetup Отвечает на щелчок командной кнопки с сообщением EV_COMMAND.
    DialogFunction Возвращает True, если сообщение обработано.


    Функции-элементы


    ClearDevMode Очищает информацию о режиме устройства (необходимую для инициализации диалоговых управляющих элементов).
    ClearDevNames Очищает информацию об имени устройства (драйвер печати, имя принтера и имя порта вывода).
    GetDeviceName Получает имя устройства вывода.
    GetDevMode Получает указатель на структуру DEVMODE (с информацией для инициализации диалоговых окон).
    GetDevNames Получает указатель на структуру DEVNAMES (c
    именами принтера, драйвера и порта).
    GetOutputName Получает имя физического вывода.
    Lock Блокирует память, связанную со структурами
    DEVMODE и DEVNAMES.
    SetDevMode Устанавливает значения структуры DEVMODE.
    SetDevNames Устанавливает значения структуры DEVNAMES.
    TransferDC Создает и возвращает TPrintDC с текущими значениями.
    Unlock Разблокирует память, связанную со структурами
    DEVMODE и DEVNAMES.


    Функции-элементы


    Constructor Воспринимает DC экрана (передается в наследуемый конструктор), а также DC принтера (копируется в PrnDC).
    Destructor Уничтожает объект TPrintPreviewDC.
    GetDeviceCaps Возвращает информацию о возможностях устройства и контексте принтера.
    LPtoSDP Преобразует каждую из заданных точек из логических точек DC принтера в точки экрана.
    OffsetViewPort Модифицирует начала области просмотра в данном
    DC в текущие значения. Предыдущая начальная
    точка сохраняется.
    ReOrg Получает размеры области просмотра, приравнивая логические и экранные точки, и переустанавливает их.
    ReScale Отображает точки DC принтера и DC экрана. Устанавливает протяженность окна экрана равной
    максимальному логическому указателю на DC
    принтера.
    RestoreFont Восстанавливает для данного DC исходный объект
    шрифта DGI.
    ScaleViewportExt Модифицирует протяженность окна данного DC относительно текущих значений.
    SDPtoLP Преобразует каждую из заданных (в массиве) точек из точек экрана в логические точки DC
    принтера.
    SelectObject Выбирает в данном DC указанный объект шрифта.
    SelectStockObject Получает описатель предопределенного стандартного шрифта.
    SetBkColor Устанавливает текущий фоновый цвет для данного
    DC в соответствии с указанным значением или
    ближайшим доступным.
    SetMapMode Устанавливает текущий режим отображения окна
    для данного DC. Возвращает значение предыдущего режима.
    SetTextColor Устанавливает текущий цвет текста для данного
    DC.
    SetViewportExt Устанавливает размеры области просмотра экрана
    в заданные значения.
    SetViewportOrg Устанавливает начало области просмотра DC
    принтера в заданное значение.
    SetWindowExt Устанавливает заданные размеры окна.
    SyncFont Задает шрифт экрана, соответствующий текущему
    шрифту принтера.
    GetAttributeDC Возвращает атрибуты DC принтера.


    Функции-элементы


    Constructor Строит экземпляр TPrinter, связанный с заданным по умолчанию принтером.
    Destructor Освобождает связанные с TPrinter ресурсы.
    ClearDevice Вызывается SetPrinter и деструктором и отменяет связь устройства с текущим принтером.
    Print Связывает с устройством печати объект распечатки и выводит диалоговое окно Abort. Выводит обнаруженные при печати ошибки.
    ReportError Вызывается функцией Print в случае ошибки. По
    умолчанию выводит системное окно сообщения со
    строкой ошибки.
    Setup Вызывается, когда пользователь должен выбрать
    или настроить конфигурацию текущего принтера.
    CreateAbortWindow Создает диалоговое окно прерывания печати.
    ExecPrintDialog Выполняет TPrintDialog.
    GetDefaultPrinter Обновляет структуру принтера информацией об
    используемом по умолчанию принтере, заданном
    пользователем.


    Функции-элементы


    Constructor Строит диалоговое окно Abort с командной
    кнопкой Cancel и заданным заголовком, устройством и портом.
    EvCommand Обрабатывает кнопку Cnacel окна Abort.
    SetupWindow Связывает объекты с шаблоном диалогового ресурса, благодаря чему можно определить заголовок, порт и устройство печати.


    Функции-элементы


    Constructor Строит экземпляр TPrintout с заданным заголовком.
    Destructor Уничтожает связанные с конструктором ресурсы.
    BeginDocument Вызывается функцией Print объекта принтера
    перед печатью каждой копией документа.
    BeginPrinting Вызывается функцией Print объекта принтера
    в начале задания печати независимо от числа
    копий.
    EndDocument Вызывается функцией Print объекта принтера
    после завершения печати каждой копии документа.
    GetDialogInfo Получает информацию, необходимую для печати
    выбранных страниц документа.
    HasPage Вызывается после печати каждой страницы.
    PrintPage Вызывается для каждой страницы или зоны и должна переопределяться для печати содержимого
    данной страницы.
    SetPrintParams Устанавливает заданный контекст устройства и
    размер страницы.


    Функции-элементы


    Constctuctor Создает TProcInstance, передавая адрес процедуры. Вызывает ::MakeProcInstance для создания
    описателя экземпляра.
    Destructor Освобождает описатель экземпляра.
    operator FARPROC Возвращает описатель экземпляра.


    Функции-элементы


    Constructor Строит объект проверки допустимости по шаблону, вызывая сначала конструктор, наследуемый
    из Tvalidator, и устанавливая указатель на него.
    Error Переопределяет виртуальную функцию TValidator
    и выводит окно с сообщение об ошибке формата с
    соответствующей строкой.
    IsValid Переопределяет виртуальную функцию TValidator
    и сравнивает передаваемую строку с заданным
    шаблоном формата.
    IsValidInput Переопределяет виртуальную функцию TValidator
    и проверяет переданную строку на соответствие
    заданному формату.
    Picture Форматирует переданную строку согласно заданному формату.
    CalcTerm Вычисляет конец группы ввода без ее модификации.
    CheckComplete Проверяет аргумент и возвращает ptAmbiguous в
    случает неоднозначности результата.
    Group Обрабатывает шаблон группы.
    Iteration Заданная строка ввода повторяется указанное
    число раз.
    Process Вызывает Scan для поиска в строке ввода указанного символа.
    Scan Ищет в строке ввода заданные символы.
    SkipToComma Находит в редактируемом управляющем элементе
    следующий разделитель-запятую.
    SyntaxCheck Проверяет строку шаблона на заданный символ.
    ToGroupEnd Пропускает заданный символ или шаблон группы.

    | |

    Функции-элементы


    Constructor Строит объект кнопки с зависимой фиксацией с
    указанным родительским окном, текстом, позицией в клиентной области родительского окна,
    размерами и соответствующей группой.
    BNClicked Отвечает на поступающее сообщение BN_CLICKED.


    Функции-элементы


    Constructor Строит объект проверки допустимости диапазона,
    вызывая сначала конструктор, наследуемый из
    TFilterValidator.
    Error Переопределяет виртуальную функцию TValidator
    и выводит окно с сообщением о том, что введенное значение не лежит в заданном диапазоне.
    IsValid Преобразует заданную строку в целое число и
    возвращает True, если результат является допустимым целым числом и лежит в пределах диапазона.
    Transfer Возвращает размер переданных данных и объединяет три типа (tdSizeData. tdGetData и tdSetData), которые средство проверки допустимости
    по диапазону может обрабатывать для данного
    редактируемого управляющего элемента.


    Функции-элементы


    Constructor Строит прямоугольник с заданными координатами.
    Area Возвращает область данного прямоугольника.
    BottomLeft Возвращает объект TPoint, представляющий верхний левый угол прямоугольника.
    BottomRight Возвращает объект TPoint, представляющий нижний левый угол прямоугольника.
    Contain Возвращает True, если заданная точка или другой прямоугольник лежит в данном прямоугольнике.
    Height Возвращает высоту прямоугольника.
    InflatedBy Возвращает прямоугольник, смещенный на заданную величину.
    IsEmpty Возвращает True, если верхняя координата больше или равна нижней, а левая - больше или равна правой.
    IsNull Возвращает True, если все координаты нулевые.
    Normalize Нормализует прямоугольник переключая элементы
    данных left и right (если left>right) и top и
    bottom (если top>bottom). Возвращает нормализованный прямоугольник.
    Normalized Возвращает нормализованный прямоугольник с
    верхним левым углом в (Min(left,right), (Min(top,bottom)) и нижним правым в
    (Max(left,right), Max(top,bottom)).
    Offset Изменяет данный прямоугольник, смещая его углы
    на заданную величину.
    OffsetBy Возвращает прямоугольник с углами, смещенными
    на заданную величину.
    operator+ Возвращает смещение прямоугольника относительно указанного размера. Исходный объект прямоугольника не изменяется.
    operator- Возвращает отрицательное смещение прямоугольника относительно указанного размера. Исходный объект прямоугольника не изменяется.
    operator& Возвращает пересечение данного прямоугольника
    с другим заданным прямоугольником.
    operator| Возвращает объединение данного прямоугольника
    с другим заданным прямоугольником.
    operator== Возвращает True, если данный прямоугольник
    идентичен (по координатам) другому заданному
    прямоугольнику.
    operator!= Возвращает False, если данный прямоугольник
    имеет координаты углов, идентичные другому
    прямоугольнику.
    operator+= Изменяет данный прямоугольник так, что его углы смещаются на заданные значения.
    operator-= Изменяет данный прямоугольник так, что его углы смещаются (отрицательное смещение) на заданные значения.
    operator&= Изменяет данный прямоугольник на его пересечение с другим прямоугольником.
    operator|= Изменяет данный прямоугольник на его объединение с другим прямоугольником.
    operator TPoint*() Операция преобразования типа, приводящая указатель данного прямоугольника к типу TPoint.
    Set Изменяет позицию и размеры прямоугольника на
    указанные значения.
    SetEmpty Делает данный прямоугольник "пустым", приравнивая его координаты к нулю.
    Size Возвращает объект TSize, представляющий ширину и высоту данного прямоугольника.
    TopLeft Возвращает объект TPoint, представляющий верхний левый угол данного прямоугольника.
    TopRigft Возвращает объект TPoint, представляющий верхний правый угол данного прямоугольника.
    Touches Возвращает значение True, если другие заданные
    прямоугольные формы лежат внутри данного прямоугольника.
    Width Возвращает ширину данного прямоугольника.
    operator>> Извлекает объект TRect из данного потока ввода и копирует его в аргумент. Возвращает ссылку
    на результирующий поток.
    operator<< Форматирует и включает объект TRect в заданный поток. Возвращает ссылку на результирующий поток.


    Функции-элементы


    Constructor Создает объект TRegion и устанавливает описатель.
    Contain Возвращает True, если данная область содержит
    указанную точку.
    GetRgnBox Находит обрамляющий прямоугольник (минимальный прямоугольник, окружающий область).
    operator== Возвращает True, если данная область равна
    другой области.
    operator!= Возвращает True, если данная область не равна
    другой области.
    operator= Присваивает данной области другую область,
    возвращая ссылку на результат.
    operator+= Добавляет к каждой точке данной области указанное смещение, что приводит с смещению всей
    области.
    operator-= Вычитает из каждой точки данной области указанное смещение или находит разность областей
    (все части одной области, не входящие в другую).
    operator&= Создает пересечение данной области с указанной
    областью.
    operator|= Создает объединение данной области с указанной
    областью.
    operator^= Создает объединение данной области с заданной
    исходной областью или прямоугольником. Возвращает ссылку на полученный в результате объект.
    operator HRGN() Операция приведения типа. HRGN - это используемый в Windows тип данных, представляющий физическую область.
    SetRectRgn Использует SetRectRgn для создания прямоугольника заданного размера.
    Touches Возвращает True, если область касается заданного прямоугольника.


    Функции-элементы


    Constructor Строит объект TReplaceDialog с заданным родительским окном, идентификатором ресурса и
    заголовком.
    DoCreate Создает безрежимное диалоговое окно.


    Функции-элементы


    Constructor Создает объект TResId с заданным идентификатором ресурса. Для установки идентификатора,
    совместимого с управляющими функциями Windows,
    использует макрокоманду Windows.
    IsString Возвращает True, если данный идентификатор
    ресурса был создан из строки.
    operator LPSTR() Операция приведения типа, преобразующий идентификатор к типу LPSTR.
    operator>> Выделяет из заданного входного потока объект TResId и копирует его в параметр. Возвращает
    ссылку на результирующий поток.
    operator<< Включает заданный объект TResId в указанный
    поток (с возможным его форматированием). Возвращает ссылку на результирующий поток.


    Функции-элементы


    Constructor Создает объект TRgbQuad с заданными значениями
    rgbBlue, rgbGreen и egbRead. rgbReserved устанавливается в 0.


    Функции-элементы


    Constructor Создает объект TRgbTriple с заданными значениями rgbBlue, rgbGreen и egbRead. rgbReserved
    устанавливается в 0.


    Функции-элементы


    Constrructor Строит объект TScrollBar с заданным родительским окном, идентификатором управляющего элемента, позицией и размером.
    DeltaPos Вызывает SetPosition для перемещения скользящего маркера на указанное значение. Положительное смещение перемещает маркер вправо или
    вниз.
    GetPosition Возвращает текущую позицию скользящего маркера
    полосы прокрутки.
    GetRange Возвращает конечные значения, представляющие
    диапазон перемещения скользящего маркера полосы прокрутки.
    SBBottom Вызывает SetPosition для перемещения скользящего маркера полосы прокрутки вправо или вниз.
    Вызывается в ответ на буксировку маркера
    "мышью".
    SBLineDown Вызывает SetPosition для перемещения скользящего маркера полосы прокрутки вправо или вниз
    (на величину LineMagnitude). Вызывается в ответ на щелчок "мышью" на нижней или правой
    стрелке полосы прокрутки.
    SBLineUp Вызывает SetPosition для перемещения скользящего маркера полосы прокрутки вправо или вниз
    (на величину LineMagnitude). Вызывается в ответ на щелчок "мышью" на верхней или левой
    стрелке полосы прокрутки.
    SBPageDown Вызывает SetPosition для перемещения скользящего маркера полосы прокрутки вправо или вниз
    (на величину LineMagnitude). Вызывается в ответ на щелчок "мышью" в верхней или правой области полосы прокрутки.
    SBPageUp Вызывает SetPosition для перемещения скользящего маркера полосы прокрутки влево или вверх
    (на величину LineMagnitude). Вызывается в ответ на щелчок "мышью" в нижней или левой области полосы прокрутки.
    SBThumbPosition Вызывает SetPosition для перемещения маркера в
    ответ на установку новой позиции маркера.
    SBThumbTrack Вызывает SetPosition для перемещения маркера
    при буксировке его на новую позицию.
    SBTop Вызывает SetPosition для перемещения маркера
    в правый или нижний конец полосы прокрутки.
    Вызывается в ответ на буксировку маркера в
    крайнюю позицию.
    SetPosition Перемещает скользящий маркер в заданную позицию.
    SetRange Задает диапазон полосы прокрутки.
    Transfer Передает данные полосы прокрутки из указанного
    буфера передачи (TScrollBarData) или в него.
    GetClassName Возвращает имя класса регистрации Windows.
    SetupWindow Устанавливает диапазон полосы прокрутки в 0,100.


    Функции-элементы


    Constructor Строит объект TScroller c указанным окном-владельцем и значениями xUnit, yUnit, xRange,
    yRange. Инициализирует элементы данных.
    Destructor Уничтожает объект TScroller.
    AutoScroll Прокручивает окно-владельца в ответ на буксировку "мыши" внутрь или вне окна.
    BeginView При операции отображения автоматически смещает
    начало логических координат клиентной области
    на заданную величину.
    EndView Обновляет позицию полос прокрутки окна-владельца в соответствии с позицией TScroller.
    HScroll Отвечает на заданное событие scrollEvent вызовом ScrollBy или ScrollTo. Тип события идентифицируется константами Windows.
    IsAutoMode Имеет значение True, если активизирована автоматическая прокрутка.
    IsVisibleRect Имеет значение True, если прямоугольник (x, y,
    xExt, yExt) видимый.
    SetPageSize Устанавливает элементы данных XPage и YPage
    равными ширине и высоте клиентной области окна-владельца.
    SetRange Устанавливает xRange и xRange объекта TScroller в заданные параметры. Затем вызывает SetSBarRange для синхронизации диапазона полос
    прокрутки окна-владельца.
    SetSBarRange Устанавливает диапазон полос прокрутки окнавладельца равным диапазону TScroller.
    SetUnits Устанавливает элементы данных XUnit и YUnit в
    соответствии с заданными параметрами. Обновляет XPage и YPage, вызывая SetPageSize.
    ScrollBy Прокручивает до позиции, вычисленной на основе переданных значений. Положительные значения
    смещают скользящий маркер вниз и вправо.
    ScrollTo Прокручивает прямоугольник до позиции, заданной в x и y.
    SetWindow Устанавливает заданного владельца окна.
    VScroll Отвечает на заданное событие scrollEvent вызовом ScrollBy или ScrollTo. Тип события идентифицируется константами Windows.
    XScrollValue Преобразует значение горизонтального диапазона
    из полосы прокрутки в значение горизонтальной
    прокрутки.
    XRangeValue Преобразует значение горизонтального диапазона
    из полосы прокрутки в значение горизонтального
    диапазона.
    YRangeValue Преобразует значение вертикального диапазона
    из полосы прокрутки в значение вертикального
    диапазона.
    YRangeValue Преобразует значение вертикального диапазона
    из полосы прокрутки в значение вертикального
    диапазона.


    Функции-элементы


    TSeparatorGadget Используется для задания высоты и ширины разделителя.


    Функции-элементы


    Constructor Создает объект TSize с заданными cx и cy.
    Magnitude Возвращает длину диагонали прямоугольника,
    представленного данным объектом.
    operator+ Вычисляет смещение данного объекта TSize, используя заданный аргумент размера. Сам объект
    TSize не изменяется.
    operator- Вычисляет отрицательное смещение данного объекта TSize, используя заданный аргумент размера. Сам объект TSize не изменяется.
    operator== Возвращает True, если размер данного объекта
    равен размеру другого заданного объекта TSize.
    operator!= Возвращает False, если размер данного объекта
    равен размеру другого заданного объекта TSize.
    operator+= Смещает данный объект TSize на заданное смещение. Возвращает ссылку на объект.
    operator-= Смещает данный объект TSize на заданное смещение (отрицательное). Возвращает ссылку на
    объект.
    operator>> Выделяет из заданного входного потока объект
    TSize и копирует его в аргумент. Возвращает
    ссылку на результирующий поток.
    operator<< Включает объект (объекты) TSize в заданный поток (с возможным форматированием). Возвращает
    ссылку на результирующий поток.


    Функции-элементы


    Constructor Строит объект маркера полосы прокрутки, устанавливая его параметры.
    Destructor Уничтожает объект TSlider.
    GetPosition Возвращает позицию маркера полосы прокрутки.
    Переопределяет виртуальную функцию TScrollBar.
    GetRange Возвращает конечные значения текущего диапазона позиций маркера. Переопределяет виртуальную функцию TScrollBar.
    SetPosition Перемещает маркер в заданную позицию.
    SerRange Устанавливает диапазон скользящего маркера.
    SetRuler Устанавливает линейку скользящего маркера.
    EvEraseBkgnd Отвечает на сообщение WM_EWRASEBKGND и стирает фон скользящего маркера при его изменении.
    Для отображения компонентов маркера вызывает
    виртуальные функции.
    EvGetDlgCode Отвечает на сообщение WM_GETDGLCODE и управляет реакцией на каждую клавишу направления и
    клавишу Tab. Перехватывает клавиши перемещения
    курсора.
    EvKeyDown Транслирует виртуальный код клавиши в перемещение и затем перемещает скользящий маркер.
    EvKillFocus Выполняет действия, связанные с перемещением
    активности на другое окно.
    EvLButtonDblClk Отвечает на двойной щелчок левой кнопкой "мыши", затем отбрасывает сообщения, так что базовый класс их не получает.
    EvLButtonDown Отвечает на нажатие кнопки "мыши", позиционируя скользящий маркер к началу буксировки.
    EvLButtonUp Завершает перемещение маркера, страничное листание или переход на новую позицию, если кнопка "мыши" освобождается.
    EvMouseMove Перемещает "мышь" в указанную позицию. В случае буксировки позиционирует скользящий маркер.
    EvPaint Отображает весь скользящий маркер с линейкой.
    Для отображения его компонентов вызывает виртуальные функции.
    EvSetFocus Показывает, что активным стало текущее окно.
    EvSize Заново вычисляет размер скользящего маркера
    при изменении размера окна.
    GetBkColor Посылает родительскому окну сообщение WM_CTLCOLOR и вызывает dc::GetBkColor для выделения
    фонового цвета скользящего маркера.
    HitTest Получает информацию о том, попадает ли маркер
    на данные координаты X,Y.
    NotifyParent Посылает родительскому окну сообщение
    WS_HSCROLL или WS_VSCROLL.
    PaintRuler Отображает линейку. Предполагается, что область перемещения скользящего маркера не перекрывает линейки.
    PaintSlot Отображает область перемещения скользящего
    маркера.
    PaintThumb Отображает сам скользящий маркер, используя
    ресурс DIB, транслированный в текущие цвета
    системных кнопок.
    PointToPos Транслирует точку X,Y в единицы позиции скользящего маркера.
    PosToPoints Транслирует позицию скользящего маркера в точку X,Y.
    SetupThumbRgn Создает область и определяет форму скользящего маркера.
    SetupWindow Для установки окна вызывает TScrollBar::SetupWindow и SetupThumbRgn.
    SlideThumb Перемещает маркер на заданную позицию и выполняет нужное отображение.
    SnapPos Ограничивает позицию заданным диапазоном, округляя ее до ближайшей позиции.


    Функции-элементы


    Constructor Строит объект статического управляющего элемента с заданным родительским окном, идентификатором, текстом, позицией относительно начала
    родительского окна, шириной, высотой и длиной
    текста.
    Clear Очищает текст статического управляющего элемента.
    GetText Получает текста статического управляющего элемента, сохраняет его в аргументе и возвращает
    число скопированных символов.
    GetTextLen Возвращает длину текста статического управляющего элемента.
    SetText Задает текст статического управляющего элемента.
    Transfer Передает заданное число символов в заданный
    буфер или из него.
    GetClassName Возвращает имя класса регистрации Windows.


    Функции-элементы


    Constructor Строит объект TStatus и инициализирует код
    состояния нулевым значением.


    Функции-элементы


    Constructor Строит объект TStatusBar в заданном родительском окне и создает новые реквизиты.
    Insert Включает реквизит в строку состояния. По умолчанию он подключается сразу после существующих.
    operator Возвращает реквизит по заданному индексу (но
    реквизиты индикатора режима недоступны).
    SetModeIndicator Устанавливает TModeIndicator в заданный текстовый реквизит индикатора режима. Чтобы индикатор режима выводился в строке состояния,
    нужно задать режим при построении окна.
    SetSpacing Использует значения TSpacing для установки интервалов между реквизитами индикатора режима.
    PositionGadget Определяет позицию нового реквизита относительно существующих.


    Функции-элементы


    Constructor Строит объект TStream, используя заданный объект документа, определяемое пользователем имя
    потока и режима открытия потока.
    Destructor Закрывает поток. Производные классы обычно закрывают документ.
    GetDocument Возвращает текущий открытый для потока документ.


    Функции-элементы


    Constructor Строит объект проверки допустимости строки,
    вызывая сначала конструктор, наследуемый из
    TLookupValidator, а затем устанавливая String
    в строковый аргумент.
    Destructor Отменяет список допустимых строк путем вызова
    NewStringList и уничтожая объект проверки допустимости путем вызова наследуемого конструктора.
    Error Переопределяет виртуальную функцию TValidator
    Возвращает True, если переданная строка совпадает с одной из допустимых строк.
    NewStringList Задает для объекта проверки допустимости список допустимых строк, отменяя существующий
    список.


    Функции-элементы


    Constructor Строит объект системного меню. Может создавать
    заданное по умолчанию системное меню. В противном случае это будет меню текущего окна.


    Функции-элементы


    Constructor Строит объект TGadget с заданным идентификатором, стилем обрамления и выравниванием.
    GetText Возвращает текст для реквизита.
    SetText Если заданный текст не совпадает с текстом в
    Text, то удаляет текст в Text и устанавливает
    TextLen в длину новой строки.
    GetDesiredSize Если требуется настройка размера, возвращает
    размер, необходимый для размещения в нужных
    границах.
    Invalidate Вызывает TGadget::GetInnerRect для вычисления
    области текста реквизита, затем TGadget::InvalidateRect для запрещения прямоугольника в родительском окне.
    Paint Вызывает TGadget::PaintBorder для отображения
    обрамления и другие наследуемые функции.


    Функции-элементы


    Constructor Строит объект TTinyCaption, связанный с заданным дочерним окном. Инициализирует шрифт заголовка (0) и запрещает автоматический вывод.
    Destructor Уничтожает объект TTinuCaption и удаляет шрифт
    заголовка.
    DoCommand С помощью ::TrackPopup выводит системное меню.
    DoLButtonUp Если разрешена строка заголовка и нажата кнопка "мыши", отменяет перехват "мыши".
    DoMouseMove Возвращает TEventStatus.
    DoNCActivate Если тонкий заголовок не разрешен или сведен
    в пиктограмму, возвращает esPartial.
    DoNCCalcSize Если строка заголовка не разрешена или сведена
    в пиктограмму, возвращает esPartial. Иначе вычисляет размеры заголовка и возвращает esComplete.
    DoNCHitTest Если не разрешена строка заголовка, возвращает
    esPartial. В противном случае посылает строке
    заголовка сообщение о перемещении "мыши" или
    курсора и возвращает esComplete.
    DoNCLButtonDown Если строка заголовка не разрешена, возвращает esPartial. В противном случае определяет, что
    пользователь нажал/освободил кнопку "мыши"
    внутри или вне меню и возвращает esComplete.
    DoNCPaint Если строка заголовка не разрешена, возвращает
    esPartial. В противном случае она становится
    активной и указывает, что нужно отобразить обрамление.
    DoSysCommand Если строка заголовка не разрешена, возвращает
    esPartial. Если строка сведена в пиктограмму,
    и пользователь щелкает "мышью" на пиктограмме,
    вызывает DoSysMenu для вывода меню в нормальном режиме и возвращает esComplete.
    DoSysMenu Возвращает описатель системного меню и создает
    копию системного меню.
    EnableTinyCaption Активизирует тонкую строку заголовка, по умолчанию заменяя системное окно окном с тонким
    заголовком, которое не закрывается при щелчке
    "мышью" в системном окне.
    EvCommand Обеспечивает дополнительную обработку команд,
    но позволяет сначала обрабатывать команду активному окну и его дочерним окнам.
    EvLButtonUp Отвечает на сообщение об освобождении кнопки
    "мыши" вызовом DoLButtonUp.
    EvMouseMove Отвечает на сообщение о перемещении "мыши" вызовом DoMouseMove.
    EvNCActivate Отвечает на запрос изменения строки заголовка
    или пиктограммы вызовом DoNCActivate.
    EvNCCalcSize Отвечает на запрос об изменении строки заголовка или пиктограммы вызовом DoNCActivate.
    EvNCHitTest Отвечает на перемещение курсора или нажатие
    кнопки "мыши" вызовом DoNCHitText.
    EvNCLLButtonDown Отвечает на нажатие левой кнопки "мыши", в то время как курсор находится в неклиентной области строки заголовка, вызовом DoNCLButtonDown.
    EvNCPaint Отвечает на запрос об изменении строки заголовка или пиктограммы вызовом DoNCActivate.
    EvSysComand Отвечает на сообщение WM_SYSCOMMAND вызовом DoSysCommand.
    GetCaptionRect Получает область заголовка, требующую изменения или повторного отображения.
    GetMaxBoxRect Возвращает размер прямоугольного блока максимизации.
    GetMinBoxRect Возвращает размер прямоугольного блока минимизации.
    GetSysBoxRect Возвращает размер прямоугольника системного
    блока.
    PaintButton Отображает пустую командную кнопку.
    PaintCaption Вызывает dc.SelectObject для выбора данного
    прямоугольника и dc.PatBlt для отображения
    тонкой строки заголовка для данного контекста
    устройства с помощью текущей кисти.
    PaintCloseBox Отображает в тонкой строке заголовка блок закрытия.
    PaintMaxBox Отображает в тонкой строке заголовка блок максимизации.
    PaintMinBox Отображает в тонкой строке заголовка блок минимизации.
    PaintSysBox Отображает в тонкой строке заголовка системный
    блок.

    | |

    Функции-элементы


    Constructor Строит объект TToolBox с заданным числом строк
    и столбцов и направлением вывода.
    GetDesiredSize Переопределяет функцию GetDesiredSize TGadget
    и вычисляет размер ячейки вызовом GetMargins.
    Insert Переопределяет функцию Insert TGadget.
    SetDirection Задает направление вывода (горизонтальное/вертикальное).
    TheGadgets Располагает реквизиты в указанном направлении
    и вызывает PositionGadget для получения возможности настройки интервалов между ними.


    Функции-элементы


    Constructor Строит абстрактный объект проверки допустимости и устанавливает в 0 поле Options.
    Destructor Уничтожает абстрактный объект проверки допустимости.
    Error Абстрактная функция, вызываемая Valid, когда
    пользователь вводит недопустимую информацию.
    Переопределяется в производных классов для получения обратной связи с пользователем.
    HasOption Получает биты Options и возвращает True, если
    заданный бит установлен.
    IsValid По умолчанию возвращает True. Переопределяется
    в производных классах для проверки допустимости данных редактируемого управляющего элемента.
    IsValidInput Если редактируемый управляющий элемент имеет
    соответствующий объект проверки допустимости,
    то IsValidInput вызывается после обработки
    каждого клавиатурного события. По умолчанию
    возвращает True. В производных классах переопределяется.
    SetOption Устанавливает биты Options.
    Transfer Позволяет объекту проверки допустимости устанавливать и получать значения соответствующего
    редактируемого управляющего элемента. Особенно
    полезна для проверки нестроковых данных.
    UnsetOption Отменяет установку битовых значений Options.
    Valid Возвращает True, если IsValid возвращает True.
    В противном случае вызывает Error и возвращает
    False.


    Функции-элементы


    Constructor Строит объект TXValidator, устанавливая идентификатор ресурса в IDS_VALIDATORSYNTAX.


    Функции-элементы


    Constructor Строит управляющий элемент VBX c указанным родительским окном, идентификатором, именем файла VBX, именем класса VBX, заголовком и координатами родительского окна.
    AddItem Добавляет элемент c заданным индексом к списку управляющих элементов VBX.
    Drag В соответствие с аргументом управляет состоянием буксировки VBX.
    GetEventIndex Возвращает индекс события, связанного с заданным именем.
    GetEventName Возвращает строку, содержащую имя события,
    связанного с целочисленным индексом.
    GetHCTL Возвращает общее число событий, связанных с
    управляющим объектом TVbxControl.
    GetNumProps Возвращает общее число характеристик, связанный с управляющим элементом VBX.
    GetProp Получает значения характеристик различных типов.
    GetPropIndex Получает для характеристики с заданным именем
    целочисленное значение индекса.
    GetPropName Получает по заданному индексу характеристики.
    GetPropType Получает тип характеристики по заданному имени.
    IsArrayProp Возвращает True, если заданная индексом характеристика представляет собой характеристику
    массива.
    Method Используется для вызова собственных методов и
    возвращает True, если управляющий элемент VBX
    может использовать заданный метод.
    Move Перемещает управляющий элемент VBX в заданные
    координаты.
    Refresh Заново отображает область управляющего элемента.
    RemoveItem Удаляет элемент, заданный индексом (из блока
    списка, базы данных или комбинированного блока).
    SetProp Устанавливает характеристику в заданное значение.
    GetClassName Получает имя класса окна VBX.
    GetVBXProperty Возвращает ненулевое значение, если заданная
    характеристика существует.
    PerformCreate Создает новое окно управляющего элемента и соответствующий управляющий элемент VBX.
    SetVBXProperty Возвращает ненулевое значение, если заданная
    характеристика установлена.


    Функции-элементы


    EvVbxDispatch Вызывается после получения сообщения EM_VBXFIREEVENT от родительского окна и посылает сообщение корректной функции обработки события, а
    также передает указатель структуре VBXEVENT.


    Функции-элементы


    Constructor Строит объект TView документа, связанного с
    отображаемым элементом. Для подключения отображаемого элемента к документу вызывает TDocument::AttachView.
    Destructor Освобождает объект TView и вызывает DetachView для отсоединения отображаемого элемента
    от соответствующего документа.
    FindProperty Получает индекс характеристики по заданному
    имени.
    GetDocument Возвращает ссылку на документ отображаемого
    элемента.
    GetNextViewId Возвращает следующий присваиваемый идентификатор отображаемого элемента.
    GetProperty Возвращает общее число характеристик по заданному индексу, и размеру массива характеристик.
    GetViewId Возвращает для данного отображаемого элемента
    уникальный идентификатор.
    GetViewMenu Возвращает для данного отображаемого элемента
    дескриптор меню (любой существующий объект
    TMenuDesc).
    GetWindow Возвращает экземпляр TWindow, связанный с отображаемым элементом, или 0.
    IsOK Возвращает ненулевое значение, если отображаемый элемент успешно построен.
    PropertyCount Получает для объекта TDocument общее число характеристик.
    PropertyFlags Возвращает атрибуты заданной индексом характеристики.
    PropertyName Возвращает текстовое имя характеристики, заданной значением индекса.
    SetDocTitle Сохраняет заголовок документа.
    SetProperty Устанавливает значение характеристики по заданному индексу и типу данных.
    SetViewMenu Устанавливает для данного отображаемого элемента дескриптор меню.


    Функции-элементы


    Constructor Строит объект скользящего маркера вертикальной
    полосы прокрутки.
    HitTest Переопределяет виртуальную функцию TSlider и
    получает информацию о координатах X,Y маркера.
    NotifyParent Переопределяет виртуальную функцию TSlider и
    посылает сообщение родительскому окну.
    PaintRuler Переопределяет виртуальную функцию TSlider и
    изображает горизонтальную линейку.
    PaintSlot Переопределяет виртуальную функцию TSlider и
    отображает поле, в котором скользит маркер.
    PointToPos Переопределяет виртуальную функцию TSlider и
    транслирует точку X,Y в позицию в единицах
    скользящего маркера.
    PosToPoint Переопределяет виртуальную функцию TSlider и
    транслирует позицию в единицах скользящего
    маркера в точку X,Y.


    Функции-элементы


    Constructor TWindow имеет два конструктора. Первый из них
    строит объект TWindow, используемый в качестве
    псевдонима окна не ObjectWindows. Второй добавляет this к списку дочерних окон данного
    родительского окна и вызывает EnableAutoCreate, после чего this будет создаваться и выводиться вместе с родительском окном.
    Destructor Уничтожает соответствующий интерфейсный элемент вызовом Destroy. Удаляет оконные объекты
    в списке дочерних объектов, затем удаляет
    this.
    AdjustWindowRect Вызывает функцию API Windows ::AdjustWindowRect, которая вычисляет размер прямоугольника
    окна в соответствии с указанным размером прямоугольника клиента.
    AdjustWindowRectEx Вызывает функцию API Windows ::AdjustWindowRectEx, которая вычисляет размер прямоугольника окна с расширенным стилем.
    BringWindowToTop Вызывает функцию API Windows ::BringWindowToTop, которая выводит всплывающее или дочернее окно поверх других окон и активизирует
    его.
    CanClose Возвращает True, если соответствующий интерфейсный элемент (включая все дочерние окна)
    можно закрыть.
    CheckDlgButton Вызывает функцию API Windows ::CheckDlgButton, которая помещает отметку на заданную
    кнопку или отменяет ее.
    CheckRadioButton Вызывает функцию API Windows ::CheckRadioButton, которая отмечает выбранную кнопку с зависимой фиксацией или отменяет ее выбор.
    ChildBroadcastMessage Используя SendMessage, посылает сообщения непосредственным дочерним объектам.
    ChildWindowFromPoint Вызывает функцию API ::ChildWindowFromPoint,
    которая определяет, какое из дочерних окон содержит заданную в TPoint точку.
    ChildWithid Возвращает указатель на список дочерних окон
    с заданным идентификатором.
    CleanUpWindow Позволяет производным классам очистить связанные с окном ресурсами. Производные классы
    должны вызывать версию этой функции базового
    класса непосредственно перед возвратом в родительский класс.
    ClearFlag Очищает константы флагов TWindow.
    ClientToScreen Преобразует заданные в TPoint клиентные координаты в экранные координаты нового окна.
    CloseWindow После определения возможности закрытия окна
    вызывает Destroy для уничтожения hwnd.
    CmExit Вызывается в ответ на выбор элемента меню с
    идентификатором CM_EXIT.
    Create Создает оконный интерфейсный элемент, который
    должен связываться с данным интерфейсным элементом ObjectWindows.
    CreateCaret Вызывает функцию API Windows ::CreateCaret.
    CreateChildren Создает дочерние окна с установленными флагами
    автоматического создания в списке дочерних
    окон.
    DefaultProcessing Используется как общецелевая функция заданной
    по умолчанию обработки, воспринимающая различные сообщения.
    DefWindowProc Вызывает DefaultProc для заданной по умолчанию
    обработки Windows и передает поступающее сообщение Windows. Непосредственно обычно не вызывается.
    Destroy Вызывает EnableAutoCreate для каждого окна в
    списке дочерних окон, обеспечивая воссоздание
    дочерних окон при воссоздании this. Затем
    уничтожает соответствующий интерфейсный элемент.
    DestroyCaret Вызывает функцию API Windows DestroyCaret,
    проверяющую сначала владельца, а затем уничтожая соответствующее окно.
    DisableAutoCreate Запрещает средство автоматического создания и вывода интерфейсного элемента дочернего окна
    вместе с родительским окном.
    DisableTransfer Запрещает для интерфейсного объекта механизм
    передачи, передающий данные состояния в буфер
    и из него.
    DragAcceptFiles Вызывает функцию API Windows DrahAcceptFiles.
    DrawMenuBar Вызывает функцию API Windows DrawMenuBar для
    отображения заново строки меню.
    EnableAutoCreate Обеспечивает создание и вывод соответствующего вместе с родительским окном.
    EnableTransfer Разрешает механизме передачи, выполняющий обданными о состоянии между окном и буфером передачи.
    EnumProps Вызывает функцию API Windows ::EnumProps для
    перечисления элементов в списке характеристик
    заданного окна.
    EvChildInvalid Отвечает на сообщение WM_CHILDINVALID дочернего редактируемого управляющего элемента.
    EvCommand WindowProc вызывает эту функцию для обработки
    сообщений WM_COMMAND.
    EvCommandEnable Вызывается WindowProc для обработки сообщений
    WM_CONNAND_ENABLE.
    EvSysCommand Отвечает на выбор пользователем команды системного меню или блока максимизации/минимизации.
    FirstThat Передает указатель на функцию-итератор.
    FlashWindow Вызывает функцию API Windows FlashWindow для
    изменения окна с активного на неактивное и наоборот.
    ForEach Выполняет итерацию по списку дочерних окон и
    вызывая заданную функцию действия и передавая
    ей поочередно эти окна.
    ForwardMessage Передает текущее сообщение окна. Вызывает функцию API Windows ::SendMessage.
    GetActiveWindow Вызывает функцию API Windows GetActiveWindows
    для получения описателя активного окна. При
    отсутствии окна, связанного с текущей нитью,
    возвращает 0.
    GetApplication Получает указатель на объект TAplication, связанный с this.
    GetCaretBlinkTime Вызывает функцию API Windows GetCaretBlinkTime
    для получения частоты мерцания каре.
    GetCarePos Вызывает функцию API Windows GetCaretPos.
    GetChildren Считывает дочернее окно из указанного потока в
    список дочерних окон.
    GetClassLong Вызывает функцию API Windows GetClassLong для
    получения значения типа long из структуры Windows WNDCLASS.
    GetClassWord Вызывает функцию API Windows GetClassWord для
    получения значения типа word из структуры Windows WNDCLASS.
    GetClientRect Вызывает функцию API Windows GetClientRect для
    получения координат клиентной области окна и
    копирования их в указанный объект.
    GetCursorPos Вызывает функцию API Windows GetCursorPos для
    получения текущей позиции курсора (в координатах клиентного окна) и копирования их в структуру, на которую указывает TPoint.
    GetDesktopWindows Вызывает функцию API Windows GetDesktopWindows
    и возвращает описатель окна оперативной области.
    GetDlgItem Вызывает функцию API Windows GetDlgItem для
    считывания описателя заданного управляющего
    элементе.
    GetDlgItemInt Вызывает функцию API Windows GetDlgItemInt для
    получения текста заданного управляющего элементе.
    GetDlgItemText Вызывает функцию API Windows GetDlgItemText
    для получения текста заданного управляющего
    элемента.
    GetFirstChild Возвращает указатель на первое дочернее окно
    в списке дочерних окон интерфейсного объекта.
    GetId Возвращает идентификатор, используемый для поиска окна в списке дочерних окон заданного родительского окна.
    GetModule Возвращает указатель на объект модуля.
    GetLastActivePopup Возвращает последнее активное всплывающее окно
    в списке.
    GetLastChild Возвращает указатель на последнее дочернее окно в списке дочерних объектов интерфейсного
    объекта.
    GetMenu Вызывает функцию API Windows GetMenu для получения описания меню указанного окна.
    GetNextDlgGroupItem Вызывает функцию API Windows GetNextGroupItem
    для получения следующего или предыдущего управляющего элемента в диалоговом окне.
    GetNextDlgItem Вызывает функцию API Windows GetNextGroupItem
    для возврата описателя первого управляющего
    элемента в диалоговом окне, который позволяет
    пользователю с помощью Tab перейти к следующему управляющему элементу.
    GetNextWindow Вызывает функцию API Windows GetNextWindow для
    получения описателя, связанного со следующим
    или предыдущим окном в списке администратора
    окон.
    GetWindowPtr По заданному описателю окна возвращает связанный с окном указатель TWindow.
    GetParent Вызывает функцию API Windows GetParent для получения описателя родительского окна.
    GetProp Вызывает функцию API Windows GetProp для возврата описателя списка характеристик.
    GetScrollPos Вызывает функцию API Windows GetScrollPos для
    получения позиции скользящего маркера в полосе
    прокрутки.
    GetScrollRange Вызывает функцию API Windows GetScrollRange
    для возврата позиции маркера полосы прокрутки.
    GetSysModalWindow Получает описатель системного режимного окна.
    GetSystemMenu Вызывает функцию API Windows GetSystemMenu и
    возвращает описатель системного меню, так что
    приложение может получить доступ к системному
    меню.
    GetTopWindow Вызывает функцию API Windows GetTopWindow для
    возврата указателя верхнего окна, владельцем
    которого является данное родительское окно.
    GetUpdateRect Вызывает функцию API Windows GetUpdateRect для
    получения экранных координат прямоугольника,
    включающего обновленную область заданного окна.
    GetUpdateRgn Вызывает функцию API Windows GetUpdateRgn для
    копирования области обновления окна в заданную
    область.
    GetWindowLog Возвращает из структуру WINDCLASS информацию
    об указанном окне (такую как атрибуты стиля).
    GetWindowPlacement Вызывает функцию API Windows GetWindowPlacement для получения информации о выводе и расположении окна на экрана (нормальное, минимизированное, максимизированное).
    GetWindowRect Получает экранные координаты прямоугольник окна и копирует их в указанную область.
    GetWindowTask Вызывает функцию API Windows GetWindowTask для
    возврата описателя задачи, создавшей текущее
    окно.
    GetWindowText Вызывает функцию API Windows GetWindowText,
    которая копирует в буфер указанный заголовок
    окна.
    GetWindowTextLength Вызывает функцию API Windows GetWindowTextLength, возвращающую длину заданного заголовка
    окна.
    GetWindowTextTitle Обновляет элемент данных TWindow Title заголовком текущего окна.
    GetWindowWord Вызывает функцию API Windows GetWindowWord,
    получающую информацию об окне в зависимости от
    значения индекса.
    HandleMessage Обрабатывает посылаемое в окно сообщение.
    HideCaret Вызывает функцию API Windows HideCaret.
    HiliteMenuItem Вызывает функцию API Windows HiliteMenuItem
    для подсветки или отмены подсветки элемента
    меню верхнего уровня.
    HoldFocusHwnd Отвечает на запрос дочернего окна о сохранении
    его HWND, когда оно становится неактивным.
    Invalidate Вызывает функцию API Windows Invalidate, чтобы
    пометить всю клиентную область, как требующую
    повторного отображения.
    InvalidateRect Вызывает функцию API Windows InvalidateRect
    для отметки заданной клиентной области как
    требующей повторного отображения.
    InvalidateRgn Вызывает функцию API Windows InvalidateRgn
    для отметки заданной клиентной области как
    требующей повторного отображения.
    IsChild Возвращает True, если окно является дочерним
    окном данного окна.
    IsDlgButtonChecked Возвращает True, если отмечена заданная командная кнопка.
    IsFlagSet Возвращает состояние битового флага
    Attr.Flags, для которого указывается маска.
    IsWindowVisible Возвращает True, если окно является видимым.
    IsZoomed Возвращает True, если окно распахнуто или максимизировано.
    KillTimer Вызывает функцию API Windows KillTimer, которая позволяет избавиться от таймера и удаляет из очереди сообщения WM_TIMER.
    LockWindowUpdate Вызывает функцию API Windows LockWindowPoints
    для предотвращения рисования в заданном окне.
    MapWindowPoints Вызывает функцию API Windows MapWindowPoints
    для отображения набора точек в одном окна относительно набора точке в другом.
    MessageBox Создает и выводит на экран окно сообщения с
    заданным текстом, заголовком и пиктограммой
    или кнопкой.
    MoveWindow Вызывает функцию API Windows MoveWindow для
    изменения позиции заданного окна.
    Next Возвращает указатель следующего окна в списке
    братских окон.
    NumChildren Возвращает число дочерних окон ObjectWindows.
    OpenClipboard Вызывает функцию TClipboard GetClopboard для
    получения глобального объекта Clipboard.
    Paint Вызывает базовый класс при ответе на сообщения
    WM_PAINT для вывода содержимого окна.
    Postmessage Оболочка для функции API Windows c тем же именем, передающая окну заданное сообщение.
    PerformCreate Создает интерфейсный элемент MS_Windows, связываемый с окном ObjectWindows.
    PreProcessMsg Позволяет выполнять предобработку оконных и
    клавиатурных сообщений.
    Previous Возвращает указатель на предыдущее окно в
    списке дочерних окон родительского окна.
    ReceiveMessage Вызывается из StdWndProc. Это первая функция,
    вызываемая при получении сообщения.
    RedrawWindow Вызывает функцию API Windows RedrawWindow для
    повторного отображения заданного прямоугольника.
    Register Класс регистрации в Windows для this. Вызывает
    GetClassName и GetWindowClass.
    RegisterHotKey Вызывает функцию API Windows RegisterHotKey
    для регистрации идентификатора оперативной
    клавиши текущего приложения.
    RemoveProp Вызывает функцию API Windows RemoveProp для
    удаления заданной характеристики из списка характеристик.
    ScreenToClient Вызывает функцию API Windows ScreenToClient
    для использования заданных координат экрана
    для вычисления координат окна.
    ScrollWindow Вызывает функцию API Windows ScrollWindow для
    прокрутки окна в вертикальном и горизонтальном
    направлениях.
    ScrollWindowEx Вызывает функцию API Windows ScrollWindowEx
    для прокрутки окна.
    SendDlgItemMessage Вызывает функцию API Windows SetDlgItemMessage
    для передачи сообщения заданному окну.
    SendMessage Оболочка для функции Windows с тем же именем,
    посылающая указанное сообщение заданному окну.
    SendNotification Переоформляет заданное командное сообщение,
    чтобы дочернее окно могло послать его родительскому окну независимо от характера приложения (WIN16 или WIN32).
    SetActiveWindow Вызывает функцию API Windows SetActiveWindow
    для активизации окна верхнего уровня.
    SetBkgndColor Задает фоновый цвет окна.
    SetCaption Копирует указанный заголовок в заданную строку. Устанавливает заголовок интерфейсного элемента.
    SetCaretBlinkTime Вызывает соответствующую функцию API Windows,
    для установки частоты мерцания каре.
    SetCaretPos Вызывает соответствующую функцию Windows для
    установки позиции каре в координатах клиентного окна.
    SetClassLong Вызывает соответствующую функцию Windows для
    установки по заданному смещению значения long.
    SetClassWord Вызывает соответствующую функцию Windows для
    установки по заданному смещению значения word.
    SetCursor Задает позицию курсора.
    SetDlgItem Вызывает функцию API Windows ::SetDglItem для
    установки дочернего окна с заданным идентификатором.
    SetDlgItemText Вызывает функцию API Windows SetDlgItemText
    для задания текста дочернего окна с заданным
    идентификатором.
    SetDocTitle Записывает заголовок документа.
    SetFlag Устанавливает или очищает заданные маской биты
    Attr.Flags.
    SetModule Устанавливает заданный по умолчанию идентификатор модуля для данного окна.
    SetMenu Устанавливает указанное меню окна.
    SetParent Задает объект родительского окна.
    SetProp Вызывает функцию API Windows SetProp для добавления характеристики к списку характеристик
    заданного окна.
    SetScrollPos Вызывает функцию API Windows SetScrollPos для
    установки позиции скользящего маркера полосы
    прокрутки.
    SetScrollRange Вызывает соответствующую функцию API Windows
    для установки позиции маркера в полосе прокрутки.
    SetSysModalWindow Делает заданное окно системным режимным окном.
    SetTimer Вызывает функцию API Windows SetTimer, которая помещает в очередь сообщения WM_TIMER.
    SetTransferBuffer Устанавливает буфер передачи.
    SetWindowLong Вызывает функцию API Windows для установки в структуре WindowsAttr значения Id.
    SetWindowPlacement Вызывает соответствующую функцию API Windows
    для установки окна в указанную позицию.
    SetWindowPos Вызывает функцию API Windows для изменения
    размера окна.
    SetWindowText Вызывает соответствующую функцию API Windows
    для установки заголовка окна.
    SetWindowWord Вызывает функцию API Windows SetWindowWord,
    которая изменяет информацию об окне.
    Show После обеспечения допустимости описатель интерфейсного элемента выводит на экране TWindow способом, заданным аргументом.
    ShowOwnedPopups В соответствии с заданным значением выводит
    всплывающее окно.
    ShowScrollBar Вызывает соответствующую функцию API Windows
    для вывода или отмены вывода полосы прокрутки.
    ShowWindow В соответствии с переданным значение выводит
    окно.
    SubclassWindowFunction Инсталлирует WindowProc и сохраняет старую
    функцию окна в DefaultProc.
    Transfer Передает данные в окно с дочерними окнами или
    из него и возвращает общий размер буфера.
    TransferData Обычно вызывается при установке и закрытии
    окон для установки TransferBuffer.
    UnregisterHotKey Вызывает соответствующую функцию API Windows
    для отмены регистрации оперативной клавиши
    приложения.
    UpdateWindow Вызывает функцию API Windows UpdateWindow
    для обновления клиентной области заданного окна.
    Validate Вызывает функцию API Windows ValidateRect для
    проверки допустимости всей клиентной области.
    ValidateRect Вызывает функцию API Windows ValidateRect для
    проверки допустимости части клиентной области.
    ValidateRgn Вызывает функцию API Windows ValidateRgn для
    проверки указанной области окна.
    WindowFromPoint Возвращает значение, указывающее окно, в котором находится заданная точка.
    WindowProc Обрабатывает поступающие сообщения путем вызова EvCommand и EvCommandEnable.
    WinHelp Вызывает функцию API Windows WinHelp для вызова заданной справочной системы.
    CleanupWindow Вызывает непосредственно перед тем как HWindow
    становится недопустимым и дает производным
    классам возможность очистить ресурсы, связанные с HWND.
    DispatchScroll Вызывается EvHScroll и EvVScroll для диспетчеризации сообщений полосы прокрутки.
    GetClassName Возвращает имя класса регистрации Windows.
    GetWindowClass Переопределяет производные классы для заполнения структуры классов регистрации Windows регистрационными атрибутами.
    LoadAcceleratorTable Загружает описатель таблицы акселераторов окна в структуре TWindowsAttr.
    RemoveChild Удаляет дочернее окно.
    SetupWindow Это первая виртуальная функция, которая вызывается, когда становится допустимым HWindow.
    Она выполняет установку окна и итерацию по
    списку дочерних окон.


    Функции-элементы


    Constructor Строит объект TXWindow с заданным по умолчанию
    идентификатором ресурса IDS_INVALIDWINDOW.
    Msg Преобразует идентификатор ресурса в строку и
    возвращает строковое сообщение.


    Функции-элементы


    Constructor Создает объект TWindow с заданным окном-владельцем.
    Destructor Уничтожает объект.


    Функции-элементы


    Constructor Строит интерфейсный объект TWindowView, связанный с данным отображаемым элементом.
    Destructor Уничтожает объект.


    Функции-элементы


    CanClose Переопределяет TView::CanClose и возвращает
    отличное от 0 значение, если окно можно закрыть.
    GetViewName Переопределяет TView::GetViewName и возвращает
    StaticName - имя отображаемого элемента.
    GetWindow Переопределяет TView::GetWindow и возвращает в
    качестве TWindow объект TWindow.
    SetDocTitle Переопределяет TView::SetDocTitle и записывает
    заголовок документа.
    StaticName Возвращает описательное имя отображаемого элемента.


    Функции-элементы


    Constructor Строит объект TXCompatibility.
    MapStatusCodeToString Получает код состояния Tmodule и преобразует
    его в строку.


    Функции-элементы


    Constructor Строит объект TXOwl с заданным строковым сообщением.
    Destructor Уничтожает объект TOwl.
    Clone Создает копию объекта обработки исключительной
    ситуации.
    ResourceToString Преобразует идентификатор ресурса в строку и
    возвращает строку, идентифицирующую исключительную ситуацию.
    Throw Объект исключительной ситуации. Должна создаваться в любом производном классе.
    Unhandled Вызывается при перехвате необработанной исключительной ситуации.

    |

    Функции-элементы


    Constructor Конструктор, создающий объект TApplication.
    Destructor Уничтожает объект TApplication.
    BeginModal Инициализирует цикл сообщений режимного окна.
    BCCWCEnabled Указывает на разрешение BWCC.
    canClose Определяет, можно ли закрыть приложение.
    Condemn Очищает окно.
    Ctl3dEnabled Возвращает True при трехмерной поддержке.
    EnableBWCC Загружает и регистрирует BWCC.DLL/BWCC32.DLL.
    EnableCtl3d Разрешает/запрещает использование CTL3D.DLL.
    EnableCtl3Autosubclass При разрешении CTL3D разрешает/запрещает использование автоматических подклассов.
    EndModal Завершает цикл сообщений модального окна.
    Find Для обработки событий вызывает TDocManager.
    GetDocManager Возвращает указатель на вызвавший приложение
    объект.
    GetMainWindow Возвращает указатель на основное окно приложения.
    GetWinMainParams Инициализирует статический экземпляр приложения.
    MessageLoop Выполняет цикл ожидания сообщений для приложения.
    PostDispatchесAction Вызывается после диспетчеризации сообщений, ли не используется цикл сообщений.
    PreProcessMenu Вызывается для обработки меню основного окна
    перед выводом.
    ProcessAppMsg Проверяет необходимость специальной обработки сообщений безрежимного диалогового окна, акселератора и акселератора MDI.
    PumpoWaitingMessages Обрабатывает и выводит все ожидающие в очереди сообщения.
    QueryThrow Проверяет наличие ожидающей исключительной ситуации.
    ResumeThrow Проверяет и инициирует подвешенные исключительные ситуации.
    Run Инициализирует экземпляр.
    SetDocManager Устанавливает указатель на вызванный перед
    приложением объект администратора документа.
    SetMainWindow Устанавливает новое основное окно и соответствующий флаг.
    SetMainWinParams Позволяет сохранить параметры для будущего использования.
    SuspendThrow Сохраняет информацию об исключительной ситуации.
    BreakMessageLoop Завершает цикл сообщения текущего модального окна.
    MessageLoopResult Содержит значение, возвращаемое MessageLoop и BeginModal.
    IdleAction Вызывается при отсутствии ожидающих сообщений.
    InitApplication Вызывается для инициализации первого экземпляра приложения.
    InitInstance Выполняет необходимую инициализацию каждого
    экземпляра.
    InitMainWindow По умолчанию строит общий объект TFrameWindow с именем приложения в качестве заголовка.
    TermInstance Обрабатывает завершение каждого экземпляра приложения ObjectWindows.


    Функции-элементы


    Constructor Строит объект TXInvalidMainWindow с заданным
    по умолчанию сообщением IDS_INVALIDMAINWINDOW.
    CloneСоздает копию объекта исключительной ситуации.
    ThrowИнициализирует объект исключительной ситуации.


    Функции-элементы


    Constructor Создает объект данного класса.
    BitPixel Возвращает для данного битового массива число
    бит на элемент изображения (пиксел).
    GetBitmapBits Копирует заданное число бит данного битового
    массива в буфер.
    GetBitMapDimension Получает размер битового массива (высоту и ширину в миллиметрах).
    GetObject Получает данные (ширину, высоту и цветовой
    формат).
    Height Возвращает высоту данного битового массива.
    operator<< Копирует заданный битовый массив в аргумент
    буфера Clipboard.
    operator HBITMAP() Операция приведения типа. Преобразует описатель битового массива к типу HBITMAP.
    Planes Возвращает число плоскостей в битовом массиве.
    SetBitmapBits Копирует в битовый массив из буфера заданное
    число бит.
    SetBitmapDimension На основе значения аргумента устанавливает
    размер битового массива (ширину и высоту).
    Clipboard Копирует битовый массив в заданный буфер
    Clipboard.
    WidthВозвращает длину битового массива.
    HandleCreate Создает описатель битового массива на основе
    объектов-аргументов.


    Функции-элементы


    Constructor Строит TBitMapGadget и устанавливает текущий
    образ на начало массивов изображений.
    Destructor Удаляет массив изображений.
    SelectImage Определяет текущее изображение и заново отображает клиентную область при его изменении.
    SysColorChange Если системные цвета изменились, вызывается
    окном реквизитов, чтобы можно было повторно
    построить и отобразить битовые массивы.
    GetDesiredSize Вызывает TGadget::GetDesiredSize для определения максимальной величины битового массива.
    PaintИзображает границу реквизита и содержимое битового массива.
    SetBounds Вызывает TGadget::SetBounds и передает размерность битового массива.


    Функции-элементы


    Construct Строит объект TBitSet.
    DisableItem Сбрасывает заданный единичный бит или битовый
    набор.
    EnableItem Устанавливает заданный единичный бит или битовый набор.
    Has Не равно нулю, если заданный битовый набор
    установлен.
    IsEmpty Не равно нулю, если заданный битовый набор
    пуст, иначе 0.
    operator+= Вызывает функцию EnableItem для установки
    или очистки битового набора.
    operator-= Вызывает функцию DisableItem для очистки
    битового набора.
    operator&= Выполняет со всеми битами копируемого набора
    операцию AND и возвращает ссылку на объект TBitSet.
    operator|= Выполняет со всеми битами копируемого набора
    операцию OR и возвращает ссылку на объект TBitSet.
    operator~ Возвращает инверсию битового набора и возвращает ссылку на объект TBitSet.


    Функции-элементы


    Constructor Создает объект TBrush и устанавливает описатель.
    GetObject Получает информацию о данной кисти и помещает
    ее в заданную структуру LOGBRUSH.
    operator HBRUSH() Операция приведения типа. Преобразует данный
    описатель кисти к типу HBRUSH.
    UnrealizeObject Указывает GDI на необходимость сброса параметров кисти перед следующим ее использованием.


    Функции-элементы


    Constructor Строит объект командной кнопки с указанным порождающим окном, текстом и позицией относительно начала клиентной области родительского окна, или объект TButton, связываемый с управляющим элементом командной кнопки TDialog.
    CurrentDefPB Указывает, является ли текущая командная
    кнопка используемой по умолчанию.
    BMSetStyle Так как кнопка не может одновременно иметь
    стиль владельца и стиль командной пусковой кнопки, Windows пытается установить стиль в
    BS_DEFPUSHBUTTON. В этом случае BMSetStyle устанавливает IsCurrentDefPB в True.
    EvGetDlgCode Отвечает на сообщения WM_GETDLGCODE администратора диалогов и возвращает код, указывающий,
    является ли кнопка используемой по умолчанию.
    GetClassName Возвращает имя класса регистрации для TButton.
    SetupWindow Посылает родительскому окну сообщение DM_SETDEFID.


    Функции-элементы


    Constructor С помощью заданного идентификатора битового
    массива и типа строит объект TButtonGadget (кнопка будет разрешена и находится в отжатом
    состоянии).
    Destructor Отменяет объект TButtonGadget.
    CommandEnable Разрешает перехват сообщений командной кнопкой и посылает родительскому окну сообщение
    WM_COMMAND_ENABLE.
    GetButtonState Возвращает состояние командной кнопки (1 - нажата, 0 - отжата, 2 - в неопределенном состоянии).
    GetButtonType Возвращает состояние кнопки. Проверяет тип
    кнопки и выполняет соответствующие действия.
    GetNotchCorners Реализует для командной кнопки скошенные углы. Заново отображает рамку кнопки.
    SetShadowStyle Устанавливает тип кнопки в соответствии со
    стилем тени.
    SysColorChange Отвечает на сообщение EvSysColorChange, направляемое владельцем TGadgetWindow, установкой "дрожания" кисти в 0.
    Activate Изменяет состояние атрибутов кнопки и отображает ее в текущем состоянии.
    BeginPressed Устанавливает Pressed в True, отображает нажатую кнопку и посылает сообщение родительскому окну.
    CancelPressed Устанавливает Pressed в False, отображает
    кнопку и посылает сообщение меню родительскому окну.
    GetDesiredSize Сохраняет высоту и ширину кнопки (в элементах
    изображения. Для определения соотношений между прямоугольниками вызывает GetDesiredSize.
    Invalidate При нажатии кнопки или изменении ее состояния
    помечает кнопку, как требующую повторного отображения.
    LButtonDown Переопределяет функцию TGadget и отвечает вызовом BeginPressed на щелчок левой кнопкой "мыши".
    MouseMove Переопределяет функцию TGadget и отвечает вызовом TGadget::MouseMove на буксировку или смещение указателя "мыши" за пределы кнопки.
    PaintВызывает GetSystemMetrics для получения высоты
    и ширины окна (в элементах изображения), GetImageSize для получения размера битового массива и устанавливает размеры внутреннего прямоугольника. Затем настраивает позицию и рисует управляющий элемент.
    Bounds Получает размер битового массива, вызывает
    SetBounds для установки границ прямоугольника и центрирует битовый массив в прямоугольнике кнопки.


    Функции-элементы


    Constructor Строит TCellArray из битового массива заданного размера путем разбиения массива на горизонтальный массив ячеек заданного или равного
    размера.
    CelSize Возвращает размер каждой ячейки в элементах
    изображения.
    CelOffset Возвращает позицию верхнего левого угла данной
    ячейки относительно левого угла битового массива.
    CelRect Возвращает верхний левый и правый нижний угол
    заданной ячейки относительно верхнего левого
    угла битового массива.
    NumCels Возвращает число ячеек в массиве.
    Offset Возвращает смещение для всего CellArray.
    operator[] Возвращает CelRect.
    operator= Возвращает TCelArray.
    operator TBitmap& Возвращает ссылку на битовый массив.
    SetCelSize Устанавливает размер каждой ячейки в массиве.
    SetOffset Устанавливает смещения для ячеек в массиве.
    SetNumCels Задает число ячеек в массиве.


    Функции-элементы


    Constructor Строит или копирует объект TCharSet или строку
    символов.
    operator!= Выполняет операцию OR над всеми битами в копируемой строке и возвращает ссылку на объект TCharSet.


    Функции-элементы


    Constructor Строит объект кнопки с независимой фиксацией
    в заданном родительском окне, настраивая его
    позицию и размеры.
    CheckВызывает SetCheck и делает кнопку выбранной,
    уведомляя соответствующую группу.
    GetCheck Возвращает состояние кнопки (отмечена, не отмечена или серая).
    GetState Возвращает состояние кнопки (подсвечена, активна и отмечена).
    SetCheck Переводит кнопку в состояние, заданное Check.
    SetState Устанавливает состояние кнопки.
    SetStyle Изменяет стиль кнопки.
    Toggle Переключает кнопку между отмеченным и не отмеченным состоянием и серым.
    Transfer Переопределяет Window::Transfer. Передает состояние кнопки в буфер или из него.
    Uncheck Делает кнопку не отмеченной, вызывая SetCheck.
    BNClincked Реагирует на щелчок "мышью" на кнопке. Уведомляет групповой блок об изменении состояния.
    EvGetDlgCode Переопределяет реакцию TButton на сообщение
    WM_GETDLGCODE.
    GetClassName При разрешении BWCC TCheckBox возвращает
    CHECK_CLASS, иначе возвращает BUTTON.


    Функции-элементы


    Constructor Строит диалоговое окно с заданным родительским
    окном, идентификатором ресурса, заголовком,
    данными и идентификатором библиотеки.
    SetRGBColor Устанавливает текущий цвет RGB для открытого
    диалогового окна.


    Функции-элементы


    Constructor Строит диалоговое окно с заданными данными,
    родительским окном, идентификатором ресурса,
    заголовком окна и идентификатором библиотеки.
    CmFontApply Заданный по умолчанию обработчик третьей кнопки "мыши" в диалоговом окне.
    DialogFunction Возвращает True, если сообщение обработано.
    DoExecute Копирует в Ddata информацию о шрифте и значения флагов.


    Функции-элементы


    Constructor Создает объект TClientDC с заданным окном-владельцем.


    Функции-элементы


    CloseClipboard Закрывает Clipboard и возвращает в случае успешного закрытия True.
    CountClipboardFormats Возвращает число типов форматов данных, используемых Clipboard.
    EmptyClipboard Очищает буфер Clipboard и освобождает описатели его данных.
    GetClipboardData Получает данные из буфера Clipboard в формате, заданном спецификатором формата.
    GetClipboardFormatName Получает имя заданного зарегистрированного формата и копирует формат в буфер.
    GetClipboardOwner Получает описатель окна, являющегося владельцем Clipboard.
    GetClipboardViewer Получает описатель первого окна в цепочке
    просмотра Clipboard.
    GetOpenClipboardWindow Получает описатель окна, у которого открыт буфер Clipboard.
    GetPriorutyClipboardFormat Возвращает первый формат Clipboard в списке.
    ClipboardFormatAvailable Указывает, допустим ли заданный формат для использования в Clipboard.
    OpenClipboard Открывает Clipboard и связывает его с заданным
    окном.
    operator BOOL Проверяет описатель.
    QueryCreate Определяет, может ли объект в буфере Clipboard
    поддерживать заданный протокол и возможности.
    О форматах Clipboard рассказывается в оперативном справочнике Windows.
    QueryLink Определяет, может ли клиентное приложение использовать данные Clipboard для получения связанного объекта, использующего заданный протокол и параметры.
    RegisterClipboardFormat Регистрирует новый формат Clipboard.
    SetClipboardData Устанавливает описатель на блок данных по адресу, заданному описателем.
    SetClipboardViewer Добавляет заданное окно к цепочке окон, получающих уведомление при изменении буфера Clipboard.
    Constructor Строит объект TClipboard.
    Destructor Уничтожает объект TClipboard.


    Функции-элементы


    Constructor Строит объект TClipboardViewer с заданным родительским окном, заголовком и идентификатором
    библиотеки.
    EvChangeCBChain Отвечает на сообщение Windows WM_CHANGECBCHAIN.
    EvDestroy Отвечает на сообщение API Windows WM_DESTROY при удалении окна из цепочки просмотра Clipboard.
    EvDrawClipboard Отвечает на сообщение API Windows, посылаемое окну в цепочке просмотра Clipboard при изменении содержимого буфера.
    SetupWindow Добавляет окно в цепочку просмотра буфера
    Clipboard.


    Функции-элементы


    Constructor Создает объект TColor, устанавливая значение
    Value.
    Blue Возвращает голубой компонент для данного значения цветов Value.
    FlagsВозвращает значение peFlags из значения Value
    объекта.
    GreenВозвращает зеленый компонент для данного значения цветов Value.
    operator= Возвращает True, если значение Value цвета
    равно clrValue, иначе False.
    operator COLORRREF() Оператор преобразования типа, возвращающий Value.
    IndexВозвращает значение индекса, соответствующее
    значению Value данного цвета, маскируя два старших байта.
    PalIndex Возвращает индекс палитры, соответствующий
    значению Value данного цвета. В возвращаемом
    цвете старший байт устанавливается в 1.
    PalRelative Возвращает связанное с палитрой RGB значение,
    соответствующее значению Value данного цвета.
    В возвращаемом цвете старший байт устанавливается в 2.
    Red Возвращает красный компонент значения Value
    данного цвета.
    Rgb Возвращает явный цвет RGB, соответствующий
    значению Value данного цвета, маскируя старший байт.


    Функции-элементы


    Constructor Строит объект комбинированного блока с заданным родительским окном, позицией относительно
    начала клиентной области, стилем и длиной
    текста.
    AddString Добавляет строку в соответствующую часть списка комбинированного блока. Возвращает индекс строки в списке.
    ClearОчищает текст соответствующего редактируемого
    управляющего элемента.
    DeleteString Удаляет заданную индексом строку в соответствующей части списка комбинированного блока.
    DirectoryList Заполняет комбинированный блок именами файлов
    из заданного каталога.
    FindString Выполняет поиск строки, начиная с заданного
    индекса, продолжая затем поиск от начала списка.
    GetCount Возвращает число записей в соответствующей
    части списка комбинированного блока.
    GetDroppedControlRect Для комбинированного блока получает координаты раскрывающегося блока списка.
    GetDroppedState Для раскрывающихся комбинированных блоков определяет видимость блока списка.
    GetExtendedUI Определяет, будет ли комбинированный блок
    иметь расширенный пользовательский интерфейс.
    GetItemData Возвращает 32- битовое значение, связанное с
    элементом комбинированного блока.
    GetItemHeight Возвращает высоту блока списка комбинированного блока или ошибку.
    GetSellIndex Возвращает индекс строки в заданной позиции и
    возвращает строку.
    GetStringLen Возвращает длину строки (без конечного нуля)
    по заданному индексу строки.
    GetText Считывает число символов в редактируемой или
    статической части комбинированного блока.
    GetTextLen Возвращает длину текста (без конечного нуля) в
    редактируемой или статической части комбинированного блока.
    HideList Скрывает раскрывающийся список комбинированного блока или комбинированного блока с раскрывающимся списком.
    InsertString Включает строку в соответствующую часть списка комбинированного блока (в позицию с указанным индексом).
    SetEditSel Выделяет индексы между двумя указанными позициями в редактируемом управляющем элементе
    комбинированного блока.
    SetExtendedUI Если комбинированный блок имеет расширенный
    интерфейс с пользователем, устанавливает его.
    SetItemData Устанавливает 32-битовое значение, связанное с
    элементом TComboBox.
    SetItemHeight Устанавливает высоту элементов списка или редактируемого управляющего элемента комбинированного блока.
    SetSelIndex Устанавливает индекс для выбора в списке.
    SetSelString Выделяет строку символов в соответствующем
    блоке списка и устанавливает контекст управляющего элемента для данной строки.
    SelText Выделяет первую строку в соответствующем блоке
    списка, которая начинается с заданной строки.
    ShowList Показывает список в блоке раскрывающегося
    списка или комбинированном блоке с раскрывающимся списком.
    Transfer Передает элемент и выбор в комбинированном
    блоке в буфер передачи или из него. Возвращает
    размер указателя на TComboBoxData.
    GetClassName Возвращает имя класса регистрации для TComboBox.
    SetupWindow Устанавливает окно и ограничивает объем текста, который пользователь может вводить в редактируемом управляющем элементе.


    Функции-элементы


    Constructor Строит объект TComboBox и инициализирует элементы данных.
    Destructor Удаляет объект TComboBoxData.
    AddItemData Добавляет к массиву ItemData определенный
    пользователем элемент данных.
    AddString Добавляет к массиву строк заданную строку.
    AddStringItem Вызывает AddItemData для добавления элемента
    данных к массиву ItemData и вызывает AddString для добавления строки к массиву строк.


    Функции-элементы


    Constructor Вызывает конструктор TWindow и строит общее
    диалоговое окно.
    DoCreate Вызывается Create и создает безрежимное диалоговое окно.
    DoExecute Вызывается из Execute и создает режимное диалоговое окно.
    CmHelp Используемый по умолчанию обработчик кнопки
    pshHelp (справочная кнопка окна).
    CmOkCancel Отвечает на щелчок "мышью" в окне на кнопке
    OK или Cancel, вызывая функции DLL для обработки команды.
    EvClose Отвечает на сообщение WM_CLOSE, вызывая функцию DefaultProcessing.
    SetupWindow Присваивает заголовок диалогового окна CDTitle.


    Функции-элементы


    Constrictor Вызывает конструктор TWindow, передавая родительское окно, заголовок и модуль. Устанавливает атрибут.
    CompareItem Используется в изображаемых пользователем комбинированных блоках и сравнивает два элемента. Логику сравнения обеспечивает производный класс.
    DeleteItem Используется в изображаемых пользователем комбинированных блоках. Логику удаления обеспечивает производный класс.
    MeasureItem Используется в изображаемых пользователем комбинированных блоках и информирует Windows о размерах элемента.
    EvPaint Если управляющий элемент имеет предопределенный класс Windows, вызывает для предусмотренного в Windows изображения DefaultProcessing.
    ODADrawEntire Отвечает на уведомляющее сообщение, посылаемое отображаемому управляющему элементу, когда его требуется вывести на экран. Может переопределяться.
    ODAFocus Отвечает на уведомление, посылаемое отображаемому управляющему элементу, когда он становится активным.
    ODASelect Отвечает на уведомление, посылаемое отображаемому управляющему элементу при изменении выделения или изменении элемента.


    Функции-элементы


    Constructor Строит объект интерфейсный TControlBar с заданной ориентацией и шрифтом.
    PreProcessMsg Выполняет предварительную обработку сообщений Windows.
    PositionGadget Получает стиль рамки, определяет направление и позицию реквизита кнопки и позиционирует его.


    Функции-элементы


    Constructor Создает объект TControlGadget, связанный с заданным окном TControl.
    Destructor Уничтожает объект TControlGadget и удаляет его
    из соответствующего окна.
    GetDesiredSize Вызывает TGadget::GetDesiredSize и передает
    размер реквизита управляющего элемента.
    GetInnerRect Вычисляет прямоугольную область реквизита управляющего элемента, исключая границы и поля.
    Inserted Вызывается при включении реквизита управляющего элемента в родительское окно. Для вывода элемента с текущим размером в текущей позиции
    вызывает ShowWindow.
    InvalidateRect Отмечает прямоугольник управляющего элемента
    для повторного отображения.
    Removed Вызывается при удалении реквизита управляющего элемента из диалогового окна.
    SetBounds Вызывает SetBound и передает размеры управляющего элемента.
    Update Вызывает функцию API Windows для обновления
    клиентной области заданного окна.


    Функции-элементы


    Constructor Создает объект DC для устройства, заданного
    драйвером и выводом (файлом DOS или устройством).
    Destructor Вызывает RestoreObjects и очищает все ненулевые элементы данных OrgXXX.
    TCreatedDC Создает контекст для заданного устройства.
    Объекты DC можно создать путем заимствования
    существующего описателя HDC или заданием информации об устройстве и драйвере.


    Функции-элементы


    Constructor Создает объект TCursor и устанавливает элемент
    данных Handle, либо копирует объект курсора.
    Destructor Уничтожает объект TCursor.
    operator HCUURSOR() Встроенная операция приведения типа. Преобразует описатель курсора Handle к типу HCURSOR.
    GetIconInfo Получает информацию о данной пиктограмме и копирует ее в заданную структуру ICONINFO.


    Функции-элементы


    Constructor Создает объект DC для заданного устройства.
    Destructor Вызывает RestoreObjects и очищает все ненулевые элементы данных OrgXXX.
    AngleArc Рисует в данном DC линейный сегмент и дугу,
    используя для этого текущий выбранный объект
    пера. Линия рисуется из текущей позиции до начала дуги.
    Arc Рисует в данном DC эллиптическую дугу, используя для этого текущий выбранный объект пера.
    BeginPath Открывает для данного DC новый маршрут и отбрасывает предыдущий маршрут. После открытия
    маршрута приложение может вызывать функции рисования в данном контексте.
    BitBlt Выполняет побитовую передачу блока из источника в прямоугольник-приемник, копируя биты цвета.
    ChordРисует заполненную хорду (область, ограниченную пересечением эллипса с линейным сегментом).
    ClosedFigure Закрывает открытую фигуру в данном DC, рисуя
    линию от текущей позиции до первой точки фигуры.
    DPlotP Преобразует каждую из заданных точек в массиве
    точек в логические точки. Преобразование зависит от текущего режима отображения DC.
    DrawFocusRect Рисует в данном DC указанный прямоугольник,
    обозначая стилем его активность.
    DrawIcon Рисует в данном DC указанную пиктограмму с заданными координатами.
    DrawText Форматирует и рисует в заданном прямоугольнике
    указанное число символов.
    Ellipse Рисует и заполняет в текущем DC эллипс, используя выбранное перо и кисть.
    EndPath Замыкает маршрут и выбирает маршрут в данном
    DC.
    EnumFontFamilies Перечисляет шрифты, доступные для данного DC,
    в заданном семействе шрифтов.
    EnumFonts Перечисляет доступные в данном DC шрифты.
    EnumMetaFile Перечисляет вызовы GDI в заданном метафайле.
    Пока не будут обработаны все вызовы, каждый
    такой вызов передается функции обратного вызова с клиентными данными.
    EnumObject Перечисляет доступные для данного контекста
    объекты перьев и кистей.
    EnumClipRect Создает для данного DC новую вырезанную область.
    ExcludeUpdateRgn Предотвращает рисование в недопустимых областях окна, исключая обновленную область окна данного DC из вырезанной области.
    ExtFloodFill Заполняет область в данном DC, начиная с заданной точки и используя выбранный объект кисти.
    ExtTextOut Рисует в заданном DC символы (до указанного
    числа) заданной строки с завершающим нулем.
    FillPath Замыкает открытые фигуры в текущем маршруте
    данного DC и заполняет внутреннюю область
    маршрута, используя текущую кисть и режим закраски многоугольника.
    FillRect Заполняет заданный прямоугольник в указанном
    DC, используя указанную кисть.
    FillRgn Заполняет заданную область данного DC, используя указанную кисть.
    FlattenPath Преобразует любые кривые в текущем выбранном
    маршруте данного DC. Все такие кривые изменяются на последовательности линейных сегментов.
    FloodFill Закрашивает область в данном DC, начиная с заданной точки и используя текущий выбранный
    объект кисти. Аргумент цвета задает цвет границы или области.
    FrameRect Рисует рамку в данном DC вокруг данного прямоугольника, используя заданную кисть.
    GetAspectRatioFilter Получает значения текущего фильтра коэффициента относительного удлинения для данного DC.
    GetBkColor Возвращает для данного DC текущий фоновый
    цвет.
    GetBkMode Возвращает для данного DC режим фона.
    GetBoundsRect В зависимости от аргумента сообщает об огранивающем прямоугольнике для данного DC или администратора Windows.
    GetBrushOrg Помещает в текущий контекст исходную точку
    кисти.
    GetCharABCWidths Получает для текущего шрифта TrueType данного DC ширину последовательных символов в заданном диапазоне.
    GetCharWidth Получает для данного DC ширину (в логических
    единицах) для заданной диапазоном последовательности символов в текущем шрифте.
    GetClipBox Помещает в заданный прямоугольник текущую
    рамку отсечения в данном DC.
    GetClipRgn Получает текущую рамку отсечения для данного
    DC и помещает его копию в заданный аргумент.
    GetCurrentObject Возвращает описатель на текущий выделенный объект, связанный с текущим DC.
    GetCurrentPosition Сообщает логические координаты текущей позиции данного DC.
    GetDCOrg Получает итоговую трансляцию начала данного
    контекста. Это значение задает смещение, используемое для трансляции координат устройства
    в клиентные координаты точки окна приложения.
    GetDeviceCaps Возвращает информацию о возможностях данного DC.
    GetDlBits Получает некоторые или все биты из заданного
    битового массива данного контекста устройства.
    GetFontData Получает для заданного масштабируемого шрифта TrueType информацию о шрифте.
    GetKerningPairs Получает для текущего шрифта данного DC пару
    кернинга и копирует ее в массив.
    GetMapMode Возвращает режим отображения данного окна текущего DC.
    GetNearestColor Возвращает для данного аргумента Color ближайший цвет в текущей палитре.
    GetOutlineTextMetrics Считывает метрическую информацию для шрифтов TrueType данного DC.
    GetPixel Возвращает цвет элемента изображения в данной точке.
    GetPolyFillMode Возвращает для данного DC текущий режим за краски многоугольника.
    GetStretchBltMode Возвращает для данного DC текущий режим растягивания.
    GetSystemPaletteEntries Считывает заданный диапазон записей палитры из системной палитры в массив структур.
    GetSystemPaletteUse Определяет, имеет ли данный DC доступ к полной системной палитре.
    GetTabbedTextExtent Вычисляет высоту и ширину (в логических единицах) текстовой строки заданной длины в строке с завершающим нулем.
    GetTextAlign Возвращает для данного DC текущие флаги выравнивания текста.
    GetTextColor Возвращает для данного DC текущий цвет.
    GetTextExtent Вычисляет высоту и ширину (в логических единицах) заданной текстовой строки в строке с завершающим нулем.
    GetTextFace Для данного DC считывает имя гарнитуры текущего шрифта.
    GetTextMtrics Для данного DC заполняет структуру метрическими данными для данного шрифта.
    GetViewPort Считывает размеры x и y текущей области просмотра для данного DC в единицах устройства или величину сжатия/растяжения, необходимую для размещения логической координатной системы в координатной системе устройства.
    GetViewportOrg Устанавливает величину размеров x и y (в единицах устройства) текущей области просмотра.
    GetWindowExt Считывает текущие размеры x и y (в единицах
    устройства) окна в текущем DC.
    GetWindowsOrg Возвращает координаты x и y начала текущего
    окна, связанного с данным DC.
    GrayString Рисует серым цветом в заданном прямоугольнике
    указанное число символов, используя заданную
    кисть и текущий шрифт данного DC.
    InsertClipRect Создает новую область отсечения окна данного
    DC, формируя пересечение текущей области с
    заданным прямоугольником.
    InvertRect Инвертирует заданный прямоугольник в данном
    DC.
    InvertRgn Инвертирует заданную область в данном DC.
    LineDDA Определяет, какие элементы изображения для заданной линии должны подсвечиваться.
    LineTo Рисует линию в данном DC, используя текущий
    перьевой объект.
    LPtoDP Конвертирует каждую из заданного числа точек в
    массиве из логических точек в точки устройства.
    Преобразование зависит от режима отображения
    текущего DC.
    MasBit Копирует битовый массив из исходного DC в данный DC.
    ModifyWorldTransform Используя заданные аргументы, изменяет текущее глобальное преобразование для данного DC.
    OffsetClipRgn Перемещает область отсечения в данном DC на
    заданное смещение.
    OffsetViewportOrg Модифицирует начало области просмотра в данном DC на заданные величины x и y.
    OffsetWindowOrg Изменяет начало окна данного DC на заданные
    величины.
    operator HDS() Операция приведения типа, преобразующая указатель в тип HDC.
    PaintRgn Закрашивает заданную область текущего DC, используя текущую кисть.
    PatBlt Закрашивает заданный прямоугольник, используя
    текущую кисть данного DC.
    PatchToRegion Возвращает область, созданную из замкнутого
    маршрута в текущем DC.
    Pie Используя выбранные объекты пера и кисти, рисует и закрашивает сектор.
    PlayMetaFile Выполняет в текущем DC содержимое заданного
    метафайла. Метафайл можно выполнить любое число раз.
    PlayMetaFileRecord Выполняет в данном DC запись метафайла.
    PlgBlt Выполняет побитовую передачу блока из указанного исходного DC в данный DC.
    PolyBesier Рисует один или более связанных кубических сплайнов Безье по точкам, заданным в массиве точке, используя текущий выбранный объект пера.
    PolyBezierTo Рисует один или более связанных кубических
    сплайнов Безье по точкам, заданным в массиве
    точек, используя текущий выбранный объект пера.
    PolyDraw Рисует в данном DC один или более наборов линейных сегментов (не обязательно смежных), используя текущий объект пера.
    Polygon Рисует и закрашивает заданный линейными сегментами многоугольник.
    PolyLine Рисует в данном DC последовательность линейных сегментов, используя текущий объект пера.
    PolyLineTo Рисует в данном DC один или более связанных
    линейных сегментов, используя текущий объект пера. Конечная точка становится новой текущей точкой.
    PolyPolygon В данном DC рисует и закрашивает последовательность многоугольников (возможно перекрывающихся), используя текущий объект пера и режим закраски.
    PolyPolyline Рисует в данном DC последовательность ломаных
    линий, используя текущее перо.
    PtVisible Возвращает True, если заданная точка находится
    в области отсечения данного DC.
    RealizePalette Восстанавливает в данном DC первоначальную палитру GDI объекта.
    RestorePen Восстанавливает в данном DC первоначальное перо GDI.
    RestoreTextBrush Восстанавливает в данном DC первоначальный объект текстовой кисти GDI.
    RoundRect Рисует и закрашивает в данном DC закругленный
    прямоугольник данного размера.
    SaveDC Сохраняет текущее состояние данного DC в стеке
    контекста.
    ScaleViewPortExt Модифицирует размеры области просмотра данного DC относительно текущих значений.
    ScaleWindowExt Модифицирует размеры окна данного DC относительно текущих размеров.
    ScrollDC Прокручивает битовый прямоугольник горизонтально и вертикально на заданную величину.
    SelectClipPath Выбирает текущий маршрут данного DC в качестве области отсечения, используя заданный режим.
    SelectClipRgn Выбирает в качестве текущей области отсечения
    данного DC заданную область, позволяя выбрать
    ту же область для других объектов DC.
    SelectObject Выбирает в данном DC заданный объект GDI.
    SelectStockObject Выбирает в DC предопределенные объекты пера, кисти, шрифта или палитры.
    SetBkColor Устанавливает для данного DC текущий фоновый цвет.
    SetBkMode Устанавливает фоновый режим.
    SetBoundsRect Управляет для данного DC накоплением информации ограничивающего прямоугольника.
    SetBrushOrg Устанавливает начало текущей выбранной кисти
    данного DC.
    SetDlBits Устанавливает элементы изображения в заданном
    битовом массиве на основе заданного аргумента.
    SetDlBitsToDevice Устанавливает элементы изображения в целевом прямоугольнике в данном DC на основе исходного битового массива.
    SetMapMode Устанавливает режим отображения текущего окна
    данного DC.
    SetMapperFlags Изменяет алгоритм, используемый средством
    отображения шрифта, отображающим в данном DC логические шрифты в физические.
    SetMiterLimit Устанавливает предел соединений в новые значения.
    SetPixel Устанавливает цвет элемента изображения с заданными координатами в указанный цвет.
    SetPolyFillMode Устанавливает для данного DC режим закраски
    многоугольника.
    SetROP2 Устанавливает для данного DC текущий режим
    смешивания фона.
    SetStretchBltMode Устанавливает режим растяжения для данного DC.
    SetSystemPaletteUse Изменяет использование системной палитры данного DC.
    SetTextAlign Устанавливает для данного DC флаги выравнивания текста.
    GetTextCharacterExtra Возвращает значение текущего интервала между символами в логических единицах (для данного DC).
    SetTextCharacterExtra Устанавливает значение текущего интервала между символами в логических единицах (для данного DC).
    SetTextColor Устанавливает для данного DC текущий цвет текста.
    SetTextJustification Задает размер общего дополнительного пространства, добавляемых при выводе текстовых
    строк за счет символов перевода строки (в логических единицах).
    SetViewportOrg Устанавливает область просмотра данного DC в
    указанное значение, сохраняя предыдущее значение.
    SetWindowExt Устанавливает размеры x и y окна данного DC.
    SetWindowOrg Устанавливает начало связанного с данным окном
    DC в заданное значение и сохраняет предыдущее.
    SetWorldTransform Задает двумерное линейное преобразование между глобальным пространством и пространством
    страницы данного DC.
    StretchBlt Копирует битовый массив из исходного DC в целевой прямоугольник в данном DC. Источник может сжиматься или растягиваться в соответствии
    в режимом растяжения.
    StretchDlBits Копирует данные цвета из исходного прямоугольника в данном DIB текущего DC в целевой прямоугольник.
    StrokeAndFillPath Замыкает все открытые фигуры текущего маршрута в данном DC, используя для этого текущее перо
    и закрашивая внутреннюю область с помощью текущей кисти, применяя режим закраски многоугольника.
    StrokePath Переводит текущий замкнутый маршрут в данном
    DC, используя текущее перо.
    TabbedTextOut Рисует заданное число символов данной строки с
    завершающим нулем, используя текущий шрифт данного DC. Табуляции расширяются согласно аргументам.
    TextOut Рисует заданное число символов указанной строки с завершающим нулем, используя текущий
    шрифт данного DC.
    TextRect Закрашивает указанный прямоугольник, вызывая ExtTextOut.
    UpdateColors Обновляет клиентную область данного DC, сопоставляя текущий цвет в клиентной области с системной палитрой (по элементам изображения).
    WidenPath Переопределяет текущий замкнутый маршрут данного DC как область, изображенную текущим пером данного DC.
    GetAttributeHDC Возвращает атрибуты объекта DC.
    GetHDC Возвращает описатель данного DC.
    Init Применяется для внутреннего использования в
    конструкторе.


    Функции-элементы


    Constructor Строит объект TDecoratedFrame с заданным родительским окном, заголовком и идентификатором модуля.
    Insert Добавляет дополнительные элементы слева, справа, сверху или снизу от клиентного окна.
    PreProcessMsg Переопределяет виртуальную функцию, определенную в TFrameWindow, обеспечивая для дополнительных элементов предобработку с мнемоническим доступом.
    EvCommand Автоматизирует сокрытие и вывод дополнительных
    элементов.
    CommandEnable Обрабатывает выбор и отмену выбора связанных с дополнительными элементами пунктами меню.
    EvInterIdle Отвечает на сообщение Windows, указывающее
    приложению на переход основного или диалогового окна в неактивное состояние.
    MenuSelect Отвечает на выбор меню пользователем выводом
    справочного сообщения.
    EvSize Передает в TLayoutWindow сообщение WM_SIZE.
    SetupWindow Вызывает Layout для задания размера и положения дополнительного элемента.


    Функции-элементы


    Constructor Строит рамку MDI с дополнительными элементами
    данного клиентного окна с указанными идентификатором меню.
    DefWindowProc Переопределяет TWindow:DefWindowProc и вызывает функцию API Windows, обеспечивающую заданную по умолчанию обработку любого поступающего сообщения, которое не обрабатывает дочернее окно MDI.


    Функции-элементы


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


    Функции-элементы


    Constructor Вызывает конструктор TWindow, передавая родительское окно и модуль и запрещая автоматическое отображение создаваемого объекта TDialog.
    Destructor Освобождает выделенную для TDialog память.
    CloseWindow Условно завершает диалоговое окно. Если оно безрежимное, вызывает TWindow::CloseWindow, иначе вызывает CanClose.
    CmCancel Автоматически отвечает на щелчок "мышью" на кнопке Cancel диалогового окна. Вызывает CloseWindow.
    CmOk Отвечает на щелчок "мышью" на кнопке OK диалогового окна. Вызывает CloseWindow.
    Create Создает интерфейсный элемент безрежимного диалогового окна с объектом TDialog. Предотвращает автоматическое создание дочерних окон.
    Destroy Уничтожает интерфейсный элемент, связанный с объектом TDialog. Если этот элемент является безрежимным диалоговым окном, вызывает TWindow::Destroy.
    DialogFunction Для обработки сообщений в диалоговой функции
    ваше приложение должно переопределять эту функцию.
    DoCreate Для выполнение фактического создания диалогового окна вызывает DoCreate.
    DoExecute Для фактического выполнения диалогового окна вызывает DoExecute.
    EvClose Отвечает на поступающее сообщение EvClose, завершая окно.
    EvInitDialog Автоматически вызывается непосредственно перед вводом на экран диалогового окна. Вызывает SetupWindow.
    EvPaint Если управляющий элемент имеет предопределенный класс Windows, вызывает DefWndProc для отображения с помощью Windows.
    EvSetFont Отвечает на запрос на изменение шрифта диалога.
    Execute Создает и выполняет интерфейсный элемент режимного диалогового окна, связанный с объектом TDialog.
    GetDefaultId Получает идентификатор используемого по умолчанию ресурса.
    GetItemHandle Возвращает описатель окна управляющего элемента диалогового окна.
    PreProcessMsg Выполняет предобработку сообщений окна.
    SendDlgItemMsg Посылает управляющему элементу диалогового окна заданное сообщение Windows.
    SetCaption Вызывает TWindows::SetCaption.
    SetDefault Устанавливает идентификатор используемого по умолчанию ресурса.
    EvCtlColor Передает родительскому окну описатель контекста вывода дочернего окна, описатель дочернего окна и применяемые по умолчанию системные цвета.
    GetClassName Переопределяет виртуальную функцию, заданную в
    TWindow, и возвращает имя используемого по умолчанию класса Windows диалогового окна. Для безрежимного диалогового окна возвращает имя заданного по умолчанию TWindow.
    GetWindowClass Переопределяет виртуальную функцию, определенную в TWindow. Возвращает атрибуты регистрации.
    SetupWindow Переопределяет виртуальную функцию, определенную в TWindow. Устанавливает диалоговое окно.


    Функции-элементы


    Constructor Создает объект TDib и устанавливает элемент
    данных Handle в заимствованный описатель.
    Destructor Переопределяет базовый деструктор.
    ChangeModeToPal Преобразует существующую таблицу цветов для использования относительных значений палитры.
    ChangeModeToRGB Преобразует существующую таблицу цветов для использования абсолютных значений RGB.
    FindColor Возвращает для данного цвета запись палитры.
    FindIndex Возвращает запись палитры, соответствующую
    заданному индексу.
    GetBits Возвращает для данного DIB элемент данных
    Bits.
    GetColor Возвращает для данного DIB значение bmiColors.
    GetIndex Возвращает индекс цвета для данной записи палитры.
    GetIndices Возвращает для данного DIB индексы bmiColors.
    GetInfo Возвращает для данного DIB поле Info.
    GetInfoHeader Возвращает для данного DIB bmiHeader.
    Height Возвращает высоту данного объекта DIB или 0.
    IsOK Возвращает False, если Info = 0, или True. Если объект DIB создать не удается, то память освобождается, и Info устанавливается в 0.
    IsPM Возвращает True, если IsCore = 0.
    MapColor Отображает заданные цвета в текущей палитре
    данного DIB.
    MapIndex Отображает индексы в текущей палитре данного
    DIB.
    NumColors Возвращает число цветов в палитре DIB или 0,
    если Info = 0.
    NumScans Возвращает 0, если Info = 0, иначе возвращается размер сканирования данного объекта DIB.
    operator<< Записывает данный DIB в указанный буфер Clipboard, допуская обычную цепочку <<.
    operator BITMAPINFO() Выполняет приведение типа данного DIB, возвращая указатель на информационную структуру битового массива.
    operator HEADER() Выполняет для данного DIB приведение типа, BITMAPINFO- возвращая указатель на информационный заголовок битового массива.
    operator HANDLE() Выполняет приведение типа DIB, возвращая его описатель Handle.
    operator TRgbQuad() Выполняет приведение типа DIB, возвращая его
    структуру цветов.
    SetColor Устанавливает для данной записи палитры заданный цвет.
    SetIndex Устанавливает для данной записи палитры заданный индекс.
    Size Возвращает TSize( 0,0), если Info = 0, или TSize(W,H) - размер данного объекта DIB.
    StartScan Возвращает начальную строку сканирования DIB.
    ToClipBoard Помещает заданный объект DIB в указанный буфер Clipboard.
    UsageВозвращает для данного DIB значение, указывающее, как нужно интерпретировать таблицу цветов.
    WidthВозвращает ширину объекта DIB или 0.
    WriteFile Запись файла. При успешном вызове возвращает True.
    InfoFromHandle Блокирует описатель данного DIB и выделяет из заголовка DIB остальные элементы данных.
    LoadFile Загружает данный DIB из файла с указанным именем.
    LoadResource Загружает данный DIB из указанного ресурса.
    Read Считывает в данный DIB данные, начиная с указанного смещения, из любого файла, BMP или ресурса.


    Функции-элементы


    Constructor Создает объект TDibDC с данными, обеспечиваемыми заданным объектом TDib или аргументом DC.


    Функции-элементы


    Constructor Строит объект TDocManager, поддерживающий однодокументальный (SDI) или многодокументальный (MDI) интерфейс (в зависимости от приложения).
    Destructor Уничтожает объект TDocManager и удаляет связанный с ним документы и шаблоны.
    CmFileClose Отвечает на сообщение закрытия файла. Проверяет, изменился ли документ, и выводит в случае изменения подсказку.
    CmFileNew Вызывает CreateAnyDoc и устанавливает dtNewDoc
    в значение нового документа без заданного маршрута.
    CmFileOpen Позволяет пользователю выбрать зарегистрированный шаблон из выводимого в диалоговом окне списка.
    CmFileRevert Возвращается к ранее сохраненному документу.
    CmFileSave Отвечает на сообщение о сохранении файла.
    CmFileSaveAs Выводит пользователю подсказку для ввода нового имени документа.
    CmViewCreate Отвечает на сообщение о создании отображаемого
    элемента, создавая отображение документа на основе заданного маршрута каталога.
    CreateAnyDoc Создает документ на основе маршрута каталога и заданных флагов шаблона.
    CreateAnyView Создает отображение документа на основе маршрута каталога и заданного шаблона.
    DeleteTemplate Удаляет шаблон из списка подключенных к документу шаблона.
    EvCanClose Проверяет, что все закрытием текущего документа документы могут быть закрыты.
    EvPreProcessMenu Вызывается из MinWindow и удаляет меню в заданной позиции.
    FlushDoc Обновляет документ с изменениями и выводит пользователю подсказку для подтверждения.
    GetApplication Возвращает текущее приложение.
    GetCurrentDoc Вызывает TWindow::GetFocus для определения активности текущего окна. Выполняет поиск по списку документов и возвращает документ, содержащий активный отображаемый элемент.
    MathTemplate Возвращает список зарегистрированных шаблонов,
    соответствующих заданному имени файла, или 0.
    PostDocError Выводит на экран окно сообщения с ошибкой, переданной в виде строкового ресурса. По умолчанию окно сообщения содержит кнопку OK.
    PostEvent Если текущий документ изменился, вызывает SendMessage и передает сообщение, указывающее на изменение статуса отображаемого элемента.
    RefTemplate Добавляет шаблон к списку документов, подключенных к шаблону.
    SelectAnySave Выбирает зарегистрированный шаблон для сохранения его с документом.
    UnRefTemplate Удаляет шаблон из списка подключенных к документу шаблонов.
    SelectDocPath Выводит пользователю подсказку для выбора шаблона, используемого для открываемого файла. Возвращает индекс шаблона.
    SelectDocType Позволяет пользователю выбрать тип документа
    из списка шаблонов документов. Возвращает индекс шаблона.


    Функции-элементы


    ClearFlag Создает константу просмотра документа.
    CreateDoc Виртуальная функция без побочных эффектов, которая должна определяться в производном классе. Она создает документ на основе маршрута
    каталога, заданного шаблона и значений флагов.
    CreateView Виртуальная функция без побочных эффектов, которая должна определяться в производном классе. Создает документ на основе класса шаблона документа.
    CreateDefaultExt Создает используемое по умолчанию расширение, присваиваемое файлу, когда пользователь не указывает расширения.
    GetDescription Помещает описание шаблона, включаемое в блок
    списка для выбора файлов или блок списка меню File New.
    GetDirectory Получает маршрут каталога, используемый при
    поиске файлов.
    GetDocManager Указывает на администратор документов.
    GetFileFilter Получает допустимый шаблон документа, используемый при поиске.
    GetFlag Получает константы просмотра документа, указывающие, как открывается и создается документ.
    GetViewName Виртуальная функция без побочных эффектов, которая должна определяться в производном классе.
    IsFlagSet Возвращает ненулевое значение при установке
    флагов документа.
    IsMyKindOfDoc Виртуальная функция без побочных эффектов, которая должна определяться в производном классе. Она проверяет шаблон, принадлежащий к тому же классу, что и документ, или к производному классу.
    IsVisible Указывает, может ли документ выводиться в диалоговом окне выбора файла.
    SelectSave Выводит пользователю подсказку для ввода имени
    файла документа, отфильтровывает файлы, доступные только по чтению.
    SetDefaultExt Задает расширение, задаваемое по умолчанию,
    если пользователь ввел имя файла без расширения.
    SetDirectory Задает маршрут каталога, используемый при поиске файлов.
    SetDocManager Устанавливает текущий администратор документов.
    SetFileFilter Задает допустимый шаблон документа, используемый при поиске файлов.
    SetFlag Устанавливает константы просмотра документов,
    указывающие, какой документ был создан и открыт.
    Constructor Строит TDocTemplate с заданным описанием файла, образцом фильтра, маршрутом поиска каталога, заданным по умолчанию расширением и флагами просмотра и создания параметров.
    Destructor Уничтожает объект TDocTemplate и освобождает


    Функции-элементы


    Constructor Создает TDocCreate с заданным описанием файла,
    фильтром, маршрутом поиска, используемым по
    умолчанию расширением и флагами параметров
    просмотра и создания.
    CreateDoc Создает документ типа D на основе заданного
    маршрута и значений флагов.
    CreateView Создает отображаемый элемент, заданным классом
    шаблона документа.
    IsMyKindOfDoc Проверяет, относится ли документ к тому же
    классу, что и класс шаблона документа, или это
    документ производного класса.
    IsMyKindOfView Проверяет, относится ли отображаемый элемент
    к тому же классу, что и класс шаблона отображаемого элемента, или это отображаемый элемент
    производного класса. Если шаблон не может использовать отображаемый элемент, то возвращается 0.
    GetViewName Получает имя отображаемого документа, связанного с шаблоном.


    Функции-элементы


    Constructor Хотя вы не создаете объект TDocument непосредственно, конструктор требуется вызывать при
    создании производного класса.
    Destructor Удаляет объект TDocument.
    CanClose Перед закрытием текущего документа проверяет
    возможность закрытия дочерних документов.
    CloseЗакрывает документ, но не удаляет и не отсоединяет его. Проверяет дочерние документы.
    Commit Сохраняет текущие данные в памяти.
    FindProperty Получает индекс характеристики по ее имени.
    GetDocManager Возвращает указатель на текущий администратор
    документа.
    GetDocPath Возвращает для документа маршрут каталога.
    GetOpenMode Получает для текущего документа режим и флаги
    защиты.
    GetProperty Возвращает общее число характеристик для данного документа.
    GetTemplate Получает шаблон, используемый для создания документа.
    GetTitle Возвращает заголовок документа.
    HasFocus Использует администратор документов для определения активности документа.
    InStream Общий ввод для конкретного типа носителя. Эту
    функцию можно переопределить для обеспечения
    возможности использования для класса документа
    потока.
    IsDirty Возвращает True, если документ или его дочерний отображаемый элемент были изменены, но не
    сохранены.
    IsOpen Проверяет, имеет ли документ потоки в списке
    потоков. Возвращает False при отсутствии открытых потоков.
    NextStrem Получает следующую запись в потоке или 0.
    NextView Получает следующий отображаемый элемент в
    списке или 0.
    NotifyViews Уведомляет отображаемые элементы текущего документа и отображаемые элементы дочерних документах об изменении.
    Open Открывает документ, используя заданны маршрут.
    OutStream Общий вывод для конкретного типа носителя. Эту
    функцию можно переопределить для обеспечения
    возможности использования для класса документа
    потока.
    PostError Посылает сообщение об ошибке, переданное в виде строкового ресурса.
    PropertyCount Получает общее число характеристик для объекта
    TDocument.
    PropertyFlags По заданному индексу возвращает атрибуты заданной характеристики.
    PropertyName Возвращает имя характеристики по заданному индексу.
    QueryViews Опрашивает отображаемые элементы текущего документа и дочерних документов о заданном событии.
    Revert Выполняет действие, обратное Commit, и отменяет изменения, внесенные в документ со времени
    последней операции commit.
    RootDocument Возвращает в качестве корня документа указатель this.
    SetDocManager Устанавливает текущий администратор документа
    в соответствии с аргументом.
    SetDocPath Задает маршрут документа для операций Open и Save.
    SetOpenMode Устанавливает для текущего документа режим и
    значения флагов защиты.
    SetProperty Устанавливает значение характеристики с заданным индексом и типом данных.
    SetTamplate Устанавливает шаблон документа, совместимый с
    файлом.
    SetTitle Устанавливает заголовок документа.
    AttachStream Вызывается из конструктора TStream и связывает
    поток с текущим документом.
    DetachStream Вызывается из конструктора TStream и отсоединяет поток от текущего документа.


    Функции-элементы


    Constructor Строит объект TDocument::List.
    Destructor Уничтожает объект TDocument::List.
    Destroy Удаляет все документы.
    Insert Включает в список документов новый документ
    (которого нет в списке).
    Remove Удаляет документ из списка.


    Функции-элементы


    Constructor Создает объект TDropInfo, устанавливая описатель на него.
    DragFinish Освобождает память, выделенную для передачи
    объекта TDropInfo при операции буксировки.
    DragQueryFile Получает имя файла и соответствующую информацию для объекта TDropInfo.
    DragQueryFileCountTDropInfo Возвращает число отбуксированных в объекте
    файлов.
    DragQueryFileTDropNameLen Возвращает длину имени файла в объекте Info, соответствующего заданному индексу.
    DragQueryPoint Считывает позицию указателя "мыши" при буксировке файлов данного объекта и копирует координаты в объект point.
    operatorHDROP() Оператор приведения типа, возвращающий описатель


    Функции-элементы


    Above Позиционирует ваше окно над задаваемым "братским" окном.
    Absolute Устанавливает границу окна в фиксированное
    значение.
    Below Позиционирует окно в задаваемом братском окне.
    Вы можете задать поля между окнами.
    LeftOf Позиционирует одно окно относительно братского окна.
    PercentOf Указывает, что граница одного окна должна задаваться в процентах от соответствующей границы другого окна.
    RightOf Позиционирует окно относительно братского окна.
    SameAs Устанавливает границу окна в соответствие с
    границей другого окна.
    Set Используется для установки произвольных ограничений границ.


    Функции-элементы


    Absolute Устанавливает в фиксированное значение ширину
    или высоту окна, либо его границу.
    PercentOf Используется для определения границы окна.
    Хотя ширина и высота окна по умолчанию определяются как процент от соответствующих измерений братского или родительского окна, они могут также задаваться как процент от противоположного изменения (например, высота как процент от ширины).
    SameAs Используется для определения границы окна.
    Хотя данная функция позволяет задать ширину и
    высоту окна равной соответствующим измерений
    братского или родительского окна, они могут
    также задаваться равными противоположному изменению (например, высота равной ширине).


    Функции-элементы


    Constructor Строит в родительском окне редактируемый управляющий элемент и устанавливает атрибуты
    создания.
    CanUndo Возвращает True, если последнее редактирование
    можно отменить.
    ClearModify Сбрасывает флаг изменения редактируемого управляющего элемента (этот флаг устанавливается
    при модификации текста).
    Copy Копирует выделенный текст в буфер Clipboard.
    Cut Удаляет текущий выделенный текст и копирует
    его в буфер Clipboard.
    DeleteLine Удаляет текст в строке многострочного управляющего элемента редактирования с заданным номером.
    DeleteSelection Удаляет текущий подсвеченный текст.
    DeleteSubText Удаляет текст между заданными начальной и конечной позицией.
    EmptyUndoBuffer Если операцию внутри редактируемого управляющего элемента можно отменить, устанавливает
    флаг отмены.
    FormatLines Указывает, что в строки многострочного управляющего элемента нужно вставить (или удалить)
    символы возврата каретки/перевода строки.
    GetFirstVisibleLine Указывает самую верхнюю видимую в редактируемом управляющем элементе строку (для однострочных элементов это 0).
    GetHandle Возвращает описатель данных буфера, который
    содержит выводимые в редактируемом элементе
    данные.
    GetLine Получает строку текста редактируемого управляющего элемента с указанным номером.
    GetLineFromPos В многострочном редактируемом управляющем
    элементе возвращает номер строки, где в которой находятся символы с заданной позицией.
    GetLineIndex В многострочном редактируемом управляющем
    элементе возвращает число символов до строки с
    заданным номером.
    GetLineLenght В многострочном редактируемом управляющем
    элементе возвращает число символов в строке с
    указанным номером.
    GetNumLines Возвращает число строк, введенных в многострочном управляющем элементе.
    GetPasswordChar Возвращает символ, который должен выводиться
    вместо символа, набранного пользователем (по
    умолчанию *).
    GetRect Получает для многострочного редактируемого
    управляющего элемента прямоугольник форматирования.
    GetSelection Возвращает начальную и конечную позицию текущего выделенного текста.
    GetSubText Считывает в редактируемом управляющем элементе
    текст от заданной начальной до заданной конечной позиции и возвращает его в строке.
    GetWordBreakPos Возвращает текущую функцию перехода на новую строку (в виде адреса, определенного приложением).
    Insert Вставляет заданный текст в текущей позиции
    (позиции курсора) управляющего элемента редактирования, заменяя любой выделенный текст.
    IsModified Возвращает True, если пользователь изменил
    текст редактируемого элемента.
    LockBuffer Блокирует буфер редактируемого управляющего
    элемента и возвращает указатель на этот буфер.
    Вызывается при завершении.
    Paste Вставляет текст из буфера Clipboard в редактируемый управляющий элемент (в текущую позицию).
    Scroll Прокручивает многострочный редактируемый управляющий элемент вертикально или горизонтально на заданное число символов.
    Search Выполняет поиск заданного текста.
    SetHandle Устанавливает описатель на текстовый буфер,
    используемый для хранения содержимого многострочного элемента.
    SetPasswordChar Задает символ, выводимый вместо символа, набираемого пользователем.
    SetReadOnly Определяет редактируемый управляющий элемент
    как доступный только по чтению или по чтению-записи.
    SetRect Устанавливает для многострочного управляющего
    элемента редактирования прямоугольник форматирования.
    SetRectNP Устанавливает для многострочного управляющего
    элемента редактирования прямоугольник форматирования, но не отображает элемент заново.
    SetSelection Выделяет текст между заданными начальной и конечной позицией.
    SetWordBreapPos В многострочном элементе указывает, что заданная приложением функция перехода на новую
    строку заменена используемой по умолчанию.
    Undo Отменяет последнее редактирование.
    UnlockBuffer Разблокирует заблокированный буфер управляющего элемента редактирования.
    Validator Указывает на объект проверки допустимости,
    построенный в производном классе для проверки
    допустимости вводимого текста.
    CanClose Перед закрытием текущего окна проверяет возможность закрытия всех дочерних окон.
    CmEditClear Автоматические отвечает на выбор в меню, вызывая Clear.
    EditCopy Автоматические отвечает на выбор в меню, вызывая Copy.
    CmEditCut Автоматические отвечает на выбор в меню, вызывая Cut.
    CmEditDelete Автоматические отвечает на выбор в меню, вызывая DeleteSelection.
    CmEditPaste Автоматические отвечает на выбор в меню, вызывая Paste.
    CmEditUndo Автоматические отвечает на выбор в меню, вызывая Undo.
    ENErrSpace В ответ на сообщение, уведомляющее об ошибке,
    связанной с неудачным выделением памяти, звуковым сигналом.
    EvChar Проверяет допустимость введенного в редактируемом управляющем элементе текста.
    EvGetDlgCode Отвечает на запрос GetDlgCode в соответствии с
    текущим состоянием управляющего элемента.
    EvKeyDown Транслирует виртуальный код клавиши в перемещение.
    EvKillFocus Отвечает на сообщение перевода окно в неактивное состояние и уничтожает символ вставки.
    GetClassName Возвращает имя класса регистрации для TEdit.
    SetupWindow Ограничивает число символов, которые могут
    вводиться в редактируемый управляющий элемент.


    Функции-элементы


    Constructor Строит окно TEditFile с заданным родительским
    окном, идентификатором ресурса, именем файла и
    идентификатором модуля.
    Destructor Освобождает занимаемую TEditFile память.
    CanClear Возвращает True, если можно очистить связанный
    с редактируемым управляющим элементом.
    CanClose Возвращает True, если окно редактирования можно закрыть.
    CmFileNew Вызывает NewFile в ответ на поступившую команду File New.
    CmFileOpen В ответ на поступившую команду File Open вызывает Open.
    CmFileSave В ответ на поступившую команду File Save вызывает Save.
    CmFileSaveAs В ответ на поступившую команду File SaveAs вызывает SaveAs.
    NewFile Начинает редактирование нового файла после вызова CanClear.
    Open Открывает новый файл после определения возможности очистки текста Editor.
    Read Считывает содержимое ранее заданного файла в
    Editor.
    ReplaceWith Вызывает SetFileName и Read для замены текущего редактируемого файла с указанными именем.
    Save Сохраняет содержимое Editor в файле, имя которого указано пользователем.
    SaveAs Сохраняет содержимое Editor в файле, имя которого пользователь указывает в диалоговом окне
    Save As.
    SetFileName Устанавливает имя файла и обновляет заголовок
    окна.
    Write Сохраняет содержимое Editor в файле, имя которого задается fileName.
    SetupWindow С помощью вызова TEditFile::SetupWindow создает окно редактирования.


    Функции-элементы


    Constructor Создает объект TEditWindow, связанный с заданным документом и родительским окном.
    Destructor Уничтожает объект TEditView.
    CanClose Если отображаемый элемент можно закрыть, возвращает ненулевое значение.
    Create Переопределяет TWindow::Create и вызывает
    TEditSearch::Create для создания окна отображаемого элемента.
    GetViewName Переопределяет TEditView::GetViewName и возвращает описательное класса.
    GetWindow Переопределяет TEditView::StaticName и возвращает в качестве TWindow this.
    PerformCreate Выделяет память, необходимую для работы TEditView с файлами до размером до 30000 байт.
    SetDocTitle Переопределяет TView::SetDocTitle и передает
    заголовок базовому классу TEditSearch.
    StaticName Возвращает для меню ViewSelect описательное
    имя класса.
    EvNCDestroy Служит для внутреннего использования и управления памятью в TEditWindow.
    LoadData Считывает управляющий элемент из потока и закрывает файл.
    VnCommit Фиксирует изменения, внесенные в отображаемом
    элементе документа.
    VnDocClosed Указывает, что документ закрыт.
    VnIsDirty Возвращает ненулевое значение, если изменения
    данных отображаемого элемента сохранены в документе.
    VnIsWindow Возвращает ненулевое значение, если переданный
    в hWnd описатель окна тот же, что и у окна вывода отображаемого элемента.
    VnRevert Возвращает ненулевое значение, если изменения
    в отображаемом элементе нужно стереть, а данные из документа восстановить в отображаемом
    элементе.


    Функции-элементы


    Dispatch Берет из Msg сообщение и диспетчеризует его
    корректному обработчику сообщений.
    Find Ищет соответствие в таблице реакции.
    Msg Содержит тип посылаемого сообщения.
    Id Содержит описатель ресурса меню или командной
    клавиши.
    Object Указывает на объект, содержащий обрабатываемую
    функцию.
    Entry Указывает на запись таблицы реакции.
    Constructor Строит объект TEventInfo с заданным идентификатором и типом сообщения.


    Функции-элементы


    Constructor Строит объект TFileDocument с возможным родительским документом.
    Destructor Уничтожает объект TFileDocument.
    Close Закрывает документ, но не удаляет и не отсоединяет соответствующих элементов просмотра.
    Проверяет возможность закрытия дочерних элементов.
    Commit Вызывает TDocument::Commit и очищает DirtyFlag
    (указывая, что в документе нет несохраненных
    данных).
    FindProperty Получает индекс характеристики по ее имени.
    GetProperty Переопределяет TDocument::GetProperty и получает идентификатор текущего файла документа.
    InStream Переопределяет TDocument::InStream и обеспечивает общий ввод для конкретного типа памяти.
    IsOpen Не равна 0, если поток и какие-либо потоки открыты.
    Open Открывает файл документа, используя существующий описатель файла.
    OutStream Переопределяет TDocument::OutStream и обеспечивает общий вывод для конкретного типа памяти.
    PropertyFlags Возвращает константы характеристик атрибутов.
    PropertyName Возвращает текстовое имя характеристики по
    значению индекса.
    Revert Вызывает TDocument:: Revert для уведомления
    отображаемых элементов об обновлении их данных. Если clear=False, то данные восстанавливаются.
    SetProperty Устанавливает данные характеристик в собственном типе данных.
    CloseThisFile Закрывает описатель файла и уведомляет все
    отображаемые элементы.
    OpenThisFile Открывает файл документа после проверки режима
    совместного использования файла.


    Функции-элементы


    Constructor Инициализирует объект TFileObject на основе
    информации структуры TOpenSaveDialog::TData.
    DoExecute Вызывает функцию API Windows GetOpenFileName
    и передает ей структуру, сообщающую, как нужно
    создавать объект TFileOpenDialog.


    Функции-элементы


    Constructor Инициализирует объект TFileOpen на основе
    информации структуры TOpenSaveDialog::TData.
    DoCreate Создает безрежимный интерфейсный элемент типа
    диалогового окна поиска.


    Функции-элементы


    Constructor Строит объект TFindReplaceDialog с заданным
    родительским окном, идентификатором ресурса и
    заголовком и устанавливает его атрибуты.
    CmCancel Отвечает на щелчок "мышью" на кнопке Cancel.
    CmFindNext Отвечает на щелчок " мышью" на кнопке Find
    Next.
    CmReplace Отвечает на щелчок "мышью" на кнопке Replace.
    CmReplaceAll Отвечает на щелчок "мышью" на кнопке ReplaceAll.
    EvNCDestroy Вызывает TWindow::EvNCDestroy, которая отвечает на сообщение EV_WM_NCDESTROY.
    DoCreate Виртуальная функция, переопределяемая в производных классах для создания безрежимного окна
    поиска и замены.
    DialogFunction Возвращает True, если сообщение обработано.
    Init Используется конструкторами в производных
    классах и инициализирует объект TFindReplaceDialog.


    Функции-элементы


    BuffSize Содержит размер текстового буфера.
    Error Содержит один или более кодов CommDlgExtendedError.
    FindWhat Содержит строку поиска.
    Flags Указывает состояние управляющих кнопок и действие в диалоговом окне.
    ReplaceWith Содержит строку замены.


    Функции-элементы


    Constructor Строит объект TFrameWindow, подключенный к заданному родительскому окну. По умолчанию рамка
    не сжимается до размеров окна клиента. SetMargins Устанавливает поля для свободного окна палитры
    в соответствии с заданным размером и строкой
    заголовка.

    Функции-элементы


    Constructor Строит оконный объект с указанным родительским
    окном.
    Destructor Удаляет все соответствующие дескрипторы меню.
    AssignMenu Устанавливает Attr.Menu и освобождает все
    предыдущие строки, на которые указывает Attr.Menu.
    EnableKBHandler Устанавливает флаг, указывающий, что получатель запросил перемещение с помощью клавиатуры. По умолчанию для окон и диалоговых окон
    клавиатурный интерфейс запрещается.
    GetClientWindow Возвращает указатель на клиентное окно.
    GetMenuDescr Возвращает указатель на дескриптор меню.
    HoldFocusHwnd Отвечает на запрос дочернего окна на сохранение его HWND при переводе окна в неактивное
    состояние.
    IdleAction TApplication вызывает IdleAction основного окна, когда сообщения ожидают обработки. TFrameWindow использует время простоя для выполнения
    команд, разрешенных для строки меню.
    MergeMenu Сливает данных дескриптор меню с собственным
    дескриптором меню рамки и выводит результирующее меню в данной рамке.
    PreProcessMsg Выполняет предобработку сообщений окна.
    RestoreMenu Восстанавливает заданное по умолчанию меню рамки окна.
    SetClientWindow Устанавливает клиентное окно в заданное окно.
    SetIcon Устанавливает пиктограмму в заданный идентификатор ресурса.
    SetMenuDesc Устанавливает дескриптор меню в новый дескриптор меню.
    EvCommand Обеспечивает дополнительную обработку команд
    и позволяет обрабатывать команды сначала родительским окнам.
    EvCommandEnable Обрабатывает выбор и отмену выбора элементов меню окна.
    EvEraseBkgnd Стирает фон заданного окна.
    EvInitMenuPopup Позволяет приложению изменить элементы меню перед выводом меню.
    EvPaint Отвечает на сообщение EM_PAINT для изображения пиктограммы окна или позволяет клиентным
    окнам изменить изображение пиктограммы.
    EvParentNotify Отвечает на сообщение для уведомления родительского окна о данном событии.
    EvQueryDragIcon Отвечает на сообщение Windows, посылаемое буксируемому минимизированному окну.
    EvSentFocus Восстанавливает активность окна.
    EcSize Изменяет размер клиентного окна, чтобы он был
    равен размеру прямоугольника клиента.
    SetupWindow Вызывает TWindow::SetupWindow для создания
    окон в списке дочерних окон.


    Функции-элементы


    Constructor Строит объект TGadget с заданным идентификатором и стилем обрамления.
    Destructor Уничтожает интерфейсный объект TGadget и удаляет его из соответствующего окна.
    CommandEnable Обеспечивает возможность разрешения выполнения команд.
    GetBorders Получает размеры обрамления реквизита.
    GetBorderStyle Получает стиль обрамления реквизита.
    GetBounds Возвращает обрамляющий прямоугольник реквизита.
    GetDesiredSize Определяет максимальную величину реквизита.
    GetEnabled Определяет разрешение для заданного реквизита ввод с клавиатуры или от "мыши".
    GetId Получает идентификатор реквизита.
    GetMargins Получает размеры полей.
    GetOuterSizes Возвращает размер, занимаемый обрамлением и
    полями.
    NextGadget Возвращает следующий реквизит в списке.
    SetBorders Устанавливает границы реквизита.
    SetBorderStyle Устанавливает стиль обрамления реквизита.
    SetBounds Информирует реквизит об изменении обрамляющего прямоугольника.
    SetEnabled Разрешает или запрещает для реквизита ввод с
    клавиатуры или от "мыши".
    SetMargins Устанавливает поля реквизита.
    SetShrinkWrap Устанавливает величины ShringWrapWidth и
    ShrinkWrapHeight.
    SetSize Изменяет размер реквизита.
    SysColorChange Вызывается при изменении системных цветов для
    возможного перестроения и повторного отображения реквизита.
    Bounds Содержит обрамляющий прямоугольник реквизита
    (в координатах окна реквизита).
    BorderStyle Содержит стиль обрамления реквизита.
    Borders Содержит размеры обрамления (границ) реквизита.
    Id Содержит идентификатор реквизита.
    Margins Содержит размеры полей прямоугольника.
    ShrinkWrapHeight Указывает, должен ли реквизит сжиматься для
    размещения своего содержимого.
    TrackMouse Инициализируется значением False. При установке в True позволяет перехватывать нажатия
    кнопки "мыши".
    Window Ссылка на окно-владелец или родительское окно
    реквизита.
    GetInnerRect Вычисляет область прямоугольника реквизита,
    исключая обрамление и поля.
    Inserted Вызывается после включения реквизита в окно.
    Invalidate Используется для запрещения активной (обычно
    не обрамленной) части реквизита.
    InvalidateRect Запрещает в родительском окне связанный с реквизитом прямоугольник.
    LButttonUp При установке TrackMouse освобождает перехват
    события "мыши".
    MouseEnter Вызывается при перемещении "мыши" внутрь реквизита.
    MouseLeave Вызывается, когда "мышь" выходит за пределы
    реквизита.
    MouseMove Если события "мыши" перехватываются, отвечает
    на сообщение буксировки "мыши".
    Paint Вызывает PaintBorder для отображения указанного контекста устройства.
    PaintBorder Вызывает GetSystemMetrics для получения ширины
    и высоты реквизита и использует цвет, возвращаемый GetSystemColor для изображения или
    подсветки области с помощью заданной кисти.
    PtIn Определяет, находится ли точка в обрамляющем
    прямоугольнике приемника.
    Removed Вызывается после удаления реквизита из окна.


    Функции-элементы


    Constructor Создает интерфейсный объект TGadgetWindow с
    заданным по умолчанию режимом вывода и шрифтом.
    Destructor Уничтожает объект TGadgetWindow, удаляя его
    реквизиты и шрифты.
    FirstGadget Возвращает первый реквизит в списке.
    GadgetChangedSize Используется для уведомления окна реквизита об изменении его размера.
    GadgetFromPoint Возвращает реквизит в заданных координатах окна.
    GadgetReleaseCapture Отменяет перехват, после чего все окна могут получать сообщения Windows.
    GadgetSetCapture Резервирует все сообщения "мыши" для окна реквизита, пока перехват не будет отменен.
    GadgetWithId Возвращает указатель на реквизит, связанный с
    заданным идентификатором.
    GetFont Возвращает шрифт (по умолчанию MS Sans).
    GetFontHeight Получает высоту шрифта окна.
    GetHintMode Возвращает режим подсказки.
    IdleAction Вызывается при отсутствии ожидающих обработки
    сообщений и выполняет итерацию по реквизитам,
    вызывая функцию-элемент CommandEnable.
    Insert Вставляет реквизит перед или после реквизита
    такого же уровня.
    LayoutSession Вызывается обычно при изменении размера полей
    или реквизитов или при добавлении/удалении
    реквизитов. Располагает реквизиты в заданном
    направлении и помечает область, требующую повторного отображения.
    NextGadget Возвращает следующий после заданного реквизит.
    Remove Удаляет реквизит из окна реквизита, не уничтожая его.
    SerDirection Устанавливает горизонтальную/вертикальную ориентацию реквизитов.
    SetHintCommand Моделирует сообщения выбора меню, что позволяет выводить рекомендательные команды.
    SetMargins Устанавливает или изменяет поля для окна атрибута и вызывает LayoutSession.
    SetShrinkWrap Задает ширину и высоту элементов данных.
    Create Переопределяет функцию-элемент TWindow и выбирает начальный размер реквизита.
    EvLButtonDown Отвечает на нажатие левой кнопки "мыши", передавая событие тому реквизиту, на который позиционирована "мышь".
    EvLButtonUp Отвечает на освобождение левой кнопки "мыши",
    передавая событие тому реквизиту, на который
    позиционирована "мышь".
    EvMouseMove Если события "мыши" перехватываются, отвечает
    на событие "мыши", посылая событие тому реквизиту, для которого установлен перехват.
    EvSize Вызывает TWindow::EvSize для выполнения заданной по умолчанию обработки.
    EvSysColorChange Вызывается при изменении системных цветов, направляя сообщения всем реквизитам.
    GetDesiresSize Возвращает размер, необходимый для приведения
    размеров реквизита и его полей в соответствие
    реквизиту с самой большой шириной и высотой.
    GetInnerRect Вычисляет прямоугольник внутри обрамления и
    полей реквизита.
    GetMargins Возвращает размеры полей в элементах изображения.
    LayoutUnitsToPixels Преобразует единицы разметки в элементы изображения. Единицы разметки определяются делением высоту шрифта окна на 8.
    Paint Помещает шрифт в контекст устройства и вызывает PaintGadgets.
    PaintGadgets Вызывает Paint для повторного отображения реквизитов, выполняя итерацию по списку реквизитов.
    PositionGadget Вызывается для разрешения настройки интервалов
    перед позиционированием каждого реквизита.
    TheGadgets Выводит реквизиты (без перекрытия) в требуемом
    направлении.


    Функции-элементы


    Constructor Строит интерфейсный объект TGadgetWindowFont
    с заданным по умолчанию размером (10 пунктов)
    без жирности и наклонности. По умолчанию создается системный шрифт.


    Функции-элементы


    GetRange Получает минимальное и максимальное значение
    измерительного элемента.
    GetValue Получает текущее значение измерительного элемента.
    SetLed Устанавливает LedSpacing и LedThick в значения
    spacing и this.
    SetValue Ограничивает значение заданными в измерительном элементе максимальными и минимальным значением.
    Constructor Строит объект TGauge с заданным обрамлением.
    EvEraseBkgnd Переопределяет функцию Windows и стирает фон
    измерительного элемента. Позволяет избежать
    мерцания.
    Paint Переопределяет функцию Windows и изображает
    область измерительного инструмента и его обрамление.


    Функции-элементы


    enum Перечисляет значения флага для конструкторов
    TAutoDelete GDI Handle. Используется для удаления в деструкторах.
    enum TType Данное перечисление используется для хранения
    типа объекта во внутренней структуре.
    GetObject Оболочка для вызова API Windows. Помещает информацию о данном объекте GDI и помещает ее в
    буфер.
    IsGdiObject Возвращает True, если элемент данных Handle
    представляет существующий объект GDI.
    IsOk Возвращает True, если текущий описатель Handle
    отличен от 0.
    RefAdd Доступен только в случае активного одиночного
    управляющего элемента и добавляет к таблице
    ObjInfoBag ссылку на запись объекта с заданными описателем и типом.
    RefCount Доступен только в случае активного одиночного
    управляющего элемента и возвращает текущий
    счетчик ссылки.
    RefDec Доступен только в случае активного одиночного
    управляющего элемента и уменьшает данную ссылку объекта на 1, удаляя объект, когда счетчик
    ссылки становится равным 0.
    RefFind Доступен только в случае активного одиночного
    управляющего элемента и ищет в таблице ObjInfoBag запись данного объекта, возвращая его
    тип и счетчик ссылки.
    RefInc Доступен только в случае активного одиночного
    управляющего элемента и увеличивает на 1 счетчик ссылки заданного объекта.
    RefRemote Доступен только в случае активного одиночного
    управляющего элемента и удаляет из таблицы ObjInfoBag ссылку на объект с заданным описателем.
    Constructor Данный используемый по умолчанию конструктор
    устанавливает Handle в 0 и ShouldDelete в
    True.
    Destructor Если ShoulDelete равно False, то никаких действий не выполняется, иначе вызывается DeleteObject(Handle) (в зависимости от активности
    одиночного управляющего элемента).


    Функции-элементы


    Constructor Строит объект TXGdi с заданным по умолчанию
    сообщением IDS_GDIFAILURE.
    Msg Преобразует в строку идентификатор ресурса и
    возвращает строковое сообщение.


    Функции-элементы


    Constructor Строит объект группового блока с указанным родительским окном, идентификатором управляющего
    элемента, текстом, позицией, шириной и высотой.
    SelectionChanged Если NotifyParent = True, уведомляет родительское окно группового блока об изменении своего
    состояния.
    GetClassName Возвращает имя класса регистрации Windows.


    Функции-элементы


    Constructor Строит объект скользящего маркера.
    HitTest Переопределяет виртуальную функцию TSlider и
    получает информацию о координатах X,Y маркера.
    NotifyParent Переопределяет виртуальную функцию TSlider и
    посылает сообщение родительскому окну.
    PaintRuler Переопределяет виртуальную функцию TSlider и
    изображает горизонтальную линейку.
    PaintSlot Переопределяет виртуальную функцию TSlider и
    отображает поле, в котором скользит маркер.
    PointToPos Переопределяет виртуальную функцию TSlider и
    транслирует точку X,y в позицию в единицах
    скользящего маркера.
    PosToPoint Переопределяет виртуальную функцию TSlider и
    транслирует позицию в единицах скользящего
    маркера в точку X,Y.


    Функции-элементы


    Constructor Создает объект DC с заданным драйвером, устройством, портом и значениями инициализации.


    Функции-элементы


    Constructor Создает объект TIcon и устанавливает описатель.
    Destructor Переопределяет базовый деструктор для вызова
    вместо ::DestroyIcon вместо ::DeleteObject.
    GetIconInfo Получает информацию о данной пиктограмме и копирует ее в заданную структуру.
    operator HICON() Операция приведения типа, которая преобразует описатель пиктограммы к типу HICON (тип
    Windows).


    Функции-элементы


    Constructor Вызывает конструктор TDialog, передавая родительское окно, идентификатор ресурса и модуль.
    TransferData Передает данные диалогового окна ввода.
    SetupWindow При установке окна вызывает TDilog::SetupDialog и устанавливает в диалоговом окне текст
    статического или редактируемого управляющего
    элемента текст подсказки.


    Функции-элементы


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


    Функции-элементы


    Constructor Строит объект TKeyboardModeTracker, отслеживающий режимы клавиатуры и обновляющий строку
    состояния.
    OvertypeState Значение True указывает на активизацию режима
    замены.
    ScrollLockState Значение True указывает на режим блокировки
    прокрутки (Scroll Lock).
    UpdateStatusBar Значение True указывает на клавиатурные режимы, которые должны отображаться в строке состояния.
    DoKeyDown Транслирует код виртуальной клавиши в перемещение и вызывает TStatusBar для изменения индикатора строки состояния.
    DoSetFocus Восстанавливает активное окно и возвращает
    TEventStatus.
    EvKeyDown Отвечает на сообщение нажатия клавиши вызовом
    DoKeyDown.
    EvSetFocus Отвечает на сообщение активизации вызовом DoSetFocus.
    OvertypeModeChange При переключении режима вставки/замены устанавливается в True.
    ScrollLockModeChange При переключении режима блокировки прокрутки устанавливается в True.


    Функции-элементы


    Constructor Создает объект TLayoutMetrics и инициализирует
    объект устанавливая единицы дочернего и родительского окна и соотношение между окнами.


    Функции-элементы


    Constructor Создает объект TLayoutWindow с заданным родительским окном, заголовком окна и идентификатором библиотеки.
    Destructor Удаляет переменные и отменяет ограничения дочерних окон.
    GetChildLayoutMetrics Получает характеристики схемы дочернего окна.
    Layout Приводит к изменению размеров окна и позиционированию дочерних окон соответственно заданным параметрам.
    RemoveChildLayoutMetrics Удаляет параметры расположения дочерних окон.
    SetChildLaoutMetrics Устанавливает параметры размещения окна и удаляет все существующие.
    EvSize Отвечает на изменение размеров окна вызовом
    Layout.


    Функции-элементы


    Constructor Строит объект блока списка с указанным родительским окном, идентификатором библиотеки,
    позицией относительно начала клиентной области
    родительского окна, высотой и шириной.
    AddString Добавляет к блоку списка строку, возвращая ее
    позицию в списке.
    ClearList Очищает все элементы в списке.
    DeleteString Удаляет элемент в заданной позиции списка.
    DestroyList Добавляет в блок списка список имен файлов.
    FindExactString Ищет в блоке списка указанную строку, начиная
    с указанного индекса.
    FindString Ищет в блоке списка строку, начинающуюся с заданной строки.
    GetCaretIndex Возвращает индекс активного (выделенного) элемента списка.
    GetCount Возвращает число элементов в списке.
    GetHorizontalExtent Возвращает число элементов изображения, на которые блок списка может прокручиваться горизонтально.
    GetItemHeight Возвращает высоту заданных элементов блока
    списка в элементах изображения.
    GetItemRect Возвращает размеры прямоугольника, окружающего
    элемент блока списка, выводимый в окне.
    GetSel Возвращает индекс выделенного элемента в блоке
    списка.
    GetSelCount Возвращает число выделенных элементов в одноили многострочном блоке списка или комбинированном блоке.
    GetSelIndex Для блоков списка с единственным выделением
    возвращает неотрицательный индекс текущего выделенного элемента.
    GetSelIndexes Для блоков списка с множественным выделением
    возвращает массив индексом выделенных строк.
    GetSelString Получает текущие выделенные элементы, возвращая их в массиве строк.
    GetSelStrings Считывает общее число выделенных элементов в
    списке с множественным выделением и копирует
    их в буфер.
    GetString Считывает элемент в указанной позиции и возвращает его в строке.
    GetStringLen Возвращает длину строки (без конечного нуля)
    элемента в указанной позиции.
    GetTopIndex Возвращает индекс первого элемента, выводимого
    в начале списка.
    GetCaretIndex Делает активным элемент с заданным индексом.
    SetColumnWidth Устанавливает ширину элементов в блоке списка
    в элементах изображения.
    SetHorizontalExtent Задает число элементов изображения, на которые блок списка можно прокручивать горизонтально.
    SetItemData Устанавливает 32-битовое значение элемента
    блока списка в заданной позиции.
    SetItemHeight Устанавливает высоту (в элементах изображения)
    элементов блока списка.
    SetSel Выделяет элемент в позиции с заданным индексом.
    SetSelIndex В списках с единственным выделением выделяет
    элемент в указанной позиции.
    SetSelIndexes В блоках списка с множественным выделением
    выделяет или отменяет выделение в соответствующем блоке списка в позициях, заданных массивом индексом.
    SetSelItemRange Выделяет элементы в заданном диапазоне.
    SetSelString В списках с единственным выделением выделяет
    элемент с текстом, начинающимся с заданной
    строки.
    SetSelStrings В списках с множественным выделением выделяет
    (или отменяет выделение) строки в соответствующем блоке списка, начинающемся с префиксов, заданных в массиве префиксов.
    SetTabStops Задает позиции табуляции.
    SetTopIndex Устанавливает индекс первого элемента в начале блока списка.
    Transfer Передает элементы и выделения блока списка в
    буфер передачи или из него.
    GetClassName Возвращает имя класса регистрации Windows.


    Функции-элементы


    Constructor Строит Strings и SelStrings. Инициализирует
    SelCount значением 0.
    Destructor Освобождает память, выделенную для Strings и
    SelStrings.
    AddString Добавляет к String заданные строки.
    AddStringItem Добавляет к массиву Strings строку с возможным
    ее выделением и добавлением элемента данных в
    массив ItemDatas.
    GetSelString Находит в SelStrings строку с заданным индексом и копирует ее в буфер.
    GetSelStringLength Возвращает длину строки в SelString с заданным индексом.
    ResetSelections Удаляет из SelStrings все строки и устанавливает SelCount в 0.
    Select Выделяет строку с заданным индексом.
    SelectString Добавляет к SelStrings строку и увеличивает
    SelCount.


    Функции-элементы


    Constructor Создает объект TListView, связанный с заданным
    документом и родительским окном.
    Destructor После проверки наличия открытого отображаемого
    элемента уничтожает объект TListView.
    CanClose Перед закрытием текущего отображаемого элемента проверяет возможность закрытия дочерних
    отображаемых элементов.
    Create Переопределяет TWindow::Create и вызывает
    TEditSearch::Create для создания окна отображаемого элемента.
    GetViewName Переопределяет виртуальную функцию TView и
    возвращает описательное имя класса.
    GetWindow Переопределяет виртуальную функцию TView и
    возвращает объект отображаемого элемента списка в качестве TWindow.
    SetDocFitle Переопределяет виртуальную функцию TView и
    сохраняет заголовок документа. Это имя передается по цепочке родительскому объекту.
    StaticName Переопределяет функцию TView и возвращает
    строку-константу. Эта информация выводится в
    блоке выбора.
    CmEditAdd Автоматически отвечает на сообщение CM_LISTADD
    получением длины строки ввода, вызывая InsertString для вставки текстовой строки в отображаемый элемент списка.
    CmEditCopy Автоматически отвечает на выбор в меню вызовом
    TListBox::Copy для копирования выделенного
    текста в буфер Clipboard.
    CmEditClear Автоматически отвечает на выбор в меню вызовом
    TListBox::Clear для очистки отображаемого элемента списка.
    CmEditDelete Автоматически отвечает на выбор в меню вызовом
    TListBox::DeleteSelection.
    CmEditPaste Автоматически отвечает на выбор в меню вызовом
    TListBox::Paste.
    CmEditUndo Автоматически отвечает на выбор в меню вызовом
    TListBox::Undo.
    CmSelChange Автоматически отвечает на сообщение об изменении содержимого отображаемого элемента списка
    вызовом DefaultProcessing.
    EvGetDlgCode Переопределяет реакцию TWindow на сообщение
    WM_GETDLGCODE вызовом DefaultProcessing.
    LoadData Считывает отображаемый элемент из потока и
    закрывает файл.
    SetExtent Задает максимальную горизонтальную протяженность окна отображаемого элемента списка.
    VnCommit Сохраняет в документе изменения, внесенные в
    отображаемый элемент.
    VnDocClosed Указывает, что документ сохранен.
    VnIsDirty Возвращает ненулевое значение, если в данные
    отображаемого элемента внесены изменения, которые не сохранены в документе.
    VnIsWindow Возвращает ненулевое значение, если переданный
    описатель окна совпадает с описателем окна
    отображаемого элемента.
    VnRevert Указывает, что внесенные в отображаемый элемент изменения следует стереть, а данные отображаемого элемента должны быть восстановлены.


    Функции-элементы


    Constructor Строит объект TLookupValidator.
    IsValid Переопределяет виртуальную функцию TValidator
    и вызывает Lookup для поиска строки в списке
    допустимых элементов ввода.
    Lookup Ищет заданную строку в списке допустимых записей и возвращает True, если находит ее. В производных классах этот метод требует переопределения.

    | |

    Функции-элементы


    Constructor Создает дочернее окно MDI заданного окна MDI
    с указанным заголовком, клиентным окном и экземпляром.
    Destructor Уничтожает объект дочернего окна MDI.
    Destroy Уничтожает интерфейсный элемент, связанный с
    TMDIChild. Вызывает EnableAutoCreate для создания каждого окна в списке дочерних окон.
    PreProcessMsg Выполняет предобработку сообщений окон для дочернего окна MDI.
    DefWindowProc Переопределяет TWindow::DefWindowProc и вызывает функцию Windows DefMDIChildProc, выполняющую заданную по умолчанию обработку сообщений, которые не обрабатывает дочернее окно
    MDI.
    EvMDIActivate Указывает клиентному окну, что нужно активизировать или деактивизировать дочернее окно MDI
    и послать ему сообщение.
    PerformCreate Создает связанный с дочерним окном MDI интерфейсный элемент.


    Функции-элементы


    Constructor Создает клиентное окно MDI, вызывая базовый
    класс TWindow.
    Destructor Освобождает структуру ClientAttr.
    ArrangeIcons Упорядочивает в нижней части клиентного окна
    MDI пиктограммы дочерних окон MDI.
    CascadeChildren Задает размеры и упорядочивает не минимизированные в пиктограммы дочерние окна MDI в клиентном окне MDI.
    Create Создает интерфейсный элемент, связанный с клиентным окном MDI.
    CreateChild Переопределяет функцию-элемент TWindow. Строит
    и создает новое дочернее окно MDI.
    GetActiveMDIClient Указывает на активное дочернее окно TMDIChild.
    InitChild Строит экземпляр TWindow как дочернее окно
    MDI и возвращает указатель на него.
    PreProcessMsg В соответствии с аргументом вызывает функцию
    Windows для трансляции оперативных клавиш
    MDI-клиента.
    TheChildren Задает размеры и упорядочивает все не минимизированные в пиктограммы окна в клиентном окне
    MDI.
    CmArrangeIcons В ответ на выбор в меню вызывает ArrangeIcons.
    CmCascadeChildren В ответ на выбор в меню вызывает CascadeChildren.
    CmChildActionEnable При наличии дочерних окон MDI разрешает любую
    из команд меню дочерних окон.
    CmCloseChildren В ответ на выбор в меню вызывает CloseChildren.
    CmCreateChild Для создания нового дочернего окна в ответ на
    выбор в меню вызывает CreateChild.
    CmTileChildren В ответ на выбор в меню вызывает TileChildren.
    EvMDICreate Перехватывает посылаемое при создании дочернего окна MDI сообщение и изменяет его атрибуты стиля.
    GetClassName Возвращает имя класса регистрации TMDIClient в Windows.


    Функции-элементы


    Constructor Используя заданный заголовок и ресурс, строит
    объект окна-рамки MDI.
    GetClientWindow Возвращает указатель на клиентное окно MDI.
    SetMenu Ищет в новой строке меню подменю MDI и обновляет ChildMenuPos. Ищет в новой строке меню дочернее меню MDI и обновляет позицию дочернего меню с заданным индексом.
    DefWindowProc Переопределяет TWindow:DefWindowProc и вызывает функцию Windows DefFrameProc, обеспечивающую заданную по умолчанию обработку поступающих сообщений, не обрабатываемых окном-рамкой MDI.


    Функции-элементы


    Constructor Используемый по умолчанию конструктор для DC
    объекта памяти.
    RestoreBitmap Восстанавливает для данного DC первоначально
    выбранный объект графического массива.
    RestoreObjects Восстанавливает первоначально выбранную кисть,
    перо, шрифт, палитру и объекты графических
    массивов для данного DC.
    SelectObject Выбирает в данном DC заданный объект GDI.


    Функции-элементы


    Constructor Создает пустое меню и устанавливает его автоматическое удаление при уничтожении объекта.
    Destructor Уничтожает всплывающее меню.
    AppendMenu Добавляет к концу меню элемент меню в виде битового массива или текста.
    CheckMenuItem Отмечает или отменяет отметку элемента меню.
    DeleteMenu Удаляет из меню или всплывающего меню заданный
    элемент меню.
    EnableMenuItem Разрешает/запрещает пункт меню.
    GetMenuCheckMarkDimensions Получает размер битового массива, используемого
    для вывода заданной по умолчанию отметки элементов меню.
    GetMenuItemCount Возвращает число элементов в меню верхнего
    уровня или всплывающем меню.
    GetMenuState Возвращает значения флагов заданных идентификаторами пунктов меню.
    GetMenuString Возвращает метку заданного пункта меню.
    GetSubMenu Возвращает описатель меню, заданный его позицией.
    InsertMenu Добавляет после заданного меню идентификатора
    меню пункт меню с битовым массивом или текстом.
    IsOK Возвращает True, если меню имеет допустимый
    описатель.
    ModifyMenu Изменяет существующий пункт меню на битовый
    массив.
    operator HMENU Возвращает описатель меню.
    operator UINT Возвращает описатель меню.
    RemoveMenu Удаляет из меню пункт меню, если он не выводит
    подменю.
    SetMenuItemBitmaps Задает битовый массив, который должен выводиться при отметке и отмене отметки элемента меню.


    Функции-элементы


    Constructor Используемый по умолчанию конструктор объекта
    TMenuDescr.


    Функции-элементы


    Constructor Строит объект TMessageBar с шрифтом окна реквизита.
    SetHintText Устанавливает или очищает текст подсказки для
    строки меню.
    SetText Направляет сообщение в строке сообщений текстовому реквизиту для форматирования.
    GetDesiredSize Получает размер строки сообщения и настраивает
    его, если рисуется строка подсветки.
    GetInnerRect Вычисляет прямоугольник внутри обрамления и
    поля строки сообщения.
    PaintGadgets Настраивает строку сообщения и рисует строку
    подсветки. Затем отображает текст подсказки
    (если он задан) или заново отображает каждый
    реквизит.


    Функции-элементы


    Constructor Используемый по умолчанию конструктор объектов
    TMetaFileDC.
    Destructor Уничтожает данный объект.
    Close Закрывает данный объект DC метафайла. Устанавливает описатель в 0 и возвращает указатель на
    новый объект TMetaFilePict.


    Функции-элементы


    Constructor Создает объект TMetaFilePict с описателем, установленным в заданный аргумент.
    Destructor Уничтожает данный объект.
    GetMetaFileBits Возвращает описатель глобального блока памяти,
    который содержит данный метафайл в виде битового набора.
    GetMetaFileBitsEx Получает содержимое метафайла формата Windows, связанного с данным объектом, и копирует его в
    буфер данных.
    IsOK Возвращает True, если описатель данного объекта отличен от 0.
    operator HMETAFILE() Операция преобразования типа, возвращающая описатель Handle.


    Функции-элементы


    Constructor Строит объект TModule из DLL ObjectWindows или
    программы в LibMain либо WinMain.
    Destructor Уничтожает объект TModule и удаляет lpCmdLine.
    AccessResource Находит заданный ресурс (лучше использовать
    FindResource.
    AllocResource Загружает ресурс в память (лучше использовать
    LoadResource).
    CopyCursor Копирует заданный в hCursor курсор и возвращает описатель на него.
    CopyIcon Копирует заданную пиктограмму, возвращая описатель на нее.
    Error Обрабатывает ошибки, идентифицированные значением ошибки, или вызывается в случае исключительной ситуации.
    ExecDialog Выполняет диалоговое окно.
    FindResource По заданному идентификатору и типу находит ресурс, возвращая описатель на него.
    GetClientHandle Получает описатель на клиентное окно.
    GetClassInfo Используется для организации подклассов и получает информацию о заданном классе окна.
    GEtInstance Возвращает описатель экземпляра данного модуля.
    GetInstanceData Получает данные из уже выполняющегося экземпляра приложения.
    GetModuleFileName Возвращает расширенное имя файла (маршрут) заданного загруженного модуля.
    GetModuleUsage Возвращает счетчик ссылки модуля, который увеличивается при каждом вызове на 1.
    GetName Получает имя модуля.
    GetParentObject Получает описатель родительского окна.
    GetProcAddress Получает адрес экспортированной функции.
    InitModule Выполняет необходимую для данного модуля инициализацию экземпляра.
    IsLoaded Возвращает ненулевое значение, если экземпляр
    загружен.
    LoadAccselerators Загружает для заданного ресурса таблицу оперативных клавиш (если она не загружена).
    LoadBitmap Загружает заданный идентификатором ресурс битового массива.
    LoadCursor Загружает в память заданный идентификатором
    ресурс курсора и возвращает его описатель.
    LoadIcon Загружает в память заданными именем ресурс
    пиктограммы.
    LoadMenu Загружает в память заданный идентификатором
    ресурс меню.
    LoadResource Загружает указанный ресурс в память и возвращает описатель содержащего его блока памяти.
    LoadString Загружает в указанный буфер заданный идентификатором строковый ресурс.
    LowMemory Всегда возвращает 0 (устаревшая функция).
    MakeWindow Вместо этой функции используйте Create из TWindow.
    operator HINSTANCE Возвращает описатель приложения Windows или представленный TModule модуль DLL.
    RestoreMemory Восстанавливает память (устаревшая функция).
    SetInstance Устанавливает описатель экземпляра данного модуля.
    SetResourceHandle Используется для 16-разрядных приложений и инсталлирует загружающую ресурсы функцию обратного вызова. Возвращает указатель на ранее
    инсталлированный обработчик ресурсов.
    SizeOfResource Возвращает размер указанного ресурса (в байтах.
    ValiwWindow Возвращает описатель допустимого окна.


    Функция Error

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

    Функция IsValid

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

    Функция IsValidInput

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

    Функция Valid

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

    Справочное руководство по ObjectWindows

  • Объекты приложений


  • Интерфейсные объекты


  • Оконные объекты


  • Объекты меню


  • Объекты диалоговых блоков


  • Объекты Doc/View


  • Объекты управляющих элементов


  • Реквизиты и объекты окон реквизита


  • Объекты принтера


  • Графические объекты


  • Объекты проверки допустимости


  • Управляющие объекты Visual Basic


  • Справочное руководство по ObjectWindows 2.0 для С++


  • Начиная с TApplication ...


  • Начиная с TEdgeConstraint ...


  • Начиная с TMDIChild ...


  • Начиная с TRadioButton ...


  • Графические объекты

    Ниже описываются инкапсуляция в ObjectWindows 2.0 GDI Windows. ObjectWindows облегчает использование графических объектов
    и функций GDI.
    Некоторые приложения, такие как графические приложения и задачи обработки изображений, требуют использования графики. Эта
    графика может быть в форме линий, форм, текста или побитовых
    (растровых) отображений. Для предоставления приложениям функциональных возможностей работы с графикой Windows имеет набор функций, называемых интерфейсом с графическими устройствами (GDI).
    GDI может рассматриваться как графический пакет, который используют приложения Windows для представления и манипуляций с графикой. Функции GDI дают вашему приложению возможности рисования, не
    зависящие от используемого устройства представления. Например, вы
    можете использовать одни и те же функции GDI для написания программ для дисплеев EGA и VGA или для принтера PostScript. Независимость от устройств достигается с помощью использования драйверов устройств, переводящих вызовы функций GDI в команды, понятные
    использующемуся устройству вывода.

    Групповые блоки

    В своей простейшей форме групповой блок помечается как статический прямоугольник, визуально группирующий другие управляющие
    элементы.
    Конструктор TListBox имеет 7 стандартных параметров конструктора объекта управляющего элемента (родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, необязательный идентификатор библиотеки), плюс текстовую строку,
    помечающую группу.
    Обычно групповой блок объединяет другие управляющие элементы, однако он может также логически объединять группы кнопок. Эти
    логические группы выполняют автоматическую отмену выбора (BS_AUTOCHECKBOX, BS_AUTORADIOBUTTON). Чтобы добавить к групповому блоку кнопку с зависимой или независимой фиксацией, передайте указатель на объект группового блока при вызове конструктора кнопки.
    При наступлении события, которое может изменить выбор в
    групповом блоке Windows посылает родительскому окну группового
    блока уведомляющее сообщение. Родительское окно может перехватывать сообщение для группового блока в целом, а не отвечать на выбор отдельных кнопок. Для определения задействованного управляющего элемента вы можете получить текущее состояние каждой кнопки.

    Характеристики 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.

    Инициализация основного окна

    По умолчанию 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.

    Интерфейсные объекты

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

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

    После наступления события 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) можно использовать специализированный администратор документа.

    Использование библиотек управляющих элементов

    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 запрещает.

    Использование буферов передачи

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

  • Определите соответствующее окно или диалоговый блок.

  • Передайте данные.


  • Использование диалогового блока в качестве основного окна

    Чтобы использовать диалоговый блок в качестве основного окна, лучше создать окно-рамку с диалоговым блоком в качестве клиентного окна. Для этого создайте производный от Tapplication класс. Кроме конструктора, единственное, что для этого требуется,
    это функция InitMeinWindow, в которой строится объект окна-рамки.
    Конструктор TFrameWindow включает автоматическое создание объекта
    диалогового блока, который вы передаете в качестве клиента.
    Требуется также обеспечить, чтобы объект диалогового блока
    имел определенные атрибуты:
  • Уничтожение диалогового объекта не уничтожает рамки. Ее
    нужно уничтожать явным образом.

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

  • Вы не можете задать заголовок диалогового окна в самом ресурсе. Его нужно задавать через окно-рамку.

  • Стиль диалогового окна нужно задать как WS_VISIBLE (видимое), WS_CHILD (диалоговое окно), и без кнопок максимизации/минимизации, системных меню или любых других стандартных атрибутов окна-рамки.


  • Использование диалоговых блоков

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

    Тип Класс ObjectWindows
    Цвет TChooseColorDialog
    Шрифт TChooseFontDialog
    Открытие файла TFileOpenDialog
    Сохранение файла TFileSaveDialog
    Поиск строки TFindDialog
    Ввод от пользователя TInputDialog
    Диалог прерывания принтера TPrinterAbortDialog
    Управление принтером TPrintDialog
    Замена строки TReplaceDialog


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

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

    Использование объектов диалоговых блоков

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

  • выполнения диалогового блока;

  • закрытия диалогового блока;

  • уничтожения объекта.


  • Использование объектов меню

    Класс TSystemMenu ObjectWindows позволяет вам модифицировать
    системное меню окна. Этот класс является производным от TMenu и
    отличается от него только конструктором, в аргументах которого
    указывается описатель окна и флаг. Если флаг имеет значение True,
    то текущее системное меню удаляется, и на его место помещается
    объект меню, представляющий немодифицированное меню. В случае
    False объект меню представляет текущее системное меню. Для работы
    с системным меню можно использовать все функции-элементы, наследуемые из TMenu.
    Для создания всплывающего меню, которое вы можете добавить к
    окну или существующей системе меню, можно использовать TPopupMenu. Этот производный от TMenu класс также отличается от него только конструктором. После создания всплывающего меню для вывода "свободно плавающего меню" можно использовать TrackPoupMenu.
    В ObjectWindows 2.0 для присваивания ресурсом меню используется функция AssignMenu, которая определяется в классе TFrameWindow и доступна в любом производном классе.

    Использование общих диалоговых блоков

    Общие диалоговые блоки инкапсулируют функциональные возможности общих диалоговых блоков Windows. Эти диалоговые блоки позволяют пользователю выбирать цвета, шрифты, имена файлов, параметры печати, находить и заменять строки и т.д. Вы можете строить, выполнять и уничтожать их.
    Каждый общий диалоговый блок имеет вложенный класс TData,
    который содержит некоторые служебные функции-элементы и данные,
    соответствующие каждому типу общего диалогового блока. Например,
    TChooseCologDialog:TData имеет функции-элементы для выбора цветов и массив цветов. Однако TData имеют два элемента, общих для
    всех вложенных классов TData. Элемент Flag представляет собой набор специальных флагов, управляющих внешним видом и поведением
    диалогового блока, а Error содержит код ошибки, которая происходит при обработке общего диалогового блока, или 0.
    Каждый класс общего диалогового блока имеет конструктор, которому передается указатель на объект родительского окна, ссылка
    на вложенный класс TData данного класса и дополнительные необязательные параметры, содержащие шаблон диалогового блока, строку
    заголовка и модуль принтера.
    После построения объекта общего диалогового блока его следует выполнить (если это режимный диалоговый блок) или создать (если он безрежимный). Создание выполняется с помощью функции Create, а выполнение - Execute. К безрежимным относятся типы Color,
    Font, File open, File save и Printer, а безрежимным - Find и
    Find/replace. Успешность выполнения Execute проверяется по возвращаемому значению.

    Использование оконных объектов

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

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

    Чтобы использовать объекты проверки допустимости данных, вы
    должны сначала построить редактируемый управляющий элемент, затем
    объект проверки допустимости, и присвоить этот объект редактируемому управляющему элементу. Редактируемый управляющий элемент
    знает, в какие моменты нужно вызывать функции-элементы объекта
    проверки допустимости.
    Редактируемые управляющие элементы являются экземплярами
    класса TEdit. Так как объекты проверки допустимости не являются
    интерфейсными объектами, их конструкторы требуют только информацию, достаточную для задания критерия проверки допустимости. Каждый объект редактируемого управляющего элемента имеет элемент
    данных, указывающих на объект проверки допустимости. Полный пример, показывающий использование стандартных объектов проверки допустимости, вы можете найти в OWLAPI\VALIDATE.

    Использование управляющих элементов VBX

    Чтобы использовать в приложении ObjectWindows стандартные
    управляющие элементы VBX, нужно выполнить следующие шаги:
  • В функции OwMain вызовите перед функцией Run объекта приложения функцию VBXInit. После вызова функции Run объекта
    приложения вызовите функцию VBXTerm. В качестве параметра
    функции VBXInit задается экземпляр приложения.

  • Создайте производный класс, смешивающий интерфейс базового
    класса с TVbxEventHandler. Ваш базовый класс - это класс,
    в котором вы хотите выводить управляющий элемент. Если вы
    используете управляющий элемент в диалоговом окне, вам
    нужно смешать его с TDialog.

  • Постройте для родительского объекта таблицу реакции, включив в нее все соответствующие события из управляющего элемента. Используйте для этого макрокоманду EV_VBXEVENTNAME.

  • Создайте родительский объект управляющего элемента. Управляющий элемент можно построить управляющий элемент при
    создании родительского окна или позволить родительскому
    объекту самому построить управляющий элемент.


  • Элементы данных


    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.


    Элементы данных


    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 или заменяет безрежимное диалоговое окно.


    Элементы данных


    Origin Содержит позицию файла в начале вывода.


    Элементы данных


    CmdLine Указывает на копию аргументов командной строки, передаваемых при построении объекта данного класса.
    cmdShow Указывает вывод окна в полный размер или в виде пиктограммы.
    HAccTable Используется для обратной совместимости.
    hPrevinstance Указатель на выполняемый ранее экземпляр приложения Windows.


    Элементы данных


    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 Флаг, указывающий, должен ли родительский объект уведомляться об изменении состояния кнопок
    группового блока.


    Элементы данных


    buffer Указатель на буфер, содержащий получаемый от
    пользователя текст.
    BufferSize Содержит размер буфера, возвращающего вводимые
    пользователем данные.
    prompt Указывает на подсказку, выводимую в диалоговом
    окне ввода.


    Элементы данных


    enum StockId Перечисляет атрибуты объекты кистей.
    Stocks[] Единый статический массив перьевых объектов
    Windows, обслуживающий все объекты TBrush.


    Элементы данных


    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 битовый массив.


    Элементы данных


    Handle Содержит описатель меню.
    ShouldDelete Устанавливается в True, если деструктор долен удалять описатель меню.


    Элементы данных


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


    Элементы данных


    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.


    Элементы данных


    PageNum Число страниц, выводимых в окне предварительного просмотра.
    PrintDC Описатель используемого для печати контекста
    устройства.
    PrintExtent Содержит размеры страницы в логических единицах.
    Printout Ссылка на объект TPrintout.


    Элементы данных


    TShadowStyle Перечисляет стили теней командной кнопки
    enum (двойная или одинарная).
    TState enum Перечисляет три позиции кнопки (нажата, отжата и в неопределенном состоянии).
    TType enum Перечисляет типы командных кнопок (с зависимой или независимой фиксацией).
    BitmapOrigin Указывает на координаты x и y битового массива для данной командной кнопки.
    NotchCorners Инициализируется значением 1 и равно 1, если
    кнопка не имеет скошенные углы.
    Pressed Инициализируется 1 и равно 0 при нажатии кнопки.
    Repeat Инициализируется 1 и хранит значения клавиатурных событий.
    ResldСодержит идентификатор ресурса для битового
    массива командной кнопки.
    ShadowStyle Содержит стиль тени для кнопки (1 - одинарная
    и 2 - двойная).
    StateСодержит состояние кнопки (нажата, отжата, не
    определено).
    Type Содержит тип кнопки ( командная, с зависимой
    или независимой фиксацией).
    UIOBitmap Содержит связанный с кнопкой битовый массив


    Элементы данных


    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, используемую тото, чтобы отличить конструктор эллипса от
    конструктора копирования прямоугольника.


    Элементы данных


    Dispatcher Абстрактный тип диспетчера, указывающий на одну из функций диспетчера.
    Id Содержит ресурс меню или оперативной клавиши
    для функции реакции на сообщения.
    Msg Содержит идентификатор сообщения.
    NotifyCode Содержит код уведомления для записи таблицы
    реакции (код кнопки, комбинированного элемента, редактируемого управляющего элемента или блока списка).
    Pmf Указывает на обработчик сообщения или функцию-элемент.
    T Тип общей функции-элемента, отвечающей на уведомляющие сообщения.


    Элементы данных


    Bitmap Указывает на битовый массив.
    CSizeРазмер ячейки в массиве.
    Offs Смещение верхнего левого угла ячейки массива
    от верхнего левого угла битового массива.
    ShouldDelete Равно True, если деструктор должен удалить битовый массив, связанный с массивом ячеек.


    Элементы данных


    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, то разрешаются все строки).


    Элементы данных


    TAlign Перечисляет атрибуты выравнивания текста.
    Align Атрибут выравнивания текста.
    NumChars Содержит число символов текста.
    TextLen Содержит длину текста.


    Элементы данных


    GroupЕсли кнопка с независимой фиксацией принадлежит к групповому блоку (TGroupBox), то Group указывает на этот объект. Иначе это 0.


    Элементы данных


    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.


    Элементы данных


    cc Содержит длину структуры TChooseColorDialog,
    владельца данного диалогового окна и блок данных с шаблоном диалога. Указывает также на
    массив из 16 RGB-значений.
    Data Ссылка на переданный конструктору объект
    TData.
    SetRGBMsgId Содержит идентификатор переданного SetRGBColor
    зарегистрированного сообщения.
    DialogFunction Возвращает True, если сообщение обработано.
    DoExecute Копирует флаги и цвета в Data и возвращает 0.
    EvSetRGBColor Отвечает на переданное SetRGBColor сообщение (обработчик событий).


    Класс Application::TXInvalidMainWindow (applicat.h)

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

    Класс BitmapGadget (bitmapga.h)

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

    Класс BitSet (bitset.h)

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

    Класс CreatedDC (dc.h)

    Этот абстрактный класс TDC служит базовым классом для создаваемых или удаляемых объектов DC (контекст устройства). Он выполняет основную работу по созданию и удалению HDC с помощью CreateDC и DeleteDC.

    Класс фильтрации ввода

    Простейший способ обеспечения включения в поле только допустимых данных состоит в обеспечении ввода пользователем только допустимых данных. Например, числовое поле ввода может быть ограничено вводом пользователем только цифровых данных.
    Объект фильтра проверки допустимости ObjectWindows представляет общий механизм, ограничивающий вид символов, которые пользователь может вводить в данном управляющем элементе редактирования. TFilterValidator - это простой механизм проверки допустимости, проверяющий данные по мере ввода их пользователем. Его конструктор имеет только один параметр - набор допустимых символов.
    TFilterValidator переопределяет IsValidInput таким образом,
    чтобы она возвращала True, если все символы строки содержатся в
    наборе допустимых символов. Редактируемый управляющий элемент
    вставляет символы только в том случае, если IsValidInput возвращает True. Производные классы, такие как TRangeValidator, могут
    комбинировать фильтрацию ввода с другими видами проверки допустимости строки.

    Класс 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 выводит окно сообщения, указывающее, что строки нет в списке.

    Класс 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 освобождает занимаемую объектом управляющего элемента память.

    Класс TCursor (gdiobjec.h)

    Этот класс, производный от TGdiobject, представляет объектный класс курсора GDI. Конструкторы TCursor могут создавать курсоры из ресурсов или на основе точной информации.

    Класс TCursor

    Этот класс инкапсулирует описатель курсора и конструктор для
    создания экземпляра объекта TCursor. Вы можете использовать класс
    TCursor для построения курсора из ресурса или явной информации.
    Построить курсор можно несколькими способами: из существующего объекта TCursor, из ресурса в текущем приложении, из ресурса
    в другом приложении или на основе заданного размера и явной информации. Для 32-разрядных приложений можно также использовать
    два специальных конструктора, один из которых имеет два параметра
    (указатель на массив буферов, содержащих биты данных курсора, и
    размера - числа бит в буфере), а другой - один параметр (структуру ICONINFO). ~TCursor удаляет пиктограмму и освобождает занимаемую ей память.
    Обращаться к TCursor можно через HCURSOR. Чтобы получить
    HCURSOR из объекта TCursor, используйте операцию HCURSOR. В
    32-разрядных приложениях доступна также функция TIcon GetIconInfo
    с единственным параметром - указателем на структуру ICONINFO. Она
    заполняет структуру ICONINFO и возвращает True в случае успешного
    выполнения.

    Класс 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)

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

    Класс 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.

    Класс 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 конструктора используется для
    задания высоты и ширины реквизита.

    Класс 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)

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

    Класс TStringLookupValidator (validate.h)

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

    Класс TSystemMenu (menu.h)

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

    Класс TTextGadget (textgadg.h)

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

    Класс TTextGadget

    TTextGadget используется для вывода в окне реквизитов текстовой информации. Вы можете задать число символов, которые должны
    выводиться в реквизите, а также выравнивание в нем текста.
    В конструкторе TTextGadget задаются идентификатор реквизита,
    стиль его рамки, выравнивание текста, число выводимых символов и
    текст реквизита. ~TTextGadget автоматически освобождает занимаемую текстом реквизита память.
    Получить и установить текст реквизита вы можете с помощью
    функций GetText и SetText.

    Класс 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).

    Класс 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)

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

    КлассTMDICliten (mdi.h)

    Клиентные окна многодокументального интерфейса (MDI), представленные объектом TMDIClient, управляют дочерними окнами MDI,
    для которых родительским является TMDIFrame. Это потоковый класс.

    Классы реквизитов 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 выполняют эти задачи самостоятельно.
    Во многих случаях вы можете непосредственно создать экземпляры перечисленных классов. Однако иногда может потребоваться
    создать производные классы со специализированном поведением.

    Кнопки с зависимой и независимой фиксацией

    Кнопка с независимой фиксацией (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.

    Командные кнопки

    Командные кнопки выполняют действия при каждом "нажатии"
    (активизации) такой кнопки. Существует два вида таких кнопок: заданные по умолчанию и остальные. Заданная по умолчанию командная
    кнопка имеет стиль BS_DEFPUSHBUTTON и обрамление, указывающее реакцию по умолчанию. Другие кнопки имеют стиль BS_PUSHBUTTON. Примеры управляющих элементов типа командных кнопок вы можете найти
    в подкаталоге EXAMPLES\OWL\OWLAPI\BWCC.
    Один и конструкторов TListBox имеет 7 стандартных параметров
    конструктора объекта управляющего элемента (родительское окно,
    идентификатор ресурса, размеры и положение управляющего элемента,
    необязательный идентификатор библиотеки), плюс текстовую строку
    (метку управляющего элемента) и булевский флаг, указывающий, является ли кнопка заданной по умолчанию.
    Когда пользователь щелкает на командной кнопке "мышью", родительское окно получает уведомляющее сообщение. Если родительский оконный объект перехватывает сообщение, то он может отвечать
    на эти события, выводя диалоговое окно, сохраняя файл и т.д. Для
    перехвата и реакции на сообщения командных кнопок определите для
    кнопки функцию реакции на команду.

    Комбинированные блоки

    Управляющий элемент типа комбинированного блока представляет
    собой комбинацию двух других управляющих элементов - блока списка
    и редактируемого или статического управляющего элемента. Он выполняет те же функции, что и блок списка - позволяет пользователю
    щелчком "мышью" выбрать один текстовый элемент из прокручиваемого
    списка. Редактируемый управляющий элемент в верхней части блока
    списка предусматривает еще один механизм выбора, позволяя пользователям набирать текст нужного элемента, который автоматически
    выделяется в области блока списка. TComboBox является производным
    от TListBox и наследует его функции-элементы для модификации, опроса и выбора элементов списка. Кроме того, TComboBox предусматривает функции-элементы для манипуляции со списком комбинированного блока, который в некоторых типах комбинированного блока может раскрываться по запросу. Примеры можно найти в подкаталоге
    OWLAPPS\OWLCMD.

    Макрокоманды командных сообщений

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

    Макрокоманды сообщений Windows

    ObjectWindows предусматривает макрокоманды для всех стандартных сообщений Windows. Вы можете использовать их для обработки стандартных сообщений в любой их своих функций-элементов. Эти макрокоманды имеют префикс EV_.
    Эти стандартные макрокоманды передают сообщения функциям с
    предопределенными именами, имя которой соответствует имени сообщения, но вместо WM_ подставляется Ev, например, WM_LBUTTONDOWN
    передается EvButtonDown.
    Благодаря этим макрокомандам Windows автоматически обрабатывают сообщение, то есть сообщения, которые обычно записываются
    как параметры LPARAM и WPARAM разбиваются на составные части. Они
    позволяют также переносить приложения с 16- на 32-битовую платформу и наоборот. Чтобы использовать стандартную макрокоманду сообщения Windows, добавьте в свой класс функцию-элемент с корректным именем и сигнатурой.

    Макрокоманды уведомления от дочерних объектов

    Макрокоманды уведомления от дочерних объектов предусматривают несколько различных способов обработки сообщений уведомления
    от этих объектов. В одной функции вы можете обрабатывать уведомляющие функции от нескольких дочерних объектов, передавать все
    уведомляющие коды от дочернего окну отвечающему окну или обрабатывать код уведомления в дочернем объекте.
    Чтобы облегчить связь с дочерними управляющими элементами,
    можно использовать макрокоманды. Эти макрокоманды предусматривают
    различные методы для обработки уведомляющих кодов дочерних объектов. Если вы хотите обрабатывать уведомления в родительском окне,
    используйте EV_CHILD_NOTIFY, которые передает код уведомления в
    качестве параметра и допускает обработку уведомления нескольких
    дочерних объектов в одной функции. Это позволяет также избежать
    обработки каждого уведомляющего сообщения в отдельной таблице реакции для каждого управляющего элемента. Вместо этого сообщение
    обрабатывается в родительском объекте, позволяя, например, диалоговому окну обрабатывать все свои управляющие элементы в одной
    таблице реакции.

    Манипуляция дочерними окнами

    Вы можете написать функции элементы, осуществляющие итерацию
    по дочерним окнам некоторого окна с целью выполнения некоторых
    действий. Например, вам нужно будет проверить все дочерние блоки
    проверки в окне. В этом случае, используйте наследуемую из 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.

    Методы управляющих элементов VBX

    Методы управляющих элементов VBX - это функции, содержащиеся
    в каждом управляющим элементом VBX и вызывающие определенное
    действие. TVbxControl обеспечивает совместимость с методами Visual Basic 1.0 Move, Refresh, AddItem и Remove.
    Функция Move помещает управляющий элемент в точку с заданными координатами и задает его размер в элементах изображения.
    Функция Refresh обновляет область вывода управляющего элемента.
    AddItem добавляет заданный элемент к списку управляющих элементов
    и дает ему указанный индекс. Функция RemoveIndex удаляет элемент
    с заданным индексом.

    Модификация и опрос комбинированного блока

    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 Служат для получения и установки значений флага.


    и Windows NT. ObjectWindows позволяет

    ObjectWindows 2.0 - это прикладная среда Borland С++ для

    Windows 3.1, Win32S и Windows NT. ObjectWindows позволяет быстро

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

  • Легкую переносимость между 16- и 32-разрядными платформами.


  • Автоматизированную обработку сообщений.


  • Надежную обработку особых ситуаций и ошибок.


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


  • Инкапсулирует объекты GDI Windows.


  • Имеет классы Doc/View для простой абстракции и вывода данных.


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

    просмотра печатаемой информации на экране.


  • Поддерживает управляющие элементы VisualBasic.


  • Имеет средства проверки допустимости ввода.


  • Назначение интерфейсных объектов

    Одна из наибольших трудностей программирования в Windows
    состоит в том, что можно запутаться в управляющих элементах.
    Иногда вы посылаете окну сообщение, в другой раз вызываете функцию API. При работе с различными видами элементов внешне похожие
    операции часто различаются. ObjectWindows значительно уменьшает
    эти трудности, предусматривая объекты, инкапсулирующие интерфейсные элементы. Это избавляет вас от необходимости иметь дело непосредственно с Windows и обеспечивает более единообразный интерфейс для управления интерфейсными элементами.
    Интерфейсные объекты предусматривают функции-элементы для
    создания, инициализации, уничтожения и управления соответствующим
    интерфейсным элементом. Многие детали программирования в Windows
    берут на себя функции-элементы.
    Интерфейсные объекты инкапсулируют также данные, необходимые
    для взаимодействия с интерфейсным элементом. Связь между интерфейсным объектом и интерфейсными элементами аналогична связи между файлом на диске и потоком С++. Объект потока только представляет файл на диске: вы можете манипулировать этим файлом, манипулируя объектом потока.

    Объект 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 объекта вы можете в любое время проверить содержимое любого редактируемого управляющего элемента.

    Объекты управляющих элементов

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

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

    Обработка событий 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.

    Окна MDI

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

    Окна-рамки

    Окна-рамки (объекты класса 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 из каталога примеров программ.

    Его диалоговое окно позволяет изменить ограничения каждого из

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

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

    Оконные объекты

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

  • Окна-рамки.

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

  • Окна MDI.

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

    Описание и определение таблиц реакции

    Поскольку таблица реакции является членом класса 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;

    Определение буфера передачи

    Буфер передачи - это структура, каждый элемент которой соответствует участвующему в передаче управляющему элементу. Эти элементы называются переменными экземпляра. В передаче могут участвовать не все управляющие элементы.
    Чтобы определить буфер передачи, определите для каждого
    участвующего управляющего элемента переменную экземпляра. Каждый
    тип управляющего элемента имеет разную информацию для хранения.
    Так как блокам списков требуется передавать различные части
    информации (строки, элементы данных и индексы выбора), буфер передачи использует класс TListBoxData с несколькими функциями-элементами для работы с информацией блока списка (AddItemData, AddString, AssStringItem, GetSelString, GetSelStringLenght, ResetSelections, Select и SelectString) и элементами данных (ItemDatas,
    SelIndices и Strings).
    Для передачи данных комбинированного блока используется
    класс TComboBoxData с элементами данных ItemDatas, Selection и
    Strings и функциями-элементами AddItemData, AddString и AddStringItem.

    Определение соответствующего окна или диалогового блока

    Окно или диалоговый блок, использующие механизм передачи,
    должны строить свои объекты управляющих элементов в том порядке,
    в котором определены элементы соответствующего буфера передачи.
    Для разрешения передачи используйте вызов SetTransferBuffer с
    указателем на буфер передачи.
    Так как объекты диалоговых окон получают свои определения и
    определения своих управляющих элементов из ресурса, вам следует
    строить объекты управляющих элементов с помощью конструкторов,
    использующих идентификаторы ресурса. Чтобы явно исключить управляющий элемент из механизма передачи, используйте функцию-элемент
    DisableTransfer.
    Для управляющих элементов, которые строятся в окне, механизм
    передачи по умолчанию запрещен. Чтобы разрешить его, вызовите
    функцию-элемент EnableTransfer.

    Определение записей таблицы реакции

    Записи таблицы реакции связывают событие Windows с конкретной функцией. Когда окно или управляющий элемент получает сообщение, оно проверяет свою таблицу реакции и находит запись для данного сообщения. Если она присутствует, то сообщение передается
    данной функции. Если нет, то оно передается выше родительскому
    объекту, и выполняется обработка, предусмотренная в ObjectWindows
    по умолчанию. ObjectWindows предусматривает для таблицы реакции
    набор макрокоманд:
  • Макрокоманды стандартных сообщений, которые позволяют обрабатывать командные сообщения и маршрутизировать их заданной функции.

  • Стандартные макрокоманды Windows для обработки сообщений
    Windows.

  • Зарегистрированные макрокоманды (сообщения, возвращаемые
    RegisterWindowMessage).

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

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

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

  • Уведомления управляющих элементов VBX.


  • Опрос объектов меню

    TMenu имеет ряд функций-элементов и операций, с помощью которых вы можете получать информацию об объекте и его меню. Это operator UINT и operator HMENU (возврат описателя меню), IsOK (проверка допустимости описателя меню), GetMenuItemCount (число
    пунктов меню), GetMenuCheckMarkDimensions (размер битового массива для вывода отметки меню), GetMenuItemID (идентификатор пункта в заданной позиции), GetMenuState (флаги состояния заданного пункта), GetMenuString (текст заданного пункта меню), GetSubMenu
    (описатель меню в заданной позиции).

    Организация класса 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, то существующая терминология сохранилась. Однако в функции внесены некоторые улучшения.

    Отображаемые элементы

    Объекты отображаемых элементов служат для представления объектов документов. Без такого объекта вы не могли бы видеть документ и работать с ним. Когда вы в шаблоне документа связываете
    документ с объектом отображаемого элемента, то получаете функциональный блок данных и кода, которые обеспечивает графическое
    представление записанных в документе данных и способ взаимодействия с этими данными и их изменения.
    Отделение документа от отображаемого элемента допускает также значительную гибкость в том, как и когда модифицируются данные
    документа. Хотя работа с данными осуществляется через отображаемый элемент, отображаемый элемент только передает изменения в документ. Затем он позволяет определить, нужно ли зафиксировать изменения в документе, или отбросить их.
    Еще одно преимущество использования объектов отображаемых
    элементов по сравнению с методом фиксированного вывода текста
    состоит в том, что такие объекты предлагают программисту и пользователю ряд различных способов вывода и работы с одним и тем же
    документом. Вы можете предусмотреть для документа три или четыре
    отображаемых элемента.
    Базовые функции отображаемого элемента обеспечивает класс
    TView.

    Отображение интерфейсного элемента

    Создание объекта и соответствующего элемента не означает,
    что вы будете что-то видеть на экране. Когда создается интерфейсный элемент, Windows проверяет, включает ли стиль элемента WS_VISIBLE. Если да, то он выводится на экран. В противном случае элемент создается, но не выводится. WS_VISIBLE и другие стили устанавливаются или сбрасываются в конструкторе, путем их установки
    или сброса в элементе данных интерфейсного объекта Attr.Style.
    Создаваемый интерфейсный элемент выводится на экран только в случае установки стиля WS_VISIBLE.
    Определить видимость интерфейсного объекта можно с помощью
    вызова IsWindowVisible. В случае видимости объекта эта функция
    возвращает True.
    В любое время после создания, элемент может быть показан или
    спрятан вызовом функции-элемента интерфейсного объекта Show.

    Печать документа

    Windows интерпретирует распечатку как последовательность команд, поэтому объект распечатки должен превращать документ в последовательность образов страниц. Объект распечатки должен иметь
    возможность делать следующее:
  • устанавливать параметры печати;

  • вычислять общее число страниц;

  • отображать каждую страницу в контекст устройства;

  • указывать, что больше страниц нет.


  • Печать каждой страницы

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

  • Возможности устройства. Хотя большинство видеоустройств
    поддерживают все операции GDI, некоторые принтеры этого не
    делают. Для выполнения сложных задач вывода ваша программа
    должна вызывать функцию API Windows GetDeviceCaps, которая
    возвращает важную информацию о возможностях конкретного
    устройства вывода.


  • Передача данных

    В большинстве случаев передача данных в окно и из него выполняется автоматически, но вы можете в любой момент передать
    данные явным образом.
    Передача в окно происходит автоматически при построении
    оконного объекта. Для создания интерфейсного элемента, представляющего оконный объект, конструктор вызывает SetupWindow. Затем
    для загрузки данных из буфера передачи вызывается TransferData.
    SetupWindow оконного объекта вызывает функции SetupWindow каждого
    дочернего окна, так что дочерние окна также могут передавать свои
    данные. Так как родительское окно устанавливает свои дочерние окна в порядке их построения, данные в буфере передачи должны появляться в том же порядке.
    Когда режимный диалоговый блок получает командное сообщение
    с идентификатором ID или IDOK, он автоматически передает данные
    из управляющих элементов в буфер передачи. Обычно это сообщение
    указывает, что пользователь выбрал для закрытия диалогового блока
    кнопку OK, так что диалоговый блок автоматически обновляет буфер
    передачи. Затем, если вы снова выполняете диалоговое окно, они
    передаются из буфера передачи в управляющие элементы.
    В любой момент вы можете явно передать данные в любом направлении. Для этого используется функция-элемент TransferData,
    параметре которой задается tdSetData (передача из буфера) или
    tdGetData (передача в буфер).
    Вы можете модифицировать способ передачи конкретным управляющим элементом своих данных или включить в механизм передачи новый определяемый вами управляющий элемент. В любом случае это
    требуется написания для вашего объекта управляющего элемента
    функции-элемента Transfer.

    Переопределение функций-элементов класса проверки допустимости

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

    Поиск информации о событии

    Стандартный способ интерпретации возвращаемой событием информации можно найти в документации по управляющему элементу VBX.
    TVbxControl предусматривает ряд методов для получения информации
    о событии.
    Вы можете определить общее число событий, которые посылает
    управляющий элемент VBX, с помощью функции GetNumEvents. События
    индексируются начиная с 0.
    Получить имя любого события в данном диапазоне вы можете с
    помощью функции-элемента TVbxControl GetEventName, которая имеет
    один параметр (индекс) и возвращает строку с именем события. Индекс события по его имени можно получить с помощью GetEventIndex.

    Полосы прокрутки

    Полосы прокрутки - это основной механизм изменения пользовательского отображаемого элемента в окне приложения, блока списка
    или комбинированного блока. Однако для выполнения специальной задачи вы можете построить отдельную полосу прокрутки. Для этого
    используются объекты TScrollBar. Примеры вы можете найти в подкаталоге EXAMPLES\OWL\OWLAPI\SCROLLER.
    Конструктор TScrollBar имеет 7 стандартных параметров конструктора объекта управляющего элемента (родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, и
    также необязательный идентификатор библиотеки), а также параметр
    флага, определяющий, является ли полоса прокрутки горизонтальной.
    Если вы задаете нулевую высоту или ширину полосы прокрутки, то
    Windows устанавливает стандартные ширину или высоту.
    Конструктор TScrollBar строит полосы прокрутки со стилем
    SBS_HORZ (горизонтальная) или SBS_VERT (вертикальная полоса). С
    помощью Attr.Style объектов полосы прокрутки вы можете задать дополнительные стили.

    Построение администратора документа

    Конструктор TDocManager имеет единственный параметр, который
    используется для установки режима администратора документа:
  • Однодокументального интерфейса (SDI), в котором вы можете
    каждый раз открывать только один документ. При открытии
    нового документа администратор документа пытается закрыть
    предыдущий документ.

  • Многодокументального интерфейса (MDI), где вы можете одновременно работать с несколькими документами и отображаемыми элементами или одним документом, представленным разными типами.

  • Чтобы открыть администратор документа в режиме SDI, нужно
    вызвать конструктор с параметром dmSDI, а в режиме MDI - с параметром dmMDI. Другие параметры конструктора задает построение для
    администратора документа собственное меню File, разрешают в меню
    File команду Save даже если документ не изменен и запрещают в меню File команду Revert. После построения администратора документа
    вы не можете изменить режим.

    Построение и уничтожение объектов управляющих элементов

    Построение объекта управляющего элемента отличается от построения любого другого дочернего окна. Обычно конструктор родительского окна вызывает конструкторы всех его дочерних окон. Кроме обычных связей, управляющие элементы взаимодействуют с родительскими окнами с помощью уведомлений. Чтобы построить и инициализировать объект управляющего элемента нужно:
  • добавить в родительское окно элемент данных - указатель на
    родительское окно;

  • вызвать конструктор объекта управляющего элемента;

  • изменить атрибуты управляющего элемент;

  • инициализировать управляющий элемент в 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 или в другом месте.

    Построение TView

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

    Приложения 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. Стиль их может
    зависеть от конкретного приложения.

    Проектирование шаблона документа

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

    Производные классы

    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 позволяют определить

    положение левой кнопки "мыши".

    Работа с администратором документа и отображаемыми элементами

    TDocument имеет две функции для работы с отображаемыми элементами - NotifyViews и QueryViews, для которых указывается три
    параметра (событие, параметр события, и TView*). Последний параметр позволяет вам исключить из запроса или уведомления и передать функции указатель на отображаемый элемент. Эти две функции
    являются основными средствами передачи информации между документом и его отображаемыми элементами.
    Обе функции могут работать с таблицами реакции отображаемого
    элемента. Функцию NotifyViews можно использовать для уведомления
    дочерних документов, их отображаемых элементов или вашего корневого документа об изменении данных, их обновлении или других событиях, которые должны отражаться на экране. Сначала эта функция
    вызывает с теми же параметрами функции NotifyViews всех дочерних
    документов. После этого событие и параметр передается отображаемым элементам документа. Функция возвращает булевское значение,
    передаваемое соответствующим отображаемым элементом.
    QueryViews также передает событие и сопровождающий параметр,
    но вместо True или False возвращает указатель на первый отображаемый документ, возвращающий True. Это позволяет найти отображаемый элемент, отвечающий некоторым условиям, а затем выполнить с
    ним некоторые действия. QueryViews останавливается на первом
    отображаемом элементе, возвращающим True.

    Работа с контекстами устройств

    При работе с GDI Windows для доступа ко всем устройства, от
    окон до принтеров и графопостроителей, следует использовать контекст устройства (DC) - поддерживаемую GDI структуру, которая содержит важную информацию об устройстве (основной и фоновый цвет,
    шрифт, палитру и др.). ObjectWindows 2.0 инкапсулирует информацию
    контекста устройства в нескольких классах контекста. Для всех
    этих классов базовым классом является TDC. TDC содержит большую
    часть необходимых для работы с контекстом устройства функций.

    Расширение функциональных возможностей документа

    Описываемые здесь функции в основном отвечают всем потребностям при работе с классом документа. Однако вы можете расширить
    функциональные возможности своего класса документа и ввести специальные функции для работы с данными, определения действий с получаемыми от пользователя данными и т.д. Для этого используются
    производные классы.
    Так как модель 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 с единственным параметром - строкой имени файла.

    Реакция на блоки списка

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

    Реакция на сообщения полосы прокрутки

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

    Редактируемые управляющие элементы

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

  • динамический вывод текста (приложением);

  • вырезание, копирование и вставку из буфера обмена;

  • многострочное редактирование (для текстовых редакторов).

  • Примеры содержатся в подкаталоге 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 типа. Если
    да, то элемент создается на основе существующего класса регистрации. Если нет, то объект автоматически регистрируется, а затем
    создает на базе только что зарегистрированного класса. Это освобождает программиста от необходимости регистрировать все оконные
    классы перед их использованием.

    Регуляторы и индикаторы

    Регуляторы (slider) - это специализированные объекты прокрутки. Класс TSlider является производным от TScrollBar. Регуляторы используются для позиционирования информации без прокрутки.
    TSlider имеет два производных класса - THSlider и TVSlider (вертикальная и горизонтальная версия).
    Индикаторы - это управляющие элементы, которые выводят на
    экран информацию о продолжительности или другую информацию о выполняющемся процессе. Индикаторы реализует класс TGauge, производный от TControl. Параметр конструктора определяет, хотите вы
    получить вертикальный или горизонтальный индикатор (вертикальные
    обычно используются для вывода аналоговой информации). Примеры
    таких управляющих элементов вы можете найти в подкаталоге
    EXAMPLES\OWL\OWLAPI\SLIDER.

    Реквизиты и объекты окон реквизита

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

    Родительские и дочерние интерфейсные элементы

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

    Шаблоны документов

    Шаблоны документа объединяют вместе классы документа и классы отображаемого элемента, создавая новый класс. Администратор
    документа поддерживает список шаблонов документа, который используется при создании нового экземпляра Doc/View. Ниже поясняется,
    как создавать и использовать шаблоны документов.

    Содержимое окон печати

    Простейшим видом генерируемой распечатки является копия окна
    (оконные объекты состоят из одной страницы и знают, как отображаться в контексте устройства). Чтобы создать объект распечатки
    окна, постройте объект и передайте строку заголовка и указатель
    на нужное окно.
    Часто требуется, чтобы окно создавало распечатку в ответ на
    команду меню. Пример вы найдете в программе PRINTING.CPP.

    Соответствие цветов интерфейса системным цветам

    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. Поскольку она заменяет отдельные цвета, вы должны проектировать свой интерфейс с использованием стандартный цветовой
    схемы.

    Совместная работа документов и отображаемых элементов

    В данном разделе описываются основные принципы модели
    Doc/View. Эта модель освобождает программиста и пользователя от
    необходимости думать от типах данных и о том, как они представляются на экране. Doc/View связывает типы файлов данных с классом
    документа и классом просмотра. Администратор документов поддерживает список ассоциаций между классами документа и классами просмотра. Каждая ассоциация называется шаблоном документа (не путайте его с шаблонами С++).
    Класс документа управляет хранением данных и манипулированием ими. Он содержит информацию, которая выводится на экран. Объекты документов управляют изменениями данных и передачей их в постоянную память (например, на диск).
    Когда пользователь открывает документ (существующий или создавая новый документ), он выводится с помощью соответствующего
    (ассоциированного с ним) класса отображаемого элемента. Класс
    отображаемого элемента управляет выводом данных на экран и тем,
    как пользователь взаимодействует с данными на экране. Фактически,
    отображаемый элемент формирует интерфейс между окном на экране и
    документом. Некоторые типы документов могут иметь только один ассоциированный с ними класс отображаемого элемента, другие - несколько. Различные типы отображаемых элементов определяют различных характер взаимодействия пользователя с документом.

    Создание дочерних интерфейсных элементов

    Как и все интерфейсные объекты, объекты дочерних окон создаются в два этапа: построение интерфейсного объекта и создание интерфейсного элемента. Если вы строите дочерний объект в конструкторе родительского окна, их интерфейсные элементы создаются автоматически (при разрешении автоматического создания для дочерних
    окон). По умолчанию автоматическое создание разрешено для всех
    объектов 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) администратор документа корректно вызывает вашу функцию.
    Если функция базового класса выполняет какие-то важные действия,
    то ее следует вызывать внутри определяемой вами функции.

    Создание класса отображаемого элемента

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

    Создание объекта принтера

    Простейший способ создания объекта принтера состоит в описании в оконном объекте TPrinter*, который другие объекты в программе смогут использовать в целях печати (см. пример программы
    PRINTING.CPP в каталоге OWLAPI\PRINTING).
    Основное окно приложения инициализирует объект принтера и
    использует заданный по умолчанию в WIN.INI. Однако в некоторых
    случаях вы можете задать другие принтеры. В этом случае постройте
    объект принтера в конструкторе каждого соответствующего окна. Затем измените устройство принтера. Рекомендуется всегда использовать конструктор по умолчанию, а потом изменять связанное с объектом устройство.

    Создание объекта распечатки

    Создание объекта распечатки аналогично написанию функции-элемента Paint для оконного объекта: для генерации нужного
    образа в контексту устройства используйте графические функции
    Windows. Объект окна выводит содержимое и управляет взаимодействием с экраном устройства. Контекст устройства объекта распечатки аналогичным образом изолирует вас от устройства печати. Чтобы создать объект распечатки:
  • Создайте из TPrintout новый тип объекта и переопределите
    функцию-элемент PrintPage. В простейшем случае этого достаточно.

  • Если документ имеет более одной страницы, нужно также определить функцию-элемент HasPage. При наличии другой страницы для печати она должна возвращать ненулевое значение.
    Текущая страница печати передается PrintPage в качестве параметра.

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

    Списки дочерних окон

    Вы задаете родителя интерфейсного элемента во время его
    конструирования. Родительский оконный объект является параметром
    конструктора интерфейсного объекта. Дочерний оконный объект хранит в своем элементе данных Parent адрес своего родительского
    оконного объекта как указатель на этот объект. Он также автоматически сохраняет адреса своих дочерних оконных объектов в частном
    элементе данных ChildList.
    Получить доступ к дочерним окнам объекта вы можете с помощью
    функций-итераторов. Функции элементы ForEach и FirstThat получают
    в качестве первого аргумента указатель на функцию. Подробнее о
    них рассказывается ниже.

    Справочное руководство по ObjectWindows 2.0 для С++

    В данном руководстве в алфавитном порядке перечислены классы
    и структуры ObjectWindows с указанием соответствующих файлов-заголовков. Многие из характеристик данных классов иерархически
    наследуются из базовых классов.
    Примечание: Если класс имеет несколько конструкторов,
    то описывается только наиболее общий из них.

    Стандартные объекты проверки допустимости

    Стандартные классы проверки допустимости ObjectWindows автоматизируют проверку данных. ObjectWindows определяет в validate.h
    6 классов проверки допустимости:

    Класс Назначение
    TValidator Базовый класс, из которого создаются все другие производные классы.
    TFilterValidator Класс фильтра проверки допустимости.
    TRangeValidator Класс проверки допустимости по целочисленному диапазону.
    TLookupValidator Класс проверки по таблице.
    TStringLookupValidator Класс проверки допустимости строки.
    TPXPictureValidator Класс проверки допустимости по
    шаблону.


    Статические библиотеки 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-разрядной динамической библиотеки


    Статические управляющие элементы

    Статические управляющие элементы обычно представляют собой
    неизменяемые блоки текста или простую графику. Пользователь не
    взаимодействует с такими элементами, хотя ваше приложение может
    изменять его текст. Примеры вы можете найти в подкаталоге EXAPMLES\OWL\OWLAPI\STATIC.
    Так как пользователь не взаимодействует со статическим элементом, приложение не получает от статических управляющих элементов уведомляющих сообщений. Таким образом, если вы не собираетесь
    им манипулировать, идентификатор управляющего элемента может не
    указываться.
    Конструктор TStatic воспринимает обычно стандартных 7 параметров объектов управляющих элементов и два специальных параметра
    - текстовую строку статического управляющего элемента и ее максимальную длину (включая завершающий 0). TStatic получает заданные
    по умолчанию стили управляющего элемента, добавляет SS_LEFT (для
    выравнивания текста влево) и удаляет стиль WS_TABSTOP (чтобы предотвратить перемещение на данный элемент по клавише Tab). Чтобы
    изменить стиль, модифицируйте в конструкторе объекта статического
    управляющего элемента Attr.Style.
    TStatic имеет две функции-элемента для изменения текста статического управляющего элемента: SetText задает текст элемента в
    соответствии с переданной строкой, а Clear стирает текст. Изменить текст статического управляющего элемента, созданного со стилем SS_SIMPLE, вы не сможете.
    Функция TStatic::GetTextLen возвращает длину текста статического управляющего элемента. Чтобы получить сам текст, используйте TStatic::GetText.

    Структура 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.

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

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

    Связь интерфейсных объектов с управляющими элементами

    Так как диалоговый блок создается из ресурса, вам не нужно
    использовать для задания его вида или вида его управляющих элементов код С++. Это позволяет создавать диалоговый блок визуально, но затрудняет управление управляющими элементами из приложения. ObjectWindows позволяет связать или ассоциировать управляющие элементы в диалоговом блоке с интерфейсными объектами. Такая
    связь позволяет делать следующее:
  • Предусмотреть специальную реакцию на сообщения. Например,
    вы можете отредактировать управляющий элемент или изменять
    стиль командной кнопки при ее "нажатии".

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


  • Таблица реакции на сообщения

    После создания нового производного класса вам нужно построить для него таблицу реакции. Таблица реакции для данного класса
    выглядит как обычная таблица реакции. Вам нужно обрабатывать в
    ней те же командные сообщения, как и обычно. Единственным добавлением является макрокоманда EV_VBXEVENTNAME для обработки нового
    класса сообщений от управляющих элементов VBX. Эта макрокоманда
    имеет три параметра:
  • Идентификатор управляющего элемента.

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

  • EvHandler - функцию-обработчик для данного события и управляющего элемента.


  • Типы комбинированных блоков

    Существуют 3 типа комбинированных блока: простой, раскрывающийся и раскрывающийся со списком. Все эти комбинированные блоки
    выводят свою область редактирования, но блок списка в некоторых
    из них может быть скрыт.
    Простой комбинированный блок не может скрывать свою область
    списка. Его область редактирования ведет себя как редактируемый
    управляющий элемент. Пользователь может вводить и редактировать
    текст, не обязательно совпадающий с одним из элементов списка.
    Комбинированный блок с раскрывающимся списком ведет себя как
    простой комбинированный блок, однако в начальном состоянии область списка не выводится. Она появляется после щелчка "мышью" на
    пиктограмме справа от области редактирования.
    Область списка комбинированного блока с раскрывающимся списком ведет себя как область списка раскрывающегося блока и выводится только при необходимости. Эти два типа комбинированных
    блоков отличаются только поведением области редактирования, которая в комбинированном блоке с раскрывающимся списком ограничивается выводом текста только одного из элементов списка.
    Комбинированные блоки с раскрывающимся списком полезно использовать, когда нужно ограничить выбор только теми элементами,
    которые содержатся в списке. Раскрывающиеся комбинированные блоки
    могут воспринимать записи, отличные от элементов списка.

    Уничтожение интерфейсных объектов

    Уничтожение интерфейсного объекта предусматривает два этапа:
    уничтожение интерфейсного элемента и удаление интерфейсного объекта. Если создавать и выводить интерфейсный элемент требуется
    снова, вы можете уничтожить интерфейсный элемент, не удаляя интерфейсного объекта.
    Уничтожение интерфейсного элемента выполняет функция-элемент
    Destroy интерфейсного объекта. Для уничтожения интерфейсных элементов Destroy вызывает функцию API DestroyWindow. При уничтожении интерфейсного элемента элемент данных HWindow устанавливается в 0.
    При закрытии пользователем окна происходит следующее:
  • Windows уведомляет окно.

  • Возможность закрытия окна проверяется через механизм CanClose.

  • Если окно можно закрыть, интерфейсный элемент уничтожается, а интерфейсный объект удаляется.

  • Интерфейсный объект - это обычный объект С++, и вы можете
    удалить его с помощью оператора delete.

    Уничтожение окон

    Уничтожение родительского окна означает уничтожение всех его
    дочерних окон. Уничтожать дочерние окна или интерфейсные объекты
    дочерних окон явным образом не требуется. Это же касается механизма CanClose: CanClose для родительского окна может вызывать CanClose для всех дочерних окон.
    Когда вы уничтожаете интерфейсный элемент объекта, он разрешает автоматическое создание всех дочерних объектов независимо от
    того, было ли оно до этого разрешено. Таким образом, при создании
    родительского объекта все родительские объекты восстанавливаются
    в то состояние, которое они имели перед уничтожением родительского объекта. Вы можете использовать это для уничтожения интерфейсного элемента и воссоздания его в том же состоянии, какое он имел
    при уничтожении. Чтобы предотвратить это, вы должны явно отключить автоматическое создание для всех дочерних объектов, которые
    не хотите автоматически создавать.

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

    Одним из атрибутов полосы прокрутки является диапазон, который устанавливает все возможные позиции скользящего маркера полосы прокрутки. Каждая позиция связывается с целым значением. Родительское окно использует это значение для установки или опроса
    полосы прокрутки. По умолчанию диапазон объекта составляет от 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 Выходит из приложения, выводя подсказку для сохранения документов.

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

    Управляющие объекты Visual Basic

    ObjectWindows позволяет вам использовать в приложениях Windows управляющие элементы, совместимые с управляющими элементами
    Visual Basic 1.0 (VBX). Использовать их также легко, как стандартные управляющие элементы Windows или ObjectWindows.
    Управляющие элементы VBX представляют большой диапазон функциональных возможностей, не предусмотренных в стандартных управляющих элементах Windows.

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

    Обычное 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


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

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

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

    В своем приложении вы можете связать объекты распечатки с
    любым инсталлированным в Windows устройством печати. По умолчанию
    TPrinter использует принтер, заданный в Windows по умолчанию.
    Существует два способа задания альтернативного принтера:
    непосредственное (в программе) и с помощью диалогового окна.
    Обычно другой принтер назначается с помощью диалогового окна, которое позволяет вам выбрать из списка инсталлированных устройств
    печати. TPrinter делает это автоматически при вызове его функции-элемента Setup. Setup выводит диалоговое окно на базе TPrinterDialog.
    Одна из командных кнопок в диалоговом окне принтера позволяет пользователю изменить конфигурацию принтера. Кнопка Setup выводит диалоговое окно конфигурации, определенной в драйвере устройства печати.
    В некоторых случаях вам может потребоваться назначить своему
    объекту принтера конкретное устройство печати. Это можно сделать
    с помощью функции-элемента SetPrinter, которая воспринимает три
    строковых параметра: имя устройства, имя драйвера и имя порта.

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

    Выполнение диалогового блока аналогично созданию и выводу
    диалогового окна, однако некоторые шаги здесь можно сократить,
    так как диалоговые блоки выводятся на короткое время. Это зависит
    также от того, является диалоговый блок режимным или безрежимным.
    Большинство диалоговых блоков режимные. При выводе такого
    диалогового блока пользователь не может использовать родительское
    окно, пока не закроет этот диалоговый блок. Таким образом, режимный диалоговый блок "замораживает" операции в остальной части
    приложения.
    Для режимного выполнения диалогового блока используйте 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.

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

    Взаимодействие объекта окна со своими управляющими объектами
    в чем-то аналогично взаимодействию с управляющими элементами объекта диалогового блока. Как и диалоговому блоку, окну требуется
    механизм для манипулирования управляющими элементами и реакции на
    их события.
    Одним из способов манипулирования в диалоговых блоках управляющими элементами является передача их сообщений с помощью функций-элементов, наследуемых из TWindow. Объекты управляющих элементов сильно упрощают этот процесс, обеспечивая соответствующие
    функции-элементы. Когда пользователь взаимодействует с управляющим элементом, Windows посылает различные управляющие сообщения.
    Диалоговый блок для циклического перемещения по управляющим
    элементам позволяет использовать клавишу Tab. Для выбора в групповом блоке кнопки с независимым элементом пользователь может
    также использовать клавиши стрелок. Разрешить такой клавиатурный
    интерфейс можно с помощью вызова в конструкторе окна EnableKBHandler.

    Задание параметров печати

    Чтобы разрешить разбивку документа на страницы, объект принтера (производный от TPrinter) вызывает две функции объекта распечатки - SetPrintParams и GetDialogInfo. Функция SetPrintParams
    инициализирует в объекте распечатки переменные размера страницы и
    контекста устройства. Она может также генерировать всю необходимую для создания распечатки отдельных страниц информации.
    После вызова SetPrintParams объект принтера вызывает функцию
    GetDialogInfo, которая считывает из диалогового окна принтера заданную пользователем информацию о диапазоне страниц. Она может
    также использоваться для вычисления общего числа страниц на основе информации о размере страницы, установленной SetPrintParams.

    Закрытие диалогового блока

    Каждый диалоговый блок должен обеспечивать возможность закрытия его пользователем. Для режимных диалоговых блоков это делается обычно с помощью кнопки 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 следует возвращать только
    в том случае, если она не может выполнить необходимые для правильного завершения действия, или пользователь хочет сохранить
    приложение выполняющимся.

    Значения характеристик и их имена

    TDocument и TView имеют некоторые общие характеристики. Эти
    характеристики доступны в любых классах, производных от TDocument
    и TView. Эти характеристики индексируются списком перечислимых
    значений. Первой характеристикой каждого производного от TDocument и TView класса должна быть PrevProperty, а последним значением в списке характеристик - NextProperty. Эти два значения ограничивают список характеристик и обеспечивают, что в производных
    классах список характеристик будет начинаться с корректного значения. PrevProperty следует установить в значение NextProperty-1
    ближайшего базового класса.
    Имена характеристик обычно содержатся в массиве строк. Позиция каждого имени в массиве соответствует индексу характеристики.
    Однако при добавлении характеристик в производный класс вы можете
    сохранять и обращаться к характеристикам любым способом, но сложные схемы лучше не использовать.
    Атрибуты характеристик также обычно содержатся в массиве
    (значений int). Вы можете работать с ними произвольным образом,
    но обычно их индекс соответствует индексу характеристики. Атрибуты определяют доступ к характеристике:

    Атрибут Функция
    pfGetText Доступ в текстовом формате.
    pfGetBinary Доступ в собственном нетекстовом формате.
    pfConstant Характеристику нельзя изменить после создания
    объекта.
    pfSettable Характеристику можно устанавливать с указанием
    собственного формата.
    pfUnknown Определена, но недоступна в объекте this.
    pfHidden Характеристика должна быть скрыта от нормального просмотра (но пользователь может видеть ее имя или значение).
    pfUserDel Характеристика определена пользователем на
    этапе выполнения.


    

        Биржевая торговля: Механические торговые системы - Создание - Программирование