Приложение 4

Графические команды и функции.


colorgr()
Задает графический режим CGA 320x200 точек, 4 цвета.
 egagr()
Задает графический режим EGA 640x350 точек, 16 цветов.
altgr()
Задает графический режим монохромный CGA 640x200 точек.
exitgr()
Выход из графического режима.
resetgr()
 Чистка экрана и перезадание графического режима.
cleargr()
Чистка экрана в графическом режиме без изменения
установленных графических параметров.

iclear(dX,dY)
Чистка участка экрана ширины dX и высоты dY от исходного
положения курсора.

grlocate(X1,Y1,X2,Y2)
Задание рабочей области экрана (левый нижний и правый
верхний углы).

scale(XMIN,XMAX,YMIN,YMAX)
Установка масштаба пользователя, так что XMIN - минимальное
значение X (на левом крае экрана), XMAX - максимальное
значение X (на правом крае экрана), YMIN - минимальное
значение Y (в нижней части экрана), YMAX - максимальное
значение Y в верхней части экрана).

clip()
Для соблюдения границ, определенных командой grlocate.

unclip()
Отмена режима соблюдения границ команды grlocate.

axes(XC,YC,dX,dY)
Разметка осей координат: XC,YC - координаты начала
координат, dX,dY - шаг разметки по оси X и Y.

color(N)
Задание цвета графики.

palette(N)
Задание палетты.

backcolor(N)
Задание цвета фона при печати символов в графическом режиме.

setuu()
Установка масштаба пользователя, определенного командой scale.

setgu()
Отмена масштаба пользователя.


- 288 -
textcolor(N)
Задание цвета текстового сообщения в графическом режиме.

textdir(N)
Задание направления печати текстового сообщения:
N=0 - 0 градусов
N=1 - 90 градусов
N=2 - 180 градусов
N=3 - 270 градусов

textsize(W,N)
Размер букв: W - ширина, N -высота, N=1 - нормальный размер,
при любом другом N - в N раз больше.

move(X,Y)
Установка курсора в точке с заданными координатами.

rmove(dX,dY)
Перемещение курсора на смещение (dX,dY) от текущего
положения курсора.

plot(X,Y)
Проведение линии от предыдущей позиции курсора до заданной.

rplot(dX,dY)
Рисование линии от текущего положения курсора на смещение
(dX,dY).

draw(X1,Y1,X2,Y2)
Проведение линии от точки (X1,Y1) до (X2,Y2).

ibar(dX,dY)
Столбчатая диаграмма с заданным типом штриховки, с шириной
dX и высотой dY от исходного положения курсора.

iframe(dX,dY)
Рамка ширины dX и высоты dY от исходного положения курсора.

iarc(R,A1,A2)
Рисование дуги с радиусом R, начальным углом A1, конечным
углом A2.

ipie(R,A1,A2,COLOR)
Рисование сектора с радиусом R, начальным углом A1, конечным
углом A2 цвета COLOR.

icircle(R)
Рисование окружности радиуса R.

imgsave(NAME)
Копия экрана в файл с именем NAME, в которое входит имя
драйва, поддиректории, имя файла, расширение.

imgread(NAME)
Считывание графики из файла с именем NAME, созданного
командой imgsave(NAME).


- 289 -
linetype(N)
Тип линии (N = 1, 2, 3).

hatchtype(N)
Тип штриховки (N = 1, 2, 3, 4, 5).

linewidth(N)
Ширина линии (N => 1, ширина в N раз больше нормальной).

frame()
Рамка, размер которой определен командой locate().

xradius(N)
Задание масштаба по оси X для команд iarc() и icircle().

yradius(N)
Задание масштаба по оси Y для команд iarc() и icircle().

grradius(N)
Задание масштаба радиуса для команд iarc() и icircle().

radianon()
Задание режима определения углов в радианах.

radianoff()
Задание режима определения углов в градусах.

message(TEXT)
Печать текстового сообщения на экран в графическом режиме.

delay(T)
Задержка на T мсек.

beep()
Звуковой сигнал.

pause()
Пауза.

sound(F,dT)
Включение звука частоты f Мгерц и продолжительности dT
миллисекунд.

pr_graph()
Твердая копия экрана в графическом режиме.




Дополнительные математические функции

sincl(A)
Синус угла A, угол - в радианах.

coscl(A)
Косинус угла A, угол - в радианах.


- 290 -
tancl(A)
Тангенс угла A, угол - в радианах.

asincl(R)
Арксинус R в радианах.

acoscl(R)
Арккосинус R в радианах.

atancl(R)
Арктангенс R в радианах.

powcl(X,Y)
X в степени Y в радианах.


ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ HALO-ГРАФИКИ И ДОПОЛНИТЕЛЬНЫХ ФУНКЦИЙ.


ПРИМЕР 1

Данный пример показывает способность рисования столбцов
гистограмм и эллипсов.

colorgr()
grlocate(0,300,0,180)
scale(-1.1,1.1,-1.1,1.1)
frame()
axes(-1,0,10,0.1)
move(-0.6,0.8)
color(1)
textcolor(1)
message("ДЕМОНСТРАЦИОННАЯ ЗАДАЧА")
move(-0.6,0.7)
plot(0.7,0.7)
color(1)
move(-0.5,0)
ibar(0.1,0.5)
color(2)
move(0,0)
ibar(0.1,0.3)
color(3)
move(0.5,0)
ibar(0.1,0.3)
color(4)
pi=3.1415926536
delta=0.01
i=0
r1=0.8
r2=0.4
do while i < 3
a=0
move(r1,-0.5)
do while a<2*pi
x=r1*coscl(a)
y=r2*sincl(a)-0.5
plot(x,y)

- 291 -
a=a+delta
enddo
r1=r1-0.1
r2=r2-0.1
i=i+1
enddo
pause()
exitgr()



ПРИМЕР 2

В данном примере строится гистограмма распределения весов
молодых людей, данные о которых находятся в файле Weight.dbf.
Файл Weight.dbf состоит из двух полей: Name - поле имени,
Weight - вес молодого человека.


colorgr()
grlocate(0,300,0,180)
scale(-0.15,1.1,-10,120)
frame()
axes(0,0,10,10)
i=0
do while i<11
i=i+1
move(-0.1,10*i)
s=str(10*i,3,0)
message(s)
endd
move(0.2,110)
color(1)
textcolor(1)
message("ВЕС МОЛОДЫХ ЛЮДЕЙ")
move(0.2,110)
plot(0.75,110)
color(1)
use weight
n=reccount()
textdir(1)
linetype(0)
i=0
do while i<n
i=i+1
if i>3
if i>6
color(i-6)
else
color(i-3)
endi
else
color(i)
endif
go i
move(0.1*i,0)
ibar(0.1,weight)

- 292 -
move(0.1*i+0.05,0)
message(name)
enddo
pause()
exitgr()






Дополнение к руководству по Clipperу.

Этот документ описывает изменения, произошедшие после печати
руководства по Clipperу '87. Рассмотрены темы :


- Изменения в существовавших командах и функция (FUNC)х

- Команды и функции, добавленные в язык позднее

- Команды и функции, не упомянутые в книге. Это касается тех из
них, чей статус был неясен в момент публикации.


ИЗМЕНЕННЫЕ КОМАНДЫ


*** CLEAR SCREEN

SCREEN -дополнительная опция, отключающая автоматическую очистку
GETов при очистке экрана.

*** IF

синтаксис : IF...ELSEIF...ELSE...ENDIF

Опция ELSEIF, добавленная в управляющую структуру IF, позволяет
проверять более одного случая в одной и той-же структуре. Это
означает, что управляющая структура IF теперь аналогична структуре DO
CASE. Предложение IF соответствует первому предложению CASE, ELSEIF
соответствует следующему CASE, а ELSE соответствует предложению
OTHERWISE. Можно переписать пример для команды DO CASE из главы 5
используя структуру IF...ELSEIF :
* Показать пункты меню
CLEAR
@ 3,25 PROMPT "1. Первый выбор "
@ 4,25 PROMPT "2. Второй выбор "
@ 5,25 PROMPT " Выход "

* Осуществить выбор
MENU TO choice

* Выполнить действия
IF (choice % 3) = 0
RETURN
ELSEIF choice = 1

- 293 -
DO One
ELSEIF choice = 2
DO Two
ENDIF
RETURN


*** PUBLIC/PRIVATE массивы

Массивы теперь можно объявлять глобальными. Для примера, следующее
предложение объявляет глобальный массив из 20 элементов :
PUBLIC arr[20], var1, var2


В дополнение к глобальным, можно создавать и локальные массивы,
используя предложение PRIVATE вместо DECLARE. Для примера, создадим
локальными два массива и три переменных :

PRIVATE array1[10], array2[20], var1, var2, var3

Объявление массива локальным дает точно такой же эффект как и
для любой другой изменяемой; глобальный или локальный массив,
созданный в процедуре более высокого уровня "прячется" и определяется
новый массив. Областью видимости нового определения всегда будет
текущая процедура. Можно отметить, что DECLARE всегда действовала так
же как и PRIVATE, пряча одноименные массивы, созданные в вышестоящей
процедуре. Преимущество использования PRIVATE состоит в том, что Вы
можете смешивать объявления массивов и переменных других типов.
*** SET RELATION

синтаксис : SET RELATION [ADDITIVE]

В команду SET RELATION добавлена опция ADDITIVE. Она позволит
Вам добавлять отношения к их текущему набору в текущей рабочей
области. Для примера :

* Задать первый набор отношений
USE Customer INDEX Customer
SELECT 2
USE Invoices INDEX Invoices
SELECT 1
SET RELATION TO Cust_num INTO Invoices
.
.
.
* Позднее долбавить новые детские отношения
SELECT 3
USE BackOrder INDEX BackOrder
SELECT 1
SET RELATION ADDITIVE TO Cust_num INTO BackOrder


ИЗМЕНЕННЫЕ ФУНКЦИИ

*** IF()

Функция IF() теперь выполняет только тот поток команд, который

- 294 -
соответствует результату логического выражения. Это значит, что
неопределенные или ошибочные указания в неисполненной части не
вычисляются. Для примера :


IF(.F., "Плохо" + 12, "Хорошо")

не генерирует сообщение об ошибке в выражении "Плохо" + 12,
поскольку оно никогда не вычисляется.



*** MEMOEDIT()

Syntax: MEMOEDIT(<вырС1>, [<вырЧ1>, <вырЧ2>, <вырЧ3>,
<вырЧ4>] [,<вырЛ1>] [,<вырС2>] [,<вырЧ5>]
[,<вырЧ6>] [,<вырЧ7>] [,<вырЧ8>]) [,<вырЧ9>] [,<вырЧ10>])

Предназначена для просмотра или редактирования символьных строк
и мемо полей.

Аргументы :
<вырС1> - символьная строка или мемо-поле подлежащее
редактированию.
<вырЧ1>,<вырЧ2>,<вырЧ3>,<вырЧ4> - определяют координаты окна
редактирования в следующем порядке : верхняя, левая, нижняя и правая.
Если они опущены, то используется весь экран.
<вырЛ1> - определяет, будет ли мемо редактироваться или просто
просматриваться. Если Вы укажете (.T.), то включается режим
редактирования. Если (.F.), то режим просмотра. По умолчанию
подставляется (.T.).
<вырС2> - имя функции пользователя (определенной в Clipperе),
которая исполняется при нажатии любой клавиши. Имя функции
указывается без скобок и аргументов. Подробности обсуждены ниже.
<вырЧ5> - определяет длину строки. Если <вырЧ5> больше чем
ширина окна (<вырЧ4>-<вырЧ2>-1), то производится горизонтальная
прокрутка. Длина по умолчанию = (<вырЧ4>-<вырЧ2>-1).
<вырЧ6> - определяет размер шага табуляции; по умолчанию = 4.
<вырЧ7> - строка мемо, в которую поместить курсор в начале
работы.
<вырЧ8> - столбец, в который поместить курсор в начале работы.
<вырЧ9> - начальная строка, в которую поместить курсор
относительно окна; по умолчанию = 0.
<вырЧ10> - начальный столбец, в который поместить курсор
относительно окна; по умолчанию = 0.

Все аргументы необязательны. Однако Вы должны передать пустышки
для тех аргументов, которые Вы хотите опустить.

Возвращает : символьную строку. MEMOEDIT() возвращает
модифицированную строку если работа закончена нажатием Ctrl-W, или
исходную - при нажатии Esc.

MEMOEDIT() - это универсальная функция (FUNC) редактирования текстов,
которую Вы можете использовать в Ваших клиппер-программах для различных
целей. Она поддерживает различные режимы, включает в себя
пользовательскую функцию, позволяющую переназначать клавиши и

- 295 -
программировать другие действия для текущей задачи редактирования.

Список клавиш, используемых MEMOEDIT():

Клавиши передвижения
-----------------------------------------------------------------
Клавиша Действие
-----------------------------------------------------------------
Стрелка вверх или Ctrl-E на строку вверх
Стрелка вниз или Ctrl-X на строку вниз
Стрелка влево или Ctrl-S на символ влево


Стрелка вправо или Ctrl-D на символ вправо
Ctrl-Стрелка влево или Ctrl-A на слово влево
Ctrl-Стрелка вправо или Ctrl-F на слово вправо
Home в начало текущей строки
End в конец текущей строки
Ctrl-Home в начало мемо
Ctrl-End в конец мемо
PgUp на окно вверх
PgDn на окно вниз
Ctrl-PgUp в начало текущего окна
Ctrl-PgDn в конец текущего окна


Клавиши редактирования
-----------------------------------------------------------------
Клавиша Действие
-----------------------------------------------------------------

Ctrl-Y Удалить текущую строку
Ctrl-T Удалить слово справа от курсора
Ctrl-B Переформатировать мемо в окне


Клавиши выхода
-----------------------------------------------------------------
Клавиша Действие
-----------------------------------------------------------------

Ctrl-W Закончить изменение и сохранить
Esc Прервать изменение и вернуть без изменений


Режим редактирования/просмотра

MEMOEDIT() поддерживает два режима отображения в зависимости от
значения <вырЛ1>. Если оно истинно (.T.), MEMOEDIT() входит в режим
редактирования; в противном случае MEMOEDIT() входит в режим
просмотра. В режиме просмотра все клавиши передвижения активны и
выполняют те же действия, что и при строки, с одним
исключением. При строки прокрутка отключена и Стрелка_вверх и
Стрелка_вниз передвигают курсор вверх или вниз на одну строку. При
просмотре прокрутка включена и Стрелка_вверх и Стрелка_вниз
прокручивают содержимое окна вверх или вниз на одну строку.


- 296 -
Пользовательская функция (FUNC)

Когда MEMOEDIT() вызывает пользовательскую функцию, она
автоматически передает ей три параметра: "режим"(mode),
"строка"(line) и "столбец"(col.). "Режим" показывает текущее
состояние MEMOEDIT(), зависящее от последней нажатой клавиши или
последнего действия предпринятого перед выполнением пользовательской
функции.

Возможные значения режимов MEMOEDIT()
-----------------------------------------------------------------
Режим Описание
-----------------------------------------------------------------
0 Действия не требуются
1 Переназначаемая или неизвестная клавиша
(мемо не изменилось)
2 Переназначаемая или неизвестная клавиша
(мемо изменилось)
3 Стартовый режим

Режим 3 - стартовый. Если Вы указали свою функцию, то MEMOEDIT
вызывает ее сразу же после своего запуска. В этот момент Вы
возвращаете код, конфигурирующий различные режимы MEMOEDITа : перенос
строки, прокрутка или вставка. MEMOEDIT повторно вызывает Вашу
функцию, оставаясь в стартовом режиме, пока Вы не вернете 0 (RETURN
0). После этого высвечивается текст и Вы начинаете работу в режиме,
определяемом <вырЛ1>.

Режимы 0, 1 и 2 используются для отработки нажатий клавиш. Режим
0 вызывается когда не осталось введенных клавиш, требующих обработки.
В этом режиме Вы обычно обновляете индикацию строк и столбцов.
MEMOEDIT() вызывает пользовательскую функцию при нажатии
"исключительных" клавиш, к которым относятся все управляющие,
функциональные и Alt клавиши. Поскольку эти клавиши не обрабатываются
MEMOEDIT, то в своей функции Вы можете их переопределить.
Два других параметра - "строка" и "столбец" указывают текущую
позицию курсора внутри окна на момент вызова пользовательской
функции. Параметр "строка" начинается с позиции 1, а "столбец" с 0.
Если режим равен 1, 2 или 3 Вы можете вернуть значение,
инструктирующее MEMOEDIT что делать дальше. Следующая таблица
перечисляет возможные возвращаемые значения :

Коды, возвращаемые пользовательской функцией
-----------------------------------------------------------------
Значение Действие
-----------------------------------------------------------------
0 Perform default action
1 - 31 Выполнить действия, сооветствующие нажатой клавише
(напр. 22 = Ctrl-V = Ins = переключить режим вставки)
32 Игнорировать данную клавишу (disable)
33 Обработать данную клавишу как данные
(insert control key)
34 Переключить режим переноса строк
35 переключить режим прокрутки


Есть два исключения во избежание совпадения кодов клавиш :

- 297 -

100 На следующее слово (2 = Ctrl-B = переформатировать)
101 В конец окна (23 = Ctrl-W = сохранить и выйти)

Отметьте, что клавиши управления курсором, Return, Backspace,
Tab, Del, и все символьные клавиши переопределять нельзя.

Перенос строк

Перенос строк - это состояние, которое Вы переключаете возвращая
из своей функции. По умолчанию оно включено; при этом Clipper
вставляет символы "мягкого" возврата каретки и перевода строки в
разрыв между словами, ближайший к границе окна либо к заказанной
длине строки (смотря что случится раньше). При выключенном режиме
переноса текст горизонтально прокручивается до достижения конца
строки. В этой точке Вы должны нажать Return (вставляя "жесткие"
символы возврата каретки и перевода строки) чтобы перейти на
следующую строку.
Символы "мягкого" возврата каретки могут мешать выдаче на экран
командами ? и REPORT FORM или обработке этого текста другим текстовым
процессором. При необходимости заменить эти символы на "жесткие"
пользуйтесь функция (FUNC)ми HARDCR() и MEMOTRAN().

Символы табуляции
-----------------

Если Вы назначаете аргумент размера табуляции (<expN6>),
MEMOEDIT() вводит в текст символы аппаратной табуляции (09H),
когда нажимается клавиша Tab. Если аргумент размера табуляции не
задан, то MEMOEDIT() вводит символы пробела. Размер табуляции
является глобальной изменяемой для целого memo и задается <expN6).
По умолчанию принимается 4.

Заметим, что MEMOEDIT() не преобразует символы табуляции в
пробелы, если включена истинная табуляция.

Пример: смотри ME.PRG и README.PRG

Чтобы отобразить на экране memo-поле без редактирования:
MEMOEDIT(Memo,5,10,20,69,.F.)
INKEY()

Для отображения на экране того же memo-поля без
редактирования, но с прокруткой:
MEMOEDIT(Memo,5,10,20,69,.F.,.T.)
INKEY()

Для редактирования текущего memo-поля:
REPLACE Memo WITH MEMOEDIT(Memo,5,10,20,69,.T.)


Для редактирования строки символов с использованием полного
экрана:
note=SPACE(1)
note=MEMOEDIT(note)

Этот пример демонстрирует функцию, определенную пользователем,

- 298 -
которая редактирует memo-поле внутри бокса с заглавием:
FUNCTION EditMemo
PARAMETERS memo,title,tr,tc,br,bc
PRIVATE temp_scr
SAVE SCREEN TO temp_scr
@ tr-1,tc-2 CLEAR TO br+1,bc+2
@ tr-1,tc-2 TO br+1,bc+2
@ tr-1,tc SAY "["+title+"]"
var=MEMOEDIT(memo,tr,tc,br,bc,.T.)
RESTORE SCREEN FROM temp_scr
RETURN(var)

library: EXTEND.LIB

См. также: ACHOICE(),DBEDIT(),HARDCR(),MEMOLINE(),
MEMOREAD(),MEMOTRAN(),MEMOWRIT(),MLCOUNT()





*** SELECT()

Кроме возврата номера текущей рабочей области, SELECT()
теперь может осуществлять контроль на существование синонима. Эту
процедуру SELECT() осуществляет, беря синоним как необязательный
аргумент типа символ и возвращая номер рабочей области как целую
переменную. Если синонима не существует, SELECT() возвращает 0.
Для примера:
USE Sales
.
.
.
ACCEPT "Введите имя файла БД: " TO dbf_file
IF SELECT(dbf_file) !=0
SELECT 0
USE dbf_file
ELSE
? "Файл уже открыт"
ENDIF




*** TYPE()

Написание: TYPE(<вырС>)

Использование: вернуть тип заданного выражения символов.

Аргумент: <вырС> - выражение, которое проверяется на тип
выражения. Оно может включать поля (включая синонимы), переменную
памяти или выражение любого типа.

Возврат: TYPE() возвращает один из следующих символов:

Возврат Значение

- 299 -
-------------------------
С символ
D дата
L логическая переменная
N цифра
M memo-поле
A массив
U неопределено
UE синтаксическая ошибка
UI неопределенная ошибка

Применение: TYPE() возвращает тип выбранного выражения.
Расширенные возможности этой функции могут быть использованы для
проверки истинности выражения. Однако существует несколько
специальных случаев, таких как:
Ссылки на массивы: ссылки на описанные (DECLAREd) массивы
возвращают "A". Ссылки на элементы массива возвращают тип элемента
массива. Ошибочные ссылки возвращают "U".

IF()/IIF(): Чтобы возвратить соответствующий тип данных для
для IF(), TYPE() оценивает условие и затем возвращает тип
полученного результата для ветви, по которой проводилась оценка.
Если условие оператора IF() или вычисленное значение для ветви
оператора ошибочны, то TYPE() возвращает "UE".

Функции, определенные пользователем, и функции из библиотеки
EXTEND.LIB: Если ссылка сделана где-нибудь в выражении на функцию,
которая не найдена в CLIPPER.LIB (определенные пользователем или
функции из EXTEND.LIB), то TYPE() возвращает "UI".

Пример: ?TYPE("Alias_name->Fldvar")
?TYPE([SUBSTR("Привет",4,5)]) && результат: C
?TYPE([UDF()]) && результат: UI
?TYPE([IF(.T.,"true",12)]) && результат: C

library: CLIPPER.LIB






Новые функции
-------------


*** ALTD()

Написание: ALTD([<вырN>])

Использование: Выполнить программу отладки (debugger) или
запретить/разрешить использование клавиш Alt-D для ее вызова.

Аргумент: <вырN> - устанавливает режим вызова при нажатии
Alt-D:
0 - запрещено
1 - разрешено

- 300 -
2 - ошибка

Возврат: Нет.

Применение: Если аргумент не задан, то отладчик вызыввается,
отображая на экране последнее содержимое экрана. Задавая тройку
как аргумент, при вызове отладчика на экране отобразятся
переменные: Viem Privates screen.

library: CLIPPER.LIB

См. также: SETCANCEL(),SET ESCAPE





*** DBFILTER()

Написание: DBFILTER()

Использование: Определяет выражение FILTER SET для текущей
рабочей области.

Возврат: Строка символов.

DBFILTER() возвращает как последовательность символов условие
фильтра, определенное в текущей рабочей области. Если FILTER не
был установлен, то DBFILTER() возвращает нулевой стринг ("").

Пример:
Следующая функция (FUNC) CreateQry(), определенная пользователем,
использует DBFILTER(), чтобы создать файл в памяти, содержащий
выражение текущего фильтра в изменяемой "qry_string". Файл имеет
расширение "qwy", чтобы отразить тот факт, что он содержит запрос.

FUNCTION CreateQry
PARAMETERS qry_name,alias
*
IF PCOUNT() < 2
qry_string=DBFILTER()
ELSE

qry_string=&∓alias.->(DBFILTER())
ENDIF
SAVE ALL LIKE qry_string TO &qry_name..qwy
RETURN ""

Несколько позже Вы можете восстановить файл запроса,
созданный CreateQry(), следующей функцией SetFilter(),
определенной пользователем. Эта функция (FUNC) Восстанавливает файл
запроса и затем устанавливает FILTER TO в состояние, хранящееся
в изменяемой "qry_string".

FUNCTION SetFilter
PARAMETERS qry_name
*

- 301 -
RESTORE FROM &qry_name..qwy ADDITIVE
SET FILTER TO &qry_string.
RETURN ""

library: CLIPPER.LIB

См. также: DBRELATION,DBRSELECT(),SET FILTER





*** DBRELATION()

Написание: DBRELATION(<вырN>)

Использование: Определяет связывающее выражение установленных
отношений в текущей рабочей области.

Возврат: Стринг.

DBRELATION() возвращает последовательность символов,
содержащую выражение отношения, на которую ссылается <вырN>.
Если не существует RELATION SET для <вырN>, DBRELATION()
возвращает нулевой стринг.

Применение: DBRELATION() применяется в комбинации с
DBRSELECT(), чтобы опросить линкованное выражение и рабочую
область на существующее отношение. Используя эти функции
еще к DBFILTER(), Вы можете создать Viem систему,
аналогичную существующим в DBASE III PLUS и в утилите Clipperа,
DBU.EXE. По существу, Вы используете эти функции для создания
определения Viem из существующего набора функций.

Пример:
USE Customer INDEX Customer
SELECT 2
USE Invoices INDEX Invoices
SELECT 3
USE BackOrder INDEX BackOrder
SELECT 1
SET RELATION TO Cust_num INTO Customer;
TO Cust_num INTO BackOrder

*
?DBRELATION(2) && результат: Cust_num

library: CLIPPER.LIB

См. также: DBFILTER(),DBRSELECT(),SET RELATION


*** DBRSELECT()

Написание: DBRSELECT(вырN)

Использование: Определить целевую рабочую область с заданным

- 302 -
отношением, определенным в текущей рабочей области.

Аргумент: (вырN) - начальная позиция в списке отношений,
определенных в текущей рабочей области.
Возврат: Численное значение целого типа.
DBRSELECT() возвращает рабочую область, на которую ссылается
(вырN). Если для (вырN) отношение не установлено, то DBRSELECT()
возвращает 0.

Применение: DBRSELECT() применяется в комбинации с
DBRELATION(), чтобы запросить рабочую зону и связывающее
выражение на существования отношения. Используя эти функции
вместе с DBFILTER(), Вы можете создать Viem систему, аналогичную
существующим в DBASE III PLUS и в утилите Clipperа,DBU.EXE.
По существу, Вы используете эти функции для создания определения
Viem из существующего набора функций.

Так как номер рабочей области является конкретной информацией
окружающей обстановки, Вам возможно потребуется имя синонима, если
Ваше приложение не зависит от конкретной рабочей области. В этом
случае выражение для получения синонима отношения:
ALIAS(DBRSELECT(<вырN>)

Пример:
USE Customer INDEX Customer
SELECT 2
USE Invoices INDEX Invoices
SELECT 3
USE BackOrder INDEX BackOrder
SELECT 1
SET RELATION TO Cust_num INTO Customer;
TO Cust_num INTO BackOrder
*
?DBRELATION(2) && результат: Cust_num
?DBRSELECT(2) && результат: 3
?ALIAS(DBRSELECT(2)) && результат: BACKORDER

library: CLIPPER.LIB

См. также: SET RELATION,DBFILTER(),DBRELATION()




*** DOSERROR()

Написание: DOSERROR()

Использование: Определяет номер последней ошибки DOSа.

Возврат: Целая числовая величина.

Применение: DOSERROR() используется в комбинации с функция (FUNC)ми
ошибки Misc_error() и "RUN error", чтобы определить, имела ли
место ошибка из-за недостатка памяти или из-за невозможности
локализации COMMAND.COM.


- 303 -
library: CLIPPER.LIB

См. также: FERROR()





*** ERRORLEVEL()

Написание: ERRORLEVEL([<вырN>])

Использование: Возвратить текущий установленный уровень ошибки
DOSа и с необязательностью установить уровень ошибки DOSа на новую
величину.

Аргумент: <вырN> - новый устанавливаемый уровень ошибки DOSа.
Это может быть величина от 0 до 255.

Возврат: Целая числовая величина.

ERRORLEVEL() возращает текущий установленный уровень ошибки
DOSа.

Применение: ERRORLEVEL() используется главным образом с
SWITCH.EXE, чтобы составить в последовательность выполнение
прикладных программ. В качестве примера, предположим, Вы имеете
основную программу с именем HELLO.EXE и в зависимости от
конкретного условия необходимо выполнить одну из следующих
программ ONE.EXE,TWO.EXE или THREE.EXE. Вы можете сделать это,
установив уровень ошибки сразу перед выходом в DOS:

DO CASE
CASE choice="ONE"
err_lev=1
CASE choice="TWO"
err_lev=2
CASE choice="THREE"
err_lev=3
ENDCASE
ERRORLEVEL(err_lev) && установка уровня ошибки
QUIT

Затем Вы выполните SWITCH из напоминания DOSа, устанавливая
список выполняемых прикладных программ в соответствии с уровнями
ошибок, определенными в основной программе. Для примера:

C>SWITCH HELLO ONE TWO THREE

Пример:
error_level=ERRORLEVEL() && текущий уровень ошибки
ERRORLEVEL(1) && установить новый уровень

library: CLIPPER.LIB




- 304 -


*** READEXIT()

Написание: READEXIT([<вырL>])

Использование: Назначить клавиши Uparrow и Dnarrow как клавиши
выхода из READ.

Аргумент: <вырL> назначает клавиши Uparrow и Dnarrow как
клавиши выхода из READа. Значение "истина" (.T.) делает эти
клавиши активными. По умолчанию Clipper устанавливает значение
"ложь" (.F.).

Возврат: Логическое значение.

READEXIT() возвращает новое установленное значение.

Пример:
var=SPACE(10)
READEXIT(.T.)
@10,10 SAY "Введите: " GET var
READ
READEXIT(.F.)

library: CLIPPER.LIB

См. также: @...SAY...GET,READ,READINSERT()





*** READINSERT()

Написание: READINSERT([<вырL>])

Использование: Описать текущий режим вставки, установленный для
READ и MEMOEDIT() и с необязательностью включить или выключить
его.

Аргумент: <вырL> - включает или выключает режим вставки.
Истина (.T.) - включает режим вставки, ложь (.F.) - выключает.
По умолчанию Clipper устанавbr /∓ливает значение ложь (.F.).

Возврат: Логическое значение.

READINSERT() возвращает текущий установленный режим вставки,
если аргумент не задан, и предыдущий режим вставки, если аргумент
задан.

Пример:
Ниже происходит установка режима вставки в состояние,
предшествующее входу в MEMOEDIT() и происходит сброс
предшествующего состояния при прекращении работы MEMOEDIT():

ins_mode=READINSERT() && включить режим вставки

- 305 -
x=MEMOEDIT(x)
READINSERT(ins_mode) && восстановить прежнюю установку

library: CLIPPER.LIB

См. также: READ,MEMOEDIT(),READEXIT()





*** RESTSCREEN()

Написание: RESTSCREEN(<вырN1>,<вырN2>,
<вырN3>,<вырN4>,<вырC>)

Использование: Отобразить на экране в заданной зоне ранее
заполненную область экрана.

Аргументы: <вырN1>...<вырN4> - координаты зоны экрана, в
которой необходимо отобразить данные, хранящиеся в <вырC>.

<вырC> - последовательность символов, содержащая данные,
которые необходимо отобразить на экране.

Возврат: Нет.

Применение: RESTSCREEN() используется для вывода на экран
зоны экрана, которая ранее была заполнена функцией SAVESCREEN().
Область экрана для восстановления этих данных может быть той же
или другой. Если Вы определяете новую зону экрана, то будьте
уверены, что ее размеры такие же, как и у старой или иначе Вы
получите сомнительные результаты. Кроме того, не применяйте
RESTORE SCREEN для восстановления зон экрана, заполненных
SAVESCREEN(), или иначе Вы получите одинаково сомнительные
результаты.

Примечание: RESTSCREEN() не поддерживается экранным драйвером
ANSI.OBJ.

Пример:
winbuff=SAVESCREEN(1,1,20,40)
<предложения>...
RESTSCREEN(1,1,20,40,winbuff)

library: EXTEND.LIB

См. также: RESTORE SCREEN,SAVE SCREEN,SAVESCREEN()





*** SAVESCREEN()

Написание: SAVESCREEN(<вырN1>,<вырN2>,
<вырN3>,<вырN4>)

- 306 -

Аргументы: <вырN1>...<вырN4> - координаты зоны экрана,
которая будет запомнена.

Возврат: Последовательность символов.

SAVESCREEN() возвращает в виде стринга длиной до 4000 байт
содержимое заданной зоны экрана.

Применение: SAVESCREEN() применяется для сохранения области
экрана в памяти. Для восстановления неполного экрана применяйте
RESTSCREEN().

Обычно Вы сохраняете и восстанавливаете зону экрана при
работе с pop-up меню или при растягивании объектов экрана.

Примечание: SAVESCREEN() не поддерживается экранным драйвером
ANSI.OBJ.

Пример:
Следующая функция (FUNC), определенная пользователем, создает pop-up
меню, используя ACHOICE() в комбинации с SAVESCREEN() и
RESTSCREEN(), возвращая номер сделанного выбора из имевшегося
массива выборов:
FUNCTION PopUp
PARAMETERS t,l,b,r,choices,ufunc,color
PRIVATE winbuff,menuchoice,lastcolor

*Сохранить установки.
winbuff=SAVESCREEN(t,l,b,r)
lastcolor=SETCOLOR(color)

*Очистить область и показать меню.
@t,l to b,r DOUBLE
menuchoice=ACHOICE(t+1,l+1,b-1,r-1,;
choices,ufunc)

*Очистить и закончить.
RESTSCREEN(t,l,d,r,winbuff)
SET COLOR TO (lastcolor)

RETURN menuchoice

library: EXTEND.LIB

См. также: RESTORE SCREEN,SAVE SCREEN,RESTSCREEN()





*** SETCANCEL()

Написание: SETCANCEL([вырL])

Использование: разрешить или запретить действие ключа окончания
работы Ctr-C.

- 307 -

Аргумент: <вырL> - разрешает или запрещает способность
окончания работы. Значение "истина" (.T.) разрешает способность
окончания работы, значение "ложь" (.F.) - запрещает.

Возврат: SETCANCEL() возвращает предшествующее состояние,
если задан аргумент, и текущее - если аргумент не задан.

library: CLIPPER.LIB

См. также: ALTD(),SET ESCAPE





*** SETCOLOR()

Написание: SETCOLOR([вырC])

Использование: возвратить текущую или предшествующую установку
цвета и с необязательностью определить цвета для дальнейшей
работы.

Аргументы: <вырC> - последовательность символов, содержащая
цвета обычной и повышенной яркости, цвета границы и фона.

В отличие от SET COLOR TO,SETCOLOR() без аргумента не
восстанавливает цвета до их значений, определенных по умолчанию.
Заметим также, что SETCOLOR() работает только с буквенным
описанием символов, а не с численным.

Возврат: последовательность символов.

SETCOLOR() возвращает стринг, представляя последнюю установку
цветов, если задан аргумент (вырC), и текущую установку, если
аргумент не задан.

Применение: SETCOLOR() поддерживает такую же установку
цветов, как и SET COLOR.

Стандартный/усиленный: "стандартный" и "усиленный" - это пара
цветов с одинаковым фоновым цветом.

"Стандартный" используется всеми функция (FUNC)ми ввода, такими как
@...SAY и ?. "Усиленный" действует только при GETах.

Граница: Устанавливает цвет границы.

Фон: В настоящее время фон не поддерживается на машинах, для
которых Nantucket производит драйверы.

Атрибуты: Повыщенная яркость и мигание задаются атрибутами
цвета. Повышенная яркость задается знаком "+", а мигание "*".
Каждый заданный атрибут указывается при основном цвете,
независимо от того, где он встречается в определении
установки.

- 308 -

Цвета: Ниже приводится список всех возможных цветов.

Таблица цветов Clipperа.
-----------------------------------------------------------------
Цвет Обозначение
-----------------------------------------------------------------
Черный N/пробел
Синий B
Зеленый G
Пурпурный BG
Красный R
Фиолетовый RB
Коричневый GR
Белый W
Серый N+
Желтый GR+
Пустой X
Подчеркивание U
Инверсированный I
-------------------------------------------------------------------

Примеры:
* Получить текущую установку цвета.
сurr_col = SETCOLOR()
* Установить новый цвет.
SETCOLOR("BR+/N,R+/N")
* Получить текущую установку цвета и установить новую.
new_color = "BR+/N, R+/N"
old_color = SETCOLOR(new_color)
* Цвета по умолчанию.
SET COLOR TO
SETCOLOR()

library: EXTEND.LIB
См. также: SET COLOR TO.

Дополнительные Возможности.
==========================

Эта глава содержит информацию и инструкции по созданию
собственных функций пользователя на различных языках программирования
таких например, как Си и Ассеблер.


Содержание.
-----------

1. Описание возможностей расширеннной системы.

2. Список стандартных функций расширенной системы.

3. Интерфейс с языком Си.

4. Примеры функий на Си.

5. Компиляция и линковка программ на Си.

- 309 -

6. Интерфейс с языком Ассемблера.

7. Примеры функий на языке Ассемблера.

8. Использование Macro для Ассемблера.

9. Изменения по сравнению с версией 86 года.