Сообщения ввода
WM_CHAR | WM_MENUSELECT |
WM_CHARTOITEM | WM_PARENTNOTIFY |
WM_COMMAND | WM_SYSCHAR |
WM_DEADCHAR | WM_SYSDEADCHAR |
WM_KEYDOWN | WM_SYSKEYDOWN |
WM_KEYLAST | WM_SYSKEYUP |
WM_KEYUP | WM_TIMER |
WM_MENUCHAR | WM_VKEYTOITM |
Сообщения Windows
WM_ACTIVATE | WM_KILLFOCUS |
WM_ACTIVATEAPP | WM_MOVE |
WM_CANCELMODE | WM_PAINT |
WM_CLOSE | WM_PAINTICON |
WM_CREATE | WM_Q |
Соответствие цветов интерфейса системным цветам
DIB часто используются для улучшения и декодирования интерфейса с пользователем. Чтобы согласовать свой интерфейс с пользовательской системой своего приложения, следует использовать функцию MapUIColors, которая заменяет стандартные цвета интерфейса на
собственные системные цвета пользователя. В первом параметре этой
функции с помощью операции OR комбинируются из 5 флагов:
TDib::MapText | TColor::Black | COLOR_BTNTEXT |
TDib::MapFace | TColor::LtGray | COLOR_BTNFACE |
TDib::MapFace | TColor::Gray | COLOR_BTNSHADOW |
TDib::MapFace | TColor::White | COLOR_BTNHIGHLIGHT |
TDib::MapFrame | TColor::LtMagenta | COLOR_WINDOWFRAME |
Второй параметр, если он задается, приводит к замене TColor::LtYellow на bkColor. Так как эта функция ищет и заменяет записи таблицы TColor, ее полезно использовать с DIB только в режиме RGB. Поскольку она заменяет отдельные цвета, вы должны проектировать свой интерфейс с использованием стандартный цветовой
схемы.
Сопроцессор
Си работает с двумя числовыми типами: целыми (int, short,
long и т.д.) и с плавающей точкой (float double и long double).
Процессор вашего компьютера легко справляется с обработкой чисел
целых типов, однако числа с плавающей точкой отнимают больше времени и усилий.
Семейство процессоров iAPx86 имеет сопутствующее ему семейство математических сопроцессоров - 8087, 80287 и 80387. Мы будем
обозначать все семейство математических сопроцессоров 80x87 термином "сопроцессор". (В случае процессора 80487 вы имеете математический сопроцессор уже встроенным в основной.)
Процессор 80х87 представляет собой специальный аппаратно реализованный числовой процессор, который можно установить на вашем
PC. Он служит для выполнения с большой скоростью команд с плавающей точкой. При большом количестве в вашей программе операций с
плавающей точкой вам, безусловно, нужен сопроцессор. Блок центрального процессора в вашем компьютере осуществляет интерфейс с
80х87 по специальным шинам интерфейса.
Совместная работа документов и отображаемых элементов
В данном разделе описываются основные принципы модели
Doc/View. Эта модель освобождает программиста и пользователя от
необходимости думать от типах данных и о том, как они представляются на экране. Doc/View связывает типы файлов данных с классом
документа и классом просмотра. Администратор документов поддерживает список ассоциаций между классами документа и классами просмотра. Каждая ассоциация называется шаблоном документа (не путайте его с шаблонами С++).
Класс документа управляет хранением данных и манипулированием ими. Он содержит информацию, которая выводится на экран. Объекты документов управляют изменениями данных и передачей их в постоянную память (например, на диск).
Когда пользователь открывает документ (существующий или создавая новый документ), он выводится с помощью соответствующего
(ассоциированного с ним) класса отображаемого элемента. Класс
отображаемого элемента управляет выводом данных на экран и тем,
как пользователь взаимодействует с данными на экране. Фактически,
отображаемый элемент формирует интерфейс между окном на экране и
документом. Некоторые типы документов могут иметь только один ассоциированный с ними класс отображаемого элемента, другие - несколько. Различные типы отображаемых элементов определяют различных характер взаимодействия пользователя с документом.
Совместное использование Style Sheet
Если вы создаете для проекта набор Style Sheet, а затем выбираете Project New project, то новый проект наследует Style Sheet (а также инструментальные средства и параметры) из старого
проекта. Однако, если вы закроете проект или перезапустите IDE,
то вам придется заново открыть проект со Style Sheet, а затем
создать новый проект, наследующий Style Sheet.
Совместно использование Style Sheet в проектах можно обеспечить и другим способом. При каждом создании файла проекта вы создаете также файл языка описания проекта (.PDL), который содержит
информацию об используемых в проекте наборах Style Sheet и Tools.
Этот файл нужно редактировать аккуратно, иначе администратор проекта не сможет его считывать.
При открытии файла проекта администратор проекта отрывает
файл .PDL с тем же именем, что и имя файла .IDE. Чтобы совместно
использовать в проектах Style Sheet, сделайте следующее:
Откройте файл .PDL, содержащий Style Sheet, используя
обычный текстовый редактор.
Найдите имя Style Sheet и скопируйте текст, заключенный в
фигурные скобки (можно сделать несколько копий).
Откройте файл .PDL, в который нужно скопировать Style Sheet.
Найдите секцию Style Sheet и вставьте скопированный текст
в конец существующего списка Style Sheet.
Сохраните файл .PDL со скопированной секцией Style Sheet.
Когда вы откроете проект, связанный с обновленным файлом
.PDL, то увидите при выборе Options Style Sheet новый набор Style Sheet.
Создание DLL
DLL создаются аналогично файлам .EXE: компилируются файлы
исходного кода, затем выполняется компоновка объектных файлов.
Однако, DLL не имеют функции main и компонуются по другому. Ниже
рассказывается, как следует писать DLL.
LibMain, DllEntryPoint и WEP
В качестве основной точки входа для DLL должны предусматриваться функция LibMain (для 16-разрядных программ) или DllEntryPoint (для 32-разрядных). В случае 32-разрядных программ Windows
вызывает DllEntryPoint при каждой загрузке или выгрузке DLL, при
каждом присоединении или отсоединении от DLL дополнительных процессов или при создании/уничтожении внутри процесса нити.
Инициализация DLL практически целиком зависит от функции
конкретной DLL и может включать в себя следующие основные задачи:
Разблокировку сегмента данных с помощью UnlockData, если
она описывается как MOVEABLE (только для 16-битовых приложений).
Задание для DLL глобальных переменных (если она их использует).
Код инициализации выполняется только для первого приложения,
использующего DLL. Код запуска DLL автоматически инициализирует
локальную динамически распределяемую область памяти, поэтому в
LibMain не нужно включать соответствующий код. Функции LibMain
передаются следующие параметры:
int FAR PASCAL LibMain (HINSTANCE hInstance, WORD wDataSeg;
WORD cbHeapSize, LPSTR lpSmdLine)
hInstance - это описатель экземпляра DLL.
wDataSeg - это значение регистра сегмента данных (DS).
cbHeapSize - размер локальной динамически распределяемой
области памяти, заданной для DLL в файле определения модуля.
lpCmdLine - это дальний указатель командной строки, задан ной при загрузке DLL. Он почти всегда нулевой, так как DLL
обычно загружается автоматически и без параметров.
LibMain обычно возвращает значение 0 (успешная инициализация) или 1 (неуспешная инициализация). В последнем случае Windows
выгружает DLL из памяти.
Точкой выхода для 16-битовой DLL является функция WEP (Windows Exit Procedure). Эта функция для DLL не обязательна, так как
библиотеки исполняющей системы Borland C++ предусматривают ее по
умолчанию, но для выполнения какой-либо очистки перед выгрузкой
DLL из памяти вы можете указать свою собственную функцию.
В Borland С++ WEP экспортировать не требуется. Borland С++
определяет свою собственную WEP, которая вызывает вашу WEP (если
она определена), а затем выполняет очистку системы. WEP имеет
следующий прототип:
int FAR PASCAL WEP (int nParameter)
где nParameter - это WEP_SYSTEMEXIT или WEP_FREE_DLL. WEP_SYSTEMEXIT указывает на завершение работы Windows, а WEP_FREE_DLL
только на выгрузку DLL. В случае успешного выполнения WEP возвращает 1. По этому значению Windows в настоящее время не выполняет
никаких действий.
Создание дочерних интерфейсных элементов
Как и все интерфейсные объекты, объекты дочерних окон создаются в два этапа: построение интерфейсного объекта и создание интерфейсного элемента. Если вы строите дочерний объект в конструкторе родительского окна, их интерфейсные элементы создаются автоматически (при разрешении автоматического создания для дочерних
окон). По умолчанию автоматическое создание разрешено для всех
объектов ObjectWindows на базе TWindow, за исключением TDialog.
Если вы не строите в родительском окне дочерние объекты, они
не будут автоматически создаваться и выводиться вместе с родительским окном. Вы можете создать их самостоятельно с помощью
Create или (в случае режимного окна) Execute. При этом создание
означает создание экземпляра интерфейсного элемента.
Создание интерфейсных элементов окна
После построения оконного объекта вам нужно сообщить Windows
о создании соответствующего интерфейсного элемента. Это можно
сделать путем вызова функции-элемента Create объекта, которая делает следующее:
Создает интерфейсный элемент.
Устанавливает HWindow в описатель интерфейсного элемента.
Устанавливает элементы Attr в фактическое состояние интерфейсного элемента (Style, ExStyle, X, Y, H, W).
Вызывает SetupWindow.
При создании интерфейсного элемента оконного объекта возможны две особых ситуации С++. Таким образом, для обработки проблем
с ресурсами или памятью вы должны заключить вызовы Create в блок
try/catch. Если окно создать невозможно, Create порождает особую
ситуацию TXInvalidWindow, а при невозможности создания дочернего
окна - TXInvalidChildWindow. Обе особых ситуации обычно вызываются нехваткой памяти или других ресурсов.
Основное окно приложения автоматически создается TApplication::InitInstance. Для создания основного окна вызов Create не требуется.
Создание интерфейсных объектов
Создание интерфейсного объекта с соответствующими интерфейсными элементами требует следующих шагов:
Вызова одного из конструкторов интерфейсных объектов, который строит интерфейсный объект и устанавливает его атри буты.
Создания интерфейсного элемента и информирования Windows о
создании нового интерфейсного объекта с новым интерфейсным элементом:
При создании большинства интерфейсных элементов вызывается функция Create интерфейсного объекта. Create может косвенно вызывать SetupWindow, которая инициализирует интерфейсный объект созданием нового интерфейсного элемента (например, дочернего окна).
При создании режимного диалогового окна вы создаете интерфейсный элемент вызовом функции-элемента Execute интерфейсного объекта.
Связь между интерфейсным объектом и интерфейсным элементом
поддерживается через элемент данных HWindow - описатель окна.
Обычно в Windows вновь создаваемый интерфейсный элемент получает от Windows сообщение WM_CREATE и отвечает на него своей
инициализацией. Интерфейсный объекты ObjectWindows перехватывают
это сообщение и отвечают на него вызовом SetupWindow, где вы можете выполнить собственную инициализацию.
Если при инициализации интерфейсного объекта требуется описатель окна интерфейсного элемента, то вы должны выполнить эту
инициализацию после вызова функции SetupWindow базового класса.
До вызова функции SetupWindow базового класса и создания его дочерних окон HWindow будет недействительным (имеет значение NULL).
Из-за того, что большая часть инициализации выполняется в
конструкторе интерфейсного объекта, после создания этого объекта
вы не сможете изменить его характеристики. Таким образом, требуется двухэтапная инициализация: до создания интерфейсного элемента (конструктор) и после него (SetupWindow).
Создание экземпляров шаблона класса
После определения шаблона класса вы можете создать любое
число экземпляров этого класса. Эти экземпляры можно использовать
для различных описаний шаблона, поиска различных заданных по
умолчанию файлов, просмотра различных каталогов и т.д. Сигнатура
конструктора шаблона класса всегда одинакова и имеет вид:
TplName name(LPCSTR desc, LPCSTR filt, LPCSTR dir, LPCSTR
ext, long flags);
где TplName - имя класса, заданного при определении шаблона класса, name - имя данного экземпляра, desc - описание текста шаблона, filt - строка, используемая для фильтрации имен файлов в текущем каталоге (одно или более выражений, разделенных точкой с
запятой), dir - заданный по умолчанию каталог для файлов документов, ext - расширение, задаваемое по умолчанию при сохранении
файлов, flags - режим открытия и создания документа:
dtAutoDelete | Закрывает и удаляет объект документа при закрытии последнего отображаемого элемента. |
dtNoAutoView | Не создает автоматически заданный по умолчанию отображаемый элемент. |
dtSingleView | Допускает только один отображаемый элемент на документ. |
dtAutoOpen | Открывает документ при создании. |
dtHidden | Скрывает шаблон в списке выбора пользователя. |
Создание класса документа
Основной функцией класса документа является обеспечение обратных вызовов для изменений в отображаемом элементе нужных данных, обработки действий пользователей через соответствующие отображаемые элементы и сообщения отображаемым элементам об изменении
соответствующих данных.
TDocument - это абстрактный базовый класс, обеспечивающий
данные функциональные возможности. Непосредственно создать его
экземпляр нельзя, поэтому необходимы производные классы. При
построении производного класса вызывается конструктор TDocument.
Этот конструктор воспринимает только один параметр TDocument*,
который указывает на родительский документ нового документа или
равен 0 (по умолчанию).
Обычно следует избегать переопределения функций TDocument,
так как они не описаны как virtual. Администратор документа обращается ко всем производным объектам TDocument как к фактическим
объектам TDocument. Если вы переопределяете невиртуальную функцию, она не вызывается, когда к ней обращается администратор документа. Вместо этого администратор документа вызывает версию
TDocument этой функции. Однако при переопределении виртуальной
функции TDocument (~TDocument, InStream, OutStream, Open, Close,
Commit, Revert, RootDocument, SetDocPath, SetDocPath, SetTitle,
GetProperty, IsDirty, IsOpen, CanClose, AttachStream и DetachStream) администратор документа корректно вызывает вашу функцию.
Если функция базового класса выполняет какие-то важные действия,
то ее следует вызывать внутри определяемой вами функции.
Создание класса отображаемого элемента
Пользователь почти никогда не взаимодействует непосредственно с документом. Он работает с интерфейсным объектом, таким как
оно, диалоговое окно или таким типом отображения, который подходит для данных. При этом все функциональные возможности реализуются отображаемые элементы. Отображаемые элементы связывают объекты, получающие данные из объекта документа, и передают их интерфейсному объекту, сообщая ему, как отображать данные.
Создание многоцелевого проекта
Создание многоцелевого проекта выполняется аналогично:
Создайте проект, используя описанные выше шаги.
Выберите Project New target. Выводится диалоговое окно New
Target.
Наберите имя для второй целевой платформы и выберите тип
(по умолчанию Standard). Выберите OK.
Создание новых классов sber_bank
Класс sber_bank может стать основой по которой будут созданы
другие классы:
Класс Потомки класса sber_bank
v v v
sber_bank broke_bank, cold_cash_inc;
Объекты - на самом деле только переменные, созданные из структур. Так же как и в любой структуре, вы можете сохранять данные в
объекте.
class sber_bank {
Объект sber_bank public:
double big_bucks;
...
< Deposit << };
$$$ <-------------------------------
<<
Данные > Withdraw >>
Функции элементы
Доступ к данным объекта выполняется подобно обращению к элементу
структуры в языке Си через селектор '.'.
Например:
class sber_bank {
public:
double big_bucks;
...
};
sber_bank my_bank;
Объект Данные
v v
my_bank.big_bucks = 1000000.00;
^
Селектор
Создание объекта принтера
Простейший способ создания объекта принтера состоит в описании в оконном объекте TPrinter*, который другие объекты в программе смогут использовать в целях печати (см. пример программы
PRINTING.CPP в каталоге OWLAPI\PRINTING).
Основное окно приложения инициализирует объект принтера и
использует заданный по умолчанию в WIN.INI. Однако в некоторых
случаях вы можете задать другие принтеры. В этом случае постройте
объект принтера в конструкторе каждого соответствующего окна. Затем измените устройство принтера. Рекомендуется всегда использовать конструктор по умолчанию, а потом изменять связанное с объектом устройство.
Создание объекта распечатки
Создание объекта распечатки аналогично написанию функции-элемента Paint для оконного объекта: для генерации нужного
образа в контексту устройства используйте графические функции
Windows. Объект окна выводит содержимое и управляет взаимодействием с экраном устройства. Контекст устройства объекта распечатки аналогичным образом изолирует вас от устройства печати. Чтобы создать объект распечатки:
Создайте из TPrintout новый тип объекта и переопределите
функцию-элемент PrintPage. В простейшем случае этого достаточно.
Если документ имеет более одной страницы, нужно также определить функцию-элемент HasPage. При наличии другой страницы для печати она должна возвращать ненулевое значение.
Текущая страница печати передается PrintPage в качестве параметра.
Объект распечатки имеет поля, содержащие размер страницы и
контекст устройства. Объект принтера устанавливает эти значения
вызовом функции-элемента SetPrintParams объекта распечатки. Контекст устройства объекта распечатки вам следует использовать при
любых вызовах графических функций Windows.
Создание потоковых объектов
Простейший способ сделать класс потоковым состоит в использовании макрокоманд, предусмотренных в библиотеке постоянных потоков. Для большинства классов будут работать следующие шаги.
Сделайте TStreamableBase виртуальной базой вашего класса
(прямо или косвенно).
Добавьте в определение класса макрокоманду
DECLARE_STREAMABLE.
Добавьте в один из своих исходных файлов макрокоманду
IMPLEMENT_STREAMABLE. Рекомендуется также добавление макрокоманды IMPLEMENT_CASTABLE.
Запишите в одном из своих исходных файлов определения
функций-элементов Read и Write.
Чтобы определить потоковый класс, вам нужно:
Включить файл objstrm.h.
Основывать свой класс на классе TStreamableBase.
Включите в свое определение класса макрокоманду
DECLARE_STREAMABLE, например:
#include <objstrm.h>
class Sample : public TStreamableBase
{
public:
// функции-элементы и т.д.
private:
int i;
DECLARE_STREAMABLE(IMPEXPMACRO, Sample, 1);
};
Классы, шаблоны и макрокоманды, необходимые для определения
потокового класса, предусмотрены в файле objstrm.h. Каждый потоковый класс должен наследовать (прямо или косвенно) из класса
TStreamableBase. В данном примере класс Sample наследует непосредственно из TStreamable. Класс, производный из Sample, не будет
явно наследовать из TStreamableBase, поскольку это уже делает
Sample. Если вы используете множественное наследование, то следует сделать TStreamableBase виртуальной базой. Это несколько увеличит классы, но никакого отрицательного эффекта не окажет.
В большинстве случае для определения потокового класса достаточно макрокоманды DECLARE_STREAMABLE. Эта макрокоманда воспринимает три параметра. Первый из них используется при компиляции
DLL. Второй параметр - это имя определяемого класса, а третий номер версии для этого класса. Потоковый код не обращает внимание
на номер версии класса.
DECLARE_STREAMABLE добавляет в ваш класс конструктор, воспринимающий параметр типа Streamable. Он предназначен для применения в потоковом коде, и непосредственно не используется.
DECLARE_STREAMABLE создает также для вашего класса два экстрактора, так что вы можете записывать объекты для считывания их из
постоянных потоков. Для класса приведенного выше примера класса
Sample эти функции имеют следующие прототипы:
opstream& operator << { opstream&, const Sample& };
opstream& operator << { opstream&, const Sample* };
opstream& operator >> { opstream&, Sample& };
opstream& operator >> { opstream&, Sample*& };
Первый инсертер записывает объекты типа Sample. Второй записывает объекты, указываемые указателем на Sample. Это позволяет
вам использовать полиморфизм и полностью управлять потоками, то
есть полностью записывать объекты типов, производных от Sample.
Затем эти объекты считываются обратно с помощью экстрактора, который будет считывать их фактический тип. (Экстрактор выполняет
действие, обратное инсертеру.)
Наконец, DECLARE_STREAMABLE создает на базе класса TStreamer
вложенный класс с именем Streamer, который определяет ядро потокового кода.
Создание приложения
Создание приложения с помощью AppExpert предусматривает следующие этапы:
Запустите IDE и выберите команду Project AppExpert. При
этом выводится диалоговое окно.
Наберите имя файла проекта.
Выберите маршрут каталога, куда будет записываться файл
проекта AppExpert (если он не существует, то создается). В
нем по умолчанию будут размещаться все исходные файлы.
Щелкните "мышью" на OK. Выводится диалоговое окно AppExpert Application Generation Options.
Для генерации приложения Windows по умолчанию вы можете
щелкнуть "мышью" на кнопке Generate диалогового окна Options. Диалоговое окно Application Generation Options содержит слева список тем, а справа - краткое описание темы.
Кнопка Help позволяет вывести справочную информацию по теме.
Просмотрите параметры, щелкнув на + для выборе подтемы
("+" указывает на наличие подтемы, а "-" говорит о том,
что выведены все подтемы).
Выберите для приложения нужные параметры
Щелкните "мышью" на кнопке Generate диалогового окна Options.
Выводится диалоговое окно, подтверждающее генерацию кода.
Для генерации кода щелкните "мышью" на Yes. No возвращает
вас к выбору параметров. Когда AppExpert генерирует приложение, выводится окно сообщений. AppExpert создает для приложения все файлы и помещает их в базовый каталог. После генерации кода и ресурсов вы можете редактировать и добавлять их, но вернуться в AppExpert и изменить параметры нельзя.
Выводится окно проекта, в котором перечислены некоторые из
необходимых приложению файлов (битовые массивы, пиктограммы и справочный текст не показывается). Для модификации приложения можно использовать ClassExpert. Чтобы построить
приложение, выберите Project Make all. По умолчанию все
выполняемые файлы сохраняются в базовом каталоге.
Создание проекта
Использование администратора проектов не представляет затруднений. Для построения проекта:
Выберите имя для файла проекта (с помощью команды Project New Project. Наберите имя проекта и нажмите Tab.
Наберите имя первого целевого файла в проекте и выберите
его тип (.EXE, .DLL, .LIB, .HLP или файл EasyWin).
Выберите целевую платформу (Windows 3.x, DOS Standard или
DOS Overlay для 16-разрядных приложений или Win32 для
32-разрядных).
Если ваше приложение предназначено для DOS, задайте, если
это необходимо:
плавающую точку (компоновку F87.lib);
эмуляцию (компоновка EMU.LIB);
компоновку математических библиотек DOS (если требуется);
альтернативный способ компоновки C0Fx.OBJ (для всех моделей SS будет равно DS);
стандартные библиотеки, которые нужно использовать в
приложении;
библиотеки ObjectWindows;
библиотеку классов Borland С++;
библиотеки этапа выполнения;
библиотеки BWCC;
графический интерфейс Borland (BGI).
Чтобы использовать диагностическую версию библиотек, выберите Diagnosis.
Если необходима мультинитевая версия библиотеки исполняющей системы, выберите Multithread (в Win32).
Выберите модель памяти (Target Model).
Чтобы создать проект, щелкните "мышью" на OK.
Создание расширенного словаря: параметр /E
Для ускорения процесса компоновки больших файлов библиотек
(таких, как стандартная библиотека Cx.LIB), можно указать утилите
TLIB, что нужно создать расширенный словарь и подсоединить его к
файлу библиотеки. Данный словарь в крайне компактной форме содержит информацию, которая не вносится в стандартный словарь библиотеки. Эта информация позволяет компоновщику TLINK быстрее обрабатывать файлы библиотек, особенно в том случае, когда они находятся на гибком диске или на медленном жестком диске. Все библиотеки
на ваших дистрибутивных дисках содержат расширенный словарь.
Для создания расширенного словаря модифицируемой библиотеки
необходимо при добавлении, удалении или замене модулей в этой
библиотеке задать параметр /E при вызове утилиты TLIB. Для создания расширенного словаря существующей библиотеки, которую вы не
хотите модифицировать, нужно задать параметр /E и указать TLIB
удаление из библиотеки несуществующего модуля. При этом утилита
TLIB выдаст предупреждающее сообщение о том, что заданный модуль
в библиотеке не найден, но наряду с этим создаст расширенный словарь заданной библиотеки. Например, введите следующую строку:
tlib /E mylib -bogus
Если не использовать в командной строке TLIB параметр /e, то
утилита TLIB будет игнорировать отладочную информацию в библиотеке, имеющей расширенный словарь.
Создание Style Sheet
Чтобы создать Style Sheet, сделайте следующее:
Выберите в основном меню Options Style Sheet.
Щелкните "мышью" на Create. Наберите имя Style Sheet и
нажмите Enter.
Щелкните "мышью" на Edit. Выводится диалоговое окно Style
Sheet.
Отредактируйте параметры и выберите OK.
Создание типов документа
При создании приложения AppExpert, поддерживающего модуль
Doc/View, вы можете использовать ClassExpert создания классов
отображаемых документов и типов документов. Чтобы создать тип документа, сделайте следующее:
Создайте класс отображаемого элемента или используйте один
из трех предопределенных классов (TEditView, TListView или
TWindowView).
Запустите из своего проекта ClassExpert. Щелкните правой
кнопкой "мыши" в области классов, затем выберите в оперативном меню Create doc types.
Выберите View class. По умолчанию это класс TEditView,
TListView, TWindowView или ваш собственный класс.
Наберите описание типов файлов вашего документа. Этот
текст выводится в диалоговом окне File Open.
Наберите необходимые фильтры, разделив их запятыми. Эти
фильтры выводятся в диалоговом окне File Open и используются для фильтрации файлов, которые может открывать пользователь в приложении.
Наберите используемое по умолчанию расширение файла. Оно
будет использоваться при сохранении.
Чтобы задать стили документа/отображаемого элемента, щелкните "мышью" на командной кнопке Styles. Вы можете выбирать следующие стили:
dtAutoDelete | Удалять объект документа при закрытии последнего отображаемого элемента. |
dtNoAutoView | Не создавать автоматически заданный по умолчанию тип отображаемого элемента. |
dtSingleView | Обеспечивать только один отображаемый элемент на каждый документ. |
dtAutoOpen | Открывает документ при его создании. |
dtUpdateDir | Обновляет каталог диалога. |
dtHidden | Скрывает шаблон в списке выбираемых пользователем шаблонов. |
dtSelected | Указывает последний выбранный шаблон. |
dtReadOnly | Выбирает при создании диалогового окна доступную только по чтению кнопку с независимой фиксацией. |
dtOverWritePrompt | Запрашивает пользователя, можно ли перезаписать существующий файл (в диалоге Save As). |
dtHideReadOnly | Скрывает кнопки с независимой фиксацией, доступные только по чтению. |
dtPathMustExist | Позволяет пользователю набирать только существующие маршруты. |
dtFileMusttExist | Позволяет пользователю набирать имена только существующих файлов. |
dtCreatePrompt | Перед созданием нового документа выводит пользователю подсказку. |
dtNoReadOnly | Возвращает заданный файл как доступный для записи. |
Чтобы добавить тип документа в приложение, щелкните
"мышью" на Add. При этом будет обновлена структура основного исходного файла, в котором описываются типы документов. Документ/отображаемый элемент выводится в списке доступных типов.
Чтобы вернуться в ClassExpert, щелкните "мышью" на Close.
Создание указателя данного адреса "сегмент:смещение"
Как создать дальний указатель на конкретный адрес памяти
(конкретный адрес "сегмент:смещение")? Для этого можно воспользоваться встроенной библиотечной подпрограммой MK_FP, которая в качестве аргумента воспринимает сегмент и смещение, и возвращает дальний указатель. Например:
MK_FP(segment_value, offset_value)
Имея дальний указатель fp, вы можете получить значение сегмента полного адреса с помощью FP_SEG(fp) и значение смещения с
помощью FP_OFF(fp). Более полную информацию об этих трех библиотечных функциях Borland C++ можно найти в справочнике по библиотеке.
Спецификаторы формата
Чтобы изменить используемый по умолчанию формат вывода, укажите после выражение запятую и один из спецификаторов:
c | Символ или строка выводятся на экран в виде необработанных символов. Обычно непечатаемые символы выводятся в виде управляющих символов или в числовом формате. Этот параметр приводит к тому, что при выводе символов будет использоваться полный набор символов дисплея IBM. |
d | Целое число выводится в виде десятичного значения. |
f[#] | Формат с плавающей точкой с заданным числом цифр.
Если вы не задаете число цифр, то используется столько цифр, сколько необходимо. |
m | Выражение со ссылкой на память выводится в виде
шестнадцатиричных байт. |
md | Выражение со ссылкой на память выводится в виде
десятичных байт. |
P | Выводится необработанное значение указателя, показывающее сегмент, как имя регистра (если это возможно). Показывается также объект, на который указатель ссылается. Если управление форматом не задано, то это используется по умолчанию. |
s | Выводится массив или указатель на массив символов
(строка, заключенная в кавычки). Строка завершается нулевым символом. |
x или h | Целое выводится в виде шестнадцатиричного значения. |
Если спецификатор формата не применим к типу данных выражения, он игнорируется. Вы можете задать таким же образом счетчик
повторения (он указывает, что выражение относится к повторяющемуся элементу данных, например, массиву).
Списки дочерних окон
Вы задаете родителя интерфейсного элемента во время его
конструирования. Родительский оконный объект является параметром
конструктора интерфейсного объекта. Дочерний оконный объект хранит в своем элементе данных Parent адрес своего родительского
оконного объекта как указатель на этот объект. Он также автоматически сохраняет адреса своих дочерних оконных объектов в частном
элементе данных ChildList.
Получить доступ к дочерним окнам объекта вы можете с помощью
функций-итераторов. Функции элементы ForEach и FirstThat получают
в качестве первого аргумента указатель на функцию. Подробнее о
них рассказывается ниже.
Список операций
Список операций определяет, какие действия должна выполнять
утилита TLIB. Он состоит из последовательности заданных одна за
другой операций. Каждая операция состоит из одно- или двухсимвольного обозначения операции, за которым следует имя файла или имя модуля. Пробельные символы могут окружать либо обозначение операции, либо имя файла или модуля, но их нельзя использовать в
середине двухсимвольного обозначения операции или внутри имени.
В командной строке можно указывать любое число операций но
суммарная длина строки не должна превышать предел в 127 символов,
установленный в DOS (в COMMAND.COM). Порядок следования операций
не имеет значения. Утилита TLIB всегда выполняет операции в следующем порядке:
Сначала выполняются все операции извлечения.
Затем выполняются все операции удаления.
И, наконец, выполняются все операции добавления.
Замена какого-либо модуля может быть произведена путем удаления его с последующим добавлением заменяющего модуля.
Утилита TLIB распознает три символа действия (-, + и *), которые могут использоваться самостоятельно или объединенными в пары, образуя в совокупности пять различных операций. Для тех операций, в которых используются пары символов, порядок расположения символов не играет роли. Обозначения операций и выполняемые этими
операциями действия указаны ниже (для создания библиотеки, добавьте модули к библиотеке, которая еще не существует):
+ | Добавление | Утилита TLIB добавляет заданный файл в библиотеку. Если расширение имени файла не задается, то подразумевается расширение .OBJ. Если сам файл является библиотекой (с расширением .LIB), то в результате выполнения операции все модули указанной библиотеки будут добавлены в полученную в результате библиотеку. Если добавляемый модуль уже существует, то TLIB отображает сообщение, но не добавляет новый модуль. |
- | Удаление | Утилита TLIB удаляет заданный модуль из библиотеки. Если этот модуль в библиотеке не существует, то TLIB отображает сообщение. Операция удаления требует задания только имени модуля. TLIB допускает ввод полного имени маршрута с указанием имени дисковода и расширения, но игнорирует все, за исключением имени модуля. |
* | Извлечение | Утилита TLIB создает заданный файл путем копирования соответствующего модуля из библиотеки в файл. Если этот модуль не существует, то TLIB отображает сообщение, но файла не создает. Если файл с заданным именем уже существует, то он затирается, а на его место записывается новый. |
-* *- | Извлечение и удаление | Утилита TLIB копирует заданный модуль в файл с соответствующим именем, а затем удаляет его из библиотеки. Данная операция представляет собой сокращенный путь для последовательного выполнения операции извлечения с последующей операцией удаления. |
-+ +- | Замена | Утилита TLIB заменяет заданный модуль на соответствующий файл. Данная операция представляет собой сокращенный путь для последовательного выполнения операции удаления с последующей операцией добавления. |
Непосредственное переименование модулей в библиотеке невозможно. Для того, чтобы переименовать какой-либо модуль, необходимо выполнить операцию извлечения и удаления модуля, потом переименовать только что созданный файл, а затем добавить его обратно в библиотеку.
Справочная библиотека по функциям для DOS
absread | Читает секторы диска с абсолютной адресацией
#include <dos.h> int absread(int drive, int nsects, long lsect, void *buffer); |
abswrite | Записывает секторы диска с абсолютной адресацией
#include <dos.h> int abswrite (int drive,int nsects,int lsect, void *buffer); |
allocmem, _dos_allocmem | Выделяет сегмент памяти DOS
#include <dos.h> int allocmem(unsigned size, unsigned *segp); unsigned _dos_allocmem(unsigned size, unsigned *segp); |
bioscom | Выполняет последовательный ввод/вывод
#include <bios.h> int bioscom(int cmd, char abyte, int port); |
_bios_ disk | Запрашивает дисковые операции BIOS
#include <bios.h> insigned _bios_disk(unsigned cmd, struct diskinfo_t*dinfo); |
biosdisk | Вызывает дисковые операции BIOS
#include <bios.h> int biosdisk(int cmd, int drive, int head, int track, int sector, int nsects, void *buffer); |
bioskey | Интерфейс клавиатуры, напрямую использующий
операции BIOS #include <bios.h> int bioskey(int cmd); |
_bios_keybrd | Интерфейс клавиатуры, напрямую использующий
операции BIOS #include <bios.h> unsigned _bios_keybrd(unsigned cmd); |
biosprint | Управляет вводом/выводом принтера при помощи
BIOS #include <bios.h> int biosprint(int cmd,int abyte,int port); |
_bios_printer | Управляет вводом-выводом принтера при помощи
BIOS #include <bios.h> unsigned _bios_printer(int cmd,int port, int abyte); |
_bios_serialcom | Выполняет последовательный ввод-вывод
#include <bios.h> unsigned _bios_serialcom(int cmd, int port, char abyte); |
brk | Изменяет объем памяти, выделенный для сегмента
данных #include <alloc.h> int brk(void *addr); |
coreleft | Возвращает размер свободной оперативной памяти
в крохотной (tiny), малой (small) и средней (medium) моделях памяти: #include <alloc.h> unsigned coreleft(void); в компактной (compact), большой(large) и огром- ной (huge) моделях памяти: #include <alloc.h> unsigned long coreleft(void); |
delay | Приостанавливает выполнение программы на заданный интервал (в миллисекундах)
#include <dos.h> void delay(unsigned milliseconds); |
farcoreleft | Возвращает размер свободной памяти в куче с
дальней адресацией #include <alloc.h> unsigned long farcoreleft(void); |
farheapcheck | Пpосматривает и проверяет кучу с дальней адресацией
#include <alloc.h> int farheapcheck(void); |
farheapcheckfree | Проверяет свободные блоки кучи c дальней адресацией на постоянное значение
#include <alloc.h> int fsrheapcheckfree (unsigned int fillvalue) |
farheapchecknode | Просматривает и проверяет отдельный узел кучи
с дальней адресацией #include <alloc.h> int farheapchecknode (void *node) |
farheapfillfree | Заполняет свободные блоки кучи с дальней адресацией определенным значением
#include <alloc.h> int farheapfillfree (unsigned int fillvalue) |
farheapwalk | Используется для перемещения по куче с дальней
адресацией от узла к узлу #include <alloc.h> int farheapwolk(struct farheapinfo *hi) |
freemem,_dos_freemem | Освобождает предварительно выделенный блок памяти DOS
#include<dos.h> int freemem(unsigned segx); unsigned _dos_freemem(unsigned segx); |
harderr,hardresume,hardreth | Устанавливает и обрабатывает аппаратную ошибку подпрограммы взаимодействия с внешним устройством
#include <dos.h> void harderr(int(*handler)()); void hardresume(int axret); void hardreth(int retn); |
_harderr | Устанавливает обработчик аппаратной ошибки
#include<dos.h> void _harderr(int (far *handler)()); |
_hardresume | Функция обработки ошибок аппаратуры
#include <dos.h> void _hardresume(int rescode); |
_hardretn | Функция обработки ошибки аппаратуры
#include <dos.h> void _hardretn(int retn); |
keep,_dos_keep | Осуществляет выход в DOS, оставляя программу
резидентной #include <dos.h> void keep(unsigned char status, unsigned size); void _dos_keep(unsigned char status, unsigned size); |
nosound | Отключает динамик компьютера
#include <dos.h> void nosound(void); |
_OvrInitEms | Инициализирует систему подкачки отображаемой
памяти для программы менеджера оверлеев #include <dos.h> int cdecl far _OvrlnitEms (unsigned emsHandle, unsigned fistPage, unsigned pages); |
_OvrlnitExt | Инициализирует систему подкачки отображаемой
памяти для программы менеджера оверлеев #include <dos.h> int cdecl far _OvrlnitExt(unsigned long startAddress, unsigned long length); |
randbrd | Чтение произвольного блока
#include <dos.h> int randbrd(struct fcb *fcb, int rcnt); |
randbwr | Запись произвольного блока
#include <dos.h> int randbwr (struct fcb *fcb, int rcnt); |
sbrk | Изменяет размещение сегмента данных
#include <alloc.h> void *sbrk(int incr); |
setblock _dos_setblock | Изменяет размер предварительно распределенной
области памяти #include<dos.h> int setblock(unsigned segx, unsigned newsize); unsigned_dos_setblock(unsigned newsize, unsigned segx,unsigned *maxp); |
sound | Устанавливает динамик на заданную частоту
#include <dos.h> void sound(unsigned frequency); |
Справочная библиотека по графическим функциям DOS
arc | Рисует дугу
#include <graphiсs.h> void far arc (int x, int y, int stangle, int endangle, int radius); |
bar | Рисует двумерную полосу
#include <graphics.h> #include <conio.h> void far bar(int left, int top, int right, int bottom); |
bar3d | Рисует трехмерный столбец
#include <graphics.h> void far bar3d (int left, int top, int right, int bottom, int depth, int topflag); |
circle | Вычерчивает окружность заданного радиуса из заданного центра
#include <graphics.h> void far circle(int x, int y, int radius); |
cleardevice | Очищает графический экран
#include <graphics.h> void far cleardevice(void); |
clearviewport | Очищает текущее окно (viewport)
#include <graphics.h> void far clearviewport(void); |
closegraph | Завершает работу с графической системой
#include <graphics.h> void far closegraph(void); |
detectgraph | Определяет путем проверки аппаратуры - какой
графический драйвер и режим использовать #include <graphics.h> void far detectgraph(int far *graphdriver, int far *graphmode); |
drawpoly | Вычерчивает контур многоугольника
#include <graphics.h> void far drawpoly(int numpoints, int far *polypoints); |
ellipse | Рисует эллиптическую дугу
#include <graphics.h> void far ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius); |
fillellipse | Чертит и закрашивает эллипс
#include<graphics.h> void far fillellipse(int x, int y, int xradius, int yradius); |
fillpoly | Вычерчивает и закрашивает многоугольник
#include<graphics.h> void far fillpoly(int numpoints, int far *polypoints); |
floodfill | Заполняет методом "лавины" ограниченную область
#include<graphics.h> void far floodfill(int x, int y, int border); |
getarccoords | Возвращает координаты последнего обращения к
функции arc #include<graphics.h> void far getarccoords(struct arccoordstype far *arccoords); |
getaspectratio | Возвращает коэффициент сжатия текущего графиче-
ского режима #include<graphics.h> void far getaspectratio(int far *xasp, int far *yasp); |
getbkcolor | Возвращает текущий цвет фона
#include<graphics.h> void far getbkcolor(void); |
getcolor | Возвращает текущий цвет рисования
#include<graphics.h> int far getcolor(void); |
getdefaultpalette | Возвращает структуру определения палитры
#include<graphics.h> struct palettetype *far getdefaultpalette(void) |
getdrivername | Возвращает указатель на строку, содержащую имя
текущего графического драйвера #include<graphics,.h> char *far getdrivername(void) |
getfillpattern | Копирует в память описанный пользователем шаблон заполнения
#include<graphics.h> void far getfillpattern(char far *pattern); |
getfillsettings | Получает информацию о текущих шаблоне и цвете
заполнения #include<graphics.h> void far getfillsettings(struct fillsettingstype far *fillinfo); |
getgraphmode | Возвращает текущий графический режим
#include<graphics.h> int far getgraphmode(void); |
getimage | Сохраняет битовый образ некоторой области экрана в памяти
#include<graphics.h> void far getimage(int left, int top, int right, int bottom, void far *bitmap); |
getlinesettings | Получает текущий тип линии, шаблон и толщину
#include<graphics.h> void far getlinesettings(struct linesettingstype far *lineinfo); |
getmaxcolor | Возвращает максимальное значение цвета, которое
можно передать функции setcolor #include<graphics.h> int far getmaxcolor(void); |
getmaxmode | Возвращает максимальный номер режима для текущего драйвера
#include<graphics.h> int far getmaxmode(void); |
getmaxx | Возвращает максимальную координату экрана по x
#include<graphics.h> int far getmaxx(void); |
getmaxy | Возвращает максимальную координату экрана по y
#include<graphics.h> int far getmaxy(void) |
getmodename | Возвращает указатель на строку, содержащую имя
заданного графического режима #include<graphics.h> char *far getmodename(int mode_number); |
getmoderange | Получает диапазон режимов для заданного графического драйвера
#include<graphics.h> void far getmoderange(int graphdriver, int far *lomode, int far *himode); |
getpalette | Получает информацию о текущей палитре
#include<graphics.h> void far getpalette(struct palettetype far *palette); |
getpalettesize | Возвращает размер таблицы просмотра цветов палитры
#include<graphics.h> int far getpalettesize(void); |
getpixel | Возвращает цвет заданной точки
#include<graphics.h> unsigned far getpixel(int x, int y); |
gettextsettings | Получает информацию о текущем графическом текстовом шрифте
#include<graphics.h> void far gettextsettings(struct textsettingstype far *texttypeinfo); |
getviewsettings | Получает информацию о текущем окне (viewport)
#include<graphics.h> void far getviewsettings(struct viewporttype far *viewport); |
getx | Возвращает координату x текущей графической позиции
#include<graphics.h> int far getx(void); |
gety | Возвращает координату y текущей графической позиции
#include<graphics.h> int far gety(void); |
graphdefaults | Сбрасывает все графические параметры в их значения по умолчанию
#include<graphics.h> void far graphdefaults(void); |
grapherrormsg | Возвращает указатель на строку сообщения об
ошибке #include<graphics.h> char *far grapherrormsg(int errorcode); |
_graphfreemem | Подключает функции пользователя для освобождения графической памяти
#include<graphics.h> void far _graphfreemem(void far *ptr, unsigned size); |
_graphgetmem | Подключает функции пользователя для освобождения графической памяти
#include<graphics.h> void far *far _graphgetmem(unsigned size); |
graphresult | Возвращает код ошибки последней неудачной графической операции
#include<graphics.h> int far graphresult(void); |
imagesize | Возвращает количество байт, необходимых для
хранения битового образа #include<graphics.h> unsigned far imagesize(int left, int top, int right, int bottom); |
initgraph | Инициализирует графическую систему
#include<graphics.h> void far initgraph(int far *graphdriver, int far *graphmode, char far *pathtodriver); |
installuserdriver | Устанавливает дополнительный драйвер устройства
в таблицу драйверов устройства BGI #include<graphics.h> int far installuserdriver( char far *name, int huge (*detect)(void)); |
installuserfont | Загружает шрифтовый файл (.CHR), который не
встроен в систему BGI #include<graphics.h> int far installuserfont(char far *name); |
line | Вычерчивает линию между двумя заданными точками
#include<graphics.h> void far line(int x1, int y1, int x2, int y2); |
linerel | Чертит линию на заданное расстояние от текущей
позиции (CP) #include<graphics.h> void far linerel(int dx, int dy); |
lineto | Чертит линию от текущей позиции (CP) в точку
(x,y) #include<graphics.h> void far lineto(int x, int y); |
moverel | Перемещает текущую позицию (CP) на заданное относительное расстояние
#include<graphics.h> void far moverel(int dx,int dy); |
moveto | Перемещает текущую позицию (СР) в точку (x,y)
#include <graphics.h> void far moveto(int x,int y); |
outtext | Выводит строку в окно (viewport)
#include<graphics.h> void far outtext(char far *textstring); |
outtextxy | Выводит строку в указанной области
#include<graphics.h> void far outtextxy(int x, int y, char far *textstring); |
pieslice | Вычерчивает и заполняет сектор круга
#include<graphics.h> void far pieslice(int x, int y, int stangle, int endangle, int radius); |
putimage | Выводит на экран битовый образ
#include<graphics.h> void far putimage(int left, int top, void far *bitmap, int op); |
putpixel | Выводит пиксель в заданной точке экрана
#include<graphics.h> void far putpixel(int x, int y,int color); |
rectangle | Вычерчивает прямоугольник
#include<graphics.h> void far rectangle(int left, int top, int right,int bottom); |
registerbgidriver | Связывает загруженный пользователем или
встроенный в систему драйвер графической системы с самой графической системой #include<graphics.h> int registerbgidriver(void (*driver)(void)); |
registerbgifont | Регистрирует скомпонованные коды шрифта
#include<graphics.h> int registerbgifont(void (*font)(void)); |
restorecrtmode | Восстанавливает режим монитора таким, каким он
был до вызова initgraph #include<graphics.h> void far restorecrtmode(void); |
sector | Вычерчивает и заполняет сектор эллипса
#include<graphics.h> void far sector(int x, int y, int stangle, int endangle, int xradius, int yradius); |
setactivepage | Устанавливает активную для графического вывода
страницу #include<graphics.h> void far setactivepage(int page); |
setallpalette | Изменяет все цвета палитры на заданные
#include<graphics.h> void far setallpalette(struct palettetype far *palette); |
setaspectratio | Изменяет значение по умолчанию коэффициента
сжатия #include<graphics.h> void far setaspectratio(int xasp, int yasp); |
setbkcolor | Устанавливает текущий цвет фона, используя
палитру #include<graphics.h> void far setbkcolor(int color); |
setcolor | Устанавливает текущий цвет вычерчивания,
используя палитру #include<graphics.h> void far setcolor(int color); |
setfillpattern | Устанавливает определенный пользователем шаблон
заполнения #include<graphics.h> void far setfillpattern(char far *upattern, int color); |
setfillstyle | Устанавливает шаблон и цвет заполнения
#include<graphics.h> void far setfillstyle(int pattern, int color); |
setgraphbufsize | Изменяет размер внутреннего графического буфера
#include<graphics.h> unsigned far setgraphbufsize(unsigned bufsize); |
setgraphmode | Переводит систему в графический режим и очищает
экран #include<graphics.h> void far setgraphmode(int mode); |
setlinestyle | Устанавливает текущие толщину и тип линии
#include<graphics.h> void far setlinestyle(int linestyle, unsigned apattern, int thickness); |
setpalette | Изменяет один цвет палитры
#include <graphics.h> void far setpalette(int colornum, int color); |
setrgbpalette | Позволяет пользователю определять цвета для
IBM 8514 #include <graphics.h> void far setrgbpalette(int clornum,int red, int green,int blue); |
settextjustify | Выравнивает строки текста для графических
функций #include <graphics.h> void far settextjustify(int horiz, int vert); |
settextstyle | Устанавливает текущие текстовые характеристики
для графического вывода #include <graphics.h> void far settextstyle(int font, int direction, int charsize); |
setusercharsize | Задает пользовательский коэффициент увеличения
ширины и высоты символов для штриховых шрифтов #include <graphics.h> void far setusercharsize(int multх, int divх, int multy, int divy); |
setviewport | Устанавливает для графического вывода текущее
графическое окно #include <graphics.h> void far setviewport(int left, int top, int right, int bottom, int clip); |
setvisualpage | Устанавливает номер отображаемой страницы
#include <graphics.h> void far setvisualpage(int page); |
setwritemode | Устанавливает режим записи для рисуемой линии в
графическом режиме #include <graphics.h> void far setwritemode(int mode); |
textheight | Возвращает высоту строки в точках растра
#include <graphics.h> int far textheight(char far *textstring); |
textwidth | Возвращает ширину строки в точках растра
#include <graphics.h> int far textwidth(char far *textstring); |
Назад | Содержание | Вперед
Справочная библиотека по языку Borland C++
Перед тем как представить полную справочную библиотеку функций языка программирования Borland С++, рассмотрим функцию main,
занимающую особое место в данном перечне.
Справочная информация по программированию
Примечание: настоящий раздел представляет собой сводный обзор основных правил, обычно, используемых для написания программы, и обзор некоторых тем, часто необходимых в качестве справочного материала. Более строгую информацию можно найти в руководстве по Borland C++ 4.0 или в быстрой интерактивной помощи Help. В основном информация этого раздела применима и для Турбо С++ и Borland C++ 4.0.
Версия 4.0 Borland C++ поможет вам создавать 16- и 32-битовые приложения для операционных систем Chicago и Windows NT. Это очень гибкая и открытая среда разработчика, обеспечивающая простое взаимодействие с ней. Интегрированная среда Borland C++ обладает по-настоящему открытой архитектурой и имеет большой набор
инструментов визуального программирования.
Такие новые возможности, как обработка исключительных ситуаций, интегрированный отладчик графического пользовательского интерфейса (GUI), клавиатурная эмуляция и собственный текстовый редактор Borland (Brief) делают версию более гибкой. В Borland C++ реализован очень гибкий доступ к утилитам. В частности, эта среда
позволяет программистам приспособить под свои нужды панель инструментальных средств.
В Borland C++ 4.0 предлагаются графические меню, подобные
используемым в Quattro Pro и Paradox. При нажатии правой кнопки
"мыши" появляется панель с другим набором инструментальных средств программирования.
В исключительных ситуациях версия 4.0 перехватывает и распознает ошибки, позволяя программистам аккуратно выходить из любого затруднения. Новая версия включает в себя Object Windows 2.0 - объектно-ориентированную библиотеку, поддерживающую 32-разрядное программирование и перенос приложений между 16- и 32-разрядным режимом Windows.
Работа компилятора Borland C++ начинается с просмотра текста
программы препроцессором, который ищет в нем специальные директивы. Например, директива #include <включаемый_файл> добавляет (или включает) в программу перед фазой компиляции содержимое файла <включаемый_файл>. Препроцессор также выполняет расширение любых обнаруженных в программах или файлах включений макрокоманд.
Ниже, в справочных таблицах, даются наиболее важные сведения
по конкретной реализации С++ фирмы Borland. Начинаются они с перечня ключевых слов, которые не должны использоваться в качестве обычных имен идентификаторов.
Справочник по функциям Borland С++
abort | Экстренно завершает программу
DOS UNIX Win16 #include <stdlib.h> OS/2 Win32 void abort(void); ANSI C++ ANSI C | |
abs | Вычисляет абсолютное значение целочисленного аргумента
DOS UNIX Win16 #include <stdlib.h> OS/2 Win32 int abs(int x) ANSI C++ ANSI C | |
access | Определяет доступность файла
DOS UNIX Win16 #include <io.h> OS/2 Win32 int access(const char *filename,int amode); | |
acos, acosl | Вычисляет арккосинус
acos #include <math.h> double acos(double x); DOS UNIX Win16 OS/2 Win32 ANSI C++ ANSI C ---***--- acosl #include <math.h> long double acosl(long double x); DOS Win16 OS/2 Win32 | |
alloca | Выделяет временную область стека
DOS UNIX Win16 #include<malloc.h> OS/2 Win32 void *alloca(size_t size); | |
asctime | Преобразует дату и время в формат ASCII
DOS UNIX Win16 #include <time.h> OS/2 Win32 char *asctime(const struct tm *tblock); ANSI C++ ANSI C | |
asin, asinl | Вычисляет арксинус
asin #include <math.h> double asin(double x); DOS UNIX Win16 OS/2 Win32 ANSI C++ ANSI C ---***--- asinl #inclyde <math.h> long double asinl(long double x); DOS Win16 OS/2 C++ Win32 | |
assert | Проверяет условия и прерывает, при необходимости, выполнение программы
DOS UNIX Win16 OS/2 Win32 #include <assert.h> ANSI C++ ANSI C void assert(int test); | |
atan,atanl | Вычисляет арктангенс
atan #include <math.h> double atan(double x) DOS UNIX Win16 OS/2 Win32 ANSI C++ ANSI C ---***--- atanl #include <math.h> long double atanl(long double x); DOS UNIX Win16 OS/2 Win32 ANSI C++ ANSI C | |
atan2, atan2l | Вычисляет арктангенс y/x
atan2 #include <math.h> double atan2(double y, double x); DOS UNIX Win16 OS/2 Win32 ANSI C++ ANSI C ---***--- atan2l #include<math.h> long double atan2l(long double y, DOS UNIX Win16 long double x); OS/2 | |
atexit | Регистрирует функцию выхода
DOS Win16 #include <stdlib.h> OS/2 Win32 int atexit(_USERENTRY * func)(void)); ANSI C++ ANSI C | |
atof, _atold | Преобразует строку в число с плавающей точкой
atof #include <math.h> double atof(const char *s); DOS UNIX Win16 OS/2 Win32 ANSI C++ ANSI C _atold #include <math.h> long double _atold(const char *s); DOS Win16 OS/2 Win32 | |
atoi | Преобразует строку в число типа integer
DOS UNIX Win16 #include <stdlib.h> OS/2 Win32 int atoi(const char *s); ANSI C++ ANSI C | |
atol | Преобразует строку в число типа long
DOS UNIX Win16 #include <stdlib.h> OS/2 Win32 long atol(char *s); ANSI C++ ANSI C | |
_atold | смотpи atof | |
bdos | Обеспечивает доступ к системным вызовам DOS
DOS Win16 #include <dos.h> int bdosptr(int dosfun,void *argument, unsigned dosal); | |
bdosptr | Обеспечивает доступ к системным вызовам DOS
DOS UNIX Win16 #include <dos.h> OS/2 int bdosptr(int dosfun, void *argument, unsigned dosal); | |
_beginthread | Начинает обработку новой последовательности
#include <process.h> OS/2 C++ Win32 unsigned long _begihthread (_USERENTRY (*start_adress)(void *),unsigned stack_size, void *arglist) | |
_beginthreadNT | Начинает обработку новой последовательности
под WindowsNT Win32 #include <process.h> 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 <bios.h> int biosequip(void); | |
_bios_equiplist | Проверяет оборудование
DOS Win16 #include <bios.h> unsigned _bios_equiplist(void); | |
bioskey | Интерфейс клавиатуры, напрямую использующий
операции BIOS DOS Win16 #include <bios.h> int bioskey(int cmd); | |
biosmemory | Возвращает размер памяти
DOS Win16 #include <bios.h> int biosmemory(void); | |
_bios_memsize | Возвращает размер памяти
DOS Win16 #include <bios.h> unsigned _bios_memsize(void); | |
biostime | Читает или устанавливает таймер BIOS
DOS Win16 #include <bios.h> long biostime(int cmd, long newtime); | |
_bios_timeofday | Читает или устанавливает таймер BIOS
DOS Win16 #include <bios.h> unsigned _bios_timeofday(int cmd,long *timep); | |
bsearch | Осуществляет двоичный поиск в массиве
DOS UNIX Win16 #include <stdlib.h> 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 <math.h> DOS UNIX Win16 double cabs(struct complex z); D OS/2 Win32 ---***--- cabcl #include <math.h> DOS Win16 long double cabsl(struct _complexl z); OS/2 Win32 | |
calloc | Выделяет оперативную память
DOS UNIX Win16 #include <stdlib.h> Win32 ANCI C void *calloc(size_t nitems, size_t size); ANCI C++ OS/2 | |
ceil, ceill | Округляет значение аргумента в большую сторону
ceil #include <math.h> double ceil(double x); DOS UNIX Win16 OS/2 Win32 ANSI C++ ANSI C ---***--- ceill #include <math.h> long double ceill(long double x); DOS Win16 Win32 OS/2 | |
_c_exit | Освобождает системные ресурсы (как _exit), но
не завершает программу. DOS Win16 OS/2 Win32 #include <process.h> void _c_exit(void); | |
_cexit | Освобождает системные pесуpсы
но не завеpшает пpогpамму. DOS Win16 #include <process.h> OS/2 Win32 void _cexit(void) | |
cgets | Считывает строку с консоли
DOS #include <conio.h> OS/2 Win32 char *cgets(char *str); | |
_chain_intr | Обеспечивает связь с новым обработчиком
прерываний DOS Win16 #include <dos.h> void _chain_intr(void(interrupt far *newhandler)()); | |
chdir | Изменяет текущий каталог
DOS UNIX Win16 #include <dir.h> OS/2 Win32 int chdir (const char *path); | |
_chdrive | Устанавливает текущий диск
DOS Win16 #include <direct.h> OS/2 Win32 int _chdrive(int drive); | |
_chmod | смотpи _rtl_chmod
| |
chmod | Изменяет режим доступа к файлу
DOS UNIX Win16 #include <sys\stat.h> OS/2 Win32 int chmod(const char *path, int amode); | |
chsize | Изменяет размер файла
DOS Win16 #include <io.h> OS/2 Win32 int chsize(int handle, long size); | |
_clear87 | Очищает слово состояния операций с плавающей
точкой DOS Win16 OS/2 Win32 #include <float.h> | |
clearerr | Сбрасывает индикацию ошибки
DOS UNIX Win16 #include <stdio.h> OS/2 Win32 void clearerr(FILE *stream); ANSI C++ ANSI C | |
clock | Определяет процессорное время
DOS Win16 #include <time.h> OS/2 Win32 clock_t clock(void); ANSI C++ ANSI C | |
_close | Смотpи _rtl_close
| |
close | Закpывает файл
DOS Win16 UNIX #include <io.h> OS/2 Win32 int close(int handle); | |
closedir | Закрывает поток ввода-вывода каталога
DOS UNIX Win16 #include <dirent.h> OS/2 C++ Win32 void closedir(DIR *dirp); | |
clreol | Очищает конец строки в текстовом окне
DOS Win16 #include <conio.h> OS/2 Win32 void clreol(void); | |
clrscr | Очищает окно в текстовом режиме
DOS Win16 #include <conio.h> OS/2 Win32 void clrscr(void); complex conj(complex x); | |
_control87 | Манипулирует словом управления операций с плавающей точкой
DOS Win16 #include <float.h> OS/2 Win32 unsigned int _control87(unsigned int newcw, unsigned int mask); | |
cos, cosl | Вычисляет косинус
cos Вещественная версия #include <math.h> DOS UNIX Win16 double cos(double x); OS/2 Win32 ANSI C++ ANSI C ---***--- cosl #include <math.h> long double cosl(long double x); DOS Win16 OS/2 Win32 | |
cosh, coshl | Вычисляет гиперболический косинус
cosh #include <math.h> double cosh(double x); DOS UNIX Win16 OS/2 Win32 ANSI C++ ANSI C ---***--- coshl #include <math.h> long double coshl(long double x); DOS Win16 OS/2 Win32 | |
country | Возвращает информацию, зависящую от страны
DOS Win16 #include <dos.h> OS/2 struct country *country(int xcode, struct COUNTRY *cp); | |
cprintf | Осуществляет форматированный вывод на экран
DOS #include <conio.h> OS/2 Win32 int cprintf(const char *format[,аргумент,...]); | |
cputs | Выводит строку на экран
DOS #include <conio.h> OS/2 Win32 int cputs(const char *str); | |
_creat | Смотpи _rtl_crerat | |
creat | Создает новый файл или перезаписывает
существующий DOS UNIX Win16 #include<io.h> OS/2 Win32 int creat(const char *path, int amode); | |
creatnew | Создает новый файл
DOS Win16 #include<is.h> OS/2 Win32 int creatnew(const char *path, int mode); | |
creattemp | Создает уникальный файл в каталоге, определенном в маршруте
DOS Win16 #include<io.h> OS/2 Win32 int creattemp(char *path, int attrib); | |
_crotl,_crotr | Пеpевоpачивает и изменяет символы в
пеpеменных налево или напpаво. DOS Win16 #include<stdlib.h> OS/2 Win32 unsigned char _crotl(unsigned char val, int count) unsigned char _crotr(unsigned char val, int count) | |
cscanf | Просматривает и форматирует ввод с консоли
DOS Win16 #include <conio.h> OS/2 Win32 int cscanf(char *format[,адрес,...]); | |
ctime | Преобразует дату и время в строку
DOS UNIX Win16 #include <time.h> OS/2 Win32 char *ctime(const time_t *time); ANSI C++ ANSI C | |
ctrlbrk | Устанавливает программу обработки Ctrl/Break
DOS Win16 #include <dos.h> Win32 void ctrlbrk(int (*handler)(void)); | |
cwait | Заканчивает пpиостановку подпpогpамм
OS/2 Win32 #include<process.h> int cwit(int *statloc, int pid, int action); | |
delline | Удаляет строку в текстовом окне
DOS Win16 #include <conio.h> OS/2 Win32 void delline(void); | |
difftime | Вычисляет разницу между двумя моментами времени
DOS UNIX Win16 OS/2 Win32 #include <time.h> ANSI C++ ANSI C double difftime(time_t time2, time_t time1); | |
disable, _disable, enable, _enable | Запрещает и разрешает прерывания
DOS Win16 Win32 #include<dos.h> void disable(void); void _disable(void); void enable(void); void _enable(void); | |
div | Делит два целых числа, возвращая частное и остаток
DOS Win16 OS/2 Win32 #include <stdlib.h> ANSI C++ ANSI C div_t div(int numer, int denom); | |
_dos_close | Закрывает файл
DOS Win16 #include <dos.h> OS/2 C++ Win32 unsigned _dos_close(int handle); | |
_dos_commit | Записывает файл на диск
DOS Win16 #include <dos.h> unsigned _dos_commit(int handle); | |
_dos_creat | Создает новый файл на месте уже существующего
DOS Win16 #include <dos.h,io.h> OS/2 unsigned _dos_creat (const shar *path,int attrib,int *handhelp); | |
_dos_creatnew | Cоздает новый файл
DOS Win16 #include <dos.h> OS/2 unsigned _dos_creatnew(const char *path, int attrib,int *handlep); | |
dosexterr | Получает расширенную информацию об ошибке DOS
DOS Win16 #include <dos.h> int dosexterr(struct DOSERROR *eblkp); | |
_dos_findfirst | Выполняет поиск в каталоге диска
DOS Win16 #include <dos.h> OS/2 unsigned _dos_findfirst(const char *pathname, int attrib,struct find_t *ffblk); | |
_dos_findnext | Продолжает поиск, начатый _dos_findfirst
DOS Win16 #include <dos.h> OS/2 unsigned _dos_findnext(struct find_t *ffblk); | |
_dos_getdate, | Изменяет системную дату.
_dos_setdate, getdate,setdate #include <dos.h> 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 <dos.h> OS/2 unsigned _dos_getdiskfree(unsigned char drive, struct diskfree_t *dtable); | |
_dos_getdrive, | Заменяет текущий диск
_dos_setdrive #include <dos.h> DOS Win16 void _dos_getdrive(unsigned *drivep); OS/2 void _dos_setdrive(unsigned drivep, unsigned *ndrives); | |
_dos_getfileattr, | Изменяет pежим доступа к файлу.
_dos_setfileattr #include <dos.h> 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.h> 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.h> DOS Win16 void _dos_gettime(struct dostime_t *timep); OS/2 unsigned _dos_settime(struct dostime_t *timep); | |
_dos_getvect | Получает вектор прерывания
DOS Win16 #include <dos.h> OS/2 void interrupt(*_dos_getvect(unsigned interruptno)) (); | |
_dos_open | Открывает и подготавливает заданный файл для
чтения или записи DOS Win16 #include <fcntl.h> #include <share.h> #include <dos.h> unsigned _dos_open(const char *filename, unsigned oflags,int *handlep); | |
_dos_read | Считывает данные из файла
DOS Win16 #include <dos.h,io.h> 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 <dos.h> void _dos_setvect(unsigned interruptno, void iterrupt (*isr) ()); | |
dostounix | Преобразует дату и время в формат UNIX
DOS Win16 #include <dos.h> long dostounix(struct date *d, struct time *t); | |
_dos_write | Записывает в файл
DOS Win16 #include <dos.h> OS/2 unsigned _dos_write (int handle, const void_ _far *buf,unsigned len unsigned *nwritten); | |
dup | Дублирует описатель файла
DOS UNIX Win16 #include <io.h> OS/2 Win32 int dup(int handle); | |
dup2 | Дублирует описатель файла (oldhandle) в новый
(newhandle) DOS UNIX Win16 OS/2 Win32 #include <io.h> int dup2(int oldhandle,int newhandle); | |
ecvt | Преобразует число с плавающей точкой в строку
DOS UNIX Win16 #include <stdlib.h> OS/2 Win32 char *ecvt(double value, int ndig, int *dec, int *sign); | |
__emit__ | Вставляет литерные значения прямо в объектный
код DOS UNIX Win16 OS/2 Win32 #include <dos.h> void __emit__(аргумент,...); | |
enable,_enable | Смотpи disable | |
_endtfread | Заканчивает обpаботку подпpогpаммы
#include <process.h> OS/2 Win32 void _endthread (void); | |
eof | Контролирует достижение конца файла
DOS Win16 #include <io.h> OS/2 Win32 int eof(int handle); | |
exec... | Загружает и выполняет другие программы
DOS #include <process.h> 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 <stdlib.h> OS/2 Win32 void _exit(int status); | |
exit | Завершает выполнение программы
DOS UNIX Win16 #include <stdlib.h> OS/2 Win32 void exit(int status); ANSI C++ ANSI C | |
exp, expl | Вычисляет экспоненту (е в степени х)
exp #include<math.h> double exp(double x); DOS UNIX Win16 OS/2 Win32 ANSI C++ ANSI C ---***--- expl #include<math.h> long double expl(long double x); DOS Win16 OS/2 Win32 | |
_expand | Пpоизводит сжатие нескольких блоков
#inclue <malloc.h> OS/2 Win32 void *_expand(void *block, size_t size); | |
fabs, fabsl | Определяет абсолютное значение числа с плавающей точкой
fabs #include<math.h> double fabs(double x); DOS UNIX Win16 OS/2 Win32 ANSI C++ ANSI C ----***--- fabsl #include<math.h> long double fabls(long double x); DOS Win16 OS/2 Win32 | |
farcalloc | Выделяет память из кучи c дальней адpесацией
DOS Win16 #include <alloc.h> OS/2 void far *farcalloc(unsigned long nunits, unsigned long unitsz); | |
farfree | Освобождает блок из кучи с дальней адpесацией
DOS Win16 #include <alloc.h> void farfree(void far *block); | |
farmalloc | Выделяет память в куче с дальней адресацией
DOS Win16 #include <alloc.h> void far *farmalloc(unsigned long nbytes); | |
farrealloc | Регулирует размер блока в куче с дальней адресацией
DOS Win16 OS/2 #include <alloc.h> void far *farrealloc(void far *oldblock, unsigned long nbytes); | |
fclose | Закрывает поток
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 int fclose(FILE *stream); ANSI C++ ANSI C | |
fcloseall | Закрывает открытые потоки
DOS UNIX Win16 #include [<stdio.h> OS/2 Win32 int fcloseall(void); | |
fcvt | Преобразует число с плавающей точкой в строку
DOS UNIX Win16 #include<stdlib.h> OS/2 Win32 char *fcvt(double value,int ndig,int *dec, int *sign); | |
fdopen | Связывает поток с описателем файла
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 FILE *fdopen(int handle, char *type); | |
feof | Обнаруживает конец файла в потоке
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 int feof(FILE *stream); ANSI C++ ANSI C | |
ferror | Обнаруживает ошибки в потоке
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 int ferror(FILE *stream); ANSI C++ ANSI C | |
fflush | Очищает поток
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 int fflush(FILE *stream); ANSI C++ ANSI C | |
fgetc | Получает символ из потока
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 int fgetc(FILE *stream); ANSI C++ ANSI C | |
fgetchar | Получает символ из потока stdin
DOS UNIX Win16 #include <stdio.h> OS/2 Win32 int fgetchar(void); ANSI C++ ANSI C | |
fgetpos | Получает текущий указатель файла
DOS Win16 #include<stdio.h> OS/2 Win32 int fgetpos(FILE *stream, fpos_t *pos); ANSI C++ ANSI C | |
fgets | Получает строку из потока
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 char *fgets(char *s, int n, FILE *stream); ANSI C++ ANSI C | |
filelength | Получает размер файла в байтах
DOS Win16 #include<io.h> OS/2 C++ Win32 long filelength(int handle); | |
fileno | Получает описатель файла
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 int fileno(FILE *stream); | |
findfirst | Выполняет поиск в каталоге диска
DOS Win16 #include<dir.h> OS/2 Win32 int findfirst(const char *pathname, struct ffblk *ffblk, int attrib); | |
findnext | Продолжает поиск функции findfirst
DOS Win16 #include<dir.h> OS/2 Win32 int findnext(struct ffblk *ffblk); | |
floor,floorl | Округляет в меньшую сторону
floor #include <math.h> double floor(double x); DOS UNIX Win16 OS/2 Win32 ANSI C++ ANSI C ---***--- floorl #include <math.h> long double floorl(long double x); DOS Win16 OS/2 Win32 | |
flushall | Очищает все потоки
DOS UNIX Win16 #include <stdio.h> 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 <math.h> double fmod(double x, double y); DOS UNIX Win16 OS/2 Win32 ANSI C++ ANSI C ---***--- fmodl #include <math.h> long double fmodl(long double x,long DOS Win16 double y); OS/2 Win32 | |
fnmerge | Создает из составных частей полное имя файла
DOS Win16 #include<dir.h> OS/2 Win32 void fnmerge(char *path, const char *drive, const char *dir, const char *name, const char *ext); | |
fnsplit | Расщепляет полное имя файла на компоненты
DOS Win16 #include<dir.h> OS/2 Win32 void fnsplit(char *path, char *drive, char *dir, char *name, char *ext); | |
fopen | Открывает поток
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 FILE *fopen(const char *filename, ANSI C++ ANSI C const char *mode); | |
FP_OFF,FP_SEG | Получает смещение или сегмент с дальней адресацией
DOS Win16 #include<dos.h> Win32 unsigned FP_OFF(void far *p); unsigned FP_SEG(void far *p); | |
_fpreset | Инициализирует заново математический пакет для
работы с плавающей точкой DOS Win16 #include <float.h> OS/2 Win32 void _fpreset(void); | |
fprintf | Записывает форматированный вывод в поток
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 int fprintf(FILE *stream, ANSI C++ ANSI C const char *format[,аргумент,...]); | |
fputc | Выводит символ в поток
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 int fputc(int c, FILE *stream); | |
fputchar | Выводит символ в поток stdout
DOS UNIX #include<stdio.h> OS/2 Win32 int fputchar(int c) ANSI C++ | |
fputs | Выводит строку в поток
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 int fputs(const char *s, FILE *stream); ANSI C++ ANSI C | |
fread | Cчитывает данные из потока
DOS UNIX Win16 #include<stdio.h> 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<stdlib.h> OS/2 Win32 void free(void *block); ANSI C++ ANSI C | |
freopen | Соединяет новый файл с открытым потоком
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 FILE *freopen(const char *filename, ANSI C++ ANSI C const char *mode, FILE *stream); | |
frexp,frexpl | Расщепляет число типа double на мантиссу и показатель
frexp #include<math.h> double frexp(double x,int *exponent); DOS UNIX Win16 OS/2 Win32 ANSI C++ ANSI C ---***--- frexpl #include<math.h> long double frexpl(long double x, DOS UNIX Win16 int *exponent); OS/2 Win32 | |
fscanf | Просматривает и форматирует ввод из потока
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 int fscanf(FILE *stream, ANSI C++ ANSI C const char *format[,address,...]); | |
fseek | Перемещает указатель файла по потоку
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 int fseek(FILE *stream,long int offset, ANSI C++ ANSI C int whence); | |
fsetpos | Позиционирует указатель файла потока
DOS Win16 #include<stdio.h> OS/2 Win32 int fsetpos(FILE *stream, const fpos_t *pos); ANSI C++ ANSI C | |
_fsopen | Открывает поток с коллективным использованием
файла DOS Win16 #include<stdio.h> OS/2 Win32 #include<share.h> FILE *_fsopen(const char *filename, const char *mode, int shflg); | |
fstat,stat | Получает информацию об открытом файле
DOS UNIX Win16 #include<sys\stat.h> 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<stdio.h> OS/2 Win32 long int ftell(FILE *stream) ANSI C++ ANSI C | |
ftime | Сохраняет текущее время в структуре timeb
DOS UNIX Win16 #include<sys\timeb.h> OS/2 Win32 void ftime (struct timeb *buf); | |
_fullpath | Преобразует полное имя файла из относительного
в абсолютное DOS Win16 OS/2 C++ Win32 #include<stdlib.h> char* _fullpath(char *buffer, const char *path, int buflen); | |
fwrite | Записывает в поток
DOS UNIX Win16 #include<stdio.h> OS/2 Win32 size_t fwrite(const void *ptr, size_t size, ANSI C++ ANSI C size_t n, FILE *stream); |
Назад | Содержание | Вперед
Справочник по работе с DOS
Ниже представлена информация, которая будет полезной при
разработке 16-разрядных приложений для работы в DOS.
Справочное руководство по ObjectWindows 2.0 для С++
В данном руководстве в алфавитном порядке перечислены классы
и структуры ObjectWindows с указанием соответствующих файлов-заголовков. Многие из характеристик данных классов иерархически
наследуются из базовых классов.
Примечание: Если класс имеет несколько конструкторов,
то описывается только наиболее общий из них.
Ссылки
Поскольку освоить работу со ссылками языка С++, начинающему
программисту иногда бывает сложно, ниже дается некоторая информация о них.
С++ позволяет передавать аргументы как по значению, так и по
ссылке. Типы ссылок С++ тесно связаны с типами указателей и служат для создания псевдонимов объектов и позволяют передачу аргументов функциям по ссылке.
Ссылки на данные и функции
В операторах asm вы можете использовать любой идентификатор
Си, включая динамические локальные переменные, регистровые переменные и параметры функции. Borland С++ автоматически преобразует
эти символы в соответствующие операнды ассемблера и добавляет к
именам идентификаторов символы подчеркивания.
В общем случае вы можете использовать идентификатор Си в любой позиции, где допускается операнд адреса. Там, где допустим
регистровый операнд, вы можете использовать регистровую переменную. Если ассемблер обнаруживает идентификатор при анализе операторов инструкции встроенного ассемблера, то он ищет идентификатор
в таблице идентификаторов Си. Имена регистров 80х86 из поиска
исключаются. Имена регистров можно задавать символами в верхнем
регистре.
При программировании вам не нужно заботиться о точных смещениях локальных переменных - использование имени переменной предусматривает корректные смещения. Однако, может оказаться необходимым включить в инструкции ассемблера WORD PTR, BYTE PTR или
другие переопределения размера. Для косвенных инструкций вызова
типа FAR или LES необходимо переопределение DWORD PTR.
Стандартные объекты проверки допустимости
Стандартные классы проверки допустимости ObjectWindows автоматизируют проверку данных. ObjectWindows определяет в validate.h
6 классов проверки допустимости:
TValidator | Базовый класс, из которого создаются все другие производные классы. |
TFilterValidator | Класс фильтра проверки допустимости. |
TRangeValidator | Класс проверки допустимости по целочисленному диапазону. |
TLookupValidator | Класс проверки по таблице. |
TStringLookupValidator | Класс проверки допустимости строки. |
TPXPictureValidator | Класс проверки допустимости по
шаблону. |
Стандартный файл определения модуля
Файл определения модуля не является строго обязательным для
создания выполняемой программы Windows с использованием Borland
C++. Если файл определения модуля не задан, по умолчанию принимается следующее:
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE (для прикладных про-
грамм) или
PRELOAD MOVEABLE SINGLE (для DLL)
HEAPSIZE 4096
STACKSIZE 5120 (для TLINK32 1048576)
Для замены утверждения EXETYPE компоновщик Borland C++ может
определять вид выполняемой программы, которую вы хотите создать с
помощью IDE или компилятора командной строки.
Вы можете включать библиотеку импорта для замены секции
IMPORTS определения модуля.
Для того, чтобы не нужно было указывать секцию EXPORTS, вы
можете использовать ключевое слово _exрort в определениях функций
экспорта в вашей исходной программе на языке Си или C++. Заметим,
однако, что если для экспорта функции используется _exрort, то
функция будет экспортироваться по имени, а не по перечислению
(перечисление обычно более эффективно).
Если вы хотите изменить стандартные атрибуты, вам необходим
файл определения модуля.
Стандарты ANSI, зависящие от реализации
Некоторые аспекты языка Си стандарта ANSI не определены
ANSI достаточно подробно. В таких случаях каждая реализация компилятора Си может сама определять отношение к этим аспектам. Ниже
говорится о том, как эти зависящие от реализации стандарты определены фирмой Borland. Номера разделов соответствуют здесь публикации стандарта ANSI от февраля 1990 года, которая является самой
новой. Отметим, что между Си и С++ имеются различия, а данное
приложение относится исключительно к Си.
Как идентифицировать диагностические сообщения
При запуске с правильной комбинацией параметров любое сообщение, выдаваемое компилятором и начинающееся словами Fatal,
Error или Warning, считается диагностическим в смысле, определяемом ANSI. Ниже приводятся параметры, необходимые для того, чтобы
обеспечивалась данная интерпретация:
Идентификация диагностических сообщений в C++
-A | Разрешает только ключевые слова ANSI. |
-C- | Запрещает вложенные комментарии. |
-i32 | Устанавливает минимум 32 значащих символа в идентификаторах. |
-p- | Устанавливает использование соглашения о связях Си. |
-w- | Выключает все предупреждения, кроме следующего. |
-wbei | Включает предупреждение о несоответствии инициализаторов. |
-wbig | Включает предупреждение о слишком большой константе. |
-wcpt | Включает предупреждение о немобильных сравнениях указателей. |
-wdcl | Включает предупреждение об объявлениях без типа или класса памяти. |
-wdup | Включает предупреждение о дублирующихся неидентичных определениях макрокоманды. |
-wext | Включает предупреждение о переменных, определенных
сразу как external и static. |
-wfdt | Включает предупреждение об определениях функции, использующих typedef |
-wrpt | Включает предупреждение о немобильных преобразованиях
указателей. |
-wstu | Включает предупреждение о неопределенных структурах. |
-wsus | Включает предупреждение о подозрительном преобразовании указателя. |
-wvrt | Включает предупреждение о функции void, возвращающей
значение. |
-wucp | Включает предупреждение о смешанном использовании указателей signed и unsigned char. |
Использование следующих параметров запрещено:
-ms! | Для моделей данных small SS и DS должны совпадать. |
-mm! | Для моделей данных small SS и DS должны совпадать. |
-mt! | Для моделей данных small SS и DS должны совпадать. |
-zGxx | Имя группы BSS не может быть изменено. |
-zSxx | Имя группы данных data не может быть изменено. |
Семантика аргументов функции main
Когда программа выполняется в операционной системе DOS версий до 3.0, значение argv[0] представляет собой указатель на нулевой байт. Для версии DOS 3.0 и старше argv[0] указывает на имя программы.
Остальные строки argv указывают на каждый компонент аргументов командной строки DOS. Пробельные символы, разделяющие аргументы, удаляются, и каждая последовательность непрерывных непробельных символов рассматривается как отдельный аргумент. Строки
символов в кавычках рассматриваются обычным способом (как одна
строка, которая может содержать пробелы.)
Что считается интерактивным устройством
Это любое устройства, работающее как консоль.
Схема упорядочения набора символов времени выполнения
Схема упорядочения набора символов времени выполнения
использует знаковое ASCII-значение символа.
Элементы наборов символов - исходного и этапа выполнения
Наборы символов, исходный и времени выполнения, представляют
собой расширенный набор символов ASCII, поддерживаемый IBM PC. В
строковых литералах, символьных константах или комментариях, может находиться любой символ, кроме ^Z (Control-Z).
Многобайтовые символы
Многобайтовые символы в Borland C++ не поддерживаются.
Направление печати
Печать символов происходит слева-направо, в нормальном для
PC направлении.
Число бит в символе из набора воспринимаемых символов
Символ из набора символов этапа выполнения имеет длину 8
бит.
Число значащих начальных символов идентификатора
Значащими являются только первые 32 символа, хотя это значение может быть изменено при помощи параметров командной строки (l). И внешние, и внутренние символические имена имеют одинаковое
число значащих символов. (Число значащих символов в идентификаторах С++ не ограничено).
Учитывается ли регистр во внешних идентификаторах
Компилятор обычно заставляет компоновщик делать различие
между заглавными и строчными буквами. Для того, чтобы подавить
учет регистра, служит параметр командной строки (-l-c).
Представления и множества воспринимаемых значений для
различных типов целых чисел
signed char | -128 | 127 |
unsigned char | 0 | 255 |
signed short | -32768 | 32767 |
unsigned short | 0 | 65535 |
signed int | -32768 | 32767 |
unsigned int | 0 | 65535 |
signed long | -2147483648 | 2147483647 |
unsigned long | 0 | 4294967295 |
байт.
Все типы char используют 1 8-битовый байт памяти.
Все типы short и int используют 2 байта (в 16-разрядной
программе).
Все типы short и int используют 4 байта (в 32-разрядной
программе).
Все типы long используют 4 байта.
Если задано выравнивание в памяти (-a), все объекты целых
типов, кроме char, выравниваются по границе четных байт. Если задан параметр -a4, результатом будет 4-байтовое выравнивание. Символьные типы не выравниваются никогда.
Представления и множества принимаемых значений для
различных типов чисел с плавающей точкой
Для типов чисел с плавающей точкой Borland C++, допускаемых
сопроцессором Intel 8087 используются форматы плавающей точки
IEEE. Тип float использует 32-битовый формат действительных
чисел IEEE. Тип double использует 64-битовый формат
действительных чисел IEEE. Тип long double использует
80-битовый расширенный формат действительных чисел IEEE.
Соотношение между наборами символов - исходным и времени
выполнения
Любые символы в строковых литералах или символьных константах остаются во время выполнения программы без изменений. Наборы символов, исходный и времени выполнения, одинаковы.
Текущее место действия, используемое для преобразования
многобайтовых символов в соответствующие широкие символы
для широкой символьной константы
Широкие символьные константы распознаются.
Значение целочисленной константы, которая содержит более
одного символа, или широкая символьная константа, которая содержит более одного многобайтового символа
Символьные константы могут содержать 1 или 2 символа. В случае двух символов первый символ занимает младший байт константы,
а второй - старший.
Результат преобразования целого в более короткий тип целого со знаком, либо результат преобразования целого без
знака в целое со знаком равной длины, если значение не
может быть представлено полностью
Эти преобразования выполняются простым усечением бит старшего порядка. Целые со знаком хранятся в виде дополнения до 2, поэтому результирующее число интерпретируется как таковое. Если
старший бит более короткого целого ненулевой, то это значение интерпретируется как отрицательное. В противном случае оно считается положительным.
Направление усечения, когда число целого типа преобразуется в число с плавающей точкой, которое не может в точности представлять исходное число
Целое число округляется до ближайшего представимого значения. Например, значение типа long (2^32-1) преобразуется в значение float 2^31. Разрешение направления округления производится по
стандартным арифметическим правилам IEEE.
Направление усечения или округления при преобразовании
числа с плавающей точкой в число с плавающей точкой
меньшей точности представления.
Число округляется до ближайшего представимого значения. Разрешение направления округления производится по стандартным арифметическим правилам IEEE.
Результаты поразрядных операций для целых со знаком
Поразрядные операции выполняются для целых со знаком так
же, как и для соответствующих типов без знака. Знаковый бит
рассматривается как обычный бит данных. Результат затем
интерпретируется как обычное двоичное целое со знаком,
представленное как дополнение.
Что происходит, когда доступ к элементу объекта типа
объединения происходит при помощи элемента другого типа
Доступ разрешен и будет происходить к хранимым там битам.
Для понимания доступа к элементу с плавающей точкой с использованием для этого компонента другого типа вы должны четко представлять себе битовую кодировку значений с плавающей точкой. Если
хранимый элемент короче, чем элемент, используемый для доступа к
значению, то лишние биты будут иметь значения, то они сохранят
значения, которые они имели до записи в память более короткого
элемента.
Тип целого числа, предназначенного для хранения максимального размера массива
Для обычного массива это тип unsigned int, а для массивов в
случае модели данных huge это тип signed long.
Результат приведения типа указателя в целое и обратно
При преобразованиях между целыми и указателями одинаковых
размеров ни один бит не изменяется. При преобразовании более
длинного типа к более короткому усекаются старшие биты. При преобразовании более короткого целого в более длинный указатель сначала целое расширяется в такой целый тип, который по длине соответствует данному указателю. Целые со знаком для заполнения новых
байтов расширяются по знаку. Аналогичным образом, более короткие
указатели для преобразования в более длинный целый тип сначала
расширяются до типа указателя, который по длине равен данному
целому типу.
Знак остатка при целочисленном делении
Когда только один из операндов отрицателен, остаток также
будет отрицательным. Если ни один из операндов не отрицателен,
или оба отрицательны, остаток будет положительным.
Целый тип, необходимый для хранения разности между двумя
указателями на элементы одного и того же массива,
ptrdiff_t
Для ближних (near) указателей это тип signed int, а для указателей far или huge - это signed long. Тип ptrdiff_t зависит от
используемой модели памяти. Для малых моделей памяти это тип int,
а для больших моделей памяти - это тип long.
Результат сдвига вправо отрицательного целого типа со
знаком
Отрицательные значения со знаком при сдвиге
вправо расширяются по знаку.
Степень вероятности фактического размещения в регистрах
объектов со спецификатором класса памяти register
В регистр могут быть помещены объекты, объявленные как двухбайтовые целые типы или указатели. Компилятор может помещать в
регистр динамические локальные переменные малого размера, но объявленные как register будут иметь приоритет. Для этого бывает
доступно не меньше двух, а вообще до шести регистров. Число фактически используемых для этой цели регистров зависит от числа регистров, необходимых для хранения промежуточных значений текущей функции.
Рассматривается ли линейное битовое поле int как signed
int, или же как unsigned int
Линейные битовые поля int рассматриваются как имеющие тип
signed int.
Порядок распределения битового поля в int
Битовое поле распределяется в направлении от позиции младшего бита к позиции старшего бита (младший бит - самый правый).
Заполнение и выравнивание компонентов структур
По умолчанию заполнение структур символами-заполнителями не
выполняется. При использовании параметра выравнивания (-a) структуры дополняются до четного размера, а любые компоненты, не имеющие символьного типа или типа символьного массива, выравниваются
по четным адресам смещения.
Может ли битовое поле пересекать границу блока памяти
Когда параметр выравнивания (-a) не запрашивается, битовое
поле может пересекать границу слова, но никогда не может занимать
более двух соседних байт.
Целый тип, которым представляются значения перечислимого типа
Если нумераторов столько, что хватает типа unsigned char, то
выбирается этот тип; в противном случае выбирается signed int.
Доступ к объекту типа volatile
Любая ссылка к объекту volatile приводит к доступу к этому
объекту. Приведет ли к доступу к объекту volatile доступ к смежным адресам памяти, зависит от конструктивной реализации памяти.
В случае памяти специальных устройств, например памяти видеодисплея, это зависит от конструкции устройства. Для обычной памяти PC объекты volatile используются только при условии доступа по
асинхронным прерываниям, так что доступ к соседним объектам не
оказывает влияния.
Максимальное число описателей, которые могут модифицировать арифметический тип, структуру или объединение
Специальных ограничений на число описателей нет. Число
разрешенных описателей достаточно велико, однако при глубоком
уровне вложенности в набор блоков функции число описателей
уменьшается. На файловом уровне это число не менее 50.
Максимальное число case-вариантов в операторе switch
На число вариантов оператора switch специальных ограничений
нет. Если памяти достаточно, то компилятор обработает все.
Соответствует ли значение односимвольной константы в
выражении типа константы, управляющем условным включением, значению той же символьной константы в наборе
символов этапа выполнения; может ли такая символьная
константа принимать отрицательное значение
Все символьные константы, даже константы условных директив,
используют один и тот же набор символов (времени выполнения). Односимвольная константа будет отрицательной, если это символьный
тип со знаком signed char (по умолчанию и при -K не запрашивается).
Метод поиска включаемых исходных файлов
В случае имен включаемых файлов, заданных в угловых скобках,
если каталоги включаемых файлов указаны в командной строке, то
поиск файлов производится в каждом из этих каталогов. Просмотр
каталогов включаемых файлов происходит в следующем порядке. Сначала берутся каталоги, заданные в командной строке, а затем указанные в TURBOC.CFG или BCC32.CFG. Если каталоги включаемых файлов не заданы, то поиск выполняется только в текущем каталоге.
Поддержка задания в кавычках имен включаемых исходных
файлов
Если имя файла задано в кавычках, то поиск файла будет выполняться в текущей директории. Если файл не найден, то далее
Borland C++ будет выполнять поиск файла, как если бы его имя было
задано в угловых скобках.
Особенности последовательности символов в именах файлов
Символы обратной наклонной черты в именах включаемых файлов
рассматриваются как отдельные символы, а не как символы управляющей последовательности. Различия в регистре, в которым набрана та
или иная буква, игнорируются.
Определения __DATE__ и __TIME__ , когда они недоступны
Дата и время доступны всегда и используют системные дату и
время DOS.
Символ десятичной точки (для чисел с плавающей точкой).
Символом точки в десятичной записи чисел с плавающей
точкой является '.'.
Тип оператора sizeof, size_t
Тип size_t - unsigned int.
Константа - пустой указатель, в которую расширяется
макроопределение NULL
Для 16- разрядного приложения это int или long 0, в зависимости от модели памяти.
Для 32-разрядных приложений NULL расширяется в нулевое значение типа int или long (32-битовые числа со знаком).
Печатаемые диагностические сообщения и поведение при
завершении функции assert
Печатается диагностическое сообщение "Assertion failed:выражение, file имя_файла, line nn", где выражение - это выражение с
неудачно завершившейся функцией контроля особой ситуации,
имя_файла - это имя исходного файла, а nn - это номер строки, где
выполнялся контроль.
После вывода на дисплей данного диагностического сообщения
вызывается функция abort.
Определяемые реализацией аспекты проверки символов и
функции задания учета регистра
Отсутствуют, за исключением описанных в следующем пункте.
Наборы символов, проверяемые функциями isalnum,
isalpha, iscntrl, islower, isprint и isupper
Первые 128 ASCII-символов а режиме по умолчанию или все 256
символов.
Значения, возвращаемые математическими функциями при
ошибках, связанных с областью определения
IEEE NAN (не-число).
Устанавливают ли математические функции целочисленное
выражение errno в значение макрокоманды ERANGE в случае
ошибки потери значимости
Нет, только для других ошибок - области переполнения, сингулярности, переполнения и общей потери точности.
Происходит ли ошибка области определения, или возвращается ноль, когда функция fmod имеет второй аргумент,
равный нулю
Нет. fmod(x, 0) возвращает 0.
Набор сигналов функции signal
SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, SIGTERM.
Семантика каждого сигнала, распознаваемого функцией
signal
См. описание функции signal в "Справочнике по библиотеке".
Обработка по умолчанию и обработка при загрузке программы каждого сигнала, распознаваемого функцией signal
См. описание функции signal в "Справочнике по библиотеке".
Блокирование сигнала, выполняемое если эквивалент
signal (sig,SIG_DFL); не выполнен перед вызовом обработчика сигналов
Эквивалент signal(sig,SID_DFL) выполняется всегда.
Будет ли отменена обработка сигнала по умолчанию при
получении сигнала SIGILL обработчиком, заданным функции
signal
Всегда выполняется эквивалент signal(sig,SIG_DGF).
Требуется ли в последней строке текстового потока оконечный символ новой строки
Нет, не требуется.
Появляются ли при чтении символы пробела, записанные в
текстовый поток непосредственно перед символом новой
строки
Да, появляются.
Число нулевых символов, которые могут быть добавлены к
данным, записываемым в двоичный поток
Не добавляются.
Устанавливается ли первоначально указатель позиции файла потока в режиме добавления (append) в начало или в конец файла
Указатель позиции файла для потока в режиме добавления
первоначально помещается в начало файла. Перед каждой операцией
записи он сбрасывается в конец файла.
Вызывает ли запись в текстовый поток усечение связанного с потоком файла за данной позицией
Запись 0 байт может привести, а может и не привести к усечению файла, в зависимости от буферизации файла. Безопаснее считать, что операция записи с нулевой длиной имеет непредсказуемое
поведение.
Характеристики буферизации файла
Файл может иметь полную буферизацию, строчную буферизацию
или не иметь таковой. Если файл буферизован, то перед открытием
файла по умолчанию создается буфер с размером 512 байт.
Существуют ли физически файлы нулевой длины
Да, существуют.
Может ли один и тот же файл быть открыт неоднократно
Да, может.
Действие функции remove на открытый файл
Никакой специальной проверки, является ли файл открытым, не
выполняется. Ответственность лежит на программисте.
Что произойдет, если файл с новым именем уже существовал перед вызовом rename
rename вернет значение -1, а errno будет установлена в значение EEXIST.
Вывод в случае преобразования %p в fprintf
В случае ближних моделей данных это четыре шестнадцатиричных
цифры (XXXX). В случае дальних моделей данных это четыре шестнадцатиричных цифры, двоеточие и еще четыре шестнадцатиричных
цифры (XXXX:XXXX). (Для 16-разрядных программ.)
Восемь шестнадцатиричных цифр (ХХХХХХХХ) (для 32-разрядных
программ).
Ввод в случае преобразования %p в fscanf
См. в предыдущем пункте.
Интерпретация символа дефис (-), который не является ни
первым, ни последним символом в списке сканирования в
случае преобразования %[ в fscanf
См. описание fscanf в "Справочнике по библиотеке".
Значение, в которое устанавливается макрокоманда errno
функциями fgetpos или ftell при неудачном завершении
EBADF - Неверный номер файла.
Сообщения, генерируемые функцией perror
Статические библиотеки ObjectWindows
В следующей таблице перечислены статические библиотеки ObjectWindows, их использование операционной системой, и в какой
операционной системе они доступны. Эти файлы находятся в вашем
библиотечном каталоге. Базовые версии файлов ObjectWindows содержатся на инсталляционных дискетах. Дополнительные версии вы можете построить с помощью формирующего файла ObjectWindows (который
находятся в каталоге SOURCE\OWL), используя параметры -DDIAGS и
-DMODEL.
OWLWS.LIB | 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-разрядной динамической библиотеки |
Статические данные в 16-битовых DLL
С помощью функций DLL все приложения, использующие DLL, могут обращаться к глобальным данным DLL. В 16-разрядных DLL функция будет использовать одни и те же данные, независимо от вызывающего ее приложения (в 32-разрядных DLL данные являются частными
данными процесса). Если вы ходите защитить в 16-разрядной DLL
глобальные данные и ограничить их использование единственным приложением, эту защиту нужно написать самостоятельно. Сама DLL не
имеет такого механизма. Если вам нужно, чтобы данные были частными для данного вызывающего DLL приложения, их нужно распределить
и работать с ними вручную. Статические данные в 16-разрядной DLL
являются глобальными для всех вызывающих приложений.
Статические управляющие элементы
Статические управляющие элементы обычно представляют собой
неизменяемые блоки текста или простую графику. Пользователь не
взаимодействует с такими элементами, хотя ваше приложение может
изменять его текст. Примеры вы можете найти в подкаталоге EXAPMLES\OWL\OWLAPI\STATIC.
Так как пользователь не взаимодействует со статическим элементом, приложение не получает от статических управляющих элементов уведомляющих сообщений. Таким образом, если вы не собираетесь
им манипулировать, идентификатор управляющего элемента может не
указываться.
Конструктор TStatic воспринимает обычно стандартных 7 параметров объектов управляющих элементов и два специальных параметра
- текстовую строку статического управляющего элемента и ее максимальную длину (включая завершающий 0). TStatic получает заданные
по умолчанию стили управляющего элемента, добавляет SS_LEFT (для
выравнивания текста влево) и удаляет стиль WS_TABSTOP (чтобы предотвратить перемещение на данный элемент по клавише Tab). Чтобы
изменить стиль, модифицируйте в конструкторе объекта статического
управляющего элемента Attr.Style.
TStatic имеет две функции-элемента для изменения текста статического управляющего элемента: SetText задает текст элемента в
соответствии с переданной строкой, а Clear стирает текст. Изменить текст статического управляющего элемента, созданного со стилем SS_SIMPLE, вы не сможете.
Функция TStatic::GetTextLen возвращает длину текста статического управляющего элемента. Чтобы получить сам текст, используйте TStatic::GetText.
_Stklen (dos.h)
Данная переменная содержит размер стека и имеет следующий
синтаксис:
extern unsigned _stklen;
Переменная _stklen определяет размер стека для 6 моделей памяти. Минимально допустимый размер стека - 128 слов. По умолчанию назначается размер 4К.
В моделях данных small и medium сегмент данных вычисляется
следующим образом:
сегмент данных [small, medium] = глобальные данных +
динамически распределяемая область + стек
где размер динамически распределяемой области можно настроить с
помощью _heaplen.
В модели tiny все (включая код) находится в одном и том же
сегменте, поэтому размер сегмента данных вычисляется следующим
образом (с учетом 256 байт для PSP):
сегмент данных [tiny] = 256 + глобальные данные +
динамически распределяемая область + стек
В моделях compact и large ближней динамически распределяемой
области нет, и стек имеет собственный сегмент, поэтому сегмент
данных вычисляется так:
сегмент данных [compact, large] = глобальные данные
В модели huge стек находится в отдельном сегменте, и каждый
модуль имеет собственный сегмент данных.
Назад | Содержание | Вперед
Странные вызовы конструктора
Обратите внимание на забавные вызовы конструктора базового
класса - использование операции ':' после заголовка функции, и перед
телом функции. Конструктор порожденного класса вызывает конструктор
базового класса, используя синтаксис вызова функции.
circle::circle(double x, double y, double r)
: shape(x,y) < Заметьте как конструктор circle вызывает
конструктор shape с начальной установкой
{
radius = r;
}
Строковые инструкции
Помимо кодов операций, приведенных выше, возможно использование следующих строковых команд, как в исходном виде, так и с
префиксами циклического выполнения.
Строковые инструкции BASM
cmps insw movsb outsw stos
smpsb lods movsw scas stosb
smpsw lodsb scasb stosw
lodsw outsb scasw
insb movs
Структура TChooseColorDialog::TData (chooseco.h)
Содержит информацию, необходимую для инициализации диалогового окна выбранными пользователем цветами.
Структура TDialogAttr
Используется для записи атрибутов создания TDialog.
Структура TEdgeConstraint (layoutco.h)
Эта структура добавляет функции-элементы и устанавливает ограничения границ (но не размера). Она всегда помещает ваше окно
на один элемент изображения выше других окон и затем добавляет
поля.
Структура TEdgeOfSizeConstraint (layoutco.h)
Эта производная от TEdgeConstraint структура представляет
собой класс шаблона, поддерживающий дополнительно ко всем операциям TEdgeConstraint ограничения размера. Высота и ширина задаются при создании экземпляра данного класса.
Структура TFindReplaceDialog::TData (findrepl.h)
Эта структура определяет информацию, необходимую для инициализации диалогового окна TFindReplace.
Структура TLayoutConstraint (layoutco.h)
Эта структура, определяющие ограничения разметки (схемы) окна. Ограничения схемы окна задаются в виде соотношения между шириной и высотой или размером одного окна и краями или размером
другого (одного из братских или родительского окна). Если между
окнами существует связь родительское-дочернее, то размеры дочерних окон зависят от родительского окна. Высота/ширина окна может
зависеть от его противоположного измерения (ширины/высоты).
Структура TListBoxData (listbox.h)
Эта структура используется для передачи содержимого блока
списка.
Структура TOpenSaveDialog::TData (opensave.h)
Содержит информацию о выборе открытия или сохранения файла.
Структура TPrintDialog::TData (printdia.h)
Эта структура содержит информацию, необходимую для инициализации диалогового окна с выбранным пользователем принтером.
Структура TScrollBarStruct (scrollba.h)
Эта структура содержит целочисленные значения, представляющие диапазон скользящего маркера полосы прокрутки.
Структура TWindowAttr (window.h)
Содержит атрибуты TWindow, устанавливаемые при построении.
Ваша программа управляет созданием окна, передавая эти значения
подпрограммам создания TWindow.
Style Sheet
Style Sheet - это набор параметров для построения проекта.
Каждый проект использует заданный по умолчанию набор параметров.
Их значения сохраняются в Style Sheet, а по умолчанию проекты используют Style Sheet с именем "Default Project Options". Если все
компоненты проекта используют одни и те же параметры, вы можете
задать их с помощью диалогового окна Options Project (отредактировав тем самым заданную по умолчанию Style Sheet).
При построении проекта администратор проекта используется
параметры заданные в Style Sheet и Local Override. Если проект
еще не имеет Style Sheet, то используется набор параметров родительского объекта. Пример использования Style Sheet вы можете увидеть в STYLESHT.IDE в каталоге \EXAMPLES\IDE\STYLESHT.
Администратор проекта содержит несколько наборов Style Sheet, которые вы можете использовать, но можно создать для узла и
собственный набор Style Sheet:
Выделите узел и щелкните на нем правой кнопкой "мыши".
Выберите Edit node attributes.
Выберите в блоке списка Style Sheet и щелкните "мышью" на
OK.
Для создания нового комплекта Style Sheet вы можете также
щелкнуть "мышью" на кнопке Style.
Связь документов с классами отображаемых элементов
Класс документа можно связать с классами отображаемых элементов с помощью шаблона документа, который создается путем определения шаблона класса (класс документа ассоциируется с классом
отображаемого элемента) и созданием экземпляра шаблона из этого
определенного класса.
После определения шаблона класса вы можете создать любое
число его экземпляров. Каждый шаблон связывает единственный класс
документа и класс отображаемого элемента. Каждый шаблон имеет
имя, заданное по умолчанию расширение имени файла, каталог, флаги
и фильтры файла. Таким образом, вы можете создать единственный
шаблон класса, который связывает документ с отображаемым элементом. Затем вы можете создать несколько различных экземпляров этого шаблона, и каждый экземпляр будет работать с файлами с различными расширениями в своем заданном по умолчанию каталоге, используя одни и те же классы документа и отображаемого элемента.
Связь интерфейсных объектов с управляющими элементами
Так как диалоговый блок создается из ресурса, вам не нужно
использовать для задания его вида или вида его управляющих элементов код С++. Это позволяет создавать диалоговый блок визуально, но затрудняет управление управляющими элементами из приложения. ObjectWindows позволяет связать или ассоциировать управляющие элементы в диалоговом блоке с интерфейсными объектами. Такая
связь позволяет делать следующее:
Предусмотреть специальную реакцию на сообщения. Например,
вы можете отредактировать управляющий элемент или изменять
стиль командной кнопки при ее "нажатии".
Использовать для манипулирования управляющим элементом
функции-элементы и элементы данных. Это легче и больше
ориентировано на работу с объектами, чем использование сообщений.
Связывание функций
В случае раннего связывания адреса всех функций и процедур определяются на этапе компиляции и компоновки программы, т.е. до выполнения программы.
Вызовы функции: Описания функций:
func_down(); > my_first_metod();
my_metod(); > func_down();
my_first_metod(); > my_metod();
Так, в языке Cи компилятор прежде всего должен найти описание функции по заданному имени.
> описание функции
int my_first_metod(int a, int b)
{
return a + 2*b;
}
.......................
k = my_first_metod(12, 24);
< вызов функции
В противоположность этому, в случае позднего связывания адрес
функции элемента не связывается с обращением к нему до того момента,
пока обращение не произойдет фактически, то есть во время выполнения
программы.
Так в библиотеке Turbo Vision любой объект, порожденный от
TView, должен быть способен к самоизображению в любой момент времени.
Объект TView определяет виртуальную функцию элемент draw, и каждый
порожденный от него объект должен также иметь эту функцию элемент.
Это имеет большое значение, т.к. часто отображаемый объект может быть
закрыт другим отображаемым объектом (или на него может быть наложен
другой отображаемый объект) и когда другой отображаемый объект убирается или смещается, то отображаемый объект должен быть способен к изображению своей части, которая была скрыта.
File Window
Next F6 Demo Window 3
Zoom F5 Demo Window 7
Demo Window 8
Demo Window 1
Demo Window 4
Demo Window 6 Window 2
[*] Demo Window 9 [+]
Alt-X Exit F4 New Alt-F3 Close
Рисунок: программа, написанная с помощью библиотеки Turbo Vision
с множеством открытых окон.
В такой динамической системе нельзя заранее предсказать, сколько
отображаемых объектов будет на экране, каких они будут типов (окно,
меню, диалоговая панель и т.д.) и в какой последовательности пользователь будет с ними работать. В программе, где используется только
ранее связывание, вся информация о количестве, координатах и типах
отображаемых объектов хранится в основной программе. Все возможные
действия над ними тоже должны быть предусмотрены в этой программе.
Таким образом, программе приходится отслеживать очень многое, она
усложняется и теряет гибкость. Стоит добавить один новый тип отображаемого объекта или изменить поведения существующего, и придется
скорректировать программу во всех тех местах, где определяется, какие
подпрограммы подлежат вызову.
Каким же образом можно улучшить положение с помощью позднего
связывания? Рассмотрим случай, когда один отображаемый объект, например, - окно, частично перекрывает другое. Если "верхнее" окно будет
передвинуто или закрыто, то нижнее следует перерисовать для восстановления ранее перекрытой части.
Так как меню окно перерисовывается иначе, чем диалоговая панель
или окно, то каждый объект в отображаемой иерархии должен знать, как
перерисовать себя. В библиотеке Turbo Vision этим занимается функция
элемент draw, имеющийся в каждом объекте-потомке класса TView. Следовательно, если требуется перерисовать объект, то программе не нужно
анализировать, к какому типу отображаемого объекта он относится (как
это требовалось бы при раннем связывании). Она просто вызывает функцию элемент данного объекта draw. Функция исполняется и корректно перерисовывает свой объект на экране. Такая множественность действий, которую может выполнять функция элемент с одним и тем же именем, называется полиморфизмом.
Не смотря на то, что программисты, для достижения полиморфизма
предпочитают использовать позднее связывание, но его можно достичь и
ранним связыванием с помощью переопределяемых функций.
Связывание значения с функциями-элементами
Связывание переданного значения с соответствующей функций элементом подобно связыванию переопределяемых функций, за исключением
случаев, когда должны использоваться имена объектов класса для отметки правильных:
V V
void clock::tick(int sec) Динамическое
^ связывание
{ с функциями
val += sec; элементами
}
V
clock big_ben; // Объявление объекта
^
v v v
big_ben.tick(25);
Позднее (динамическое) связывание происходит во время выполнения
программы. Его можно достигнуть путем использования наследования и
виртуальных функций элементов. Вы можете также использовать указатели
функций. Однако, с виртуальными функциями элементами, все эти опасные
операции с указателями обрабатываются компилятором, а не вами.
Кроме объектов, динамически размещаемых в памяти Турбо и Borland
C++ позволяют вводить статические объекты. Статические объекты размещаются в сегменте данных на этапе компиляции вместе с другими статическими переменными. Это улучшает эффективность использования памяти
и быстродействие по сравнению с динамически размещаемыми объектами.
Свопинг
Если в системе компьютера установлена дополнительная или расширенная память, вы можете сообщить программе управления оверлеев, что он должен использовать эту память при свопинге. В этом случае при удалении модуля из оверлейного буфера (когда туда требуется загрузить новый модуль, а буфер полон) программа управления оверлеями может поместить удаляемый модуль в эту память. При любой последующей загрузке этого модуля за счет того, что модуль перемещается в памяти, а не считывается с диска, экономится время.
В обоих случаях есть две возможности: программа управления оверлеями может либо обнаруживать наличие дополнительной или расширенной памяти самостоятельно и затем брать на себя управление этой памятью, либо использовать уже обнаруженную и распределенную часть такой памяти. В случае расширенной памяти обнаружение памяти не во всех случаях выполняется удачно, поскольку многие программы кэширования памяти и программы организации виртуального диска могут использовать эту память, не делая об этом никаких отметок. Чтобы избежать этих проблем, вы должны сообщить программе управления оверлеями начальный адрес расширенной памяти и какой участок ее можно безопасно использовать. Borland С++ предусматривает две функции, которые позволяют вам инициализировать расширенную и дополнительную память - _OvrInitEms и _OvrInitExt.
- T -
Table limit exceeded
Сообщение об ошибке утилиты TLINK
(превышен размер таблицы)
Переполнена одна из внутренних таблиц компоновщика. Обычно
это означает, что компонуемые программы превышают возможности
компоновщика в части общедоступных идентификаторов, внешних идентификаторов, или определений логических сегментов. Каждый экземпляр сегмента в объектном файле считается за логический сегмент.
Если этот сегмент определяется в двух объектных файлах, то результатом будет два логических сегментов.
Target index of FIXUP is 0 in module модуль
Сообщение об ошибке утилиты TLINK
(целевой индекс FIXUP в модуле равен 0)
Ошибка транслятора.
Template argument must be a constant expression
Сообщение об ошибке этапа компиляции
(аргумент шаблона должен быть выражением-константой)
Нетипизированный фактический аргумент шаблона класса должен
быть выражением-константой (соответствующего типа). Это включает
в себя целочисленные выражения-константы, адреса объектов или
функций с внешней компоновкой элементов.
Template class nesting too deep: 'class'
Сообщение об ошибке этапа компиляции
(слишком глубокая вложенность шаблона класса)
Компилятор накладывает определенные ограничения на уровень
вложенности шаблонов классов, который можно обойти обычно только
через рекурсивную зависимость шаблонов класса. Когда предел такой
вложенности превышен, компилятор выводит данное сообщение об
ошибке для всех вложенных шаблонов классов, что обычно позволяет
легко выявить место рекурсии. Это всегда следует за фатальной
ошибкой Out of memory (Нет памяти).
Например, рассмотрим следующий набор шаблонов классов:
template<class T> class A
{
friend class B<T*>;
};
template<class T> class B
{
friend class A<T*>;
};
A<int> x;
Что приведет к выводу следующих сообщений:
Error: Template class nesting too deep: 'B<int******>'
Error: Template class nesting too deep: 'B<int****>'
Error: Template class nesting too deep: 'B<int***>'
Error: Template class nesting too deep: 'B<int**>'
Error: Template class nesting too deep: 'B<int*>'
Error: Template class nesting too deep: 'B<int>'
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 параметр
.
Type mismatch in parameter параметр in template class name шаблон
Сообщение об ошибке этапа компиляции
(несоответствие типа в параметре в имени шаблона класса). См. следующее сообщение.
Type mismatch in parameter число in template class name шаблон
Сообщение об ошибке этапа компиляции
(несоответствие типа в параметре в имени шаблона класса)
Фактической значение аргумента шаблона для данного параметра
не соответствует в точности типу формального параметра шаблона.
См. выше сообщения о несоответствии типов.
Type mismatch in redeclaration of идентификатор
Сообщение об ошибке этапа компиляции
(несоответствие типа в повторном описании идентификатора)
В вашем исходном файле переменная переописывается с другим
типом, нежели тот, с которым она была объявлена первоначально.
Это может произойти, если функция вызывается и затем объявляется
с типом возврата, отличным от целочисленного. В этом случае вы
должны объявить функцию до первого к ней обращения.
Type name expected
Сообщение об ошибке этапа компиляции
(требуется имя типа)
Произошла одна из следующих ошибок:
в описании файлового уровня или поля структуры не задан
класс памяти и имя типа;
в описании typedef не указан тип для имени;
в описании деструктора класса С++ имя деструктора не является именем типа (это должно быть то же имя, что и имя
класса);
при указании имени базового класса С++ имя не является
именем базового класса.
Type qualifier идентификатор must be a struct or class name
Сообщение об ошибке этапа компиляции
(квалификатор идентификатор типа должен быть структурой или
именем класса)
Квалификатор С++ в конструкторе квалификатор::идентификатор
не является именем структуры или класса.
Таблица реакции на сообщения
После создания нового производного класса вам нужно построить для него таблицу реакции. Таблица реакции для данного класса
выглядит как обычная таблица реакции. Вам нужно обрабатывать в
ней те же командные сообщения, как и обычно. Единственным добавлением является макрокоманда EV_VBXEVENTNAME для обработки нового
класса сообщений от управляющих элементов VBX. Эта макрокоманда
имеет три параметра:
Идентификатор управляющего элемента.
Строку, идентифицирующую имя события. Эта строка зависит
от управляющего элемента и может быть одним из стандартных
имен событий VBX или специальным именем события.
EvHandler - функцию-обработчик для данного события и управляющего элемента.
Текстовое окно Get Info
Вы можете выбрать команду File Get Info для анализа использования памяти и определения того, почему получил управление отладчик. Эта и другая информация отображается в текстовом блоке, который удаляется с экрана при нажатии клавиши Enter, пробела или
Esc. В этом окне отображается следующая информация, в зависимости
от того, отлаживаетесь ли вы в DOS, или в Windows.
Если вы отлаживаете программу для DOS, то в блоке System
Information будет выведена следующая информация:
имя отлаживаемой вами программы;
описание причины остановки программы;
объемы памяти, используемой DOS, отладчиком и вашей програм мой;
версия DOS или Windows, под управлением которой вы работае те;
текущая дата и время.
TDW дает вам следующую информацию о глобальной памяти:
Mode (режим) | Режимами памяти могут быть: Large-frame EMS (EMS-память с
большим размером страничного блока), Small-frame EMS (EMS-память с малым размером страничного блока), или non-EMS (дополнительная память). | |
Banked (банкируемая) | Объем памяти в килобайтах выше линии банка EMS (которая может быть откачана в расширенную память, если ее использует система). | |
Not Banked (не банкируемая) | Объем памяти в килобайтах ниже линии банка EMS (которая не
может быть откачана в расширенную память). | |
Largest (наибольший) | Наибольший непрерывный блок памяти в килобайтах. | |
Symbols (идентификаторы) | Объем оперативной памяти, используемый для загрузки таблицы
идентификаторов программы. |
Кроме перечисленной выше информации окно Windows System Information для Windows NT содержит также следующую информацию: Memory Load Factor (процент используемой оперативной памяти), Physical (доступный и общий объем системной памяти), Page file (размер текущего страничного файла и максимальный размер) и Virtual
(общая и доступная виртуальная память).
Текстовые и графические окна
Borland C++ обеспечивает функции для создания окон и управления ими в текстовом режиме (и графических окон в графическом
режиме). Если вы не знакомы с текстовыми и графическими окнами,
ознакомьтесь со следующим кратким их изложением. Функции Borland
C++, позволяющие управлять текстовыми и графическими окнами, описаны ниже в разделах "Программирование в текстовом режиме" и
"Программирование в графическом режиме".
Окно представляет собой прямоугольную область, определенную
на видеоэкране вашего компьютера PC, когда он находится в текстовом режиме. Когда ваша программа выполняет вывод на экран, то область вывода будет в таком случае ограничена активным окном. Остальная часть экрана (вне окна) остается без изменений.
По умолчанию размер окна равен всему экрану. При помощи
функции window ваша программа может изменить данное использование
по умолчанию полноэкранного текстового окна на текстовое окно,
меньшее, чем полный экран. Эта функция задает позицию окна в экранных координатах.
В графическом режиме вы также можете определить некоторую
прямоугольную область экрана PC. Эта область называется графическим окном или областью просмотра (viewport). Когда ваша графическая программа выполняет вывод рисунков и т.д., графическое окно
действует как виртуальный экран. Остальная часть экрана (вне графического окна) остается без изменений. Определить графическое
окно можно через экранные координаты, вызвав функцию setviewport.
За исключением функций определения текстовых и графических
окон, все остальные функции, как текстового, так и графического
режимов, даются в локальных координатах активного текстового или
графического окна, а не в абсолютных экранных координатах. При
этом верхний левый угол текстового окна будет представлять собой
начало координат (1,1). В графическом режиме начало координат
графического окна будет равно (0,0).
Текстовый вывод в графическом режиме
Ниже приводится краткое описание функций текстового вывода в
графическом режиме:
gettextsettings | Возвращает текущий текстовый шрифт, направление, размер и выравнивание. |
outtext | Посылает строку на экран в текущую позицию (CP). |
outtextxy | Посылает текст на экран в заданную позицию. |
registerbgifont | Регистрирует компонуемый или определяемый пользователем шрифт. |
settextjustify | Устанавливает значения выравнивания текста, используемые функциями outtext и
outtextxy. |
settextstyle | Устанавливает шрифт, тип и коэффициент увеличения текущего текста. |
setusercharsize | Устанавливает соотношение между высотой
и шириной штриховых шрифтов. |
textheight | Возвращает высоту строки в элементах изображения. |
textwidth | Возвращает ширину строки в элементах
изображения. |
Графическая библиотека включает в себя матричный шрифт 8х8 и
несколько векторных шрифтов для вывода текста в графическом режиме.
В матричном битовом шрифте каждый символ определяется как
матрица элементов изображения.
В векторном шрифте каждый символ определяется как последовательность векторов, сообщающих графической системе, как
создается данный символ.
Преимущество использования векторных шрифтов становится очевидным, когда вы начинаете рисовать большие по размеру символы.
Поскольку векторный шрифт определяется как последовательность
векторов, при увеличении размера он сохранит хорошее разрешение и
качество изображения. И напротив, когда вы увеличиваете битовый
матричный шрифт, матрица умножается на соответствующий коэффициент масштабирования. Чем больше этот коэффициент, тем хуже становится разрешение символов. Для малых размеров такой вид шрифта
вполне удовлетворителен, однако для больших размеров вам лучше
выбрать векторный шрифт.
В графике текст выводится функциями outtext или outtextxy, а
управление его выравниванием (относительно текущей позиции) выполняет функция settextjustify. При помощи функции settextstyle
вы должны выбрать символьный шрифт, направление его размещения
(горизонтальное или вертикальное) и размер (масштаб). Узнать текущие установки вывода текстов можно при помощи функции
gettextsettings, которая возвращает текущий текстовый шрифт, выравнивание, увеличение и направление в структуре textsettings.
Функция setusercharsize позволяет модифицировать ширину и высоту
векторных шрифтов.
Если средство отсечения изображения включено, то выводимые
функциями outtext и outtextxy текстовые строки будут отсекаться
по границам графического окна. Если отсечение отключено, то тексты с матричным шрифтом, символы которых не помещаются целиком в
окне, отбрасываются полностью. В случае же векторных шрифтов не
поместившиеся тексты просто отсекаются по границе окна.
Для того, чтобы определить экранный размер данной текстовой
строки, вызовите функцию textheight (которая измеряет высоту
текста в элементах изображения) и textwidth (измеряющую его ширину в элементах изображения).
По умолчанию битовый матричный шрифт 8х8 встроен в графический пакет и поэтому всегда доступен во время выполнения. Векторные шрифты все хранятся в отдельных файлах .CHR. Они могут загружаться во время выполнения или преобразовываться в файлы .OBJ
(при помощи утилиты BGIOBJ) и затем компоноваться с вашим файлом
.EXE.
Обычно подпрограмма settextstyle загружает файл шрифта,
распределяя память для него и затем загружая с диска соответствующий .CHR-файл. В качестве альтернативы данной схеме динамической
загрузки вы можете скомпоновать файл шрифта (или несколько таких
файлов) непосредственно с выполняемым файлом программы. Для этого
сначала требуется преобразовать файл .CHR в файл .OBJ (с помощью
утилиты BGIOBJ - прочтите об этом в файле документации UTIL.DOC,
который находится на дистрибутивном диске), а затем поместить в
исходную программу вызовы registerbgifont (перед вызовом
функции settextstyle) для того, чтобы зарегистрировать данный
символьный шрифт(ы). При построении программы для всех зарегистрированных вами векторных шрифтов необходимо скомпоновать полученные файлы .OBJ.
Использование функции registerbgifont относится к сложным
методам программирования и не рекомендуется начинающим программистам. Более подробно эта функция описана в файле UTIL.DOC, который находится на дистрибутивном диске.
Типы комбинированных блоков
Существуют 3 типа комбинированных блока: простой, раскрывающийся и раскрывающийся со списком. Все эти комбинированные блоки
выводят свою область редактирования, но блок списка в некоторых
из них может быть скрыт.
Простой комбинированный блок не может скрывать свою область
списка. Его область редактирования ведет себя как редактируемый
управляющий элемент. Пользователь может вводить и редактировать
текст, не обязательно совпадающий с одним из элементов списка.
Комбинированный блок с раскрывающимся списком ведет себя как
простой комбинированный блок, однако в начальном состоянии область списка не выводится. Она появляется после щелчка "мышью" на
пиктограмме справа от области редактирования.
Область списка комбинированного блока с раскрывающимся списком ведет себя как область списка раскрывающегося блока и выводится только при необходимости. Эти два типа комбинированных
блоков отличаются только поведением области редактирования, которая в комбинированном блоке с раскрывающимся списком ограничивается выводом текста только одного из элементов списка.
Комбинированные блоки с раскрывающимся списком полезно использовать, когда нужно ограничить выбор только теми элементами,
которые содержатся в списке. Раскрывающиеся комбинированные блоки
могут воспринимать записи, отличные от элементов списка.
Типы ошибок
SuspendBeforeRun | Пользователь вызвал Suspend перед вы зовом Start. |
ResumeBeforeRun | Пользователь вызвал Resume перед вы зовом Start. |
ResumeDuringRun | Пользователь вызвал Resume для нити,
которая не была приостановлена. |
SuspendAfterExit | Пользователь вызвал Suspend для объекта, нить которого уже завершилась. |
ResumeAfterExit | Пользователь вызвал Resume для объекта, нить которого уже завершилась. |
CreationFailure | Операционная система не смогла создать нить. |
DestroyBeforeExit | Перед завершением нити вызван деструктор объекта. |
AssignError | Попытка присвоить объект, не находящий ся в состоянии Create или Finish. |
Типы сообщений
Вы можете получать сообщения различного типа, в зависимости от того, откуда они поступают.
Типы UINT и WORD
Тип UINT создан и широко используется в API для создания типа данных, переносимого с Windows 3.x. UINT определяется как
typedef undigned int UINT;
UINT необходим из-за различий в размерах int между 16-разрядной Windows и Win32. Для 16-разрядной Windows int - это 16-битовое беззнаковое целое, а для Win32 - 32-битовое беззнаковое целое. Для описания целочисленных объектов, которые при компиляции
32-разрядных приложений предполагается расширить с 16 до 32 бит
используйте UINT.
Тип WORD определяется следующим образом:
typedef unsigned short WORD;
WORD описывает 16-битовое значение и в Windows, и в Word32.
Используйте этот тип для создания объектов, которые остаются
16-битовыми на обеих платформах. Поскольку описатели Win32 расширены до 32 бит, они больше не могут иметь тип WORD.
Типы указателей
Tiny | near, _cs | near, _ds |
Small | near, _cs | near, _ds |
Medium | far | near, _ds |
Compact | near, _cs | far |
Large | far | far |
Huge | far | far |
Типы выражений
Вы можете использовать выражения для доступа к значением
идентификаторов программы, вычисления значений и изменения значений элементов данных. Допускается задавать шестнадцатиричные значения, адреса памяти, строки программы, байтовые списки и вызовы
функций. Формат записи шестнадцатиричного значения зависит от
выбранного механизма вычисления:
C | 0xnnnn | 0xnnnnnnnn |
Pascal | $nnnn | $nnnnnnnn |
Assembler | 0nnnn | 0nnnnnnnn |
При отладке 16-битового кода для задания адреса памяти вы
можете использовать обозначение "сегмент:смещение", например:
C | Oxnnnn | Ox1234:Ox0010 |
Pascal | $nnnn | $1234:0010 |
Assembler | nnnnh | 1234h:0B234h |
Чтобы задать номер строки программы, перед десятичным номером строки укажите символ #. Можно задавать также байтовые списки:
C | 1234"AB" | 34 12 41 42 |
Pascal | "ab"0x04"c" | 61 62 04 63 |
Assembler | 'ab'$04'c' | 61 62 04 63 |
Функции из выражений вызываются также, как в исходном коде.
Это позволяет быстро проверить поведение функции.
Точки останова
В Turbo Debugger понятие точки останова включает в себя три
следующих элемента:
место в программе (адрес), где находится точка останова;
условие, при котором она срабатывает;
что происходит, когда срабатывает точка останова (действие).
Адрес может представлять собой отдельный адрес в программе
или быть глобальным (при этом останов может происходить на любой
строке исходного кода или инструкции программы). Под условиями
могут подразумеваться следующие условия, когда происходит останов:
всегда;
когда выражение принимает истинное значение;
когда объекты данных изменяют свое значение.
Можно также задавать "счетчик проходов", который определяет,
чтобы прежде чем сработает точка останова, "условие" должно принимать истинное значение определенное число раз.
При достижении точки останова может выполняться следующее
действие:
приостановка выполнения программы;
регистрация значения выражения;
выполнение выражения;
разрешение группы точек останова;
запрещение группы точек останова.
Обычно точка останова устанавливается на конкретной исходной
строке или машинной инструкции программы. Когда программа достигает точки останова, Turbo Debugger вычисляет ее. Однако точки
останова могут быть и глобальными. Глобальные точки останова вычисляются отладчиком после выполнения каждой строки исходного кода или инструкции. Это позволяет определить момент модификации переменной или указателя.
Когда программа доходит до точки останова, Turbo Debugger
проверяет условия точки останова и проверяет истинность заданного
условия. Если условие выполняется, точка останова срабатывает.
Такая точка останова называется условной.
Точку останова в шаблонах С++
Turbo Debugger поддерживает размещение точек останова в шаблонах С++, шаблонах функций и шаблонах экземпляров классов и объектов. Для установки таких точек останова используются следующие методы:
Если точка останова устанавливается нажатием F2 в окне Module, то точки останова задаются для всех экземпляров классов в шаблонах. Это позволяет вам отладить поведение
шаблона.
Если для установки точки останова в шаблоне используются
клавиши Alt+F2, то активизируется диалоговое окно Breakpoint Options, и в поле ввода Address вы можете задать адрес
шаблона. Открываемое диалоговое окно позволяет вам выбрать
конкретный экземпляр класса.
Установить точку останова на конкретном экземпляре класса
шаблона можно также с помощью окна CPU. Позиционируйте
курсор на строке кода шаблона и нажмите F2.
Удаляются такие точки останова аналогично другим: позиционируйте курсор на точке останова в окне Module и нажмите F2. Удаляются все точки останова соответствующих экземпляров классов. Конкретные точки останова можно удалить с помощью окна CPU.
Трансляторы
Транслятор - это любая программа, которая преобразует один
тип файла в другой. Администратор проекта позволяет вам определить собственные трансляторы. Эти добавляемые трансляторы остаются в файле проекта и не добавляются как перманентные части IDE.
Однако трансляторы, средства просмотра, другие инструментальные
средства и Style Sheet можно передать другому проекту - следующий
выбираемый с помощью команды Project New project проект их наследует. С помощью Options Tools вы можете просмотреть заданные по
умолчанию трансляторы.
Трассировка исключительных ситуаций операционной системы
В TD32 команда OS Exceptoions (в SpeedMenu области кода окна
CPU) открывает диалоговое окно Specify Exception Handling, в котором вы можете задать, как Turbo Debugger должен обрабатывать
исключительные ситуации операционной системы, генерируемые программой.
В блоке списка Exceptions показаны все исключительные ситуации операционной системы, обрабатываемые отладчиком. Для каждой
из них вы можете задать обработку отладчиком или программой обработки исключительных ситуаций. По умолчанию они обрабатываются в
Turbo Debugger. Он приостанавливает программу и активизирует окно
Module или CPU, устанавливая курсор на соответствующую строку кода.
Чтобы изменить это заданное по умолчанию поведение, откройте
окно Specify Exception Handling, подсветите исключительную ситуацию, которую вы хотите обрабатывать вы программе, и щелкните
"мышью" на кнопке с независимой фиксацией User Program.
Если вы хотите, чтобы программа обрабатывала все исключительные ситуации операционной системы, используйте кнопку User
All.
Требования
При создании оверлеев следует помнить несколько простых правил, а именно:
Минимальная часть программы, которая может выделяться в
качестве оверлея, это сегмент.
Прикладные программы с оверлейной структурой должны иметь
одну из трех следующих моделей памяти: medium , large или
huge; модели tiny, small и compact оверлеи не поддерживают.
Перекрывающиеся сегменты подчиняются обычным правилам слияния сегментов. То есть, в одном и том же сегменте может участвовать несколько объектных файлов.
Генерация оверлеев во время компоновки полностью не зависит
от управления сегментами во время исполнения программы; компоновщик не включает автоматически каких-либо кодов для управления
оверлеями. Действительно, с точки зрения компоновщика программа
управления оверлеями является просто одним из подлежащих компоновке участков кода. Единственное предположение, которое делает
компоновщик, состоит в том, что программа управления оверлеями
воспринимает вектор прерываний (обычно INT 3FH), через который
происходит управление динамической загрузкой. Такой уровень
"прозрачности" упрощает создание пользовательских программ управления оверлеями, наилучшим образом управляющих требованиям конкретной прикладной программы.
Требования к программному и аппаратному обеспечению
Для сеанса удаленной отладки вы можете выбрать соединение
через последовательный порт или через локальную сеть. В этих случаях используются разные аппаратные средства, однако должны соблюдаться следующие общие требования:
Рабочая система с памятью, достаточной для загрузки отладчика (локальная система).
Другой компьютер РС (удаленная система), имеющий достаточный для отлаживаемых программ DOS и TDREMOTE объем памяти
(или для отлаживаемой программы Windows и WREMOTE). Это
удаленная система.
Две системы должны соединяться через последовательный порт
нуль-модемным кабелем. При соединении через локальную сеть потребуется программное обеспечение, совместимое с Novell Netware.
программное обеспечение, совместимое с Novell Netware (версии IPX
и NETBIOS 3.0 или старше).
- U -
Unable to create output file имя_файла
Фатальная ошибка этапа компиляции
(невозможно создать выходной файл)
Рабочий диск переполнен или защищен от записи, или выходной
каталог не существует. Если диск переполнен, попробуйте удалить
ненужные файлы и повторить компиляцию. Если диск защищен от записи, переместите исходные файлы на диск, доступный для записи, и
повторите компиляцию.
Unable to create torboc.$ln
Сообщение об ошибке этапа компиляции
(невозможно создать файл torboc.$ln)
Компилятор не может создать временный файл TURBOC.$LN, так
как не может получить доступ к диску, или диск переполнен.
Unable to execute command: команда
Фатальная ошибка утилиты MAKE
(нет возможности выполнить команду)
Это сообщение выдается после того, как команда должна была
выполнена. Это могло произойти из-за того, что командный файл не
был найден, или из-за того, что в нем были сделаны ошибки. Наименее вероятно, что команда существует, но каким-либо образом испорчена.
Unable to execute command команда
Сообщение об ошибке этапа компиляции
(нет возможности выполнить команду команда)
Невозможно найти TLINK или TASM, возможно диск запорчен.
Unable to open file имя_файла
Сообщение об ошибке утилиты TLINK или ошибка утилиты TLIB
(нет возможности открыть файл имя_файла)
Это происходит, если указанный файл не существует или задан
неверно.
Unable to open имя_файла
Сообщение об ошибке утилиты TLINK или ошибка утилиты TLIB
(нет возможности открыть файл имя_файла)
Это происходит, если указанный файл не существует или задан
неверно.
unable to open имя_файла for output
Сообщение об ошибке утилиты TLIB
(невозможно открыть файл имя_файла для вывода)
Утилита TLIB не может открыть указанный файл для вывода.
Обычно это вызывается недостатком места в целевой библиотеке, на
диске, или в файле листинга. Кроме того, данная ошибка происходит, если целевой файл существует, но он помечен как доступный
только по чтению.
Unable to open include file имя_файла
Сообщение об ошибке этапа компиляции
( нет возможности открыть включаемый файл имя_файла)
Названный файл компилятором не найден. Это могло произойти
из-за того, что включаемый файл (по директива #include) включает
самого себя, или вы не установили в CONFIG.SYS переменную FILES
(попробуйте FILES=20). Проверьте, существует ли найденный файл.
Unable to open include file имя_файла
Сообщение об ошибке утилиты MAKE
(нет возможности открыть включаемый файл имя_файла)
Названный файл не найден. Это могло произойти из-за того,
что включаемый файл включает самого себя или вы не установили в
CONFIG.SYS FILES (попробуйте FILES=20). Проверьте, существует ли
найденный файл.
Unable to open input file имя_файла
Сообщение об ошибке этапа компиляции
(невозможно открыть входной файл имя_файла)
Данная ошибка происходит, если не найден исходный файл. Проверьте правильность имени и наличие файла на соответствующем диске и в нужном каталоге.
Unable to open makefile
Сообщение об ошибке утилиты MAKE
(невозможно открыть формирующий файл)
Текущий каталог не содержит файла с именем MAKEFILE или MAKEFILE.MAK, а также файл, заданный с помощью -f.
Unable to redirect input or output
Сообщение об ошибке утилиты MAKE
(невозможно перенаправить ввод или вывод)
Утилита MAKE не может открыть временные файлы, необходимые
для изменения направления ввода или вывода. Если вы работаете в
сети, убедитесь, что вы имеете полномочия в текущем каталоге.
Unable to rename имя_файла in имя_файла
Сообщение об ошибке утилиты TLIB
(невозможно переименовать файл имя_файла в имя_файла)
Утилита TLIB строит библиотеку во временном файле, а затем
переименовывает временный файл в целевой библиотечный файл. Если
данная ошибка вызывается недостатком места на диске, то это будет
отмечено.
Undefined label идентификатор
Сообщение об ошибке этапа компиляции
(неопределенная метка)
Указанная метка присутствует в операторе goto в функции, но
определения метки нет.
Undefined structure идентификатор
Предупреждение этапа компиляции
(неопределенная структура)
Указанная структура используется в исходно файле (возможно,
в указателе на структуру), но не имеет определения в исходном
файле. Обычно это вызывается опечаткой в имени структуры или пропущенным описанием.
Undefined structure структура
Сообщение об ошибке этапа компиляции
(неопределенная структура)
В вашем исходном файле непосредственно перед строкой, в которой указана ошибка, использовано имя структуры (возможно, в
указателе на структуру), но нет определения структуры. Обычно это
вызывается опечаткой в имени структуры или пропущенным описанием.
Undefined symbol идентификатор
Сообщение об ошибке этапа компиляции:
(неопределенный идентификатор)
Указанный идентификатор не имеет описания. Это может вызываться опечаткой в данном месте или в точке описания. Причиной
может быть также ошибка в идентификаторе.
Unexpected }
Сообщение об ошибке этапа компиляции
(непредвиденная скобка })
Там, где она не требуется, обнаружена лишняя фигурная скобка. Проверьте пропущенную скобку {.
Unexpected char X in command line
Сообщение об ошибке утилиты TLIB
(непредвиденный символ X в командной строке)
Утилита TLIB обнаружила при анализе командной строки синтаксическую ошибку.
Unexpected end of file
Сообщение об ошибке утилиты MAKE
(неправильное окончание файла)
Достигнут конец формирующего файла, а временный встроенный
файл не закрыт.
Unexpected end of file in comment started on номер_строки
Сообщение об ошибке этапа компиляции
(неправильное окончание файла в комментарии на строке номер_строки)
Исходный файл заканчивается в комментарии. Обычно это вызывается отсутствием завершения комментария (*/).
Unexpected end of file in conditional started on line номер_строки
Сообщение об ошибке утилиты MAKE или ошибка этапа компиляции
(Неправильное окончание файла в условном операторе на строке
номер_строки)
Исходный файл закончился перед тем, как обслуживающая программа МAKE (или компилятор) обнаружила !endif. Директива !endif
была или пропущена, или в ней имелась синтаксическая ошибка.
union cannot be a base type
Сообщение об ошибке этапа компиляции
( объединение не может быть базовым типом)
Объединение не может использоваться в качестве базового типа
для класса другого типа.
union cannot have a base type
Сообщение об ошибке этапа компиляции
(объединение не может иметь базовый тип)
Объединение не может быть производным из других классов.
Union member элемент is of type class with constructor
Сообщение об ошибке этапа компиляции
(элемент объединения имеет тип класса с конструктором). См. ниже.
Union member элемент is of type class with destructor
Сообщение об ошибке этапа компиляции
(элемент объединения имеет тип класса с деструктором). См. ниже.
Union member элемент is of type class with operator=
Сообщение об ошибке этапа компиляции
(элемент объединения имеет тип класса с operator=)
Объединение не может содержать элементы типа класса с определенными пользователем конструкторами, деструкторами или operator=.
Unions cannot have virtual member functions
Сообщение об ошибке этапа компиляции
(объединения не могут содержать виртуальные функции-элементы)
Unknown assembler instruction
Предупреждение этапа компиляции
(неизвестная инструкция Ассемблера).
Компилятор обнаружил оператор встроенного Ассемблера с недопустимым кодом. Проверьте правильность кода операции. Данное предупреждение по умолчанию выключено.
Unknown command line switch X ignored
Сообщение об ошибке утилиты TLIB
(недопустимый параметр командной строки игнорируется)
В командной строке или файла подсказки обнаружена косая черта (/), за которой не следует один из допустимых параметров.
Unknown language, must be C or C++
Сообщение об ошибке этапа компиляции
(недопустимый язык, должен быть Си или С++)
В конструкции C++:
extern "name" type func { /* ... */ };
Именем, указанным в кавычках, должно быть "C" или "C++".
Имена других языков не распознаются. Например, вы можете описать
внешнюю функцию Паскаля без переименования компилятора, например:
extern "C" int pascal func { /* ... */ };
Функция С++ (возможно переопределяемая) должна описываться
как Pascal, что допускает обычное переименование компилятора (и
переопределение):
extern int pascal func { /* ... */ };
Unknown option -> параметр
Сообщение об ошибке утилиты TLINK
(неизвестный параметр)
В командной строке или в файле подсказки обнаружен символ /
или -, либо символ параметра DOS, за которым не следует ни один
из допустимых параметров. Возможно вы указали параметр в неверном
регистре.
Unknown preprocessor directive: идентификатор
Сообщение об ошибке этапа компиляции
(неизвестная директива препроцессора)
Компилятор обнаружил в начале строки символ #, но последующее имя не является допустимым именем директивы, либо неправильно
сформирована остальная часть директивы.
Unknown preprocessor statement
Сообщение об ошибке утилиты MAKE
(неизвестный оператор препроцессора)
В начале строки обнаружен символ !, но следующим далее именем не является имя error, undef, if, elif, include, else или
endif.
Unreachable code
Предупреждение этапа компиляции
(недостижимый код)
За break, continue, goto или return не следует метка или конец цикла либо функции. Компилятор проверяет циклы while, do и
for на анализ константы (условия) и пытается распознать циклы,
которые не проходятся целиком.
Unsupported option строка
Сообщение об ошибке утилиты TLINK
(неподдерживаемый параметр)
Вы задали недопустимый параметр компоновщика.
Undeterminated string or character constant
Сообщение об ошибке этапа компиляции
(незавершенная строка или символьная константа)
Компилятор не обнаружил закрывающую кавычку после начала
строки или символьной константы.
Use of . or -> to call функции
Сообщение об ошибке этапа компиляции:
(использование для вызова функции . или ->)
Вы пытаетесь вызвать функцию-элемент, не задавая объект.
Use of . or -> to call элемент, or & to take its address
Сообщение об ошибке этапа компиляции:
(использование для вызова элемента . или -> или операции &
для получения его адреса)
Обнаружена ссылка на нестатических элемент класса без объекта. Такой элемент не может использоваться без объекта, либо его
адрес должен получаться с помощью операции &.
Use :: to take the address of a member function
Сообщение об ошибке этапа компиляции
(для получения адреса функции-элемента используйте ::)
Если f - это функция-элемент класса с, вы можете получить ее
адрес с помощью синтаксиса &c::f. Обратите внимание на использование имени типа класса, а не имени объекта, и на операцию ::,
отделяющую имя класса от имени функции. (Указатели функций-элементов не являются подлинными типами указателей, и они не ссылаются на конкретный элемент класса.)
use /e with TLINK to obtain debug information from library
Сообщение об ошибке утилиты TLIB
(используйте параметр компоновщика /e для получения отладочной информации из библиотеки)
Библиотека была построена с расширенным словарем и включением отладочной информации. TLINK не будет извлекать отладочную информацию, если он выполняет компоновку с использованием расширенного словаря, поэтому, чтобы получить при построении
выполняемого файла отладочную информацию из библиотеки, компоновщику нужно сообщить с помощью параметра /e, что нужно игнорировать расширенный словарь. Компоновщик интегрированной среды не
поддерживает расширенный словарь, следовательно в интегрированной
среде параметры менять не нужно.
Use of : and :: dependent for target цель
Сообщение об ошибке утилиты MAKE
(использование зависимости :: и : для целевого файла)
Вы пытаетесь использовать целевой файл в одиночном и множественном блоке описания (с помощью операций : и ::). Например:
filea: fileb
filea:: filec
Use qualified name to access nested type тип
Предупреждение этапа компиляции
(использование уточненного имени для доступа к вложенному
типу)
В старых версиях Си и С++ определения typedef и имена признаков. описанные внутри классов, были непосредственно доступны в
глобальной области действия. В последних спецификациях С++ этим
именам, если они должны использоваться вне области действия их
класса, должен предшествовать квалификатор class::квалификатор.
Чтобы можно было компилировать старый код, когда такое имя определяется в отдельном классе, Borland C++ допускает использование
без class:: и выводит данное предупреждение.
User break
Сообщение этапа компиляции
(прерывание пользователя)
При компиляции или компоновке в интегрированной среде вы нажали клавиши Ctrl+Break, прервав процесс. (Это не ошибка, а просто подтверждение.)
Удаление класса
Удалите исходный класс файла из проекта IDE (выбрав исходный узел, щелкнув правой кнопкой "мыши" и выбрав Delete
node). Если исходный файл используется в других классах,
удалите ссылки на класс в других исходных файлах.
Выберите в проекте AppsExpert, щелкните на нем правой
кнопкой "мыши" и выберите Special Rescan. Rescan сканирует
исходные файлы, перечисленные как зависимые файлы, и использует для построения целевого файла AppsExpert. После завершения Rescan вы возвращаетесь в обновленный исходный
файл проекта и можете построить свое приложение с помощью
ClassExpert.
Удаление точек останова
Удалить точки останова можно с помощью локального меню (SpeedMenu) окна Breakpoints или меню Breakpoints. Команда Remove меню окна Breakpoints или клавиша Del стирают точку останова, подсвеченную в области списка. Команда Delete All меню Breakpoint и
локального меню окна Breakpoints удаляют все установленные точки
останова.
Удаление записей-комментариев: параметр /O
Параметр /O указывает библиотекарю, что из библиотеки нужно
удалить все записи комментария "Comment". Записи комментария применяются обычно для хранения информации, используемой отладчиком
или другими инструментальными средствами, и не требуются для создания выполняемого файла. Использование данного параметра позволит уменьшить объем ваших библиотек (и создаваемых с их использованием программ).
Удаленная отладка
Удаленная отладка означает с соответствии со своим названием
следующее: вы запускаете отладчик на одном компьютере, а отлаживаемую программу - на другом. Две системы могут соединяться через
последовательный порт или через локальную сеть LAN, совместимую с
NETBIOS. Удаленную отладку полезно использовать в следующих ситуациях:
Вашей программе требуется много памяти, и вы не можете за пускать программу и отладчик на одном компьютере.
Ваша программа загружается с отладчиком, но для ее правильного функционирования памяти недостаточно. В этом случае в процессе отладки вы будете получать сообщения об
ошибках распределения памяти.
Нужно отладить специальные программы (резидентные программы или драйверы устройств).
Вы отлаживаете программу Windows.
В случае отладки прикладной программы Window у вас есть выбор: вы можете либо запустить на одной машине программу и отладчик для Windows (TDW), либо запустить Windows, утилиту WREMOTE и
прикладную программу на одной машине, а отладчик - на другой.
Указатели
Хотя указатель или функция могут иметь конкретный тип независимо от используемой модели, вы можете выбрать заданный по
умолчанию тип указателя, используемый для кода и данных. Существует 4 типа указателей: near (16 бит), far (32 бита), huge (32
бита) и segment (16 бит).
В указателях near (ближние указатели) для вычисления адреса
используется один сегментный регистр, например, 16-битовое значение указателя функции складывается со сдвинутым влево содержимым
регистра кода CS. С такими указателями легко работать.
Указатели far (дальние указатели) содержат не только смещение в сегменте, но и адрес сегмента (другое 16-битовое значение).
Такие указатели позволяют иметь несколько сегментов кода и программы, превышающие по размеру 64К. Здесь нужно учитывать, что в
операциях == и != используются 32-битовые значения unsigned long,
а не полный адрес памяти. В операциях сравнения <=, >=, < и > используется только смещение.
При прибавлении к указателю значения изменяется только смещение. Если смещение превышает FFFF (максимально возможное значение), то указатель возвращается к началу сегмента. При сравнении
указателей лучше использовать ближние указатели или указатели huge.
Указатели huge также занимают 32 бита. Аналогично указателям
far, они содержат и адрес сегмента и смещение. Однако, чтобы избежать проблем с указателями, такие указатели нормализуются. Нормализованный указатель - это 32-битовый указатель с максимально
возможным значением в сегментном адресе. Так как сегмент может
начинаться с каждых 16 байт, это означает, что данное смещение
будет иметь значение от 0 до 15. Для нормализации указателя он
конвертируется в 20-битовый адрес, а затем используются правые 4
бита смещения и левые 16 бит адреса сегмента. Например, 2F84:0532
преобразуется в абсолютный адрес 2FD72, который нормализуется в
2FD7:0002. Нормализация важна по следующими причинам:
Каждому сегментному адресу соответствует при этом только
одна возможная адресная пара "сегмент:смещение". Это означает, что операции == и != возвращают корректный ответ.
В операциях сравнения <=, >=, < и > используется при этом
полные 32-битовые значения. Нормализация обеспечивает корректность результатов.
Благодаря нормализации смещение в указателях huge автоматически циклически возвращаются каждые 16 байт, но настраивается также и сегмент. Например, при инкрементации 811B:000F результатом будет 811C:0000. Это обеспечивает,
что, например, при наличии массива структур типа huge >
64К индексирование массива и выбор поля struct будет работать для структур любого размера.
Однако работа с указателями huge связана с дополнительными
издержками. Из-за этого арифметические операции с указателями huge выполняются намного медленнее, чем с указателями far.
Указатели сегментов
В объявлениях типа указателя сегмента используется __seg. В
результате получаются 16-битовые указатели сегментов. Синтаксис
__seg следующий:
тип_данных _seg *идентификатор
Например,
int _seg *name
Любое обращение по ссылке через "идентификатор" предполагает
смещение 0. В арифметических операциях с указателями выполняются
следующие правила:
Нельзя использовать с указателями сегментов операции ++,
--, +- или -=.
Нельзя вычитать один указатель сегмента из другого.
При сложении сегментного указателя с ближним (near) указателем результатом будет дальний (far) указатель, который формируется из сегмента, задаваемого сегментным указателем, и смещения из ближнего указателя. Эта операция
разрешена только в том случае, если два указателя указывают на один и тот же тип, либо если один из указателей
указывает на тип void. Независимо от указываемого типа
умножение смещения не происходит.
Когда сегментный указатель используется в выражении обращения по ссылке, он также неявно преобразуется в дальний
указатель.
При выполнении операции сложения или вычитания целочисленного операнда и сегментного указателя результатом является дальний указатель, где сегмент берется из сегментного указателя, а смещение получается умножением размера
объекта, на который указывает целочисленный операнд.
Арифметическая операция выполняется таким образом, как
если бы целое складывалось с указателем far или вычиталось из него.
Сегментные указатели могут присваиваться, инициализироваться, передаваться в функции и из функций, сравниваться, и т.д. (Сегментные указатели сравниваются по правилам
для unsigned int). Другими словами, за исключением перечисленных выше ограничений, они обрабатываются так же, как и любые другие указатели.
Улучшение алгоритма
Хотя наш алгоритм работает чудесно, но он довольно ограничен в
своих возможностях, так как может декомпрессировать только непосредственно на экран. Поскольку цикл while находится в функции, то
ограничения на время декомпрессии один шаг за цикл. Например, предположим вы хотите работать декомпрессором как фильтром (в стиле UNIX),
и пропускаете текст для декомпрессии один символ за цикл времени к
анализатору:
сжатый текст -> Декомп > Анализ. > лексемы
фильтр симв.
Это сделает наш декомпрессор весьма гибким и переносимым. Как мы
можем изменить наш алгоритм, написанный на Си?
Чтобы алгоритм на Си сделать более гибким необходимо воспользоваться возможностями ООП. Сперва дополним нашу функцию decomp() локальными переменными, и поместим их в структуру. Эта структура будет
также содержать указатель на строку, которую необходимо декомпрессировать, и длину этой строки:
typedef struct {
> int srclen, c, rcnt; <
> unsigned char *p;
} decompressor;
void decomp(unsigned char *s, int srclen)
{ ----------
int | c, rcnt; |
----------
...
}
Примечание:
Теперь попробуем расщепить нашу функцию decomp() на две части:
функцию инициализации и функцию возвращающую следующий символ, с автоматическим включением его в процесс декомпрессии. Далее передадим
указателю структуру, которую мы только что определили. Эта структура проинициализирована нашей функцией инициализации и хранит информацию, которая необходима нам между каждым вызовом функции.
Сначала опишем функцию инициализации:
void decompressor_init(decompressor* dc, unsigned char* s, int len)
{
dc->p = s; /* Место сжатия строки */
dc->srclen = len; /* Инициализация переменной содержащей длину */
dc->rcnt = 0; /* Обнуление счетчика длины строки */
}
Унарные операции
& | Операция адресации |
* | Операция обращения по ссылке |
+ | Унарный плюс |
- | Унарный минус |
~ | Поразрядное дополнение (дополнение
до единицы) |
! | Логическое отрицание |
++ | Префикс: прединкрементация;
Постфикс: постинкрементация |
-- | Префикс: преддекрементация;
Постфикс: постдекрементация |
Уничтожение интерфейсных объектов
Уничтожение интерфейсного объекта предусматривает два этапа:
уничтожение интерфейсного элемента и удаление интерфейсного объекта. Если создавать и выводить интерфейсный элемент требуется
снова, вы можете уничтожить интерфейсный элемент, не удаляя интерфейсного объекта.
Уничтожение интерфейсного элемента выполняет функция-элемент
Destroy интерфейсного объекта. Для уничтожения интерфейсных элементов Destroy вызывает функцию API DestroyWindow. При уничтожении интерфейсного элемента элемент данных HWindow устанавливается в 0.
При закрытии пользователем окна происходит следующее:
Windows уведомляет окно.
Возможность закрытия окна проверяется через механизм CanClose.
Если окно можно закрыть, интерфейсный элемент уничтожается, а интерфейсный объект удаляется.
Интерфейсный объект - это обычный объект С++, и вы можете
удалить его с помощью оператора delete.
Уничтожение окон
Уничтожение родительского окна означает уничтожение всех его
дочерних окон. Уничтожать дочерние окна или интерфейсные объекты
дочерних окон явным образом не требуется. Это же касается механизма CanClose: CanClose для родительского окна может вызывать CanClose для всех дочерних окон.
Когда вы уничтожаете интерфейсный элемент объекта, он разрешает автоматическое создание всех дочерних объектов независимо от
того, было ли оно до этого разрешено. Таким образом, при создании
родительского объекта все родительские объекты восстанавливаются
в то состояние, которое они имели перед уничтожением родительского объекта. Вы можете использовать это для уничтожения интерфейсного элемента и воссоздания его в том же состоянии, какое он имел
при уничтожении. Чтобы предотвратить это, вы должны явно отключить автоматическое создание для всех дочерних объектов, которые
не хотите автоматически создавать.
Управление цветом
Ниже приводится краткое описание функций для управления цветом изображений:
getbcolor | Возвращает текущий цвет фона. |
getcolor | Возвращает текущий цвет вычерчивания. |
getdefaultpalette | Возвращает структуру определения палитры. |
getmaxcolor | Возвращает максимальное значение цвета
доступное в текущем графическом режиме. |
getpalette | Возвращает текущую палитру и ее размер. |
getpalettesize | Возвращает размер просмотровой таблицы
палитры. |
setallpalette | Изменяет все цвета палитры, как задано. |
setbkcolor | Устанавливает текущий цвет фона |
setcolor | Устанавливает текущий цвет вычерчивания. |
setpalette | Изменяет один из цветов палитры, как
указано ее аргументами. |
Прежде чем перейти к рассмотрению работы функций управления
цветом изображения, дадим базовое описание того, как эти цвета
фактически получаются на вашем графическом экране.
Управление цветом для 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), где допускается использование двух цветов.
Управление диапазоном полосы прокрутки
Одним из атрибутов полосы прокрутки является диапазон, который устанавливает все возможные позиции скользящего маркера полосы прокрутки. Каждая позиция связывается с целым значением. Родительское окно использует это значение для установки или опроса
полосы прокрутки. По умолчанию диапазон объекта составляет от 1
до 100. Минимальная позиция скользящего маркера (верхний конец
вертикальной полосы или левый конец горизонтальной) устанавливается в 1. Другой диапазон можно задать с SetRange.
Полоса прокрутки имеет два важных атрибута - размер строки
(инициализируется значением 1) и размер страницы (по умолчанию
10). Эти значения задаются в единицах диапазона. Их можно изменить с помощью элементов данных TScrollBar LineMagnitude и PageMagnitude.
TScrollBar имеет две функции-элемента для опроса полосы
прокрутки: GetRAnge (получает диапазон) и GetPosition (получает
текущую позицию указателя). Модификация полос прокрутки обычно
выполняется пользователем, но ваше приложение может изменить их
непосредственно с помощью функций-элементов SetRange (устанавливает диапазон прокрутки), SetPosition (устанавливает позицию маркера) и DeltaPos (перемещает маркер).
Управление Doc/View
Администратор документа поддерживает список используемых в
приложении экземпляров шаблона и список текущих документов. Каждое использующее документы Doc/View приложение должно иметь администратор документа, но в каждый момент времени он только один.
Администратор документа объединяет модель Doc/View - классы
документа, классы отображаемых элементов и шаблоны. Администратор
документа предусматривает заданное по умолчанию меню File и обработку каждого его пункта:
New | Создает новый документ. |
Open... | Открывает существующий документ. |
Save | Сохраняет текущий документ. |
As... | Сохраняет текущий документ под новым именем. |
Revert To Saved | Отменяет изменения в последнем сохраненном документе. |
Close | Закрывает текущий документ. |
Exit | Выходит из приложения, выводя подсказку для сохранения документов. |
После написания документа и классов отображаемых элементов,
определения всех необходимых шаблонов и создания экземпляров текущих шаблонов вам потребуется только создать свой администратор
документа. После создания администратора он создает список экземпляров шаблона и меню (если это задано в конструкторе). После
получения одного из обрабатываемых событий он выполняет заданную
для этого события команду.
Управление графической системой
Ниже приводится краткое перечисление всех функций управления
графической системой:
closegraph | Закрывает графическую систему. |
detectgraph | Проверяет аппаратное обеспечение и определяет, какие графические драйверы использовать; рекомендует предпочтительный
режим. |
graphdefaults | Сбрасывает все переменные графической
системы в значения по умолчанию. |
_graphfreemem | Отменяет выделенную графике память. Используется для определения собственной подпрограммы. |
_graphgetmem | Распределяет память графике; используется для определения собственной подпрограммы. |
getgraphmode | Возвращает текущий графический режим. |
getmoderange | Возвращает минимальный и максимальный допустимые режимы для заданного драйвера. |
initgraph | Инициализирует графическую систему и переводит аппаратное обеспечение в графический режим. |
installuserdriver | Устанавливает дополнительный драйвер устройства в таблице драйверов устройства BGI. |
installuserfont | Загружает поставляемый файл векторного
(штрихового) шрифта в таблицу символьных файлов BGI. |
registerbgldriver | Регистрирует внешний или загруженный
пользователем файл драйвера для включения во время компоновки. |
restorecrtmode | Восстанавливает первоначальный (существовавший до Initgraph) режим экрана. |
setgraphbufsize | Задает размер внутреннего графического
буфера. |
setgraphmode | Выбирает заданный графический режим, очищает экран и восстанавливает все умолчания. |
Графический пакет компилятора Borland C++ обеспечивает графические драйверы для следующих графических адаптеров (и полностью совместимых с ними):
Цветной/графический адаптер (CGA);
Многоцветная графическая матрица (MCGA);
Улучшенный графический адаптер (EGA);
Видеографическая матрица (VGA);
Графический адаптер Hercules;
Графический адаптер серии AT&T 400;
Графический адаптер 3270 PC;
Графический адаптер IBM 8514.
Для запуска графической системы вы должны прежде всего вызвать функцию initgraph. Функция initgraph загружает графический
драйвер и переводит систему в графический режим.
Вы можете указать для функции initgraph использование конкретного графического драйвера и конкретный режим, либо задать автообнаружение установленного видеоадаптера и выбор соответственного драйвера уже во время выполнения. Если вы задали в функции
initgraph автообнаружение, то она сама вызовет функцию detectgraph для выбора графического драйвера и режима. Если вы задали в
initgraph использование конкретного графического драйвера и режима, то вы сами отвечаете за физическое присутствие соответствующего аппаратного обеспечения. Если заставить initgraph пытаться использовать отсутствующее аппаратное обеспечение, то результат в
таком случае непредсказуем.
После того, как графический драйвер загружен, вы можете определить его имя при помощи функции getdrivename, а число поддерживаемых драйвером режимов - при помощи функции getmaxmode. Функция getgraphmode сообщит вам, в каком графическом режиме вы находитесь в текущий момент. Имея номер режима, вы можете определить
его имя при помощи функции getmodename. Вы также имеете возможность изменить графический режим при помощи функции setgraphmode
и вернуть исходный видеорежим (тот, который был установлен до
инициализации графики) с помощью restorecrtmode. Функция restorecrtmode вернет экран в текстовый режим, но не закроет при этом
графическую систему (загруженные шрифты и драйверы останутся в
памяти).
Функция graphdefaults сбрасывает установки состояния графической системы (размеры графического окна, цвет линий, цвет и
шаблон заполнителя и т.д.) в исходное состояние. Функции installuserdriver и installuserfont позволяют установить в графической
системе новые драйверы устройства и шрифты.
И наконец, закончив работу в графике, вы должны вызвать
функцию closegraph для того, чтобы закрыть графическую систему.
Функция closegraph выгружает драйвер из памяти и восстанавливает
первоначальный видеорежим (через обращение к restorecrtmode).
Обычно подпрограмма initgraph загружает графический драйвер,
распределяя для этого драйвера память и затем загружая туда с
диска соответствующий файл .BGI. В качестве альтернативы данной
схеме динамической загрузки вы можете скомпоновать нужный файл
графического драйвера (или несколько таких файлов) непосредственно с файлом выполняемой программы. Для этого файл .BGI сначала
преобразуется в файл .OBJ (при помощи утилиты BGIOBJ - см. документацию в файле UTIL.DOC, который поставляется на одном из дистрибутивных дисков), после чего в исходный код помещается вызов
функции registerbgidriver (до вызова initgraph), чтобы зарегистрировать графический драйвер(ы) в системе. При построении программы вы должны выполнить компоновку файлов .OBJ всех зарегистрированных драйверов.
После определения того, какой графический драйвер должен использоваться (посредством detectgraph) функция initgraph проверяет, был ли желаемый драйвер зарегистрирован. Если был, то initgraph обращается к зарегистрированному драйверу непосредственно в памяти. В противном случае функция initgraph распределяет память для драйвера и загружает нужный файл .BGI с диска.
Использование функции registerbgidriver относится к более
сложным методам программирования, не рекомендуемым для начинающих
программистов.
Во время выполнения графической системе может понадобиться
распределить память для драйверов, шрифтов и внутренних буферов.
При необходимости она вызывает функцию _graphgetmem для распределения памяти и функцию _graphfreemem для ее освобождения. По
умолчанию данные подпрограммы просто вызывают функции malloc и
free, соответственно.
Действие этих функций по умолчанию можно переопределить, определив собственные функции _graphgetmem и _graphfreemem. Благодаря этому вы можете сами управлять распределением памяти для
графики. Однако, ваши варианты функций управления распределением
памяти должны иметь те же имена: они заменят собой используемые
по умолчанию функции с теми же именами из стандартных библиотек
языка Си.
Определив собственные функции _graphgetmem и _graphfreemem,
вы можете получить предупреждение "duplicate symbols" ("повторение символических имен"). Это предупреждение можно игнорировать.
Управление памятью
Контейнеры позволяют вам контролировать управление памятью.
Например, следующий контейнер позволяет передавать объект управления памятью:
TMQueueVector<MyClass, MyMemManage> MyQueue (100);
TMQueueVector воспринимает два типа параметров: объект, который будет содержать очередь (MyClass), и имя класса управления
памятью (MyMemManage), который вы хотите использовать. M в имени
шаблона означает, что вы должны для реализации данного контейнера
задать администратор памяти. Если в именах шаблонов M не указывается, то используется стандартный распределитель памяти
TStandardAllocator, найденный в alloctr.h.
TStandardAllocator предусматривает операции new, new[],
delete и delete[], которые вызывают соответствующие глобальные
функции. Пользовательское распределение памяти должно предусматривать специфическую для класса операцию new. В качестве примера
для построения можно использовать содержимое alloctr.h.
Управление выполнением программы
В процессе отладки управление периодически передается между
вашей программой и отладчиком. Когда управление передается Turbo
Debugger, он может использовать свои средства для поиска по ис ходному коду и структурам данных программы и выявления причины
неправильного выполнения программы. Для этого можно использовать
меню и окна отладчика. Отладчик предоставляет вам много способов
управления выполнением программы. Вы можете:
выполнять программу по шагам (по одной машинной инструкции
или строке исходного кода);
выполнять как один шаг вызовы функций;
выполнять программу до заданного места;
выполнять программу до возврата из текущей функции;
трассировать программу;
выполнять программу в обратном направлении;
выполнять программу до точки останова;
выполнять программу до появления определенного сообщения
Windows;
приостанавливать программу при возникновении исключитель ной ситуации С++ или Си.
Кроме точек останова, сообщений Windows и исключительных си туаций С++ все механизмы управления выполнением находятся в меню Run.
Управляющие объекты Visual Basic
ObjectWindows позволяет вам использовать в приложениях Windows управляющие элементы, совместимые с управляющими элементами
Visual Basic 1.0 (VBX). Использовать их также легко, как стандартные управляющие элементы Windows или ObjectWindows.
Управляющие элементы VBX представляют большой диапазон функциональных возможностей, не предусмотренных в стандартных управляющих элементах Windows.