Четвертый 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и:
| 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@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
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: #include002:
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-разрядных приложений для Win32s и Windows NT.
также средствами поиска текста с помощью выражений. Клавиатурные команды редактора можно настраивать на стандарт редактора
Brief или Epsilon.
функции правой кнопки "мыши" доступны по Ctrl+щелчок кнопкой).
программами.
программы ObjectWindows 2.0 для Windows. ClassExpert позволяет
вам модифицировать и организовывать приложение AppExpert.
на Cи и С++ с полной реализацией возможностей С++ AT&T и Си
стандарта ANSI).
Windows и позволяет наблюдать взаимодействие с Windows изнутри
программы.
атрибуты экрана и осуществлять другие операции с потоками в
среде 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 не возвращает управления, однако может генерировать исключительную ситуацию.
Глобальные переменные и классы
Используемые по умолчанию макрокоманды диагностики
| 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 | Задает начальное состояние основного окна приложения: |
| Control Style | Определяет, какой тип управляющих элементов использует приложение: |
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 выводится пример исходного кода.
модифицировать, или щелкните "мышью" на элементе (при этом
будет выбрано имя в списке элементов).
отражать изменения. Для выбора фонового цвета элемента используйте правую кнопку "мыши", а основного - левую.
Директива !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 указывает утилите 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 выражение
[строки]
где [строки] могут представлять собой один из следующих типов
операторов:
Директивы условного выполнения образуют группу, которая состоит как минимум из открывающей группу директивы !if и завершающей группу директивы !endif.
Любые правила, команды и директивы должны завершаться внутри
одного исходного файла.
Всем директивам !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 | Задает отмену описания заданной макрокоманды. |
Добавление и удаление целей
Чтобы добавить к проекту цель, сделайте следующее:| Standard | Выполняемый файл, DLL или другой файл. Выбирается по умолчанию. |
| AppExpert | Приложение ObjectWindows. |
| Source Pool | Набор файлов, на которые можно ссылаться в другой цели. |
диалоговое окно TargetExpert, в котором можно выполнить
дальнейшее определение цели. В случае типа Source Pool
цель добавляется к проекту и вы можете сразу добавить уз-
лы. Об AddExpert рассказывается в другом разделе.
Чтобы удалить одну или более целей:
правой кнопкой "мыши" или нажмите Alt+F10).
целевой файл. Щелкните "мышью" на OK. Отменить это удаление нельзя.
Добавление и удаление экземпляров переменной
Экземпляры переменных позволяют легко обрабатывать множествоуправляющих элементов. При создании экземпляра переменных ClassExpert добавляет в ваш код буфер передачи. Во время выполнения в
этом буфере собирается информация, и вы можете использовать ее
вместо проверки кода с независимой фиксацией. Чтобы связать экземпляр переменной с управляющим элементом (добавить его), сделайте следующее:
выберите Add Instance variable.
исходный код приложения файл заголовка (который содержит
описание структуры с записью экземпляра переменной). Переменная выделяется в конструкторе класса в файле .CPP (это
связывает класс ObjectWindows с объектом ресурса).
класс и имя экземпляра созданной переменной.
Чтобы удалить экземпляр переменной:
указатель переменной в описание класса и распределение переменной класса, связанное с ресурсом управляющего элемента.
Оставшаяся пустая структура и вызов буфера передачи на программный код не влияют, и удалять их не нужно.
Добавление и удаление обработчиков событий
Чтобы добавить для события обработчик событий, сделайте следующее:выводятся события.
запись в таблицу реакции, имя которой определяется по
умолчанию, после чего связанная с обработчиком функция выводится в окне редактирования. Некоторые обработчики запрашивают у вас имя функции перед добавлением в таблицу.
отмечает его в области событий.
Удаляется обработчик событий следующим образом:
в области событий.
список событий). Затем для вывода SpeedMenu щелкните на
событии правой кнопкой "мыши".
в таблице реакции, а не программный код в исходном файле.
Код обработчика выводится в области редактирования, так
что вы можете удалить его. Если вы удалите функцию, удалите его определение из файла заголовка.
Добавление и удаление узлов
Чтобы добавить узел к проекту:узел.
кнопкой "мыши", затем выберите в SpeedMenu команду Add.
Чтобы добавить несколько узлов, запустите администратор файлов Windows и выделите файлы, которые нужно добавить к узлам вашего проекта (убедитесь, что вы можете просматривать в IDE окно
проекта). Затем буксируйте файлы из администратора файлов. Администратор проекта добавляет их под выбранным узлом.
Для удаления узла из проекта выделите его и нажмите Del либо
выберите в SpeedMenu команду Delete node. Можно удалить сразу
несколько узлов.
Добавление класса
ClassExpert позволяет вам добавить основанные на ObjectWindows классы и поддерживает один уровень наследования (вручнуюможно увеличить число уровней. Чтобы добавить класс, сделайте следующее:
диалоговое окно Add New Class.
Source. Нажмите Tab.
выбрать идентификатор шаблона диалога. Блок списка Dialog
ID содержит идентификаторы всех диалоговых ресурсов в вашем приложении AppExpert. Если вы зададите несуществующий
идентификатор, AppExpert создает пустое диалоговое окно с
данными идентификатором, затем загружается Resource Workshop, так что вы можете определить диалоговое окно.
от него класс, в блоке списка Client class вы можете выбрать существующий класс, представляющий клиентную область
нового окна-рамки.
него класс, вы можете щелкнуть "мышью" на командной кнопке
Set Window Properties. Выводится диалоговое окно, в котором вы можете задать характеристики окна.
DPMI и инструментальные средства режима командной строки
Компилятор, работающий в режиме командной строки, используетDPMI (Dos Protected Mode Interface - интерфейс защищенного режима DOS) для выполнения в защищенном режиме на машинах с процессорами 286^ 386, i486 или Pentium c не менее 640К оперативной памяти и не менее 1 Мб расширенной. Хотя Borland С++ работает в защищенном режиме, он генерирует приложения для работы в реальном
режиме. Преимущество использования этого режима заключается в
том, что компилятор имеет гораздо больше памяти для работы, так
что компиляция выполняется быстрее и без обычных проблем с нехваткой памяти.
Другие инструментальные средства WinSpector
EXEMAP, TMAPSYM и BUILDSYM представляют собой три утилиты,которые улучшают вид информации, которую WinSpector обеспечивает
для исключительной ситуации.
Другие параметры трассировки сообщений
Две других полезных возможности предоставляет диалоговое окно параметров трассировки сообщений Message Trace Options, однаиз которых позволяет задать формат области трассировки сообщений,
а другая - зарегистрировать трассируемые сообщения в файле.
(выбирается Interpret Values). Для просмотра параметров
сообщений в шестнадцатиричном виде выберите Hex Values.
области трассировки сообщений Message Trace. Однако вы можете передать сообщения в файл, на принтер или дополнительный монитор. Для этого в диалоговом окне Message Trace
Options нужно выбрать Log File и выполнить одно из следующих действий:
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) показываются вместе с их зарегистрированными именами в
одиночных кавычках.
"Статус" представляет собой следующее:
окно, то from XXXX показывает описатель окна. Если оно посылалось из того же окна, что и принимает сообщение, то
указывается fromself. Если сообщение поступает от Windows,
то часть from... опускается.
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.
целью AppsExpert исходный файла класса (используйте команду Add node оперативного меню).
кнопкой "мыши", затем выберите 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 С++ требуется:
386.
(полная инсталляция требует 80 Мб).
Наличие 8 мегабайт оперативной памяти и сопроцессора 80х87
значительно улучшит производительность работы (при отсутствии
сопроцессора он эмулируется).
Инструментальные средства для работы с ресурсами
В пакет Borland С++ входят следующие инструментальные средства для работы с ресурсами:.RES.
для компоновки ресурса в файл .RES, .EXE или создают выполняемый файл Windows (через TLINK).
запускать 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 создает следующие файлы:
| .IDE | Файл проекта. |
| .CPP | Основной исходный файл. |
| .H | Основной файл заголовка. |
| .RC | Файл сценария ресурса. |
| .RH | Файл заголовка ресурса. |
| .APX | Файл базы данных для AppExpert. |
| .RC | Файл сценария ресурса |
| .RTF | Исходные файлы справочника. |
| .HPJ | Файл проекта справочника. |
| .ICO | Файлы пиктограмм. |
| .BMP | Файлы битовых массивов. |
Использование библиотек
Данный раздел описывает несколько инструментальных средств,которые позволяют вам работать с библиотечными файлами. Вы можете
использовать эти инструментальные средства в IDE или в командной
строке.
определения модулей задают для компоновщика информацию об
импортируемых из библиотек DLL функциях.
Библиотека - это удобный инструмент для работы с набором
объектных модулей.
Использование ClassExpert
ClassExpert позволяет вам создавать новые классы, редактировать и обновлять реализацию классов, а также перемещаться поклассам в исходном коде приложений AppExpert. Чтобы связать классы с ресурсами, вы можете использовать ClassExpert с Resource
Workshop.
Использование файлов подсказки
При работе с большим числом операций или при многократномповторении определенного числа операций удобно пользоваться файлами подсказки. Файл подсказки представляет собой текстовый файл
в обычном формате ASCII (который может быть создан с помощью редактора системы Borland C++), содержащий все команды утилиты TLIB
или какую-то их часть. С помощью файлов подсказки вы можете создавать команды утилиты TLIB, размер которых превышает размер командной строки DOS (128 символов).
Для использования файла подсказки "имя_маршрута", в любой
позиции командной строки утилиты 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 трассирует все сообщения и выводит ихв области трассировки сообщений. Ограничить число трассируемых
сообщений можно несколькими способами:
Windows, затем выберите классы (в области списка классов)
или окна (в области дерева окон).
(см. таблицы). Выбор параметра 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 сообщает:
Синтаксис: 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.
| 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 поддерживает несколько правил на одну
цель. После первого явного правила вы можете добавить файл, от
которого зависит цель, например:
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 С++ с дискет, сделайте следующее:
пространства на диске (Target Requirements), а также объем
доступного пространства на диске. Если используется компрессия диска, прочитайте файл INSTALL.TXT (возможно, вам
потребуется больше места).
"мышью" на кнопке Customize BC4.0 Installation. Выведется
другое диалоговое окно с описаниями и командными кнопками
для установки компонентов продукта. Щелкните "мышью" на
том компоненте, который хотите установить. Выводится дополнительное диалоговое окно, в котором вы можете отметить
файлы, не требующие установки. Щелкните на OK и повторите
этот процесс для всех необходимых компонентов. Щелчок
"мышью" на OK возвратит вас в первое окно установки.
вы хотите использовать другие каталоги, наберите другой
маршрут. Основным каталогом, в котором устанавливается
Borland С++, является C:\BC4, а рабочим - C:\BC4\BIN.
которую помещаются все пиктограммы Borland C++. Если вы не
хотите создавать группу, отмените Create Borland C++ Group.
работы 32-разрядных приложений.
LAN Windows, то выберите LAN Windows Configuration (в других случаях эту возможность выбирать не нужно).
README.TXT. Он описывает последние изменения в продукте,
перечисляет документацию и оперативные справочные файлы.
После установки убедитесь, что в CONFIG.SYS FILES и BUFFERS
установлены в значение 40 или больше. При установке в системные
файлы вашего компьютера вносятся следующие изменения:
device = c:\bc4\bin\tddebug.386
device = c:\bc4\bin\windpmi.386
Поставляемые с Borland С++ файлы перечислены в файле FILE-
LIST.TXT.
Как работает утилита MAKE
Утилита MAKE создает самую последнюю версию вашей программы,выполняя при этом следующие задачи:
формирующим файлом или файлом сборки), который был предварительно вами создан. Этот файл указывает утилите MAKE,
какие объектные файлы и библиотечные файлы должны быть
скомпонованы для того, чтобы создать выполняемый файл, а
также указывает, какие исходные файлы и файлы заголовков
должны компилироваться для создания каждого объектного
файла.
по отношению к времени и дате создания исходного файла и
файлов заголовков, от которых он зависит. Если какой-либо
из этих файлов является более новым, чем объектный файл,
утилита MAKE считает, что он был модифицирован, и что необходимо произвести перекомпиляцию исходного файла.
файлов, дата и время создания каждого объектного файла
проверяется по отношению к дате и времени создания выполняемого файла.
компоновщик для его перекомпоновки.
Утилита MAKE полностью полагается на дату и время, которые
DOS присваивает каждому файлу. Это означает, что для нормальной
работы утилиты MAKE необходимо корректно устанавливать системные
дату и время.
Ниже приводится синтаксис вызова команды MAKE:
MAKE [параметр...][результат...]
Здесь "параметр" является параметром утилиты MAKE (они описываются далее), а "результат" представляет собой имя результирующего файла, который должен быть создан.
Ниже описываются синтаксические правила вызова утилиты MAKE:
параметров пробелом. Параметры могут располагаться в любой
последовательности; может быть введено произвольное число
этих параметров (ограничением является длина командной
строки). Все параметры, которые не задают строку (например, -s или -a) могут завершаться необязательным символом - или +. При помощи этих символов указывается выключение
(-) или включение (+) данного параметра.
необязательный список результирующих файлов.
Если в командной строке не содержатся имена результирующих
файлов, то утилита 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 Options. При выборе окна проекта транслируются все выделенные узлы проекта. Если
дочерние узлы не выбраны, то они не транслируются.
окнах редактирования строятся с помощью используемых по
умолчанию трансляторов.
первого узла проекта).
В IDE можно задать параметры компилятора:
проект не загружен. При загруженном проекте эти параметры
влияют на весь проект.
Компиляция
Компилировать приложения можно с помощью интегрированнойсреды 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 | - для файлов ресурсов. |
Копирование узлов
Узлы можно копировать целиком или по ссылке. Полное копирование позволяет взять узел и его атрибуты и поместить где-либо впроекте идентичную, но другую копию. При этом наследуются атрибуты родительского узла (если параметры не переопределены). Чтобы
выполнить такое копирование, сделайте следующее:
узлы в нужное место.
Копирование по ссылке позволяет взять узел и зависящие от
него узлы и поместить их в другое место проекта. Такая копия
идентичная оригиналу - при удалении оригинала она также удаляется. Для выполнения копирования по ссылке:
место.
Local Override
Параметры проекта можно переопределить локально. Local Override полезно использовать, когда требуется переопределить конкретный параметр отдельного узла.выберите в SpeedMenu Edit local options. Выводится диалоговое окно Style Sheet с выбранным параметром.
Чтобы отменить переопределение, отмените выбор 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. Трассировка сообщений позволяет видеть все сообщения для
окон данного класса, включая сообщения создания.
Наблюдение за окнами
После выбора окна из дерева окон с помощью команды MessagesSelected 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 с комплектом инструментальных
средств. Вы можете ее настроить. Чтобы включить в нее или удалить
командные кнопки, сделайте следующее:
окна выводятся общие параметры всех оперативных полос, с
помощью которых ее можно настроить.
Editor, Browser, Debugger, Project, Message, Desktop или
ClassExpert). В столбце Avaliable Buttons выводятся все
доступные (доступные) командные кнопки, а в столбце Active
Buttons - кнопки выбранной оперативной полосы.
"мышью" в столбце Avaliable Buttons, а чтобы удалить, выберите кнопку в Active Buttons и щелкните "мышью" на указывающей влево стрелке.
используйте стрелки вверх и вниз. Выбранная в Active Buttons кнопка перемещается вверх или вниз по списку.
Кнопка Copy Layout позволяет сделать все оперативные полосы
идентичными.
Настройка конфигурации WinSpector
WinSpector можно настроить таким образом, чтобы она лучшесоответствовала вашим потребностям. Это позволяет управлять выводом информации в файл WINSPCTRL.LOG.
Параметры WinSpector можно устанавливать в диалоговом окне
Preferences или с помощью ввода команд непосредственно в файл
WINSPCTR.INI.
Параметр Directory в диалоговом окне Preferences позволяет
вам решить, куда записывается файл регистрации. Если вы не задаете каталог, то по умолчанию используется каталог Windows.
Для задания каталога сделайте следующее:
либо добавьте запись LogDir=[каталог] в файл WINSPCTR.INI.
Параметр Viewer диалогового окна Preferences позволяет задать, какое программное средство нужно использовать для просмотра
файла регистрации. Если вы не задаете каталог, то по умолчанию
используется Windows Notepad.
Если исключительная ситуация возникает в процессе сеансе с
текущим окном Windows, чтобы увидеть файл регистрации, выберите
View Log (Просмотр файла регистрации) диалогового окна Latest UAE
или диалоговое окно Preferences. Команда View Log запускает выбранную программу просмотра и передает файл WINSPCTR.LOG в качестве аргумента командной строки.
Чтобы просмотреть предыдущий файл регистрации, выберите в
системном меню WinSpector команду View Log file.
Чтобы задать средство просмотра, сделайте следующее:
либо добавьте LogViewer=[имя_файла_программы_просмотра] к файлу
WINSPCTR.INI.
Параметры Append New Reports и Overwrite Previous Reports в
диалоговом окне Preferences позволяет вам либо добавить отчеты к
предыдущему файлу регистрации, либо затереть предыдущий файл регистрации при генерации нового отчета. По умолчанию задается затирание предыдущего файла.
Если вы выбираете перезапись предыдущего файла регистрации,
то при первом возникновении исключительной ситуации предыдущий
файл регистрации затирается. Последующие исключительные ситуации,
возникающие в процессе текущего сеанса работы с Windows, будут
добавлять информацию к этому файлу.
Чтобы добавлять отчеты к предыдущему файлу регистрации, сделайте следующее:
либо нужно добавить Add CreateNewLog=0 в файл WINSPCTR.INI.
Чтобы затирать предыдущие файлы регистрации, сделайте следующее:
либо добавьте Add CreateNewLog=1 в файл WINSPCTR.INI.
Параметр System Information в диалоговом окне Preferences
позволят вам добавить в файл регистрации список задач Task List,
список модулей Module List, и информацию о динамически распределяемой области памяти пользователя (USER) и GDI. По умолчанию в
отчет включается системная информация.
Чтобы включить системную информацию в файл регистрации, сделайте следующее:
либо нужно добавить Add ShowSystemInfo=1 в файл WINSPCTR.INI.
Чтобы системная информация не включалась в файл регистрации,
сделайте следующее:
либо нужно добавить Add ShowSystemInfo=0 в файл WINSPCTR.INI.
Параметр AUX Summary в диалоговом окне Preferences указывает
WinSpector, что на устройство AUX нужно выводить сокращенную форму отчета. Чтобы использовать данный параметр, нужно подключить к
AUX терминал или драйвер устройства, который перенаправляет AUX
на второй монитор. По умолчанию информация на AUX не выводится.
Для передачи итогового отчета на устройство AUX сделайте
следующее:
либо добавьте LogToStdAux=1 в файл WINSPCTR.INI.
Чтобы итоговый отчет не передавался на устройство AUX сделайте следующее:
либо добавьте LogToStdAux=0 в файл WINSPCTR.INI.
Параметр Stack Frame Data в диалоговом окне Preferences позволяет вам выполнить подробную трассировку стека в файл регистрации. Для кадра стека не превышающего 256 байт выполняется шестнадцатиричный дамп, начиная с SS:BP для кадра стека. Если между двумя последовательными кадрами стека больше 256 байт, то показ
памяти для этого кадра опускается. Эти данные можно использовать
для получения значений или параметров, которые передавались функции. По умолчанию подробная трассировка стека не выполняется.
Обычно для выявления значений параметров существенно проще
использовать утилиту DFA. Однако в тех случаях, когда вам недоступна информация отладчика, может оказаться полезной подробная
трассировка стека. Чтобы добавить данные трассировки стека в файл
регистрации, сделайте следующее:
либо добавьте ShowStackInfo=1 в файл WINSPCTR.INI.
Чтобы не включать данные кадра стека в файл регистрации,
сделайте следующее:
либо добавьте ShowStackInfo=0 в файл WINSPCTR.INI.
Параметр PostMortem Dump в диалоговом окне Preferences генерирует файл WINSPCTR.BIN.
Утилита DFA воспринимает файл WINSPCTR.BIN и информацию Турбо отладчика (файлы .TDS) и транслирует непосредственные двоичные
данные в полезную форму. Она генерирует файл, содержащий трассировку стека аналогичную той, что выводится в файл регистрации, но
с именами функций и номерами строк, а также локальными и глобальными переменными.
Генерация файла WINSPCTR.BIN:
либо добавьте PostMortemDump=1 в файл WINSPCTR.INI.
Чтобы не генерировать файл WINSPCTR.BIN, сделайте следующее:
либо добавьте PostMortemDump=0 в файл WINSPCTR.INI.
Параметр User Comments в диалоговом окне Preferences позволяет вам ввести информацию о том, что происходило во время возникновения исключительной ситуации. Диалоговое окно выводится
немедленно после записи файла регистрации, и в это время можно
ввести комментарии о том, что произошло. Ваши комментарии будут
добавляться к файлу регистрации.
Чтобы добавить комментарии пользователя в файл регистрации,
сделайте следующее:
либо добавьте ShowUserInfo=1 в файл WINSPCTR.INI.
Чтобы не включать комментарии пользователя в файл регистрации, сделайте следующее:
либо добавьте 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^\
специального значения), то символ каре игнорируется.
макрокомандой. Используйте вместо нее директивы !ifdef и
!ifndef.
не будут заканчиваться обратной косой чертой. Например,
без параметра -N переключатель $(
искать неявные правила от конца формирующего файла к его
началу.
(В обычном режиме $* расширяется в имя файлов зависимостей
в неявном правиле.)
Параметр TLINK
Если не указано обратное, описываемые ниже параметры действуют как для TLINK, так и для TLINK32. Регистр параметров различается. Перед параметрами нужно указывать - или /. Отключить заданный по умолчанию параметр можно указанием после него символа"-", например -P-.
| /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 воспринимаются последовательно слева направо.При этом действуют следующие правила:
-L результат будет кумулятивным (компилятор выполняет поиск по всем перечисленным каталогам слева направо).
Параметры основного окна
Параметры основного окна Main Window управляют характеристи-ками основного окна приложения (его типом и внешним видом).
Параметры приложения
Параметры приложения позволяют управлять его внешним видом.Параметры проекта
После создания проекта вам может потребоваться изменить заданные по умолчанию параметры. Эти параметры указывают администратору проекта, как нужно строить проект. Чтобы изменить их:Установленные параметры применяются ко всему проекту. При
создании нового проекта ему назначаются параметры последнего открытого проекта. Чтобы выбрать другие параметры, используйте Local Override или Style Sheet.
Параметры редактора
Окна редактора (всего их может быть до 32) позволяют вамсоздавать и редактировать исходный код программы. При редактировании файла строка состояния IDE выводит текущую позицию в файле
и позицию курсора. С помощью команды Edit Undo (или Alt+пробел)
вы можете отменять изменения. Число допустимых команд Undo (уровень отмены) можно задать с помощью Options Enviroment Editor Options и установки Undo Limit.
Можно настроить конфигурацию редактора таким образом, чтобы
он выглядел и вел себя аналогично редакторам Brief и Epsilon. Редактор интегрированной среды использует файл конфигурации клавиатуры .CKB, который задает для редактора клавиатурные сокращения.
Переименование элемента AppExpert
Чтобы переименовать класс, функцию обработки события, экземпляр переменной или идентификатор диалога, сделайте следующее:с проектом исходные файлы.
правой кнопкой "мыши", затем выберите Special Rescan. После завершения Rescan возвращает вас в окно проекта IDE.
Перемещение класса
Чтобы переместить класс из одного исходного файла в другой,сделайте следующее:
новый файл. Если файл не записан в проекте как узел под целью AppsExpert, добавьте его. Если перемещенный класс был собственным исходным файлом, вы можете удалить из проекта пустой исходный файл.
Special Rescan. После завершения Rescan возвращает вас в
окно проекта IDE.
Перемещение узлов и целей
Такое перемещение можно выполнить несколькими способами:кнопку "мыши", узел окажется под выбранным узлом.
узел перемещается по видимым узлам вверх или вниз. С помощью стрелки влево/вправо вы можете перемещать его между уровнями.
Перестроение файла базы данных .APX
Чтобы перестроить потерянный или запорченный файл .APX, сделайте следующее:"мыши" и выберите в оперативном меню 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 С++ использует следующий алгоритм.то Borland С++ ищет указанный в нем файл только в заданном
каталоге включаемых файлов (заголовков или библиотечных
файлов).
#include "file.h.", то Borland С++ ищет этот файла сначала
в текущем каталоге, а затем в каталогах включаемых файлов,
заданных в командной строке.
Неявные библиотеки Borland С++ ищет только в заданных библиотечных каталогах. Неявные библиотеки - это такие библиотеки, которые Borland С++ компонует автоматически, и объектный файл запуска (C0x.OBJ). Поиск Borland С++ явных библиотек зависит от того, как указано имя библиотечного файла. Явные библиотеки имеют
расширение .LIB. Если библиотека указывается без диска и каталога, то Borland С++ ищет ее сначала в текущем каталоге, а затем в
заданных библиотечных каталогах.
Построение части проекта
Часть проекта можно построить 3 способами:щелкните правой кнопкой "мыши" и выберите в SpeedMenu команду Build).
умолчанию команду трансляции в SpeedMenu.
Построение приложений с помощью AppExpert
В данном разделе рассказывается, как с помощью AppExpertсоздавать приложения на базе ObjectWindows 2.0. AppExpert работает с Resource Workshop, классами ObjectWindows 2.0. Это позволяет
использовать при генерации приложения визуальный подход. AppExpert позволяет создавать программы Windows с такими средствами
как оперативное меню SpeedBar, строка состояния, структура меню,
оперативный справочник, средство предварительного просмотра на
экране печатаемой информации и средства работы с документами.
Построение проекта
Для построения проекта следует: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.
должны входить модули X.OBJ, Y.OBJ и Z.OBJ, введите:
tlib mylib +x +y +z
этим получить файл списка MYLIB.LST, введите:
tlib mylib +x +y +z, mylib.lst
CS.LIB, введите:
tlib cs, cs.lst
MYLIB.LIB, введите:
tlib mylib -+x +a -z
tlib mylib *y, mylib.lst
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 следующие параметры:in OBJs.
information in OBJs.
Чтобы запустить средство просмотра, выберите 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.
Просмотр параметров проекта
Так как каждый узел может иметь свой собственный набор StyleSheet, который можно переопределять, требуется быстрый способ
просмотра параметров каждого узла.
Чтобы просмотреть иерархию параметров, сделайте следующее:
списка можно настраивать как в окне проекта.
Справа выведутся его параметры.
на параметре "мышью" или выделите его и щелкните на кнопке
Edit. Если параметр принадлежит к Style Sheet, то придется
редактировать весь набор Style Sheet. В противном случае
редактируется Local Override.
Раздел дизассемблирования
Первая строка раздела дизассемблера файла регистрации указывает, что вызвало исключительную ситуацию.После этого следуют несколько инструкций программы. Эти последующие команды перечисляются для обеспечения ссылок с целью
нахождения вызвавшей особую ситуацию задачи.
Раздел модулей
В разделе модулей файла регистрации перечисляются модули,которые выполнялись во время возникновения исключительной ситуации. Здесь приводится следующая информация:
Раздел очереди сообщений
Раздел очереди сообщений файла регистрации представляет:последнее сообщение, фактически полученное в ходе обработки. Кроме того, дается список сообщений, ожидающих в очереди во время
исключительной ситуации. Перечисляется следующая информация:
был);
То, что записывается в разделе очереди сообщений, может фактически не быть реальным последним сообщением, полученным программой. 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). Чтобы изменить атрибуты:кнопкой "мыши".
окно TargetExpert.
Редактирование атрибутов узла
Параметры узла описывают узел и определяют параметры итрансляторы, используемые при трансляции узла. Для редактирования
атрибутов сделайте следующее:
кнопкой "мыши".
| Name | Имя узла. |
| Description | Любой описывающий узел текст. |
| Style Sheet | Имя таблицы стилей, используемых администратором проекта при трансляции узла. |
| Translator | Используемый для узла транслятор. |
| Node Type | Определяет узел и доступные для узла трансляторы. |
Редактирование дерева проекта
Редактировать дерево проекта можно с помощью оперативныхклавиш или команд меню. Некоторые команды меню выводятся только в
SpeedMenu. Чтобы вывести в окне Project оперативное меню SpeedMenu, щелкните на узле правой кнопкой "мыши". Доступные в SpeedMenu
команды отражают тип выбранного режима.
При редактировании проектов вы можете добавлять, удалять и
перемещать целевые файлы и узлы, а также копировать узлы. Можно
также изменять атрибуты узла и цели.
Редактирование Style Sheet
Существующие наборы Style Sheet вы можете редактировать, переименовывать и копировать. Для просмотра диалогового окна StyleSheet выберите Options Style Sheets.
Compose позволяет вам создавать Style Sheet, комбинируя несколько наборов параметров:
имя), затем щелкните "мышью" на Compose.
Для копирования Style Sheet:
Для редактирования Style Sheet:
Для переименования Style Sheet:
Удалить 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, сделайте следующее:
обычный текстовый редактор.
фигурные скобки (можно сделать несколько копий).
в конец существующего списка Style Sheet.
Когда вы откроете проект, связанный с обновленным файлом
.PDL, то увидите при выборе Options Style Sheet новый набор Style Sheet.
Создание многоцелевого проекта
Создание многоцелевого проекта выполняется аналогично:Target.
(по умолчанию Standard). Выберите OK.
Создание приложения
Создание приложения с помощью AppExpert предусматривает следующие этапы:этом выводится диалоговое окно.
проекта AppExpert (если он не существует, то создается). В
нем по умолчанию будут размещаться все исходные файлы.
Щелкните "мышью" на OK. Выводится диалоговое окно AppExpert Application Generation Options.
щелкнуть "мышью" на кнопке Generate диалогового окна Options. Диалоговое окно Application Generation Options содержит слева список тем, а справа - краткое описание темы.
Кнопка Help позволяет вывести справочную информацию по теме.
("+" указывает на наличие подтемы, а "-" говорит о том,
что выведены все подтемы).
Для генерации кода щелкните "мышью" на Yes. No возвращает
вас к выбору параметров. Когда AppExpert генерирует приложение, выводится окно сообщений. AppExpert создает для приложения все файлы и помещает их в базовый каталог. После генерации кода и ресурсов вы можете редактировать и добавлять их, но вернуться в AppExpert и изменить параметры нельзя.
необходимых приложению файлов (битовые массивы, пиктограммы и справочный текст не показывается). Для модификации приложения можно использовать ClassExpert. Чтобы построить
приложение, выберите Project Make all. По умолчанию все
выполняемые файлы сохраняются в базовом каталоге.
Создание проекта
Использование администратора проектов не представляет затруднений. Для построения проекта:его тип (.EXE, .DLL, .LIB, .HLP или файл EasyWin).
DOS Overlay для 16-разрядных приложений или Win32 для
32-разрядных).
это необходимо:
приложении;
Создание расширенного словаря: параметр /E
Для ускорения процесса компоновки больших файлов библиотек(таких, как стандартная библиотека Cx.LIB), можно указать утилите
TLIB, что нужно создать расширенный словарь и подсоединить его к
файлу библиотеки. Данный словарь в крайне компактной форме содержит информацию, которая не вносится в стандартный словарь библиотеки. Эта информация позволяет компоновщику TLINK быстрее обрабатывать файлы библиотек, особенно в том случае, когда они находятся на гибком диске или на медленном жестком диске. Все библиотеки
на ваших дистрибутивных дисках содержат расширенный словарь.
Для создания расширенного словаря модифицируемой библиотеки
необходимо при добавлении, удалении или замене модулей в этой
библиотеке задать параметр /E при вызове утилиты TLIB. Для создания расширенного словаря существующей библиотеки, которую вы не
хотите модифицировать, нужно задать параметр /E и указать TLIB
удаление из библиотеки несуществующего модуля. При этом утилита
TLIB выдаст предупреждающее сообщение о том, что заданный модуль
в библиотеке не найден, но наряду с этим создаст расширенный словарь заданной библиотеки. Например, введите следующую строку:
tlib /E mylib -bogus
Если не использовать в командной строке TLIB параметр /e, то
утилита TLIB будет игнорировать отладочную информацию в библиотеке, имеющей расширенный словарь.
Создание Style Sheet
Чтобы создать Style Sheet, сделайте следующее:нажмите Enter.
Sheet.
Создание типов документа
При создании приложения AppExpert, поддерживающего модульDoc/View, вы можете использовать ClassExpert создания классов
отображаемых документов и типов документов. Чтобы создать тип документа, сделайте следующее:
из трех предопределенных классов (TEditView, TListView или
TWindowView).
кнопкой "мыши" в области классов, затем выберите в оперативном меню Create doc types.
TListView, TWindowView или ваш собственный класс.
текст выводится в диалоговом окне File Open.
фильтры выводятся в диалоговом окне File Open и используются для фильтрации файлов, которые может открывать пользователь в приложении.
будет использоваться при сохранении.
| dtAutoDelete | Удалять объект документа при закрытии последнего отображаемого элемента. |
| dtNoAutoView | Не создавать автоматически заданный по умолчанию тип отображаемого элемента. |
| dtSingleView | Обеспечивать только один отображаемый элемент на каждый документ. |
| dtAutoOpen | Открывает документ при его создании. |
| dtUpdateDir | Обновляет каталог диалога. |
| dtHidden | Скрывает шаблон в списке выбираемых пользователем шаблонов. |
| dtSelected | Указывает последний выбранный шаблон. |
| dtReadOnly | Выбирает при создании диалогового окна доступную только по чтению кнопку с независимой фиксацией. |
| dtOverWritePrompt | Запрашивает пользователя, можно ли перезаписать существующий файл (в диалоге Save As). |
| dtHideReadOnly | Скрывает кнопки с независимой фиксацией, доступные только по чтению. |
| dtPathMustExist | Позволяет пользователю набирать только существующие маршруты. |
| dtFileMusttExist | Позволяет пользователю набирать имена только существующих файлов. |
| dtCreatePrompt | Перед созданием нового документа выводит пользователю подсказку. |
| dtNoReadOnly | Возвращает заданный файл как доступный для записи. |
"мышью" на Add. При этом будет обновлена структура основного исходного файла, в котором описываются типы документов. Документ/отображаемый элемент выводится в списке доступных типов.
Список операций
Список операций определяет, какие действия должна выполнятьутилита 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:
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
{
friend class B
};
template
{
friend class A
};
A
Что приведет к выводу следующих сообщений:
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
Сообщение об ошибке этапа компиляции
(требуется имя типа)
Произошла одна из следующих ошибок:
класс памяти и имя типа;
класса);
именем базового класса.
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, прервав процесс. (Это не ошибка, а просто подтверждение.)
Удаление класса
node). Если исходный файл используется в других классах,
удалите ссылки на класс в других исходных файлах.
кнопкой "мыши" и выберите 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 за два
шага:
файл .MAP.
файла .SYM.
Утилита BUILDSYM использует EXEMAP и TMAPSYM, но полный процесс можно выполнить с помощью только одной команды. BUILDSYM
после создания файлов .SYM стирает также из каталога файлы .MAP.
Утилита BUILDSYM поддерживает синтаксис, позволяющий использовать
трафаретные символы, что дает вам возможность создавать файлы
.SYM для всех файлов каталога или части файлов с помощью одной
команды.
BUILDSYM требует, чтобы утилиты EXEMAP и TMAPSYM указывались
в маршруте доступа. Полученные в результате файлы .SYM помещаются
в текущий каталог. Чтобы WinSpector могла найти файл .SYM, при
возникновении исключительной ситуации он должен находиться в том
же каталоге, что и выполняемый файл.
Утилита BUILDSYM делает следующее:
.MAP для создания файлов .SYM;
Синтаксис: 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 записывает на диск файл регистрации с полезной информацией о причине исключительной ситуации, включая:
- 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 позволяет выполнять TurboDebugger, Resource Workshop, WinSpector, WinSight, GREP и Keymapper. Для запуска из IDE программы выберите Tools имя_программы.
Чтобы добавить программы в меню Tools, сделайте следующее:
щелкните "мышью" на Edit.
строки (можно использовать макрокоманды передачи).
Tool Advanced Options.
программой, щелкните "мышью" на Translator. Если программа
используется для просмотра файла, выберите Viewer.
проекта.
Выражения, допустимые в директивах условного выполнения
В директивах !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. Задать средства просмотра и инструментальные средства можно аналогично тому, как задаются трансляторы.
Задание транслятора
Чтобы задать транслятор, сделайте следующее:трансляторы выбором команды Build Attributes в SpeedMenu
администратора проекта.
параметры командной строки (в командной строке можно использовать макрокоманды передачи).
буквой нужно указать &.
выводиться в строке состояния при выборе элемента меню.
Options.
Tools, отметьте Place on Tools menu. Если нужно, чтобы
транслятор выводился при щелчке правой кнопкой "мыши" на
соответствующем узле, выберите Place on SpeedMenu.
вы хотите связать с транслятором, разделив их точкой с запятой.
типа узла по умолчанию, наберите в поле Default for расширение файла и двоеточие.
Запуск Borland С++
Для запуска IDE дважды щелкните "мышью" на пиктограмме Borland С++ в Windows. Интегрированная среда разработки IDE позволяет вам писать, редактировать, компилировать, компоновать, отлаживать программы и управлять проектами. Оперативное контекстно-зависимое оперативное меню IDE (SpeedBar) позволяет вам быстро модифицировать объекты. Чтобы увидеть это меню, щелкните в окноправой кнопкой "мыши" или нажмите Alt+F10. В зависимости от выбранного окна это меню изменяется. Оперативное меню можно настраивать.
Справочная система Borland С++ дает вам оперативный доступ к
информации о Borland С++. Чтобы вызвать справочник Help, в IDE
выберите в меню Help или нажмите F1. В диалоговом окне щелкните
"мышью" на командной кнопке Help. F1 позволяет также получить
справку по команде меню.
Запуск ClassExpert
Для запуска ClassExpert сделайте следующее:оперативном меню слева). ClassExpert выводится с перечнем
всех классов приложения и их реализации.
ClassExpert имеет три области, размер которых вы можете изменять с помощью буксировки границ.
Запуск и приостановка обновления экрана
Трассировка сообщений отключается при выборе командыMessages Trace Off (Сообщения Выключение трассировки). Область
трассировки сообщений остается видимой на экране, а трассировка
возобновляется, когда вы выбираете одну из команд меню трассировки сообщений: Selected Classes (Выделенные классы), Selected
Windows (Выбранные окна) или All Windows (Все окна).
Команда Stop! строки основного меню отключает все обновления в реальном времени, выполняемые WinSight. Обычно для областей
поддерживается текущее состояние при регистрации классов, создании и уничтожении окон и поступлении сообщений. Выбор команды
Stop! приостанавливает все эти изменения и изменяет команду меню
на Start!. Выбор команды Start! возобновляет нормальную работу.
Использование команды Stop! имеет две основных цели:
Для отключения трассировки типов сообщений выберите команду
Messages Trace Off. Область трассировки сообщений остается видимой, и трассировка возобновляется при выборе Messages Selected
Classes, Selected Windows или All Windows.
Запуск из IDE
При запуске Resource Workshop как средства просмотра приложения AppsExpert (с помощью администратора проекта в IDE илиClassExpert) его поведение отличается от автономного запуска следующим:
структуру или функциональные возможности класса их обновление происходит непрерывно в окне ClassExpert.
все внесенные изменения автоматически сохраняются.
на основе загруженных ресурсов он создает файл .RES.
или выбором 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 (BorlandInternational Data Structures), которые называются также библиотекой контейнерного класса. Контейнеры - это объекты, реализующие
общие структуры данных, предлагающие функции-элементы для доступа
к каждому элементу данных и добавления таких элементов. При этом
внутренние детали скрыты от пользователей. Контейнеры могут содержать целые и вещественные числа, строки, структуры, классы,
типы, определенные пользователями, и любые объекты C++.
Контейнеры Borland реализуются с помощью шаблонов. Вы можете
передавать в шаблон любой тип объекта, который хотите включить в
контейнер. Это облегчает, например, инициализацию массивов.
Библиотеку класса контейнера можно разделить на две категории: фундаментальные структуры данных FDS (Fundamental Data
Structures) и абстрактные типы данных ADT (Abstract Data Types)
Библиотеки DLL
Использование в приложениях библиотек динамической компоновки DLL позволяет уменьшить объем файла .EXE, экономит системнуюпамять и обеспечивает большую гибкость при изменении и расширении
приложений. DLL - это библиотека выполняемых модулей, содержащая
функции или ресурсы, используемые приложениями или другими DLL.
DLL не имеет основной функцией, которая обычно служит точкой входа в основную программу. DLL содержит несколько точек входа, по
одной на каждую экспортируемую функцию. При загрузке DLL операционной системой она (одна ее копия) может совместно использоваться
несколькими приложениями. Для полного понимания DLL полезно понимать, чем отличаются статическая и динамическая компоновка.
Библиотеки импорта
При использовании DLL вы должны дать компоновщику определения функций, которые хотите импортировать из DLL. Эта информациявременно удовлетворяет внешние ссылки на функции, вызываемые компилируемым кодом, и сообщает загрузчику Windows, где найти функции на этапе выполнения. Сообщить компоновщику о функциях импорта
можно двумя способами:
и перечистить все функции 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++ и для других реализаций языкаявляется учет регистра букв в идентификаторах. Последние могут
содержать буквы от 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
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
Все остальное будет работать правильно. Однако, чтобы изменить это на косвенный контейнер, потребуется больше изменений:
// создать стек целочисленных указателей, загрузить стек и
// вывести содержимое
#include
#include
// изменить typedef как обычно
typedef TStackAsVector
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), имена функций должны экспортироваться.
Чтобы использовать экспортированные функции, нужно импортировать
их мена. Экспорт функций выполняется двумя способами:
приложениях. Это можно сделать с помощью инструментального
средства IMPDEF.
DLL в IDE нужно выбрать корректный параметр генерации кода
или задать корректную командную строку компилятора.
Чтобы функция могла импортироваться другим приложением или
DLL, она должна описываться как экспортируемая из DLL. Вы должны
также указать компоновщику, что хотите импортировать эти функции.
Это можно сделать тремя способами:
позволяет создать библиотеку импорта для одной или более
DLL.
(только для 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++:
Отметим, что компилятор допускает задания любых операндов,
даже если они ошибочны или не разрешены Ассемблером. Точный формат операндов не может быть принудительно установлен компилятором.
Ниже приводится полный перечень мнемонических имен кодов
операций, которые могут быть использованы в операторах встроенного ассемблирования:
Компиляция со встроенным ассемблером
Существует два способа, с помощью которых 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, но имеет следующие ограничения:
ассебмлера.
Так как BASM не является полным ассебмлером, некоторые конструкции этого языка он не воспринимает. В этом случае Borland С++
будет выводить сообщение об ошибке. При этом у вас есть две возможности: упростить программный код встроенного ассебмлера или
использовать параметр -B для вызова TASM. Однако TASM может не
идентифицировать место ошибки, так как номер строки исходного кода теряется.
Контейнеры и файлы заголовков 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
где 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ов
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 lslaad 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 позволяет:
возвращаемого значения;
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.
В IDE используйте команду
Options Compiler Messages Display All. В BCC32 укажите
параметр -w.
STRICT с помощью #define или использовать в командной
строке параметр -DSTRICT.
Перечислим некоторые рекомендации, которые могут оказаться
полезными при преобразовании вашего программного кода в соответствии со STRICT:
хотите получить 16-битовое значение на 32-разрядной платформе).
с помощью подходящего типа функции, а не с помощью
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);
ядра, осуществляющие управление модулями, обычно используют HINSTANCE, но некоторые API возвращают или воспринимают
только HMODULE.
WINDOWS.H, они могут быть изменены, и ваши описания могут
оказаться устаревшими. Удалите локальные описания.
приводиться к LOCALHANDLE или GLOBALHADLE.
SendDlgItemMsg или любых других функций, которые возвращают LRESULT или LONG к какому-либо описателю вы должны сначала привести результат к UINT:
HBRUSH hbr;
hbr = (HBRUSH)(UINR)
SendMessage(hwnd WM_CTLCOLOR, ..., ...);
идентификатора. В этом случае вы должны привести тип к
HMENU:
HWND hwmd;
int id;
hwnd = CreateWindow("Button", "Ok", BS_PUSBUTTON,
x, y, cx, cy, hwndParent,
(HMENU)id, // здесь требуется приведение типа
hinst, NULL);
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-разрядными вызовами.
| 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.
какой вид выполняемых файлов вы хотите получить.
массивы. Создается файл ресурса (.RC).
файл .RES.
связанные с ним ресурсы.
Простые ссылки
Для объявления ссылок вне функции может использоваться описатель ссылки: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 | Слишком много связей |
Поведение 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 и может включать в себя следующие основные задачи:
она описывается как MOVEABLE (только для 16-битовых приложений).
Код инициализации выполняется только для первого приложения,
использующего 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 в настоящее время не выполняет
никаких действий.
Создание потоковых объектов
Простейший способ сделать класс потоковым состоит в использовании макрокоманд, предусмотренных в библиотеке постоянных потоков. Для большинства классов будут работать следующие шаги.(прямо или косвенно).
DECLARE_STREAMABLE.
IMPLEMENT_STREAMABLE. Рекомендуется также добавление макрокоманды IMPLEMENT_CASTABLE.
функций-элементов Read и Write.
Чтобы определить потоковый класс, вам нужно:
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 используют 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
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, вам следует:
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.
Константа, присвоенная номеру цвета (значению эл. изображения)
| 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
В данном разделе представлены глобальные переменные 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 переопределяются.
Если вы планируете использовать вашу программу исключительно
на машинах с установленным математическим сопроцессором 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. В BorlandC++ всегда существовал тип:
struct complex
{
double x, y;
};
определенный в math.h. Этот тип удобен для представления комплексных чисел, поскольку их можно рассматривать в качестве пары
вещественных чисел. Однако, ограничения Си делают арифметические
операции с комплексными числами несколько громоздкими. В С++ операции с комплексными числами выполняются несколько проще.
Для работы с комплексными числами в С++ достаточно включить
файл complex.h. В complex.h для обработки комплексных чисел переопределены:
Библиотека 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 Мб.
очень больших программах. Дальние указатели используются
как для кода, так и для данных, что дает предельный размер
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-timeObject-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 до вызова функции, использующей сопроцессор, если вы не уверены, что свободных регистров достаточно.
Регистры общего назначения
| 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. В арифметических операциях с указателями выполняются
следующие правила:
--, +- или -=.
разрешена только в том случае, если два указателя указывают на один и тот же тип, либо если один из указателей
указывает на тип 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 >
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++ обеспечивает графические драйверы для следующих графических адаптеров (и полностью совместимых с ними):
Для запуска графической системы вы должны прежде всего вызвать функцию 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).
или 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.
Можно также создать аппаратную точку останова, модифицировав
существующую точку останова:
кнопку с зависимой фиксацией Hardware.
щелкните "мышью" на кнопке Hardware окна Conditions and
Actions.
"мышью" на OK.
действия.
Автоматическая передача файла
После загрузки программы 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 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 | Пример программы. |
Трассировка исключительных ситуаций операционной
Группы точек останова
Объединение точек останова в группы позволяет разрешать,запрещать или удалять их одним действие. Кроме того, одной командой можно задать группу точек останова для всех функций (или
функций-элементов) модуля.
Команда 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.Для подключения к выполняемому процессу сделайте следующее:
выполняющегося процесса.
an Attach. При ее включении Turbo Debugger приостанавливает выполнение процесса при подключении к нему.
идентификационный номер процесса в поле ввода 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
Диалоговое окно содержит три поля:
выражения. Если строки данных слишком велики и не умещаются в поле результата, то они заканчиваются символом >. "Прокрутив" окно вправо, вы можете просмотреть остаток
строки.
можете ввести новое выражение для вычисления. Если выражение модифицировать нельзя, то в данной области выводится сообщение
Запись в поле ввода 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 перезагружает отлаживаемую вами программу с диска. Ее можно использовать в следующих случаях:
то место, где имеется ошибка;
программы с помощью прерывания и хотите завершить ее и начать сначала (убедитесь однако, что вы не прервали выполнения программы в коде ядра Windows);
установите для нужной 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 |
| View Source | Для вывода исходного кода, соответствующего текущей дизассемблированной инструкции открывает окно Module. Если соответствующего исходного кода нет (например, вы находитесь в коде Windows, или отсутствует отладочная информация), вы просто остаетесь в области кода. | |
| Mixed | Позволяет выбрать один из трех способов вывода на экран дизассемблированных инструкций и исходного кода: | |
| No (Нет) | Исходный код не выводится, выводятся только дизассемблрованные инструкции. | |
| Yes (Да) | Перед первой дизассемблированной инструкцией, со ответствующей данной строке, выводится строка исходного кода. Область устанавливается в данный режим, если исходный модуль написан на языке высокого уровня. | |
| Both (Оба) | Для тех строк, которым соответствует исходный код, дизассемблированные строки заменяются строками исходного текста. В противном случае выводятся дизассемблированные инструкции. Используйте этот режим, когда вы отлаживаете модуль на ассемблере и хотите видеть строку исходного текста, а не соответствующую дизассемблированную инструкцию. Область устанавливается в данный режим вывода, если текущим модулем является исходный модуль ассемблера. | |
| Thread | Позволяет выбрать нить, выполнение которой вы хотите отладить. Открывает диалоговое окно Pick a Thread, из которого вы можете выбрать конкретную нить программы. | |
| OS Exceptions | Позволяет выбрать исключительные ситуации операционной системы, которые вы хотите обрабатывать. Подробнее об этом рассказывается ниже. | |
| New EIP | Изменяет текущий адрес программы, подсвеченный в области кода (в TDW команда называется New CS:IP). При возобновлении выполнения программы оно начинается по этому адресу. Эта команда полезна, когда нужно пропустить некоторые машинные инструкции, но использовать ее нужно аккуратно, так как она может вызвать нестабильность системы. | |
| 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.
Если вы не трассируете прерывание с помощью Alt+F7, то об ратное выполнение этой инструкции невозможно.
выполнение за инструкцию после возврата невозможно.
(отменить чтение и запись нельзя).
и не отлаживаете 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
< >
В это окно записываются:
окна);
точки останова;
to Log.
команды Display Windows Info локального меню данного окна);
окну сообщения.
Команды 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 может загружаться программой в память двумя различными
способами:
компоновке ее с программой с помощью утилиты IMPLIB);
Отладка драйвера устройства
При отладке драйверов устройств можно использовать два подхода. Первый аналогичен отладке TSR, а для второго используютсясредства удаленной отладки, о которых рассказывается ниже. Для
применения этого последнего способа выполните следующие шаги:
удаленной системой.
таблицу идентификаторов драйвера устройства.
первого идентификатора из таблицы идентификаторов в соответствующую ячейку памяти. Таким образом, имеющаяся ин формация об идентификаторах будет соответствовать вашему
коду (программе). Для этого в ответ на подсказку отладчика задайте адрес сегмента Seg вашей резидентной программы, который можно определить с помощью TDMEM.
сам отладчик. Это не нарушит резидентности вашего драйвера: когда он будет выполняться в отладчике, он сам станет
резидентным при загрузке удаленной системы в результате
выполнения файла CONFIG.SYS. Единственная резидентной
загрузки отладчика заключается в том, что вы можете перейти обратно в DOS и вызвать ваш драйвер устройства.
драйвера устройства. Например, выведите информацию на со ответствующее устройство.
отладку вашей программы. (Кроме того, вы можете повторно
войти в отладчик из DOS, дважды нажав клавиши Ctrl-Bre ak.)
Отладка кода запуска DLL
Когда ваша программа загружает DLL, выполняется код запускаDLL. По умолчанию Turbo Debugger не выполняет по шагам этот код.
Однако, если вам нужно проверить корректность загрузки DLL, то
нужно отладить код запуска. Отладчик позволяет отлаживать два вида такого кода: код инициализации, непосредственно следующий за
LibMain (по умолчанию) и скомпонованный с DLL код ассемблера.
Этот код инициализирует процедуры запуска и эмулирует математические пакеты (этот режим отладки выбирается параметром -l командной строки отладчика).
Чтобы начать отладку кода запуска DLL, нужно перезагрузить
программу (Run Program Reset или F2), а затем выполнить следующие
шаги:
которой вы хотите отладить;
нужной DLL в списке нет, добавьте ее как описано выше);
Reset или F2.
При отладке имейте в виде следующее:
первой строке после вызова LoadLibrary гарантирует возврат
управления в Turbo Debugger.
пройти его до конца и вернуться в приложение.
Отладка мультинитевых программ
Окно 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 вы можете отлаживать драйвер клавиатуры. При этом для перемещения по отладчику пользуйтесь "мышью".
обеспечьте наличие в ней отладочной информации.
резидентной программы и работайте с ней как обычно.
и отладчик обнаруживает точку останова. Вы можете отлаживать резидентный код.
Второй метод отладки резидентной части TSR предусматривает выполнение ее из командной строки DOS и использование
окна CPU отладчика для отладки содержащей TSR области ОЗУ.
таблицы идентификаторов и помещения ее в файл .TDS.
загрузите таблицу идентификаторов TSR (файл .TDS).
нажав ее оперативную клавишу, и работайте с программой
как обычно. При обнаружении точки останова отладчик приостанавливает TSR в начале резидентной части. Чтобы облегчить работу, синхронизируйте таблицу идентификаторов с
кодом в памяти. Идентификаторы в таблице отстоят друг от
друга на корректное число байт, но абсолютный адрес первого идентификатора не определен, так как DOS загрузила
резидентную программу по адресу в памяти, отличном от того, с которым она ассемблировалась. Поэтому, чтобы найти
первый идентификатор в памяти, используйте команду File Table.
первого идентификатора из таблицы идентификаторов в соответствующую ячейку памяти. Таким образом, имеющаяся информация об идентификаторах будет соответствовать вашему
коду (программе). Для этого в ответ на подсказку отладчика задайте адрес сегмента 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).
[*] 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 ищет в следующем порядке:
Для определения области действия идентификатора отладчик использует текущую позицию курсора. Если вы измените в отладчике
область действия, это может дать непредсказуемые результаты, поэтому для возврата к текущей точке используйте команду 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 данная строка изменяется. Когда вы находитесь в системе меню, эта строка предлагает вам оперативное описание текущей команды меню.
Прерывание выполнения программы
При выполнении программы вы можете получить доступ к отладчику, нажав клавишу прерывания программы. Используемые клавиши зависят от типа отлаживаемого приложения:Ctrl+Alt+SysRq;
Ctrl+Alt+F11;
F12;
Это полезно использовать, когда в программе не установлены
точки останова.
Если при возврате в 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 | Одно из следующих: |
| 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 будет выведена следующая информация:
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
(общая и доступная виртуальная память).
Типы выражений
Вы можете использовать выражения для доступа к значениемидентификаторов программы, вычисления значений и изменения значений элементов данных. Допускается задавать шестнадцатиричные значения, адреса памяти, строки программы, байтовые списки и вызовы
функций. Формат записи шестнадцатиричного значения зависит от
выбранного механизма вычисления:
| 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 поддерживает размещение точек останова в шаблонах С++, шаблонах функций и шаблонах экземпляров классов и объектов. Для установки таких точек останова используются следующие методы:шаблона.
клавиши 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.
Требования к программному и аппаратному обеспечению
Для сеанса удаленной отладки вы можете выбрать соединениечерез последовательный порт или через локальную сеть. В этих случаях используются разные аппаратные средства, однако должны соблюдаться следующие общие требования:
(или для отлаживаемой программы Windows и WREMOTE). Это
удаленная система.
Две системы должны соединяться через последовательный порт
нуль-модемным кабелем. При соединении через локальную сеть потребуется программное обеспечение, совместимое с Novell Netware.
программное обеспечение, совместимое с Novell Netware (версии IPX
и NETBIOS 3.0 или старше).
Удаление точек останова
Удалить точки останова можно с помощью локального меню (SpeedMenu) окна Breakpoints или меню Breakpoints. Команда Remove меню окна Breakpoints или клавиша Del стирают точку останова, подсвеченную в области списка. Команда Delete All меню Breakpoint илокального меню окна Breakpoints удаляют все установленные точки
останова.
Удаленная отладка
Удаленная отладка означает с соответствии со своим названиемследующее: вы запускаете отладчик на одном компьютере, а отлаживаемую программу - на другом. Две системы могут соединяться через
последовательный порт или через локальную сеть LAN, совместимую с
NETBIOS. Удаленную отладку полезно использовать в следующих ситуациях:
ошибках распределения памяти.
В случае отладки прикладной программы 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 приостанавливает выполнение программы. О других
действиях рассказывается ниже.
Установка точек останова по изменению памяти
Эти точки останова отслеживают выражения, при вычислении которых получается объект памяти или адрес. Они активизируются приизменении значения соответствующего объекта данных или указателя
памяти. Для установки такой точки останова нужно выполните те же
шаги, что и перечисленные выше, но
True щелкните "мышью" на кнопке с зависимой фиксацией
Changed Memory.
Когда ваша программа обнаруживает строку с такой точкой останова, условное выражение вычисляется перед выполнением этой
строки. Это нужно учитывать.
При вводе выражения вы можете также ввести счетчик числа
отслеживаемых объектов. Общее число отслеживаемых байт памяти
равно произведению размеру объекта, на которое ссылается выражение, на счетчик объекта.
Установка точек останова в нитях
Программы для Windows NT состоят из одной или более выполняемых "нитей". При их отладки вы можете установит точки останова вконкретных нитях, даже если этот код совместно используется несколькими нитями. По умолчанию точка останова в программе Windows
NT устанавливается во всех нитях программы. Чтобы установить ее
только в одной нити, сделайте следующее:
щелкните "мышью" в на кнопке Change диалогового окна Breakpoint Options. Если нужно, установите для точки останова условия и действия. По умолчанию отмечается кнопка All
Threads - точки останова устанавливаются во всех активных нитях.
ввода Threads. Наберите в этом поле номер нити Windows NT.
(Чтобы получить номер нити Windows NT, с помощью команды
View Thread откройте диалоговое окно Thread. В области
Threads List выводятся все активные нити.)
Установка Turbo Debugger
Программа INSTALL, поставляемая с компилятором Borland, полностью устанавливает пакет Turbo Debugger, включая выполняемыефайлы, файлы конфигурации, утилиты, справочные текстовые файлы и
примеры программ. Эта установочная программа создает пиктограммы
для компилятора Borland и инструментальных средств языка, помещая
их в новую программную группу Windows. Полный перечень файлов,
инсталлируемых программой INSTALL.EXE, содержится в файле FILELIST.DOC (этот файл копируется программой инсталляции в основной
каталог компилятора).
Установка условных точек останова
Эти точки останова также устанавливаются по конкретному адресу в программе, однако имеют специальные условия и связанные иними действия.
Иногда точку останова нежелательно активизировать при каждом
ее обнаружении, особенно когда содержащая ее строка выполняется
многократно. Не всегда также желательно приостанавливать программу на точке останова. В таких случаях используются условные точки
останова. Для создания условной точки останова можно выполнить
следующие шаги:
нужную точку останова.
выполняемые по ней действия.
умолчанию условие точек останова устанавливается в Always,
то есть они срабатывают каждый раз при обнаружении их в
программе. щелчок "мышью" на кнопке с зависимой фиксацией
Expression True задает активизацию точки останова только
после того, как заданное вами выражение станет истинным.
будет вычисляться при каждом обнаружении точки останова.
Pass Count. Это поле определяет, сколько раз должно удов летворяться условие точки останова, прежде чем точка оста нова будет активизирована. По умолчанию он равен 1. Значе ние счетчика уменьшается при каждом удовлетворении усло вия.
останова действие, щелкните "мышью" на нужно кнопке с за висимой фиксацией группы Action.
Турбо отладчик Turbo Debugger представляет
Турбо отладчик Turbo Debugger представляет собой набор инструментальных средств, позволяющий отлаживать программы на уровнеисходного текста и предназначенный для программистов, использующих семейство компиляторов Borland. В пакет отладчика входят набор выполняемых файлов, утилит, справочных текстовых файлов и
примеров программ.
Turbo Debugger позволяет вам отлаживать программы для Microsoft Windows, Windows 32s, Windows NT и DOS. Многочисленные перекрывающие друг друга окна, а также сочетание спускающихся и
раскрывающихся меню обеспечивают быстрый, интерактивный пользовательский интерфейс. Интерактивная, контекстно-зависимая справочная система обеспечит вас подсказкой на всех стадиях работы. Кроме того, Turbo Debugger полный набор средств отладки:
памяти.
сообщениям.
(для 32-разрядной отладки имеется отладчик TD32).
также С и С++.
процессов.
Для работы 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 должны удовлетворяться следующие условия:.EXE программы.
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 имя сообщения или его
номер. Если вы хотите регистрировать для конкретного окна несколько классов или сообщений, то
имена сообщений.
Задание пользовательских исключительных ситуаций
Поля ввода Range Low и Range High окна Specify ExceptionHandling позволяет задать исключительные ситуации операционной
системы, определенные пользователем. По умолчанию оба эти поля
устанавливаются отладчиком в 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 приложения. Исходный код программы отладчик
ищет в следующем порядке:
(или в параметре командной строки -sd);
После загрузки программы в отладчик вы можете с помощью ко манды 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) функцией). Для краткости изложения термин
"функция" часто используется для обозначения как функций языка
Си, так и функций и процедур языка Паскаль, конечно, кроме тех
разделов руководства, которые посвящены конкретным языкам.
Термин "аргумент" используется в данном руководстве как синоним термина "параметр". Он означает как аргументы (параметры)
командной строки, так и аргументы (параметры), передаваемые в
процедуры и функции.
Запуск отладчика
После компиляции и компоновки программ с включением отладочной информации вы можете начать процесс отладки, запустив TurboDebugger и загрузив с ним программу. При этом вы можете использовать один из трех отладчиков: 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, то для задания параметров командной строки може те сделать следующее:
"мышью" на командной кнопке Edit.
Макрокоманда $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 С++.
DOS 3.x argv[0] - полное (т.е. включая маршрут доступа)
имя запускаемой программы. argv[x] - параметр, набранный
в командной строке после функции (порядковый номер - x).
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 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.
| FileName | Имя выбранного файла. На входе задает исполь- зуемое по умолчанию имя файла, на выходе - имя выбранного файла. |
| Filter | Фильтры имени файла и фильтр-шаблоны имеет форму: фильтр фильтр шаблон ... где "фильтр" - это текстовая строка, описывающая фильтр, а шаблон фильтра - трафарет имени файла DOS. |
| CustomFile | Позволяет задать специальные фильтры. |
| FilterIndex | Определяет, какой из фильтров (Filter) следует выводить по умолчанию. |
| InitialDir | Каталог, который должен выводиться при открытии файлового диалогового окна. |
| DelExt | Заданное по умолчанию расширение, добавляемое к имени файла, если пользователь его не указывает. |
Диалоговые блоки печати
Существует два диалоговых блока печати. Диалоговое окно печати задания позволяет вам выбрать информацию для печати, качество печати, число копий и т.д. Диалоговое окно установки параметров печати позволяет выбрать инсталлированные в системе принтеры,ориентацию страницы, размер бумаги и т.д.
Элементы данных TPrintDialog::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 имеет несколько элементов которые перед построением объекта диалогового блока нужно инициализировать.
| 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 и деструктором и отменяет связь устройства с текущим принтером. |
| Связывает с устройством печати объект распечатки и выводит диалоговое окно 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
не сжимается до размеров окна клиента.
в соответствии с заданным размером и строкой
заголовка.
Функции-элементы
| 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
Графические объекты
Ниже описываются инкапсуляция в 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 предусмотрены следующие функции:
целое число), вы можете задать для окна таблицу акселераторов.
Характеристики управляющего элемента 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, и выполняет ряд задач:Для поддержки модели Doc/View администратор документа должен
подключаться к приложению. Это делается путем создания экземпляра
TDocManager и превращения его в администратор документа приложения. К общедоступным данным и функциям администратора документа
можно обращаться с помощью функции GetDocManager, которая не имеет параметров и возвращает TDocManager&. Для создания документов
и отображаемых элементов администратор документа предусматривает
следующие функции:
как функция-элемент TDocTemplate CreateDoc представляет
только свой собственный шаблон.
отображаемых элементов, которые поддерживают текущий документ и представляют список имен файлов, а функция-элемент
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 включает автоматическое создание объекта
диалогового блока, который вы передаете в качестве клиента.
Требуется также обеспечить, чтобы объект диалогового блока
имел определенные атрибуты:
нужно уничтожать явным образом.
здесь нельзя, так как это не основное окно. Ресурсы нужно
добавить в окно-рамку.
Использование диалоговых блоков
Приложению Windows часто требуется выводить подсказку дляввода пользователем имен файлов, цветов или шрифтов. ObjectWindows предусматривает классы, что облегчает использование диалоговых блоков, включая общие диалоговые окна Windows. Ниже перечислены различные типы диалоговых блоков и класс 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, нужно выполнить следующие шаги:
приложения вызовите функцию VBXTerm. В качестве параметра
функции VBXInit задается экземпляр приложения.
класса с TVbxEventHandler. Ваш базовый класс - это класс,
в котором вы хотите выводить управляющий элемент. Если вы
используете управляющий элемент в диалоговом окне, вам
нужно смешать его с TDialog.
создании родительского окна или позволить родительскому
объекту самому построить управляющий элемент.
Элементы данных
| 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 обеспечивает для управляющего элемента фактический интерфейс и позволяет вам:Класс 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 и обеспечивает следующие возможности:
просмотра печатаемой информации на экране.
Назначение интерфейсных объектов
Одна из наибольших трудностей программирования в 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 возможными
значениями:
вертикальное).
С помощью enum TWidthHeight можно задать ограничение высоты
или ширины окна:
спецификации родительского окна используется lmParent.
Units.
TEdgeConstraint содержит также ряд функций, которые вы можете использовать для задания предопределенных соотношений, тесно
связанных с теми, которые задаются в Set.
Для задания схемы окна недостаточно одного ограничения расположения. Например, указание того, что окно должно находиться на
10 элементов изображения ниже другого окна ничего не говорит о
высоте и ширине окна, расположении его левого или правого края
или нижней границы. Комбинация ограничений схемы расположения может полностью определить расположение окна. TLayoutMetrics использует 4 ограничения расположения: два объекта TEdgeConstraint
(X и Y), TEdgeOrWidthConstraint (Width) и TEdgeOrHeightConstraint
(Height).
TLayoutMetrics - достаточно простой класс. Его конструктор
не имеет параметров и только устанавливает элемент каждого ограничения. Для каждого ограничения схемы ограничивающее окно обнуляется, соотношение устанавливается в lmAsIs, единицы устанавливаются в lmLayoutUnits, а значение - в 0.
После построения объекта TLayoutMetrics вам нужно задать ограничения схемы нужного окна. Для установки каждого ограничения
можно использовать соответствующую функцию.
Чтобы лучше понять, как совместно работают ограничения, выполните пример приложения LAYOUT из каталога примеров программ.
Его диалоговое окно позволяет изменить ограничения каждого из
окон и увидеть результаты. Однако ограничения нужно описывать
полностью. Неполное описание может приводить к аварийному завершению.
Оконные объекты
Оконные объекты - это интерфейсные объекты высокого уровня,облегчающие работу с окнами, дочерними окнами и управляющими элементами. ObjectWindows предусматривает несколько различных типов
оконных объектов:
Еще один класс оконных объектов, окна реквизитов, описывается в другом разделе.
Описание и определение таблиц реакции
Поскольку таблица реакции является членом класса 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.
RegisterWindowMessage).
обрабатывать уведомляющие коды дочерних объектов в дочернем или родительском объекте.
обрабатываются сообщения от специализированных управляющих
элементов, таких как командные кнопки, комбинированные
блоки, редактируемые управляющие элементы, блоки списков и
др.
приложения о создании или уничтожении документа или отображаемого элемента и уведомления отображаемых элементов о
событиях администратора документа.
Опрос объектов меню
TMenu имеет ряд функций-элементов и операций, с помощью которых вы можете получать информацию об объекте и его меню. Это operator UINT и operator HMENU (возврат описателя меню), IsOK (проверка допустимости описателя меню), GetMenuItemCount (числопунктов меню), GetMenuCheckMarkDimensions (размер битового массива для вывода отметки меню), GetMenuItemID (идентификатор пункта в заданной позиции), GetMenuState (флаги состояния заданного пункта), GetMenuString (текст заданного пункта меню), GetSubMenu
(описатель меню в заданной позиции).
Организация класса GDI
Большинство классов, инкапсулирующих функциональные возможности GDI, являются производными от класса TGdiObject. Это абстрактный класс для объектов GDI ObjectWindows. Он обеспечиваетбазовый деструктор, операцию преобразования HGDIOBJ и базовую
функцию GetObject.
Другими классами GDI ObjectWindows являются классы:
GDI ObjectWindows. Вы можете создать объект TDC непосредственно или в производных классах, определив более специализированное поведение.
используя существующий оператор пера, объект пера или логическое перо.
или шаблонную кисть, или использовать описатель существующей кисти, объект кисти или логическую кисть.
можете построить шрифт со специальной спецификацией, либо
задать существующий описатель шрифта, объект шрифта или
логический шрифт (структуру LOGFONT).
новую палитру или использовать существующие таблицы цветов
из различных DIB.
можете построить такой массив из многих ресурсов, включая
файлы, описатели битовых массивов, ресурсы приложений и т.д.
курсор из ресурса или на основе явной информации.
устройства (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, нужно
вызвать конструктор с параметром dmSDI, а в режиме MDI - с параметром dmMDI. Другие параметры конструктора задает построение для
администратора документа собственное меню File, разрешают в меню
File команду Save даже если документ не изменен и запрещают в меню File команду Revert. После построения администратора документа
вы не можете изменить режим.
Построение и уничтожение объектов управляющих элементов
Построение объекта управляющего элемента отличается от построения любого другого дочернего окна. Обычно конструктор родительского окна вызывает конструкторы всех его дочерних окон. Кроме обычных связей, управляющие элементы взаимодействуют с родительскими окнами с помощью уведомлений. Чтобы построить и инициализировать объект управляющего элемента нужно:родительское окно;
Часто при построении в окне управляющего элемента нужно сохранять указатель на управляющий элемент в элементе данных оконного объекта. Это делается для удобства доступа к функциям-элементам управляющего элемента. Для тех управляющих элементов, с которыми вы манипулируете редко (таких как статические элементы и
групповые блоки), такой указатель не требуется.
Некоторым конструкторам управляющих элементов передаются параметры, определяющие характеристики объектов управляющих элементов. Это следующие параметры:
Существуют также конструкторы, связывающие объект управляющего элемента с интерфейсным элементом, созданными из определения
ресурса.
Все управляющие элементы получают используемые по умолчанию
стили окна 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 поведение реализуется классами
TMDIXxx, поэтому вы можете сосредоточиться на специфическом для
приложения поведения.
Окно-рамка MDI всегда является основным окном приложения,
так что вы можете построить его в функции-элементе InitMainWindow
объекта приложения. Окна-рамки 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 объекта, которая делает следующее:
При создании интерфейсного элемента оконного объекта возможны две особых ситуации С++. Таким образом, для обработки проблем
с ресурсами или памятью вы должны заключить вызовы Create в блок
try/catch. Если окно создать невозможно, Create порождает особую
ситуацию TXInvalidWindow, а при невозможности создания дочернего
окна - TXInvalidChildWindow. Обе особых ситуации обычно вызываются нехваткой памяти или других ресурсов.
Основное окно приложения автоматически создается TApplication::InitInstance. Для создания основного окна вызов Create не требуется.
Создание интерфейсных объектов
Создание интерфейсного объекта с соответствующими интерфейсными элементами требует следующих шагов:создании нового интерфейсного объекта с новым интерфейсным элементом:
Связь между интерфейсным объектом и интерфейсным элементом
поддерживается через элемент данных 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. Объект окна выводит содержимое и управляет взаимодействием с экраном устройства. Контекст устройства объекта распечатки аналогичным образом изолирует вас от устройства печати. Чтобы создать объект распечатки:
функцию-элемент PrintPage. В простейшем случае этого достаточно.
Текущая страница печати передается PrintPage в качестве параметра.
Объект распечатки имеет поля, содержащие размер страницы и
контекст устройства. Объект принтера устанавливает эти значения
вызовом функции-элемента SetPrintParams объекта распечатки. Контекст устройства объекта распечатки вам следует использовать при
любых вызовах графических функций Windows.
Списки дочерних окон
Вы задаете родителя интерфейсного элемента во время егоконструирования. Родительский оконный объект является параметром
конструктора интерфейсного объекта. Дочерний оконный объект хранит в своем элементе данных Parent адрес своего родительского
оконного объекта как указатель на этот объект. Он также автоматически сохраняет адреса своих дочерних оконных объектов в частном
элементе данных ChildList.
Получить доступ к дочерним окнам объекта вы можете с помощью
функций-итераторов. Функции элементы ForEach и FirstThat получают
в качестве первого аргумента указатель на функцию. Подробнее о
них рассказывается ниже.
Справочное руководство по ObjectWindows 2.0 для С++
В данном руководстве в алфавитном порядке перечислены классыи структуры ObjectWindows с указанием соответствующих файлов-заголовков. Многие из характеристик данных классов иерархически
наследуются из базовых классов.
Примечание: Если класс имеет несколько конструкторов,
то описывается только наиболее общий из них.
Стандартные объекты проверки допустимости
Стандартные классы проверки допустимости ObjectWindows автоматизируют проверку данных. ObjectWindows определяет в validate.h6 классов проверки допустимости:
| TValidator | Базовый класс, из которого создаются все другие производные классы. |
| TFilterValidator | Класс фильтра проверки допустимости. |
| TRangeValidator | Класс проверки допустимости по целочисленному диапазону. |
| TLookupValidator | Класс проверки по таблице. |
| TStringLookupValidator | Класс проверки допустимости строки. |
| TPXPictureValidator | Класс проверки допустимости по шаблону. |
Статические библиотеки ObjectWindows
В следующей таблице перечислены статические библиотеки ObjectWindows, их использование операционной системой, и в какойоперационной системе они доступны. Эти файлы находятся в вашем
библиотечном каталоге. Базовые версии файлов ObjectWindows содержатся на инсталляционных дискетах. Дополнительные версии вы можете построить с помощью формирующего файла ObjectWindows (который
находятся в каталоге SOURCE\OWL), используя параметры -DDIAGS и
-DMODEL.
| OWLWS.LIB | Win16 | 16-разрядная малая модель |
| OWLWM.LIB | Win16 | 16-разрядная средняя модель |
| OWLWL.LIB | Win16 | 16-разрядная большая модель |
| OWLDWS.LIB | Win16 | 16-разрядная диагностическая малая модель |
| OWLDWM.LIB | Win16 | 16-разрядная диагностическая средняя модель |
| OWLDWL.LIB | Win16 | 16-разрядная диагностическая большая модель |
| OWLWF.LIB | Win32s, Win32 | 32-разрядная библиотека |
| OWLDWF.LIB | Win32s, Win32 | 32-разрядная диагностическая библиотека |
| OWLWI.LIB | Win16 | 16-разрядная библиотека импорта для OWL200.DLL |
| OWLDWI.LIB | Win16 | 16-разрядная библиотека импорта для OWL200D.DLL |
| OWLWFI.LIB | Win32s, Win32 | 32-разрядная библиотека импорта для OWL200F.DLL |
| OWLDWFI.LIB | Win32s, Win32 | 16-разрядная библиотека импорта для OWL200DF.DLL |
| OWL200.DLL | Win16 | 16-разрядная динамическая библиотека |
| OWL200F.DLL | Win32 | 32-разрядная динамическая библиотека |
| 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 или специальным именем события.
Типы комбинированных блоков
Существуют 3 типа комбинированных блока: простой, раскрывающийся и раскрывающийся со списком. Все эти комбинированные блокивыводят свою область редактирования, но блок списка в некоторых
из них может быть скрыт.
Простой комбинированный блок не может скрывать свою область
списка. Его область редактирования ведет себя как редактируемый
управляющий элемент. Пользователь может вводить и редактировать
текст, не обязательно совпадающий с одним из элементов списка.
Комбинированный блок с раскрывающимся списком ведет себя как
простой комбинированный блок, однако в начальном состоянии область списка не выводится. Она появляется после щелчка "мышью" на
пиктограмме справа от области редактирования.
Область списка комбинированного блока с раскрывающимся списком ведет себя как область списка раскрывающегося блока и выводится только при необходимости. Эти два типа комбинированных
блоков отличаются только поведением области редактирования, которая в комбинированном блоке с раскрывающимся списком ограничивается выводом текста только одного из элементов списка.
Комбинированные блоки с раскрывающимся списком полезно использовать, когда нужно ограничить выбор только теми элементами,
которые содержатся в списке. Раскрывающиеся комбинированные блоки
могут воспринимать записи, отличные от элементов списка.
Уничтожение интерфейсных объектов
Уничтожение интерфейсного объекта предусматривает два этапа:уничтожение интерфейсного элемента и удаление интерфейсного объекта. Если создавать и выводить интерфейсный элемент требуется
снова, вы можете уничтожить интерфейсный элемент, не удаляя интерфейсного объекта.
Уничтожение интерфейсного элемента выполняет функция-элемент
Destroy интерфейсного объекта. Для уничтожения интерфейсных элементов Destroy вызывает функцию API DestroyWindow. При уничтожении интерфейсного элемента элемент данных HWindow устанавливается в 0.
При закрытии пользователем окна происходит следующее:
Интерфейсный объект - это обычный объект С++, и вы можете
удалить его с помощью оператора 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:
| 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 дает объекту приложения, основному окну и
всем другим окнам возможность подготовиться к закрытию или предотвратить его. Нормальное закрытие имеет такую последовательность:
функцию-элемент CanClose объекта приложения.
CanClose для каждого из дочерних окон. Эти функции 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 | Характеристика определена пользователем на этапе выполнения. |
Биржевая торговля: Механические торговые системы - Создание - Программирование
- Механические торговые системы (МТС)
- Технический анализ и МТС
- Разработка механических торговых систем
- Механические торговые системы
- GNU механические торговые системы
- Тестирование механических торговых систем
- MetaStock - механические торговые системы
- Omega Trade Station - механические торговые системы
- МТС - обзор языков программирования
- Си для механических торговых систем
- C# для механических торговых систем
- C++ для механических торговых систем
- Borland C++ для механических торговых систем
- C++ Builder для механических торговых систем
- Visual C++ для механических торговых систем