|
Часть 1
Изучение Code Base
Code Base представляет собой библиотеку языка Си для управления базой
данных и экраном. Совместимость с dBASE позволяет ей работать с любыми
другими dBASE-совместимыми продуктами.
Так как Code Base пользуется теми же условными обозначениями, что и
dBASE, изучить его не представляет сложности - для этого достаточно
знакомства с языком программирования Си и представления о некоторых
основных понятиях, связанных с базами данных.
Всем пользователям, изучающим Code Base необходимо прочесть данную
главу. Раздел справочной информации даст возможность быстро понять,
какие подпрограммы для вас наиболее полезны. В Главе 'Описание
функций' важнейшая информация содержится во введениях к разделам.
Перед использованием какой-либо функции, предварительно прочитайте
введение к разделу в котором она описана.
Любому, кто собирается использовать Code Base в многопользовательском
режиме, необходимо прочитать главу 'Работа в многопользовательской
среде'.
Обратите внимание на функции, работающие с базой данных, полями,
индексными файлами, окнами, меню, на функции 'чтения' (Get). Для
большинства применений это наиболее важные функции.
Функции просмотра (browse) позволят вам создавать настраиваемые окна
для просмотра и редактирования. Однако, необходимо предварительно
изучить функции чтения (Get) и некоторые из функций работы с окнами.
Интересующиеся фильтрами и отношениями (relation) могут обратиться к
разделу ' Расширенные Функции'.
Основные термины
Ниже даны основные термины, используемые в настоящем руководстве по
Code Base.
База данных
База данных представляет собой файл, в котором хранятся ваши данные. К
примеру, база данных 'почтовой рассылки' содержит имена и адреса
людей.
Запись
Информация базы данных организована по записям. Например, каждая
запись в базе данных 'почтовой рассылки' содержит информацию об одном
человеке.
Буффер записи
Для каждой базы данных, Code Base выделяет память для одной записи.
Каждая из этих областей памяти называется 'буфером записи'. Многие из
-2-
высокоуровневых функций базы данных Code Base (например, функция
'd4go') используют этот буфер памяти автоматически. Указатель на буфер
записи может быть получен при помощи функции 'f4record'. Формат буфера
записи будет описан далее (см. 'Внутренняя организация Code Base').
Номер записи
Каждой записи в базе данных присваивается порядковый номер записи,
начиная с первого. Термин 'текущий номер записи' соответствует записи,
находящейся в данный момент в буфере записи. Текущий номер записи
может быть получен при помощи функции 'd4recno'.
Поле
Записи организованы по полям. Поле базы данных описывает один вид
информации в каждой записи базы данных. Например, полями в базе данных
'почтовой рассылки' могут быть поля 'фамилия', 'адрес', 'город', и
'телефонный номер' с именами LAST_NAME, ADDRESS, CITY и PHONE_NUM,
соответственно.
Существуют следующие типы полей: символьный, целый, плавающий,
логический, дата, примечание. Тип поля важен, посколку он определяет
вид информации, содержащейся в поле. Имена и типы полей определяются
во время создания базы данных.
Индексный файл
В различных случаях бывает необходимым обследовать базу данных в
разном порядке. В одном случае, скажем, нужно произвести сортировку
базы данных 'почтовой рассылки' по полю фамилии LAST_NAME, в другом -
по полю адреса ADDRESS. Перезапись базы данных каждый раз, когда
необходим новый порядок сортировки, потребовала бы много времени.
Индексные файлы создаются для того, чтобы постоянно хранить
отсортированную информацию. Один индексный файл содержит один порядок
сортировки для базы данных. Индексные файлы имеют структуру B+ дерева,
что делает поиск отсортированной информации быстрым и эффективным.
Выражение Индексного файла
Индексные файлы содержат информацию о том, как должна сортироваться
база данных. Эта информация называется выражением. Примером выражения
является LAST_NAME, оно означает, что индексный файл содержит
сортировку по полю LAST_NAME.
Номер ссылки (указателя) (ссылочный номер)
В Code Base номера ссылок (ссылочный номер) используются практически
для всего. Каждая база данных, индексный файл, поле, область ввода,
окно или пункт меню, используемые Code Base имеют соответствующий
номер ссылки (указателя). Эти номера ссылок используются в качестве
параметров для многих функций Code Base.
-3-
Понятие о базе данных
Здесь излагаются основные понятия, которые используются в последующих
разделах данного руководства.
При помощи Code Base можно сохранять и получать доступ к сотням
мегабайт информации. Эта информация сохраняется на диске в файлах базы
данных. За один раз производятся операции только над частью всей
доступной информации.
Одновременно можно держать открытыми несколько файлов данных. Однако,
единовременно выбирается только один файл базы данных. Функции базы
данных работают с выбранной базой данных. Открытие и закрытие базы
данных занимает много времени, но выбор между открытыми базами данных
производится почти мгновенно.
Для каждой открытой базы данных имеется специальная область в памяти,
которая называется буфером записи. Формат буфера записи описывается в
Приложении G ('Внутренняя организация Code Base'). С буфером записи
работают многие высокоуровневые функции управления базой данных.
Например, функция 'd4go' считывает запись базы данных с диска в буфер
записи. Аналогично, функции 'd4write' и 'd4append' записывают или
прибавляют буфер базы к файлу базы данных.
Для обращения к буферу записи и его модификации используются функции
работы с полями. Если такая функция изменяет содержимое буфера записи,
изменения автоматически записываются на диск.
Каждая база данных может иметь набор открытых индексных файлов. Каждый
индексный файл соответствует определенной базе данных, и когда база
данных изменяется, то автоматически поддерживаются изменения во всех
соответствующих индексных файлах. Каждая база данных может иметь свой
собственный 'выбранный' индексный файл. Высокоуровневые функции
управления базой данных, такие, как 'd4seek' или 'd4skip', используют
текущий выбранный индексный файл текущей выбранной базы даннх.
Низкоуровневые функции управления индексными файлами, например,
'i4seek' или 'i4skip', как правило, непосредственно не используются.
Файлы примечаний (файлы memo) (Файлы памяти) используются для хранения
текста переменной длины. В целях эффективности, каждое поле
сохраняется в фиксированной по размеру области внутри записи базы
данных. Поле примечаний в записе базы данных имеет фиксированный
размер, равный десяти байтам, а в отдельном файле примечаний -
переменный размер. Файл примечаний имеет то же имя, что и
соответствующий файл базы данных, но другое расширение - не 'dbf', а
'dbt'. Для всех полей примечаний определенного файла базы данных
используется один и тот же файл примечаний.
Начало работы
Перед тем, как приступить к работе с Code Base в первый раз, выполните
следующие действия:
1.Сделайте рабочую копию дискет.
2.Просмотрите файл 'README'.
3.Прочтите раздел Информация о компиляторах. (Следующий подраздел).
-4-
4.Произведите установку Code Base.
5.Запустите программу 'd4learn' для проверки функций Code Base. Перед
тем, как вы начнете использовать определенную функцию Code Base,
прочитайте информацию по ней, которая дается в настоящем руководстве,
просмотрите примеры.
6.Прочитайте раздел 'Создание Вашей собственной прикладной программы
Code Base'. (Последний подраздел этого раздела)
7.Напишите программу, используя Code Base. В случае неудачи,
обратитесь к разделу 'Общие проблемы'.
Информация о компиляторах.
В настоящее время Code Base непосредственно поддерживает Turbo C,
Quick C, Microsoft C, Zortec C++, Watcom C 386 и операционные системы
SCO Unix и Xenix. Для тех, кто использует другой компилятор или
операционную систему, Code Base поставляется в комплектации с полным
исходным кодом и тестовыми программами, так что вы можете свободно
создать свою библиотеку и оттестировать ее работу. Тестовые программы
находятся на дискете в директории '\TEST', а документация к ним - в
файле '\TEST\TEST.DOC'
Две готовые библиотеки T4.LIB и М4.LIB, поставляемые с Code Base,
используются соответственно с Turbo C и Microsoft C Библиотека М4.LIB
используется также с Quick C версии 2.0 и выше. Эти библиотеки созданы
для большой модели памяти с эмуляцией операций с плавающей точкой, с
использованием управления экраном Code Base, индексных dBASE-файлов
NDX, в операционной среде DOS. Если вы используете другой компилятор,
операционную систему, или вам нужна другая конфигурация - обратитесь к
приложению Построение Библиотек.
Использование Code Base с Turbo C
Для того, чтобы использовать библиотеку Code Base 't4.lib' в
интерактивной среде Turbo C, необходим файл проекта 'project'. Образец
файла проекта 'd4learn.prj', который можно использовать для создания
программы 'd4learn.exe' - находится на дискете в директории
'\EXAMPLES'. Он содержит следующие две строки:
D4LEARN.C
T4.LIB
При работе в интерактивной среде Turbo C, с использованием готовой
библиотеки T4.LIB проверьте установку большой модели памяти. Кроме
того, определите ключ компилятора 'TURBO'. Этот ключ необходимо
определить в описании окружения (environment).
Размер стека по умолчанию для Turbo C равен 3000 байтам. При работе с
большими индексными файлами саме безопасное - увеличить его, добавив в
верхней части программы строку:
extern unsigned _stklen = 10000;
-5-
Кроме того, на дискете в директории '\TC' имеется файл 'TURBO.CFG',
который определяет опции для строкового компилятора 'TCC'. Этот файл
должен содержать следующую строку (или подобную):
-LC:\TC\LIB -IC:\TC\INCLUDE -ml -c -DTURBO -N
Эта строка устанавливает директорию библиотек, директорию включаемых
файлов, большую модель памяти, опцию только компиляции, определяет
переключатель 'TURBO'. Переключатель 'TURBO' определяет использование
в исходном коде некоторых функций, специфичных для Turbo C. Исходный
код Code Base использует переключатель 'TURBO' в директивах
предпроцессора компилятору '#ifdef' и '#ifndef'.
На дискете в директории '\TC'имеется командный файл 'C4TC.BAT' Он
может быть использован для компиляции и компоновки небольших
приложений Code Base.
Использование Code Base с Quick C
Для того, чтобы использовать библиотеку Code Base 'm4.lib' в
интерактивной среде Quick C, необходимо использовать файлы 'make'.
Чтобы создать файл 'make' для компиляции и компоновки программы
'd4learn.exe', добавьте файлы 'd4learn.c' и 'm4.lib' при помощи опций
меню Quick C.
Проверьте, чтобы была определена большая модель памяти и чтобы был
выделен дополнительный объем памяти для стека. Будет оптимальным
использовать стек размером примерно 10 кбайт. Выбор также производится
при помощи опций меню в интерактивной среде Quick C.
Компилятор командной строки Quick C 'qcl.exe' используется таким же
образом, что и компилятор Microsoft C 'cl.exe' (см. 'Использование
Code Base с Microsoft C').
Использование Code Base с Microsoft C
При компиляции с помощью строкового компилятора 'cl.exe', определите
большую модель памяти и дополнительный объем памяти для стека.
Пример:
CL /AL D3LEARN*.C /link M4.LIB /STACK:10000
Более полная информация об опциях компиляции и компоновки содержится в
руководстве пользователя по компилятору.На дискете в директории '\MSC'
имеется командный файл 'C4MSC.BAT'. Он может быть использован для
компиляции и компоновки небольших прикладных программ на Code Base.
Использование Code Base с Zortech C++ и Watcom C
Документация об использовании Code Base с каждым из этих компиляторов
содержится на дискете в директориях 'ZORTECH' и WATCOM'
соответственно.
-6-
Установка Code Base
Для того, чтобы можно было использовать Code Base, необходимо
скопировать подходящий библиотечный файл, файлы заголовка и информацию
о конфигурации.
!!!!Для построения отличной от поставляемой библиотеке Code Base,
нужно скопировать также и исходный код.
А. Скопируйте одну из трех готовых библиотек с соответствующей
дискеты. Если ни одна из библиотек Вам не подходит, обратитесь к
информации по созданию библиотек, которая дается в приложении
Построение Библиотек.
Пример для Turbo C:
COPY A:\TC\T4.LIB C:\TC\LIB
Данная команда копирования скопирует совместимую с Turbo C библиотеку
Code Base с 'библиотечной' дискеты ТС Code Base в дисководе А: на
библиотечный каталог '\TC\LIB' в дисковод С:.
Пример для Microsoft C (Quick C):
COPY A:\MSC\M4.LIB C:\MSC
В этом примере, совместимая с Microsoft C библиотека Code Base
'm4.lib' копируется с дискеты из директории MSC в директорию 'C:\MSC'.
Для того, чтобы использовать Microsoft C с операционной системой OS/2,
обратитесь к информации по построению библиотек в приложении Е.
B. Скопируйте файлы заголовка с дискеты из директории '\H'. Заметьте,
что файлы заголовка Turbo C такие же, что и файлы заголовка Microsoft
C и Quick C.
Пример:
COPY A:\H\*.* C:\TC\INCLUDE
Эта команда скопирует все файлы заголовка Code Base с дискеты
заголовков в директорию включаемых файлов Turbo C. Данные файлы
заголовков необходимы для работы с Code Base.
C. Если вы собираетесь использовать исходные файлы Code Base,
скопируйте исходные файлы из директории '\SOURCE' дискеты.
Пример:
COPY A:\SOURCE\*.C C:\MSC
Запуск программы 'd4learn'
Для того, чтобы облегчить Вам обучение Code Base, в директорию с
примерами '\EXAMPLES' дискеты включена программа 'd4learn'. Выбор
функций Code Base в ней осуществляется при помощи спускающихся меню.
После того, как эта программа получит от вас параметры функции,
выбранная функция выполняется; результаты будут показаны на экране.
-7-
Есть также несколько дополнительных примеров в директории '\EXAMPLES'
дискеты. См. файл '\EXAMPLES\EXAMPLES.DOC'.
Создание прикладных программ с использованием средств Code Base.
В исходных файлах прикладной программы Code Base часто используются
следующие директивы '#include':
#include
#include
Если вы поместили файлы заголовка Code Base в Ваш исходный каталог, а
не во включающий каталог, вместо них используйте следующие директивы
'#include':
#include "d4base.h"
#include "w4.h"
Файл 'd4base.h' определяет структуры и прототипы для функций
управления базой данных Code Base. Файл 'w4.h' определяет структуры и
прототипы для функций управления экраном Code Base.
Пример /* Этот пример находится в файле 'd4exampl.c' */
#include "d4base.h"
#include "w4.h"
#ifdef TURBO
extern unsigned _stklen = 10000 ;
#endif
main()
{
int j ; long ref ;
/* Инициализировать Code Base и очистить экран */
d4init() ;
w4clear ( -1 ) ;
/* Открыть базу данных */
if ( d4use("d4learn") < 0 ) exit(1);
w4( 0, 5, "D4LEARN.DBF Field Names: " ) ;
for ( j=1; j<=f4num_fields(); j++ )
{
ref = f4j_ref ( j ) ;
/* Показать имя поля */
w4( j, 0, f4name( ref ) ) ;
}
w4cursor( j, 0 ) ;
w4exit( 0 ) ;
}
-8-
Общие проблемы
Есть четыре главные проблемы: компиляция, построение задачи, отладка,
понимание.
Компиляция
При компиляции примеров или исходных текстов Code Base пользователи
иногда сталкиваются с ошибками компиляции. Обычно это обусловлено
отсутствием соответствующих ключей компиляции. Например, пользователи
Turbo C часто забывают ключ условной компиляции TURBO. К сожалению,
различные компиляторы часто используют различные файлы заголовков и
различные подпрограммы библиотеки. Code Base учитывает эти различия
посредством ключей условной компиляции.
Если при компиляции прикладной программы Вы встретили затруднения,
попробуйте упростить ее. Выделите строки с предполагаемыми ошибками в
тестовый файл. Удаляйте части тестовой программы, до тех пор пока она
не откомпилируется. Этот метод часто помогает конкретизировать задачу.
Построение задачи
Большинство неясных ошибок, таких как, например, 'undefined symbol
_fcvt87' или 'fixup overflow' обусловлены неправильной компиляцией.
Например, вы сменили модель памяти и не перекомпилировали объектные
файлы. Напротив, объектные модули вашей библиотеки созданы с
использованием другой модели памяти, нежели ваша прикладная программа.
Другой возможной причиной неправильной компиляции является
использовании эмуляции плавающей точки при одной компиляции и смена
плавающей арифметики при следующей компиляции. Это правило применимо
также и к объектным модулям вашей библиотеки. Ообъектные модули,
содержащиеся в вашей библиотеке должны быть откомпилированы в тех же
условиях, что и ваша прикладная программа.
Другой причиной неопределенных внешних ссылок является отсутствие
соответствующей библиотеки или объектного модуля, а также вызов
несуществующей подпрограммы.
Все внешние ссылки, которые имеют цифру '4' во второй позиции имени,
вероятно определены Code Base. Этому соглашению подчиняются все
внешние ссылки Code Base. Внешние переменные, используемые внутри Code
Base, в большинстве определены в файле 'd4init.c'. Иногда переменная
Code Base является неопределенной потому, что не было вызвано
подпрограмм, инициализирующих Code Base. Например, если ваша
прикладная программа вызывает только подпрограмму 'd4seek', переменная
'v4cur_base' становится неопределенной внешней ссылкой. Если же вы
вызовете 'd4use' до вызова 'd4seek', 'v4cur_base' становится
определенной. Это происходит потому, что 'd4seek' ссылается на
подпрограмму инициализации, содержащуюся в файле 'd4init.c' и
объектный модуль соответствующий 'd4init.c' становится частью вашей
прикладной программы. переменная 'v4cur_base' становится тогда
определенной, поскольку она объявлена в файле 'd4init.c'.
-9-
Отладка
Если ваша Code Base-программа работает не в соответствии с вашими
ожиданиями, могут быть применены несколько способов решения проблемы.
1. Компиляция с максимальным уровнем предупреждения, используя полные
прототипы. Пусть компилятор найдет вам ваши ошибки.
2. Вычленение (изоляция)
Возьмите неработающую часть вашей программы и запустите независимо
от других частей.
3. Первая проблема решается первой
Исследуйте первую встреченную ошибку. Вторая ошибка может быть
обусловлена первой.
4. Определение точки сбоя.
Если работающая подпрограмма перестает работать, ее рабочая память,
вероятно, испорчена. Определите, где выполняющаяся подпрограмма
перестает работать. Эта точка, скорее всего находится в месте
вероятной ошибки.
К сожалению некоторые ошибки могут быть очень тонкими. Например,
подпрограмма A может портить подпрограмму B, которая в свою очередь
портит подпрограмму C. Подпрограмма C может оказаться испорченной
таким образом, что это обнаруживается лишь при пятом ее вызове.
Если вы почувствовали, что обнаружили ошибку в Code Base, попробуйте
сделать то же самое, используя 'd4learn.exe'. Эта информация поможет
Sequiter Software Inc. при определении причины ошибки. Это поможет
определить род ошибки: концептуальная ошибка, ошибка данных, и т.п.
'd4learn.exe' является также прекрасным средством определения причины
ошибки самим пользователем. Например, 'd4go' сообщает об ошибке при
использовании 'd4learn.exe', запись, которую вы пытаетесь прочесть,
возможно, не существует.
Понимание Code Base
Если не понимаете какой-либо из частей Code Base, убедитесь, что вы
читаете именно тот материал, просмотрите примеры, поэкспериментируйте
с 'd4learn.exe'.
Введение в начале каждого модуля содержит информацию обо всех
подпрограммах, содержащихся в модуле. Эти введения коротки, поэтому не
опускайте их при чтении.
Список функций по категориям
Приведенный список функций Code Base сформирован по категориям. Этот
список содержит только наиболее употребляемые функции.
-10-
Управление базой.
Добавление, Запись, Вставка
d4append, d4write, w4insert
Доступ к файлам
f4char, f4double, f4int, f4long, f4ncpy, f4ptr, f4str, f4record
Замещение содержимого полей
f4r_char, d4r_doudle, f4r_int, f4r_long, f4r_str
Информация о полях
f4decimal, f4j_ref, f4num_fields, f4name, f4record_width, f4ref,
f4type, f4width
Фильтры
x4filter, x4filter_reset, x4filter_do, i4filter
Открытие, закрытие, создание файлов
d4create, d4use, d4use_excl, i4open, i4index, u4open
Функции блокировки, разблокировки
d4lock, d4locked, d4lock_all, d4lock_code, d4lock_wait, d4unlock,
i4lock, i4unlock, u4lock, u4unlock
Файлы примечаний
m4edit, m4exist, m4read, m4write
Упаковка (удаление помеченных), Удаление (удаление части),
Перериндексация
d4pack, d4zap, i4reindex
Позиционирование
d4bottom, d4go, d4seek_double, d4seek_str, d4skip, d4top, x4bottom,
x4go, x4seek, x4skip, x4top
-11-
Связи (Отношения)
x4relate, x4relate_do, x4relate_reset
Управление экраном
Цвет/Атрибуты
g4attribute, n4attribute, n4attribute_item, w4attribute, w4num_att
Ввод данных
g4, g4double, g4picture, g4read, g4upper, g4valid, b4browse, b4edit
Ввод данных через меню
g4call, n4get_calc, n4menu, n4menu_help
Вывод
u4error, w4, w4box, w4clear, w4display, w4double, w4field, w4int,
w4long, w4num, x4list
Определение меню
n4, n4action, n4activate, n4calc, n4item, n4reaction
Определение, активация и закрытие окон
w4activate, w4deactivate, w4define, w4close
Характеристики окон
w4border, w4handle, w4height, w4memory, w4popup, w4title, w4width
-12-
Описание подпрограмм
Данная глава содержит описание всех внешних функций Code Base, которые
могут быть вызваны из программы пользователя.
Для того, чтобы эффективно осуществлять управление базой данных,
необходимо ознакомиться с работой всех функций управления базой данных
и полями, а также с работой некоторых функций управления индексными
файлами. Если Вы хотите использовать отношения и фильтры, Вам также
будут необходимы расширенные функции.
Управление экраном зависит от работы функций управления окнами, меню и
функций чтения 'get'. Функции управления меню и функции чтения,
построенные на функциях управления окнами, позволяют использовать
такие средства, как спускающиеся меню и полноэкранный ввод данных.
Функции 'преобразования', 'обработки памяти', и 'оценки выражений'
являются универсальными для любого программиста прикладных программ.
Если Вы хотите получить обзорную информацию о функциях Code Base, Вы
можете прочитать введение к функциям и потом самостоятельно
поэкспериментировать с программой 'd4learn'.
-13-
Функции Модификации/Редактирования (BROWSE/EDIT)
Функции модификации используют обе чисти Code Base управление базами и
экраном для построения экранов просмотра и/или редактирования для
занесения и просмотра данных.
Когда командных интерфейс выбран при помощи этой процедуры,
пользователю предоставляется имеющийся интерфейс. Однако, любое
содержание экрана может быть модифицировано.
На Code Base дискете в директории 'BROWSE' имеется некоторая
нелицензированная документация для конечного пользователя. Эта
документация позволяет разработчику программного обеспечения быстро
создавать документацию для конечного пользователя.
Можно создавать экран редактирования одной записи, или экран
просмотра, в котором будут несколько записей одновременно, или экран
просмотра/редактирования позволяющий пользователю быстро переключатся
эти возможности.
Экран просмотра/редактирования может быть очень удобен конечному
пользователю. Например, конечный пользователь может быстро
просматривать несколько записей, используя экран просмотра. По нажатии
клавиши, вызывается окно редактирования и конечный пользователь может
детально просмотреть информацию в одной записи.
Изучите, как использовать ввод данных и функции управления окнами,
прежде чем пытаться использовать функции просмотра/редактирования.
-14-
b4browse
Использование int b4browse( int (*browse_define)(int),
int (*edit_define)(int))
Описание 'b4browse' создает и активирует окно просмотра для текущей
базы.
См. пример ниже.
Параметры
Наименование Использование
browse_define Это указатель на функцию которая обеспечивает
поддержку экрана просмотра.
См. пример ниже.
edit_define Это указатель на функцию, которая обеспечивает
поддержку экрана редактирования. Если этот
параметр ноль (NULL), то экран редактирования
не поддерживается.
См. фунцию 'b4edit'.
Возврат Возвращение '(int)-1' свидетельствует об ошибке. Иначе,
возвращает '(int)0'.
Блокировки Текущая база и все ее индексные файлы разблокируются перед
ожиданием любого ввода пользователя. Они также
разблокируются перед возвратом.
-15-
Пример #include
#include
static int browse_setup(void);
static int browse_setup(){
/* The first few lines of the browse setup routine defines
an appropriate window. */
w4define( 1,0,24,79 );
w4border( DOUBLE, F_WHITE );
w4title( 0, -1, " Customer Database Browsing ",
F_WHITE);
/* The next three routine calls must be present in every
browse routine */
w4memory();
w4activate(-1);
g4release(0);
/* Now the screen layout is defined. Note that any 'GET'
routine except 'g4read' can be called. Refer to the 'Get
Routines chapter. */
/* When calling a 'Get Initialize' routine from a browse
setup routine from a browse setup routine, make the first
parameter '(int)-1'. This is the 'row' parameter which is
set by Code Base under browse screens. */
w4( 1,2,"name" );
g4field( -1,2, f4ref("name") );
w4( 1,24, "Company" );
g4field( -1,4, f4ref("company") );
/* The window reference number of the defined window is
returned */
return( w4select(-1) );
}
main(){
d4use("customer");
i4open("name");
b4browse(browse_setup, 0);
d4close_all();
w4exit(0);
}
-16-
b4call
Использование void b4call( int (*call_routine)(int,int) )
Описание 'b4call' определяет функцию, которую 'b4edit' и 'b4browse'
будут вызывать перед выводом или записью модифицированной
записи на диск.
Вызываемая функция может выполнять, например, вывод
посчитанных данных.
Вызываемая функция имеет два целых параметра и возвращает
целое. Первый параметр - это ссылочный номер окна
просмотра/редактирования. Ее второй параметр - это строка,
в которой будет отображаться запись. В окне редактирования,
этот второй параметр всегда ноль. Вызываемая функция должна
возвращать ноль.
Пример #include
#include
+++++++++
long a_ref, b_ref;
static int setup(void){
int w_ref;
w_ref=bquick_browse();
/* Like all browse setup routines, 'b4quick_browse'
activates the browse window. Consequently, it is safe to
call 'w4' to display an extra title. */
w4( 1,40, "total" );
return( w_ref );
}
static int calc( int w_ref, int row ){
w4double( row,40,
F4DOUBLE(A_REF) + F4DOUBLE(B_REF),10,2 );
}
main(){
d4use("DATA");
a_ref=f4ref("a_value");
b_ref=f4ref("b_value");
/* Call 'b4call' anytime before calling 'b4browse' */
b4call( calc );
b4browse( setup, 0);
d4close_all();
w4exit(0);
}
-17-
b4edit
Использование int b4edit( int (*browse_define)(void),
int (*edit_define)(void) )
Описание 'b4edit' создает и активирует окно радактирования для
текущей базы. Заметим, что оба параметра, идентичны
параметрам 'b4browse', с тем отличием, что 'b4edit'
начинает работать с экрана редактирования, а 'b4browse' с
экрана просмотра.
Следующий пример находится в поддиректории 'BROWSE' и может
использоваться как заготовка.
Параметры
Наименование Использование
browse_define Указатель на функцию, которая обеспечивает
поддержку экрана просмотра. Если этот параметр
(null), то экран просмотра недоступен.
См. фунцию 'b4browse'.
edit_define Указатель на функцию, которая обеспечивает
поддержку экрана редактирования.
См. пример ниже.
Возврат Возвращение '(int)-1' свидетельствует о ошибке. Иначе,
возвращает '(int)0'.
Блокировки Текущая база и все ее индексные файлы разблокируются перед
ожиданием любого ввода пользователя. Они также
разблокируются перед возвратом.
-18-
Пример #include
#include
static int edit_setup(void);
static int edit_setup(){
/* The first lines of the edit setup routine define an
appropriate window. */
w4define( 1,0,24,79 );
w4border( SINGLE, F_WTITE );
w4title( 0,-1, "Editing Customer Database ", F_WHITE );
/* Next three routine calls must be present in every edit
routine. */
w4memory();
w4activate(-1);
g4release(0);
/* Now the screen layout is defined. Note that any 'Get'
routine except 'g4read' can be called. refer to the 'Get
Routines' chapter. */
w4( 1,2, "Name" );
g4field( 1,12, f4ref("name") );
w4( 3,2, "Company ");
g4field( 3,12, f4ref("company") );
return( w4select(-1) );
}
main(){
d4use( "customer" );
i4open( "name");
b4edit( 0, edit_setup );
d4close_all();
w4exit(0);
}
-19-
b4margin
Использование void b4margin( int tom_margin, int bottom_margin )
Описание 'b4margin' устанавливает верхнюю и нижнюю границу для
функции 'b4browse'.
Часто требуется наличие некоторого пространства сверху и
снизу окна. По умолчанию 'b4browse' не выводит записи на
верхние три строки и на последнюю. Вызов 'b4margin'
позволяет изменить значения по умолчанию.
Параметры
Наименование Использование
top_margim Это число линий сверху окна, на которые функция
'b4browse' не будет выводить записи.
bottom_margin Это число линий снизу окна, на которые функция
'b4browse' не будет выводить записи.
Пример b4margin( 2,4 );
-20-
b4quick_browse
Использование int b4quick_browse(void)
Описание 'b4quick_browse' это установочная функция просмотра,
которая работает для любой базы данных. Она не вызывается
непосредственно. Вместо этого, она передается как параметр
в функции 'b4edit' или 'b4browse'.
Пример b4browse( b4quick_browse, 0 );
b4quick_edit
Использование
int b4quick_edit(void)
Описание 'b4quick_edit' это установочная функция редактирования,
которая работает для любой базы данных. Она не вызывается
непосредственно. Вместо этого, она передается как параметр
в функции 'b4edit' или 'b4browse'.
Пример b4edit( 0, b4quick_edit );
-21-
b4verify
Использование void b4verify( int (*verify_routine)(int) )
Описание 'b4verify' задает функцию вызываемую 'b4edit' и 'b4browse'
для проверки вводимых данных.
Если эта функция проверки данных возвращает не ноль, то
запись не записывается и ввод данных продолжается.
Параметры функции проверки данных является ссылочный номер
окна, в котором производилось просмотр/редактирование.
Пример #include
#include
long a_ref, b_ref;
static int check();
static int check( int w_ref ){
if( f4double(a_ref) < 0.0 || f4double(b_ref) < 0.0){
w4display("Entry Error",
"All values must be positive",
(char *)0 );
return(-1);
}
return(0);
}
main(){
d4use("data");
a_ref=f4ref("a_value");
b_ref=f4ref("b_value");
/* Call 'b4verify' anytime before calling 'b4browse'. */
b4verify( check );
b4browse( b4quick_browse, b4quick_edit );
d4close_all();
w4exit(0);
}
-22-
Функции преобразования формата
Функции преобразования изменяют формат информации.
c4atod
Использование Double c4atod ((char *) str, (int) len_str)
Описание Функция c4atod преобразует строку ASCII определенной длины
в '(double)'. Строка не обязательно должна кончаться
нулевым символом, так как заданная длина определяет число
преобразуемых символов строки.
Возврат Преобразованный результат.
Пример double f(){
/* This Function returns '(double) 67.3' */
double d;
/* Only the First five characters are used */
d=c4atod(" 67.37 Grabage", 5);
return(d);
}
-23-
c4atoi
Использование int c4atoi((char *) str, (int) len_str)
Описание Функция c4atoi преобразует строку символов ASCII
определенной длины в целое число. Строка не обязательно
должна кончаться нулевым символом, так как заданная длина
определяет число преобразуемых символов строки.
Возврат Преобразованный результат - целое число.
Пример /*'f4int' uses 'c4atoi' because database fields data is not
null terminated. */
#include
int f4int( f_ref )
long f_ref;
{
/* Convert the field data into an 'int' */
return( c4atoi( f4ptr(f_ref), f4width(f_ref)) );
}
-24-
c4atol
Использование int c4atol((char *) str, (int) len_str)
Описание Функция c4atol преобразует строку символов определенной
длины в длинное целое число. Строка не обязательно должна
кончаться нулевым символом, так как заданная длина
определяет число преобразуемых символов строки.
Возврат Преобразованный результат - длинное целое число.
Пример 1 #include
main(){
long l, val_ref;
d4use("values");
val_ref=f4ref("value");
d4go(1L);
l=c4atol(f4ptr(val_ref), f4width(val_ref));
printf("\n Value: %ld",l);
exit(0);
}
Пример 2 /* 'long_rezult' will be '3' as it only convert the 2
characters as specified by the second parameter> */
long_rezult=c4atol(" 3547",2);
-25-
c4dtoa
Использование char * c4dtoa (double doub_value, int len,
(int) dec)
Описание Функция 'c4dtoa' преобразует '(double)' в строку символов.
Эта строка будет отформатирована в соответствии с
определенной длиной и количеством десятичных позиций. Если
имеется переполнение, строка будет заполнена звездочками
(*). Если необходимо, '(double)' число будет округлено.
Пример:
/* ' 2' is displayed& This value is rounded up. */
w4out( c4dtoa( 1.5, 3,0);
Возврат Возвращает указатель на внутренний статический буфер,
содержащий преобразованную строку.
Внимание Если 'c4dtoa' вызывается более одного раза, первый
результат преобразования будет затерт последующим. 'c4atod'
всегда возвращает указатель на один и тот же внутренний
буфер.
Некоторые функции Code Base вызывают 'c4dtoa'.
Следовательно, результат возвращенный этой функцией надо
использовать немедленно.
Прмер void w4double( row,column, double_value, len, dec)
int row, column, len,dec;
double double_value;
{
char *ptr;
ptr=c4dtoa( double_value, len, dec );
w4num( row, column, ptr, len );
}
-26-
c4dt_format
Использование char * c4dt_format((char *) str_date,
(char *) picture)
Описание Преобразование формата даты базы данных в другие форматы
даты.
Параметры
Наименование Использование
str_date Это дата базы данных, которая является строкой
ASCII длиной в 8 байт в формате "CCYYMMDD"
(век, год, месяц, день).
picture Определяет, как дата будет отформатирована.
Примеры:
YY.MM.DD
CCYY.MM.DD
MM/DD/YY
DD-MM/CCYY
MMM DD/YY
Символы 'Y', 'M' и 'D' определяют год, месяц и
день, соответственно. Если имеется больше двух
символов 'M', возвращается символьное
представление месяца.
Возврат Возвращается указатель на внутренний статический буфер,
содержащий преобразованный результат. Если функция
вызывается дважды, новый результат затирает старый.
Пример #include
void f(){
char *rezult_ptr;
rezult_ptr=c4dt_format("19880130",
"MMM DD/CCYY");
/* 'Jan 30/1988' is displayed. */
w4out( rezult_ptr );
}
-27-
c4dt_julian
Использование int c4dt_julian( char *str_date,
double *julian_date)
Описание 'c4dt_julian' функция противоположная 'c4dt_str'. Дата
преобразуется из формата базы данных в Юлиановский формат
представляющий '(double)'.
Параметры
Наименование Использованние
str_date Указатель на преобразуемую строку. Формат
строки: "CCYYMMDD" ( век, год, месяц, день).
julian_date Указатель на '(double)' число, в которое будет
занесен полученный результат.
Возврат
Величина Значение
0 Успех
-1 Неверная дата (Ошибка не показывается)
-2 Нулевая дата (Пустая информация)
Пример #include
#include
/* Compute the number of days between two datas. */
long c4dt_subtract( str1, str2 )
char *str1, *str2;
{
double d1,d2;
c4dt_julian( str1, &d1);
c4dt_julian( str2, &d2);
return( (long) (d2-d1) );
}
main(){
d4init();
w4long( 0,0, c4dt_subtract("19600204",
"19890204"), 6);
w4exit(0);
}
-28-
c4dt_str
Использование void c4dt_str( char *str_date,
double *julian_date)
Описание Code Base представляет дату как строку символов или как
'(double)' число. Функция 'c4dt_str' преобразует дату из
'(double)' представления в строковое представление.
Формат строковой даты "CCYYMMDD" ( век, год, месяц, день).
Соответственно, строковая дата занимает 8 байт памяти. Так
дата хранится в буфере базы данных.
Значением '(double)' даты является Юлианский день.
Параметры
Наименование Использование
str_date Указатель на область память (8 байт) где будет
размещена полученная строковая дата.
julian_date Указатель на 'double' число, содержащее
Юлиановскую дату.
Пример #include
#include
char start_date[9]="19891206";
char date_plus_seven[8];
main(){
double d;
d4init();
w4clear(-1);
w4(0,0, "Today Date:" );
w4out( start_date );
c4dt_julian(start_date, &d );
d+=7.0; /* Add seven day to the date */
/* Note that no null is appended by 'c4dt_str'. */
c4dt_str( date_plus_seven, &d );
w4( w4row()+1, 0,
"Todays Date plus SEven Days: ");
w4num( w4row(), w4col(), date_plus_seven, 8);
w4exit(0);
}
-29-
c4dt_unformat
Использование char * c4dt_unformat(char * date_data,
char * picture)
Описание Эта функция выполняет преобразование даты из определенного
формата в формат базы данных. Если указываемая дата не
содержит полной информации по дате, то принимается век по
умолчанию - '1900', год по умолчанию - '80', месяц по
умолчанию 'январь', день месяца по умолчанию '01'.
Форматом базы данных является "CCYYMMDD".
Параметры
Наименование Использование
date_data Эта информация о дате
picture Определяет формат данных даты.
Возврат Возвращает указатель на внутренний статический буфер,
который содержит дату, преобразованную в формат базы
данных.
Внимане Если 'c4dt_unformat' вызывается дважды, то в результате
внутренний статический буфер будет затерт последним
результатом преобразования.
См. также Функция c4dt_format.
Пример #include
#incluide
void f(){
char *ptr;
ptr=c4dt_unformat("Jan 15, 1989",
"MMM DD, CCYY");
/* Displays '19890115' */
w4num( 0,0, ptr, 8);
}
-30-
c4encode
Использование void c4encode ((char *) to, (char *) from,
(char *) t_to, (char *) t_from)
Описание Символы перемещаются из строки 'from' в строку 'to'.
Формат результата в строке 'to' определяется шаблоном
't_to. Формат исходной строки 'from' определяется шаблоном
't_from.
Предопределенных символов форматирования не существует.
Однако, если символ в шаблоне 't_from' совпадает с символом
в шаблоне 't_to', соответствующий символ в строке 'from'
перемещается в соответствующую позицию в строке 'to'.
Параметры
Наименование Использование
to Адрес преобразованной информации
from Информация, подлежащая преобразованию
t_to Шаблон для итогового формата
t_from Шаблон для исходной информации
Замечание Как показано в примере, все символы в шаблоне 't_to',
которые не соответствуют символам в шаблоне 't_from',
копируются в соответствующие позиции в строку 'to'.
Пример /* Результат, помещенный в 'to', будет "3 2 1" */
c4encode (to, "123", "C B A", "ABC");
/* The result put into 'to' whill be "C B A" */
c4encode( to, "ABC", "3 2 1", "123" );
/* The result put into 'to' will be "A&B&C" */
c4encode( to, "ABC", "1&2&3", "123" );
/* The result put into 'to' will be "19901230" */
c4encode( to, "30-12/1990", "789A4512", "123456789A");
/* The result put into 'to' will be "12/30/90" */
c4encode( to, "19901230", "EF/GH/CD", "ABCDEFGH" );
-31-
c4ltoa
Использование char * c4ltoa ((long) long_value,
(char *) result_ptr,
(int) result_len)
Описание Данная функция преобразует (long) в символьный формат так,
как определяется параметром длины. Полученная символьная
величина выравнивается по правому краю в пределах
выделенной области.
Параметры
Наименование Использование
long_value Величина, которая будет преобразована.
result_ptr Указатель на то, где будет возвращен результат.
Вызывающая программа должна выделить область в
памяти размером, по меньшей мере, в
'result_len'.
result_len Это длина получающейся строки. Если result_len
будет меньше нуля, то все предшествующие
символы заполняются нулями.
Возврат Возвращает параметр 'result_ptr', который представляет
собой указатель (char *) на результат.
Подсказка Другие типы числовых данных могут быть преобразованы
функцией c4ltoa посредством их приведения к типу (long).
Замечание Пустой конечный символ не помещается в конец результата
преобразования. Изменяется только 'result_len' символов.
Пример /* A 'long' is put into the Code Base record buffer. */
void copy_data( f_ref, l_value )
long f_ref;
long l_value;
{
c4ltoa( l_value, f4ptr(f_ref), f4width(f_ref));
}
-32-
c4trim_n
Использование void c4trim_n ((char *) str, (int) n_ch)
Описание Функция c4trim_n "отрезает" пробелы от строки 'str'. В
последний байт в строке помещается пустой символ.
Параметры
Наименование Использование
str Указатель на строку.
n_ch Количество байт памяти, определенных для строки
Пример void disp( ptr )
char *ptr;
{
char buf[80];
strncpy( buf, ptr, sizeof(buf) );
/* A null will be placed in 80th byte of 'buf' to guaranee
that it is null terminated. */
c4trim_n( ptr, sizeof(buf) );
printf( "Display Rezult: %s", ptr);
}
-33-
Функции управления базой данных
Функции управления базой данных соответствуют высокоуровневым командам
dBASE. Они используются для хранения (запоминания) и выборки
информации из файлов базы данных.
Функции управления базой данных используют неявно выбранную базу
данных. Выбранной базой данных является последняя открытая база данных
или же база данных, которая в последний раз была выбрана функцией
'd4select'. Следовательно, одновременно можно держать открытыми
несколько баз данных.
Каждая база данных имеет также текущий номер записи и выбранный
индексный файл. Когда функция использует или изменяет либо текущую
запись, либо выбранный индексный файл, это будет отмечено в
документации функций управления базой данных.
Различные функции помещения (изменения положения) записи, например,
функции 'd4bottom' или 'd4go', считывают новую текущую запись в буфер
записи. Функции 'd4write' и 'd4append' записывают или дописывают в
конец файла буфер записи. Доступ и изменение буфера записи
осуществляется при помощи функций управления полями.
Работа с несколькими файлами
Для работы с несколькими базами данных, сохраните номер указателя базы
данных, возвращаемый функцией 'd4use'. Затем используйте функцию
'd4select' для выбора между базами данных, причем соответствующий
номер указателя (ссылки) базы данных служит в качестве параметра для
этой функции. Аналогично, номер указателя, возвращенный функцией
'i4open', может быть использован функцией 'i4select'.
-34-
d4append
Использование int d4append()
Описание Буфер записи добавляется в конец базы данных.
Возврат
Величина Значение
0 Успех
-1 Ошибка
-2 Байты подсчета записей не блокировались, и
выставлен флаг вернуться немедленно.
-3 Дублированный ключ для индексного файла с не
повторяющимися ключами. Соответственно, запись
не записана.
По умолчанию, внешняя переменная
'v4unique_error' установлена в '(int)1'. Если
эту переменную установить в '(int)0', функция
'd4write' никогда не вернет '(int)-3'. Взамен,
запись будет записана, индексный файл не
изменится, и будет возвращено '(int)0'.
Блокировка Байты запись и индексный файл блокируются.
Внимание! Не забывайте закрывать базу данных, иначе dBASE может не
распознать дабавленные записи. Это происходит потому, что
Code Base вычисляет число записей из длины файла, а dBASE
следит за счетчиком записей.
Пример #include
main(){
long ref;
d4use("info");
ref=f4ref("name");
d4go( 1L ); /* Take a copy of Record 1 */
f4r_str( ref, "ALFREF" ); /* Change the name */
d4append(); /* Append the changed record */
exit(0);
}
-35-
d4append_blank
Использование int d4append_blank()
Описание Пустая запись добавляется в конец файла.
Блокировка Байты подсчета записей и индексный файл блокируются.
См. также 'd4write', 'd4append'
Внимание! Не забывайте закрывать базу данных иначе dBASE может не
распознать дабавленные записи. Это потому, что Code Base
вычисляет число записей из длины файла а dBASE следит за
счетчиком записей.
Пример #include
#include
main(){
int j;
d4use("TEST_B");
/* Append a Blank Record */
d4append_blank();
/* Edit the new Record */
for( j=1; j<=f4num_fields(); j++)
g4field( j,0, f4j_ref() );
g4read();
d4write(d4recno());
w4exit(0);
}
-36-
d4bof
Использование int d4bof()
Описание 'd4bof' возвращает истину (не ноль), если сделана попытка
выйти за начало базы данных посредством функций 'd4skip'
или 'x4skip'. Если однажды установилось в истину состояние
начало файла, то оно сохранится до следующего перемещения в
базе. Перемещения в базе вызывают такие функции как 'd4go'
или 'd4top', которые изменяют или записывают буфер записи
базы данных.
Замечание Невозможно переместиться назад к записи 0.
См. также 'd4eof', 'd4skip'
Пример #include
main(){
d4use("names");
d4top(); /* To Record 1 */
d4skip(-1L); /* Generate bof condition */
if( d4bof() ){
print("\n Always True !");
if( d4recno() == 1L )
printf("\n Alse Always True !");
}
exit(0);
}
-37-
d4bottom
Использование int d4bottom()
Описание Функция d4bottom выполняет переход ко дну (в конец) базы
данных, используя выбраный индексный файл. Если никакого
индексного файла не выбрано, переходит к последней записи
базы данных.
Возврат
Величина Значение
0 Успешное выполнение
3 Конец файла
-1 Ошибка
Блокировка Если используется индексный файл, он блокируется. Если
новая (нижняя) запись не блокирована, то текущая
разблокируется. В конечном итоге, новая запись блокирована
и прочитана.
Пример #include
long total_ref;
main(){
int rc;
d4use("base");
total_ref=f4ref("total");
i4open("base");
rc=d4botttom();
if(rc==3) printf("\n Index has no record.");
printf("The Last Total is: %s",
f4str(total_ref);
exit(0);
}
-38-
d4buf_init
Использование long d4buf_init( long start_try, long end_try,
long ch_try )
Описание 'd4buf_init' размещает 'huge' блок памяти для буферизации,
переиндексации, сортировки, упаковки и удаления базы
данных. Все эти процессы интенсивно используют память.
Большой объем памяти может ускорить эти опереции.
Code Base может запросить памяти больше чем есть. Если нет
возможность узнать заранее, сколько памяти будет доступно,
'd4buf_init' будет пробовать несколько раз разместить
память, постепенно уменьшая запрашиваемый размер до тех
пор, пока память не будет размещена либо, будет достигнут
минимальный заданный обьем памяти.
'd4buf_init' может быть вызвана более одного раза для того,
чтобы сделать доступными различные порции памяти в разное
время. Например. 'd4buf_init' может быть вызвана для
размещения большого объема памяти перед вызовом 'i4reindex'
и после этого вызвана снова для освобождения памяти.
По умолчанию, 'd4init' вызывает 'd4buf_init' для размещения
64K памяти.
Параметры
Наименование Использование
start_try Начальное количество байт для попытки
размещения.
end_try Конечное количество байт для попытки
размещения.
ch_try Число байт, на которое будет изменен запрос на
размещение памяти. Всегда неотрицательно.
Возврат
Величина Значение
-2 Нет памяти
-1 Ошибка
>=0 Число размещенных байт
См. также 'd4init', 'd4initialize', 'd4buf_total', d4buf_unit',
'd4flush'
-39-
Пример #include
main(){
long mem, t1, t2;
d4use("test");
i4open("test");
for( mem=0x1000000; mem>0; mem -=0x100000 ){
f(d4buf_init( mem, mem, 0L) <0L)
continue;
time( &t1 );
i4reindex(-1);
time( &t2 );
printf("\n Memory: %ld, Seconds: %ld",
mem, t2-t1);
}
exit(0);
}
-40-
d4buf_total
Использование int d4buf_total( long n_recs,
int max_buffres,
int may_lend )
Описание Часть общей памяти, распределенной 'd4buf_init', под-
распределяется для текущей базы.
После того, как память распределена для определенной базы
данных при помощи функции 'd4but_total', число записей в
одном буфере устанавливается функцией 'd4buf_unit'. После
вызова 'd4buf_total', необходимо вызвать 'd4buf_unit' до
начала модификации или доступа к базе. 'd4buf_unit' может
быть вызвана в любое время для изменения числа записей в
буфере.
Оптимальное число байтов в буфере и число распределенных
буферов, зависит от того, как используется база данных, от
размера базы, операционной системы, объема доступной
памяти.
Наилучшая стратегия буферизации базы основана на следующих
принципах:
1. Каждое обращение к диску занимает относительно
много времени.
2. Code Base пишет и читает один буфер за один
раз.
3. Code Base отслеживает изменения базы данных от
буфера к буферу. Соответственно, если буфер
изменен и сбрасывается на диск, весь буфер
будет записан на диск.
4. Чтение или запись большого буфера дольше чем
маленького если размер буфера более 1К. Однако,
чтение/запись 24К два раза несколько
продолжительнее чтения/записи 48К за один раз.
Как результат перечисленных факторов, можно сделать
следующие заключения:
1. Если производится последовательное
чтение/запись, используйте один большой буфер.
2. Если производится беспорядочная чтение/запись,
буфер должен быть небольшим.
Это особенно верно, когда встречается запись и
сброс.
3. Если размер буфера заведомо больше базы данных
и база данных не велика, имеет смысл иметь один
большой буфер.
Параметры
-41-
Наименование Использование
n_recs Общее число записей в буфере.
Значение '0L' запрещает буферизацию базы. В
этом случае, 'd4buf_unit' не должен быть
вызван.
Значение 'n_recs' равное '-1L' оставляет
прежнее значение 'n_recs'. Это предполагает,
что, 'd4buf_total' уже была вызвана для этой
базы данных.
max_buffers Максимальное число буфферов для базы данных.
Здесь превышение на 12 байтов, умноженное на
'max_buffers'.
Число используемых буферов использует
посредством деления общего числа буферизованных
записей ('n_recs') на число записей в буфере.
Если полученный результат превышает
'max_buffers', то берется 'max_buffers'.
Заметим, что число записей в буфере
устанавливается функцией 'n4buf_unit'.
Значение 'max_buffers' равное '(int)-1'
оставляет значение максимального числа буферов
без изменения.
may_lend Если 'may_lend' истина (не ноль), память для
буферизации, под-распределенная для базы, будет
"заниматься" для функций интенсивной работы с
памятью. Это функции 'd4pack', 'd4zap',
'i4index', 'i4reindex' и 'x4sort'. Это
позволяет этим функциям выполняться быстрее и
помогает избежать превышения памяти.
Значение 'истина' параметра 'may_lend' также
обозначает, что когда вызываются функции
интенсивной работы с памятью, изменения базы
данных сбрасываются на диск. В этом случае
память временно используют с функциями
интенсивной работы с памятью. Это может иметь
эфект на производительность 'фильтров' и
'связей', выполняемых в процессе работы функций
интенсивной работы с памятью.
Значение 'may_lend' '(int)-1' оставляет
'may_lend' без изменения.
Возврат
Величина Значение
0 Успех
-1 Ошибка
-42-
1 Память не может быть распределена для всех
буферов.
Внимание! В процессе многопользовательской работы, когда записи
блокируются и затем разблокируются, буферизация не
увеличивает производительности. Это происходит в следствие
того, что, как только запись разблокирована, она может
сразу же быть изменена другим пользователем. Следовательно,
информация сбросится на диск.
Пример #include
#include
main(){
d4init(); /* Calls' 'd4init_buf' */
d4use_excl("base");
i4open("base");
/* 500 records, 25 buffer maximum */
d4buf_total(500L, 25, 1);
/* 20 record in each of 25 buffers */
d4buf_unit(20L);
/* List the database using the index file */
x4list();
/* Free the buffer memory */
d4buf_total( 0L, 0, 0);
do_other_work();
w4exit(0);
}
-43-
d4buf_unit
Использование int d4buf_unit( long n_recs )
Описание Память берется из пула, распределенного функцией
'd4buf_total'. Эта память используется для буферизации
записей текущей базы данных.
'd4buf_unit' может выть вызвана более одного раза для базы
данных. Вызов 'd4buf_unit' повторно изменяет стратегию
буферизации.
Смотри 'd4buf_total'.
Параметры
Наименование Использование
n_recs Число записей в каждом буфере.
Возврат
Величина Назначение
-1 Ошибка
0 Успех
1 Память не была распределена 'd4buf_total' или
запрошено более 64К для одного буфера.
Внимание! Если программа заканчивается без сброса или закрытия баз
данных, изменения информации могут не записаться на диск.
См. также 'd4buf_total', 'd4buf_init'
-44-
Пример #include
#include
main(){
long rec, ref;
d4init();
d4use_excl("base");
ref=f4ref"num_fld");
/* 100 Records, 20 Buffer Max */
d4buf_total( 100L, 20, 1);
/* 100 Records in 1 Buffer */
d4buf_unit(100L);
/* Efficiently append 1000 records; 1Disk Write will occurs
every 100 records */
for( rec=100L; rec <= 1000L rec++){
d4append_blank();
f4r_double( ref, (double) rec );
}
/* 5 Record in each of 20 buffers */
d4buf_unit( 5L );
/* Now to randomly read the database ... */
d4close_all();
w4exit(0);
}
-45-
d4close
Использование int d4close ()
Описание Функция 'd4close' закрывает выбранную базу данных и все ее
индексные файлы.
Возврат
Величина Значение
0 Успешное выполнение
-1 При закрытии одного из файлов произошла ошибка
Пример #include
include
main( argc, argv )
int argc;
char *argv[2];
{
d4init();
if(argc >=2 ){
if( d4use(argv[1]<0 )
w4exit(1);
x4list();
d4close();
w4exit(0);
}
w4exit(1);
}
-46-
d4close_all
Использование int d4close_all()
Описание Функция 'd4close_all' закрывает все открытые файлы базы
данных, индексные файлы и файлы примечаний.
Возврат
Величина Значение
0 Успешное выполнение
-1 При закрытии одного из файлов произошла ошибка
Блокировка Разблокирует базы данных и индексные файлы.
Пример #include
#include
main(){
.
.
d4close_all();
w4exit(0);
}
-47-
d4create
Использование int d4create ((char *) name, (int) n_fields
(FIELD *) fields, (int) satefy)
Описание Данная функция создает, открывает и выбирает базу данных.
Если база данных уже открыта и установка SAFEFY выключена
(OFF), база данных будет закрыта, уничтожена, а затем
создана заново, в соответствии с определенными параметрами.
Параметры
Наименование Использование
name Имя базы, которая будет создана
num_fields Количество полей в базе данных
fields Указатель на массив, определяющий поля базы
данных. В этом массиве имеются 'num_fields'
элементов. Часть 'offset' описания поля
вычисляется функцией 'd4use'. Смотри пример.
satefy Логическая величина (int), определяющая, должен
ли быть удален имеющийся файл с таким же
именем.
0 - Удалить существующий файл.
1 - Возврат ошибки, если этот файл существует
Замечание Как показано в примере, можно создавать базы данных с
шестью различными типами полей:
Код типа поля Значение
С Символьное поле. Количество десятичных позиций
всегда равно нулю. Максимальная длина поля
dBase равна 255. Однако, если длина поля будет
превышать 255 и достигать 32К, то поле будет
совместимо с Clipper.
N Числовое поле. Максимальная длина (размер) поля
этого типа равняется 17. Если количество
десятичных позиций больше нуля, то оно должно
быть, как минимум, на два меньше, чем длина
поля.
F Поле с плавающей запятой. Code Base
рассматривает такой тип поля как числовой.
D Поле даты. Его длина всегда равняется 8.
L Логическое поле. Длина логического поля всегда
равна 1. Оно может иметь либо величину истинно,
либо величину ложно.
M Поле памяти (примечания). Длина поля примечания
всегда составляет 10. Если в базе данных
-48-
имеется одно или несколько полей примечаний,
создается отдельный файл примечаний. Поля
примечаний для хранения текста переменной
длины. Смотри модуль файла примечаний.
Возврат
Величина Значение
>=0 Номер указателя базы данных, соответствующий
базе данных
-1 Ошибка
Блокировка Не блокируется до окончания выполнения 'd4create'.
Пример #include
static FIELD fields[] =
{
/*Имя поля Тип, Длина, Десятичн. Смещен.*/
{"FIRST_NAME", 'C' 25, 0, 0},
{"BIRTH_DATE", 'D' 8, 0, 0},
{"AMOUNT ", 'N' 12, 2, 0},
{"FLOAT_VAL ", 'F' 14, 4, 0},
{"TRUE_FALSE", 'L' 1, 0, 0},
{"MEMO_INFO ", 'M' 10 0 0},
};
int create_base(){
return (d4create("BASE.DBF", 6, fields, 1));
}
-49-
d4delete
Использование int d4delete(long record_number)
Описание Функция 'd4delete' помечает указанную запись для удаления.
Запись читается, флаг удаления изменяется на символ
звездочки (*) и запись записывается.
Возврат
Величина Значение
1 Запись не существует
0 Успешное выполнение
-1 Ошибка
Блокировка Запись блокируется
Подсказка Если запись уже была считана в буфер записи, это более
эффективно, чем непосредственное удаление записи. Это
осуществляется посредством изменения первого байта буфера
записи на символ звездочки (*). Затем запись записывается
на диск:
/* Считать с диска в буфер записи */
d4go(record_no);
if(test_condition() ){
/* ark the record for deletion. 'f4record' returns a
pointer to the record buffer. The first byte of this buffer
is the deletion flag */
*f4record()='*';
/* Write the record to disk */
d4write( record_no );
}
Пример d4delete(1L) ; /* Пометить запись 1 на удаление */
-50-
d4deleted
Использование int d4deleted()
Описание Функция 'd4deleted' определяет, помечена ли текущая запись
на удаление. Если текущей записи не имеется, результат
будет неопределен.
Возврат
Величина Значение
0 Запись не помечена на удаление
1 Запись помечена на удаление
Блокировка Блокировки нет.
Пример if (d4deleted()) delete_work();
/* Код, приведенный выше, эквивалентен:
if (*(char *)f4record() == '*' ) delete_work();
*/
-51-
d4eof
Использование int d4eof()
Описание Если вы передвигаетесь за последнюю запись базы данных
посредством 'd4skip' или 'x4skip', тогда 'd4eof' возвращает
истину (не ноль). К тому же, если 'd4seek' или 'x4seek'
возвращают состояние конец файла, то 'd4eof' возвратит
'истину'.
См. также 'd4bof', 'd4skip'
Пример #include
#include
main(){
long last, first;
d4use("names");
last=f4ref("last_name");
first=f4ref("first_name");
i4open("last");
w4clear(-1);
w4handle(4); /* Printer Output */
w4(0,0, "names");
for( d4top(); !d4eof(); d4skip(1l) ){
w4num( w4row()+1,0, f4ptr(last),
f4width(last) );
w4num(w4row(), w4col()+2,
f4ptr(first, f4width(first) );
}
w4position( w4row()+1,0);
w4exit(0);
}
-52-
d4fields
Использование FIELDS *d4fields()
Описание Возвращает указатель на структуру 'FIELD' текущей базы
данных. Это позволяет легко создать другую базу данных со
структурой идентичной текущей базы.
Пример #include
/* Create s database with the same structure as the
currently selected database */
int copy_structure_to( char *new_base ){
return( d4create( new_base,
f4num_fields(), d4fields(), 1) );
}
-53-
d4flush
Использование long d4flush( int base_ref )
Описание Буферизованная информация базы данных сбрасывается на диск.
Code Base буферизует информацию только тогда когда
использовались 'd4buf_total' и 'd4buf_unit'.
Параметры 'base_ref' указывает базу, которая сбрасывается. Если
'base_ref' отрицательна все базы сбрасываются.
Пример #include
#include
main(){
int test_ref; long k, f_ref;
test_ref=d4use("test" );
d4lock( -1L, 1);
f_ref=f4ref("field_name");
d4buf_total( 100,1,1 );
d4buf_unit( 100 );
/* Append some record */
for( k=1L; k<=500L; k++ ){
d4append_blank();
f4r_long( f_ref, k);
}
/* Flush the append records to disk */
d4flush( test_ref );
x4list();
d4close_all();
w4exit(0);
}
-54-
d4go
Использование int d4go(long record_number)
Описание Функция 'd4go' считывает указанную запись в буфер записи.
Указанный номер записи становится текущим номером записи.
Если запись не существует, буфер записи инициализируется
пробелами.
Возврат
Величина Значение
1 Записи не существует
0 Успешное выполнение
-1 Ошибка
Блокировка Запись блокируется
Подсказка Доступ к буферу базы данных может быть осуществлен при
помощи функций управления полями.
Пример #include
main(){
long ref, rec, count;
double tot;
d4use_excl("base");
ref=f4ref("amount");
count=d4reccount();
tot=0.0;
for(rec=1L; rec <= count; rec++){
d4go(rec);
tot+=f4double(ref);
}
printf("\n The total is : f", tot);
exit(0);
}
-55-
d4init
Использование int d4init()
Описание Функция 'd4init' инициализирует различные переменные Code
Base. При необходимости, функции 'd4use' и 'd4create'
автоматически вызовут функцию 'd4init'.
Замечание Когда функция 'd4init' или 'w4define' вызывается в первый
раз, она определяет окно по умолчанию. Это окно, которое
содержит весь экран целиком, используется функцией '--
'u4error' для показа сообщений об ошибках.
Возврат
Величина Значение
0 Успешное выполнение
-1 Нет памяти
См. также 'd4initialize', 'd4buf_init', 'd4init_undo'
Пример #include
main(){
d4init(); /* Инициализировать структуры памяти*/
exit 0;
}
-56-
d4initialize
Использование int d4initialize( int num_base,
int num_index, int num_blocks,
int eval_space, long buf_bytes )
Описание 'd4initialize' может использоваться вместо 'd4init'.
Используйте 'd4initialize' непосредственного задания
распределения памяти.
Параметры Параметры 'num_base' и 'num_index' не ограничены. Однако,
если указано точное число индексных файлов и баз данных, не
будет потерь памяти и будет уменьшена фрагментация памяти.
Наименование Использование
num_base Число баз данных, под которые будет
распределена память.
num_index Число индексных файлов, под которые будет
распределена память.
num_blocks Число блоков памяти, распределяемых под
индексный файл. Блоки используются для
буферизации информации индексных файлов. Если
вызываются функции 'i4reindex' или 'i4index',
'numblocks' не должен быть менее '(int)10'.
Для достижения максимальной скорости, это число
должно быть более '(int)100', если используются
dBASE индексные файлы, и '(int)50', если
используются Clipper индексные файлы. Заметим,
что большие значения этого параметра достижимы,
только если используется компактная, большая
или огромная модель памяти.
eval_space Этот параметр задает число байт памяти,
распределяемой под функции оценки выражений. По
умолчанию 3К достаточно для довольно полного
обеспечения dBASE-выражений. Модуль оценки
выражений выдает сообщение об ошибке, если ему
слишком мало памяти.
buf_bytes Число байт, распределяемых для 'huge' огромного
блока памяти. Этот блок памяти используется для
увеличения скорости, переиндексации,
сортировки, упаковки и удаления. К тому же он
может использоваться для буферизации записей
базы данных.
'd4buf_init' вызывается с этим значением в
качестве параметра. Эта величина может быть
'0L'.
Возврат
Величина Значение
0 Успех
-57-
-1 Превышение памяти. Если 'u4erron' не
модифициравано - это критическая ошибка и (-1)
не возвращается.
См. также 'd4init', 'd4buf_init', 'd4init_undo'
Пример /* These are the defaults supplied by 'd4init' */
#include
d4init(){
return(d4initialize( 10,10, 12, 3000, 0xFC00L));
}
-58-
d4init_undo
Использование int d4init_undo()
Описание 'd4init_undo' освобождает память, распределенную Code Base.
В процессе выполнения функции, все открытые базы данных,
файлы примечаний и индексные закрываются.
После вызова 'd4init_undo', для использования Code Base
необходимо вызвать 'd4init' снова.
Возврат
Величина Значение
0 Успех
-1 Ошибка
См. также 'w4init_undo'
-59-
d4lock
Использование int d4lock (long lock_code, int do_wait)
Описание Функция d4lock используется для блокировки указанной базы
данных. Может блокироваться весь файл, определенная запись,
или байты подсчета записей. Если какая-либо запись уже была
блокирована, блокировка другой записи автоматически
разблокирует первую запись.
Если вы уже заблокировали заданную часть базы данных, то
функция 'd4lock' обнаружит это и сразу же возвратится с
успешным возвратом. Кроме того, если величина 'do_wait' -
FALSE /Ложно/, подпрограмма d4lock сразу же возвратится;
если же величина 'do_wait' - TRUE (не ноль) /Истинно/,
функция 'd4lock' ожидает, пока определенная часть базы
данных станет доступной, блокирует ее, и затем успешно
возвратится. Например, если заблокирован весь файл, любой
вызов функции 'd4lock' даст успешный возврат.
Параметры
Наименование Величина Значение
lock_code >0 Блокирует определенную запись
-1 Блокирует весь файл
0 Блокирует байты подсчета записи
do_wait 0 Не ожидать
1 Ожидать блокировки
Возврат
Величина Значение
0 Успешное выполнение
1 Запись не существует
-1 Ошибка
-2 Блокировано другим пользователем и 'do_wait'
равно нулю
Пример /* Ожидать блокировки всего файла целиком */
rc = d4lock (-1L, 1);
-60-
d4locked
Использование int d4locked( rec_code )
Описание Возвращает текущую информацию блокирования.
Параметры
Величина Значение
>0 Запись блокирована ?
-1 Файл блокирован ?
0 Байты подсчета записей блокированы ?
Возврат
Величина Значение
0 Не блокировано.
1 Блокировано.
-61-
d4lock_all
Использование int d4lock_all( int do_wait,
int free_buffers )
Описание Блокируется текущая база данных и все ее индексные файлы.
Параметры
Наименование Величина Значение
do_wait 0 Без ожидания
1 Ожидать блокирования.
free_buffers 0 Ничего не делать
1 Все буфера индексных файлов
текущей базы данных
сбрасываются на диск. Это
необходимо для использования
индексных файлов. (Используется
как внутренняя функция Code
Base, однако может
использоваться и
непосредственно.)
Возврат
Величина Значение
0 Успех
-1 Ошибка
-2 Блокировано другим пользователем, и флаг
'do_wait' равен 0.
Пример rc=d4lock_all(1,0); /* Lock Everything. */
-62-
d4lock_code
Использование int d4lock_code( int lock_code )
Описание Основная цель этой функции обеспечить 'грязное чтение'
('dirty read'). Это позволяет одному пользователю прочитать
запись несмотря на то, что эта запись блокирована другим
пользователам.
По умолчанию это значение влияет на блокирование такими
функциями Code Base как 'd4go', 'd4seek', 'd4skip', 'x4go',
'x4seek' и 'x4skip'.
Параметры
Величина Значение
2 Ничего не блокировать. Это опция 'грязного
чтения'.
1 Блокировать необходимые записи. (По умолчанию)
-1 Блокировать содержимое файла.
-2 Не изменять текущее значение 'lock_code'.
Позволяет получить текущее значение
'lock_code'.
Возврат Предыдущее значение 'lock_code'.
-63-
d4lock_wait
Использование int d4lock_wait( int do_wait )
Описание По умолчанию, Code Base ожидает блокирования файлов.
'd4lock_wait' изменяет эту опцию в соответствие со
следующей таблицей:
Параметры
Величина Значение
-1 Не изменять кода ожидания. Просто вернуть
текущее значение.
0 Не ожидать. Вернуться с кодом ошибки если
блокирование неуспешно.
1 Ожидать пока завершится операция блокирования.
Это значение по умолчанию.
Возврат Предыдущее значение 'lock_code'.
-64-
d4lseek
Использование int d4seek( long record_number )
Описание Функция 'd4seek' вызывает функцию выполнения 'lseek' для
позиционирования на указанную запись базы данных. Code Base
использует эту функцию внутри себя перед вызовом функций
'read' и 'write' нижнего уровня.
d4pack
Использование int d4pack()
Описание Функция 'd4pack' удаляет все записи в определенной базе
данных, которые были помечены на удаление.
После выполнения 'd4pack', буфер записи пустой. Необходимо
вызвать функцию Code Base такую как 'd4top' для
позиционирования на желаемою запись.
Возврат
Величина Значение
0 Успешное выполнение
-1 Ошибка
-2 База или один из индексных файлов блокирован и
установлен флаг вернуться немедленно.
Блокировка База данных и ее индексные файлы блокируются во время
упаковки, а затем разблокируются.
Переносимость Так как 'd4pack' использует 'chsize', используйте 'x4pack'
для достижения максимальной переносимости.
См. также 'd4delete', 'd4recall', 'x4pack'
Пример d4delete (2L);
d4pack();
-65-
d4ptr
Использование BASE * d4ptr()
Описание Функция 'd4ptr' возвращает указатель на структуру базы
данных, которая описывает выбранную базу данных. Если
открытой базы данных нет, возвращается '(BASE *) 0'.
Внимание! Если был сделан вызов функции 'd4use', 'd4close', или
'd4close_all', то данный указатель становится 'устаревшим',
и функция 'd4ptr' должна быть вызвана заново. Использование
этой функции требует знания внутреннего устройства Code
Base. К тому же, полученные коды могут не работать с
последующими версиями Code Base
Пример #include
/* Прочитать длину записи выбранной базы данных */
int buffer_len(){
return (d4ptr()->buffer_len);
}
-66-
d4recall
Использование void d4recall (long record_number)
Описание Если определенная запись помечена на удаление, эта отметка
удаляется. Запись считывается в буфер записи, флаг удаления
меняется на пустой символ, и запись записывается снова.
Возврат
Величина Значение
1 Записи не существует
0 Успешное выполнение
-1 Ошибка при чтении или записи в базу данных
Блокировка Запись блокируется
См. также Функции 'd4delete', 'd4pack'.
Пример d4recall (2L);
-67-
d4reccount
Использование long d4reccount()
Описание Возвращается колличество записей в базе данных. Эта
величина определяется на основании размера файла.
Следовательно, для выполнения данной операции, Code Base не
нужно выполнять никакой блокировки.
Если байты подсчета записей блокированы, то другие
пользователи не могут изменить число записей в базе данных.
В этом случае, Code Base запоминает внутри. Это увеличивает
скорости работы, так как Code Base не приходится сохранять
результаты определения числа записей в базе данных.
Заметим, что если файл блокирован, то также блокированы и
байты подсчета записей.
Возврат
Величина Значение
>=0 Количество записей в базе данных
-1 Никакой базы данных не выбрано
Блокировка Нет.
Пример /* Сбросить содержимое базы данных в текущее окно */
for ( rec = 1L; rec <= d4reccount(); rec++ )
w4( w4row()+1,0, f4record());
-68-
d4recno
Использование long d4recno()
Описание Функция 'd4recno' возвращает номер текущей записи.
Возврат
Величина Значение
>=1 Текущий номер записи
0 Текущего номера записи не существует
Пример /* Прочитать следующую запись */
d4go (d4recno() + 1L);
d4ref
Использование int d4ref ( char * name)
Описание Функция 'd4ref' возвращает целый указатель на определенную
базу данных. Если расширение файла не указано, принимается
расширение '.DBF'. Это тот же номер указателя (ссылки),
который был возвращен, когда база данных была сначала
открыта.
Возврат
Величина Значение
>=0 Номер указателя базы данных
-1 База данных не открыта
Пример d4select (d4ref( "ACCOUNT.DBF"));
-69-
d4seek_double
Использование int d4seek_double( double d )
Описание 'd4seek_double' осуществляет поиск, используя текущий
выбранный индексный файл. Если нет выбранного индексного
файла, то используется последний открытый. Если 'double'
число обнаружено, то вызывается 'd4go' для позиционирования
на найденную запись.
Параметры Для индексного файла с 'числовым' ключем, 'double' параметр
должен содержать искомую величину. Если индексный файл
имеет ключ типа 'дата', то 'double' должна представлять
собой Юлиановскую дату. Если индексный файл имеет ключ типа
'символ', эта функция не должна использоваться.
Возврат
Величина Значение
0 Значение найдено
2 На следующей записи. Если искомое значение не
найдено, будет прочитана запись непосредственно
за ключем и будет возвращено '(int'2'.
3 Конец файла. Если искомое больше всех значений
в индексном файле, будет возвращено '(int)3'.
-1 Ошибка
Блокировка Используемый индексный файл блокируется. Разблокирование
происходит, если новая запись не блокирована. В конце,
новая запись блокирована и прочитана.
Пример void double_search_examples(){
double d;
/* Numeric Key Search */
i4select( i4ref("numeric" ) );
d=c4atod("83.4", 4);
d4seek_double(d);
i4select( i4ref("dt_index") ); /* Date Search */
c4dt_julian("19840730", &d);
d4seek_double(d);
}
-70-
d4seek_str
Использование int d4seek_str( char *str )
Описание 'd4seek_str' осуществляет поиск, используя текущий
выбранный индексный файл. Если нет выбранного индексного
файла, то используется последний открытый. Если значение
обнаружено, то вызывается 'd4go' для позиционирования на
найденную запись.
Параметром поиска может быть любая строка символов. Если
индексный файл имеет тип 'дата', то дата для поиска должна
быть в формате "CCYYMMDD" (век, год, месяц, день).
Если индексный файл типа 'число', используйте
'd4seek_double'.
Возврат
Величина Значение
0 Значение найдено
1 Найдена часть; если искомая величина найдена,
но в ключе индексного файла имеются еще
символы, возвращается '(int)1'.
Пример:
Если "Jackson" значение ключа индексного файла.
d4seek_str("Jack") позиционирует на "Jackson",
но возвратит '(int)1' вместо '(int)0'.
Это значение никогда не возвращается для
числовых и ключей даты.
2 На следующей записи. Если искомое значение не
найдено, будет прочитана запись непосредственно
за ключем и будет возвращено '(int)2'.
3 Конец файла. Если искомое больше всех значений
в индексном файле, будет возвращено '(int)3'.
-1 Ошибка
Блокировка Если используется индексный файл, то он блокируется.
Разблокирование происходит, если новая запись не
блокирована. В конце, новая запись блокирована и прочитана.
-71-
Пример void string_search_examples(){
int rc;
/* Search for a Character String. The index file key
expression could be "UPPER(NAME)". Using the 'UPPER'
funttion makes the search case insensivitive */
i4select( i4ref("name") );
rc=d4seek_str("JACK");
/* Search for Last Name plus First Name. In this example,
the index file key expression is "last+first". LAST is a 15
character field and FIRST is a 10 character field. The
complete search key is provided. Consequently,
'd4search_str' will return with an exact find if the record
is located. */
i4select( i4ref("full_nam"));
rc=d4seek_str("(SMITH JOHN ");
/* Date Key Search */
i4select( i4ref("DATE"));
rc=d4seek_str("19900228");
}
-72-
d4select
Использование int d4select( int base_ref);
Описание Функция 'd4select' выбирает базу данных, с которой будут
работать другие функции.
Параметр 'base_ref' - это номер указателя, который возвращается
функциями 'd4use', 'd4create' и 'd4ref'. Если величина
'base_ref' равна '(int) -1', никакого выбора не происходит.
Функция 'd4select' возвращает номер ссылки (указателя)
выбранной до этого базы данных.
Возврат
Величина Значение
>=0 Номер ссылки выбранной до этого базы данных
-1 Никакой базы данных до этого выбрано не было
Пример /* Инициализировать некоторые переменные */
invoice_ref = d4use ("INVOICE");
invoice_name = f4ref ("NAME");
customer_ref = d4use ("CUSTOMER");
name_index_ref = i4open("CUS_NAME");
/* Переместится в начало файла "INVOICE.DBF". Сохранить
текущий номер указателя базы данных. */
prev_ref = d4select(invoice_ref)
d4top();
/* Найти поле "NAME" из файла "INVOICE.DBF" в индексном
файле "CUS_NAME.NDX" базы данных "CUSTOMER.DBF". */
d4select(customer_ref);
i4select(name_index_ref);
d4seek(f4str(invoice_name));
/* Выбрать предыдущую базу данных */
d4select (prev_ref);
-73-
d4skip
Использование int d4skip(long num_records)
Описание Функция 'd4skip' пропускает ("перепрыгивает") 'num_records'
записей от текущего номера записи. При этом будет
использован выбранный индексный файл. Если никакого
индексного файла выбрано не было, будет использован порядок
номеров записей.
После того, как будет обнаружена новая запись, она будет
считана в буфер записи и станет текущей записью.
Возврат
Величина Значение
0 Успешное выполнение
1 Пропуск до верхней записи файла
3 Пропуск до конца файла
-1 Ошибка
-2 База данных или индексный файл уже блокирован и
стоит флаг 'вернуться немедленно'.
-3 Нет записи в индексном файле соответствующей
текущей записи.
Блокировка Если используется индексный файл, то он блокируется.
Разблокирование происходит, если новая запись не
блокирована. В конце, новая запись блокирована и прочитана.
Замечание Возможно перейти на одну запись за последней в базе данных.
В этом случае, запись очищается. Однако, невозможно перейти
на запись выше (до) первой в базе данных.
Пример #include
#include
main(){
d4use("base");
i4open("index");
/* Display the database is reverse order */
for( d4bottom(); !d4bof(); d4skip(-1L) )
w4num(w4row()+1,0,f4record(),
f4record_width() );
w4exit(0);
}
-74-
d4top
Использование int d4top()
Описание Функция 'd4top' читает верхнюю запись в файле базы данных.
Если никакого индексного файла выбрано не было, то это
будет запись один.
Возврат
Величина Значение
0 Успешное выполнение
3 Конец файла (База данных пуста)
-1 Ошибка
Блокировка Если используется индексный файл, то он блокируется.
Разблокирование происходит, если новая запись не
блокирована. В конце, новая запись блокирована и прочитана.
Пример #include
#include
main(){
double sum, average;
long height_ref;
int rc;
d4use_excl("heights");
height_ref=f4ref("height");
sum=0.0;
for(rc=d4top(); rc!=3; rc=d4skip(1L) )
sum += f4double(height_ref );
w4clear(-1);
w4out("The Average Height: ");
w4double( w4row(),w4col(), sum/d4reccount(),
6,2 );
w4exit(0);
}
-75-
d4unlock
Использование int d4unlock( long lock_code)
Описание Функция 'd4unlock' удаляет блокировки на текущей выбранной
базе данных, как определено параметром. Если указанные
блокировки не существуют, функция 'd4unlock' не выполняет
никаких действий и возвращает 'успешное выполнение'.
Параметры
Величина Значение
1 Если определенная запись блокирована, она будет
разблокирована.
-1 Разблокирует все блокировки на текущей
выбранной базе данных и все ее индексные файлы
0 Разблокирует только байты подсчета записей.
Возврат
Величина Значение
0 Успешное выполнение
-1 Ошибка
Пример /* Разблокировать выбранную базу данных и ее индексные
файлы */
d4unlock (-1L);
-76-
d4use
Использование int d4use(char * name)
Описание Функция 'd4use' открывает и выбирает указанную базу данных.
Если расширения файла не определяется, принимается
расширение по умолчанию '.DBF'.
После выполнения 'd4use', буфер записи пустой.
Соответственно, необходимо вызвать функцию Code Base типа
'd4top' для позиционирования на требуемую запись.
Возврат
Величина Значение
>=0 Номер указателя базы данных, соответствующий
базе данных. Этот номер может быть использован
как параметр для функции 'd4select'.
-1 Ошибка
-2 База данных, блокирована другим пользователем и
выставлен флаг 'вернуться немедленно'.
Блокировка Разблокирование по завершению.
Пример account_ref = d4use ("ACCOUNT.DBF");
/* Заметьте, что две наклонных черты влево рассматриваются
компилятором Си как один символ (\). */
cust_ref = d4use("C:\\data\\customer");
d4use_excl
Использование int d4use_excl(char * name)
Описание Функция 'd4use_excl' идентична функции 'd4use', за
исключением того, что она блокирует базу данных после ее
открытия.
Подсказка Если Вы создаете прикладную программу одного пользователя,
то лучше использовать вместо функции d4use функцию
d4use_excl. Программа тогда будет работать несколько
быстрее.
-77-
Пример d4use_excl(name)
char *name;
{
int rc;
if((rc = d4use(name)) < 0) retunt -1;
if (d4lock( -1L,1) < 0) return -1;
return(rc);
}
-78-
d4write
Использование int d4write(long record_number)
Описание Функция 'd4write' записывает буфер памяти в определенный
номер записи. Поддерживаются открытые индексные файлы.
Параметр Номер существующей записи. Иначе используйте 'd4append'.
Подсказка Не всегда необходимо непосредственно вызывать функцию
'd4write'. Если запись модифицируется функциями замены
полей, запись будет автоматически записана перед
перемещением, поиском или закрытием. Это становится
возможным, так как Code Base помнит, был ли модифицирован
буфер записи с последнего его чтения.
Однако возможно непосредственное использование функций
'd4write' и 'd4append'. В этом случае Code Base не будет
автоматически обновлять оригинальную запись, потому, что
запись непосредственно записывается на диск.
Если номер записи - 'record_number' - 0L или больше, чем
колличество записей в базе данных, буфер записи
прибавляется к базе данных.
Возврат
Величина Значение
0 Успешное выполнение
-1 Ошибка
-2 Запись блокирована другим пользователем и
выставлен флаг вернуться немедленно.
-3 Уникальный ключ индексного файла имеет
дубликат. Следовательно, запись не была
записана.
По умолчанию, внешняя переменная
'v4unique_error' устанавливается как '(int)1'.
Если эта переменная изменяется на '(int)0',
функция 'd4write' никогда не возвратит величину
'(int)-3'. Вместо записывания записи, никакого
ввода в индексный файл с уникальным ключом
сделано не будет, и функция возвратит величину
'(int) 0'.
Блокировка Запись и индексный файл базы данных блокируются.
См. также 'd4append', 'd4append_blank'
-79-
Пример #include
/* Insert a Blank Record at Record 1 */
main(){
long i_rec, count;
d4use_excl("Data");
d4append_blank();
for(i_rec=d4reccount(); i_rec>=2L; i_rec--){
d4go(i_rec-1L);
d4write(i_rec );
}
d4blank();
d4write(1L);
exit(0);
}
-80-
d4zap
Использование int d4zap(long start_rec, long end_rec)
Описание Функция 'd4zap' удаляет указанный интервал записей.
Интервал всегда указывается, используя порядок номеров
записей. Соответственно, если величина параметра 'endf_rec'
будет меньше, чем величина 'start_rec', то удаления не
произойдет. После удаления записи все открытые индексные
файлы соответствующей базы данных переиндексируются.
После выполнения 'd4zap', буфер записи пустой.
Соответственно необходимо вызвать функцию Code Base типа
'd4top' для позиционирования на требуемую запись.
Возврат
Величина Значение
0 Успешное выполнение
-1 Ошибка
-2 Файл блокирован другим пользователем и стоит
флаг 'вернуться немедленно'.
Блокировка Во время выполнения функции d4zap база данных и индексные
файлы блокируются; после завершения работы функции они
снова разблокируются.
Внимание! При использовании данной функции необходимо соблюдать
чрезвычайную осторожность, так как она может сразу же
удалить большое колличество записей.
Пример /* Удалить всю базу данных */
d4zap (1L, d4reccount());
-81-
Функции оценки выражений
Представляется необходимым оценивать выражения dBASE. Например,
функции 'i4index' выражение dBASE передается как параметр. Подробное
описание выражений dBASE содержится в приложениях по функциям и
выражениям.
В Code Base процесс оценки выражений состоит из двух этапов. Во-
первых, выражение псевдо-компилируется. Затем это
псевдокомпилированное выражение выполняется и возвращается результат.
Этот способ эффективен при повторяющейся оценке выражений, так как
псевдо-откомпилированную форму выражения нужно генерировать только
один раз.
Если вы хотите оценить выражение только один раз, Вы можете
использовать функцию 'e4eval'. В противном случае, вызовите функцию
'e4parse' для псевдо-компиляции выражения, а затем вызовите функцию
'e4exec' или 'e4string' для его выполнения (интерпретации).
ПОДСКАЗКА:
Избегайте использовать модуль оценки выражений для оценки, которая
может быть произведена при помощи функций работы с полями. В противном
случае, скорость работы прикладной программы будет снижена. Модуль
оценки выражений наиболее приспособлен для производства вычислений в
ответ на интерактивные запросы.
e4eval
Использование void * e4eval( (char *) expr-ptr )
Описание Функция 'e4eval' оценивает выражение dBASE и возвращает
указатель на внутренний статический буфер, содержащий
результат. Соответственно, если функция вызывается
несколько раз, то первый результат будет затерт
последующим.
Параметр 'expr-ptr' является указателем на выражение dBASE. Это
выражение может содержать имена полей, функции, операторы и
ссылки на другие базы данных.
Более подробная информация содержится в приложениях по
выражениям.
Возврат Результат может находиться в различном формате, в
зависимости от его типа.
Тип Формат
Дата CCYYMMDD (Век, Год, Месяц, День)
Символ Строка ASCII
Числовое Двойное (double)
Логическое Целое (int), 0 - для /Ложно/, другие -
для /Истинно/
-82-
(void *) 0 Ошибка
Примечание Тип результата может быть определен посредством вызова
функции 'e4type'.
Пример /* AMOUNT - A numeric field of the selected database */
/* CENTS - Anumeric field of BASE.DBF */
#include
void test(){
double *d_ptr;
d_ptr=e4eval( "amount*(100+base->cents)" );
printf("\n Expression Result: %f", *d_ptr );
}
-83-
e4exec
Использование void * e4exec( (char *) compile_ptr )
Описание Функция 'e4exec' интерпретирует выражение
псевдокомпилированное из функции 'e4parse' и возвращает
указатель на внутренний статический буфер, содержащий
результат.
Параметры 'compile_ptr' является указателем на псевдо-
откомпилированную форму выражения.
Возврат Аналогичен возврату для функции 'e4eval'.
Пример #include
void exec_amount()
{
char * compile_ptr ;
char * result_ptr ;
e4parse( "AMOUNT", &compile_ptr ) ;
esult_ptr = e4exec( compile_ptr ) ;
/* Проверить тип *result_ptr */
if ( e4type() == 'N' )
printf( "\n Числовой результат: %f",
*( (double *) result_ptr) ) ;
if ( e4type() == 'C' )
printf( "\n Символьный результат: %s",
(char *) result_ptr ) ;
/* Освободить память, выделенную для e4parse */
free( compile_ptr ) ;
}
-84-
e4length
Использование int e4length()
Возврат Возвращает длину последнего выражения оцененного функциями:
'e4exec', 'e4eval', или 'e4string'.
Пример #include
int length_espression( char *expr){
if( e4eval(expr) == (char *0) ) return -1;
return( e4length() );
}
e4parse
Использование int e4parse( (char *) expr_ptr,
(char **) compile_ptr)
Описание Функция e4parse псевдо-компилирует выражение dBASE, для
того, чтобы оно могло быть быстро интерпретировано функцией
e4exec.
При помощи 'h4alloc' для псевдо-откомпилированного
выражения распределяется память. Следовательно, после того,
как откомпилированное выражение станет ненужным, необходимо
освободить выделенную память при помощи вызова
'h4free_memory'.
Внимание! Если указываемая база данных закрыта и открывается снова,
необходимо псевдо-откомпилировать выражение заново.
Возврат
Величина Значение
>= 0 Количество байт в
псевдооткомпилированном выражении
-1 Ошибка
-85-
e4string
Использование char *e4string( char * compile_ptr )
Описание 'e4string' аналогична 'e4exec' исключая то, что
возвращаемый результат всегда имеет символьный формат. Не
используйте 'e4string', если выражение возвращает
логический результат.
Для числовых строк, которым не предшествуют пробелы,
используется лидирующий ноль. Для отрицательных чисел,
число 0x5E вычитается из каждого символа.
Замечание 'e4string' используется для 'i4reindex', так как она
требует ASCII сортировки. Сравнение чисел несколько
медленнее на многих компьютерах.
Пример #include
#include
main( argc, argv )
int argc:
char *argv[];
{
char *expr_ptr;
d4init(); /* Init Code Base */
w4clear(-1);
if( argc < 4){
w4(0,0, "display database, recno, expr" );
w4exit(1);
}
if(d4use( argv[1] <0) w4exit(1);
if( d4go(c4atod( argv[2],strlen(argv[2])))<0)
w4exit(1);
if( e4parse( argv[3], &expr_ptr) < 0) w4exit(1);
w4display("Result:", e4string( expr_ptr),
(char *)0);
w4exit(0);
}
-86-
e4type
Использование char e4type()
Описание Функция 'e4type' возвращает тип последнего выражения,
оцененного функциями 'e4exec' или 'e4eval', 'e4vary' или
'e4string'.
Возврат Величина Значение
'C' Символьное
'N' Числовое в виде double
'n' Числовое в виде строки
'D' Даты в виде строки (CCYYMMDD)
'd' Даты в виде Юлиановской double
'L' Логическое
-87-
Функции для работы с полями
Функции для работы с полями выполняют операции над буфером записи и
возвращают информацию о полях. Заметьте, что на базу данных имеется
ТОЛЬКО один буфер записи, и что функции управления базой данных читают
и записывают этот буфер.
Для совершения операций над буфером записи имеется два способа. Во-
первых, с номерами указателей на поля могут быть использованы такие
функции, как, например, 'f4r_double' и 'f4double'. Преимущество этого
метода заключается в том, что выполнимая программа может безупречно
работать после добавления, удаления или изменения полей. Кроме этого
программисту не нужно понимать внутренний формат буфера записи базы
данных и не надо вызывать 'd4write'.
Если программист понимает внутренний формат буферов записи (см.
приложение Внутреннее устройство Code Base), он может непосредственно
(напрямую) манипулировать буфером записи Code Base. Наилучшим способом
является использование 'f4record' для присвоения указателю структуры
значения указателя начала внутреннего буфера записи. Члены структуры
будут соответствовать различным полям базы данных.
Некоторые функции заменяющие значение полей:
'f4r_double', 'f4r_int', 'f4r_long', 'f4r_char'
'f4r_str'
После использования этих функций нет необходимости записывать
содержимое буфера базы данных на диск. Буфер записи будет
автоматически записан в текущую запись базы. Содержимое буфера будет
записано, как только будет вызвана функция базы, изменяющая содержимое
буфера записи. Это следующие функции: 'd4flush', 'd4go', 'd4top',
'd4bottom', d4seek_double', 'd4seek_str' и 'd4close'. Функции
расширения также автоматически записывают изменения буфера записи на
диск.
Пример:
#include
main(){
d4use("test");
d4go(1L);
/* It is not necessary to explicitly write the change. */
d4close_all();
exit(0);
}
Однако, возможно непосредственно записать содержимое записи на диск
посредством вызова 'd4write' или 'd4append'. В этом случае буфер
записи будет записан в запись с указанным номером или в конец файла.
Пример:
-88-
#include
main(){
d4use("test");
d4go(1l);
f4r_str(f4ref("name"), "john" );
/* In this case, 'd4append' is called so that the changed
record is written to the end of the database. */
d4append();
d4close_all();
exit(0);
}
Подсказка Если используются номера указателей полей, этот способ
будет вполне применим для открытия баз данных в начале
программы и для непосредственного присвоения длинным целым
переменным величин указателей полей. Если переменные
указателей полей будут определены как глобальные, то они
могут быть использованы из любой функции! Кроме того, Code
Base знает, какой номер указателя поля какой базе данных
соответствует. Следовательно, при использовании функций для
работы с полями не имеет значения, какая именно база данных
выбрана.
Внимание! Не думайте, что номер указателя (ссылки) поля для первого
поля равен нулю, а для второго поля этот номер равен
единице ... Это верно только в отношении первой базы
данных, которая открыта, и может оказаться неверным в
последующих версиях Code Base. Для получения номеров
указателей на поля вызовите функции 'f4ref' или 'f4j_ref'.
-89-
f4char
Использование char f4char( long field_ref )
Описание возвращает первый символ содержимого поля.
См. также 'f4r_char'
Пример #include
void disp_sex( f_ref )
long f_ref;
{
if( f4char(f_ref) == 'M' )
printf("\n The Sex is Male");
else
printf("\n The Sex is Female");
}
-90-
f4decimals
Использование int f4decimals( (long) field )
Описание Если параметр 'field_ref' соответствует числовому полю,
функция 'f4decimals' возвращает количество десятичных
позиций в поле. В противном случае величиной возврата будет
ноль.
Возврат
Величина Значение
>=0 Количество десятичных позиций
-1 Неверный параметр
Пример #include
#include
void disp_structure( int base_ref ){
int j, prev_ref;
long f_ref;
char fld_type[2] = " ";
prev_ref=d4select(base_ref);
w4(0,0, "name"); w4(0,15, "type");
w4(0,25, "width"); w4(0,35, "decimals");
for(j=1; j<=f4num_fields(); j++){
f_ref=f4j_ref(j);
fld_type[0]=f4type(f_ref);
w4( w4row()+1,0, f4name(f_ref) );
w4( w4row(), 17, fld_type );
w4int( w4row(),27, f4width(f_ref), 2);
w4int( w4row(), 38, f4decimals(f_ref), 2);
}
g4char();
d4select( prev_ref);
}
-91-
f4double
Использование double f4double( long field_ref )
Описание Возвращаемое значение зависит от содержимого и от типа
поля. Если поле типа дата, то будет возвращена Юлиановская
дата. Иначе, 'f4double' будет считать, что поле содержит
число и возвратит значение как double. Соответственно
'f4double' работает с символьными полями, содержащими
числовые значения.
Пример #include
main(){
long amount;
d4use_excl( "totals" );
amount = f4ref( "amount" );
d4bottom();
printf( "The last amount: %f", f4double(amount));
exit(0);
}
f4int
Использование int f4int( long field_ref )
Описание 'f4int' считает значение содержимого поля числом.
Соответственно, 'f4int' работает для символьных полей,
содержащих цифровую информацию. Десятичные знаки
отбрасываются. Если значение поля превышает максимальное
целое, то результат неопределен.
См. также 'f4r_int'
Пример #include
main(){
long age_ref;
int max_age;
d4use_excl("people");
age_ref=f4ref("age");
max_age=0;
for( d4top(); !d4eof(); d4skip(1L) )
if( f4int(age_ref) > max_age )
max_age=f4int(age_ref);
printf("The oldest person is %d years old",
max_age);
exit(0);
}
-92-
f4j_ref
Использование long f4j_ref( (int) j_field )
Описание Функция f4j_ref возвращает номер указателя поля, который
соответствует jму полю базы данных. Номер указателя поля
будет дан для выбранной базы данных.
Возврат
Величина Значение
>=0 Номер указателя поля
-1 Неверный параметр
Замечание Величина параметра 'j_field' должна находиться в диапазоне
между единицей и количеством полей.
(то есть: 1 <= j_field <= f4num_fields()).
Подсказка Номера указателей полей даются в последовательном порядке.
Следовательно, f4j_ref(j)+1 равно f4j_ref(j+1), если только
база данных имеет бльше, чем 'j' полей.
Внимание! Номер указателя поля верен только в том случае, когда база
данных открыта. Если база данных закрыта, а потом
открывается снова, функция f4j_ref должна быть вызвана
заново для получения номера указателя поля.
Пример #include
#include
/* Returns the field reference number of the first memo
field. */
long first_memo_ref(){
int j;
for(j=1; j<=f4num_fields(); j++)
if(f4type(f4j_ref(j)) == 'M' )
return( f4j_ref(j) );
return(-1L);
}
-93-
f4long
Использование int f4long( long field_ref )
Описание 'f4long' считает значением содержимого поля число.
Соответственно, 'f4long' работает для символьных полей
содержащих цифровую информацию. Десятичные знаки
отбрасываются. Если значение поля превышает максимальное
длинное целое, то результат неопределен.
См. также 'f4r_long'
Пример #include
long tot_field( f_ref )
long f_ref;
{
long tot = 0L;
for( d4top(); !d4eof(); d4skip(1L) )
tot += f4long( f_ref );
retirn( tot );
}
f4name
Использование char * f4name( (long) field_ref )
Описание Функция f4name возвращает имя поля по указателю. Если номер
указателя поля неверен, возвращается пустой указатель.
Пример #include
#include
void display_field_name( f_ref )
long f_ref;
{
w4display( "The Fields Name ", f4name( f_ref ),
(char *) 0);
}
-94-
f4ncpy
Использование int f4ncpy( long field_ref, char *mem_ptr,
int n)
Описание Содержимое поля копируется в область памяти указанную
'mem_ptr'. Максимально копируется 'n' символов. Если
область памяти больше ширины поля, то скопированные данные
будут ограничены нулем.
Возврат Возвращается число скопированных символов. Это число всегда
меньше или равно параметру 'n'.
Пример #include
main(){
char first_name[25];
long name_ref;
d4use_excl( "names" );
i4open( "last_nam" );
name_ref = f4ref("last_name");
d4top();
f4ncpy( name_ref, first_name,
(int)sizeof(first_name) );
.
.
}
f4num_fields
Использование int f4num_fields()
Описание Функция 'f4num_fields' возвращает количество полей в
текущей выбранной базе данных. Если никакой базы данных не
выбрано, возвращается величина -1.
Пример #include
main(){
d4use("test.dbf");
printf("Test.dbf hase %d fields",f4num_fields());
d4close_all();
exit(0);
}
-95-
f4ptr
Использование char * f4ptr( (long) field_ref )
Описание Функция 'f4ptr' возвращает указатель в буфере базы данных,
на определенное поле. Для эффективного использования этой
подпрограммы, необходимо знать формат буфера записи.
Смотрите раздел Формат буфера записи в приложении
Внутренняя организация Code Base.
Возврат нулевого указателя обозначает неверный параметр.
Так как указатель указывает непосредственно на данные, он
не оканчивается на нуль. За данными поля немедленно следуют
данные следующего поля. Таким образом можно вывести всю
запись, начиная с указанного поля.
Внимание! Если соответствующая база данных закрыта, а потом снова
открывается, указатель необходимо назначить заново.
Если буфер записи модифицировался, используя 'f4ptr', а не
функциями замещения ('f4r_*'), то необходимо
непосредственно вызвать 'd4write' или 'd4append'. В этом
случае Code Base не знает, что буфер записи изменен и
соответственно не запишет его автоматически.
Замечание Все данные в буфере записи хранятся как символы ASCII.
Числовые поля форматируются в соответствии с их длиной и
десятичными позициями. Логические поля содержат 'T', 't',
'Y' или 'y' для представления величины TRUE (Истинно), или
содержат 'F', 'f', 'N' или 'n' для представления величины
FALSE (Ложно). Наконец, поля даты имеют формат "CCYYMMOD"
(Век, Год, Месяц, День). Например, буфер для числового поля
с шириной пять и двумя десятичными позициями будет хранить
'(double) 3.4' как '3.40'; дата 15 марта 1988 года будет
хранится как "19880315".
Пример #include
int f4char( f_ref )
long f_ref;
{
/* Return the first character of the field */
return( *f4ptr(f_ref) );
}
-96-
f4record
Использование void * f4record()
Описание Функция 'f4record' возвращает указатель на начало буфера
записи.
Возвращаемый указатель может быть присвоен указателю
структуры 'C' для прямого доступа к данным. Так как все
поля базы данных внутренне хранятся в формате ASCII, все
члены структуры C будут иметь тип 'char' или будут массивом
типа 'char'. Члены структуры соответствуют, по порядку,
полям базы данных. Кроме того, количество элементов типа
'char' массива каждого члена структуры будет
соответствовать длине каждого поля базы данных.
Замечание Как оъясняется в приложении 'Внутреннее Устройство Code
Base' к данному руководству, формат буфера записи Code Base
идентичен тому, как dBASE хранит свои данные записи на
диске. Все данные находятся в формате ASCII и между полями
нет разделителей.
Первым байтом буфера записи является флаг удаления, который
представляет собой символ звездочки (*), если запись
помечена на удаление, в противном случае он пустой.
Внимание! Если соответствующая база данных закрыта, а потом снова
открывается, указатель необходимо назначить заново.
Пример 1 typedef struct
{
char deleted ; /*флаг удаления*/
char last_name[30] ; /*Поле 1.Длина 30*/
char first_name[20] ;/*Поле 2.Длина 20*/
} NAME ;
/* Эта функция непосредственно изменяет внутренний буфер
записи Code Base и затем записывает его*/
void append_record()
{
NAME *name_ptr ;
/* 'name_ptr' будет указывать на
внутренний буфер записи Code Base */
name_ptr = (NAME *) f4record() ;
/*Инициализировать запись*/
memset(name_ptr,(int) '', sizeof(NAME));
/*Скопировать данные*/
memcpy(name_ptr->last_name, "JONES", 5);
memcpy(name_ptr->first_name, "FRED", 4);
d4append(); /*Добавить новую запись*/
}
-97-
Пример 2 /* Copy records from one database to another. */
#include
main(){
int from_ref, to_ref;
char *from_ptr, *to_ptr;
long i_rec;
from_ref=d4use("from");
from_ptr=f4rocord();
/* Data base 'TO' hase an identical database structure as
database 'FROM' */
to_ref=d4use("to");
to_ptr=f4rocord();
d4select( from_ref );
for( i_rec=1L; i_rec<=d4reccount(); t_rec++){
/* Read the database record */
d4go(i_rec);
/* Copy database buffer */
memcpy(to_ptr,from_ptr,f4record_width() );
/* Append the databse record */
d4select( to_ref );
d4append();
d4select( from_ref );
}
}
-98-
f4record_width
Использование int f4record_width()
Возврат Функция 'f4record_width' возвращает общее число символов в
буфере записи. Эта величина равняется сумме длин полей плюс
единица, соответствующая флагу удаления.
Пример #include
int check_base_width( base_ref )
int base_ref;
{
int sum,j;
d4select( base_ref );
/* Initilize 'sum' to one for the Deletion Flag */
for( sum=1, j=1; j<= f4num_fields(); j++)
sum += f4width(f4j_ref(j));
if( sum==f4record_width() ){
/* This always happens. */
printf("\n Record Width is Correct !!");
return(0);
else{
printf("\n Error. ");
return(-1);
}
}
-99-
f4ref
Использование long f4ref( (char *) field_name)
Описание Функция 'f4ref' возвращает номер указателя поля,
соответствующий имени поля, которое определено параметром.
Имя поля может содержать символы в верхнем или нижнем
регистре. Кроме того, оно может оканчиваться пробелом или
нулем.
Перед вызовом функции 'f4ref' должна быть выбрана база
данных, соответствующая имени поля.
Возврат
Величина Значение
>= 0 Номер указателя поля
-1 Неверное имя поля
(Ошибки не показывается)
Внимание! Номер указателя поля верен только в том случае, когда база
данных открыта. Если база данных закрыта, а потом открыта
снова, необходимо заново вызвать функцию 'f4ref' для
получения номера ссылки для поля. Кроме того, база данных
поля должна быть выбрана перед тем, как будет вызвана
функция 'f4ref'.
Подсказка Вызовите функцию 'f4ref' один раз для определенного поля, а
затем присвойте переменной результат. Затем доступ к полю
можно получать, просто используя эту переменную как
указатель на поле. Если переменные используются в
нескольких файлах исходного кода, установите включающий
файл (файл include) для определения всех переменных ссылок
на поля как внешних.
Пример #include
/*Глобальные переменные*/
long m_name, m_address ;
/*Главная программа*/
main()
{
d4use( "MAILING" ) ;
m_name = f4ref( "NAME" ) ;
m_address = f4ref( "ADDRESS" ) ;
f4replace( m_name, "JOHN SMITH" ) ;
do_work();
}
-100-
f4r_char
Использование void f4r_char( long f_ref, char ch )
Описание Содержимое указанного поля заменяется на значение
символьного параметра 'ch'. В основном, операция имеет
смысл для логических и символьных полей. Остальные символы
поля заполняются пробелами.
См. также 'f4char'
Пример #include
main(){
long is_male_ref, sex_ref;
d4use_excl( "people" );
is_male_ref=f4ref("is_male");
sex_ref=f4ref("sex");
/* Update the new field 'SEX' from the old field 'is_male'
*/
for(d4top(); !d4eof(); d4skip(1l) )
if( f4true(is_male_ref))
f4r_char(sex_ref, 'M' );
else
f4r_char(sex_ref, 'F' );
d4close_all();
exit(0);
}
-101-
f4r_double
Использование void f4r_double( long f_ref, double d )
Описание Содержимое поля заменяется величиной указанной параметром
'd'. Не важен тип поля числивой, плавающий или символьный.
Однако, если тип поля символьный, то значение будет
отформатировано без десятичных знаков. Если поле имеет тип
Дата, то параметр 'd' должен содержать Юлиановскую дату.
Поле не может иметь Логический тип.
См. также 'f4double'
Пример #include
main(){
long f_amount, s_amount;
d4use("first");
f_amount=f4ref("amount");
d4use("second");
s_amount=f4ref("amount");
d4use("final");
/* Replace field 'amount' in database 'second' with field
'amount' of database 'first'. Note that neither database
is selected. */
f4r_double( s_amount, f4double(f_amount) );
d4close_all();
exit(0);
}
-102-
f4r_int
Использование void f4r_int( long f_ref, int i_val )
Описание Содержимое поля заменяется величиной, указанной параметром
'i_val'. Не важен тип поля числовой, плавающий или
символьный. Однако, если тип поля символьный, то значение
будет отформатировано без десятичных знаков. Поле не может
иметь тип Дата или Логический тип.
См. также 'f4int'
Пример #include
void zero_fields( base_ref )
int base_ref;
{
long f_ref;
long old_ref;
int i;
old_ref=d4select( base_ref );
for(i=1; i<=f4num_fields(); i++){
f_ref=f4j_ref(i);
if(f4type(f_ref) == 'N' ||
f4type(f_ref) == 'F')
f4r_int(f_ref, 0);
}
d4select( old_ref );
}
f4r_long
Использование void f4r_long( long f_ref, long l_val )
Описание Содержимое поля заменяется величиной, указанной параметром
'l_val'. Не важен тип поля числовой, плавающий или
символьный. Однако, если тип поля символьный, то значение
будет отформатировано без десятичных знаков. Поле не может
иметь тип Дата или Логический тип.
См. также 'f4long'
Пример #include
void add_record(){
long new_no, f_ref;
f_ref=f4ref("invoice_no");
d4go(d4reccount() );
new_no=f4long(f_ref)+1;
d4append_blank();
f4r_long(f_ref, new_no);
}
-103-
f4r_str
Использование void f4r_str( long f_ref, char *str )
Описание Содержимое поля заменяется величиной указанной параметром
'str'. Если ширина поля больше длины указанной строки, то
остаток поля заполняется пробелами. В противном случае,
если длина строки больше длины поля, то лишние символы не
копируются.
См. также 'f4cpy'
Пример #include
main(){
long name_ref, birth_ref;
d4use_excl("people");
name_ref=f4ref("name");
birth_ref=f4ref("birth");
d4go(1l);
/* Blank the Character 'name' field. */
f4r_str( name_ref, "" );
/* Set the Date field. */
f4r_str( birth_ref, "19601012" );
d4go(2l);
f4r_str( name_ref, "AL" );
d4close_all();
exit(0);
}
-104-
f4str
Использование char * f4str( (long) field_ref )
Описание Функция 'f4str' копирует содержимое поля во внутренний
статический буфер и возвращает указатель на этот буфер.
Строка будет оканчиваться пустым символом.
Внимание! Каждый раз, когда вызывается функция 'f4str', статический
буфер перегружается данными из нового поля. Следовательно,
если значение поля должно быть сохранено, то необходимо
скопировать его в память объявленную пользовательской
задачей.
Пример:
printf( "Field One %s Field Two %s",
f4str( f4j_ref(1) ),
f4str( f4jref(2) ) );
В этом примере, 'f4str' вызывается дважды в одном вызове
'printf'. Так как 'f4str' всегда возвращает один и тот же
указатель на внутренний статический буфер, то вместо
значения двух полей будет выведено значение одного поля,
причем какое поле будет выводится, будет определятся
порядком указания номеров полей.
Другая общая ошибкаэто многократное использование значения
возвращаемого 'f4str' в качестве параметра в функции меню
'n4'. В этом случае, все пункты меню будут одинаковы.
Возврат Возвращается указатель на величину поля. Ошибка
обозначается нулевым NULL возвратом ((char *) 0).
Подсказка Данная функция применима, когда Вам необходимо, чтобы
величина поля оканчивалась пустым символом.
Пример #include
#include
void say_field( field_name )
char * field_name ;
{
char * ptr ;
ptr = f4str( f4ref( field_name ) ) ;
w4( w4row()+1, 0, ptr ) ;
}
-105-
f4true
Использование int f4true( (long) field_ref )
Описание Функция 'f4true' используется для определения того,
является ли величина логического поля истинной или ложной.
Возврат
Величина Значение
1 Поле истинно
0 Поле ложно
-1 Ошибка
Пример #include
f4true( field_ref)
long field_ref;
{
char char_value;
char_value= *f4ptr(field_ref);
if(char_value=='Y' || char_value=='y' ||
char_value=='T' || char_value=='t' )
return(1);
else
return(0);
}
f4type
Использование char type( (long) field_ref )
Описание Функция 'f4type' возвращает тип указанного поля. Поле может
иметь следующий тип: символьное, числовое, поле с плавающей
запятой, поле даты или логическое поле. Поля с плавающей
запятой рассматриваются как числовые поля. Для того, чтобы
поддержать совместимость с dBASE, избегайте использовать
поля с плавающей запятой.
Возврат
Величина Значение
'C' Символьное
'N' Числовое
'F' Поле с плавающей запятой
'D' Поле даты
'L' Логическое
'M' Поле примечаний
'\0' Ошибка
-107-
f4width
Использование int f4width ( (long) field_ref )
Описание Все поля имеют фиксированную длину в байтах (символах).
Функция f4width возвращает длину (размер) указанного поля.
Возврат
Величина Значение
>= 0 Длина (размер) поля.
-1 Ошибка
Пример #include
#include
void field_to_field( to_ref, from_ref )
long to_ref, from_ref;
{
int w;
w=f4width( from_ref );
if( f4width( to_ref )
char info[]="default Information";
main(){
w4init( 2,1,0 ); /* 2 windows, 1 entry area. */
w4clear(-1);
w4define( 10,20, 14,42);
w4border( SINGLE, F_BLUE );
w4title( 0,-1,"Enter New Information", B_RED );
g4(1,1,info);
w4activate( w4select(-1) );
g4read();
w4display( "Result: ", info, (char *)0 );
w4exit(1);
}
-110-
g4alloc
Использование GET * g4alloc( int row, int column,
void *data_ptr, char type)
Описание Это функция низкого уровня, которая используется функциями
инициализации чтения более высокого уровня.
Параметры
Наименование Использование
row Строка области ввода.
column Столбец области ввода.
data_ptr Указатель на величину по умолчанию, которая
начально показывается в области ввода. Эта
величина по умолчанию будет заменена на
окончательный результат.
type Для указания типа вводимых данных. Возможны
следующие коды:
Код Значение
'C' Символьный
'D' Дата
'L' Логический
'N' Числовой
'd' Двойное(double)
'l' Длинное(long)
'i' Целое(integer)
Возврат Возвращается указатель на структуру данных 'GET'. Эта
структура используется для хранения различных частей
информации, определенной функцией инициализации чтения,
функциями пре- и пост-модификации.
Возвращает '(GET *)0', если памяти не осталось и если
'u4error' была изменена для возврата по этой ошибке.
-111-
g4attribute
Использование long g4attribute( long attribute )
Категория Пре-модификатор.
Описание Каждая область ввода может иметь свой собственный символ
атрибута. Функция 'g4attribute' устанавливает атрибут
области чтения для областей ввода, соответствующих
последующим вызовам функций инициализации чтения.
Параметры Новый символ атрибута представлен, как целое между '(int)0'
и '(int)0xFF'. Если параметр 'attribute' не является
правильным символом атрибута, текущий атрибут чтения
изменен не будет.
Возврат Текущий символ атрибута.
См. также Смотрите 'w4attribute' для большей информации об атрибутах.
g4bell
Использование void g4bell()
Описание Вызывает звучание сигнала компьютера.
Замечание Вначале должна быть вызвана функция 'g4bell_set' для
установки переключателя сигнала в положение включен.
g4bell_set
Использование void g4bell_set( int switch )
Описание 'g4bell_set' включает или выключает переключатель звукового
сигнала. Если сигнал включен, то функция 'g4bell' вызовет
его звучание, а 'g4read' вызовет звучание сигнала после
заполнения области ввода.
Параметры Нулевой 'switch' выключает переключатель, и не нулевой
включает.
-112-
g4call
Использование void g4call( GET_ROUTINE *routine, int call_data )
Категория Пост-модификатор.
Описание Основное назначение 'функции вызова' заключается в
разрешении ввода данных, посредством меню, в области ввода.
В Code Base для этой цели имеются две функции: 'g4menu' и
'g4menu_help'. Смотри также функцию 'n4get_call'.
Представляется возможным, хотя и трудным, написать
специализпрованную функцию вызова или изменить функции
'g4menu' и 'g4menu_help'. Для этого необходимо изучить
способ работы функции 'g4read', при помощи отладчика.
Функцию вызова определяет следующая информация:
Функция 'g4call' определяет функцию, соответствующую
области ввода, которую 'g4read' вызывает перед тем, как она
запрашивает пользовательский ввод с клавиатуры. Эта функция
вызывается только тогда, когда функция 'g4read' находится в
области ввода, которая была только что определена.
Определенная пользователем функция вызова должна
принадлежать к типу 'GET_ROUTINE'. Это означает, что
функция отвечает следующему условию вызова:
int call_routine( (GET *)get_ptr,
(char *)data_buffer, int call_data)
Параметр 'get_ptr' указывает на структуру типа 'GET'. Эта
структура содержит информацию об определенной области
ввода.
Параметр 'data_buffer' указывает на текущую введенную
информацию. Вне зависимости от типа вводимых данных,
'data_buffer' всегда содержит символы ASCII.
Параметр 'call_data' является целым числом, передаваемым в
вызове функции 'g4call'. Цель определения этого параметра
определить различия для функции вызова.
В зависимости от значения, возвращаемого функцией, функция
'g4read' выполняет различные действия:
Значение Действие
>0 Функция 'g4read' берет эту величину как входные
данные, точно так же, как если бы она была
считана с клавиатуры.
0 Функция 'g4read' читает следующий символ
клавиатуры как обычные входные данные.
-1 Функция 'g4read' вызывает данную функцию снова,
не получая никаких данных клавиатуры от
пользователя.
-113-
Внимание! Не вызывайте функций инициализации ввода из функции вызова.
В противном случае первый параметр функции вызова 'get_ptr'
изменяется и становится непригодным к дальнейшему
использованию.
-114-
g4char
Использование int g4char()
Возврат Считывает символ с клавиатуры и возвращает его как целое
число.
Имеется специальный файл заголовка - 'g4char.h' - в котором
определены все клавишные коды специального расширенного
набора символов. Например, F1 определяется как 0x3B00. Это
именно та величина, которая возвращается функцией 'g4char'
при нажатии функциональной клавиши F1.
g4date
Использование void g4date( int row, int column,
char * date_ptr )
Описание Определяет область ввода для чтения даты. При использовании
формата по умолчанию для даты шаблон - 'MMM/DD/YY', месяц
вводится как три символа (например 'jan' - январь).
Параметры
Наименование Использование
row Строка области ввода.
column Столбец области ввода.
date_ptr Указатель на дату, которая начально
показывается в области ввода. Эта дата, в
формате 'CCYYMMDD', будет заменена на
окончательный результат.
-115-
g4delimiter
Использование char *g4delimiter( char *delimiter )
Категория Пре-модификатор.
Описание Последующие вызовы функций чтения будут использовать
определенные символы разделителей.
Параметры 'delemiter' указывает на строку, состоящую из двух (как
максимум) символов разделителей. Эти два символа появятся
на каждой стороне соответствующей области ввода, как они
указаны в строке. Если строка содержит один символ, то он
будет использован для ограничения обеих сторон области
ввода.
Возврат Возвращает указатель на два текущих символа разделителей.
Эта строка НЕ ОКАНЧИВАЕТСЯ нулем.
-116-
g4display
Использование void g4display()
Описание Показывает все величины чтения в своих областях ввода,
используя текущий атрибут чтения.
g4double
Использование void g4double( int row, int column,
double * double_ptr)
Категория Функция инициализации.
Описание Определяет область ввода для чтения числа двойной точности
(double). По умолчанию, формат этой области ввода имеет две
десятичные позиции и общую длину (размер), равный восьми.
Параметры
Наименование Использование
row Строка области ввода.
column Столбец области ввода.
double_prt Указатель на число двойной точности (double),
которое начально показывается в области ввода.
Это число двойной точности (double) будет
заменено на окончательный результат.
Замечание Функция 'g4picture' изменяет формат считываемого числа
двойной точности.
Пример g4double( 5,5, &value );
g4picture( "######.###" );
g4read();
-117-
g4field
Использование void g4field( int row, int column,
long field_ref )
Категория Функция инициализации.
Описание Определяет область ввода для чтения поля базы данных.
Параметры
Наименование Использование
row Строка области ввода.
column Столбец области ввода.
field_ref Номер указателя поля базы данных, который
соответствует вводимому полю.
Пример g4field( ++r, c, f4ref( "last_name" );
g4read();
-118-
g4int
Использование void g4int( int row, int column,
int * int_ptr )
Категория Функция инициализации.
Описание Определяет область ввода для чтения целого числа. По
умолчанию, формат области ввода будет иметь длину, равную
четырем.
Параметры
Наименование Использование
row Строка области ввода.
column Столбец области ввода.
int_ptr Указатель на целое число которое начально
показывается в области ввода. Это целое число
будет заменено на окончательный результат.
Пример g4int( r,c, &i_value );
g4picture( "######" ); /* Change the format */
g4read();
-119-
g4logical
Использование void g4logical( int row, int column,
int * logical_ptr )
Категория Функция инициализации.
Описание Определяет область ввода для чтения символа логической
величины: 'T','t','F','f','Y','y','N' или 'n'.
Логическая величина хранится как целое число, где ноль
соответствует 'FALSE' (ложь)('F','f','N','n'), а не-нулевая
представляет 'TRUE' (истина) ('T','t','Y','y').
Параметры
Наименование Использование
row Строка области ввода.
column Столбец области ввода.
logical_ptr Указатель на логическую величину представленную
как целое число. Данная величина начально
показывается в области ввода. Это целое число
будет заменено на окончательный результат.
Подсказка Единственными верными символами шаблона которые могут
использоваться с функцией 'g4logical' являются 'L'- по
умолчанию и 'Y'.
Для получения результирующего логического символа,
используйте функцию 'g4' с соответствующим шаблоном.
-120-
g4long
Использование void g4long( int row, int column,
int * long_ptr )
Категория Функция инициализации.
Описание Определяет область ввода для чтения длинного целого числа.
По умолчанию, формат области ввода будет иметь длину,
равную восьми.
Параметры
Наименование Использование
row Строка области ввода.
column Столбец области ввода.
long_ptr Указатель на длинное целое число которое
начально показывается в области ввода. Это
длинное целое число будет заменено на
окончательный результат.
Пример #include
long val=0L; /* Default Value */
main(){
w4init(); /* Create a default window. */
w4clear(-1);
w4( 2,2, "Enter Long Integer : " );
g4long( w4row(), w4col(), &val );
g4read();
w4( w4row()+1,2, "The Value is :" );
w4long( w4row(), w4col(), val, 8);
w4exit(0);
}
-121-
g4menu
Использование int g4menu( GET * get_ptr,
char * buffer, int window_ref )
Описание Если функция 'g4menu' определена как функция вызова для
области ввода, то меню используется для ввода информации в
область ввода. Единственными возможностями ввода будут
текстовые описания различных пунктов меню.
Функция 'g4menu' не вызывается непосредственно (напрямую).
Она используется как параметр для функции 'g4call':
g4call( g4menu, window_ref );
Параметр 'window_ref' представляет собой номер указателя
окна, соответствующего меню.
Функция 'g4menu' используется следующим образом.
1. Активируется меню при помощи функции 'n4activate' и
номера указателя окна 'window_ref', который был сохранен
функцией 'g4call'.
2. Передается текст из выбранного пункта меню во внутренний
буфер 'buffer' Code Base. Функция 'g4menu' знает формат
буфера, на основании информации в структуре, на которую
указывает переданая ссылка 'get_ptr'.
См. также Для того, чтобы узнать, как можно создать меню ввода,
обратитель к функциям меню и 'n4get_calc'.
Возврат Существуют некоторые клавишные символы: SHIFT_TAB, TAB,
CTRL_HOME, ESC и CTRL_C которуе обычно заставляют функцию
'g4read' осуществить переход между областями ввода или
вернуться. Если эти клавиши нажимаются во время нахождения
в меню ввода, функция 'n4activate' возвращает эту
информацию функции 'g4read'. Затем функция 'g4menu'
распознает эти символы как команды функции 'g4read' и
передает их, не выполняя никаких других действий. В
противном случае, выбираются данные ввода и функция
'g4menu' возвращает RETURN для сообщении функции 'g4read' о
перемещении к следующей зоне ввода.
-122-
g4menu_help
Использование int g4menu_help( GET * get_ptr,
char * buffer, int window_ref )
Описание Почти идентична функции 'g4menu'. Однако она позволяет
пользователю либо вводить данные обычным способом, либо
использовать меню как набор возможных вариантов ввода.
Особенность, 'g4menu_help' читает все данные с клавиатуры,
ожидаю нажатия функциональной клавиши F1. Если нажата
клавиша F1, функция 'g4menu_help' вызывает функцию 'g4menu'
таким образом, что данные могут вводится при помощи меню. В
противном случае, даннве введенные с клавиатуры
возвращаются функции 'g4read' таким образом, что они
используются далее как обычно.
См. также 'g4message_do'
-123-
g4message
Использование void g4message( (char *) message )
Категория Пост-модификатор.
Описание Определяет сообщение, соответствующее области ввода,
которая только что была создана.
Параметры Параметр представляет собой указатель на строку сообщения,
которая соответствует области ввода. Строка сообщения будет
автоматически показана при перемещении в область ввода.
См. также 'g4messge_do'
-124-
g4message_do
Использование void g4message_do( (char *) message )
Описание Функция вызывается функцией 'g4read' для показа строк
сообщений, определенных функцией 'g4message'.
Функция 'g4message_do' немедленно выводит строку текста в
абсолютных координатах дисплея, которые определяются
внутренними целыми переменными 'v4get_row' и 'v4get_col'.
По умолчанию эти переменные равны '(int)24' и '(int)0',
соответственно. Если длина строки меньше длины экрана, в
нее добавляются дополнительные символы пробелов. Если
указатель 'message' равен '(char *)0', ряд начиная с
позиции 'v4get_col', будет заполнен пробелами.
Параметры
'message' указатель на строку сообщения.
-125-
g4numeric
Использование void g4numeric( int row, int column,
char * num_str )
Категория Функция инициализации.
Описание Определяет область ввода для чтения числа в виде строка.
Длина числа и число десятичных знаков обределены величиной
по умолчанию или шаблоном ввода.
Параметры
Наименование Использование
row Строка области ввода.
column Столбец области ввода.
num_str Указатель на строку которая начально
показывается в области ввода. Эта строка будет
заменена на окончательный результат.
-126-
g4picture
Использование void g4picture( char * picture )
Категория Пост-модификатор.
Описание Функция 'g4picture' определяет шаблон ввода для области
ввода определенной доетого вункцией инициализации. Этот
шаблон ввода определяет какие символы ввода являются
допустимыми для какой позиции ввода.
Параметры
Символы в строке 'picture' имеют специальные значения:
Символ Значение
! Преобразовывает в верхний регистр.
9 0-9
# +,-,<пробел>, илит 0-9
A Только буквы ( A-Z или a-z)
L y,Y,n,N,t,T,f или F; преобразует в T и F
N Только цифры или буквы.
X Любой символ.
Y Только y,Y,n или N; преобразует в Y и N
Символ, который может быть введен в какуюто позицию
определяется соответствующим символом в шаблоне
изображения. Если символ в шаблоне изображения не является
специальным символом изображения, он вводится как данные.
Ввод даты требует применения других символов.
Символ Значение
C Вторая цифра века.
CC Первые две цифры века.
YY Первые две цифры года.
DD Числовое представление дня.
MM Числовое представление месяца.
MMM до
MMMMMMMMM Символьное представление месяца.
-127-
Пример /* Get a Telephone Number */
п4( 8,10, telephone_string );
g4picture( "999-999-9999" );
/* Get a Date */
g4( 9,10, date_value );
g4oicture( "MM/DD/CCYY"); /* Ex. 01/30/1989 */
g4read();
-128-
g4read
Использование int g4read()
Описание Функция 'g4read' осуществляет взаимодействие с
пользователем с целью ввода данных, при помощи
предварительного определения областей ввода. Эти области
ввода должны быть до этого определены для выбранного окна.
Пользователь может нажимать следующие клавиши для
выполнения определенных акций:
Клавиша Действие
или
Передвижение к следующей области ввода. Если
следующей нет то чтение завершается.
Прередвижение к предыдущей области ввода, если
она существует.
<Левая
стрелка> Передвигает курсор на одну позицию влево.
<Правая
стрелка> Передвигает курсор на одну позицию вправо.
Пререключение режимов вставки и замены. В
режиме вставки размер курсора несколько больше.
Стирает символ под курсором.
Стирает символ влево от курсора.
Экстренно зовершает чтение. Функция 'g4read'
немедленно возвращается.
Перемещает курсор в первую позицию текущей
области ввода.
Перемещает курсор в конец введенной информации.
Перемещает курсор к первой области ввода.
Перемещение курсора к последней области ввода.
-129-
Все эти клавиши завершают выполнение чтения,
если функция проверки для текущей области ввода
возвращает ненулевое значение.
Возврат Код нажатого управляющего символа вызывает выход из
экранного редактора. Если радактирование окончилось
вследствие введения максимального количества данных.
Возвращается код '(int)13' (символ возврата каретки).
Подсказка В зависимости от символа выхода, прикладная программа может
выполнять различные действия.
-130-
g4release
Использование void g4release( int do_release )
Описание Функция 'g4release' устанавливает может ли 'g4read' быть
вызвана несколько раз в строке. По умолчанию, после вызова
функции 'g4read', вся информация чтения освобождается.
Однако, эта установка по умолчанию может быль изменена.
Параметры Если 'do_release' истина (не ноль), вся сохраненная до
этого информация чтения немедленно освобождается. Кроме
того, функция 'g4read' освободит информацию чтения перед
тем как возвратится.
В противном случае, если величина параметра 'do_release'
ложь (ноль), подпрограмма 'g4read' не освободит информацию
чтения перед тем, как возвратится.
Пример d4learn_append(){
int row, i, rc;
if( d4use( "d4learn.dbf" ) <0) return(-1);
row=5;
/* Set 'get' information */
for( i=1; i <= f4num_fields(); i++)
g4field( row++; 20, f4j_ref(i) );
g4release( 0 ); /* Do not Release */
/* Append until (27) is pressad */
while( g4read() != 27 )
d4write( 0L );
/* Release the 'get' information */
g4release( 1 );
return(0);
}
-131-
g4upper
Использование void g4upper()
Категория Пост-модификатор.
Описание Все символы, определенной области ввода, будут
преобразованы в верхний регистр.
g4valid
Использование void g4valid( (*routine)() )
Категория Пост-модификатор.
Описание Определяет функцию оценки для предыдущей функции
инициализации чтения. Функция 'g4read' вызывает функцию
оценки (проверки) после того как информация будет введена в
область ввода. Функции оценки передается указатель на
структуру GET области ввода.
Если функция оценки возвращает '(int)0', то это означает
возможность введенной величины. Если она возвращает не
нулевую величину, функция 'g4read' остается в той же
области ввода. Именно функция оценки (проверки) несет
ответственность за показ на экране соответствующего
сообщения об ошибке.
Подсказка Вам следует изучить примеры в файле 'w4example.c'.
Внимание! Не вызывайте функций инициализации непосредственно или
косвенно из функции проверки. Это может привести к потере
параметров функцией проверки.
-132-
Пример #include
int check_entry( get_ptr )
GET *get_ptr
{
int *result_ptr;
result_ptr= (int *)get_ptr->data;
if( *result_ptr != -1 && *result_ptr != 1 ){
w4( 0,0, "Enter -1 or 1 (Press a key)" );
g4char();
w4repeat( 0,0, (int)' ', 80);
return -1; /* Not Valid */
}
return(1); /* Valid */
}
void valid_test(){
int i_data;
i_data=1;
g4int( 10,10, &i_data );
g4valid check_entry );
g4read();
w4( 12,10, "The result is:" );
w4int( 12, w4col(), i_data );
}
-133-
g4width
Использование void g4width( int width_str,
int width_screen )
Категория Пост-модификатор.
Описание Функция 'g4width' явно определяет размер данных (длину
строки) и размер (длину) области ввода.
Когда вводятся символьные данные, в том случае если размер
данных превышает размер области ввода, то за один раз
показывается только часть строки. (При вводе строка будет
скроллироваться.)
Параметры
Наименование Использование
width_str Эта величина определяет количество символов в
строке определенной функцией инициализации
чтения 'g4'.
Длина данных фиксированна для функций
'g4double', 'g4numeric', и 'g4long'. В этих
случаях, величина параметра 'width_str' должна
быть равна '(int)0'.
width_screen Этот параметр соответствует размеру (длине)
области ввода, определенной предыдущей функцией
инициализации чтения.
-134-
Функции управления памятью
Этот модуль обеспечивает управление памятью в Code Base для баз
данных, индексных файлов, блоков, окон, меню и размещения в памяти
структур. Лимит открытых баз данных и индексных файлов, при
использовании управления памяти Code Base, не зависит от используемых
функций и определяется только доступной памятью. В дополнение,
небольшие блоки могут быть размещены и освобождены с небольшими
накладными расходами.
Два первых целых числа в блоке размещенной памяти резервируются как
указатели. Эти указатели используются в дальнейшем для создания
двусвязного списка блоков памяти.
-135-
h4add
Использование int h4add( char ** ptr_ref_prt, int mem_ref,
int add_ref,
int add_before );
Описание Функция 'h4add' добавляет в двусвязный список размещенный
блок памяти. Этот блок не должен быть перед этим в списке.
Параметры
Наименование Применение
ptr_ref_ptr Указатель на указатель базы памяти. Это то же
значение, которое первоначально передается в
функцию 'h4create'.
mem_ref Целое число, служащее ссылкой на блок памяти.
add_ref Число, служащее ссылкой на блок памяти, который
который будет вставлен в двусвязный список
перед или после 'mem_ref'.
add_before Имеет значение '(int)1' (истина), если блок
памяти перед 'mem_ref' и '(int)0' (ложь) когда
блок памяти вставляется в список после
'mem_ref'.
Возврат Значение, которое было в параметре 'add_ref'
См. также 'h4remove'
-136-
h4alloc
Использование char * h4alloc( (unsigned int) num_bytes )
Описание 'h4alloc' размещает 'num_bytes' памяти и возвращает
указатель на размещенную память. Вся вновь размещенная
память инициируется в ноль.
Возврат Обычно, если нет доступной памяти, функция 'u4error' выдает
сообщение об ошибке и заканчивает программу. Однако, если
'u4error' модифицированна так, что не осуществляет выхода,
то 'h4alloc' при отсутствии свободной памяти возвращает
значение '(char *)0'.
-137-
h4create
Использование int n4create( char **ptr_ref_ref,
int units, int size, int expand_units )
Описание Функция 'h4create' инициализирует структуру используемое
Code Base как канал памяти (memory handler).
Параметры
Наименование Применение
ptr_ref_ptr Указатель на указатель базы памяти для
структуры памяти.
unit Количество блоков для начального размещения.
size Чмсло байт в структуре памяти.
expand_unit Число блоков для размещения структуры когда нет
свободных блоков.
Возврат Значение '(int)-1' сигнализирует, что запрошенная память не
доступна. Эта ошибка возникает если, только функция
'u4error' изменяет и не осуществляет выход по ошибке
отсутствия свободной памяти.
-138-
h4free
Использование int h4free( char **ptr_ref_ptr, int mem_ref )
Описание Возвращает блок памяти в область свободной памяти.
Параметры
Наименование Применение
ptr_ref_ptr Указатель на указатель базы памяти. Это то же
значение, которое первоначально передается
функции 'h4create'.
mem_ref Целое число - ссылка на освобождаемую память.
Это тоже число, что возвращает функция 'h4get'.
Возврат Целую ссылку на предыдущий блок памяти. Если предыдущий
блок не существует, возвращается ссылка на следующий блок.
Если нет следующего блока памяти, то возвращается '(int)-
1'.
-139-
h4free_chain
Использование void h4free_chain( char **ptr_ref_ptr,
int mem_ref )
Описание 'h4free_chain' обращается несколько раз к функции 'h4free'
для освобождения всего списка памяти. Следующая функция
может быть использована как пример функции 'h4free_chain'.
Пример /* Source for 'h4free_chain */
void h4free_chain( char **ptr_ref_ptr,
int mem_ref ){
while( mem_ref >= 0)
mem_ref = h4free( ptr_ref_ptr, mem_ref );
}
h4free_memory
Использование void h4free_memory( void * ptr )
Описание Эта функция работает полностью как библиотечная 'free'. Она
необходима, т.к. 'free' не доступна в текущей версии
Microsoft Windows.
-140-
h4get
Использование int h4get( char **ptr_ref_ptr, int mem_ref )
Описание Размещает блок памяти.
Параметры
Наименование Применение
ptr_ref_ptr Указатель на указатель базы памяти. Это тоже
значение которое первоначально передается в
функцию 'h4create'.
mem_ref Размещаемый блок памяти помещается в связанный
двойной список сразу за блоком имеющим номер
ссылки 'mem_ref'. Если 'mem_ref' равна '(int)-
1', то создается новый двусвязный список.
Иначе, 'mem_ref' должна иметь значение, ранее
выданное функцией 'h4get'.
Возврат Целочисленый номер ссылки на размещенный блок памяти. Этот
номер может быть 0 или больше.
Возвращение значения '(int)-1' означает отсутствие
доступной памяти. Эта ошибка возникает, если функция
'u4error' была изменена так, что возвращает ошибку
отсутствия свободной памяти.
-141-
h4remove
Использование int h4remove( char **ptr_ref_ptr,
int mem_ref )
Описание Функция 'h4remove' удаляет блок памяти из цепочки списка,
но не освобождает его.
Этой функцией нужно использовать вместе с 'h4add' для
перемещения блоков памяти из одного списка в другой. Она
может применятся дла изменения порядка элементов в
связанном списке.
Параметры
Наименование Прменение
ptr_ref_ptr Указатель на указатель базы памяти. Это же
значение первоначально передается в функцию
'h4create'.
mem_ref Целочисленная ссылка на блок памяти.
Возврат Как функция 'h4free', возвращает ссылку на предыдущий блок
памяти. Если он не существует, то возвращается целочисленая
ссылка на следующий блок. Если нет следующего блока памяти,
то функция возвращает '(int)-1'.
-142-
Пример работы с памятью
void mem_test(){
struct test{
int next prev;
char name[20];
char city[25];
} *test_ptr;
int chain_one, chain_two;
h4create( (char **)&test_ptr, 10,
sizeof( struct test), 5);
/* Allocate a chunk for 'chain_one' */
chain_one=h4get( &test_ptr, -1 );
/* Allocate another chunk for 'chain_one' */
chain_one=h4get( &test_ptr, chain_one );
/* Assign some data */
strcpy( test_ptr[chain_one].name, "JACKSON" );
strcpy( test_ptr[chain_one].city, "LONDON" );
/* Allocate a chunk for 'chain_two' */
chain_two=h4get( &test_ptr, -1 );
/* Free the most recently allocated chank of 'chain_one'
*/
chain_one = h4free( &test_ptr, chain_one );
}
-143-
Функции работы с индексными файлами
Индексные файлы используются для быстрого и эффективного доступа в
отсортированной последовательности к файлам баз данных. Индексный файл
содержит ключевую запись и номер соответствующей записи. Ключ в
индексном файле соответствует выражению dBASE, которое указывается при
создании индексного файла.
Все функции данного раздела используют 'index_ref' как параметр. Это
номер ссылки индексного файла, который используется для указания
индексного файла.
Многое из функций работы с индексами используются непосредственно
функциями работы с базой. Однако, функции 'i4open' 'i4close',
'i4index', 'i4reindex', 'i4select', и 'i4unlock' используются
непосредственно.
Для каждого индексного файла существует внутренний указатель,
установленный на текущую комбинацию ключ/номер записи в индексном
файле. Структура, содержащая эту комбинацию ключ/номер может быть
доступна обращением к функции 'b4key'. Этот внутренний указатель
управляется функциями 'i4top', 'i4bottom', 'i4go' и 'i4seek'. Кроме
того, 'i4skip' передвигает внутренний указатель относительно его
текущего положения.
Также как файлы базы, индексные файлы могут быть заблокированы и
освобождены (разблокированы). При вызове функций индексного файла,
устанавливающих внутренний указатель, этот файл автоматически
блокируется. Индексный файл может быть разблокирован высокоуровневой
функцией базы данных или непосредственно индексными функциями,
такими, как 'i4unlock' или 'i4close'. Заметьте, при разблокировании
индексного файла, его внутренний указатель становится неопределенныи.
Подсказка:
Следующие функции обычно не требуются для программистов создающих
прикладные системы: 'i4add', 'i4bottom', 'i4go', 'i4remove', 'i4seek',
'i4skip', 'i4top', и 'i4type'. Они вызываются функциями более высокого
уровня.
-144-
i4add
Использование int i4add( int index_ref, char *key_ptr,
long rec_num)
Описание Добавляет ключ и соответствующий номер записи в индексный
файл.
Параметры
Наименование Применение
index_ref Номер ссылающийся на индексный файл.
key_ptr Добавляемый ключ
rec_num Номер записи соответствующий ключу.
Возврат
Величина Значение
0 Успех
1 Ключ уже существует, а индексный файл должен
иметь уникальные ключи. (см. 'i4index')
2 Номер записи уже существует. Заметьте, 'i4add'
не всегда определяет дублирование номеров.
3 Содержимое отфильтровано функцией фильтровки
индекса. Ключ не будет добавлен.
-1 Ошибка
-2 Индексный файл блокирован другим пользователем
и стоит ключ 'вернутся немедленно'.
См. также 'i4index', 'i4filter'
Блокировка Если индексный файл разблокирован, он блокируется.
-145-
i4bottom
Использование int i4bottom( int index_ref )
Описание Перемещает внутренний указатель индексного файла на
последнюю позицию.
Возврат
Величина Значение
0 Успех
3 Конец файла. ( Возникает при пустом индексном
файле ).
-1 Ошибка
-2 Индексный файл блокирован другим пользователем
и стоит ключ 'вернутся немедленно'.
Блокировка Если индексный файл разблокирован, он блокируется.
-146-
i4check
Использование long i4check( int index_ref )
Описание Проверяет правильность индексного файла. Применяется как
средство отладки.
Иногда, при корректировке базы данных, открыты не все
индексные файлы. Соответственно, не открутые индексные
файлы становятся устаревшими. Функция 'i4check' позволяет
проконтролировать эту ситуацию.
Возврат
Величина Значение
0 Успех, индексный файл правильный.
>0 Нет ключей для такого числа записей.
-1 Ошибка
-2 Боза данных или индекс уже блокированы.
-3 Запись на которую ссулается индексный файл не
существует.
-4 Две ссылки индексного файла на одны запись
-5 Ключ индекса определенной записи устарел.
-6 Ключи в индексном файле в беспорядочной
последовательности.
-7 'i4check' работает только с базами менее 512000
записей. Иначе, не хватает памяти для проверки
индексного файла.
Блокировка Индексный файл и соответствующая база данных блокируется.
Пример #include
main(){
d4use("tst_base");
i4open( "index_a");
i4open( "index_b");
if( i4check(-1) == 0 )
printf( "Index_a and index_b are correct.");
else
printf("index_a and index_b are INCORRECT.");
exit(0);
}
-147-
i4close
Использование int i4close( int index_ref )
Описание Закрывает указанный индексный файл.
Возврат
Величина Значение
0 Успех.
-1 Ошибка
Пример #include
main(){
int temp_ref;
d4use( "PEOPLE");
temp_ref=i4index("TEMP", "AGE", 0,0 );
x4list();
i4close(temp_ref);
.
.
}
-148-
i4eval
Использование char * i4eval( int index_ref )
Описание Функция 'i4eval' вычисляет выражение, используемое для
построения ключа индексного файла и возвращает указатель на
результат. Результат находится во внутреннем статическом
буфере. Вычисления проводятся для текущей записи
находящейся в буфере.
При использовании опции CLIPPER, результат форматируется
как символьная строка. Для dBASE - результат форматируется
по-разному, в зависимости от типа индексного выражения:
Тип выражения Формат результата
Символьный Символьная строка
Дата Число с плавающей точкой соответствующее
Юлианской дате.
Число Число с плавающей точкой
Логическое Логическое выражение не используется в качестве
ключа сортировки
Возврат Возвращает указатель на результат. В случае ошибки
возвращает указатель на ноль.
-149-
i4filter
Использование void i4filter( int (*filter_routine)() )
Описание Фильтр индексного файла используется для того, чтобы
сделать ссылки индексного файла подмножеством записей базы
данных. Как следствие, если запись модифицируется или
добавляется, то вызывается вычисление функции сортировки
для определения должно ли быть изменено значения ссылки на
запись.
Функция фильтра пишется пользователем. Эта функция должна
использовать то, что соответствующии индексный файл и база
данных является текущей. К тому же, она должна использовать
то, что соответствующая запись базы данных находится в
буфере. Все функции фильтра должны возвращать целое в
соответвии со следующим соглашением:
Возвращаемая
фильтром
величина Значение
1 Запись отфильтровывается.
0 Запись используется.
-1 Ошибка.
Подсказка: Использование фильтров индексов может быть черезвычайно
эфективным способом позволяющим манипулировать
отсортированным подмножеством базы данных.
Для достижения эфекта, функция фильтра задается путем
вызова 'i4filter' после открытия индексного файла.
Пример #include
main(){
d4use( "client" );
/* Filter Deleted Record */
i4open("name");
i4filter( d4deleted );
i4open( "company" );
i4filter( d4deleted );
/* to turn off the filter, pass a null routine. Make shure
has been included so thet the prptotype is
defined7 Otherwise, the zero parameter is interpreted as an
integer. */
i4filter(0);
-150-
i4free
Использование int i4free( int index_ref )
Описание Информация, находящаяся в буфере, связанная с индексным
файлом, записывается на диск и освобожденная память
делается доступной для других индексных файлов.
Подсказка: Если вы не собираетесь в дальнейшем испльзовать данный
индексный файл, лучше вызвать функцию 'i4free'.
Возврат
Величина Значение
0 Успех.
-1 Ошибка.
-151-
i4go
Использование int i4go( int index_ref, char *key_ptr,
long record_number )
Описание Устанавливает внутренний указатель индексного файла на
указанную комбинацию ключ - номер записи.
Параметры
Наименование Применение
index_ref Ссылочный номер индексного файла.
key_ptr Указатель на значение ключа.
record_number Номер записи, соответствующий ключу.
Возврат
Величина Значение
0 Успех.
1 Ключ найден, а номер записи не найден.
Внутренний указатель будет указывать на ключ,
расположенный сразу после указанного.
2 Ключ не найден. Внутренний указатель будет
указывать на ключ расположенный сразу после
указанного.
3 Ключ не найден и достигнут конец файла.
Внутренний указатель будет указывать на конец
файла.
4 Ключ найден, но достигнут конец файла прежде,
чем был найден требуемый номер записи.
-1 Ошибка.
-2 Индексный файл блокирован другим пользователем
и выставлен флаг 'вернуться немедленно'.
Блокировка Индексный файл блокируется.
Подсказка: Функция полезна для поиска определенного номера записи в
базе данных и, затем, переходу к следующей, по
отсортированному порядку.
-152-
i4index
Использование int i4index( char *name, char *expr,
int unique, int safety )
Описание Создается, открывается и выбирается рабочим указанный
индексный файл. Этот файл создается для текущей рабочей
базы данных. Если параметр 'safety' установлен в 'лож' и
файл уже открыт, то он закрывается, удаляется, и создается
заново в соответствие с указанными параметрами.
Если расширение не указано, то добавляется расширение
'.NDX' к имени индексного файла.
Параметры
Наименование Применение
name Имя нового индексного файла
expr Выражение в форме dBASE определяющее порядок
сортировки. См. приложение по выражениям.
unique Указывает должен ли быть каждый ключ в
индексном файле уникальным
1-Уникальные; иначе не уникальные.
safety Указывает должен ли быть удален уже
существующий индексный файл.
1- Не удалять существующий. Вернуть ошибку если
такой файл существует.
0- Удалить файл с таким же именем.
Возврат
Величина Значение
>=0 Ссылочный номер индексного файла.
-1 Ошибка
-2 Индексный файл блокирован другим пользователем
и установлен флаг 'вернуться немедленно'.
Блокировка Индексный файл не блокируется.
-153-
Пример #include
static FIELD fields[]=
{
/* Field Name, Type, Width, Dec, Offset */
{"cust_no", 'N', 6 , 0 , 0},
{"f_name", 'C', 15 , 0 , 0},
{"l_name", 'C', 15 , 0 , 0},
{"purchased", 'D', 8 , 0 , 0},
{"amount", 'N', 12 , 2 , 0},
};
main(){
/* Create the database */
d4create( "name", 6, fields, 1);
/* Create the index files */
i4index( "cust_no", "cust_no", 1,0 );
i4index( "name", "l_name + f_name", 0,0);
i4index( "purchas", "ctos(purchased)+l_name",
0,0);
d4close_all();
exit(0);
}
-154-
i4index_filter
Использование int i4index_filter( char *name, char *expr
int unique, int safety,
int (*filter_routine)(void) )
Описание 'i4index_filter' аналогична 'i4index_filter' за исключением
одного входного параметра: 'filter_routine'. Этот параметр
позволяет вам задать функцию фильтрации индексного файла
которая будет использоваться в процессе создания индексного
файла. Функция фильтрации аналогична функции фильтрации
задаваемой функцией 'i4filter'.
Подсказка: При индексации, отношения баз данных не выполняются. Это
позволяет достигнуть большой скорости и малого размера EXE
файла. Однако, возможно включить связь (отношение) файлов
задав функцию 'x4relate_do' как функцию фильтрации
индексного файла.
Функции связанные с индексами будут вызывать функцию
фильтрации 'x4relate_do' перед вычислением выражения ключа.
Это приведет к тому, что связанная база будет автоматически
позиционироваться к нужным записям. В этом случае, в
действительности фукнция фильтрации будет отсутствовать.
Пример:
/* CON_FLD is a field of the database being indexed.
REF_BASE is the related database */
i4index_filter( "CONTROL",
"CON_FLD+REL_BASE->FLD,
1,1, x4relate_do );
См. также 'i4index', 'i4filter'.
Пример 1 #include
/* Filter all deleted records. */
void create_index(){
i4index_filter( "i_name", "fld_name", 1,1,
d4deleted );
}
Пример 2 /* This produces the same rusult as in Example 1 exept thet
it is at least twice as slow. */
void create_index2(){
int ref;
ref=i4index("i_name", "fld_name", 1,1 );
i4filter( d4deleted );
i4reindex( ref );
}
-155-
i4key
Использование KEY *i4key( int index_ref )
Описание Возвращает указатель на текущий ключ текущего блока
указанного индексного файла. Структура 'KEY' определена в
файле заголовка 'd4base.h' следующим образом:
typedef struct{
long file_block;
long rec_num;
char value[512-3*sizeof(long) ];
} KEY;
Член структуры 'rec_num' представляет собой текущий номер
записи, а член структуры 'value' представляет собой тукущее
значение ключа. Для символьных ключей, это всегда ASCII.
Для числовых и ключей даты формат зависит от того, какой
индексный файл - Clipper .NTX или dBASE .NDX.
Число байтов, занятое под значение ключа зависит от
выражения ключа индексного файла.
Внимание Использование этой функции может привести к не-
совместимости с будущими версиями Code Base.
Возврат Если возвращается '(KEY *)0', это означает, что нет
текущего ключа.
-156-
i4lock
Использование int i4lock( int index_ref, int do_wait )
Описание Если файл уже заблокирован, значение успех (0) возвращается
немедленно. Иначе, делается попытка блокировать индексный
файл. Если переменная 'do_wait' равна FALSE (0), и файл
блокирован другим пользователем, возвращается '(int)-2'.
Однако, если параметр 'do_wait' имеет значение 'TRUE' (1),
функция 'i4lock' делает попытки заблокировать файл (один
раз в секунду) пока не достигнет успеха.
Возврат
Величина Значение
0 Успех.
-1 Ошибка.
-2 Блокирован другим пользователем.
Пример #include
#include
main(){
int i_ref;
d4init();
w4clear(-1);
d4use( "base" );
i_ref=i4open( "base" );
if( d4lock( -1l, 0) ==0)
if( i4lock( i_ref, 0 )==0){
x4list();
w4exit(0);
}
w4display("Files were already locked." );
w4exit(1);
}
-157-
i4open
Использование int i4open( char * file_name )
Описание 'i4open' открывает и выбирает индексный файл рабочим.
Соответствующая база данных должна быть выбрана тоже.
Возврат
Величина Значение
>=0 Номер индексного файла, который будет в
дальнейшем использоваться в качестве ссылки на
данный индексный файл.
-1 Ошибка.
Пример #include
/* Declare externaly so they can be accessed from other
source files. */
int student_ref, st_name_ref;
int prof_ref, pr_name_ref, pr_class_ref;
main(){
student_ref=d4use("student");
st_name_ref=i4open("st_name");
prof_ref=d4use("professo");
pr_name_ref=i4open("pr_name");
pr_class_ref=i4open("pr_class");
do_work();
exit(0);
}
-158-
i4ref
Использование int i4ref( char * name )
Описание Функция 'i4ref' возвращает ссылочный номер предварительно
открытого индексного файла. Это тот же номер, который
возвращается при открытии индексного файла.
Если имя файла указано без расширения, то добавляется
расширение '.NDX' ( .NTX для Clipper).
Возвращает
Величина Значение
>=0 Ссылочный номер индексного файла.
-1 Ошибка; индексный файл не открылся.
Пример #include
int select_index( char *file_name ){
int i_ref;
i_ref=i4ref( file_name );
i4select( i_ref );
return( i_ref );
}
-159-
i4reindex
Использование int i4reindex( int index_ref )
Описание 'i4reindex' производит переиндексацию указанного
индексного файла. Эсли 'index_ref' имеет отрицательное
значение, то переиндексация делается для всех индексных
файлов текущей базы данных.
После вызова 'i4reindex', буфер записи становится пустым.
Следовалельно, необходимо вызвать функцию Code Base типа
'd4top' для позиционирования на необходимую запись.
Возврат
Величина Значение
0 Успех
-1 Ошибка
-2 База или один из индексных файлов не
блокируется.
См. также 'i4filter', 'd4lock_wait'.
Подсказка При изменении содержимого базы без открытия соответствующих
индексных файлов их содержимое не будет откорректировано.
Перед использованием, таких, "устаревших" индексных файлов,
их необхоимо тоже откорректировать командой переиндексации
'i4reindex'.
Замечание
Пример #include
main(){
d4use( "parts" );
i4open( "part_no" );
i4reindex( -1 );
d4close_all();
exit(0);
}
-160-
i4remove
Использование int i4remove( int index_ref, char *key_ptr,
long rec_num )
Описание Функция 'i4remove' удаляет комбинацию ключ/номер записи из
индексного файла.
Параметры
Наименование Применение
index_ref Номер для ссылки на индексный файл.
key_ptr Значение ключа
rec_num Номер записи, соответствующий ключу.
Возврат
Величина Значение
1 Ключ не найден и, следовательно, не может быть
удален.
0 Успех
-1 Ошибка
-2 Индексный файл блокирован другим пользователем,
и выставлен флаг 'вернуться немедленно'.
(Смотри функция 'd4lock_wait'.
Блокировка Индексный файл блокинуется.
-161-
i4seek
Использование int i4seek( int index_ref, void * key_ptr )
Описание Внутренний указатель устанавливается на первое вхождение,
имееющее указанный ключ.
Параметры
Наименование Применение
index_ref Ссылочный номер индексного файла.
key_ptr Значение ключа.
Возврат Функция может сделать несколько различных возвращений,
которые указывают на результат поиска. Для полного
обьяснения следующих возвращаемых значений, смотрите
функцию 'd4seek'.
Величина Значение
0 Полное соответствие найдено.
1 В соответствии найдено.
2 Указатель на ключе после.
3 Конец файла.
-1 Ошибка
-2 Индексный файл блокирован другим пользователем
и вуставлен флаг 'вернуться немедленно'.
Блокировка Индексный файл блокируется.
См. также 'b4key'
-162-
i4seek_ref
Использование int i4seek_ref()
Описание Возвращает ссылочный номер индексного файла, который
используется функцией 'd4seek'. Обычно это текущий
индексный файл. Однако, если нет текущего выбранного
индексного файла, вместо него будет использован последний
открытый индексный файл. Если не было открытых индексных
файлов базы данных, возвращается '(int)-1'.
-163-
i4select
Использование int i4select( int index_ref )
Описание Функция 'i4select' делает текущим (выбирает) указанный
индексный файл. Следовательно, функции базы данных
'd4seek', 'd4top', и 'd4bottom', используют выбранный
индексный файл для логического позиционирования внутреннего
указателя. Если 'index_ref' равна '(int)-1', выбирается
последовательность записей в котором они храняться в базе
данных.
Параметры
Величина Значение
>=0 Номер предыдущего выбранного индексного файла.
-1 Нет ранее выбранных индексных файлов. Ранее был
порядок, соответствующий номерам записей.
Блокировка Предидущий выбранный индексный файл разблокируется.
Пример #include
main(){
int type_ref, name_ref;
d4use("planets");
type_ref=i4open("p_type");
name_ref=i4open("p_name");
i4select( type_ref );
.
.
}
-164-
i4skip
Использование long i4skip( int index_ref, long n )
Описание 'i4skip' продвигает внутренний указатель на указанное число
записей. Продвижение идет по записям, расположенным в
логическом порядке выбранного индексного файла.
Если нет текущей позиции (например файл разблокирован),
передвижение идет в логическом порядке, начиная с первой
выбранного индексного файла.
При передвижении указателя от начала или конца файла, он
передвигается от первой или последней записи,
соответственно.
Параметры
Наименование Применение
index_ref Ссылочный номер индекса.
n Количество записей для продвижения.
Возврат Функция 'i4skip' возвращает количество записей, на которое
фактически переместился указатель. Если это количество
меньше чем указанное число записей, это означает, что
достигнут конец или начало файла.
При возникновении ошибки - возвращается значение '-n'.
Функция 'i4skip' выполняется сразу и возвращает '(long)0',
если запрошено перемещение на ноль записей. Следовательно,
при обращении с нулевым параметром, ошибка возникнуть не
может.
Блокировка Индексный файл блокируется.
-165-
i4top
Использование int i4top( int index_ref )
Описание Внутренний указатель индексного файла устанавливается в
верхнее положение.
Возврат
Величина Значение
0 Успех
3 Конец файла (Индексный файл пуст)
-1 Ошибка
-2 Индексный файл блокирован другим пользователем
и вуставлен флаг 'вернуться немедленно'.
Блокировка Индексный файл блокируется.
i4type
Использование char i4type( int index_ref )
Описание Возвращает тип индексного файла (тип ключа индекса) в виде
символа.
Возврат
Величина Значение
C Символьный тип
D Тип дата
N Числовой тип
Пример if ( i4type( i_ref ) == 'C' ) do_true();
-166-
i4unlock
Использование int i4unlock( (int) index_ref );
Описание Если функции передается параметр 'index_ref' со значением
'(int) -1', то все индексные файлы, соответствующие
выбранной базе данных, разблокируются. Иначе разблокируются
только один файл с номером 'index_ref'.
Возвращает
Величина Значение
0 Успех
-1 Ошибка
Блокиравка
Индексные файлы разблокируются, как описано выше.
i4unselect
Использование void i4unselect()
Описание Выбирается последовательность записей в порядке
расположения их в файле базы данных.
Блокиравка
Если индексный файл выбирается, то он разблокируется.
Возвращает
Функция 'i4unselect()' всегда возвращает '(int) 0'.
-167-
Функции работы с полями памяти.
Функции работы с полями памяти (memo) записывают текст переменной
длины в memo файлы. Текст, находящийся в файле памяти (memo), связан с
полем памяти базы данных. Следовательно, функции работы с полями
памяти, также как функции работы с полями, используют номер поля для
ссылок на него. Смотрите функции работы с полями для информации о
номерах полей для ссылки.
Code Base имеет два набора функций для работы с полями памяти. Первый
набор функций, как описано в данном разделе, имеет имена функций
начинающиеся с 'm4'. Другой набор функций - с именами, начинающимися с
'm3'.Для обеспечения совместимости файлов памяти (memo) с dBASE III,
dBASE III Plus и Clipper используются функции именами, начинающимися с
'm3'. Напротив, функции с именами 'm4' совместимы с файлами памяти
(memo), применяющимися в dBASE IV.
С точки зрения выполнения, функции обоих наборов идентичны.
Следовательно, документация по функциям 'm4' применима к функциям
'm3'. Однако, функции для dBASE IV работают более разумно, перед
перезаписью файла на диск всегда проверяют наличие доступного места на
диске.
Специальная функция 'm4convert' позволяет производить преобразование
файлов памяти из формата dBASE III в формат, используемый функциями
набора 'm4'. Другая функция - 'm4renamed' - используется после
переименования файла памяти dBASE IV. Однажды конвертированный, файл
памяти может обрабатываться функциями набора 'm4', и для функций 'm3'
он больше не доступен. До конвертирования файл памяти необходимо
обрабатывать функциями 'm3', и он не может считываться функциями 'm4'.
Все файлы памяти блокируются автоматически.
Предупреждение:
Пользователи dBASE IV не должны создавать файлы памяти, имеющие размер
блоков отличный от 512 байт. Это потому, что dBASE IV имеет ошибки,
которые немедленно возникают при использовании файлов памяти, с
размером блока больше 512, после переименования файлов командами ДОСа.
По этим причинам, помните, что функция 'd4create' создает файлы
памяти, с размером блока, используемым по умолчанию, и, поэтому,
необходимо сделать явное конвертирование файла функциями 'm4convert' и
'm4renamed' после переименования файла памяти.
-168-
m4check
Использование (long *) m4check( (long) field_ref)
Описание Функция 'm4check' анализирует содержимое файла памяти,
чтобы определить, как данные были сохранены в файле. Для
понимания возвращаемого знечения, необходимо знать, что при
освобождении места в файле памяти, свободное место
помещается в список свободного места. Затем, когда
требуется добавочное пространство для данных в файле,
используется освобожденное ранее место, и, после его
заполнения, пространство в конце файла.
Вызовите функцию 'm4check' с помощью 'd4learn'. Вероятно,
нет необходимости обращаться к 'm4check' из ваших программ.
Возвращает Нулевой указатель показывает существование проблем для
файла памяти, определенного параметром 'field_ref'. Причины
проблем могут быть следующие: неверный параметр
'field_ref', файл памяти несуществует, файл памяти испорчен
или нет доступной памяти для проверки.
Иначе возвращает указатель на массив из пяти целых длинных
(long) чисел. Каждое число указывает на определенный факт,
соответственно:
Номер числа Означает
0 Количество свободных мест. Это число должно
быть как можно меньшим.
1 Общее количество свободных блоков (512 байт в
блоке). Может быть больше свободных блоков, чем
свободных мест, так как каждое свободное место
может иметь один или несколько блоков.
2 Количество смежных участков. Это количество
должно быть маленьким, насколько это возможно,
и лучше иметь один большой участок, чем
несколько маленьких смежных участков.
3 Количество потерянных блоков. Это участки файла
памяти, которые не используются и не учтены в
списке свободного места.
4 Количество используемых блоков.
-169-
m4convert
Использование int m4convert( char * file_name)
Описание Функция 'm4convert' помещает в файл памяти некоторую
информацию, которая делает вазможным обработку файла памяти
dBASE III функциями набора 'm4'. Она не испортит информацию
в файле при преобразовании файл памяти dBASE III или dBASE
IV с размером блока отличным от 512.
Возвращает
Величина Значение
0 Успех
-1 Ошибка
Смотрите также Функции работы с полями памяти.
-170-
m4edit
Использование int m4edit( long field_ref, long rec_num,
char * editor_name, int max_size )
Описание Данные из файла памяти копируются во временный файл и
выполняется прграмма редактирования с именем этого файла
как параметр. Затем, содержимое файла копируются назад в
файл памяти. Первые четыре символа имени временного файла
'MEMO' и последнии четыре символа изменяются так, чтобы не
было дублирования с существующими файлами.
Таким образом, любой редактор, воспринимающий имя файла в
командной строке может применяться для изменения поля
памяти.
Параметры
Наименование Применение
field_ref Определяет файл памяти.
rec_num Номер записи базы данных.
editor_name Имя программы, принимающей имя файла в качестве
параметра.
max_size Максимальный размер поля памяти. Это количество
памяти временно запрашивается для хранения
содержимого поля памяти.
Возвращает
Величина Значение
0 Успех
1 Нет доступной памяти. Сообщение об ошибках не
выводится.
-1 Ошибка
-2 Запись в базе данных или файл пмяти блокирован
и выставлен флаг 'вернуться немедленно'.
Блокировка Запись с номером 'rec_num' блокируется. Файл памяти
блокируется и разблокируется автоматически. Так как
временный файл создается в текущем каталоге, эта функция
работат во многопользовательском режиме, обеспечивая
каждому пользователю свой рабочий каталог.
Переносимость Функция не работает под Unix/Xenix.
Пример m4edit( f4ref("MEMO_FLD"), 2L, "C:\\PROG", 5000);
-171-
m4exist
Использование int m4exist( (long) field_ref)
Описание Функция 'm4exist' определяет существование поля памяти без
чтения файла памяти.
Возвращает
Величина Значение
0 Поле памяти для данной записи не существует.
1 Поле памяти существует.
Замечание Используются данные из текущего буфера записи.
Пример #include
#include
main() {
int m_ref ;
w4clear (-1) ;
d4use ("INFO") ;
m_ref = f4ref( "MEMO_FIELD" ) ;
d4go(1L) ;
if ( m4exist(m_ref) )
w4display( "Memo field data is present." ) ;
else
w4display( "There is no memo field data" ) ;
}
-172-
m4read
Использование int m4read( long field_ref, long rec_num, char * str,
int str_len)
Описание Функция 'm4read' читает содержимое поля памяти в строку
'str'. Считывается 'str_len' символов. Строка 'str'
оканчивается нулем. В добавление, функция 'd4go' вызывает
для чтения запись с номером 'rec_num' в буфер записи.
Параметры
Наименование Применение
field_ref Номер для ссылки на поле памяти.
rec_num Номер записи.
str Указатель на место, куда будет помещен текст.
str_len Количество байт, отведенных под строку 'str'.
Возвращает
Величина Значение
>=0 Количество реально считанных символов.
-1 Ошибка.
-2 Запись в базе данных или файл пмяти блокирован
и выставлен флаг 'вернуться немедленно'.
Блокиравка Запись с номером 'rec_num' блокируется. Файл памяти
блокируется и разблокируется автоматически.
Предупреждение: Текущее содержимое буфера записи переписывается.
Пример #include
#define MAX_LEN 500
main(){
char *ptr ;
int comment_ref, len ;
d4use ( "TEST_DAT" ) ;
i4open ( "ORDER" ) ;
ptr = malloc ( MAX_LEN ) ;
if ( ptr == (char *) 0) exit (0) ;
comment_ref = m4ref ( "COMMENT" ) ;
d4top () ;
len = m4read ( comment_ref, d4recno (),
ptr, max_len ) ;
printf ("%d Bytes Read", len ) ;
exit (0);
}
-173-
m4renamed
Использование int m4renamed ( (char *) file_name);
Описание Функция 'm4renamed' вызивается после того, как файл памяти
dBASE IV выл переименован командой ДОСа. При переименовании
файла памяти важно переименовать одновременно и
соответствующий файл базы данных. Файл памяти должен иметь
тоже имя, что и соответствующий файл базы данных, но с
расширением '.DBT'.
Параметры
file_name Имя файла памяти который будет переименован.
Возвращает
Величина Значение
0 Успех
-1 Ошибка
-174-
m4write
Использование int m4write( long field_ref, long rec_num, char *
str, int str_len)
Описание Информация, записывается в поле памяти определенное
параметром 'field_ref'. В процессе записи вызывается
функция 'd4go' для чтения содержимого записи
'rec_num',затем вызывается функция 'd4write' для сохранения
измененных данных.
Параметры
Наименование Применение
field_ref Номер для ссылки на поле памяти.
rec_num Номер записи.
str Записываемая строка
str_len Количество символов для записи
Возвращает
Величина Значение
>=0 Количество записанных символов.
-1 Ошибка.
-2 Запись в базе данных или файл пмяти блокирован
и выставлен флаг 'вернуться немедленно'.
Блокиравка Запись с номером 'rec_num' блокируется. Файл памяти
блокируется и разблокируется автоматически.
Предупреждение: Текущее содержимое буфера записи переписывается.
Пример #include
static test_data[] = "This is some memo data>" ;
main(){
int desc_ref ;
d4use ( "PARTS" );
desc_ref = f4ref( "DESC" ) ;
/* Record four should already exist. */
m4write( desc_ref, 4L, test_data,
strlen ( test_data ) ;
/* Blank the record buffer so that the 10 byte memo file
reference does not get written to another record. */
d4blank ();
}
-175-
Функции работы с меню
С помощью функций работы с меню системы Code Base можно строить почти
все типы меню. В частности, могут быть созданы следующие типы меню:
опускающееся (pulldown), всплывающее (popup), вертикальное,
горизонтальное и типа 'Lotus'.
Любому меню Code Base соответствует определенное окно. Характеристики
окна меню, например, размеры определяются самим меню. Каждое меню
имеет определенный набор разделов. Эти разделы меню соответствыют
возможным выборам из меню. Меню 'Спускающееся' и 'Lotus' фактически не
простые меню, соответствующие структуре, определенной в системе меню
Code Base. Они реально состоят из главного и нескольких подменю.
Следующие функции обеспечивают установки для меню в текущем выбранном
окне:
Функция Краткое описание
n4attribute Устанавливает атрибуты, используемые по
умолчанию, для разделов меню.
n4horizontal Определяет горизонтальное меню.
n4item_width Определяет отступ между разделами
горизонтального меню.
Следующие функции применяются для определения разделов меню:
Функция Краткое описание
n4attribute_item Устанавливает атрибуты для разделов меню.
n4message Определяет сообщение для раздела меню
n4key Устанавливает определенную клавишу для
активизации раздела меню.
n4skip_over Определяет: может ли быть выбран раздел
меню.
Каждый раздел меню имеет соответствующую функцию 'активизации' и
функцию 'реакции'. Если раздел меню имеет функцию 'активизации', то
она вызывается при активизации данного раздела меню. Функция 'реакции'
вызывается при перемещении указателя разделов меню на данный раздел
-176-
n4
Использование int n4( char *label )
Описание Функция 'n4' определяет один раздел меню. Либо все разделы
меню для данного меню должны быть определены функцией 'n4',
либо все разделы меню нужно указывать функцией 'n4item'.
Если расположение разделов меню определяется функцией
'n4item', то их позиции должны указываться явно. Однако,
при использовании функции 'n4', расположение разделов меню
вычисляется и, поэтому, возможен скролинг разделов меню.
Скролинг разделов происходит, когда в окне не помещаются
все разделы.
Параметры
label Указатель на текст раздела меню, который
выводится как часть меню. Лучше использовать
указатель на постоянную область памяти, а не на
временную, т.к. функция 'n4' сохраняет только
копию указателя. Если текст по указателю
'label' изменился, то и выводимый текст тоже
изменится.
Возврат Номер раздела меню для ссылки на созданный раздел меню.
Пример #include
main(){
w4init(2,0,5);
w4clear(-1);
w4define(0,0,4,8);
w4border( DOUBLE, F_WHITE);
n4("One");
n4("Two");
n4("Three");
w4display(" Choice: ",
n4item_text( n4activate(-1) ),
(char *)0 );
w4exit(0);
}
-177-
n4action
Использование void n4action( (ACTION *)action_routine )
Описание Функция 'n4action' определяет функцию активизации для
раздела меню, который был только что создан функцией 'n4'
или 'n4item'. 'n4action' вызывается при перемещении
указателя разделов меню на этот раздел.
Всякая 'n4action' и 'n4reaction' функция возвращает целое и
имеет целое как параметр. Значение этого параметра
устанавливается функцией 'n4parm'. Если 'n4parm' не
вызывалась, параметром будет число равное значению
указателя соответствующего элемента меню.
Функции 'n4action' и 'n4reaction' возвращают целое, которое
инструктирует функцию 'n4activate' производить следующие
действия:
Значение Действие
< 0 Вернуться из функции 'n4action' с этим же
возвращаемым значением
== 0 Считать символ команды с клавиатуры.
> 0 Интерпретировать значение как командный символ
введенный с клавиатуры.
См. также 'n4sub_menu' 'n4reaction'
-178-
Пример #include
/*
Эти функции определяются пользователем
*/
do_entry( int item_ref );
do_report( int item_ref );
main(){
w4define(5,10,8,25);
w4border(DOUBLE, F_WHITE);
w4clear(-1);
n4("Data Entry");
n4action( do_entry );
n4( "Print Report" );
n4action( do_report );
n4activate(-1);
w4exit(0);
}
do_entry( int item_ref ){
/* ... */
return(0);
}
do_report( int item_ref ){
/* ... */
return(0);
}
-179-
n4activate
Использование int n4activate( int window_ref )
Описание 'n4activate' активизирует меню. В результате этого
активизируется подсоединенное (связанное) окно.
'n4activate' - это наиболее важная функция меню. Все другие
функции меню вызываются, чтобы подготовить вызов
'n4activate'.
Перед завершением 'n4activate' оконное меню деактивируется
и выбирается предыдущее окно.
Параметры
window_ref - ссылочный номер активизируемого окна. Если
параметр равен (int)-1, активизируется меню для
текущего окна.
Возврат 'n4activate' возвращает отрицательный код переданый
'n4action' или 'n4reaction' функцией. Если раздел меню не
имеет 'n4action' или 'n4reaction' функции то возвращается
целое число, задаваемое 'n4parm'. Если 'n4parm' не
вызывалось, то возвращается значение ссылки раздела меню.
Некоторые символы, которые вводятся с клавиатуры, вызывают
завершение 'n4activate'. Эти символы определяются функцией
'n4key_special'. К примеру, для горизонтального меню
клавиши управления вверх/вниз могут вызывать завершение
'n4activate'. Напротив, для вертикального меню к завершению
может привести нажатие клавиш право/лево. (см.
'n4arrow_exit').
Положительные значения возвращенные 'n4action' или
'n4reaction' трактуются функцией 'n4activate' как
клавиатурный ввод. Следовательно, возврат из 'n4activate'
может вызвать как символ введенный с клавиатуры, так и
символы, возвращаемые функциями 'n4action' или
'n4reaction'. В этом случае 'n4activate' возвращает
символьную величину, вызвавшую выход.
Наконец, 'n4activate' возвращает 0, если в окне нет пунктов
меню или окно слишком мало.
См. также Введение в главу 'Описание функций меню', 'n4key_special'
-180-
n4arrow_exit
Использование void n4arrow_exit()
Описание Обычно клавиши вверх/вниз в горизонтальном меню
игнорируются. Клавиши влево/вправо игнорируются в
вертикальных меню. Вызов 'n4arrow_exit' устраняет этот
недостаток для меню текущего выбранного окна. Когда нажата
клавиша управления курсором, которая может быть
проигнорирована в одном из перечисленных случаев,
'n4activate' возвращает код клавиши.
Замечание Такая возможность необходима для организаци вложенных меню.
Когда используются вложенные меню, то при нажатии клавиши
влево/вправо курсор должен возвращаться в верхний пункт
горизонтального меню.
-181-
n4attribute
Использование void n4attribute( long attribute, long
attribute_prompt )
Описание Устанавливает атрибуты для пунктов меню текущего выбранного
окна.
Параметры
attribute Это атрибут символов для соответственно
описанных пунктов меню. Атрибут для какого-либо
отдельного пункта меню может быть установлен
путем использования функции 'n4attribute_item'.
Если эта функция не вызывается, атрибут по-
умолчанию установлен F_WHITE.
attribute_prompt При взаимодействии с меню, выделенный
пункт меню (на котором находится курсор)
находится в положении ON. Этот пункт меню
всегда отображается с различным атрибутом,
отличным от других пунктов меню.
attribute_prompt специфицируется как
специальный атрибут для меню текущего
выбранного окна. Если эта функция не
вызывается, то пункт меню, на котором стоит
курсор, имеет атрибут F_WHITE.
См. также n4attribute_item()
Пример #include
main(){
w4define(0,0,3,4);
w4border( DOUBLE_TOP, _WHITE );
n4attribute( F_BLUE, B_BLUE );
n4("A");
n4("B");
w4display( n4item_text(
n4activate(-1) ), (char *) 0);
w4exit(0);
}
-182-
n4attribute_item
Использование void n4attribute_item(int item_ref, long attribute )
Описание присваивает атрибут указанному пункту меню.
Параметры
item_ref ссылочный номер пункта меню.
attribute атрибут, присваемый пункту меню.
Возврат item_ref=n4item(2,2, "Choice One);
n4attribute_item( item_ref, F_BLUE );
Пример
-183-
n4calc
Использование void n4calc( int w_ref,
int start_row, int start_col )
Описание Устанавливает размеры специфицированного окна. Размеры окна
будут несколько больше его оконного меню.
Ктомуже 'n4calc' делает окно-меню всплывающим (popup) и
присваевает ему SINGLE бордюр. Для изменения типа бордюра,
надо вызвать 'w4border' после 'n4calc'.
Если 'n4calc' обнаруживает каие-либо подменю, она сама
устанавливает размеры окон подменю. Окна подменю также
становятся всплывающими, и им присваивается SINGLE бордюр.
Параметры
Имя Использование
w_ref ссылочный номер окна.
start_row начальная строка оконного меню.
start_col начальная колонка оконного меню. Она может
изменена функцией 'n4calc' исли указанное
значение так велико, что меню не помещается на
экране.
Внимани Если вы хотите, чтобы меню было как можно больше,
установите параметр start_col равным (int)79.
'n4pulldown', 'n4lotus' и 'n4calc' позволяют программисту
быстро создавать хорошо выглядящие меню.
См. также 'n4pulldown', 'n4lotus'
Пример #include
main(){
int w_ref;
/* n4calc will fill in the windows
dimension */
w_ref=w4define(-1,-1,-1,-1);
n4("First Choice");
n4("Second Choice");
n4calc( w_ref, 10,20);
/*replace the single line border set by 'n4calc' with a
double line border */
w4border( DOUBLE, F_BLUE );
n4activate( w_ref );
w4exit(0);
}
-184-
n4char_routine
Использование void n4char_routine( int (*ptr)(void) )
Описание 'n4char_routine' задает функцию ввода, используемую
'n4activate'. Если 'n4char_routine' не вызывалась, то по
умолчанию функцией ввода будет 'g4char'.
Подобно 'g4char', функция ввода не имеет параметров и
возвращает целый код введенного символа. Если функция ввода
возвращает ноль, 'n4activate' ничего не делает и повторяет
вызов функции ввода опять.
Функция ввода обычно вызывает 'g4char' для получения
клавиатурного ввода. Эта функция распознает определенные
символы как специальные команды и тогда возвращает всех их
через другие символы ввода.
Пример #include
#include
static int char_entry(){
int rc;
rc=g4char();
if(rc==F1){
w4display(" Help ", " This is help infor
mation.", (char *)0 );
return(0);
}
return(rc);
}
main(){
int w_ref;
/* n4calc wil fill in the window dimensions. */
w_ref=w4define(0,0,3,6);
w4border( DOUBLE, B_WHITE );
n4("One");
n4("Two");
n4char_routine( char_entry );
n4activate( w_ref );
w4exit(0);
}
-185-
n4get_calc
Использование void n4get_calc( int w_ref );
Описание Позволяет вводить данные из меню в GET поля. Эта функция
используется 'g4menu' и 'g4menu_help'.
Когда меню используется для этих целей, 'n4get_calc'
вычисляет размеры и расположение меню.
Размеры окон должны быть инициированы как (int)-1 так как
'n4get_calc' сама вычисляет подходящие размеры.
Параметры
w_ref cсылка на окно содержащее 'get' области ввода.
См. также 'n4calc', 'n4pulldown', 'n4lotus' используют такой же
подход, но вычисляют положение и размеры для других целей.
'g4menu', 'g4menu_help'.
Пример #include
static char last_name[20];
main(){
int get_ref, menu_ref;
menu_ref=w4define(-1,-1,-1,-1);
w4clear(-1);
n4("Tim Jones");
n4("Fred Calvert");
n4("Kennet Powers");
get_ref = w4define(10,15,14,65);
w4activate( get_ref );
w4(1,5, "Enter last name: " );
g4(1,w4col(), last_name );
g4width( (int)siziof(last_name),
(int)siziof(last_name) );
g4call( g4menu_help, menu_ref );
g4message( "Press for Help");
/* 'g4call' saves the pointer to routine
'g4menu_help' and the menu reference number menu_ref.
Routine 'n4get_calc' looks at all of the 'gets' sheduled
for window 'get_ref'. It recognizes the address of call
routine 'g4menu_help' and knows the saved parameter
'menu_ref' must be a window reference number. Then if
calculates appropriate window dimensions and an appropriate
position for the menu window identified by 'menu_ref'. */
n4get_calc( get_ref );
g4read();
w4exit(0);
}
-186-
n4horizontal
Использование void n4horizontal()
Описание По умолчанию меню предпологается вертикальным.
'n4horizontal' устанавливает горизонтальное меню. Различия
между горизонтальным и вертикальным меню заключается в том,
что клавиши со стрелками вверх/вниз используются в
вертикальном меню, а клавиши вправо/влево в горизонтальном
меню.
-187-
n4int_get
Использование int n4int_get( int item_ref )
Описание 'n4int_get' возвращает целое, которое ранее было сохранено
функцией 'n4int_save'. Если число не было сохранено то
функция 'n4int_get' возвращает ноль.
Параметры
'item_ref' Номер пункта меню, соответствующего
возвращаемому целому.
См. также 'n4int_save', 'n4ptr_save', 'n4ptr_get'
Пример #include
#include
int display_info( int );
int display_info( int item_ref ){
int saved_value;
char buf[80];
saved_value = n4int_get( item_ref );
c4ltoa( (long) saved_value, buf, 6 );
buf[6] = '\0';
w4display( "Information",
"Text Value:",
n4item_text( item_ref ),
"Corresponding Number:",
buf, (char *)0 );
return 0;
}
main(){
int w_ref;
w_ref=w4define( 4,10, 7,18 );
w4clear(-1);
n4("Three");
n4action( display_info );
n4int_save( 3 );
n4("Five");
n4action( display_info );
n4int_save( 5 );
n4("Eight");
n4action( display_info );
n4int_save( 8 );
n4activate( w_ref );
w4exit( 0 );
}
-188-
n4int_save
Использование void n4int_save( int save_value )
Описание Сохраняет целое значение, соответствующее последнему
определенному пункты меню в текущем окне. Это целое
значение может быпь впоследствие восстановлено функцией
'n4int_get'.
См. также 'n4int_get', 'n4ptr_get', 'n4ptr_save'.
-189-
n4item
Использование int n4item( int row, int column, char *label )
Описание 'n4item' определяет положение пунктов меню в пределах окна.
Функция идентична функции 'n4', за исключением того, что
два параметра 'row' и 'column' определяют, где
пункт меню будет расположен в пределах окна.
Для того, чтобы успешно использовать 'n4item', все пункты
меню должны быть определены с помощью этой функции. Кроме
того, каждый вызов 'n4item' для окна должен сопровождаться
положительными параметрами 'row' и 'column'.
Параметры
row строка в пределах выбранного окна, в которой
разместится пункт меню.
column столбец внутри выбранного окна, начиная с
которого распологается пункт меню.
label адрес текста выдаваемого на экран в качестве
пункта меню.
Возврат Номер раздела меню для ссылки на созданный раздел меню.
Замечание Функция 'n4' вызывает функцию 'n4item', с параметрами
row=column=(int)-1.
Пример #include
main(){
w4define(2,2,12,40);
w4border( DOUBLE, F_WHITE );
w4clear(-1);
n4item( 3,4, "First Choice");
n4item(6,4, "Second Choice");
w4display( "The Choice was ...",
n4item_text( n4activate(-1) ),
(char *)0 );
w4exit(0);
}
-190-
n4item_text
Использование char * n4item_text( int item_ref )
Описание 'n4item_text' возвращает адрес строки текста, принадмежащей
пункту меню, определенному через параметр 'item_ref'.
n4item_width
Использование void n4item_width( int width )
Описание 'n4item_width' помогает определить внешний вид меню,
заданного в текущем окне. Это уместно только тогда, когда
для определения пунктов меню используется функция 'n4' а не
'n4item'.
'n4item_width' главным образом, чтобы задать
горизонтальному меню точно позицию-столбец. По умолчанию
имеется только один столбец для меню. Следовательно,
необходимо вызвать 'n4item_width' для горизонтального меню,
чтобы CodeBase вычислил позиции пунктов меню. Кроме этого,
посредством использования 'n4item_width' возможно иметь для
меню отдельные столбцы и/или строки.
Параметры
width задает число символов в одном столбце меню.
Полное число столбцов меню может быть
определено путем деления ширины окна на
значение параметра 'width'
Пример main(){
int w_ref;
/* Define a Horizontal Menu with 4 columns. (There are 80
columns and the number of characters per item is 20.) */
w_ref=w4define( 0,0, 1,79 );
n4horizontal();
n4item_width( 20 );
n4("One");
.
.
}
-191-
n4key
Использование void n4key( int chr, int activate,
int highlight_pos )
Описание По умолчанию можно активизировать пункт меню посредством
нажатия клавиши, соответствующей первому символу описания
этого пункта. Кроме того, когда показывается описание
пункта меню, этот символ выводится с атрибутом F_INTENCE.
Функция 'n4key' изменяет описанные установки.
Параметры
chr Нажатие клавиши с символом перемещает подсказку
к пункту меню. Если величина этого параметра
равна нулю, пункту меню не будет
соответствовать никакого символа.
activate Если величина этого параметра - TRUE -
'Истинно' (не ноль), нажатие клавиши меню
активирует соответствыющий пункт меню. Если
этот параметр равен FALSE - 'Ложно' (не ноль),
нажатие клавиши меню передвигает подсказку меню
к пункту меню.
highlight_pos Это число определяет, какой символ описания
меню будет показан с атрибутом интенсивности
F_INTENCE. Ноль соответствует первому символу,
единица второму и т.д. Если этот параметр имеет
величину '(int)-1', не будет выделенно никакого
символа.
-192-
n4key_set
Использование void n4key_set( int set_code,
int ignore_case )
Описание Функция 'n4key_set' определяет некоторые опции ввода с
клавиатуры. Эти опции относятся к текущему выбранному окну
меню.
Параметры
Наименова Величина Применение
set_code 0 Игнорировать все вводы с
клавиатуры, за исключением
клавиш со стрелками, клавиш
, , ,
, и специальных
клавиш, установленных функцией
'n4key_special'.
1 Это величина по умолчанию.
Передвигает подсказку меню на
первый пункт меню, который
соответствует нажатой клавише.
Смотри функцию 'n4key'
2 Пользователю разрешено вести
поиск пункта меню посредством
ввода искомой строки символов.
В этом случае подсказка меню
передвигается к пункту меню,
который соответствует введенной
строке символов. Совпадающие
символов выделяются
интенсивностью и миганием.
ignore_case 0 FALSE (ложно). Регистр
учитывается.
1 TRUE (истина) поумолчанию. Все
символы считаются символами в
верхнем регистре для сравнения
при поиске.
-193-
n4key_special
Использование void n4key_special( int up_key,
int exit_key, int return_start,
int return_end )
Описание Функция 'n4key_special' определяет некоторые символы
клавиатуры, которые при вводе 'заставляют' функцию
'n4activate' выполнять специальные действия. Это
специальные символы действуют с определенными после этого
окнами меню. Следовательно, каждое окно меню может иметь
свой собственный набор специальных символов.
Параметры
Наименование Применение
up_key Эта клавиша вызывает возврат из функции
'n4activate'. Однако, если 'n4activate'
вызывала себя рекурсивно, создав подменю,
возвращается только подменю низшего уровня. По
умолчанию это клавиша .
exit_key Эта клавиша вызывает возврат из функции
'n4activate'. Однако, если 'n4activate'
вызывала себя рекурсивно, создав подменю, все
функции 'n4activate' будут возвращать введенную
клавишу 'exit_key'. По умолчанию это клавиша
. В меню типа Lotus это клавиша '/'.
return_start
return_end Это диапазон клавиш, которые вызывают возврат
возврат из функции 'n4activate'. Эти клавиши
мало отличаются от клавиши 'up_key', так как
они работают только тогда, когда клавиша не
выполняет никаких других действий.
Это средство может быть использовано в
спускающихся меню, когда набор символов,
например, клавиши , может потенциально
активировать пункты меню в верхнем
горизонтальном меню.
Подсказка Числовая величина специальных клавиш находится в файле
'g4char.h'. Например, 'ALT_A' определена как 0x1e00, а
'ALT_Q' определяется как 0x1000. Заметьте, что ALT_Q <
ALT_A ! Следовательно, диапазон от ALT_A до ALT_Z не
включает ALT_Q. (Разработчики IBM PC назначили эти коды вне
порядка.)
-194-
n4lotus
Использование void n4lotus( int window_ref )
Описание Если были определены пункты меню из меню типа Lotus,
функция 'n4lotus' может быть использована для вычисления
позиции окна и его размеров. Она также определяет окна
всплывающих меню и изменяет положение, в котором выводит
сообщения функция 'n4message_do'.
Если начальная позиция (строка, столбец) окна главного меню
Lotus была определена при помощи функции 'w4define', будут
использоваться эти значения. Это переместит все меню
относительно нового начального положения.
Параметры
Наименование Применение
window_ref Этот параметр является номером указателя для
главного меню Lotus.
-195-
Пример #include
#include
main(){
int main_ref, one_ref;
w4clear(-1);
/* Position the lotus menu at the bottom of the screen. ie
(23,0) */
main_ref=w4define(23,0,-1,-1);
n4("One");
n4message("Sub Choice 1 Sub \ Choice 2");
n4action( n4sub_menu );
n4ptr_save( &one_ref );
/* Routine 'two_action' is executed if 'Two' is chosen. */
n4("Two");
n4message("Two Action");
n4action( two_action );
/* Define the sub_menu which is displayed if main menu
choice 'One' is chosen */
one_ref=w4define(-1,-1,-1,-1);
n4("Sub Choice 1");
n4action( sub_choice_1 );
n4( "Sub Choice 2" );
n4action( sub_choice_2 );
/* Turn the menus into a 'Lotus' menu */
n4lotus( main_ref );
/* Activate the menuing system */
while( n4activate( main_ref )
== (int)'/');
w4exit(0);
}
int two_action( int item_ref ){
/* ... */
return(0);
}
int sub_choice_1( int item_ref ){
/* ... */
return(0);
}
int sub_choice_2( int item_ref ){
/* ... */
return(0);
}
-196-
n4message
Использование void n4message( char * message )
Описание Функция 'n4message' определяет сообщение, соответствующее
пункту меню, который только что был создан при помощи
функции 'n4' или функции 'n4item'.
Параметры
Наименование Применение
message Это сообщение соответствует последнему
определенному пункту меню. Это сообщение будет
показано автоматически, когда указатель меню
передвигается к пункту меню.
См. также Функция 'n4message_do'. Пример дан в функции 'n4lotus'.
n4message_do
Использование void n4message_do( char * message )
Описание Функция 'n4message_do' вызывается функцией 'n4activate' для
показа строк сообщения, определенного функцией 'n4message'.
Функция 'n4message_do' непосредственно выводит строку
текста в абсолютные координаты экрана, определенные целыми
переменными 'v4menu_row' и 'v4menu_col'. По умолчанию, эти
переменные имеют величины 24 и 0, соответственно. Если
строка не доходит до края экрана, она будет дополнена
пробелами. Если величина указателя 'message' равна '(char
*)0', то строка 'v4menu_row' начиная с 'v4menu_col' будет
заполнена пробелами.
Параметры
message Это указатель на строку сообщения
-197-
n4parm
Использование void n4parm( int new_parm_data )
Описание 'n4parm' переустанавливает целочисленный параметр по
умолчанию передаваемый функции 'n4action' или 'n4reaction'.
Иначе, если нет 'action' или 'reaction' функции, 'n4param'
устанавливает значение которое будет возвращено функцией
'n4activate' в случае выбора соответствыющего пункта меню.
Целая величина 'new_parm_data' будет соответствовать
последнему пункту меню определенному функциями 'n4' или
'n4item'. По умолчанию это значение равно номеру ссылки
пункта меню для последнего определенного пункта меню.
Пример #include
static char *menu_data[2] = { "One", "Two" };
main(){
int i;
w4define( 3,3, 6,10 );
w4border( DOUBLE, F_WHITE );
w4clear( -1 );
for( i=0; i<2; i++){
n4( menu_data[i] );
n4parm( i );
}
i=n4activate( -1 );
w4display( "Selected Item", menu_data[i],
(char *)0 );
w4exit( 0 );
}
-198-
n4ptr_get
Использование void * n4ptr_get( int item_ref )
Описание 'n4ptr_get' возвращает ссылку которая ранее была сохранена
функцией 'n4ptr_save'. Если ссылка не была сохранена то
функция 'n4ptr_get' возвращает ссылку на ноль.
Параметры
'item_ref' Номер пункта меню, соответствующего
возвращаемому целому.
См. также 'n4ptr_save', 'n4int_save', 'n4int_get'.
Пример #include
struct quizz{
char question[25];
char answer[20];
} quizz_dat[] =
{
{ "Seven plus five ?", "Twelve"}
{ "Six times Seven ?", "Forty Two"}
{ "Forty divided by ten ?", "Four"}
};
int answer( int );
int answer( int item_ref){
struct quizz *saved_ptr;
saved_ptr=n4ptr_get( item_ref );
w4display( "Quizz Rezult", "Question:",
saved_ptr->question,
"Ansver:", saved_ptr->answer, (char *)0 );
return 0;
}
main(){
int w_ref, i;
w_ref= w4define( -1,-1, -1,-1 );
w4border( PANEL, F_GREEN );
w4clear( -1 );
for ( i=0; i<3; i++){
n4( quizz_dat[i].question );
n4action( answer );
n4ptr_save( &quizz_dat[i] );
}
n4calc( w_ref, 4,8 ); n4activate( w_ref );
w4exit(0);
}
-199-
n4ptr_save
Использование void n4ptr_save( void *save_ptr )
Описание Сохраняет указатель, соответствующий последнему
определенному элементу меню текущего окна. Этот указатель
может быть получен впоследствие функцией 'n4ptr_get'.
Этот указатель может указывать куда угодно. Например, он
может указывать на поле структуры с дополнительными
данными.
См. также 'n4ptr_get', 'n4int_save', 'n4int_get'
n4pulldown
Использование n4pulldown( int windows_ref )
Описание Если для системы спускающихся меню были определены окна и
пункты меню, функция 'n4pulldown' может быть использована
для вычисления размеров и положения окон. Кроме того,
функция 'n4pulldown' присваивает границы (рамки),
определяет всплывающие меню, определяет главное меню как
горизонтальное и назначает специальные клавиши, обычно
определяемые при помощи функции 'n4key_special'.
Если начальная позиция (строка столбец) окна главного меню
была определена при помощи функции 'w4define', эти
координаты соответствуют верхнему левому углу спускающегося
меню. В противном случае спускающееся меню будет находится
в координатах (0,0).
Параметры
window_ref это номер указателя окна для горизонтальной
полосы спускающегося меню.
-200-
Пример #include "w4.h"
#include "d4base.h"
static int do_command(int), do_display( int item_ref );
main(){
int horizontal_ref, sub_one, sub_two;
char no_flds[8];
w4clear(-1);
/* Open the database */
if( d4use("d4learn.dbf")<0)
w4exit(1);
/* Calculate some display information */
c4ltoa( (long)f4num_fields(),
no_flds, 6);
no_flds[6]='\0';
/* Define the horizontal menu bar */
hurizontal_ref=w4define(-1,-1, -1,-1);
/* Define the main menu item */
n4( "Position Database");
n4reaction( n4sub_menu );
n4ptr_save( &sub_one );
n4("Display");
n4reaction( n4sub_menu );
n4ptr_save( &sub_two );
/* Define the 'Position Database' sub-menu */
sub_one=w4define(-1,-1,-1,-1);
n4("First Record");
n4action( do_command );
n4("Last Record");
n4action( do_command );
n4("Next Record");
n4action( do_command );
/* Define the 'display' sub-menu */
sub_two = w4define(-1,-1,-1,-1);
n4("Database Record");
n4action( do_display );
n4ptr_save( f4record() );
n4("Number of Fields");
n4action( do_display );
n4ptr_save( no_flds );
/* Turn the menus into a pulldown menu. */
n4pulldown( horizontal_ref );
/* Activate the menuing pulldown system */
-201-
w4cursor(-1,-1);
n4activate( horizontal_ref );
w4cursor(-23,0);
w4close( horizontal_ref);
w4close( sub_one );
w4close( sub_two );
w4exit(0);
}
int do_command( int item_ref ){
switch( *n4item_text(item_ref) ){
case 'F':
d4top();
break;
case 'L':
d4bottom();
break;
case 'N':
d4skip(1L);
break;
}
return(0);
}
int do_display( int item_ref ){
w4display( n4ptr_get(item_ref), (char *)0 );
return(0);
}
-202-
n4reaction
Использование void n4reaction( (ACTION *)reaction_routine )
Описание Функция 'n4reaction' определяет функцию реакции для пункта
меню, который только что был определен при помощи функции
'n4' или функции 'n4item'. Функция реакции выполняется,
когда подсказка меню переходит к соответствующему пункту
меню - посредством нажатия клавиш со стрелками или нажатия
клавиши с соответствующим символом. Функция 'n4activate'
используется как функция реакции для автоматического
активирования спускающейся части системы спускающихся меню.
Функция 'n4reaction' отличается от функции 'n4action'
только тем, что она определяет функцию 'реакции', а не
функцию 'действия'.
См. также Введение в главу 'Описание функций меню', 'n4action'
Пример n4("Menu Option With a Reaction Routine");
n4reaction( reaction_routine_name );
n4refresh
Использование void n4refresh( int window_ref )
Описание Функция 'n4refresh' вызывается функцией 'реакции' или
функией 'действия', при изменении атрибута показа или метки
пункта меню. Данная функция меню 'приказывает' функции
'n4activate' обновить окно возврата функции реакции или
функции действия.
Параметры
window_ref Идентификатор обновляемого окна.
-203-
n4search
Использование int n4search( char * descr_ptr )
Описание Выполняет поиск указанного описания пункта меню в выбранном
окне.
Параметры
descr_ptr Указатель на описание пункта меню. Функция
'n4search' ищет этот пункт меню в выбранном
окне.
Возврат Величина Значение
-1 Описание не обнаружено.
>=0 Номер указателя пункта меню, чъе описание
совпадает с 'descr_ptr'.
Замечание Функция 'n4search' вызывается функцией 'g4menu' таким
образом, что начально активный пункт меню соответствует
первоначальному содержимому области ввода.
После вызова функции 'n4search' возвращенный номер
указателя пункта меню часто используется в качестве
параметра для функции 'n4start_item'.
-204-
n4skip_over
Использование int n4skip_over( int menu_ref, int flag )
Описание Функция 'n4skip_over' определяет, может ли подсказка меню
быть перемещена к определенному пункту меню. Это
применяется для тех пунктов меню, которые являются не
выбором, а просто текстом. Данная функция также
используется для временного выключения пункта меню.
Параметры
Наименование Применение
menu_ref Номер указателя пункта меню.
flag TRUE - Истина (не ноль), если нужно пропустить
указанный пункт меню, и FALSE - Лож (ноль),
если необходимо использовать указанный пункт
меню.
Возврат Возвращается установленная до этого величина флага.
n4start_item
Использование void n4start_item( int start_item_ref )
Описание По умолчанию, подсказка меню начинается на первом пункта
меню. Функция 'n4start_item' используется для изменения
этой установки по умолчанию, то есть она может
устанавливать подсказку меню на любом пункте меню.
Так как Code Base знает, какое окно соответствует номеру
указателя пункта меню, не имеет значения какое именно окно
выбрано.
Параметры
start_menu_ref номер пункта меню на котором высвечивается
первоначальная подсказка меню.
-205-
n4sub_menu
Использование int n4sub_menu( int item_ref )
Описание 'n4sub_menu' используется как и 'action' или 'reaction'
функции для того, чтобы помочь вам построить под-меню.
Если 'n4sub_menu' вызвана функцией 'n4activate' программа
выполняется следующим образом:
1. Пользователь вызывает 'n4activate' для
активирования главного меню.
2. 'n4sub_menu' выполняется, как только указатель
меню передвинется (reaction) на соответствующий
пункт меню или когда он выбирается.
3. 'n4sub_menu' вызывает 'n4ptr_get' для получения
указателя, сохраненного пользователем. Этот
указатель должен ссылаться на целое
соответствующее номеру указателя окна под-меню.
'n4sub_menu' использует вызов 'n4activate' с
номером указателя окна в качестве параметра.
Это активирует под-меню.
Пример #include
main(){
int sub_ref, main_ref, rc;
main_ref=w4define( 2,2, 5,15 );
w4border( DOUBLE, F_WHITE );
w4clear( -1 );
n4("Sub Menu");
n4action( n4sub_menu );
n4ptr_save( &sub_ref );
n4("Number Two");
n4parm( 2 );
sub_ref=w4define( 4,4, 6,16 );
w4border( SINGLE, F_WHITE );
n4( "Menu One" );
n4parm(-1);
rc=n4activate( main_ref );
.
.
.
}
-206-
Сервисные функции
Сервисные функции представляют собой универсальные подпрограммы
низкого уровня.
u4error
Использование int u4error( int error_num, char * string1,
char * string2, ...,
char * stringN, char * 0)
Описание Функция 'u4error' вызывается всегда, когда происходит
ошибка. Как правило, информация об ошибке посылается в окно
по умолчанию. Однако, если функция была перекомпилирована с
переключателем 'NOIO', информация об ошибке будет
выдаваться на стандартный выход. Информация об ошибке
включает в себя номер ошибки, информацию, соответствующую
данному номеру ошибки и все дополнительные строки
параметров.
Более подробная информация по обработке ошибок содержится в
приложении 'Сообщения об ошибках'
Параметры
Необходим только параметр 'error_num' и последний параметр
'(char *)0'. Имеется необязательный список
строк описания ошибки. Параметр '(char *)0'
является указателем на конец списка
дополнительных параметров.
Возврат В случае возникновения критических ошибок, функция
'u4error' выходит в операционную систему. Для менее
серьезных ошибок функция 'u4error' ожидает нажатия клавиши
и возвращает код нажатой клавиши.
-207-
u4file_first
Использование int u4file_first( char * pattern,
char * first_match )
Описание Функция 'u4file_first' работает с функцией 'u4file_next'
для получения списка имен файлов, соответствующих
определенной спецификации файлов со специальными символами
'DOS'. При использовании специальных символов, специальный
символ '*' соответствует любой последовательности символов,
а специальный символ '?' соответствует любому одиночному
символу названия файла. Более подробная информация по
спецификации файлов со специальными символами содержится в
руководстве по 'DOS' (команда dir).
Функция 'u4file_first' используется для получения первого
совпадающего имени файла. Последующие совпадающие имена
файлов могут быть получены при помощи функции
'u4file_next'.
Параметры
Наименование Применение
pattern Шаблон(образец) DOS файла который может
содержать специальные символы. Версия Code Base
для Unix/Xenix в настоящее время игнорирует
параметр 'pattern'.
first_match указатель на как минимут 14-ти символьный
массив. Функция 'u4file_first' копирует первое
совпадающее имя файла в этот массив.
Возврат Функции 'u4file_first' и 'u4file_next' соблюдают правила
возврата для прерывания DOS 0x21, типа 0x4E и 0x4F.
Величина Значение
0 Успешное выполнение
2 Неправильная спецификация файла
18 Совпадающих файлов нет
Переносимость Эта подпрограмма не поддерживается для UNIX.
Пример for( rc=u4file_first("*.*", ptr); rc==0;
rc=u4file_next(ptr) ){
w4( w4row()+1, 0, ptr); /* Display file name */
}
-208-
u4file_next
Использование int u4file_next( char *next_match )
Описание Функция 'u4file_next' используется вместе с 'u4file_first'
для нахождения следующего, совпадающего с шаблоном, имени
файла.
Параметры
next_match указатель - как минимум, 14-ти символьный
массив. Следующее совпадающее имя файла
копируется в эту область данных.
Переносимость Эта подпрограмма не поддерживается для UNIX.
Возврат Величина Значение
0 Успешное выполнение
18 Совпадающих файлов больше нет
-209-
u4lock
Использование int u4lock( int dos_file, long offset,
long num_bytes, int do_wait )
Описание Функция 'u4lock' блокирует сегмент любого файла. Если
величина параметра 'do_wait' - TRUE (истина) (не ноль),
функция ожидает блокировки информации. В противном случае
функция завершается сразу же.
Параметры
Наименование Применение
dos_file handle блокируемого файла.
off_set Номер байта, от начала файла, где нужно начать
блокирование. Смещение, равное '(int)0',
соответствует первому байту файла.
num_bytes Количество байт, которые будут блокированы.
do_wait Ожидать блокирования, если величина этого
параметра не ноль /TRUE/.
Возврат
Величина Значение
0 Успешное выполнение или однопользовательская
среда
-1 Ошибка
-2 Информация блокирована другим пользователем
-210-
u4name_char
Использование int u4name_char( char test_char )
Описание Функция 'u4name_char' возвращает TRUE (истино), если
тестовый символ является правильным символом для имени
файла. В противном случае данная функция возвращает FALSE
(ложно).
Возврат Ноль соответствуе FALSE (лож), другие величины
соответствуют TRUE (истина).
Пример if( ! u4name_char( name_chr ) )
printf("\n Illegal Name Chr: %c",
name_chr );
-211-
u4name_full
Использование void u4name_full( char * result, char *name,
char * extension )
Описание Добавляет к имени файла расширение по умолчанию. Если имя
уже имеет расширение, Функция возвращает начальное имя.
Параметры
Наименование Примечание
result Имя файла, дополненное расширением, копируется
в 'result'. Для этого параметра может
потребоваться до 68 байт памяти.
name Это оканчивающееся нулем строка, представляющая
собой первоначальное имя файла.
extension Расширение имени файла, состоящее из трех
символов. Перед ним может стоять точка (но это
не обязательно).
Пример n4name_full( name, "C:\\FIRST", ".EXT" );
-212-
u4name_part
Использование void u4name_part( char * result, char * name,
int give_dir, int give_ext )
Описание Функция берет имя файла и удаляет его часть - каталог и/или
расширение.
Параметры
Наименование Применение
result Этот параметр указывает на область памяти, где
должно быть помещено полученное имя файла.
name Начальное имя файла.
give_dir Величина этого параметра равна TRUE (не ноль),
если каталог должен входить в получающееся имя
файла. В противном случае величина этого
параметра должна быть FALSE (ноль).
give_ext Величина этого параметра равна TRUE (не ноль),
если расширение имени файла должно входить в
получающееся имя файла. В противном случае
величиной этого параметра должно быть FALSE
(ноль).
-213-
u4open
Использование int u4open( char * file_name, int code )
Описание Функция 'u4open' открывает файл.
Параметры
Наименование Применение
file_name Имя открываемого файла.
code Этот код определяет способ открытия файла
0 Открыть: Файл уже должен существовать.
1 Создать: Файла еще не должно существовать.
2 Создать: Существующий ранее файл уничтожается.
4 Исключительное открытие: Другие программы и
пользователи не могут открыть этот файл.
Вы можете добавить 8 к этим кодам для получения
эквивалентных кодов исключающик ошибки. Если
произойдет ошибка, и если к этим кодам было
добавлено 8, то 'u4error' не будет вызываться
для сообщения об ошибке. Заметим, что -1 будет
возвращено функцией если произошла ошибка.
Например, код 9 создать файл если он не
существует.
Возврат Величина Значение
>=0 handle открытого файла.
-1 ошибка.
Пример #include
int main(){
int h;
h=u4open("new_file", 2);
}
-214-
u4unlock
Использование int u4unlock( int dos_file, long offset, long
num_bytes )
Описание разблокирует сенмент любого файла. Этот сегмент должен
предварительно заблокирован.
Параметры
Наименование Применение
dos_file handle соответствующий файлу который будет
разблокирован
off_set Номер байта от начала файла, где нужно начать
разблокирование. Смещение, равное '(int)0',
соответствует первому байту файла.
num_bytes Количество байт, которые будут разблокированы.
Возврат Величина Значение
0 Успешное выполнение
-1 Ошибка.
Замечание Функция всегда возвращает успешное выполнение в
однопользовательской среде.
-215-
Функции работы с окнами
Функции работы с окнами используются для вывода и ввода информации на
и с экрана дисплея. Эти функции используются также для вывода
информации на каналы вывода (handl). Функции работы с окнами часто
используются функциями чтения и функциями работы с меню.
Экранные окна имеют обозначенную прямоугольную область на экране и
символ атрибута. Окна могут также иметь границы (рамки) и заголовки.
Они могут быть всплывающими и могут иметь в памяти копию своего
содержимого для восстановления. Все окна имеют текущее положение
(строка:столбец).
Функции работы с окнами позволяют удобно выводить поля базы данных и
различные типы данных Си: (long), (double), (int) и (char). Имеются
также функции для манипуляции курсором, центрирования текста и
очищения окон.
Одновременно может быть выбрано только одно окно. Многие функции
работы с окнами, например функция 'w4popup', определяют характеристики
выбранного окна. Кроме того, функции ввода, например, функция 'w4int'
используют выбранное окно.
Несмотря на то, что можно посылать вывод в окно после того, как оно
выбрано, обычно лучше всего сначала вызывать функцию 'w4activate'. Это
позволяет работать со всплывающими окнами, автоматически создавать
рамки и деактивировать окна.
При записи в окно, верхний ряд (строка) и крайний левый столбец имеют
номер ноль.
На дискете с примерами, в файле 'w4example.c' содержится много
примеров работы программ управления окнами.
-216-
Некоторые сведения об окнах.
Как правило, пользователь показывает информацию в окне, которое
последним было активированно при помощи функции 'w4activate'.
Ограничений на выбор любого окна и показ в нем информации не
существует. Однако, если они случайно возникнут, функция 'w4activate'
может не восстановить экран как ожидалось.
Code Base запоминает порядок, в котором активизируются окна. Можно
заново активизировать окно при помощи фунуции 'w4activate', без его
деактивации. Когда окно активизируется заново, оно становится
последним активным окном. Если последнее активное окно является окном
памяти (см. функция 'w4memory'), его содержимое сохраняется в памяти,
когда активизируется или переактивизируется заново (повторно) другое
окно. Следовательно, окно может быть восстановлено из памяти, если
окно активизируется заново (повторно) некоторое время спустя.
Когда деактивируется всплывающее окно, основной текст под ним
восстанавливается. В противном случае Code Base попытается
восстановить экран посредством повторной активиции всех активных окон
в том порядке, в котором они первоначально активировались. Это будет
должным образом работать только в том случае, если все активируемые
окна будут являться окнами памяти.
Замечания:
1. Несколько окон могут быть активны одновременно. Окно активизируется
функцией 'w4activate'.
2. Имеется только одно 'последнее активизированное' окно. Обычно,
программист выводит информацию на 'последнее активизированное' окно.
3. Имеется только одно выбранное окно. Окно выбирается функцией
'w4select'.
4. Выбранное окно не обязательно должно быть активным окном. Оно может
быть любым окном.
-217-
Пример использования функций управления окнами.
#include
main(){
int window_ref;
/*Define the window */
window_ref=w4define(10,30, 14,50 );
/* set window's attribute and border */
w4attribute( B_BLINK | F_WHITE );
w4border( DOUBLE, F_BLUE );
/* Activate the window */
w4activate( window_ref );
/* Centre the output on row 1 */
w4centre( 1, "Hello World" );
/* Wait for a character to be pressed */
g4char();
/* Deactivate the window */
w4deactivate( window_ref );
/* Free the window's allocated memory */
w4close( window_ref );
w4exit(0);
}
-218-
w4
Использование void w4( int row, int column, char * str )
Описание выводит строку заканчивающуюся нулем в указанных
координатах (стровка, столбец).
Параметры
Наименование Применение
row Строка вывода
column Столбец вывода
str Выводимая строка
Пример #include
main(){
int w_ref;
w_ref=w4define( 5,10, 11,40 );
w4border( SINGLE );
w4activate(w_ref);
w4( 1,1, "Display at row one and column one!");
w4( 2,1, "Press a key to continue ...");
g4char();
w4exit(0);
}
-219-
w4activate
Использование void w4activate( int window_ref )
Описание Если окно является текущим активным окном, ничего не
происходит.
В противном случае функция 'w4activate' веберет и покажет
окно. Если окно до этого было активизировано и копия окна
была сохранена в памяти (см функцию 'w4memory'), то будет
востановлена эта копия из памяти. Кроме того, если окно
является всплывающим окном, базовая информация (текст под
окном) экрана будет сохранена.
Если окно не было до этого активировано, или если это окно
не является окном памяти, оно очищается.
Параметры
window_ref номер окна, которое активируется.
Пример w4activate( w4define( 5,10, 20,70 ) );
-220-
w4attribute
Использование w4attribute( long attribute )
Описание Каждый раз, когда вывод посылается непосредственно в окно
вывода на IBM PC или совместимом компьютере, этот вывод
имеет соответствующий атрибут символов. Функция
'w4attribute' устанавливает какой атрибут символов
используется дла выбранного окна. Атрибут символов имеет
следующий формат:
Номер бита Значение
0 Цвет символа голубой
1 Цвет символа зеленый
2 Цвет символа красный
3 Цвет символа интенсивный
4 Задний фон голубой
5 Задний фон зеленый
6 Задний фон красный
7 Задний фон мигающий
Файл заголовка 'w4.h' определяет атрибуты для стандартных
цветов F_BLUE, F_GREEN, F_RED, F_INTENSE, F_WHITE, B_BLUE,
B_GREEN, B_RED, B_BLINK и B_WHITE.
Пример w4attribute( F_WHITE | F_INTENSE ); /* Intense White */
-221-
w4border
Использование void w4border( char * box_chars,
long attribute )
Описание Граници текущего окна устанавливается определенными
символами рамки. Эта рамка показывается внутри границ окна.
Нулевым рядом окна становится ряд находящийся сразу же под
верхним рядом рамки, а нулевым стобцом становится столбец
расположенный правее левого столбца рамки.
Параметры
Наименование Применение
box_char Восьми-смвольная строка, которая образует
символы рамки. Они идут в следующем порядке:
Вершина
Дно
Левая сторона
Правая сторона
Верхний левый угол
Верхний правый угол
Нижний левый угол
Нижний правый угол
Code Base сохраняет указатель на строку
'box_char'. Следовательно, параметр 'box_char'
должен быть статической переменной памяти,
константой или быть объявленным в 'main'
подпрограмме.
attribute Атрибут символов бордюра.
Замечание Файл заголовка 'w4.h' определяет некоторые строки для
обычных рамок: SINGLE, DOUBLE, DOUBLE_TOP и PANEL. В этом
файле определены также некоторые атрибуты.
Пример w_ref = w4define( 0,0, 24,79 );
w4border( SINGLE, F_WHITE );
w4activate( w_ref );
-222-
w4box
Использование void w4box( char * box_chars,
int start_row, int start_col,
int end_row, int end_col )
Описание Функция 'w4box' рисует рамку в выбранном окне. Используются
атрибуты символов окна.
Параметры
box_chars См. функцию 'w4border'.
start_row
start_col
end_row
end_col Указывают размеры окна.
Пример /* Outline the complete screen with a box*/
w_ref=w4define(0,0, 24,79);
w4box( SINGLE, 0,0, 24,79);
w4close(w_ref);
w4centre
Использование void w4centre( int row, char *str )
Описание Выводит строкы в центре указанной строки выбранного окна.
Параметры
Наименование Применение
row Строка вывода
str Выводимая строка
-223-
w4clear
Использование void w4clear( int row )
Описание Очищает выбранное окно начиная с указанной строки. Кроме
того, текущая позиция (строка, столбец) изменяется на
(строка, 0).
Если величина 'row' равна '(inr)-1', очищается весь экран а
текущая позиция (строка, столбец) не изменяется.
w4close
Использование void w4close( int window_ref )
Описание Освобождает всю память, выделенную для окна. Если окно
закрывается, его больше не существует. Закрытие окна не
влияет на экран. Если необходимо, можно деактивировать окно
перед его закрытием.
Если закрываемое окно было до этого выбрано, то
автоматически выбирается последнее активированное окно.
Если последнего активированого окна нет, выбранное окно
должно быть определено при помощи другой функции работы с
окнами, например 'w4select'.
Параметры
window_ref Номер указателя закрываемого окна.
w4col
Использование int w4col()
Описание Возвращает текущий столбец.
-224-
w4cursor
Использование void w4cursor( int row, int col)
Описание Курсор перемещается в указанную позицию выбранного окна.
Если величина одного параметра отрицательна курсор изчезает
с экрана.
Вызов 'w4cursor' не влияет та текущее положение (строка,
столбец) внутри выбранного окна.
Внимание! Некоторые компьютеры 'зависают', если курсор не находится
на экране перед тем, как программа выходит. Смотри 'w4exit'
и пример приводимый ниже.
Пример /* Folowing is the source code for 'w4exit()' */
w4exit( int rc ){
w4select( v4default_window );
w4cursor(23,0);
exit(rc);
}
w4cursor_size
Использование void w4cursor_size( int start_size, int end_size )
Описание Устанавливает размер курсора.
Параметры
Наименование Применение
start_size Верхняя граница изображения курсора. Эта
величина находится в диапазоне 0 и 'end_size'.
end_size Нижняя граница изображения курсора. Эта
величина находится в диапазоне 0 и 7.
Внимание! Эта функция специфична для IBM PC и свместимых с ними.
-225-
w4deactivate
Использование void w4deactivate( int window_ref )
Описание Если окно является активным выбранным всплывающим окном, то
оно изчезает с экрана и восстанавливается основной текст
(под ним).
В противном случае, экран восстанавливается посредством
повторной активизации других окон. Функция 'w4deactivate'
использует тот факт, что, посредством вызова функции
'w4memory', окна могут сохранять копию своего содержимого в
памяти. Любое активированное до этого окно, чье содержимое
было сохранено, будет активированно заново (повторно). Эти
окна будут повторно активированны в том порядке, в котором
они изначально активировались. Если имеются измененные
окна, для которых копий в памяти не было, то экран нельзя
будет восстановить.
После деактивации окна, автоматически выбирается последнее
активированое окно.
Параметры
window_ref Номер указателя окна, которое деактивируется.
Пример /* Define a bordered, popup window for the screen's left
side */
w_ref= w4define(0,13, 24,79);
w4border( DOUBLE, F_WHITE );
w4popup();
w4activate(w_ref);
.
.
w4deactivate(w_ref);
w4close(w_ref);
-226-
w4define
Использование int w4define( int top_row, int left_columd,
int bottom_row, int right_column)
Описание Функция 'w4define' создает окно. Вызов этой функции
необходимо сделать перед вызовом почти всех программ из
модулей 'чтение', 'окно' или 'меню'.
После того, как окно создано, оно становится выбраным.
Параметры определяют размеры окна. Координаты являются
относительными к верхней и левой стороне экрана. Строка 0
является верхней строкой экрана, а столбец 0 является
крайним левым столбцом экрана.
Функция возвращает новер указателя нового окна.
Замечание 1 Функция 'd4init' вызывает функцию 'w4define' для создания
окна по умолчанию с номером указателя окна, который
содержится во внешней целой переменной 'v4default_window'.
Это окно занимает весь экран. Если функция 'w4init' не была
вызвана, фынкция 'w4define' создаст окна по умолчанию.
Пример #include
main(){
int error_window, main_window, top_window, bottom_window;
error_window=w4define( 11,25,16,55 );
w4popup();
w4border( DUOBLE, F_RED );
w4attribute( F_RED | B_BLINK );
main_window=w4define(0,0, 24,79);
w4memory();
top_window=w4define(0,0, 12,79);
w4memory();
w4border( SINGLE, F_WHITE );
bottom_window=w4define(13,79, 24,79);
w4memory();
w4border( SINGLE, F_WHITE );
/* and so on ...*/
-227-
w4display
Использование int w4display( char * title,
char * m1, ..., char * 0)
Описание Функция 'w4display' создает всплывающее окно и показывает в
нем строки сообщения. Окно создается такого размера, чтобы
можно было красиво разместить в нем сообщение. Когда строки
сообщения будут показаны, функция 'w4display' ожидает
нажатия клавиши пользователем. Затем всплывающее окно будет
деактивировано и закрыто.
Параметры
Наименование Применение
title Заголовок окна. Если этот параметр является
единственным, заголовок будет показан в центре
окна.
m1,m2,... Неопределенное количество строк сообщений,
которые будут показываться.
(char *)0 Необходимый параметр указывающий на конец
списка параметров.
Возврат Код нажатой клавиши.
Пример rc=w4display("Entry Error:",
"Only Blanks were Entered",
"",
"Continue (Y/N) ?",
(char *)0 );
if(rc == (int) 'n' || rc == (int) 'N')
w4exit(1);
-228-
w4double
Использование void w4double( int row, int column,
double double_value,
int len, int dec )
Описание Функция 'w4double' выводит 'double' величину.
Параметры
Наименование Применение
row строка вывода
column столбец вывода
double_value выводимая величина
len длина вывода
dec количество показываемых десятичных позиций
w4eject
Использование void w4eject()
Описание Функция 'w4eject' посылает символ перевода страницы в
текущий канал (handle) вывода окна. Кроме того, текущее
положение (строка, столбец) устанавливается как (0,0).
-229-
w4exit
Использование void w4exit( int exit_rc )
Описание Функция помещает курсор в положение (23,0) и затем выходит
при помощи вызова стандартной функции выхода 'exit' с кодом
возврата 'exit_rc'.
Функция 'w4exit' необходима, так как некоторые компьютеры
не обрабатывают выход, когда при выходе программы курсор не
находится на экране.
Внимание! Не используйте функцию 'w4exit', если размеры окна по
умолчанию были изменены, или если окно по умолчанию
закрыто.
w4field
Использование void w4field( int row, int column, long field_ref )
Описание Функция 'w4field' показывает содержимое поля базы данных.
Параметры
Наименование Применение
row Строка вывода
column Столбец вывода
field_ref Номер указателя показываемого поля
-230-
w4handle
Использование int w4handle( int hand )
Описание Функция 'w4handle' определяет канал, который должен
соответствовать выбранному окну. Последующий вывод от
функций управления окнами будет зависываться в этот канал.
Если канал соответствует файлу, проверьте, чтобы этот файл
был открыт в двоичном режиме.
Ввод данных и ввод посредством меню разрешен только в таком
окне, которому соответствует выходной канал '(int)-1'.
Параметры
Параметр 'hand' может принемать следующие значения:
Величина Значение
-2 Не изменять канал. Просто возвратить значение
текущего канала.
-1 Послать выход непосредственно в видео-память.
0 Стандартный канал ввода.
1 Стандартный канал вывода.
2 Стандартный канал вывода ошибки.
3 Стандартный вспомогательный (auxiliary) канал.
4 Стандартный принтер
>=5 Эти каналы обычно соответствуют открытым
файлам.
Примечание Если выдача направляется на файловое устройство, текущая
строка может стать больше 32667. Однако когда выводится
большое число строк без вызова 'w4eject' или 'w4position'
для переустановки текущего номера строки, принимая во
внимание вызов 'w4position_set'. Это приведет к ошибке
переполнения целого после выдачи 32667 строк.
Code Base считает, что ширина окна совпадает с шириной
устройства выдачи. Если длина выдаваемой строки превысит
ширину окна, то текущий столбец вывода будет занулен, а
строка увеличина на единицу. Для предотвращения этого,
сделайте ширину окна достаточно большой.
Возврат Величину предидущего канала вывода.
См. также 'w4position', 'w4position_set'
-231-
w4heigh
Использование int w4heigh( int new_height )
Описание устанавливаем и возвращает количество строк в выбранном
окне.
Вызов функции 'w4heigh' не влияет на то, что было показано
на экране. Однако, вся память для всплывающего окна или
сохраненного экрана будет освобождена и перераспределена.
Следовательно, лучше избегать изменения высоты окна, когда
выбранное окно является активным.
Новая высота определяет только строки внутри бордюра окна.
Параметры Если параметр 'new_heigh' имеет величину больше нуля, то
эта величина становится новым количеством строк в окне.
Иначе высота окна не меняется Вызов 'w4heigh' с параметром
(int)-1 хороший способ определения высоты текущего окна.
Возврат Возвращает высоту текущего окна.
-232-
w4int
Использование int w4init( int num_window, int num_get,
int num_menu )
Описание Если эта функция не вызывается непосредственно то она будет
автоматически вызвана функциями 'd4init', 'w4define' и
'w4clear'. Следовательно, если 'w4init' вызывается явно то
она должна быть вызвана перед вызовом других функций Code
Base.
Посредством вызова функции 'w4init' для определения
количества окон, областей ввода (чтения) и количества
пунктов меню достигается уменьшение расходов на
использование памяти и ее фрагментацию. Даже если
вызывается функция 'w4init', Code Base все-таки будет
распределять лишнюю дополнительную память для добавочных
окон, областей ввода или пунктов меню, как требуется.
Количество одновременно используемых окон 'num_window'
равняется количеству раз, которое вызывается 'w4define'
минус количество раз, которое вызывается функция 'w4close',
плюс одно окно по умолчанию.
Количество одновременно используемых областей 'num_get'
ввода определяется количеством вызовов программ
инициализации ввода (Get Initialize routines). Память
области ввода обычно освобождается автоматически при помощи
функции 'g4read'.
Аналогични, количество одновременно используемых пунктов
меню 'num_menu' зависит от количества вызовов функций 'n4',
'n4item'. Память, выделенная для пунктов меню, обычно
освобождается при закрытии окна.
По умолчанию функция 'd4init' вызывает функцию 'w4init' со
следующими параметрами: w4init( 5, 0, 0 );
По умолчанию функции 'w4define' и 'w4clear' вызывают
функцию 'w4init' со следующими параметрами: w4init( 10, 0,
0 );
Возврат
Величину Значение
0 Успешное выполнение.
-1 Нет памяти. Если только функция 'u4error' не
была изменена, эта критическая ошибка приводит
к завершению программы.
-233-
w4int
Использование void w4int( int row, int column,
int int_value, int len )
Описание Выводит целое число.
Параметры
Наименование Применение
row Строка вывода
column Столбец вывода
int_value Выводимое число
len Длина вывода
Пример w4( w4row()+1, 2, "Amount:" );
w4int( w4row(), w4col(), i_amount, 6);
w4long
Использование void w4long( int row, int column,
long long_value, int len )
Описание Выводит длинное целое число.
Параметры
Наименование Применение
row Строка вывода
column Столбец вывода
int_value Выводимое число
len Длина вывода
Пример w4long( ++r, c, l_value, 8);
-234-
w4memory
Использование void w4memory()
Описание Функция 'w4memory' сохраняет в памяти копию текущего окна.
Следовательно, когда окно повторно активированно, его
изображение может быть восстановленно из памяти. Кроме
того, если на выбранное окно накладывается другое окно,
которое затем деактивируется, содержимое выбранного окна
может быть показанно заново (повторно).
Подсказка Когда активируются (в случайном порядке) раэличные окна,
имеющие разные размеры, то будет лучше всего использовать
функцию 'w4memory', чтобы можно было восстанавливать
предыдущее содержимое окон.
См. также w4deactivate()
w4num
Использование void w4num( int row, int column,
char * str, int num)
Описание Выводит строку указанной длины.
Параметры
Наименование Применение
row Строка вывода
column Столбец вывода
str Выводимая строка
num Число выводимых символов.
Пример /* Output five characters */
w4num( r,c, str, 5 );
-235-
w4num_att
Использование void w4num_att( int row, int column,
char *str, int num,
long attribute )
Описание Функция аналогична 'w4num', за исключением того, что
функция 'w4num_att' имеет дополнительный параметр. Этот
параметр - 'attribute' определяет атрибут показываемой
строки.
Пример w4attribute()
w4out
Использование void w4out( char * str )
Описание Выводит строку 'str' в текущую позицию (строка, столбец)
окна.
w4popup
Использование void w4popup()
Описание Функция 'w4popup' превращает выбранное окно в всплывающее
окно. Это означает, что, когда окно активируется а затем
деактивируется, текст под окном восстанавливается.
Замечание Вызовы функций 'n4lotus', 'n4pulldown', 'n4calc' и
'n4get_calc' автоматически превращают соответствующие окна
в всплывающие.
-236-
w4position
Использование void w4position( int row, int column )
Описание Устанавливает текущее положение (строка, столбец).
Если текущее окно имеет канал вывода, будет отправлено
необходимое количество символов возврата каретки, прогона
строки, перевода страницы и пробела для помещения
соответствующего файла или устройства в новое текущее
положение.
Функция 'w4position' не влияет на положение курсора.
Параметры
Наименование Применение
row Новое положение строки вывода.
column Новое положение столбца вывода.
См. также 'w4handle', 'w4position_set'
w4position_set
Использование void w4position_set( int row, int column )
Описание Устанавливает текущую позицию (строка столбец). Ничего
другого не делает.
Параметры
Название Использование
row Новая текущая строка
column Новое значение текущего столбца
См. также 'w4handle', 'w4position'
Пример #include
void line_skip( int n ){
/* Assume the current window's output handle is to a file
or to a printer. */
w4position_set(0,0);
w4position( n, 0 );
}
-237-
w4read
Использование void w4read( int row, int column,
char *char_buffer, int len_data)
Описание Считывает информацию из видео памяти. Эта информация
находится в формате видео-памяти - (символ, атрибут).
Параметры
Наименование Применение
row Строка экрана относительно верхней части
экрана.
column Столбец экрана относительно левой стороны
экрана.
data_buffer Указатель на буфер в который помещаются данные.
len_data Количество байт, которые будут считаны. Эта
величина равна удвоенному колличествы читаемых
с экрана символов, так как атрибуты символов
тоже читаются.
Переносимость Данная функция недоступна в версии Code Base для
Unix/Xenix.
Пример static char scr_data[25*80*2]
char *read_screen(){
/* Read the entire screen */
w4read( 0,0, scr_data, sizeof( scr_data) );
return(scr_data);
}
-238-
w4read_window
Использование void w4read_window( int window_ref,
char *ptr )
Описание Читает символьную информацию, из видео памяти в пределах
указанного окна. Эта информация читается в формате (символ,
атрибут). Если окно имеет рамку, информация рамки на
считывается.
Параметры
Наименование Применение
window_ref Номер указателя окна, которое читается.
prt Указатель на область памяти где будет хранится
считанная информация. Проверьте наличие
достаточного места.
Переносимость Функция недоступна в версии Code Base для
Unix/Xenix.
Пример static char window_info[200];
read_example_one(){
int w_ref;
w_ref=w4define( 2,2, 11,11 );
/* REad the 200 bytes of window information */
/* Note: (11-2+1)*(11-2+1) is 100
characters. This become 200 bytes at 2 bytes per character
*/
w4read_window( w_ref, window_info );
w4close(w_ref);
}
read_example_two(){
int w_ref;
w_ref-w4define( 1,1, 12,12 );
w4border( SINGLE, F_WHITE );
/* Read the sane 200 bytes of window information as in
'save_example_one'. The border information is not read. */
w4read_window( W_ref, window_info);
w4close(w_ref);
}
-239-
w4repeat
Использование void w4repeat( int row, int column,
char chr, int num_repeat )
Описание Выводит указанное число раз указанный символ.
Параметры
Наименование Применение
row Строка вывода
column Столбец вывода
chr Выводимый символ
num_repeat Количество повторение символа 'chr'.
w4row
Использование int w4row()
Описание Возвращает текущую позицию строки.
w4scroll
Использование void w4scroll( int num_lines )
Описание Выполняет скроллинг окна вниз или вверх на указанное число
строк.
Параметры
Наименование Применение
num_lines Определяет число строк прокрутки окна. Если > 0
прокручивается вверх. Если < 0 прокручивается
вниз.
Переносимость В UNIXе эта подпрограмма не работает для окон с
бордюрами.
-240-
w4select
Использование int w4select( int window_ref )
Описание Делает указанное окно текущим выбранном окном. Если
величина параметра 'window_ref' меньше нуля, текущее
выбранное окно не изменяется.
Возврат Функция 'w4select' возвращает номер указателя вубранного до
этого окна.
Пример 1 previos_ref=w4select( new_ref );
w4centre( 1, "Output Window" );
w4select( previos_ref );
Пример 2 /* Find the current window reference number */
current_ref = w4select( -1 );
w4title
Использование int w4title( int row, int col,
char *title, int attribute )
Описание Определяет строку символов, которая автоматически
показывается при активации текущего выбранного окна. В
отличие от других функций показа для окон, функция
'w4title' игнорирует наличие границ (рамки) для вычисления
положения (строка, столбец). Это делает возможным налагать
информацию заголовка на рамку.
Параметры
Наименование Применение
row Строка вывода.
col Столбец вывода.
title Указатель на строку заголовка.
attribute Атрибут показа для строки заголовка 'title'.
Внимание! Code Base сохраняет только указатель на строку заголовка.
Следовательно, указатель 'title' не должен указывать на
временную (рабочую) память. Если изменяется информация, на
которую указывает 'title', то изменяется заголовок окна.
Пример w_ref=w4define( 5,10, 10,20);
w4border( DOUBLE, F_WHITE );
/* Define a title to be centred over the top border row */
w4title( 0,-1, "Data Entry Window ", B_WHITE );
-241-
w4width
Использование int w4width( int new_width )
Описание Устанавливает и возвращает количество столбцов в
строке текущего окна.
Вызов функции 'w4width' не влияет на то, что было показанно
на экране. Однако, вся память для всплывающего окна или
сохраненого окна будет освобождена и перераспределена.
Следовательно, следует избегать изменения ширины окна,
когда выбранное окно является активным.
Новая ширина определяет только те ряды (строки), которые
находятся внутри границ (бордюра) окна.
Параметры Если параметр 'new_width' имеет величину больше нуля, он
становится новым количеством столбцов в строка текущего
окна.
Возврат Функция 'w4width' возвращает текущую ширину окна.
Пример void shrink_window( w_ref ){
int prev_ref;
prev_ref=w4select( w_ref );
w4width( w4width(-1) -1 );
w4height( w4height(-1) -1 );
w4select( prev_ref );
}
-242-
w4write
Использование void w4write( int row, int col,
char *data_ptr, int len_data )
Описание Записывает информацию из буфера памяти непосредственно в
видео-память. Информация в буфере памяти должна находится в
формате видео-памяти - (символ, атрибут).
Параметры
Наименование Применение
row Строка экрана относительно ферхней строки.
col Столбец экрана относительно левого столбца.
data_ptr Указатель на буфер памяти, который будет
записан.
len_data Количество байт, которые будут записаны. Эта
величина равна удвоенному количеству
записываемых символов экрана, так как
записывается также и атрибуты.
Замечание Функция 'w4write' противоположна функции 'w4read'. Обе эти
функции являются низко-уровневыми, и, следовательно, они
используются другими фукциями управления окон Code Base.
Переносимость Данная функция 'w4write' недоступна в версии Code Base
для операционных систем Unix/Xenix.
-243-
w4write_att
Использование void w4write_att( int row, int col,
char *data_ptr,
int len_data, long attribute )
Описание Аналогична функции 'w4write', за исключением того, что
буфер данных data_buffer содержит только символьные данные.
Все данные показываются с заданным символом атрибута.
Параметры
Наименование Применение
row Строка экрана относительно верхней строки.
col Столбец экрана относительно левого столбца.
data_ptr Указатель на буфер памяти, который будет
записан.
len_data Количество символов данных, которые будут
записаны. Эта величина таже самая что и
количество байт данных.
attribute Это атрибут всех символов, которые выводятся.
Переносимость Функция 'w4write_att' недоступна в версии Code Base для
операционных систем Unix/Xenix.
-244-
w4write_window
Использование void w4write_window( window_ref, char *ptr )
Описание Используется для показа информации, прочитанной функцией
'w4read_window'. Предполагается, что размер окна не был
изменен. Кроме того, предполагается, что окно не получало и
не изменяло рамку (границу).
Параметры
Наименование Применение
window_ref Номер указателя окна, которое будет показано.
ptr Указатель на область памяти где хранится
выводимая информация. Должно иметься достаточно
пар (символ, атрибут) для заполнения всего окна
целиком.
Переносимость Данная функция недоступна в версии Code Base для
операционных систам UNIX/Xenix.
Пример #include
void copy_window(){
int w_ref;
char window_data[400];
w_ref=w4define( 0,0, 9,19 );
w4read_window( w_ref, window_data );
w4close( w_ref );
/* Display the information at row 15 */
w_ref = w4define( 15,0, 24,19 );
w4write_window( w_ref, window_data );
w4close( w_ref );
}
-245-
Расширенные Функции.
Расширенные функции принадлежат к высокоуровневым программам работа с
базами данных. Эти функции могут служить в качестве примеров Code Base
более низкого уровня. В частности, 'x4sum', 'x4replace', 'x4list' и
'x4edit'. Другие расширенные функции могут служить примерами для более
опытных пользователей.
Функции 'x4seek, 'x4skip', 'x4top', 'x4go' и 'x4bottom' используют
фильтрацию и отношения, установленные функциями 'x4relate' и
'x4filter'.
x4blank
Использование int x4blank()
Описание Функция 'x4blank' определяет, является ли текущая запись
чистой (пустой). Данная функция является примером
программы, которая может работать с функцией 'x4filter'.
Возвращает
Величина Значение
1 Запись пустая.
0 Запись не пустая.
Смотрмте также 'x4filter'
x4bottom
Использование int x4bottom()
Описание Данная функция анологична функции 'd4bottom', но, в отличие
от последней, использует фильтрацию и отношение
-246-
x4copy
Использование int x4copy ( char * new_base, long start_rec, int
safety )
Описание Функция 'x4copy' копирует базу данных в другую базу данных
с такой же структурой. Она использует фильтры,
установленные 'x4filter'.
Параметры
Наименование Использование
new_base Имя новой базы данных. Эта база данных
создается и в нее копируются записи.
start_record Записи с первой по 'start_rec-1' и текущей базе
данных будут игнорироваться. Эти записи не
будут копироваться в новую базу данных.
safety Если 'safety' не ноль, и новая база уже
существует функция ничего не делает и
возврашает код ошибки.
Возврат
Значение Значение
>=0 Номер ссылки новой базы данных.
-1 Ошибка
-2 Какая-то из баз данных или один из их индексных
файлов блокирован и стоит флаг 'вернуться
немедленно'.
Dнимание! Функция 'x4copy' не поддерживает файлы памяти. Если база
данных имеет поле памяти, не используйте с ней эту функцию.
Пример rc=x4copy("new.dbf", 1L, 0);
-247-
x4filter
Использование int x4filter( (*filter_routine() )
Описание Функция 'x4filter' работает с функциями 'x4seek', 'x4skip',
'x4top' и 'x4bottom' и ваыполняет отфильтровывание записей.
К примеру функция 'x4top' вызывает функцию 'd4top' и затем
последовательно пропускает базу данных используя функцию
'x4skip', пока не будет обнаружена запись, которая не
должна быть отфильтрована.
Когда вызывается функция 'x4filter', указанная функция
фильтрации добавляется в список функций фильтрации,
принадлежащих текущей базе данных. Каждая функция
фильтрации должна возвращать логическое целое число 'int' в
соответствие со следующими правилами:
Возвращает Значение
1 Отфильтровать запись.
0 Использовать запись.
-1 Ошибка
Параметры Параметром является функция фильтрации.
Возврат Величина '(int)-1' возвращается, есл нет памяти. Если
функция 'u4error' не была изменена, эта критическая ошибка
не должна происходить.
Внимание! Не читайте условие возврата функций фильтрации Code Base в
обратном порядке. Не оставляйте скобки, как в 'x4filter(
d4deleted())'.
Пример /* Filter all deleted and blank records */
x4filter( d4deleted ) ;
x4filter( x4blank ) ;
/* Remove the 'x4blank' filtering */
x4filter_pop() ;
/*Remove all of the filtering */
x4filter_reset() ;
-248-
x4filter_do
Использование int x4filter_do()
Описание Функция 'x4filter_do' оценивает все функциии фильтрации для
текущей базы данных, определяя , должна ли быть
отфильтрована запись текущей базы данных
Функция 'x4filter_do' использует текущую запись, которая
находится в буфере базы данных.
Возврат
Возвращает Значение
1 Отфильтровать запись
0 Использовать запись
-1 Ошибка
x4filter_reset
Использование void x4filter_reset()
Описание Функция 'x4filter_reset' удаляет из списка все функции
фильтрации, принадлежащие текущей базе данных.
См. также 'x4filter'
-249-
x4filter_pop
Использование int x4filter_pop ()
Описание Функция 'x4filter_pop' удаляет (выталкивает) последнюю
определенную функцию фильтрации из списка функций
фильтрации, принадлежащих текущей базе данных. Если нужно
удалить несколько функций из списка, то функция
'x4filter_pop' может быть вызвана несколько раз.
Возврат
Величина Значение
0 Успешное выполнение
-1 В текущей базе данных нет функций фильтрации
x4go
Использование int x4go( long rec_num )
Описание Данная функция анологична функции 'd4go', за исключением
того, что в первой используются отношения.
-250-
x4insert
Использование int x4insert( long rec_num )
Описание Запись в буфере записи становится записью 'rec_num'. Все
предыдущие записи от записи 'rec_num' до конца базы данных
копируются вперед на одну запись, чтобы вставить новую
запись.
Блокировка База данных блокируется.
Возврат
Величина Значение
0 Успешное выполнение
-1 Ошибка
Внимание! Для больших баз данных, время выполнения функции может быть
велико.
x4list
Использование int x4list()
Описание Функция 'x4list' записывает содержимое базы данных на
текущее устройство вывода. мспользуется фильтрация
определенная 'x4filter'.
Возврат
Величина Значение
0 Успешное выполнение
-1 Ошибка
-251-
x4pack
Использование int x4pack ( int safety )
Описание 'x4pack' упаковывает базу данных используя фильтр,
указанный функцией 'x4filter'.
Используется следующий алгоритм:
1. Вызывается 'x4copy' для копирования во временный файл с
темже именем как у текущей базы данных, а расширение файла
с '.DBF' заменяется на '.BAK'.
2. Текущая база данных удаляется.
3. Временная база данных переименовывается обратно к
исходному имени.
4. Все индексные файлы базы переиндексируются.
Параметры Етси 'safety' равна истине, функция возвращает ошибку в
сучае когда временный файл уже существует.
Возврат
Величина Значение
>=0 Номер указателя новой базы данных.
-1 Ошибка
-2 Какая-то база данных или ее индексный файл был
ранее блокирован, и выставлен флаг 'вернуться
немедленно'.
Внимание! Хорошо сделать копию базы данных перед вызовом этой
функции.
См. также 'x4filter', 'x4filter_reset', d4pack'
Пример x4filter_reset() ;
x4filter( d4deleted () ) ;
/* In this case 'x4pack90' does the some thing as
'd4pack' would. This is becouse the filtering
is on 'deleted' records
*/
rc = x4pack( 1 ) ;
-252-
x4relate
Использование int x4relate( char *expt, int base_ref,
int index_ref, long miss_code )
Описание Функция 'x4relate' создает отнашение между управляющей
базой данных и относящейся к ней базе данных. Выбранная
база данных становится управляющей базой данных, a
определенная база данных становится связанной базой данных.
После того, как управляющая база данных переразмещается при
помощи расширенных функций, таких, например, как 'x4seek',
'x4top', все связанные с ней базы данных будут
переразмещены автоматически.
При обработке отношения осуществляется оценка выражения
'expr'. Если для связанной базы данных был определен
индексный файл, то выполняется поиск этого выражения в
индексном файле, для перемещения к записи в связанной базе
данных, однако, если индексный файл не определяется, то
выражение 'expr' должно возвратить числовую величину,
которая интерпритируется как номер записи. Зтот номер
записи определяет новую запись в связанной базе данных.
Code Base поддерживает рекурсивные отношения. К примеру,
база A связана с базой B которая в свою очередь связывается
с базой С. В результате, позиционирование базы данных A при
помощи функции расширения 'x4go' приведет к
позиционированию в базе B а то в свою очередь к
позиционированию в C.
Внимание Если А связана с B и B связана с A, Code Base может
зациклится, выполняя отношения.
Параметры
Наименование Использование
expr Выражение, определяющее либо ключ, который
ищется в индексном файле, либо номер записи.
base_ref Номер указателя базы данных, соответствующий
связанной базе данных.
index_ref Номер указателя индексного файла,
соответствующий индексному файлу связанной базы
данных. Если 'expr' определяет номер записи,
этот параметр должен быть '(int) 0'.
miss_code Этот код определяет действие, если запись не
обнаружена:
Величина кода Значение
0 Использовать чистую
(пустую) запись.
-1 Выдать сообщение об
ошибке.
-253-
>=1 Номер записи по
умолчанию.
Возврат
Величина Значение
0 Устешное выполнение.
-1 Ошибка.
x4relate_do
Использование int x4relate_do()
Описание Функция 'x4relate_do' обрабатывает все отношения для
текущей базы данных.
Возврат
Величина Значение
0 Успешное выполнение.
-1 Ошибка.
См. также x4relate
-254-
x4relate_reset
Использование void x4relate_reset()
Описание Функция 'x4relate_reset' удаляет все отношения для текущей
базы данных.
Возврат
Величина Значение
0 Успешное выполнение.
-1 Ошибка.
x4seek_double
Использование x4seek_double (double d)
Описание Функция 'x4seek_double' аналогична функции 'd4seek_double',
но использует фильтрацию и отношения.
x4seek_str
Использование x4seek_str (char *search_string)
Описание Функция 'x4seek_str' аналогична функции 'd4seek_str', но
использует фильтрацию и отношения.
-255-
x4skip
Использование int x4skip( long num_records)
Описание Функция 'x4skip' аналогична функции 'd4skip', но использует
фильтрацию и отношения.
x4sort
Использование int x4sort( char *new_base, char *expr, long
start_rec int safety )
Описание Функция 'x4sort' сортирует базу данных в другую базу данных
с такой же структурой. В процессе сортировки используются
имеющиеся фильтры и отношения.
Параметры
Название Использование
new_base Имя новой базы данных. База создается и
отсортированные записи записываются в нее.
expr Выражение по которомы сортируется новая база
данных.
stsrt_rec Записи с первой по 'start_rec-1' не будут
копироваться в новую базу.
safety Если 'safety' не ноль, и база с именем новой
базы уже существует, функция ничего не делает
только возвращает код ошибки.
Возврат
Величина Значение
>=0 Номер указателя новой базы данных
-1 Ошибка
-2 Кокаято база или один из ее индексных файлов
уже блокирован и выставлен флаг 'вернуться
немедленно'.
Внимание! Функция 'x4sort' не поддерживает поля памяти. Если база
данных имеет поле памяти, не используйте эту функцию.
Пример rc = x4sort( "PEOPLE.DBF", "LAST_NAME", 1L, 0);
-256-
x4sum
Использование double x4sum (long field_ref)
Описание Функция 'x4sum' суммирует поле, определенное номером
указателя поля. Для определения того какие записи
используются в суммировании, применяется фильтрация.
Возврат Величина суммирования возвращается как двойное число
(double). Если происходит ошибка функция 'x4sum' возвращает
'(double) 0.0'.
-257-
x4top
Использование int x4top ()
Описание Функция 'x4top' анологична функции 'd4top', но использует
фильтрацию и отношения.
-258-
Работа в многопользовательской среде
При паботе с Code Base в однопользовательской среде, вы можете не
учитывать многопользовательские аспекты функционирования Code Base с
операционной систамой OS/2 или в сети с несколькими сеансами, Вам
необходимо изучить средства поддержки многопользовательской среды Code
Base.
Если совместимисть индексных файлов с DBASE не имеет значения, то для
много пользовательских прикладных программ будет лучше всего
использовать опцию CLIPPER. Это обусловленно тем, что Code Base
работает быстрее с NTX файлами, если индексные файлы разблокируются, а
затем блокируются снова.
Code Base также совместима с протоколом блокирования и разблокирования
Clipper. Следовательно, если прикладные программы Clipper и Code Base
выполняются в сети одновременно, они будут 'понимать' блокировку
файлов и записей друг друга.
-259-
Блокирование и разблокирование
При работе в многопользовательской среде необходимо избегать ситуации,
когда пользователи выполняют чтение и запись в одну и туже запись в
одно и тоже время. Следовательно, информация диска выделяется для
одного сеанса перед тем, как она будет считана или записана.
Выделение (закрепление) дисковой информации на один сеанс носит
название 'блокирование' (locking), а освобождение дисковой информации
для общего использования называется 'разблокированием' (unlocking).
Функции Code Base регистрируют, какие файлы или части файлов были
блокированны или разблокированны. Дисковая информация будет
автоматически блокирована Code Base перед тем как она записывается или
считывается.
Это означает, что пользователю Code Base необходимо только
разблокировать файлы в нужное время. Это позволяет другим
пользователям получать доступ к заблокированным до этого областям.
Заметим, что Cobe Base может блокировать одну запись базы данных или
всю базу целиком. Эсли необходимо блокировать несколько записей
одновременно, используйте функцию 'd4lock' для блокирования
содержимого базы данных.
Подсказка: В многопользовательской среде базы данных, будет безопаснее
предпологать, что любая резидентная на диске информация,
если она будет разблокирована, может немедленно изменится.
-260-
Байты подсчета записей
Байты подсчета записей определяют, сколько записей имеется в настоящее
время в базе данных. Эти байты могут быть блокированны и
разблокированны подобно обыкновенной записи базы данных. Однако, так
как Code Base блокирует и разблокирует байты подсчета записей, обычно
нет необходимости выполнять блокирование и разблокирование их в
прикладных программах.
Code Base подсчитывает количество записей в базе данных на основании
длины файла. Следовательно, байты подсчета записей используются Code
Base только тогда, когда они обновляются после изменения количества
записей базы данных.
Тупиковая ситуация
Необходимо избегать возможности возникновения тупиковой ситуации. Эта
ситуация возникает тогда, когда два сеанса находятся в состоянии
взаимного неопределенного ожидания.
Вот пример такой ситуации: Сеанс 1 ожидает файл 'A', который
заблокирован сеансом 2 и сеанс 2 ожидает файл 'B', которые
заблокирован сеансом 1. Так как сеансы находятся в состоянии ожидания
друг друга, никаких действий произойти не может.
Простой способ, позволяющий избежать тупиковой ситуации, заключается в
том, чтобы все сеансы выполняли блокировки в одном и том же порядке. В
приведенном примере тупиковой ситуации, файл 'A' может всегда
блокироваться перед файлом 'B'. Тогда Сеанс 2 разблокирует файл 'B'
перед попыткой заблокировать файл 'A'. Сеанс 1 затем сможет
заблокировать файл 'B', выполнить необходимые действия и затем
разблокировать файл для Сеанса 2.
Подсказка Представляется важным либо явно разблокировать индексные
файлы, либо выполнить разблокирование при помощи функции
'd4unlock(-1)'.
-261-
Приложение
Приложение A - Внутренняя организация Code Base
Для того, чтобы понимать способ функционирования Code Base, необходимо
иметь представление о внутренней организации Code Base. Однако, для
практического использования этот аспект не имеет большого значения.
Понимание внутренней организации Code Base поможет Вам изучить
исходный код Code Base и/или писать свои собственные программы для
библиотеки Code Base.
Формат буфера записей
Буфер записей Code Base использует такой же формат для хранения
записей, что dBASE для хранения записей на диске. Они начинаются с
односимвольного флаго удаления записи. Этот флаг, как правило, пустой
' ', а звездочкой '*' он заполняется в том случае, если запись
помечена на удаление. За флагом удаления идут все поля базы данных в
последовательном порядке. Специальных символов разграничивающих данные
полей, не имеется. К примеру, если первое поле базы данных имеет длину
3, онобудет содержаться со второго по четвертый байт буфера записей.
Второе поле будет хранится сразу же за первым полем.
Все типы полей хранятся как код ASCII. Например, числовое поле с
длиной 5 и 2-мя десятичными позициями может содержать код ASCII
'5.70'. Это будет расшифровано как пять целых семь десятых.
Тип поля Формат хранения
Числовое Выравненный по правому краю код ASCII.
Число с плавающей
запятой То же, что и числовое поле.
Поле даты CCYYMMDD (например: '19811231')
(век, год, месяц, день).
Логическое 'T', 't', 'Y' и 'y' для TRUE (истинно)
'F', 'f', 'N' и 'n' для FALSE (дщжно).
Поле примечаний Десять символов в коде ASCII,
представляющих положение в соответствующем
файле примечаний.
Номер указателя записи
Структура базы данных типа 'BASE', содержит член, который является
указателем на массив структуры типа '(FIELD *)'. Этот массив,
определенный функцией 'd4use', содержит всю информацию по полям для
соответствующей базы данных. Структура поля 'FIELD' определена
следующим образом:
-262-
typedef struct
{
char name[11]; /* имя поля */
int type; /* тип поля */
char width; /* длина поля */
int decimal; /* число десятичных позиций */
int offset; /* смещение в буфере записи */
} FIELD;
Номер указателя записи представляет собой длинное целое число,
разбитое на две части. Два старших байта содержат номер указателя
соответствующей базы данных, а два младших байта являются индексом в
массиве структур '(FIELD *)'. Следовательно, исходный код для функции
'f4j_ref' выглядит следующим образом:
long f4j_ref( j_ref )
int j_ref;
{
if( j_ref >> f4num_fields() || j_ref<<1)
return( -1L );
else
return( (long)v4cur_base << 16 |
(long) (j_ref-1) );
}
Использование памяти Code Base
Все имена внешних переменных Code Base начинаются с 'v4'. Имеются
некоторые важные переменные, которые указывают на массивы структур:
v4base, v4index, v4block, v4window, v4menu и v4get. Каждая из этих
структур соответствует базе данных, индексному файлу, вершине
двоичного дерева B+ индексного файла, окну, пункту меню или области
ввода (чтения), соответственно.
Каждый из массивов структур Code Base управляется при помощи функций
обработки памяти Code Base. Это означает, что, в том случае, если в
массиве структур будет недостаточно места для обработки вызова
определенной функции, этот массив структур перераспределяется в памяти
большего объема. Как следствие этого, Code Base может использоваться с
неограниченным количеством баз данных, индексных файлов, окон, меню и
областей ввода. Отметьте, что перераспределение памяти будет
происходить довольно-таки редко.
Функции обработки памяти Сode Base также поддерживают набор двусвязных
списков для кахдой структуры памяти. Кроме двусвязного списка
неиспользованных элементов массива структур, каждый массив структур
поддерживает следующие двусвязные списки:
-263-
Массив структур Использование двусвязного списка
v4base Использует двусвязный список открытых баз
данных. Номер указателя базы данных для
последней открытой базы данных содержится
во внешней целой переменной 'v4last_base'.
Аналогично, номер указателя для текущей
выбранной базы данных содержится во внешней
целой переменной 'v4cur_base'.
v4index Для каждой открытой базы данных, которая
имеет один или несколько индексных файлов,
поддерживается двусвязный список открытых
индексных файлов. Номер указателя
индексного файла, для каждого дву связного
списка, сохраняется. Этот номер указателя
содержится в соответствующей структуре базы
данных. Аналогично, номер указателя
текущего выбранного индексного файла также
сохраняется. Смотри структуры типа 'BASE' и
'INDEX', которые определяются в файле
заголовка 'd4base.h'.
v4block Для каждого индексного файла имеется
двусвязный список вершин двоичного дерева
индексного файла. Номер указателя для
каждого из этих двусвязных списков
содержится в соответствующей структуре
индексного файла.
v4window Имеется один двусвязный список определенных
окон. Номера указателей для первого
определенного, последнего определенного и
текущего выбранного окна содержатся во
внешних целых переменных 'v4first_window',
'v4last_window' и 'v4cur_window',
соответственно. По мере того, как
активируются окна, порядок в связанном
списке меняется: он становится порядком, в
котором активируются окна.
v4menu Для каждого окна, которое содержит меню,
имеется двусвязный список пунктов меню.
Номера указателей на первый и последний
определенный пункт меню, для меню окна,
содержатся в соответствующей структуре
окна. Смотри файл заголовка 'w4.h'.
v4get Для каждого окна, в котором имеется одна
или несколько областей ввода (чтения),
имеется двусвязный список структур чтения
(структур get). Номер указателя на
последнюю определенную область ввода, для
окна, содержится в соответствующей
структуре окна. Смотри файл заголовка
'w4.h'.
-264-
Все номера указателей, кроме номеров указателей полей, являются
индексами в соответсвующих массивах структур. Например, когда функция
'd4use' вызывается первый раз, она возвращает номер указателя базы
данных '(int)0'. Это означает, что элемент структуры 'v4base[0]'
содержит информацию об этой базе данных. Исходный код функции
'd4recno' помогает понять, каким образом используются номера
указателей (ссылок):
long recno()
{
/* 'v4cur_base' is the currently selected database
reference number */
if( v4base[ v4cur_base ].rec_num <= 0 )
return( 0L );
else
return( v4base[ v4cur_base ].rec_num );
}
Двусвязные списки, о которых было рассказано выше, поддерживаются
посредством определения первых двух членов каждого массива структур
как следующего и предыдущего номера указателя, соответственно. Так как
номера ссылок являются целыми числами, двусвязные списки остаются
неизменными при перераспределении структуры памяти. Кроме того, если
копии структур памяти записываются на диск, а затем считываются
обратно, то двусвязные списки также поддерживаются. Это свойство
используется редактором dBEditor, созданным компанией Sequter.
Номер указателя '(int)-1' означает, что элемента структуры нет.
Например, если переменная 'v4last_base' равна '(int)-1', то открытых
баз данных нет. Аналогично, если имеется одна открытая база данных,
'v4base[v4last_base].prev' равна '(int)-1', так как двусвязный список
открытых баз данных будет иметь только один элемент.
-265-
Приложение B - Сообщения об ошибках
Code Base посылает все сообщения об ошибках при помощи одной функции,
- 'u4error' - которая записывает сообщения об ошибках затем
устанавливает глобальный код ошибки: 'extern int v4error'.
Следовательно, Вы можете легко отладить свою собственную программу
обработки ошибок посредством изменения функции Code Base 'u4error'
Всегда, когда происходит ошибка, Code Base вызывает функцию
'u4error'. Как правило, возврат из функции обработки ошибки происходит
всегда, хотя некоторые критические ошибки, вызывают немедленную
остановку Code Base.
Далее приводится полный список сообщений об ошибках. Ошибки приводятся
в порядке возрастания номеров.
Общие ошибки доступа к диску
100 Создание Файла ( Creating File )
Эта ошибка может быть вызвана определением
неправильного имени файла, попыткой создать
файл, который уже открыт, отсутствием места в
каталоге, или другой проблемой, связанной с
диском или директорией.
120 Открытие Файла ( Opening File )
Данная проблема, как правило, вызывается
попыткой открыть не существующий файл. Другая
возможная причина состоит в попытке открыть
больше файлов, чем может обработать
операционная система. Если в файле конфигурации
'config.sys' определена строка 'files=20',
операционная система DOS сможет поддерживать
обработку до 20 открытых файлов.
140 Чтение из файла ( Reading File )
Ошибка при чтении файла может быть вызвана
сбоем на диске.
000 Поиск позиции в файле
160 Запись в файл ( Writing File )
Эта ошибка происходит, когда на диске нет
свободного места
180 Закрытие файла ( Closing File )
Ошибка произошла при попытке закрыть файл
190 Удаление файла ( Removing File )
Ошибка произошла при удалении файла. Например,
в 'x4pack', файл копируется в новый, оригинал
-266-
удаляется, а новый переименовывается обратно в
имя оригинального файла.
Ошибки, связанные с базой данных
200 Файл не есть база данных ( File not a
Database )
Данная ошибка происходит когда функция 'd4use'
пытается открыть файл, который не является
базой данных.
240 Нет открытой базы данных ( No Open Database )
Откройте базу данных при помощи функций
'd4create' или 'd4use' перед тем, как вызывать
функцию управления базой данных.
260 Длина записи слишком велика ( Record Length is
Too Lage )
Максимальная длина записи равна 32666 байт.
270 Неизвестное поле ( Unrecognized Field Name )
База данных не содержит специфицированного
имени поля.
300 Создание индексного файл ( Building Index File
)
Либо не хватает памяти, либо в базе данных
находится слишком много записей для индексации.
Попробуйте использовать большую модель памяти.
310 Закрытие индексного файла ( Closing Index File
)
Эта ошибка означает, что функции 'i4close' был
передан неправильный номер указателя индексного
файла, или то, что этот индексный файл не может
быть закрыт.
320 Файл не индексный ( File is not an Index File)
Данная ошибка происходит, когда функция
'i4open' пытается открыть файл, который не
является допустимым индексным файлом для
соответствующей базы данных.
330 В индексном файле нет ключа для существующей
записи (Index File is out of Date )
Ключ индексного файла, соответствующий
существующей записи базы данных, отсутствует.
-267-
335 Нет записи указанной в индексном файле ( Index
File Record does not Exist )
Индексный файл указывает на запись которой нет
в базе данных. Требуется перестройка индексного
файла.
340 Ключ не уникален ( Key is not Unique )
Когда создается индексный файл с включенным
флагом уникальности 'Unique', все ключи в
индексном файле должны быть уникальны. попытка
добавить второй ключ с той же величиной
приводит к появлению этой ошибки.
Это сообщение можно подавить, установив
переменную 'v4unique_error', как '(int)0)'. В
этом случае индексные файлы с уникальными
ключами будут создаваться и поддерживаться
только с одной версией каждого ключа.
350 Ключ оценен как логический результат ( Key
Evaluates to Logical Result )
Для индексных файлов допустимы только
символьные, числовые и ключи даты.
360 Изменился тип ключа или его длина (Key Length
or Type has Changed )
Когда был создан индексный файл, длина и тип
ключа на должны изменяться. Это может
произойти, когда изменяется структура базы
данных. Например, если индексный файл
индексирует по определенному полю и тип поля
изменяется с символьного на числовой, этот
индексный файл становитмся недопустимым.
370 Длина ключа более 100 символов ( Key Length
over 100 Characters )
Максималькая длина ключа для индексного файла
ограничена 100 символами. Эта длина ключа
определяется выражением, соответствующему ключу
индексного файла.
380 Поиск в базе без индексного файла ( Seek on
Database with no Index File )
Функция 'd4seek' может работать только с базой
донных, которая имеет соответствующий индексный
файл.
Функции 'i4select' был передан номер указателя
, который не соответствует никакому индексному
файлу.
000 Ошибочное количество параметров в выражении (
Wrong Number of Parameters in Expression )
-268-
Ошибки, связанные с работой в многопользовательской среде
400 Блокировка файла ( Locking a File )
Проблема возникла при блокировки файла базы
данных или индексного файла.
450 Разблокировка файла ( Unlocking a File )
Проблема возникла при разблокировании файла
базы данных или индексного файла.
Ошибки, связанные с оценкой выражений
500 База данных не обнаружена во время оценки
выражения ( Database not Located while
Evaluating Expression )
Не обнаружена база данных, указанная в
выражении.
510 Выполнение пустого выражения ( Executing Null
Expression )
Функции 'e4exec' был передан пустой (null)
указатель, который должен был быть указателем
на псевдо-компилированное выражение.
515 Неправильная дата ( Illegal Date )
При поиске или оценке величины даты была
обнаружена неверная дата.
520 При оценке выражения ожидалось ',' или ')' (
Expecting ',' or ')' while Evaluating
Expression )
В выражении, вероятно, отсутствует запятая или
правая круглая скобка.
530 Выражение неполно ( Expression is not Complete
)
Выражение не может быть оценено, так как оно не
является законченным выражением dBASE.
540 Переполнение при оценке выражения ( Overflow
while Evaluating Expression )
Выраженгие слишком большое или слишком сложное
для Code Base. Если происходит эта ошибка, Code
Base останавливает программу.
550 Параметр или оператор имеет неверный тип (
Parameter or Operator has the Wrong Type )
Такое сообщение об ошибке даст, к примеру,
выражение 3+"A". Оператор '+' не может
-269-
прибавить три к букве "A", так как последнее
принадлежит к типу символ, а не число.
Выражение 'substr(33,1,4)' также вызовет данное
сообщение об ошибке. В этом случае, параметр 33
имеет неверный тип. Первым параметром функции
'substr' должен быть символ.
560 В выражении отсутствует правая скобка ( Right
Bracket Missing in Expression )
Проверьте наличие достаточного количества
правых скобок в выражении.
570 Неизвесная функция в выражении ( Unrecognized
Function in Expression )
Попытка использовать функцию, которая не
поддерживается Code Base. См. Приложение по
функциям. Тщательно проверьте правильность
написания функции.
575 Неизвестный оператор в выражении ( Unrecognized
Operator in Expression )
Code Base поддерживает ряд операторов,
например, '+' и '/'. Вы попытались использовать
оператор, который не поддерживается Code Base.
580 Неизвестная величина в выражении ( Unrecognized
Value in Expression )
В выражении имеется величина, которая не
является полем, строкой. числом, логической
величиной или функцией.
590 Неоконченная строка в выражении ( Unterminated
String in Expression )
Для левых кавычек в строке символов нет
соответствующего числа правых кавычек.
595 Неверное количество параметров в выражении (
Wrong Number of Parameters in Expression )
Функция или оператор использована с неверным
количеством параметров.
Ошибки, связанные с файлами примечаний
600 Редактирование примечаний при помощи редактора
( Editing Memo File with Editor )
Либо отсутствует указанная программа
редактирования, либо в памяти нет достаточно
места.
-270-
620 Несоответствие имени файла примечаний ( Memo
File Name Inconsistency )
Либо Вы переименовали файл примечаний dBASE IV
без вызова функции 'm4renamen', либо функциями
управления файлами примечаний dBASE IV был
использован файл примечаний не dBASE IV. Смотри
функцию 'm4convert'.
640 Размер файла примечаний превышает 32767 байт (
Memo File Entry is over 32767 Byte )
Максимальный размер файла примечаний равен
32767 байт.
Ошибки, связанные с окнами и меню
700 Неправильный номер указателя окна ( Illegal
Window Reference Number )
Неправильный номер указателя окна был передан
функции 'n4pulldown', 'n4calc', или 'n4lotus'.
Ошибки, связанные с отношениями
800 Неправильная связанная база данных ( Illegal
Related Database )
При определении отношения баз данных, в
качестве соотносящейася базы данных была
определена управляющая база данных.
820 Отсутствует управляющая база данных ( No
Controlling Database )
При определении отношения баз данных, не была
определена правильная управляющая база данных.
800 Связанные базы данных ( Relating Databases )
Ошибка произошла при автоматическом
позиционировании соотносящейся базы данных.
Критические ошибки
900 Нет памяти ( Out of Memory )
Сделана попытка распределить больше памяти, чем
возможно.
920 Ошибка распределения памяти ( Memory Allocation
Error )
Сделана попытка распределить за один раз больше
чем 0xFFE0 байт памяти. Причиной этой ошибки
может быть открытие черезмерного количества
-271-
файлов или наличие слишком большого числа окон,
областей ввода или блоков индексных файлов.
950 Затертая память ( Overwritten Memory )
Сбои при проведении Code Base внутренней
проверки. Эта ошибка произошла, когда
прикладная программа затерла память, которую
использует Code Base.
980 Нет окна вывода ошибок ( No Error Window )
Когда фукнция 'd4init' или 'w4define'
вызываются впервые, определяется окно по
умолчанию. Данная ошибка происходит в том
случае, когда была вызвана функция 'u4error', а
окна по умолчанию еще не было определено.
Ошибки, связанные с сортировкой
1000 Нет памяти для сортировки ( Not Enough Memory
to Sort )
Суммарная память распределенная для сортировки
не достаточна. Смотри 'd4buf_init'.
1010 Слишком много сортируемых записей ( Too Many
Records in Sort )
Число сортируемых записеи больше чем
указывалось вначале.
-272-
Приложение D - Выражения Code Base
В Code Base, выражения представляются как строка символов они
оцениваются в модуле оценки выражений. Выражения используются для
определения ключей индексного файла. Они могут также применятся и для
других целей, например, для обработки интерактивных запросов.
Общая информация о выражений
Все выражения возвращают величину определенного типа. этим типом может
быть числовой, символьный, даты или логический.
Одной из обычных форм выражения является имя поля. В данном случае тип
выражения совпадает с типом поля.
Имена полей, константы и функции могут быть использованы как части
выражения. Эти части могут быть объеденены с другими функциями
посредством операторов.
Константы выражений
Выражения могут содержать числовые, символьные и логические константы.
Однако, выражения, являющиеся константами, обычно бывают не очень
полезны. Константы, как правило, испрользыются в более сложном
выражении.
Числовая константа представляет собой число. Примером числовых
констант могут быть 5, 7.3 и -18.
Символьные константы представляются буквами заключенными в кавычки.
Примером символьных констант могут быть: "This is data", 'This is
data' и "John Smith". Если вы хотите определить символьную константу с
одинарными или двойными кавычками внутри нее, используйте для
обозначения этой константы, другие кавычки, чем те, которые
встречаются внутри символьной константы, например: '"OK"' или "Man's".
Единственными допустимыми логическими константами являются .TRUE. и
.FALSE. допустимы сокращения - .T. и .F..
Операторы выражений
Для манипулирования константами и полями используются операторы,
например '+','*' или '<'. Примером выражения, где оператор сложения
действует над двумя числовыми константами и возвращает числовую
величину 11, является выражение 3+8.
Величины, над которыми выполняет действия оператор, должны иметь тип,
соответствующий этому оператору. Например оператор деления (/)
совершает действия над двумя числовыми величинами.
Приоритет
Операторы обладают приоритетом, который определяет порядок оценки
операторов. Приоритет каждого оператора определяется в приводимых
далее таблицах, которые описывают различные операторы. Чем выше
-273-
приоритет данного оператора, тем раньше будет выполнен этот оператор.
К примеру, оператор деления имеет приоритет 6, а оператор сложения
обладает приоритетом 5, это означает, что оператор деления оценивается
прежде оператора сложения. Следовательно, 1+4/2 равняется 3.
Порядок оценки может быть установлен явно при помощи использования
скобок. Например, 1+2*3 возвращает 7, а (1+2)*3 возвращает 9.
Числовые операторы
Оператор Символ Приоритет
Сложение + 5
Вычитание - 5
Умножение * 6
Деление / 6
Возведение
в степень ** или ^ 7
Символьные операторы
Существует два символьных оператора, которые называются 'Объединение
I' и 'Объединение II', они обединяют две символьные строки в одну.
Символьные операторы отличаются от числовых операторов сложения и
вычитания типми величин, которыми они оперируют.
Оператор Символ Приоритет
Объеди-
нение I + 5
Объеди-
нение II - 5
Примеры:
"John " + "Smith" становится "John Smith"
"ABC"+"DEF" становится "ABCDEF"
Объединение II отличается от приведенных примеров тем, что все пробелы
на конце первой символьной величины перемещаются в конец результата.
Примеры:
"John "-"Smith" становится "JohnSmith "
"ABC"-"DEF" становится "ABCDEF"
-274-
"A "-"D " становится "AD "
Операторы отношения
Операторами отношения являются операторы, которые возвращают
логический результат (истина или ложь). Все операторы, кроме оператора
'Содержит', оперируют числовыми, символьными или данными типа дата.
Оператор 'Содержит' оперирует двумя величинами символьного типа и
возвращает TRUE (истина), если первая величина содержится во второй.
Оператор Символ Приоритет
Равно = 4
Не равно <> или # 4
Меньше < 4
Больше > 4
Меньше
или = <= 4
Больше
или = >= 4
Содержит $ 4
Пример:
"CD"$"ABCD" возвращает истинно (true)
8<7 возвращает ложно (false)
Логические операторы
Логические операторы возвращают логический результат и совершают
операции над двумя логическими величинами.
Оператор Символ Приоритет
Нет .NOT. 3
Или .AND. 2
И .OR. 1
Пример:
.not. .t. возвращает ложно
-275-
.t. .and. .f. возвращает ложно
Функции в выражениях
В качестве выражения или его части может быть использована функция.
Подобно операторам, константам и полям, функции возвращают величину.
Функции всегда имеют имя функции, за которам следуют правые и левые
скобки. В скобках могут находится величины (параметры).
Внимание!
Это не функции Си, которые вызываются непосредственно из программ Си.
Это функции dBASE, которые распознаются модулем оценки выражений
dBASE.
-276-
Список функций
CTOD( Char_Value )
Эта функция преобразует символьную величину в дату
ctod( "19881130" ) символьное представление даты всегда имеет
формат "CCYYMMDD". Для использования другого представления используйте
функцию 'stod'.
DATE()
Возвращает системную дату.
DAY( Date_Value )
Возвращает число соответствующее дню заданной даты
Пример: day( date() ) Вернет 30 если день в дате тридцатое.
DEL()
Возвращает "*", если текущая запись базы помечена на удаление. В
противном случае возвращает " ".
DELETED()
Возвращает .TRUE. если текущая запись базы помечена на удаление.
DTOC( Date_Value )
Преобразует величину типа дата в сивольный эквивалент. Формат
результата "MM/DD/YY"
dtoc( date() ) возвратит "05/30/87" если текущая дата 30 мая 1987.
DTOS( Date_Value )
Преобразует величину типа дата в строковый эквивалент. Формат
результата "CCYYMMDD"
dtoc( date() ) возвратит "19870530" если текущая дата 30 мая 1987.
-277-
IIF( Log_Value, True_Result, False_Result )
Если Log_Value равно .TRUE., то функция IIF возвращает величину
True_Rezult иначе возвращается величина False_Rezult.
Пример:
iif( value <0, 'Less then zero', 'Great then zero' )
iif( name = 'John', 'The name is John', 'Not John' )
MONTH( Date_Value )
Возвращается числовое значение месяца заданной даты.
Пример:
month( dt_field ) возвратит 12 если в дате поля dt_field месяц
декабрь.
RECCOUNT()
Данная функция возвращает общее число записей в базе данных.
reccount() возвращает 10 если в текущей базе 10 записей.
RECNO()
Возвращает номер текущей записи текущей базы данных.
STOD( Char_Value )
Преобразует символьное представление даты в значение типа дата.
stod( '19881130' ) Символьное представление даты должно иметь
формат "CCYYMMDD".
STR( Numbel, Length, Decimals )
Данная функция преобразует числовую величину в ее символьное
отображение. 'Length' определяет количество символов в выходной
строке, включая десятичный знак. 'Decimal' обозначает количество
десятичных позиций в новой строке. Если это число слишком велико для
выделенного места, происходит заполнение строки символами (*).
Пример:
str( 5.7, 4,2) возвращает '5.70'
-278-
str( 5.7, 3,2) возвращает '***'
Число 5.7 не может поместиться в строке длиной 3, если в строке
имеются две десятичные позиции, следовательно, возвращаются символы
звездочки (*).
SUBSTR( Char_Value, Start_Position, Num_Chars )
Возвращает подстроку заданной строки. Возвращаемая подстрока будет
начинаться с 'Start_Posirtion' и иметь длину 'Num_Char'.
Примеры:
substr("ABCDE", 2,3) возвращает "BCD"
substr("Mr. Smith", 5,1) возвращает "S"
TIME()
Данная функция возвращает текущее системное время в виде символьной
строки. Строка имеет формат: 'HH:MM:SS'.
Примеры:
time() возвращает 12:00:00 если полдень
time() возвращает 13:30:00 если пол-второго
UPPER( Char_Value )
Преобразует строку символов в верхний регистр и возвращает результат.
VAL( Char_Value )
Преобразует строку в число.
Примеры:
val( "10" ) возвращает 10
val( "-8.7" ) возвращает -8.7
YEAR( Date_Value )
Возвращается числовое значение года заданной даты.
Примеры:
year( date() ) возвращает 1990 если текущий год 1990.
-279-
Приложение D - Построение библиотек
Файлы используемые для построения Code Base библиотек содержаться в
соответствующих директириях библиотек.
Компилятор Имя директории
Turbo C TC
Microsoft C MSC
Quick C MSC
Zortech C++ ZORTECH
Watcom C 386 WATCOM
Для Watcom C 386 и Zortech C++ имеется дополнительная документация о
том как построить библиотеку в файлах 'watcom.doc' и 'zortech.doc' в
соответствующих директориях.
Для Turbo C и Microsoft C используются следующие файлы:
Файл Назначение
T4.bat для компиляции файлов и построения
совместимой с Turbo C библиотеки 'T4.LIB'
M4.bat для компиляции файлов и построения
совместимой с Microsoft C и Quick C
библиотеки 'M4.LIB'
M4 Входной файл для программы построения
библиотек 'lib.exe'. Этот файл используется
командным файлом 'M4.bat'.
Эти файлы могут быть изменены для построения собственной библиотеки
Code Base с использованием любой модели памяти или опции плавающей
запятой следующим образом:
1. Сотрите все имеющиеся об`ектные модули Code Base:
erase ?4*.obj
2. Скопируйте исходные файлы Code Base с исходной дискеты в
соответствующий каталог вашего жесткого диска.
Файлы 'w4asm.obj' и 'w4asm.asm' также копируются. 'w4asm.obj' содержит
коды управления для CGA дисплейного адаптера.
copy a:\source\*.* c:\c
3. Скопируйте файлы заголовка на свой винчестер.
copy a:\h\*.h c:\c\include
4. Скопируйте соответствующие командные файлы. Эти файлы находятся на
библиотечных дискетах Code Base. Заметьте, что готовые библиотеки,
которые используются как для Quick C так и для Microsoft C, были
-280-
получены при помощи оптимизирующего компилятора Microsoft C с
использованием полной оптимизации.
copy a:\tc\t4.bat c:\c
или
copy a:\msc\m4.bat c:\c
copy a:\msc\m4 c:\c
5. Установите опции компилятора. Опции Quick C и Microsoft C
определяются в файле 'm4.bat'. Опции компиляции Turbo C определены в
файле 'turboc.cfg'. Для компиляции с использованием Quick C,
необходимо изменить файл 'm4.bat' таким образом, чтобы работал
компилятор 'QCL.EXE' а не компилятор Microsoft C 'CL.EXE'.
Более подробно, смотрите документацию по вашему компилятору.
6. Начанайте компиляцию и построение библиотек:
t4 (выполнить t4.bat)
или
m4 (выполнить m4.bat)
7. Удалите полученные объектные файлы.
Переключатели компиляции Code Base
Code Base имеет три категории переключателей компиляции. Первая:
переключатели которые изменяют исходный код, настраивая Code Base на
на соответствующий поддерживаемый Sequiter компилятор. Тогда как
некоторые переключатели конфигурируют Code Base в некотором другом
направлении. И последние, это те переключатели, которые используются
для учета основных различий между компиляторами.
Если переключатели компилятора были использованы при построении
библиотеки Code Base, то такие же переключатели надо использовать при
компиляции любой программы, пользующейся программами Code Base. Это
необходимо потому, что некоторые переключатели используются в файлах
заголовка Code Base.
По умолчанию Code Base совместима с dBASE файлами и DOS (версия 2.0 и
выше). Если вы используете Microsoft C, Turbo C, Zortech C++ или
Watcom C, или UNIX, определите соответствующий переключатель:
-281-
Переключатели учета Компилятора
Переключатель Действие
MSC Используйте этот переключатель с Microsoft C;
он используется для уменьшения предупреждающих
сообщений.
TURBO Этот переключатель делает Code Base совместимым
с Turbo C. Это необходимо в связи с некоторыми
различиями между библиотеками выполнения Turbo
C и Microsoft C. Если использован этот
переключатель, то переключатель 'DO_LOCK'
определяется автоматически.
UNIX Этот ключ используется для UNIX компиляторов. В
основном используется для указания Code Base
использовать вызовы 'Curses' для управления
экраном. Кроме того, следующие переключатели
определяются автоматически: 'NO_CHSIZE',
'NO_POW', 'NO_SPAWNL', 'NO_FILELENGTH',
'NO_KBHIT', 'NO_REMOVE', 'NO_STRUPR',
'NO_STRLWR', 'NO_STRNICMP', 'VARARGS',
'PORTABLE'. Пользователи операционной системы
отличной от DOS или OS/2 должны купить
специальную версию Code Base.
WATCOM Этот переключатель используют, когда Code Base
компилируют Watcom C 386. Если использован этот
переключатель, то следующие переключатели
определяется автоматически: 'IS_386',
'NO_HUGE', 'NO_CHSIZE', 'NO_FILELENGTH', и
'DO_LOCK'.
ZORTECH Этот переключатель используют, когда Code Base
компилируют Zortech C++. Если использован этот
переключатель, то следующие переключатели
определяется автоматически: 'NO_HUGE',
'NO_CHSIZE', 'NO_LOCK' и 'NO_STRNICMP'.
-282-
Переключатели конфигурирующие Code Base
Переключатель Действие
CLIPPER Этот перключатель используется для того, чтобы
сделать Code Base совместимым с индексными
файлами NTX Cliipper. Вне зависимости от того,
как установлен этот переключатель, Code Base
будет совместимым с файлами данных как Clipper,
так и dBASE.
Когда используются индексные файлы Clipper,
функеции 'i4seek', 'i4go' 'i4add' и 'i4remove'
ожидают, что числовые ключи будут
отформатированы как ASCII с начальными нулями.
Однако, функции высокого уровня управления
базой работают идентично. Для прямого вызова
функций 'i4seek', 'i4go', 'i4add' или
'i4remove', сначала вызовите функцию 'c4dtok'
для преобразования 'double' в правильный
формат.
IS_386 Этот переключатель автоматически
устанавливается когда Code Base используется с
WATCOM компилятором.
LANGUAGE Этот переключатель используется для поддержки
не-латинского алфавита. Перед компиляцией Code
Base, вам необходимо изменить статический
символьный массив 'month' который определен в
начале файла 'c4.c'. Это список названий
месяцев. К тому же, вы можете изменить массив
целых чисел 'v4map' который определен в файле
'p4misc.c'. Этот массив определяет
относительный порядок ASCII символов. По
умолчанию, когда 'LANGUAGE' определен,
используются Германские месяца и алфавитный
порядок.
NO_HUGE Code Base может использовать ключевое слово
'huge' применяя буферизацию базы и индексацию
больших индексных файлов. Этот переключатель
запрещает использование 'huge'. 'NO_HUGE'
автоматически устанавливается когда Code Base
используется с Watcom C 386 или Zortech C++. Он
должен также использоваться с Microsoft C и
Turbo C когда используется малая или средняя
модель памяти.
NOIO Этот переключатель удаляет из Code Base все
указатели на функции управления экраном. Вместо
этого, стандартная библиотечная функция 'write'
посылает вывод на стандартное выходное
устройство. влияет только на функции в файлах
'u4error.c', 'd4init.c', и 'd4init_u.c'.
OS2 Этот ключ используется в файлах 'w4.c' и
'g4.c', так что Code Base использует вызовы
-283-
видео ввода/вывода системы OS/2, а не вызовы
библиотечной функции 'int86'.
SMALL Из Code Base удаляются все ссылки на функции
управления индексными файлами. Это позволяет
создавать прикладные программы с очень
маленькими файлами EXE. Если выбран этот
перектючатель, нельзя использовать функции
работы с индексными файлами, расширенные
функции, и следующие программы работы с базой:
'd4bottom', 'd4seek', 'd4skip', и 'd4top'.
WINDOWS_L Этот переключатель позволяет использовать
функции управления базой данных Code Base для
средней или малой модели в Microsoft Window.
Этот переключатель используется в модуле
распределения памяти и в функции 'u4reeor'. Не
используйте этот переключатель вместе с
переключателем 'NOIO'. Собирайте свою
библиотеку с дополнительными ключами которые
указаны в SDK.
WINDOWS_G Этот переключатель позволяет использовать
функции управления базой данных Code Base для
большой компактной или огромной (huge) модели в
Microsoft Window.
Основные переключатели конфигурации
Вы можете изменить использование Code Base библиотечных функций
поменяв файл 'p4misc.h'; это смешанный файл заголовка переносимости.
Например, почти все Основные переключатели конфигурации определаются в
'p4misc.h' если определен переключатель компиляции 'UNIX'.
Программы, заменяюшие используемые Code Base, находятся в файле
'p4misc.c'. Эти заменяющие программы определяются только когда
устанавливается соответствующий переключатель компиляции, такой как
'NO_STRNICMP'.
Переключатель Действие
DO_LOCK Программы Code Base 'u4lock' и 'u4unlock'
вызывают программы 'lock' и 'unlock' из
библиотеки компилятора, для блокировки и
разблокирования части файла.
DO_LOCKING Этот переключатель автоматически определяется
если какой-либо из ключей -'NO_LOCK' или
'DO_LOCK' - определен. Программы Code Base
'u4lock' и 'u4unlock' вызывают программы 'lock'
и 'unlock' из библиотеки компилятора, для
блокировки и разблокирования части файла.
NO_CHSIZE Code Base не будет использовань программу
'chsize'. Соответственно, программы 'd4pack', и
'd4zap' будут недоступными. Взамен используйте
программу 'x4pack'. К тому же, вам лучше
-284-
использовать программу 'i4index' пересоздавая
индексный файл, чем переиндексировать используя
'i4reindex'.
NO_FILELENGTH Code Base будет использовать вызов программы
'fstat' dvtcnj 'filelength' для получения
размера файла.
NO_LOCK Code Base программы 'u4lock' и 'u4unlock'
ничего не делают и всегда возвращают ноль. Это
фактически исключает многопользовательские
возможности Code Base.
NO_MEMMOVE Code Base сама определяет программу 'memmove'
NO_POW Code Base не использует программу 'pow'.
Соответственно, модоль оценки выражений Code
Base не распознает оператор dBASE '**' или '^'.
NO_REMOVE Code Base будет использовать программу 'unlink'
вместо программы 'erase' для удаления файлов.
NO_SPAWNL Code Base не использует программу 'spawnl'.
Соответственно, Code Base программы 'm4edit' и
'm3edit' будут недоступными.
NO_STRLWR Программа 'strlwr' определяется Code Base
NO_STRUPR Программа 'strupr' определяется CCode Base
NO_STRNICMP Программа 'strnicmp' определяется CCode Base
PORTABLE Некоторые устройства требуют чтобы long integer
были выравнены по 4 байта, double были
выравнены по 8 байт и так далее. В этом случае
вы должны компилировать с этим переключателем.
VARARGS По умолчанию, Code Base использует ANSI C
соглашение для определения программ с
неопределенным (variable) числом параметров.
Когда установлен переключатель 'VARARGS', Code
Base использует Unix Sistem V соглашение.
Примеры:
Компиляция с Microsoft C и OS/2 используя большую модель памяти:
cl -zl -DOS2 -AL -c ?4*.c
Переключатели '-Ox' и '-Zl' определяют максимальную оптимизацию и
отсутствие информации, относящейся к автоматической загрузке библиотек
в получаемых объектных модулях. Эта информация не является необходимой
в библиотеке Code Base, так как она будет содержаться в объектном
модуле прикладной программы.
Компиляция Microsoft C используя опцию Clipper.
cl -Zl -DCLIPPER -AL -c ?4*.c
-285-
Для компиляции с Turbo C, используя большую модель памяти, опцию
совместимости Clipper и логику переполнения стека, файл конфигурации
'turboc.cfg' должен содержать следующее:
-LC:\tc\lib -Ic:\tc\include -ml -c -DTURBO -DCLIPPER -N
Это предполагает, что библиотечные файлы Turbo C находятся в каталоге
'c:\tc\lib', а файлы заголовков Turbo C находятся в каталоге
'c:\tc\include'.
-286-
.Begin Table C.
Изучение Code Base........................................1
Основные термины.......................................1
Понятие о базе данных..................................4
Начало работы..........................................4
Информация о компиляторах..........................5
Установка Code Base ...............................7
Запуск программы 'd4learn'.........................8
Создание прикладных программ с использованием
средств Code Base..........................8
Общие проблемы.........................................9
Список функций по категориям..........................11
Управление базой..................................11
Управление экраном................................12
Описание подпрограмм.....................................14
Функции Модификации/Редактирования (BROWSE/EDIT)......15
Функции преобразования формата........................24
Функции управления базой данных.......................35
Работа с несколькими файлами..........................35
Функции оценки выражений .............................83
Функции для работы с полями...........................89
Функции чтения.......................................110
Функции управления памятью...........................136
Функции работы с индексными файлами..................145
Функции работы с полями памяти.......................169
Функции работы с меню................................179
Сервисные функции....................................210
Функции работы с окнами..............................219
Некоторые сведения об окнах......................220
Пример использования функций управления окнами...221
Расширенные Функции..................................249
Работа в многопользовательской среде....................262
Блокирование и разблокирование.......................263
Байты подсчета записей...............................264
Тупиковая ситуация...................................264
Приложение..............................................265
Приложение A - Внутренняя организация Code Base......265
Формат буфера записей............................265
Номер указателя записи...........................265
Использование памяти Code Base...................266
Приложение B - Сообщения об ошибках..................269
Общие ошибки доступа к диску.....................269
Ошибки, связанные с базой данных.................270
Ошибки, связанные с работой в
многопользовательской среде..............272
Ошибки, связанные с оценкой выражений............272
Ошибки, связанные с файлами примечаний...........274
Ошибки, связанные с окнами и меню................274
Ошибки, связанные с отношениями..................274
Критические ошибки...............................275
Ошибки, связанные с сортировкой..................275
Приложение D - Выражения Code Base...................277
Общая информация о выражений.....................277
Константы выражений..............................277
Операторы выражений..............................277
Приоритет........................................277
Числовые операторы...............................278
-287-
Символьные операторы.............................278
Операторы отношения..............................279
Логические операторы.............................279
Функции в выражениях.............................280
Список функций...................................281
Приложение D - Построение библиотек..................285
Переключатели компиляции Code Base...............286
.End Table C.
|
|