Групповые блоки
В своей простейшей форме групповой блок помечается как статический прямоугольник, визуально группирующий другие управляющие
элементы.
Конструктор TListBox имеет 7 стандартных параметров конструктора объекта управляющего элемента (родительское окно, идентификатор ресурса, размеры и положение управляющего элемента, необязательный идентификатор библиотеки), плюс текстовую строку,
помечающую группу.
Обычно групповой блок объединяет другие управляющие элементы, однако он может также логически объединять группы кнопок. Эти
логические группы выполняют автоматическую отмену выбора (BS_AUTOCHECKBOX, BS_AUTORADIOBUTTON). Чтобы добавить к групповому блоку кнопку с зависимой или независимой фиксацией, передайте указатель на объект группового блока при вызове конструктора кнопки.
При наступлении события, которое может изменить выбор в
групповом блоке Windows посылает родительскому окну группового
блока уведомляющее сообщение. Родительское окно может перехватывать сообщение для группового блока в целом, а не отвечать на выбор отдельных кнопок. Для определения задействованного управляющего элемента вы можете получить текущее состояние каждой кнопки.
Группы точек останова
Объединение точек останова в группы позволяет разрешать,
запрещать или удалять их одним действие. Кроме того, одной командой можно задать группу точек останова для всех функций (или
функций-элементов) модуля.
Команда Group в локальном меню окна Breakpoint активизирует
диалоговое окно Edit Breakpoint Groups, с помощью которого вы можете создать или модифицировать точки останова.
[*] Edit Breakpoint groups
Group
1 #BCDEMO#38 #BCDEMO#39 OK
3 #BCDEMO#40
Help
Add... Delete Enable Disable
Группа точек останова идентифицируется положительным целым
числом, которое автоматически генерируется отладчиком или назначается вами. Отладчик автоматически присваивает групповое число
каждой создаваемой точке останова. Генерируемый номер группы
представляет собой наименьший еще не использованный номер. Таким
образом, если номера 1, 2 и 5 уже используются группами, то следующей создаваемой точке останова автоматически присваивается номер группы 3. После создания точки останова вы можете модифицировать статус ее группы с помощью команды Breakpoint Groups.
Кнопка Add окна Edit Breakpoints активизирует диалоговое окно Add Group, содержащее один блок списка и набор кнопок с зависимой фиксацией. Блок списка Module/Class выводит список модуле или классов текущей программы. Посветите нужных модуль или класс
и выберите OK. Все устанавливаемые таким образом точки останова
объединяются в одну группу. Кнопка Delete удаляет подсвеченную
группу, а Enable/Disable разрешают или временно запрещают данную
группу.
Кнопки с зависимой фиксацией позволяют выбрать тип функций,
выводимых в блоке Module/Class: кнопка Modules выбирает все модули в текущей программе, а кнопка Classes - все ее классы.
- H -
Handler for тип_1 hidden by previous handler for тип_2
Предупреждение компилятора
Такое предупреждение выводится, когда обработчик для производного от B типа D задан после обработчика для B, так как обработчик для D в этом случае вызываться не будет.
спецификатор has already been included
Сообщение об ошибке этапа компиляции
(спецификатор уже был включен)
Данный спецификатор типа встречается в объявлении более одного раза. Удалите или измените один из них.
Hexadecimal value contains more than 3 digits
Предупреждение этапа компиляции
(шестнадцатиричное значение содержит более 3 цифр)
В старых версиях Си шестнадцатиричная управляющая последовательность могла иметь не более трех цифр. Новый стандарт ANSI
допускает любое число цифр, лишь бы значение помещалось в байт.
Это сообщение выдается, когда шестнадцатиричная управляющая последовательность имеет много ведущих нулей (например, "\x00045").
Старые версии Си интерпретировали бы данную строку иначе.
функция_1 hides virtual function функция_2
Предупреждение этапа компиляции
(функция_1 скрывает виртуальную функцию_2)
Виртуальная функция базового класса обычно переопределяется
объявлением в производном классе. В данном случае объявление того
же имени с другими типами аргументов делает функцию недоступной
последующим производным классам.
Характеристики Doc/View
Каждый документ и объект отображаемого элемента содержит
список характеристик, а также функции, которые вы можете использовать для опроса и изменения этих характеристик. Характеристики
содержат информацию об объекте и его свойствах. Когда администратор документа создает или уничтожает документ или объект отображаемого элемента, он посылает приложению уведомляющее событие.
Для определения нужных действий приложение может опросить характеристики объекта. Отображаемые документы также имеют доступ к
характеристикам соответствующего документа.
Характеристики объекта
Кроме атрибутов интерфейсного элемента интерфейсные объекты
имеют характеристики объекта ObjectWindows. С помощью функций
SetFlag, ClearFlag и IsFlagSet вы можете запросить и изменить эти
характеристики. При работе с данными функциями можно использовать
следующие флаги:
wfAlias | Указывает, является ли объект псевдонимом |
wfAutoCreate | Указывает, разрешено ли для объект
автоматическое создание. |
wfFromResource | Показывает, загружен ли интерфейсны
элемент из ресурса |
wfShrinkToClient | Задает сжатие окна-рамки до размер
клиентного окна |
wfMainWindow | Указывает, что окно является основным |
wfPredefinedClass | Определяет, что окно является предопределенным классом Windows. |
wfTransfer | Показывает, может ли окно использовать механизм передачи данных. |
Характеристики окна
TWindow предусматривает также пару функций, которые позволяют вам изменять ресурсы и характеристики интерфейсного элемента.
Так как TWindow обеспечивает общие для большого числа объектов
функции, никаких специальных функций для управления характеристиками и ресурсами в нем не предусмотрено. Дополнительно к функциональным возможностям TWindow предусмотрены следующие функции:
SetCaption - устанавливает заголовок окна.
GetWindowTextTitle - возвращает строку, содержащую заголовок текущего окна.
SetCursor - устанавливает в экземпляре курсор, идентифицируемый параметром TModule (курсор передается в параметре в виде ресурса).
Присвоив Attr.AccelTable идентификатор ресурса (строку или
целое число), вы можете задать для окна таблицу акселераторов.
Характеристики управляющего элемента VBX
Каждый управляющий элемент VBX имеет ряд характеристик. С их
помощью вы можете, например, изменять цвета различных частей управляющего элемента, его размер и расположение, заголовок и т.д.
В изменении этих характеристик заключается обычно основной способ
манипулирования управляющим элементом VBX. Характеристики управляющего элемента VBX должны быть полностью описаны в руководствах
по библиотекам управляющих элементов.
TVbxControl предусматривает ряд методов для получения информации о характеристиках. С помощью функции GetNumProps вы можете
получить общее число характеристик.
Получить имя характеристики в данном диапазоне вы можете с
помощью функции-элемента TVbxControl GetPropName, которая имеет
один параметр (индекс) и возвращает строку с именем характеристики. Индекс характеристики по ее имени можно получить с помощью
GetPropIndex.
Получить значение характеристики вы можете по ее имени или
индексу. Хотя индекс использовать эффективнее, применение имени
понятнее. Вы можете использовать тот или иной метод по своему усмотрению.
Для получения характеристик управляющего элемента TVbxControl предусматривает функцию GetProp, которая позволяет получать
характеристики, используя индекс или имя.
Устанавливать значение характеристики также можно по ее индексу или имени. Для этого в TVbxControl предусмотрена функция
SetProp.
_Heaplen (dos.h)
Эта переменная содержит длину ближней динамически распределяемой области памяти в малых моделях данных (tinu. small, medium) и описывается следующим образом:
extern unsigned _heaplen;
В моделях small и medium размер сегмента данных вычисляется
следующим образом:
сегмент данных [small,medium] = глобальные данные +
динамически распределяемая область + стек
где размер стека можно настроить с помощью _stklen.
Если _heaplen установлена в 0 (по умолчанию), то программа
выделяет для сегмента данных 64К, и размером динамически распределяемой области будет:
64K - (глобальные данных + стек)
В модели tiny все (включая код) находится в одном и том же
сегменте, поэтому размер сегмента данных вычисляется следующим
образом (с учетом 256 байт для PSP):
сегмент данных [tiny] = 256 + глобальные данные +
динамически распределяемая область + стек
Если в модели tiny _heaplen = 0, то фактический размер динамически распределяемой области вычисляется вычитанием из 64К PSP,
кода, глобальных данных и стека.
В моделях compact и large ближней динамически распределяемой
области нет, и стек имеет собственный сегмент, поэтому сегмент
данных вычисляется так:
сегмент данных [compact, large] = глобальные данные
В модели huge стек находится в отдельном сегменте, и каждый
модуль имеет собственный сегмент данных.
- I -
Identifier expected
Сообщение об ошибке этапа компиляции
(требуется идентификатор)
Здесь ожидался идентификатор, но не был найден. В Си это может случиться в списке параметров старого заголовка функции, после резервируемых слов struct или union при отсутствии фигурных
скобок, а также при отсутствии имени поля структуры или объединения (за исключением битовых полей нулевой длины). В С++ после
двойного двоеточия (::) и после резервируемого слова operator при
отсутствии символа операции идентификатор также требуется в списке базовых классов, производным от которых является данный.
Identifier идентификатор cannot have a type qualifier
Сообщение об ошибке этапа компиляции:
(идентификатор "идентификатор" не может иметь квалификатор
типа)
Квалификатор С++ класс::идентификатор здесь неприменим. Квалификатор не разрешен для имен typedef, объявлений функций (за
исключением определения на уровне файла) или локальных переменных
и параметров функций, либо для элементов класса, за исключением
использования как квалификатора собственного имени класса (избыточно, но допустимо).
If statement missing (
Сообщение об ошибке этапа компиляции
(в операторе if отсутствует ()
В операторе if компилятор не нашел левой (открывающей) круглой скобки после ключевого слова if.
If statement missing )
Сообщение об ошибке этапа компиляции
(В операторе if отсутствует ))
В операторе if компилятор не нашел правой (закрывающей)
круглой скобки после выражения проверки.
If statement too long
Сообщение об ошибке утилиты MAKE
(слишком длинный оператор if)
Оператор if превышает 4096 символов.
Ifdef statement too long
Сообщение об ошибке утилиты MAKE
(слишком длинный оператор ifdef)
Оператор ifdef превышает 4096 символов.
Ifndef statement too long
Сообщение об ошибке утилиты MAKE
(слишком длинный оператор ifndef)
Оператор ifndef превышает 4096 символов.
Ignored модуль, path is too long
Предупреждение утилиты TLIB
(модуль игнорируется, слишком длинный маршрут)
Маршрут к заданному файлу .obj или . lib превышает 64 символа. Максимальный маршрут в TLIB не может превышать 64 символа.
Illegal ACBP byte in SEGDEF
Сообщение об ошибке утилиты TLINK
(недопустимый байт ACBP в SEGDEF)
Обычно это вызывается ошибкой транслятора.
Illegal character in constant expression выражение
Сообщение об ошибке утилиты MAKE
(неверный символ в константном выражении)
Обслуживающая программа МAKE обнаружила некоторый символ,
недопустимый для выражения-константы. Если этим символом является
буква, то это определяет (вероятно) идентификатор, где имеется
синтаксическая ошибка.
Illegal component to GRPDEF
Сообщение об ошибке утилиты TLINK
(недопустимый компонент GRPDEF)
Обычно это вызывается ошибкой транслятора.
Illegal group definition: группа
Сообщение об ошибке утилиты TLINK
(недопустимое определения группы)
Данная ошибка вызывается неверно сформированной записью
GRPDEF в файле .OBJ. Это может вызываться "самодельными" файлами
.OBJ или ошибкой транслятора, использованного для генерации файла
.OBJ. Если это происходит в файле, скомпилированном в Borland
C++, перекомпилируйте файл. При сохранении ошибки обратитесь к
фирме Borland.
Illegal initialization
Сообщение об ошибке этапа компиляции
(недопустимая инициализация)
Инициализация может выполняться либо выражением типа константы, либо адресом глобальной extern или static переменной плюс
или минус константа.
Illegal octal digit
Сообщение об ошибке этапа компиляции
(недопустимая восьмеричная цифра)
Компилятор встретил восьмеричную константу с недопустимой в
восьмеричных числах цифрой (8 или 9).
Illegal parameter to __emit__
Сообщение об ошибке этапа компиляции
(недопустимый параметр __emit__)
Вы указали аргумент emit, который не является константой или
адресом.
Illegal pointer substraction
Сообщение об ошибке этапа компиляции
(недопустимое вычитание указателя)
Выдается при попытке вычитания указателя из не указателя.
Illegal structure operation
Сообщение об ошибке этапа компиляции
(недопустимая операция со структурой)
Структуры могут использоваться только в операциях точки (.),
получения адреса (&) или присваивания (=), либо передаваться в
функции и из функций в качестве параметров. Компилятор встретил
структуру, используемую с какой-либо другой операцией.
Illegal to take address of bit field
Сообщение об ошибке этапа компиляции
(недопустимо получать адрес битового поля)
Недопустимо получать адрес битового поля, хотя получать адрес любых других полей можно.
Illegal use of floating point
Сообщение об ошибке этапа компиляции
(недопустимое использование плавающей точки)
Операнды с плавающей точкой недопустимы в операциях сдвига,
поразрядных булевских операциях, обращения по ссылке (*) и некоторых других операциях. Компилятор в качестве операнда одной из
этих операций обнаружил число с плавающей точкой.
Illegal use of member pointer
Сообщение об ошибке этапа компиляции
(недопустимое использование указателя-элемента)
Указатели на классы могут использоваться операциями присваивания, сравнения обращения по ссылке (*), ->*, ?:, && и ||. В исходном файле обнаружен указатель-элемент с какой-либо другой операцией.
Illegal use of pointer
Сообщение об ошибке этапа компиляции
(недопустимое использование указателя)
Указатели могут использоваться операциями сложения, вычитания, присваивания, обращения по ссылке (*) и стрелки (->). В исходном файле обнаружен указатель с какой-либо другой операцией.
Ill-formed pragma
Предупреждение этапа компиляции
(неправильно оформленная директива pragma)
Директива pragma не соответствует ни одной из ожидаемых компилятором директив этого рода.
Image base address must be a multiple of 0x10000
Сообщение об ошибке утилиты TLINK
(базовый адрес модуля должен быть кратен 0x10000)
Базовый адрес должен выравниваться на границу 64К.
Images fixed at specific addresses typically will not run under Win32s
Предупреждение TLINK
(Фиксированные на конкретные адреса модули обычно в Win32
обычно не работают)
В Win32s загружает все приложение в единое адресное пространство. Предсказать, куда будет загружено ваше приложение, невозможно, поскольку перед вашей программой могут загружаться другие программы. Фиксированные образы должны загружаться по заданным адресам, иначе загрузчик не сможет запустить их.
Implicit conversion of тип_1 to тип_2 not allowed
Сообщение об ошибке этапа компиляции
(неявное преобразование типа_1 к типу_2 не допускается)
Когда функция-элемент или класс вызываются с использованием
указателя на производный класс, значение указателя должно неявно
преобразовываться, чтобы указывать на соответствующий базовый
класс. В данном случае такое неявное преобразование недопустимо.
Improper use of typedef идентификатор
Сообщение об ошибке этапа компиляции
(неправильное использование typedef)
Там, где в выражении должна использоваться переменная, указан typedef идентификатор. Проверьте описание идентификатора и
возможные опечатки.
имя_файла(номер_строки): Incompatible attribute
Сообщение об ошибке утилиты TLINK
(несовместимый атрибут)
Компоновщик TLINK обнаружил в операторе CODE или DATA несовместимый атрибут сегмента. Например, PRELOAD и LOADONCALL одновременно не могут быть атрибутами одного и того же сегмента.
Incompatible type conversion
Сообщение об ошибке этапа компиляции
(Несовместимое преобразование типа)
Требуемое приведение типа невозможно.
Incorrect command-line argument: XXX
Сообщение о фатальной ошибке утилиты MAKE
(Неверный аргумент в командной строке: ХХХ)
Данная ошибка появляется, если обслуживающая программа МAKE
выполняется с неверным аргументом в командной строке.
Incorrect command-line option: параметр
Сообщение об ошибке этапа компиляции
(Неправильный параметр командной строки: параметр)
Компилятор не распознает параметр командной строки как допустимый параметр.
Incorrect configuration file option: параметр
Сообщение об ошибке этапа компиляции
(Неправильный параметр файла конфигурации: параметр)
Компилятор не распознает параметр файла конфигурации как допустимый параметр. Проверьте наличие предшествующего дефиса (-).
Incorrect number format
Сообщение об ошибке этапа компиляции
(Неправильный формат числа)
Компилятор обнаружил в шестнадцатиричном числе десятичную
точку.
Incorrect use of default
Сообщение об ошибке этапа компиляции
(Неправильное использование слова default)
Компилятор не нашел после ключевого слова default двоеточия.
Incorrect version of RLINK32.DLL
Сообщение об ошибке утилиты TLINK
(некорректная версия RLINK32.DLL)
Проверьте версию указанной DLL.
Initializing enumeration type with тип
Предупреждение этапа компиляции
(инициализация перечислимого типа указанным типом)
Вы пытаетесь инициализировать переменную enum другим типом.
Например:
enum count { zero, one, two } x = 2;
что приведет к данному предупреждению, поскольку 2 имеет тип int,
а не enum count. При присваивании или инициализации типов enum на
практике вместо литерального целочисленного значения при программировании лучше использовать идентификатор enum.
Это на самом деле ошибка, но она сводится к предупреждению,
чтобы программа могла работать.
Inline assembly not allowed
Сообщение об ошибке этапа компиляции
(встроенное ассемблер не разрешается)
Ваш исходный файл содержит операторы ассемблера, и вы пытаетесь скомпилировать его из интегрированной среды. Нужно использовать BCC.
Inline assembly not allowed in inline and template function
Сообщение об ошибке этапа компиляции
(встроенное ассемблирование во встраиваемой функции и функ ции-шаблоне запрещено)
Компилятор не может обрабатывать операторы встроенного ассемблирования внутри встраиваемых (inline) функций С++ или шаблонов. Ассемблерные операторы можно оформить в макрокоманду, либо
вы можете убрать класс памяти inline, или можно убрать встроенные
ассемблерные коды.
Int and string types compared
Сообщение об ошибке утилиты MAKE
(сравниваются строковый и целый типы)
В выражении !if или !elseif вы пытаетесь сравнить целочисленный операнд со строковым.
Internal linker error код_ошибки
Сообщение об ошибке утилиты TLINK
(внутренняя ошибка компоновщика)
Ошибка во внутренней логике TLINK. На практике такая ошибка
возникать не должна, но приведена здесь для полноты в случае генерации общей ошибки. Если ошибка сохраняется, запишите код ошибки и свяжитесь с Borland.
Invalid combination of opcode and operands
Сообщение об ошибке этапа компиляции
(Неверная комбинация кода операции и операндов)
Ассемблерный код операции не принимает данную комбинацию операндов. Возможные причины:
Слишком много или мало операндов для данного кода опера ции, например INC AX,BX или MOV AX.
Число операндов верное, но их типы не соответствуют коду
операции, например DEC 1, MOV AX,CL или MOV 1,AX.
Invalid entry point offset
Сообщение об ошибке утилиты TLINK
Данное сообщение выводится только при компоновке модулей с
32-битовыми записями. Это означает, что смещение начальной точки
входы программы превышает предел DOS в 32К.
Invalid indirection
Сообщение об ошибке этапа компиляции
(Недопустимое обращение по ссылке)
Операция обращения по ссылке (*) требует в качестве операнда
непустого (не void) указателя.
Invalid limit specified for code segment packingv
Сообщение об ошибке утилиты TLINK
(для упаковки сегмента кода задано недопустимое ограничение)
Данная ошибка происходит, если вы использовали параметр /P
или команду интегрированной среды Options Linker ...Pack code
segments и задаете предельное значение размера, выходящее за допустимый диапазон. Чтобы значение было допустимым, оно должно лежать в пределах от 1 до 65536 байт (по умолчанию 8192).
Invalid macro argument separator
Сообщение об ошибке этапа компиляции
(Недопустимый разделитель аргументов макрокоманды)
В определении макрокоманды аргументы должны разделяться запятыми. Компилятор встретил после последнего имени аргумента другой символ разделителя.
Invalid page size value igored
Предупреждение утилиты TLIB
(недопустимое значение размера страницы игнорируется)
Задано недопустимое значение размера страницы. Размер страницы должен быть степенью числа 2 и не может быть меньше 16 или
больше 32768.
Invalid pointer addition
Сообщение об ошибке этапа компиляции
(Недопустимое сложение указателей)
В исходном файле встретилась попытка сложения двух указателей.
Invalid register combination (e.g. [BP+BX])
Сообщение об ошибке этапа компиляции
(Неверная комбинация регистров (например, [BP+BX]))
Допустимыми комбинациями индексных регистров являются [BX],
[BP], [SI], [DI], [BX+SI], [BX+DI], [BP+SI] и [BP+DI]. Другие
комбинации индексных регистров (например, [AX], [BP+BX] и
[SI+DX]) недопустимы.
Локальные переменные (переменные, объявленные в процедурах и
функциях) обычно выделяются в стеке и доступны через регистр BP.
Ассемблер автоматически прибавляет [BP] при ссылках к таким переменным, поэтому даже хотя конструкция типа Local[BX] (где Local это локальная переменная) кажется верной, это не так, поскольку
последний операнд на самом деле станет равным Local[BP+ BX].
Invalid segment definition
Сообщение об ошибке утилиты TLINK
(недопустимое определение сегмента в указанном модуле)
Компилятором создан неверный объектный файл. Если это происходит в файле, созданном Borland C++, перекомпилируйте файл. Если
ошибка остается, свяжитесь с Borland.
Invalid template argument list
Сообщение об ошибке этапа компиляции
(недопустимый список аргументов шаблона)
В описании шаблона за ключевым словом template должен следовать список формальных аргументов, заключенных в угловые скобки
(<>). Найден недопустимый список аргументов шаблона.
Invalid template qualified name шаблон::имя
Сообщение об ошибке этапа компиляции
(недопустимое уточненное имя шаблона)
При определении элемента шаблона класса фактические аргументы имени шаблона класса, которые указываются в левом операнде
операции ::, должны соответствовать формальным аргументам класса
шаблона, например:
template <class T> class X
{
VOID F();
};
template <class T> void X<T>::f() {}
Следующее недопустимо:
template <class T> void X<int>::f() {}
Invalid use of dot
Сообщение об ошибке этапа компиляции
(Недопустимое использование точки)
За операцией "точка" (.) должен непосредственно следовать
операнд.
Invalid use of template шаблон
Сообщение об ошибке этапа компиляции
(недопустимое использование шаблона)
Вне определения шаблона не допускается использование имени
шаблона класса без указания фактических параметров. Например, вы
можете использовать vector<int>, но не vector.
Irreducible expression tree
Фатальная ошибка этапа компиляции
(неупрощаемое дерево выражения)
Это сообщение указывает на некоторую ошибку компилятора. Выражение в указанной строке исходного файла вызвало условие, когда
генератор кода не может выполнить свою работу. Как бы это выражение ни было необходимым, его следует переписать. В случае, если
вы получите такое сообщение, уведомьте об этом фирму Borland.
базовый_класс is indirect virtual base class of класс
Сообщение об ошибке этапа компиляции
(базовый_класс является недопустимым виртуальным базовым
классом для класса класс)
Невозможно создать указатель на элемент С++ заданного виртуального класса. Была попытка создания такого указателя (непосредственно или через приведение). См. описание параметра -Vv в
"Руководстве пользователя".
идентификатор is assigned a value that is never user
Предупреждение этапа компиляции
Переменная встречается в присваивании, но не используется в
функции в завершившейся функции. Предупреждение указывает только,
что компилятор обнаружил закрывающую фигурную скобку.
идентификатор is declared as both external and static
Предупреждение этапа компиляции
(идентификатор объявлен сразу как external и static)
Данный идентификатор появился в объявлении, неявно или явно
обозначающем его как global или external, и кроме того, в объявлении, обозначающем его как static. Идентификатор в таком случае
считается static. Проверьте все описания данного идентификатора.
идентификатор is declared but never used
Предупреждение этапа компиляции
(идентификатор описан, но не используется)
В программе описано имя переменной, но эта переменная не используется. Сообщение указывает, что компилятор обнаружил закрывающую скобку сложного оператора или функции. Описание переменной
находится в начале этого оператора или функции.
конструктор is not a base class of класс
Сообщение об ошибке этапа компиляции
(конструктор не относится к базовому классу класс)
Конструктор класса С++ класс пытается вызвать конструктор
базового класса конструктор, либо вы пытаетесь изменить права
доступа класс::конструктор. Конструктор не относится к базовому
классу класс. Проверьте объявления.
идентификатор is not a member of struct
Сообщение об ошибке этапа компиляции
(идентификатор не является элементом структуры)
Вы пытаетесь сослаться на идентификатор, как на элемент
структуры, в то время как он не является элементом структуры.
Проверьте объявления.
идентификатор is not a non-static data member and can't be initialized here
Сообщение об ошибке этапа компиляции
В инициализаторах инициализироваться конструктором могут
только данные-элементы. Это сообщение означает, что список включает в себя статический элемент или функцию-элемент.
идентификатор is not a parameter
Сообщение об ошибке этапа компиляции
(идентификатор не является параметром)
В разделе объявления параметров определения функции по образцу старых версий идентификатор объявлен, но не перечислен в
списке параметров. Либо уберите объявление, либо добавьте идентификатор в качестве параметра.
тип is not a polimorphic class type
Сообщение об ошибке этапа компиляции
(тип не является типом полиморфического класса)
Dynamic_cast использовалось с указателем на класс, который
компилировался с запрещенным параметром -RT.
идентификатор is not a public base class of тип_класса
Сообщение об ошибке этапа компиляции
Правый операнд операции .*, ->* или ::operator не был указателем на элемент класса, который идентичен (или неоднозначен)
доступному базовому классу типа операнда в левой части.
имя_файла is not a valid library
Предупреждение утилиты TLINK
(файл не является допустимой библиотекой)
Данный файл не является библиотечным модулем.
элемент is not accessible
Сообщение об ошибке этапа компиляции
(элемент недоступен)
Вы пытаетесь сослаться на элемент класса С++, который имеет
атрибут доступа private или protected и недоступен из данной
функции. Это иногда случается при попытке вызова доступной переопределенной функции-элемента (или конструктора), когда заданные
при этом аргументы совпадают с аргументами недоступной функции.
Перед проверкой доступности всегда выполняется проверка разрешения переопределения. Если проблема именно в этом, то для выбора
желаемой доступной функции попытайтесь явно выполнить приведение
типа для одного или более параметров.
Назад | Содержание | Вперед
Идентификаторы
Характерным для Borland C++ и для других реализаций языка
является учет регистра букв в идентификаторах. Последние могут
содержать буквы от A до Z и от a до z, символ подчеркивания (_) и
цифры от 0 до 9 и должны начинаться с буквы.
Константы
Константами называются лексемы, представляющие собой фиксированные числовые или символьные значения. Borland C++ поддерживает четыре класса констант: константы с плавающей точкой, целочисленные константы, константы перечислимого типа и символьные константы (включая строковые).
Целочисленные константы представлены десятичным, восьмиричным и шестнадцатиричным форматом.
Символьные константы записываются одним или более символами,
заключенными в одинарные кавычки, например 'F', '=', '\n'.
Иерархия классов
Наследование может использоваться множество раз при порождении
объектов. Порожденные классы могут наследовать готовые функции элементы своих классов-предков, набирая при каждом порождении все больше
и больше функций элементов.
Окно
^
Наследование Панель Порождение
классов
v
Меню
Вы можете также порождать несколько классов из базового класса:
^ Меню
Насле- Порождение
дование > < классов
v
Вертикальное Горизонтальное
Вертикальное и Горизонтальное меню имеют одного предка - Меню.
Общее свойство, унаследованное от Меню - это список элементов, расположение. Порождение нескольких классов из одного корня позволяет
использовать текст программ для многих классов.
Используя наследование, можно наращивать иерархию классов, создавая как-бы древовидные формы. Еще более сложные иерархии образуются
через множественное наследование.
Иерархия классов постоянных потоков
Иерархия классов постоянных потоков представляется следующей
схемой:
pstream
^ ^ ^
TStreamable
^ ^
ipstream opstream fpbase
^ ^ ^ ^
ofpstream
ifstream
Двойная стрелка указывает, что TStreamableBase - это дружественный класс.
Имена контейнеров и комбинации ADT/FDS
Характеристики каждого класса закодированы в имени контейнера. Например, TDequeueAsDoubleList - это прямой контейнер, использующий схему управления памятью и реализующий двусвязанный
список.
T | Префикс библиотечного класса Borland. |
M | Контейнер управления памятью, предусматриваемый
пользователем. |
I | Косвенный контейнер. |
C | Счетный контейнер. |
S | Отсортированный контейнер. |
Библиотеки BIDS не содержат всех возможных комбинаций
ADT/FDS. Предусмотренные комбинации указаны в следующей таблице:
ADT Sorted Dictiona-
FDS Stack Queue Dequeue Bag Set array Array ry
Вектор * * * * * * *
Список *
Двойной * *
список
Таблица *
хеширования
Двоичное
дерево
Для построения собственных реализаций ADT/FDS вы можете использовать шаблоны классов.
Импорт класса
Чтобы импортировать класс из одного проекта AppsExpert в
другой, сделайте следующее:
Переместите или скопируйте исходный файл и файл заголовка,
который определяет класс, в исходный каталог и каталог заголовка проекта. Все исходные файлы проекта должны находиться в каталоге исходных файлов проекта (.CPP) или заголовков (.H). Эти каталоги создаются при генерации объекта
AppsExpert.
Добавьте в проекте IDE в качестве зависимого узла под
целью AppsExpert исходный файла класса (используйте команду Add node оперативного меню).
В окне проекта выберите цель AppsExpert, щелкните правой
кнопкой "мыши", затем выберите Special Rescan.
Информация о динамически распределяемой памяти USER и GDI
Информация о пользовательской динамически распределяемой области памяти USER и динамической памяти GDI показывается, какой
процесс динамической памяти USER и GDI был доступен во время исключительной ситуации.
Информация, выводимая утилитой DFA
Утилита DFA записывает файл только в том случае, если в кадре стека для файла присутствует информация отладчика Turbo Debugger. Выходной файл DFA (DFA.OUT) содержит трассировку стека, аналогичную файлу регистрации WinSpector. Кроме того, там находится следующее:
имена функции;
номера строк;
локальные и глобальные переменные;
сегменты данных и их значения (включая сегмент стека).
Во время сеанса работы в Windows записывается только один
файл WINSPCTR.BIN, поэтому построцессорная обработка файла выполняется с подсказкой. При этом вы можете удалить или переименовать
файлы DFA.OUT и WINSPCTR.LOG, что позволит отследить за один сеанс более одной исключительной ситуации.
Инициация связи
После настройки TDW для удаленной отладки загрузите программу с помощью диалогового окна Load a New Program to Debug. TDW
выводит уведомляющее сообщение. После установления связи выводится обычный экран отладчика, и команды его работают так же. Однако
вывод программы на экран и ввод с клавиатуры происходит на удаленной системе.
Инициализация основного окна
По умолчанию TApplication::InitMainWindow создает окно-рамку
с тем же именем, что и объект приложения. Это оно не особенно полезно, так как не может воспринимать и обрабатывать ввод от пользователя. Вы должны переопределить InitMainWindow и создать новый объект окна, обрабатывающий ввод от пользователя. Обычно InitMainWindow создает TFrameWindow или производный от него объект и
вызывает функцию SetMainWindow, которая воспринимает один параметр (TFrameWindows*) и возвращает указатель на старое основное окно (в случае нового приложения возвращается 0).
С помощью элемента данных nCmdShow, соответствующего параметру с таким же именем функции WinMain, вы можете изменить характер вывода на экран основного окна приложения. Эту переменную можно установить, как только начинает выполнение функция Run, или
пока вы не вызовите TApplication::InitInstance. По существу это
означает, что вы можете установить значение nCmdShow либо в InitApplication, либо в функции InitMainWindow.
Для изменения основного окна при выполнении приложения вы
можете использовать функцию SetMainWindow, которая имеет один параметр, TFrameWindow*, и возвращает указатель на старое основное окно (или 0). Этот указатель можно использовать для сохранения старого основного окна (и его последующего восстановления), либо
для удаления объекта окна.
Инициализация приложений
Для инициализации приложения ObjectWindows требуется построить объект приложения и инициализировать приложение, каждый новый
экземпляр и основное окно.
Для запуска приложения объект TApplication вызывает свои
функции-элементы InitApplication, InitInstance и InitMainWindows.
Вы можете переопределить любые из этих функций и задать собственную инициализацию. Для получения полезного приложения можно также
переопределить InitMainWindow. Для переопределения функции TApplication нужно построить собственный производный от TApplication
класс.
Конструктор класса приложения должен вызывать конструктор
TApplication. Библиотека ObjectWindows обеспечивает собственные
средства для обработки ошибок и исключительных ситуаций (в функции WinMain). Любую инициализацию можно выполнять в функции OwlMain, которая вызывается заданной по умолчанию функцией WinMain.
Для построения объекта приложения создайте в функции OwlMain экземпляр класса приложения.
Хотя вы можете вызывать собственную функцию WinMain, поместив ее в исходный файл, делать этого не нужно. Все что требуется,
можно сделать в вызываемой ей функции OwlMain или в функциях-элементах инициализации TApplication.
Если вы решили создать свою собственную функцию WinMain,
TApplication поддерживает во втором своем конструкторе передачу
обычных параметров функции WinMain.
Пользователи одновременно могут выполнять несколько копий
приложения. С точки зрения 16-разрядных приложений инициализация
первого экземпляра выполняется только когда не работает вторая
копия приложения. Инициализация экземпляра происходит каждый раз,
когда пользователь запускает приложение. Если пользователь запускает и закрывает приложение, запускает его снова и т.д., то каждый экземпляр будет первым экземпляром, так как они работают не одновременно.
В случае 32-разрядных приложений каждое приложение работает
в своем собственном адресном пространстве без разделяемых данных,
поэтому каждый экземпляр выглядит как первый экземпляр. Таким образом, при инициализации 32-разрядного приложения оно выполняет и
инициализацию первого экземпляра, и инициализацию каждого экземпляра.
Если текущий экземпляр является первым экземпляром (на что
указывает hPrevInstance = 0), то вызывается InitApplication. В
производном классе приложения вы можете переопределить InitApplication (по умолчанию InitApplication не несет никакой функциональной нагрузки).
Пользователи могут одновременно выполнять несколько копий
(экземпляров) приложения. Для выполнения любой необходимой инициализации можно переопределить TApplication::InitInstance. InitInstance вызывает InitMainWindow, а затем создает и выводит на экран основное окно. Если вы переопределяете InitInstance, убедитесь, что новая функция InitInstance вызывает TAppliation::InitInstance.
Инкапсуляция или скрытие данных
Понятие инкапсуляция означает, что функции элементы и структуры
данных, определяющие некоторые свойства данного класса, рассматриваются в качестве единого целого. Это подразумевает "защиту" данных в
пределах класса таким образом, что только элементы класса получают к
ним доступ. То есть, для того чтобы получить значение одного из элементов данных класса, нужно вызвать функцию элемент этого класса, ко-
торый возвращает необходимое значение. Для присвоения элементу значения, вызывается соответствующая функция элемент данного класса. Вообще, в объектном программировании считается хорошим тоном закрывать
все данные и функции элементы описываемого класса для доступа "извне".
Borland C++ предоставляет программистам три уровня доступа к
элементам объектов:
- public (общий),
- private (приватный),
- protected (защищенный).
Элементы, объявленные общими, будут доступны любому внешнему
элементу класса, любой функции элементу или выражению в программе,
когда объект является видимым.
Приватные элементы доступны только другим элементам своего же
класса. Они не доступны извне, за исключением специальных функций,
называемых "дружественными".
К защищенным элементам имеют доступ лишь некоторые из объектов.
Они доступны только элементам своего класса и любым его потомкам. Поэтому защищенные элементы занимают промежуточное положение между общими и приватными.
Примечание: приватные элементы недоступны потомкам своего класса. Поэтому и понадобились защищенные элементы.
Уровень доступности к элементам класса проиллюстрирован ниже:
Общие элементы
(public)
Защищенные
элементы (protect)
Приватные
элементы
(private)
Умелое использование уровней доступа повышает надежность программ и их способность к изменениям, ослабляя взаимозависимость между
объектами. Правильно описанными функциями элементами типа public можно изменять приватные элементы, не затрагивая программный код других
объектов. В реальной жизни мы подобным образом взаимодействуем с различными предметами: телевизором, будильником, радиоприемником, автомобилем - знание внутреннего устройства которых нам не обязательно.
Однако, нам важны внешние кнопки и ручки управления.
Инкрементальное сопоставление
Это средство помогает вам находить записи в алфавитных списках. При наборе каждого символа полоса подсветки перемещается к
первому элементу, начинающемуся с выбранных вами букв. Позиция
курсора указывает, какую часть имени вы уже набрали. После подсветки вы можете нажать Alt+F10 или щелкнуть правой кнопкой "мыши". При этом выводится SpeedMenu, где вы можете выбрать команду,
соответствующую подсвеченному элементу.
Инсталляция и настройка Borland С++
Пакет Borland С++ содержит инструментальные средства Windows, инструментальные средства, работающие в режиме командной
строки, и библиотеки, позволяющие разрабатывать приложения для
DOS, Windows, Win32 и Windows NT.
Borland C++ содержит приложения DOS и Windows. Для работы
Borland С++ требуется:
DOS версии 4.01 или старше.
Windows 3.1 или старше, работающая в защищенном режиме
386.
Жесткий диск с 40 мегабайтами свободного пространства
(полная инсталляция требует 80 Мб).
Дисковод на 1.44 Мб или CD-ROM (для инсталляции).
Не менее 4 Мб расширенной памяти.
Совместимая с Windows "мышь".
Наличие 8 мегабайт оперативной памяти и сопроцессора 80х87
значительно улучшит производительность работы (при отсутствии
сопроцессора он эмулируется).
Инструкции перехода
Инструкции перехода рассматриваются отдельно. Поскольку метка не может быть включена в саму команду, переходы выполняются к
меткам Си (см. выше раздел "Использование команд перехода и меток"). В следующей таблице перечислены допустимые инструкции перехода:
Инструкции перехода
ja jge jnc jns loop
jae jl jne jnz loope
jb jle jng jo loopne
jbe jmp jnge jp loopnz
jc jna jnl jpe loopz
jcxz jnae jnle jpo
je jnb jno js
jg jnbe jnp jz
Инструментальные средства для работы с ресурсами
В пакет Borland С++ входят следующие инструментальные средства для работы с ресурсами:
Компиляторы ресурсов BRCC.EXE и BRCC32.EXE. Они компилируют файлы сценариев ресурсов (.RC) и создают двоичный файл
.RES.
Компоновщики ресурсов RLINK.EXE и RLINK32.EXE используются
для компоновки ресурса в файл .RES, .EXE или создают выполняемый файл Windows (через TLINK).
Borland BRC.EXE и BRC32.EXE - это оболочки, позволяющие
запускать BRCC и RLINK за один шаг.
Большинство программ Windows легко использовать, так как они
обеспечивают стандартный интерфейс с пользователем. Например,
большинство программ Windows, позволяющие вам реализовать команды
программы и изменять курсоры, что позволяет указателю "мыши"
представлять большой набор инструментальных средств, таких как
стрелки или кисти.
Меню и курсоры представляют два примера ресурсов программ
Windows. Ресурсы - это данные, записываемые в выполняемый файл
программы (.EXE) отдельно от обычных ее данных. Ресурсы определяются и задаются вне кода программы, а затем добавляются к скомпилированному коду программы для создания выполняемого файла программы.
Ресурсы определяются как внешние для вашего программного кода данные, а затем они подключаются к выполняемому файлу в процессе компоновки. Приложение вызывает ресурсы в память только при
необходимости, что минимизирует использование памяти.
Чаще всего создавать и использовать вы будете следующие
ресурсы:
меню;
диалоговые блоки;
тограммы;
затели;
соры;
елераторы клавиатуры (оперативные клавиши);
овые массивы;
шрифты;
символьные строки.
Файлы сценариев ресурсов - это текстовые файлы, которые описывают конкретный ресурс приложения. Создать ресурсы вы можете с
помощью редактора ресурсов или компилятора ресурсов. В большинстве случаев проще всего использовать редактор ресурсов и визуально создать ресурсы. Однако иногда удобно использовать для компиляции файлов манускрипта, которые встречаются в книгах или журналах, компилятор ресурсов.
Независимо от того, какой подход вы используете, с помощью
RC или BRCC обычно создается файл ресурса (.RES) для каждой прикладной программы. Данный файл ресурсов содержит двоичную информацию для всех меню, диалогов, растровых образов и других ресурсов, используемых в прикладной программе.
Двоичный файл ресурсов, добавляемый к вашей прикладной программе (.EXE) с помощью компилятора ресурсов, описывается в данной
главе ниже. Вы должны также написать код, который загружает ресурсы в память. Каждый ресурс требуется загружать в память отдельно. Это дает вам гибкость, поскольку ваша программа будет использовать память только для тех ресурсов, которые действительно
нужны.
Инструментальные средства, работающие в режиме командной строки
Borland С++ содержит несколько инструментальных средств режима командной строки, позволяющие выполнять те же задачи, что и
IDE. Это компилятор, компоновщик, компилятор ресурсов, библиотекарь, компоновщик проектов (MAKE) и другие средства. Некоторые из
них описаны в файлах оперативного справочника. Эти средства могут
потребоваться вам, если вы работаете с редактором DOS, например,
Brief. Перечислим эти средства:
BCC.EXE BCC32.EXE | 16-разрядный и 32-разрядный компилятор. |
TLINK.EXE TLINK32.EXE | Компоновщики, формирующие из файлов .OBJ и
.LIB файлы .EXE и .DLL. |
IMPLIB.EXE TLIB.EXE | Помогают работать с библиотеками. |
HC31.EXE | Компилирует файлы для оперативного справочника Help и создает файлы .HLP, используемые большинством приложений Windows. |
BRCC.EXE
BRCC32.EXE BRC.EXE BRC32.EXE RLINK.EXE | Компиляторы ресурсов. |
MAKE.EXE MAKER.EXE | Помогают обслуживать проекты и компонуют
только те файлы, которые были изменены после последней генерации программы. |
Интерфейс отладчика
Среда Turbo Debugger включает в себя набор меню, диалоговых
окон и специальных окон отладчика.
Интерфейсные объекты
Объекты, представляющие окна, блоки диалога и управляющие
элементы называются объектами интерфейса пользователя, или просто
интерфейсными объектами. В этом разделе обсуждаются общие свойства и требования интерфейсных объектов и их связь с реальными окнами, блоками диалога и управляющими элементами, появляющимися на
экране. Здесь также объясняется взаимосвязь между различными интерфейсными объектами прикладной программы, и описывается механизм ответа на сообщения Windows.
Заметим, что интерфейсный объект фактически находится внутри
объекта приложения. Интерфейсный объект - это класс ObjectWindows, который создается и сохраняется в стеке или динамически
распределяемой области приложения, в то время как интерфейсный
элемент является частью окна.
Интерфейсные подпрограммы
Следующие подпрограммы реализуют обращения к средствам DOS,
BIOS и специфическым средствам данного компьютера.
absread | (dos.h) | _dos_freemem | (dos.h) |
abswrite | (dos.h) | freemem | (dos.h) |
bioscom | (bios.h) | _harderr | (dos.h) |
_bios_disk | (bios.h) | harderr | (dos.h) |
biosdisk | (bios.h) | _hardresume | (dos.h) |
_bios_keybrd | (bios.h) | hardresume | (dos.h) |
bioskey | (bios.h) | _hardretn | (dos.h) |
biosprint | (dos.h) | hardretn | (dos.h) |
_bios_printer | (dos.h) | keep | (dos.h) |
_bios_serialcom | (dos.h) | randbrd | (dos.h) |
_dos_keep | (dos.h) | randbwr | (dos.h) |
Интерпретация события управляющего элемента
После наступления события VBX и вызова функции обработки события функции нужно иметь дело со структурой VBXEVENT в качестве
параметра. В этой структуре задается описатель посылающего событие управляющего элемента, описатель управляющего окна, идентификатор управляющего элемента VBX, индекс события, имя события,
число параметров события и указатель на массив, содержащий указатели на значения параметров для данного события.
Чтобы понять эту структуру, нужно понимать, как работает управляющий элемент VBX. Первые 3 элемента достаточно просты и позволяют вам идентифицировать передающий событие управляющий элемент. Следующие 2 элемента также достаточно просты: каждое событие, которое может посылать управляющий элемент VBX, представляется здесь индексом события и его именем.
Следующие 2 элемента сохраняют события содержат параметры
события. Эти параметры более сложны. Информацию по ним вы можете
найти в руководстве по библиотеке управляющих элементов VBX.
Использование администратора документа
Администратор документа является экземпляром класса, производного от TDocManager или TDocManager, и выполняет ряд задач:
Поддерживает список текущих документов и зарегистрированных шаблонов.
Обрабатывает события стандартного меню File.
Обеспечивает интерфейс для выбора файла.
Для поддержки модели Doc/View администратор документа должен
подключаться к приложению. Это делается путем создания экземпляра
TDocManager и превращения его в администратор документа приложения. К общедоступным данным и функциям администратора документа
можно обращаться с помощью функции GetDocManager, которая не имеет параметров и возвращает TDocManager&. Для создания документов
и отображаемых элементов администратор документа предусматривает
следующие функции:
CreateAnyDoc представляет все видимые шаблоны, в то время
как функция-элемент TDocTemplate CreateDoc представляет
только свой собственный шаблон.
CreateAnyView отфильтровывает список шаблонов для тех
отображаемых элементов, которые поддерживают текущий документ и представляют список имен файлов, а функция-элемент
TDocTemplate CreateView непосредственно строит отображаемый документ, заданный классом шаблона документа.
Для поддержки других средств (например, OLE 2.0) можно использовать специализированный администратор документа.
Использование AppExpert
Процесс создания приложений с помощью AppExpert включает в себя следующие этапы:
Использование AppExpert для определения пользовательского интерфейса, средств приложения и генерации кода.
Использование ClassExpert для добавления классов и обработчиков событий, реализации виртуальных функций и перемещению по существующему программному коду. ClassExpert позволяет также связывать с классами или обработчиками объекты Resource Workshop. ClassExpert окажет вам существенную помощь в обработке событий, реализации виртуальных функций и создании экземпляров переменных.
Использование Resource Workshop для редактирования или добавления ресурсов.
Использование администратора проекта для построения выполняемой программы.
Для каждого приложения AppExpert создает следующие файлы:
.IDE | Файл проекта. |
.CPP | Основной исходный файл. |
.H | Основной файл заголовка. |
.RC | Файл сценария ресурса. |
.RH | Файл заголовка ресурса. |
.APX | Файл базы данных для AppExpert. |
.RC | Файл сценария ресурса |
.RTF | Исходные файлы справочника. |
.HPJ | Файл проекта справочника. |
.ICO | Файлы пиктограмм. |
.BMP | Файлы битовых массивов. |
Использование библиотечных файлов
Borland C++ предлагает для каждой из шести моделей памяти
собственную версию библиотеки стандартных подпрограмм. Компилятор
Borland C++ при этом проявляет достаточно "интеллекта", чтобы при
последующей компоновке брать нужные библиотеки и в нужной последовательности, в зависимости от выбранной вами модели памяти. Однако, при непосредственном использовании компоновщика Borland C++
TLINK (как автономного компоновщика) вы должны явно указывать используемые библиотеки.
Использование библиотек
Данный раздел описывает несколько инструментальных средств,
которые позволяют вам работать с библиотечными файлами. Вы можете
использовать эти инструментальные средства в IDE или в командной
строке.
Утилита IMPLIB создает библиотеки импорта, а IMPDEF - файлы определения модуля (.DEF). Библиотеки импорта и файлы
определения модулей задают для компоновщика информацию об
импортируемых из библиотек DLL функциях.
Утилита TLIB управляет библиотеками отдельных файлов .OBJ.
Библиотека - это удобный инструмент для работы с набором
объектных модулей.
Использование библиотек управляющих элементов
TApplication имеет функции, необходимые для загрузки библиотеки специализированных управляющих элементов Borland (BWCC.DLL
для 16-разрядных приложений и BWCC32.DLL для 32-разрядных) и библиотеки трехмерных управляющих элементов Microsoft (CTL3D.DLL).
Эти DLL широко используются для обеспечения стандартного вида многих приложений.
BWCC можно открыть с помощью функции TApplication::EnableBWCC, которая воспринимает единственный параметр. Когда вы передаете ей True, функция загружает еще не загруженную DLL. При
передаче False DLL выгружается.
После загрузки DLL вы можете использовать обычные функциональные возможности BWCC. EnableBWCC автоматически открывает корректную библиотеку (для 16- или 32-разрядных приложений).
Функция TApplication::EnableCtrl3d позволяет вам загружать и
выгружать библиотеку CTL3D фирмы Microsoft. Определить, загружена
ли эта библиотека, можно с помощью функции TApplication::Ctl2Enabled. Параметров эта функция не имеет, а возвращаемое значение True указывает на загрузку библиотеки.
Определить, загружена ли библиотека CTL3D, можно с помощью
TApplication::Ctl3dEnabled, которая в этом случае возвращает
True. Чтобы использовать функцию EnableCtl3dAutosubclass воспринимает единственный параметр. Если передаете ей True, функция разрешает выделение подклассов (в этом случае все отличные от ObjectWindows диалоги будут иметь трехмерный вид), а если False запрещает.
Использование буферов передачи
Вместо создания производного класса вы можете использовать
структуру, представляющую состояния управляющих элементов. Такая
структура называется буфером передачи, так как состояния управляющего элемента передается от управляющих элементов в буфер и в
управляющие элементы из буфера.
Механизм передачи требует для представления управляющих элементов, которым вы хотите передавать данные, использования объектов ObjectWindows. Для использования механизма передачи вам необходимо следующее:
Определите буфер передачи с переменной экземпляра для каждого управляющего элемента, с которым вы хотите обмениваться данными.
Определите соответствующее окно или диалоговый блок.
Передайте данные.
Использование ClassExpert
ClassExpert позволяет вам создавать новые классы, редактировать и обновлять реализацию классов, а также перемещаться по
классам в исходном коде приложений AppExpert. Чтобы связать классы с ресурсами, вы можете использовать ClassExpert с Resource
Workshop.
Использование диалогового блока в качестве основного окна
Чтобы использовать диалоговый блок в качестве основного окна, лучше создать окно-рамку с диалоговым блоком в качестве клиентного окна. Для этого создайте производный от Tapplication класс. Кроме конструктора, единственное, что для этого требуется,
это функция InitMeinWindow, в которой строится объект окна-рамки.
Конструктор TFrameWindow включает автоматическое создание объекта
диалогового блока, который вы передаете в качестве клиента.
Требуется также обеспечить, чтобы объект диалогового блока
имел определенные атрибуты:
Уничтожение диалогового объекта не уничтожает рамки. Ее
нужно уничтожать явным образом.
Добавлять ресурсы динамически непосредственно к диалогу
здесь нельзя, так как это не основное окно. Ресурсы нужно
добавить в окно-рамку.
Вы не можете задать заголовок диалогового окна в самом ресурсе. Его нужно задавать через окно-рамку.
Стиль диалогового окна нужно задать как WS_VISIBLE (видимое), WS_CHILD (диалоговое окно), и без кнопок максимизации/минимизации, системных меню или любых других стандартных атрибутов окна-рамки.
Использование диалоговых блоков
Приложению Windows часто требуется выводить подсказку для
ввода пользователем имен файлов, цветов или шрифтов. ObjectWindows предусматривает классы, что облегчает использование диалоговых блоков, включая общие диалоговые окна Windows. Ниже перечислены различные типы диалоговых блоков и класс ObjectWindows, который их инкапсулирует:
Цвет | TChooseColorDialog |
Шрифт | TChooseFontDialog |
Открытие файла | TFileOpenDialog |
Сохранение файла | TFileSaveDialog |
Поиск строки | TFindDialog |
Ввод от пользователя | TInputDialog |
Диалог прерывания принтера | TPrinterAbortDialog |
Управление принтером | TPrintDialog |
Замена строки | TReplaceDialog |
Использование DLL
Ниже перечислены типичные формы командной строки, позволяющие использовать DLL-версии библиотек исполняющей системы Borland
и описанные ниже библиотеки классов.
Для 16-битовой компиляции и компоновки с использованием
DLL-версии библиотеки исполняющей системы дайте команду:
bcc -c -D_RTLDLL -ml source.cpp
tlink -C -Twe c0w1 source, source, , import crtldll
Обратите внимание на использование макрокоманды _RTLDLL и
переключателя командной строки -ml. Для 32-битовой версии используются команды:
bcc -c -D_RTLDLL source.cpp
tlink32 -Tpe -ap c0x32 source, source, , import32 cw32i
Для 16-битовой компиляции и компоновки с использованием
DLL-версии библиотеки класса дайте команды:
bcc -c -D_BIDSDLL -ml source.cpp
tlink -C -Twe c0w1 source, source, , import bidsi crtldll
Для 32-битовой компиляции и компоновки с использованием
DLL-версии библиотеки класса дайте команды:
bcc32 -c -D_BIDSDLL -ml source.cpp
tlink32 -Tpe -ap c0x32 source, source,
, import32 bidsfi cw32i
Использование двоично-десятичной арифметики (BCD)
Borland C++, также как и большинство прочих компьютеров и
компиляторов, выполняет математические вычисления с числами в
двоичном представлении (то есть в системе счисления с основанием
2). Это иногда путает людей, привыкших исключительно к десятичной
математике (в системе счисления с основанием 10). Многие числа с
точным представлением в десятичной системе счисления, такие как
0.01, в двоичной системе счисления могут иметь лишь приближенные
представления.
В большинстве прикладных программ двоичные числа предпочтительны, однако в некоторых ситуациях ошибка округления в преобразованиях между системами счисления с основаниями 2 и 10 нежелательна. Наиболее характерным случаем здесь являются финансовые
или учетные задачи, где предполагается сложение центов. Рассмотрим программу, складывающую до 100 центов и вычитающую доллар:
#include <stdio.h>
int i;
float x =0.0;
for (i = 0; i < 100; ++i)
x += 0.01;
x -= 1.0;
print("100*.01 - 1 = %g\1",x);
Правильным ответом является 0.0, однако ответ, полученный
данной программой, будет малой величиной, близкой к 0.0. При вычислении ошибка округления, возникающая во время преобразования
0.01 в двоичное число, накапливается. Изменение типа x на double
или long double только уменьшает ошибку вычисления, но не устраняет ее вообще.
Для решения этой проблемы Borland C++ предлагает специфический для C++ тип bcd (двоично-десятичный), объявленный в файле
bcd.h. В случае двоично-десятичного представления число 0.01 будет иметь точное значение, а переменная x типа bcd даст точное
исчисление центов.
#include <bcd.h>
int i;
bcd x = 0.0;
for (i = 0; i < 100; ++i)
x += 0.01;
x -= 1.0;
cout << "100*0.1 - 1 = " << x << "\n";
При этом необходимо учитывать следующие особенности типа
bcd:
bcd не уничтожает ошибку округления вообще. Вычисление типа 1.0/3.0 все равно будет иметь ошибку округления.
Обычные математические функции, такие как sqrt и log, для
аргументов с типом bcd переопределяются.
Числа типа bcd имеют точность представления около 17 разрядов и диапазон принимаемых значений от 1x10^-125 до 1x10^125.
Использование файлов подсказки
При работе с большим числом операций или при многократном
повторении определенного числа операций удобно пользоваться файлами подсказки. Файл подсказки представляет собой текстовый файл
в обычном формате ASCII (который может быть создан с помощью редактора системы Borland C++), содержащий все команды утилиты TLIB
или какую-то их часть. С помощью файлов подсказки вы можете создавать команды утилиты TLIB, размер которых превышает размер командной строки DOS (128 символов).
Для использования файла подсказки "имя_маршрута", в любой
позиции командной строки утилиты TLIB нужно задать @"имя_маршрута".
Файл подсказки может состоять из нескольких строк текста;
чтобы показать, что за данной строкой следует еще одна, в
конце текущей строки необходимо набить символ "логического
И" (&).
В файл подсказки не нужно заносить всю команду TLIB; этот
файл может содержать часть командной строки утилиты TLIB, а
остальная часть может задаваться в командной строке.
В одной командной строке утилиты TLIB можно использовать
несколько файлов подсказки.
Использование формирующих файлов
Формирующий файл содержит описания и отношения, необходимые
программе MAKE для поддержания самых последних версий ваших программ. Вы можете создавать столько формирующих файлов, сколько вам
требуется и присваивать им произвольные имена; MAKEFILE представляет собой лишь имя, используемое по умолчанию, на которое ориентируется утилита MAKE, если при ее запуске имя формирующего файла
не задано.
Формирующий файл можно создать с помощью любого текстового
редактора, который поддерживает формат ASCII, например, встроенного редактора интегрированной среды, редакторов Sрrint,
MicroStar или SideKick. Все правила, описания и директивы завершаются концом строки. Если строка является слишком длинной, то вы
можете продолжить ее на следующей строке, поместив на текущей
строке в качестве последнего символа обратную косую черту (\).
Для разделения соседних идентификаторов (например, при задании последовательностей) и для задания структурного отступа команд внутри правила следует пользоваться пробельными символами
(пробелами и знаками табуляции). Формирующий файл может содержать комментарии, явные и неявные правила, макрокоманды и директивы.
Использование элементов структуры
В операторах встроенного ассемблера вы можете ссылаться на
элементы структуры (используя формат "переменная.элемент_структуры"). При этом вы работаете с переменными и можете сохранять и
получать значения элементов структур. Однако, можно также ссылаться на элемент структуры непосредственно по имени (без имени
переменно). Такая ссылка имеет форму числовой константы. При этом
константы приравниваются смещению (в байтах) от начала структуры,
содержащей данный элемент. Рассмотрим фрагмент программы:
struct myStruct {
int a_a;
int a_b;
int a_c;
} myA;
myfumc()
{
...
asm {mov ax, WORD PTR myA.a_b
mov bx, WORD PTR myA.a_c
}
...
}
Этот фрагмент описывает структурный тип с именем myStruct с
тремя элементами a_a, a_b, a_c. Первый оператор встроенного ассемблера перемещает значение, содержащееся в myA.a_b, в регистр
AX. Второй перемещает значение по адресу [di]+offset(a_c) в регистр BX (он берет адрес, записанный в DI, и добавляет его к смещению a_c от начала myStruct). Оператор ассемблера даст следующий
код:
mov ax, DGROUP : myA+2
mov bx, [di+4]
Таким образом, если вы загружаете регистр (такой как DI) адресом структуры типа meStruct, то можете использовать имена элементов структуры для непосредственной ссылки на них. Имя элемента
структуры можно использовать в любой позиции, где вы операторе
языка ассемблера допускается числовая константа.
Элементу структуры должна предшествовать точка. Она указывает, что это имя элемента структуры, а не обычный идентификатор
Си. В выводе ассебмлера имена элементов структуры заменяются соответствующими числовым смещением элемента, а информация о типе
не сохраняется. Такие элементы структуры могут использоваться в
операторах ассебмлера в качестве констант этапа компиляции.
Однако есть одно ограничение: если две используемые во
встроенном ассебмлере структуры имеют элемент с одинаковыми именем, их нужно сделать различными. Укажите между точкой и именем
элемента тип структуры в скобках (как в случае приведения типа),
например:
asm mov bx.[di].(struct tm)tm_hour
Использование ключевого слова void.
Тип void был введен в системы программирования Си в Начале 80-х
годов. Он является стандартным согласно ANSI Си.
В предыдущем разделе мы рассмотрели два случая использования
ключевого слова void: первый - для обозначения пустого списка аргументов, второй - для указания типа функции, не возвращающей какое-либо значение. Рассмотрим еще два способа применения ключевого слова
void: в качестве преобразователя типов и как часть определения указателя.
В первом случае компилятор получает информацию о необходимости и
проигнорировать какое-либо выражение:
//Простейший случай использования ключевого слова void
Более интересным является второй случай, когда void* используется как родовой указатель, т.е. может указывать на объекты любого типа. Однако его значение не может быть присвоено какому-либо другому
указателю, так как компилятор не знает размер объекта на который ссылается void*. Рассмотрим несколько примеров:
void *gp; //родовой указатель
int *ip; // указатель на int
char *cp; // указатель на char
gp=ip; // корректное преобразование
ip=gp; // -"-
cp=ip // некорректное преобразование
*ip=15; // корректное присваивание
*ip=*gp; // некорректное присваивание
Одним из основных способов применения этого типа являются применения этого типа являются формальные параметры. Функция из стандартной библиотеки memcpy, например, определена в string.h как:
void*memcpy(voidf*s1, const void*s2, unsigned int n);
Она копирует n символов из объекта, на который ссылается s2 в
объект, на который указывает s1. Таким образом она работает с объектами любого типа.
Если вы планируете использовать вашу
Если вы планируете использовать вашу программу исключительно
на машинах с установленным математическим сопроцессором 80х87, то
можно сэкономить около 10К памяти программы, опустив из нее логику автоматического определения присутствия процессора 80х87 и
эмулятора. Для этого следует просто выбрать параметр генерации
кода операций с плавающей точкой при наличии сопроцессора 80х87
(или параметр компилятора режима командной строки -f87). Borland
C++ в этом случае скомпонует вашу программу с библиотекой
FP87.LIB (вместо EMU.LIB).
Использование компиляторов, работающих в режиме командной строки
Компиляторы BCC.EXE (компилирует 16-разрядные приложения) и
BCC32.EXE (компилирует 32-разрядные приложения) работают одинако-
во, но используют по умолчанию разные параметры. BCC можно ис-
пользовать для передачи файлов TLINK или TASM. Общий синтаксис
команды имеет вид:
BCC [параметр [параметр...]] имя_файла [имя_файла]
Чтобы увидеть список параметров, наберите просто BCC и нажмите Enter. Параметры в командной строке разделяются пробелами, и
перед ними указывается символ - или /. Параметры командной строки
переопределяют параметры, заданные в файле конфигурации.
По умолчанию BCC компилирует файлы без расширений и файла с
расширениями .CPP. Файлы с расширениями .C или с расширениями,
отличными от .CPP, .ASM, .OBJ или .LIB компилируются как файлы
Си.
Некоторые параметры BCC и BCC32 задаются по умолчанию. Чтобы
отключить эти параметры, наберите BCC -параметр-. По умолчанию
BCC пытается выполнить компоновку с файлом определения модуля,
имя которого совпадает с именем исходного файла. Можно использовать несколько файлов определения.
Использование конкретных управляющих элементов
Каждый тип управляющего элемента в чем-то отличен от других.
Ниже рассказывается, как использовать объекты стандартных управляющих элементов ObjectWindows.
Использование контейнеров
Использование контейнеров с шаблонами позволяет вам построить приложение на основе стека (например, используя в качестве
соответствующих структур вектора), что позволяет легко изменить
реализацию связанного списка. Часто для этого требуется только
изменить typedef. Например:
// создать стек целых чисел, загрузить его и вывести содер-
// жимое
#include <classlib\stacks.h>
#include <iostream.h>
// описание контейнерных типов
typedef TStackAsVector<int> IntStack;
int main()
{
IntStack intStack;
for ( int i = 0; i < 10; i++ )
intStack.Push( i );
for ( i = 0; i < 10; i++ )
cout << intStack.Pop() << " ";
cout << endl;
return(0);
}
Вывод будет следующим:
9 8 7 6 5 4 3 2 1 0
Таким образом реализуется стек значений int, а в качестве
соответствующей FDS используется вектор. Если стек нужно реализовать с помощью списка, вы можете заменить typedef:
typedef TStackAsList<int> IntStack;
Все остальное будет работать правильно. Однако, чтобы изменить это на косвенный контейнер, потребуется больше изменений:
// создать стек целочисленных указателей, загрузить стек и
// вывести содержимое
#include <classlib\stacks.h>
#include<iostream.h>
// изменить typedef как обычно
typedef TStackAsVector<int> IntStack;
int main()
{
IntStack intStack;
for ( int i = 0; i < 10; i++ )
intStack.Push( &i ); // воспринимает указатель
for ( i = 0; i < 10; i++ )
cout << *intStack.Pop() << " ";
cout << endl;
return(0);
}
Результат будет тот же.
Использование макрокоманд
При вызове макрокоманды в формирующем файле должен соблюдаться следующий формат:
$(имя_макрокоманды)
Круглые скобки должны использоваться во всех случаях вызова
макрокоманд, даже в том случае, если имя макрокоманда состоит из
единственной буквы (за исключением предопределенных макрокоманд).
Данная конструкция - $(имя_макрокоманды) - называется вызовом
макрокоманда.
Когда утилита MAKE обнаруживает вызов макрокоманды, она заменяет ее на текст, раскрывающий макрокоманду (текст макрорасширения). Если текст макрорасширения не определен, то MAKE заменяет
ее пустой (нулевой) строкой.
Использование объектов диалоговых блоков
Использование объектов диалоговых окон во многом аналогично
использованию оконных объектов. Простыми диалоговыми окнами кратковременного вывода вы можете управлять в одной функции-элементе
родительского окна, которая может конструировать, выполнять и
уничтожать функцию-элемент.
Использование объектов диалоговых окон требует следующих шагов:
построения объекта;
выполнения диалогового блока;
закрытия диалогового блока;
уничтожения объекта.