шаблоном ввода данных. Запомните, что вы должны вначале
установить окно, а лишь затем использовать эти функции.
void init_template(WINDOW *wnd)
Эта функция инициализирует окно для использования в нем
шаблона ввода данных. Она устанавливает связной список структур
FIELD и производит очистку всех существующих дескрипторов.
Структура FIELD, описывающая характеристики полей ввода данных,
определена в twindow.h (см. Главу 6). Функция inint_template
предназначена для выполнения двух задач. Во-первых, она
инициализирует окно; во-вторых, если окно инициализировано, она
осуществляет поиск и уничтожение всех установленных на данный
момент полей окна; следовательно, использование этой функции
возможно в ситуации, когда шаблон окна не является достаточно
большим, так как использование функции приводит к освобождению
структур FIELD.
FIELD *establish_field
(WINDOW *wnd,int x,int y,char *msk,char *bf,int t)
Эта функция устанавливает поля ввода данных в окне, которое
было инициализировано функцией init_template как окно с шаблоном
ввода данных. Символы x и y суть координаты, специфицирующие
размещение маски поля ввода, причем предпочтительнее указывать
координаты относительно окна, а не экрана. Указатель bf суть
указатель на определяемый при обращении буфер сбора данных.
Параметр t (значение типа integer) указывает тип поля ввода
данных. Различают следующие типы полей:
А = алфавитно-цифровое
N = цифровое, незначащие разряды заполнены пробелами
Z = цифровое, незначащие разряды заполнены нулями
С = поле денежной единицы
D = поле даты
Указатель msk является указателем на символ маски, который
определяет длину поля и управляет отображением символа пунктуации
на экране (причем последние не контролируются в буфер сбора
данных поля). Маска включает в себя обычно несколько символов.
Символ подчеркивания указывает позицию символа, который должен
быть введен в данном месте. Массив bf должен содержать столько
символов, сколько символов подчеркивания содержит маска, плюс
один символ (для символа конца строки \0).
Поле денежной единицы может иметь произвольное число цифр
слева от десятичной точки и две цифры справа от нее.
Дата должна соответствовать формату "ММДДГГ". Если
пользователь неправильно ввел дату, программа выдает сообщение об
ошибке и требует от пользователя повторного ввода даты.
Функция establish_field возвращает указатель на структуру
FIELD, определенную в twindow.h. Вы можете использовать этот
указатель при обращении к field_window, field_help, field_protect
и field_validate, которые описаны ниже.
void wprompt(WINDOW *wnd, int x, int y, char *s)
Эта функция осуществляет выдачу приглашения на ввод данных в
окно. Приглашение на ввод данных является строкой s, которая
выдается, начиная с координат окна, задаваемых значениями х и у.
void field_tally(WINDOW *wnd)
При обращении к этой функции на экран дисплея выводятся
значения всех данных, хранящихся в буфере, для всех полей
шаблона. Вы можете использовать эту функцию, когда, например, вы
заполнили буфер значениями из записи базы данных.
void field_window(FIELD *fld, char *helpname, int x, int y)
Эта функция обеспечивает выдачу контекстно-зависимого
help-окна для каждого поля шаблона. Параметр helpname является
строкой, содержащей мнемонику help-окна в текущем help-файле, и
специфицируется предварительно путем обращения к функции
load_help (см. Главу 7). Точно так же, как функция data_entry
осуществляет переход от поля к полю, обращение к функции set_help
для каждого из полей позволяет привязать конкретное help-окно для
каждого из них. Параметры х и у позволяют специфицировать позицию
экрана, с которой будет осуществляться выдача help-окна.
Заметьте, что эта функция, а также еще три, рассмотренные
ниже, не требуют наличия в списке параметров указателя WINDOW.
Для этих функций достаточно указателей FIELD, так как эти
указатели представляют собой указатели на цепочку связного
списка, который и осуществляет привязку функции к конкретному
окну. Эти функции модифицируют определенные ранее поля, не
обращая внимания на то, что они принадлежат конкретному шаблону
окна.
void clear_template(WINDOW *wnd)
Эта функция освобождает буферы сбора данных всех полей
шаблона, обращая их в пустую строку, заканчивающуюся нулевым
символом конца строки, а также отображает на экране все поля
шаблона.
void field_validate(FIELD *fld, int (*validfn)())
Эта функция относится к макросам. Она использует адрес
функции проверки допустимости вводимых значений (если таковая
будет написана пользователем). Стандартные функции,
осуществляющие проверку допустимости вводимых в поля данных,
обычно не осуществляют требуемой проверки на ошибочную ситуацию.
По этой причине пользователь обычно сам пишет функцию,
производящую контроль данных. Функция data_entry будет
осуществлять обращение к определенным вами функциям контроля
данных после того, как ею самой будет осуществлен их первичный
контроль. Если это так, то она будет передавать в эти ваши
функции адрес буфера сбора данных, и разработанные вами функции
контроля данных смогут осуществить проверку введенных
пользователем значений, находящихся уже в буфере. Ваша функция
контроля допустимости данных может содержать вызов функции
error_message (см. Главу 6) для обработки ситуации, когда будет
обнаружено недопустимое значение. При этом определенная вами
функция контроля данных должна возвращать лишь два значения ОК
или ERROR, которые, в свою очередь, определены в twindow.h. Если
функция возвращает значение ОК, то функция data_entry будет
обрабатывать следующее поле шаблона. Если же функция контроля
возвращает значение ERROR, то функция data_entry "остановится" на
поле, в данных которого обнаружена ошибка.
void field_protect(FIELD *fld, int prot)
Эта функция также относится к макросам. Она устанавливает
или отменяет (в зависимости от значения параметра prot) защиту
характеристик поля. Защищенное поле не обрабатывается
(игнорируется) функцией data_entry. Используя функцию
field_protect, вы можете управлять доступом пользователей к полям
шаблона, разрешая или запрещая запись в них данных.
Эта функция может использоваться совместно с функциями field
_validate, clear_template и field_fally для контроля над
изменениями, производимыми в записях базы данных, в случае, если
элементы записи базы данных отображаются в шаблоне.
Для понимания того, как значительно расширяет возможности
программы использование функции field_protect, рассмотрим шаблон,
изображенный на рисунке 8.1. Примите во внимание, что этот шаблон
содержит поля, образующие запись по одному служащему в файле базы
данных. Шаблон ввода данных используется для ввода, отображения,
поиска и изменения записей в файле. Перед началом ввода данных
ваша программа может обратиться к функции field_protect для
защиты всех полей, кроме поля "номер служащего". Затем вы можете
обратиться к функции field_validate, передав ей указатель на
обычные, разработанные вами функции контроля данных на
допустимость. После того, как пользователь введет данные в поле
"номер служащего", функция data_entry (будет описана позже)
осуществит обращение к разработанной вами функции контроля
данных, которая осуществит поиск и сравнение по ключу (номер
служащего) нужной записи в базе данных. Функция контроля данных
произведет загрузку соответствующих буферов накопления данных
элементами данных из найденной записи базы данных, а затем
обратится к функции field_fally для вывода значений элементов
данных на экран. После этого будет вызвана функция field_protect
для установки защиты для поля "номер служащего" и снятия защиты с
остальных полей. В итоге функция контроля данных передаст
управление функции data_entry, и пользователь получит возможность
произвести коррекцию значений элементов данных. По завершении
пользователем процесса обработки записи система передаст
управление прикладным функциям, которые непосредственно будут
обращаться в data_entry. Эти функции могут перезаписать
откорректированную запись в файл, очистить буфера данных и
шаблоны путем обращения к функции clear_template, переопределить
защиту полей шаблона (а значит, и записи), сняв защиту с поля
"номер служащего" и установив защиту для других полей, и
повторить весь процесс обработки записи заново.
ЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД¬
¦ ¦
¦ ¦
¦ ¦
¦ ЪДДДДДДДДДДДДEmployee RecordДДДДДДДДДДД¬ ¦
¦ ¦ ¦ ¦
¦ ¦ Employee #: 377 ¦ ¦
¦ ¦ Name: Otis Cribblecoblis ¦ ¦
¦ ¦ Department: 2001 ¦ ¦
¦ ¦ Salary: 15450.00 ¦ ¦
¦ ¦ Date Hired: 01/02/55 ¦ ¦
¦ ¦ SSN: 221-52-1234 ¦ ¦
¦ ¦ ¦ ¦
¦ ¦ ¦ ¦
¦ АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ ¦
¦ ¦
¦ ¦
¦ ¦
АДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ
Рис. 8.1. Пример шаблона ввода данных
void field_help(FIELD *fld, int (*helpfn)())
Эта функция относится к макросам. Она позволяет вам
установить специальную help-функцию, которая будет вызываться
вместо стандартной help-функции. Эта функция используется для
отдельных полей шаблона, когда пользователю требуется получить по
ним более полную help-информацию, чем ему предоставлено текстом,
отображаемым в окне.
В процессе ввода данных в окно у пользователя могут
возникнуть различные вопросы относительно как предназначения
окна, так и вида входных данных. Для получения ответов на свои
вопросы пользователю достаточно нажать на специально выделенную
help-клавишу, которая инициирует обращение к специальной
help-функции. Функция data_entry передаст адрес буфера накопления
данных поля, что впоследствии даст возможность специальной
help-функции вернуть текущее значение в поле.
Эта отличительная черта функции field_help используется,
когда имеется список возможных значений, из которых пользователь
должен осуществлять выбор, но отображение всего списка в окне
постоянно нецелесообразно. Вы можете открыть еще одно окно для
выдачи help-информации с помощью вашей специальной help-функции,
отобразить в нем весь список возможных значений и затем
использовать функцию get_selection (см. Главу 6) для обеспечения
выбора пользователем нужного ему значения. Вы также можете, как
это делается в примере, который представлен в этой главе ниже,
записывать текущую дату в буферы накопления данных полей. Вам
предоставлена возможность осуществлять запросы к базе данных.
Очевидно, что при работе с записями файла "Служащий" базы данных