Кларион. Руководство программиста - 2 - 1. Введение.......................................................9 2. Формат программы и операторов..................................10 2.1. Формат предложений...........................................10 2.2. Формат операторов............................................10 2.3. Оператор МЕТКА...............................................11 2.4. Резервируемые (служебные) слова..............................11 2.5. Специальные символы..........................................11 2.6. Компилирование Clarion-программы.............................12 2.7. Оператор PROGRAM.............................................13 2.8. Оператор МEMBER..............................................13 2.9. Структура МАР................................................14 2.9.1. Оператор PROC..............................................14 2.9.2. Оператор FUNC..............................................14 2.9.3. Структура MODULE...........................................15 2.9.4. Атрибут BINARY.............................................15 2.9.5. Структура AREA.............................................15 2.9.6. Структура OVERLAY..........................................15 2.10. Оператор PROCEDURE..........................................16 2.11. Оператор FUNCTION...........................................16 2.12. Параметры операторов PROCEDURE и FUNCTION...................16 2.12.1. Локальные параметры.......................................16 2.12.2. Внешние параметры.........................................17 2.13. Оператор CODE...............................................17 2.14. Оператор ROUTINE............................................17 2.15. Оператор END................................................17 2.16. Директивы компилятора.......................................17 2.16.1. Директива TITLE...........................................17 2.16.2. Директива SUBTITLE........................................18 2.16.3. Директива EJECT...........................................18 2.16.4. Директива OMIT............................................18 2.16.5. Директива SOURCE..........................................18 2.16.6. Директива INCLUDE.........................................18 2.16.7. Атрибут LIST..............................................19 3. Объявление переменных..........................................20 3.1. Объявление операторов........................................20 3.1.1. Оператор BYTE..............................................20 3.1.2. Оператор SHORT.............................................20 3.1.3. Оператор LONG..............................................20 3.1.4. Оператор REAL..............................................21 3.1.5. Оператор DECIMAL...........................................21 3.1.6. Оператор STRING............................................21 3.2. Обозначения шаблона..........................................22 3.2.1. Числовой и денежный шаблоны................................22 3.2.2. Научное представление шаблонов.............................24 3.2.3. Шаблоны дат................................................24 3.2.4. Шаблоны времени............................................25 3.2.5. Форматированные шаблоны....................................26 3.2.6. Символьные шаблоны.........................................26 3.3. Оператор EXTERNAL............................................26 3.4. Атрибуты EXTERNAL............................................27 3.5. Структура GROUP..............................................27 3.6. Неявные переменные...........................................27 3.7. Атрибуты переменных.........................................28 3.7.1. Атрибут PRE................................................28 3.7.2. Атрибут OVER...............................................28 3.7.3. Атрибут DIM................................................28 3.8. Массивы как параметры процедур и функций.....................29 - 3 - 3.9. Директивы компиляторa........................................29 3.9.1. Директива EQUATE...........................................29 3.9.2. Директива SIZE.............................................29 4. Выражения......................................................31 4.1. Функции......................................................31 4.2. Числовые константы...........................................31 4.3. Числовые операторы...........................................32 4.4. Числовые выражения...........................................32 4.5. Символьные константы.........................................32 4.6. Вычисление числовых и символьных выражений...................33 4.7. Операторы конкатенации.......................................33 4.8. Символьные выражения.........................................34 4.9. Логические операторы.........................................34 4.10. Логические выражения........................................34 4.11. Постоянные выражения........................................35 4.12. Функции в выражениях........................................35 5. Oператоры присваивания.........................................36 5.1. Операторы присваивания.......................................36 5.2. Опepaтopы пpиcвaивaния и действия............................36 5.3. Оператор CLEAR...............................................37 5.4. Пpaвилa пpeoбpaзoвaния дaнныx................................37 6. Oператоры управления...........................................39 6.1. Oпepaтop вызoвa пpoцeдypы....................................39 6.2. Oпepaтop GOTO................................................39 6.3. Oпepaтop DO..................................................39 6.4. Oпepaтop EXIT................................................40 6.5. Оператор IF..................................................40 6.6. Cтpyктypa CASE...............................................41 6.7. Cтpyктypa EXECUTE............................................41 6.8. Cтpyктypa LOOP...............................................42 6.9. Oпepaтop CYCLE...............................................43 6.10. Oпepaтop BREAK..............................................43 6.11. Oпepaтop RETURN.............................................43 6.12. Oпepaтop RESTART............................................43 6.13. Oпepaтop STOP...............................................44 6.14. Oпepaтop CALL...............................................44 6.15. Oпepaтop CHAIN..............................................44 6.16. Oпepaтop RUN................................................45 7. Доступ к монитору и клавиатуре.................................46 7.1. Опepaтopы клaвиaтypы и мoнитopa..............................46 7.1.1. Опepaтop SHOW..............................................46 7.1.2. Oпepaтop LOOK..............................................46 7.1.3. Oпepaтop BLANK.............................................47 7.1.4. Oпepaтop SCROLL............................................47 7.1.5. Oпepaтop ASK...............................................47 7.1.6. Oпepaтop ALERT.............................................48 7.1.7. Oпepaтop ALIAS.............................................48 7.1.8. Oпepaтop HELP..............................................49 7.1.9. Oпepaтop IDLE..............................................49 7.1.10. Oпepaтop SETCURSOR........................................50 7.1.11. Oпepaтop TYPE.............................................50 7.2. Bидeo-aтpибyтныe oпepaтopы...................................50 7.2.1. Oпepaтop SETHUE............................................50 7.2.2. Опepaтop BLINK.............................................51 7.2.3. Oпepaтop ENHANCE...........................................51 - 4 - 7.2.4. Oпepaтop REVERSE...........................................51 7.2.5. Опepaтop NORMAL............................................51 7.2.6. Oпepaтop COLOR.............................................52 7.2.7. Koды видeoaтpибyтoв........................................52 7.2.8. Oпepaтop PALETTE...........................................52 7.3. Фyнкции клaвиатуры/мoнитopa..................................53 7.3.1. Фyнкция REFER..............................................53 7.3.2. Фyнкция KEYCODE............................................53 7.3.3. Фyнкция KEYBOARD...........................................53 7.3.4. Фyнкция FOREHUE............................................53 7.3.5. Фyнкция BACKHUE............................................53 8. Oбработка экранов..............................................54 8.1. Cтpyктypa экpaнa.............................................55 8.1.1. Oпepaтop SCREEN............................................55 8.1.2. Aтpибyт WINDOW.............................................55 8.1.3. Aтpибyт AT.................................................56 8.1.4. Пoзициoнныe aтpибyты.......................................56 8.1.5. Пoзициoнный aтpибyт ROW....................................57 8.1.6. Пoзициoнный aтpибyт COL....................................57 8.1.7. Oпepaтop STRING............................................58 8.1.8. Oпepaтop PAINT.............................................58 8.2. Oпepaтop ENTRY...............................................58 8.3. Атрибуты полей ввода.........................................59 8.3.1. Aтpибyт LFT................................................59 8.3.2. Aтpибyт UPR................................................59 8.3.3. Aтpибyт OVR................................................59 8.3.4. Aтpибyт INS................................................59 8.3.5. Aтpибyт NUM................................................60 8.4. Oпepaтop TEXT................................................60 8.5. Oпepaтop MENU................................................61 8.6. Оператор PAUSE...............................................62 8.7. Атрибуты поля................................................62 8.7.1. Атрибут USE................................................62 8.7.2. Атрибут REQ................................................63 8.7.3. Атрибут ESC................................................63 8.7.4. Атрибут DESC...............................................64 8.7.5. Атрибут HLP................................................64 8.7.6. Атрибут IMM................................................64 8.7.7. Атрибут KEY................................................64 8.8. Видеоатрибуты................................................65 8.8.1. Атрибут HUE................................................65 8.8.2. Атрибут BLK................................................65 8.8.3. Атрибут ENH................................................65 8.8.4. Атрибут REV................................................66 8.8.5. Атрибут SEL................................................66 8.8.6. Атрибут TRN................................................66 8.9. Оператор REPEAT..............................................66 8.9.1. Атрибут EVERY..............................................67 8.9.2. Атрибут INDEX..............................................67 8.9.3. Оператор POINT.............................................68 8.10. Открытие и закрытие экранов.................................69 8.10.1. Оператор OPEN.............................................69 8.10.2. Оператор CLOSE............................................69 8.11. Обработка полей экрана......................................69 8.11.1. Поля в структуре SCREEN...................................69 8.11.2. Оператор DISPLAY..........................................70 8.11.3. Оператор UPDATE...........................................70 8.11.4. Оператор ERASE............................................71 - 5 - 8.11.5. Оператор SELECT...........................................71 8.11.6. Оператор ACCEPT...........................................71 8.12. Фyнкции, пpимeняeмыe к экpaнaм..............................72 8.12.1. Функция ROW...............................................72 8.12.2. Функция COL...............................................72 8.12.3. Функция FIELD.............................................73 8.12.4. Функция CONTENTS..........................................73 8.12.5. Функция ROWS..............................................73 8.12.6. Функция COLS..............................................73 8.12.7. Функция FIELDS............................................74 8.12.8. Функция CHOICE............................................74 8.13. Ввод данных в поля..........................................74 8.13.1. Строковые поля............................................74 8.13.2. Числовые поля.............................................75 8.13.3. Поля-меню и поля-указатели................................76 8.14. Paзмeщeниe cтpyктyp экpaнa..................................77 8.15. Корректировка разделяемых файлов............................77 9. Обработка отчетов..............................................78 9.1. Структура отчета.............................................78 9.1.1. Оператор Report............................................78 9.1.2. Атрибут WIDTH..............................................79 9.1.3. Атрибут LENGTH.............................................79 9.1.4. Атрибут PAGE...............................................79 9.1.5. Атрибут LINE...............................................80 9.1.6. Атрибут DEVICE.............................................80 9.2. Позиционные атрибуты.........................................81 9.2.1. Позиционный атрибут ROW....................................81 9.2.2. Позиционный атрибут COL....................................82 9.2.3. Позиционный атрибут CTL....................................82 9.2.4. Символы управления принтером...............................82 9.3. Объявление строк для печати..................................82 9.3.1. Структура HEADER...........................................82 9.3.2. Структура FOOTER...........................................83 9.3.3. Cтруктура DETAIL...........................................83 9.3.4. Оператор STRING............................................84 9.3.5. Оператор CONTROL...........................................84 9.3.6. Атрибут USE................................................84 9.4. Открытие и закрытие сообщений................................84 9.4.1. Оператор OPEN..............................................84 9.4.2. Оператор CLOSE.............................................85 9.5. Печать сообщения.............................................85 9.5.1. Оператор PRINT.............................................85 9.5.2. Переполнение страницы......................................85 9.5.3. Функция NAME...............................................86 9.6. Ошибки отчетов...............................................86 10. Обработка файлов DOS..........................................87 10.1. Организация файла DOS.......................................87 10.2. Структура DOS...............................................87 10.2.1. Оператор DOS..............................................87 10.2.2. Атрибут NAME..............................................87 10.2.3. Атрибут ASCII.............................................88 10.2.4. Атрибут COMMA.............................................88 10.2.5. Структура RECORD..........................................88 10.3. Обработка файлов DOS........................................89 10.3.1. Оператор COPY.............................................89 10.3.2. Оператор RENAME...........................................89 10.3.3. Оператор REMOVE...........................................89 10.3.4. Оператор SETPATH..........................................89 - 6 - 10.3.5. Оператор CREATE...........................................90 10.3.6. Оператор EMPTY............................................90 10.3.7. Оператор OPEN.............................................90 10.3.8. Оператор CLOSE............................................90 10.3.9. Оператор FLUSH............................................91 10.4. Выборка записей DOS.........................................91 10.4.1. Оператор SET..............................................91 10.4.2. Оператор NEXT.............................................91 10.4.3. Оператор GET..............................................92 10.4.4. Оператор PUT..............................................92 10.4.5. Оператор ADD..............................................93 10.5. Функции файла DOS...........................................93 10.5.1. Функция EOF...............................................93 10.5.2. Функция POINTER...........................................94 10.5.3. Функция BYTES.............................................94 10.5.4. Функция NAME..............................................94 10.5.5. Функция PATH..............................................94 10.6. Ошибки файла DOS............................................94 11. Обработка файлов Clarion......................................96 11.1. Организация файлов Clarion.................................96 11.2. Структура файла.............................................97 11.2.1. Оператор FILE.............................................97 11.2.2. Атрибут NAME..............................................97 11.2.3. Атрибут CREATE............................................98 11.2.4. Атрибут RECLAIM...........................................98 11.2.5. Атрибут PROTECT...........................................98 11.3. Операторы структуры файла...................................98 11.3.1. Оператор OWNER............................................98 11.3.2. Атрибут ENCRYPT...........................................99 11.3.3. Оператор KEY..............................................99 11.3.4. Атрибут DUP...............................................100 11.3.5. Оператор INDEX............................................100 11.3.6. Атрибут OPT...............................................100 11.3.7. Атрибут NOCASE............................................100 11.3.8. Оператор MEMO.............................................101 11.3.9. Структура RECORD..........................................101 11.4. Обработка файлов Clarion....................................102 11.4.1. Оператор COPY.............................................102 11.4.2. Оператор RENAME...........................................102 11.4.3. Оператор REMOVE...........................................102 11.4.4. Оператор SETPATH..........................................103 11.4.5. Оператор CREATE...........................................103 11.4.6. Оператор EMPTY............................................103 11.4.7. Оператор BUILD............................................103 11.4.8. Оператор PACK.............................................104 11.4.9. Оператор OPEN.............................................104 11.4.10. Оператор CLOSE...........................................105 11.5. Доступ к записям CLARION....................................105 11.5.1. Оператор SET..............................................105 11.5.2. Oпepaтop NEXT.............................................106 11.5.3. Oпepaтop PREVIOUS.........................................106 11.5.4. Oпepaтop SKIP.............................................106 11.5.5. Oпepaтop GET..............................................107 11.5.6. Oпepaтop PUT..............................................107 11.5.7. Oператор ADD..............................................107 11.5.8. Oпepaтop APPEND...........................................108 11.5.9. Оператор DELETE...........................................108 11.6. Фyнкции обработки фaйлов CLARION............................108 - 7 - 11.6.1. Фyнкция EOF...............................................108 11.6.2. Фyнкция BOF...............................................109 11.6.3. Фyнкция POINTER...........................................109 11.6.4. Фyнкция RECORDS...........................................109 11.6.5. Фyнкция NAME..............................................109 11.6.6. Фyнкция PATH..............................................110 11.7. Увеличение производительности при обработке файлов..........110 11.7.1. Oпepaтop CACHE............................................110 11.7.2. Oпepaтop BUFFER...........................................112 11.7.3. Oпepaтop FREE.............................................113 11.8. Совместно-используемые файлы Clarion........................113 11.8.1. Оператор SHARE............................................114 11.8.2. Оператор LOCK.............................................114 11.8.3. Оператор UNLOCK...........................................115 11.8.4. Оператор HOLD.............................................115 11.8.5. Оператор RELEASE..........................................116 11.8.6. Как избежать "тупиковой ситуации".........................116 11.9. Обработка транзакций........................................116 11.9.1. Оператор LOGOUT...........................................117 11.9.2. Оператор COMMIT...........................................117 11.9.3. Оператор ROLLBACK.........................................117 11.10. Восстановление испорченных файлов..........................118 11.10.1. Оператор RECOVER.........................................118 11.11. Обработка ошибок файлов Clarion............................118 11.12. Обработка файлов последовательного доступа.................119 11.13. Обработка файлов прямого доступа...........................119 12. Обработка таблиц памяти.......................................120 12.1. Структура TABLE.............................................120 12.1.1. Оператор TABLE............................................120 12.2. Доступ к элементам таблицы памяти...........................121 12.2.1. Оператор GET..............................................121 12.2.2. Оператор PUT..............................................121 12.2.3. Оператор DELETE...........................................121 12.2.4. Оператор ADD..............................................122 12.3. Обработка таблиц памяти.....................................122 12.3.1. Оператор SORT.............................................122 12.3.2. Оператор FREE.............................................122 12.4. Функции таблиц памяти.......................................123 12.4.1. Функция POINTER...........................................123 12.4.2. Функция RECORDS...........................................123 12.5. Ошибки таблиц памяти........................................123 13. Функции языка Clarion.........................................124 13.1. Математические функции......................................124 13.1.1. Функция АВS...............................................124 13.1.2. Функция INRANGE...........................................124 13.1.3. Функция INT...............................................124 13.1.4. Функция LOGE..............................................124 13.1.5. Функция LOG10.............................................125 13.1.6. Функция RANDOM............................................125 13.1.7. Функция ROUND.............................................125 13.1.8. Функция SQRT..............................................125 13.2. Тpигонометpические Функции..................................125 13.2.1. Функция SIN...............................................126 13.2.2. Функция COS...............................................126 13.2.3. Функция TAN...............................................126 13.2.4. Функция ASIN..............................................126 13.2.5. Функция ACOS..............................................126 13.2.6. Функция AТAN..............................................127 - 8 - 13.3. Cтpоковые Функции...........................................127 13.3.1. Функция ALL...............................................127 13.3.2. Функция CENTER............................................127 13.3.3. Функция CHR...............................................127 13.3.4. Функция CLIP..............................................127 13.3.5. Функция DEFORMAT..........................................128 13.3.6. Функция FORMAT............................................128 13.3.7. Функция INSNRING..........................................128 13.3.8. Функция LEFT..............................................128 13.3.9. Функция LEN...............................................129 13.3.10. Функция LOWER............................................129 13.3.11. Функция NUMERIC..........................................129 13.3.12. Функция RIGHT............................................129 13.3.13. Функция SUB..............................................130 13.3.14. Функция UPPER............................................130 13.3.15. Функция VAL..............................................130 13.4. Функции Манипуляций с Битами................................130 13.4.1. Функция BAND..............................................130 13.4.2. Функция BOR...............................................131 13.4.3. Функция BXOR..............................................131 13.4.4. Функция BSHIFT............................................131 13.5. Опеpатоpы и Функции Даты и Вpемени..........................131 13.5.1. Опеpатоp SETTODAY.........................................132 13.5.2. Функция TODAY.............................................132 13.5.3. Опеpатоp SETCLOCK.........................................132 13.5.4. Функция CLOCK.............................................132 13.5.5. Функция DATE..............................................132 13.5.6. Функция DAY...............................................133 13.5.7. Функция MONTH.............................................133 13.5.8. Функция YEAR..............................................133 13.5.9. Функция AGE...............................................133 13.6. Дpугие Опеpатоpы и Функции..................................134 13.6.1. Опеpатоp BEEP.............................................134 13.6.2. Опеpатоp IN...............................................134 13.6.3. Функция MAXIMUM...........................................134 13.6.4. Функция MEMORY............................................135 13.6.5. Функция OMITTED...........................................135 13.6.6. Опеpатоp OUT..............................................135 13.6.7. Опеpатоp PEEK.............................................135 13.6.8. Опеpатоp POKE.............................................136 13.6.9. Функция RUNCODE...........................................136 B. Коды клавиатуры и файлы зарезервированных имен клавиш..........137 B.1. Коды клавиатуры..............................................137 B.2. Зарезервированные имена клавиш...............................138 С. Двоичные модули CLARION........................................143 С.1. Формат двоичного модуля......................................143 C.2. Написание двоичного модуля, который обеспечивает интерфейс с подпрограммой, написанной на C.............................144 D. Файл определения кодов ошибок..................................146 - 9 - 1. Введение. Язык программирования Clarion предназначен для записи высокока- чественных коммерческих деловых программ применительно к компьютерам. Язык является привычным, комфортным и имеет свойства предшествующих языков с некоторыми свежими новыми идеями. Синтаксис понятный и сов- ременный, привлекающий также для профессионального программирования. Clarion pазвивался на предпосылке, что компьютеры необходимы для коммерческих примененний. Самое большое применение для мини - компьютеров - обычные программы, написанные для (и обычно посредс- твом) компании, которая использует их. Самые обычные коммерческие применения для решения на настольных ЭВМ - это электронные таблицы, текстовые процессоры, управляющие программы для Баз Данных. Компании хотят обычные программы и компьютеры по низкой цене. Микрокомпьютеры имеют такую цену и достаточно мощны для решения обыч- ных программ. Причина, по которой так мало деловых приложений для настольных ЭВМ в том, что высококачественные программы трудно писать, а программы, которые легко писать недостаточно хороши. Язык Clarion может быть расширен операторами и функциями, напи- санными на других языках программирования. Модули расширения язы- ка (language extension module (LEM)) должны удовлетворять требованиям и быть обработаны утилитой DOS EXE2BIN. Многие библиотеки сегодня мо- гут быть использолваны как модули типа LEM. - 10 - 2. Формат программы и операторов. Исходный модуль на Clarion есть файл с операторами на языке Clarion. Большие программы обычно содержат несколько модулей, которые можно редактировать, компилировать и составлять. Программы м.б. прер- ваны перестановкой групп операторов, которые вызывают процедуры и функции, хранящиеся в других модулях. Процедуры используются для операторов, которые выполняются больше, чем один раз или для операторов, которые имеют простое назна- чение и м.б. ясно описаны. Имя процедуры становится новым оператором; она выполняется, если ее вызвать по имени. Функции используются для утверждений, которые вырабатывают символьные или числовые значения. Функция выполняется, если назвать по имени выражение, как бы если она была переменной. Clarion - программа постоянно находится в программ- ном модуле. Процедуры и функции могут также находиться в программном модуле. Первый оператор в программном модуле есть PROGRAM. Дополни- тельные процедуры и функции могут находиться в MEMBER-модуле. MEMBERмодуль - исходный оператор для описания файла MEMBER. Программы, процедуры и функции, содержащие операторы объявле- ния, состоят из последовательности CODE - операторов, выполняемых операторов, местных подпрограмм. Директивы компилятора, которые дают инструкции компилятору, мо- гут встречаться везде. Некоторые операторы составные, поэтому они со- держат другие операторы. Составные операторы и операторы, которые они окружают, называются структурами. Описательные предложения определяют константы, переменные, экраны, файлы, отчеты и табличную память. Вы- полняемые операторы представляют программные действия, операции, ука- занные в описательных операторах. Местные подпрограммы как процедуры, но они не имеют параметров. Местные подпрограммы не содержат описательных операторов и не могут вызываться вне программ, процедур или функций. 2.1. Формат предложений. Предложения содержат ключевые слова, операторы, метки, опозна- вательные знаки и специальные символы (иногда называемые пунктуаци- ей). Ключевые слова являются словарем языка. Оператор метки идентифи- цирует положение его относительно других операторов; опознавательные знаки используются для шаблонов и контроля печати, и специальных сим- волов, изображающих связь других компонентов предложения. Программа содержит необязательный параметр МАP, в котором объ- явлены модули, процедуры и функции, используемые программой. Данные, объявленные в программе, являются глобальными, поэтому м.б. использо- ваны всеми процедурами и функциями. Данные, объявленные в процедуре или функции не могут использоваться вне этой процедуры или функции. MEMBER-модуль, который использует глобальные данные, должен назвать программный модуль, который содержит глобальные данные. 2.2. Формат операторов. Clarion-оператор не должен начинаться в первой позиции строки, которая резервируется для операторов меток. Предложения ограничивают- ся концом строки или ";". Если одна строка содержит более чем одно предложение, предложения должны отделяться ";". Последнее предложение ограничивается концом строки. Операторы за точкой с запятой игнориру- ются. Длинные предложения могут занимать более, чем одну строку; нуж- но ограничивать каждую продолжающуюся строку вертикальной чертой. Продолжаемые предложения м.б. ограничены после оператора метки, ини- циатора, терминатора, закрывающего ограничителя или коннектора (иск- лючая символ подчеркивания, который встречается внутри предложения метки). Продолжаемое предложение не может быть ограничено внутри сим- - 11 - вольной строки. Длинная символьная строка д.б. разорвана на более ко- роткие знаками конкатенации и продолжена перед или за оператор конка- тенации. Операторы структур (составные операторы и предложения, которые они окружают, ограничиваются точкой или END предложением). Для лучшей читабельности, предложения внутри структуры м.б. отделены. Комментарии обозначаются восклицательным знаком и могут появить- ся в любой строке. Комментарии могут содержать к.-л. символы, они иг- норируются Компилятором и ограничиваются концом строки. Пустые строки м.б. вставлены везде и также игнорируются. 2.3. Оператор МЕТКА. Оператор метка может находиться в программе, процедуре или функ- ции. Метка в описательном предложении называется именем данных. Имя данных м.б. переменной, процедурой, экраном и т.д. Метка выполняемого оператора используется как указатель в GОТО-операторе. Оператор метка начинается в колонке 1 и отсылает к следующему оператору той же самой строки или к следующему оператору в программе, процедуре или функции. Операторы внутри оператора метки не могут на- чинаться в столбце 1. Операторы метки содержат до 12 символов, состоящих из букв от А до Z, цифр от 0 до 9 и символ подчеркивания. Первым символом операто- ра-метки должна быть буква. Операторы метки являются нечувствительны- ми в данном случае. Например, имя данных м.б. объявлено как Printline, затем упоминается как PRINTLINE или Printline. Предложение (оператор) метки не м.б. резервируемым словом. 2.4. Резервируемые (служебные) слова. Служебные слова составляют основу языка для создания внутренних форм синтаксиса и структур. Резервные слова испортят Компилятор, если они будут использоваться в операторах-метках. Здесь список резервных слов Clariona: AND DO EXECUTIVE INCLUDE OMIT RETURN TIMES BREAK EJECT EXIT LOOP OR ROUTINE TO BY ELSE FUNCTION MEMBER OROF SIZE UNTIL CASE ELSIF GOTO NOT PROCEDURE SOURCE WHILE CYCLE END IF OF PROGRAM THEN XOR Заметим, что наибольшее число ключевых слов Clariona, особенно используемых в предложениях объявления, не м.б. резервируемыми и м.б. использованы в операторах-метках. 2.5. Специальные символы. Специальные символы инициации, ограничения, разделения и соеди- нительные ключевые слова, операторы-метки и опознавательные знаки служат для оформления предложений. Язык Clarion пользуется для этого специальными символами. Initiators ! инициирует комментарий ? инициирует метку пpиpавнивания поля @ инициирует опознавательный знак Terminators ; ограничивает предложения CR ограничивает предложение (возврат каретки) - 12 - . ограничивает структуру | ограничивает продолжаемую строку # ограничивает длинное неявное имя переменной $ ограничивает числовое неявное имя переменной " ограничивает символьное имя переменной Delimitors () включает параметр или параметр списка [] включает индекс или список индексов '' включает символьную константу {} включает повторение счета в симв.константе <> заключает код ASCII в символьной константе Connectors . соединяет целое и дробь числовой константы , соединяет параметры в списке : соединяет приставку и имя данных - соединяет мнемонику в операторе метки Операторы, которые также являются соединительными: + оператор сложения - оператор вычитания или унитарный минус * оператор умножения / оператор деления % оператор коэффициентов . экспоненциальный оператор < меньше чем > больше чем = оператор равенства или оператор присваивания <> не равно & оператор конкатенации 2.6. Компилирование Clarion-программы. Clarion Компилятор читает исходный модуль и продуцирует файл процессора. Файл процессора содержит псевдокоды Clariona, которые представляют исходный модуль в компактной форме. Clarion - псевдокод - машинный язык для "воображаемого" Clarion - компъютера, который был предназначен для Clariona. Этот "воображаемый" компъютер использует операционные коды и операнды, что соответствует операторам Clariona. Clarion Процессор - утилита, которая выполняет (интерпретирует) файлы процессора. Clarion Транслятор - утилита, которая читает файлы процессора и создает стандартные объектные файлы DOS (с расширением .OBJ). Эти объктные файлы затем связываются (используя DOS LINK или другие ком- поновщики программы) с Clarion-библиотекой, чтобы произвести DOS - выполняемые файлы (с расширением .EXE). Clarion-библиотека также ис- пользуется для создания утилит Процессора, гарантируя, что программа, выполняемая Процессором, работает также, как оттранслированная прог- рамма в DOS. Компилятор создает файл Процессора для каждого модуля в програм- ме. Процессор собирает все процессорные файлы, чтобы выполнить прог- рамму. Транслятор продуцирует объктный файл для каждого процессорного файла в программе. Объектные файлы затем все объединяются вместе в Clarion - библиотеке, чтобы создать выполняемый файл. Компилятор, Процессор и Транслятор создают группу файлов, кото- рые используют имя программы или имена файлов с различными расширени- - 13 - ями. Когда компилируется модуль, Компилятор загружает программный символический файл и переводит в адреса глобальных данных. Эта техни- ка разрешает Процессору выполнить программу немедленно после того, как модуль был откомпилирован. Поэтому, если глобальные данные в программном модуле изменились, рекомендуется исправить все его гло- бальные адреса. Для того, чтобы выполнить повторно компиляцию, Компилятор пред- лагает "поток компиляции" для компиляции программного модуля. В этом случае, поток компиляции м.б. сделан быстро, потому что компилятор и программный символическаий файл уже находятся в памяти. Поток компи- ляции продуцирует суммарный файл ошибок (с расширением .SUM), который представляет текстовый файл, содержащий ошибки компиляции, найденные в каждом модуле. ┌───────────────────────────┐ │ Исходный модуль (.CLA) │ └─────────────┬─────────────┘ V Компилятор ┌─────────────┴─────────────┐ │ Процессорный файл (.PRO) │ │ Файл символов (.SYM) │ Процессор ┌─────────────────┐ │ Листинговый файл (.LST) ├──────────────────>┤ Результат │ │ Файл ошибок (.ERR) │ └────────┬────────┘ └─────────────┬─────────────┘ ^ V Транслятор │ ┌─────────────┴─────────────┐ │ │ Объектный файл DOS (.OBJ) │ │ └─────────────┬─────────────┘ │ │ Компановщик ┌───────────────┴────────┐ ├─────────────────────────>┤ Исплняемый файл (.EXE) │ │ (DOS LINK) └────────────────────────┘ ┌─────────────┴─────────────┐ │ Библиотека Clarion │ └───────────────────────────┘ 2.7. Оператор PROGRAM. Оператор PROGRAM д.б. первым в программном модуле. Оператору PROGRAM может предшествовать TITLE или SUBTITLE. Метка оператора PROGRAM д.б. допустимым оператором метки (см. Оператор Метки в этой главе). Первые восемь символов метки использу- ются как имя файла для символического файла (.SYM) и файла процессора (.PRO), создаваемых Компилятором. Если метка пропускается, исходное имя файла используется для этих файлов. Поэтому, если метка опускает- ся, исходное имя файла должно приспосабливаться к правилам допустимых операторов метки. Программный модуль - это исходный файл с операторами, состоящий из программы, оптимальной МАР - структуры и оптимальных процедур и функций. Объявления в программе общие для всех процедур и функций в программном модуле и членах модуля. Программа с членами, процедурами или функциями должна содержать МАР - структуру. Если глобальные данные в программном модуле изменились, все его члены-модули д.б. откомпилированы заново. Компилятор предлагает опти- мальный "поток компиляции" для компиляции программы с модулями. 2.8. Оператор МEMBER. MEMBER-оператор д.б. первым оператором в MEMBER-модуле. Тем не менее, MEMBER-оператору могут предшествовать TITLE или SUBTITLE ди- рективы компилятора. - 14 - Параметром MEMBER-оператора является имя программы, к которой принадлежат MEMBER-модули. Компилятор использует имя программы с рас- ширением .SYM как файл спецификаций для программного символического файла. Программный символический файл содержит адреса оператора метки, который Компилятор использует для разрешения глобальных ссылок в MEMBER-модуле. Если параметр в MEMBER-операторе опускается, MEMBER-модуль ста- новится "универсальным MEMBER-модулем", который можно включать в лю- бую программу. Файл процессора продуцируется для универсального MEMBER-модуля только в потоке компиляции. MEMBER-модуль является исходным файлом операторов, содержащим процедуры и функции для программы. Для того, чтобы быть включенным в программу, MEMBER-модуль должен быть назван в операторе MODULE в МАР структуре. 2.9. Структура МАР. МАР - структура предусматривает размещение программы или моду- ля. Она включает МАР-оператор и операторы, следующие за ним, ограни- ченные точкой или END-оператором. МАР-структура используется в прог- раммном модуле для названия модулей, глобальных процедур и функций. МАР-структура не может находиться в MEMBER-модуле. МАР-структура может содерджать PROC, FUNC, MODULE, AREA и OVERLAY операторы. 2.9.1. Оператор PROC. PROC(имя процудуры) PROC операторы называют по имени процедуры программы. Параметры имени процедуры должны быть оператором метки операто- ра PROCEDURE. Процедуры являются глобальными и могут вызываться из программ, любых функций и любых процедур. PROC-оператор, который вызывает процедуру, принадлежащую прог- рамному модулю, должен появиться в структуре, впереди первого MODULEоператора. PROC-оператор, который вызывает процедуру, принадлежащую MEMBER - модулю, должен появиться в MODULE-структуре, вызывающей этот MEMBER -модуль. Процедура не м.б. вызвана, если она не объявлена в PROC-опе- раторе. 2.9.2. Оператор FUNC. FUNC(имя функции), тип данных FUNC операторы называют функции программы. Параметр имени функ- ции д.б. оператором метки в операторе FUNCTION. Атрибут "тип данных" поставляет тип данных возвращаемой величине. Параметр "тип данных" д. б. LONG, REAL или STRING. Функции являются глобальными и могут вызываться из программы, к.-л. процедуры или к.-л. функции. Оператор FUNC, который называет функцию, принадлежащую MEMBER-модулю должен появиться в MODULE - структуре, вызывающей этот memder-модуль. Функция не м.б. вызвана, если она не объявлена в FUNC-операторе. - 15 - 2.9.3. Структура MODULE. MODULE(имя модуля) MODULE-структура называет MEMBER-модуль с его процедурами и функциями. Он включает оператор MODULE и предложения, следующие за ним до тех пор, пока не будет ограничения в виде (.) или END-операто- ра. Параметр имени модуля д.б. символьной константой, определяемый для имени файла (без расширения) исходного модуля. Компилятор исполь- зует параметр имени модуля с расширением .CLA для всех модулей для потока компиляции. Компилятор использует параметр имени модуля с рас- ширением .PRO для загрузки модулей для выполнения. Структура MODULE может встречаться только внутри МАР-структуры. Структуры MODULE содержат PROC и FUNG операторы, называющие процедуры и функции, располагающиеся в модуле. Чтобы быть загруженным Процессо- ром, модуль д.б. назван в программе в МАР-структуре. Компилятор помещает программный модуль после обработки его про- цессором в том же самом директории, как его исходный файл. Компилятор помещает MEMBER-модуль после обработки его процессором в том же самом директории, как его программный модуль. Когда процессор загружает .PRO и .LEMS, они все д.б. в том же самом директории, как его прог- раммный модуль. 2.9.4. Атрибут BINARY. Атрибут BINARY идентифицирует модуль как изображение его в па- мяти, записанное на языке ассемблера или другом компилирующем языке. Изображение модуля в памяти есть готовый для загрузки, настраиваемый двоичный модуль, продукция EXE2BIN DOS команды. Процессор использует параметр имени модуля оператора MODULE с расширением .BIN, чтобы загрузить в память представление модуля. 2.9.5. Структура AREA. AREA OVERLAY - структуры . AREA-структура определяет пространство оверлея. Оно включает оператор AREA и операторы, следующие за ним до того, как они не будут ограничены END-оператором или точкой. Оператор AREA не имеет парамет- ров или атрибутов. Структура AREA содержит OVERLAY-структуры, которые содержат PROC и FUNC операторы. Размер пространства оверлея, определяемый AREA-структурой так велик как самый большой оверлей в AREA-структуре. Площадь оверлея - пространство в памяти, где оверлеи загружают- ся. Оверлей содержит один или более модулей и объявляется в OVERLAY-структуре. Только один оверлей м.б. резидентным (загруженным в памяти) в площади оверлея в одно время. Когда оверлей-процедура или функция (процедура или функция, вызываемая посредством PROC илми FUNC оператора в OVERLAY- структуре) вызывается, оверлей загружается в па- мять (если она еще не резидентна). Оверлей- процедура или функция не может вызывать процедуру или функцию из другого оверлея, который ис- пользует ту же самую площадь оверлея, или данных, находящихся вне различных оверлеев в одном и том же пространстве. 2.9.6. Структура OVERLAY. OVERLAY-структура определяет оверлей. Она включает оператор OVERLAY и операторы, следующие за ним до оператора END или (.). Опе- ратор OVERLAY не имеет параметров или атрибутов. - 16 - Структура OVERLAY содержит один или более структур MODULE, каж- дая из которых содержит один или более операторов PROC или FUNC. Если оверлей - процедура или функция вызывается, полный оверлей, в к-ром она находится, загружается в память (если ее еще там нет). Оверлей, который загружается, содержит все процедуры и функции в каждом моду- ле, названном в оверлее (во всяком случае они называются в PROC или FYNC-операторах). Когда оверлей загружен, его переменные получают их начальные значения. Представления модулей в памяти (объявленных как MODULE-операторы с атрибутом BINARY) не могут подвергаться процессу оверлея. 2.10. Оператор PROCEDURE. Метка PROCEDURE(список параметров) Оператор PROCEDURE - первый оператор процедуры. Оператор МЕТКА - имя процедуры и должен следовать правилам опе- раторов меток. (См. "Оператор МЕТКА" в этой главе). Процедура замеща- ет библиотеку процедур с тем же именем, генерирующим сообщение об ошибках. Список параметров представляет ряд переменных, отделенных запя- тыми и заключенных в круглые скобки. Имена переменныхх в списке пара- метров д.б. объявлены внутри процедуры. Для объявления параметров см. "Параметры PROCEDURE и FUNCTION операторов" в этой главе). Процедура выполняется, если ее вызвать со списком параметров. 2.11. Оператор FUNCTION. Метка FUNCTION(список параметров) Оператор FUNCTION является первым оператором функции. Оператор МЕТКА является именем функции и должен следовать пра- вилам меток оператора. (См. "Оператор МЕТКА" в этой главе). Функция замещает функцию в библиотеке с таким же именем, если генерируется сообщение об ошибке. Список параметров представляет набор переменных, отделенных за- пятыми и заключенных в круглые скобки. Имена переменных в списке д.б. объявлены внутри функции. (Для объяснения параметров см. "Параметры операторов PROCEDURE и FUNCTION "). Функции выполняются, если вызвать их со списками параметров в выражении. Функция затем возвращает одно значение в выражение. Тип данных возвращаемой величины - LONG, REAL или STRTNG как данные опе- ратора FUNC в МАР-структуре. Функция не м.б. выполнена, если ее имя не появится как параметр в FUNC операторе. Выполнение начинается в первом операторе после CODE оператора (см. "Функции" в гл. 4). 2.12. Параметры операторов PROCEDURE и FUNCTION. Операторы POCEDURE и FUNCTION сопровождаются списком парамет- ров, состоящих из имен переменных, отделенных запятыми и заключенных в круглые скобки. Каждое имя переменной в списке параметров оператора PROCEDURE или FUNCTION д.б. объявлено в процедуре или функции. Пара- метры, объявленные с оператором EXTERNAL вызываются внешними парамет- рами. Другие параметры вызываются локальными параметрами. 2.12.1. Локальные параметры. Локальные параметры являются "проходящими мимо величины", поэ- тому, они копируются с переменной или выражения в ту же самую позицию списка параметров вызываемой подпрограммы. Поэтому, когда местные па- раметры изменяются, их вызывающая копия не меняется. - 17 - Локальный параметр не нуждается в подходящем типе данных его вызывающей копии. Преобразование данных между вызывающими и вызывае- мыми параметрами описано в гл.3. 2.12.2. Внешние параметры. Внешние параметры являются "проходящими мимо адресов" и локаль- ными или глобальными к программе, вызывающей процедуре или функции. Изменение внешнего параметра меняет его вызывающую копию, т.к. есть только одна копия параметра. Функции или выражения в списке парамет- ров вызывающей подпрограммы являются промежуточными величинами. Внеш- ние промежуточные величины м.б.изменяемы, но изменения могут не чувс- твоваться. Метки RECORD, HEADER, FOOTER, DETAIL и TABLE структур м.б. ис- пользованы в списке параметров вызывающей программы , но они тракту- ются как структура GROUP, вызываемая процедурой или функцией. Метки SCREEN, REPORT, DOS, FILE, KEY, INDEX, TABLE, используют- ся в списке параметров вызывающей программы, но д.б. описаны как ат- рибут в EXTERNAL - операторе, таком как EXTERNAL, FILE или EXTERNAL, KEY. Параметр TABLE трактуется как GROUP, если ему соответствующий оператор EXTERNAL не имеет атрибутов. Иначе, с TABLE атрибутом, он трактуется как TABLE. EXTERNAL-атрибут, который не подходит типом данных его вызывающей копии, произведет остановку во время прогона программы. 2.13. Оператор CODE. Оператор CODE - директива Компилятора, который отделяет опера- торы объявления от выполняемых операторов внутри программы, процедуры или функции. Операторы, предшествующие CODE-оператору, являются опе- раторами объявления и называются "data section". Операторы, следующие за CODE-оператором, являются выполняемыми операторами и называются "code section". Оператор, следующий за CODE-оператором является пер- вым выполняемым оператором, когда программа, процедура или функция вызывается. 2.14. Оператор ROUTINE. Оператор ROUTINE - первый оператор местной(локальной) програм- мы. Местные программы должны располагаться в конце "Code section" программы, процедуры или функции. Оператор МЕТКА называет локальную программу и он используется с DO оператором для выполнения программы. Локальные программы ограничиваются концом исходного файла операторов или словами ROUTINE, PROCEDURE или FUNCTION. Оператор EXIT может ис- пользоваться внутри местной программы для возвращения управления опе- ратору, следующему за оператором DO. EXIT-оператор - необязательный, так как программы автоматически заканчиваются после последнего пред- ложения. 2.15. Оператор END. END-оператор дает ограничение для операторов структур. 2.16. Директивы компилятора. 2.16.1. Директива TITLE. TITLE('заголовок модуля') Заголовок печатается в 1-ом столбце 1-ой строки листинга Clariona Компилятора. TITLE-директива дает этот заголовок, но дирек- тива сама не печатается в распечатке. TITLE должен стоять в начале исходного файла впереди SOURCE, PROGRAM или MEMBER операторов. Заголовок остается на том же самом месте каждой страницы распе- - 18 - чатки. TITLE-директивы впереди SOURCE-оператора во включаемых файлах (называемых INCLUDE-операторами) игнорируются. 2.16.2. Директива SUBTITLE. SUBTITLE ('подзаголовок') Подзаголовок печатается в первом столбце 3-ей строки листинга Clarion-компилятора. Директива компилятора SUBTITLE дает этот заголо- вок, но сама не печатает в листинге. SUBTITLE должна стоять в начале исходного файла впереди SOURCE, PROGRFM или MEMBER-оператора. Подза- головок м.б. установлен ELECT оператором, который начинает новую страницу в распечатке. SUBTITLE директивы впереди SOURCE оператора во включенных файлах (называемых INCLUDE- операторами) игнорируются. 2.16.3. Директива EJECT. Форма 1 : EJECT('подзаголовок') Форма 2 : EJECT EJECT директива начинает новую страницу в Clarion-распечатке. Форма 1 EJECT устанавливает подзаголовок и начинает новую стра- ницу в распечатке. Форма 2 начинает новую страницу с тем же самым подзаголовком как на прошлой странице. ELECT директива сама не печа- тает в распечатке. 2.16.4. Директива OMIT. OMIT('ограничитель') OMIT - директива специфицирует блок исходных строк, чтобы осво- бодить их от компиляции. Эти исходные строки могут содержать коммен- тарии или программные операторы, которые не компилируются. Блок OMIT идет от строки OMIT до строки, иницируемой "terminator"-ом (ограничи- телем). OMIT не может использовать оператор метки и д.б. первым опе- ратором строки . В OMIT-блок включается ограничивающая строка. Здесь OMIT - блок используется как комментарий (END-ограничи- тель). OMIT ('**END**') ************************* * * * MAIN PROGRAM LOOP * * * ************************* ** END ** остаток этой линии опускается 2.16.5. Директива SOURCE. Директива SOURCE первый оператор исходного файла, который вклю- чается в программу или MEMBER-модуль (используя оператор INCLUDE). Тем не менее, SOURCE директиве могут предшествовать TITLE или SUBTITLE операторы. Компиляция исходного файла, представленная SOURCE директивой, выдает листинг компиляции, но не файл процессора. 2.16.6. Директива INCLUDE. Форма 1 : INCLUDE ('имя файла') Форма 2 : INCLUDE ('имя файла', имя структуры) - 19 - INCLUDE-директива специфирует исходный файл операторов, который включается в программный модуль или член модуля. Параметр имени файла - символьная константа, специфицирующая имя файла с необязательным путем и расширением. Если путь пропускается (не указан), используется путь текущего директория. Если расширение пропускается, .СLA поддер- живается. SOURCE директивы во включаемом файле игнорируются. TITLE и SUBTITLE директивы впереди SOURCE-директивы в подключаемом файле иг- норируются. В Форме 2, параметр имени структуры обеспечивает включение опе- ратора метки из исходного файла операторов. Только структура из опе- ратора метки ограничивающего периода будет включаться в модуль. 2.16.7. Атрибут LIST. Атрибут LIST директивы INCLUDE просит Компилятор составить спи- сок исходных операторов так, как они встречаются. Если LIST атрибут пропускается, включаемые исходные операторы не появляются в распечат- ке. - 20 - 3. Объявление переменных. Эта глава описывает операторы объявления, которые используются для определения переменных. Переменные представляют ячейки памяти, которые содержат числовые или символьные величины. Оператор, объявля- ющий переменную, поддерживает её имя, формат, длину, начальное значе- ние. Оператор, объявляющий переменную, состоит из оператора метки (имя переменной), оператора ключевого слова (тип данных) с необяза- тельным параметром и необязательный атрибут ключевые слова с необяза- тельными параметрами. Все описательные операторы должны предшество- вать CODE - оператору программы, процедуры или функции. 3.1. Объявление операторов. 3.1.1. Оператор BYTE. Метка BYTE(начальное значение) Format: BYTE переменная Bits : 7 0 BYTE оператор объявляет однобайтовое беззнаковое целое число в диапазоне от 0 до 255. Начальное значение параметраа д.б. одним зна- ком символьной константы или числовой константы внутри диапазона. Ес- ли параметр является символьной константой, начальное значение пола- гается равным его значению ASCП. (Например, 'А' установится его начальное значение= 65). Если параметр опускается, начальное значение полагается равным нулю. С BYTE могут использоваться DIM и OVER атрибуты. 3.1.2. Оператор SHORT. Метка SHORT(начальное значение) Format: S SHORT переменная Bits : 15 0 SHORT оператор объявляет формат двухбайтового целого числа со знаком. Старший бит в формате есть знак (0 - положительный и 1- отри- цательный). Отрицательные величины представляются стандартно двумя дополнительными знаками. Диапазон SHORT - переменный от -32,768 до 32,767. SHORT-пере- менная часто используется для изображения счетчиков, но может исполь- зоваться для целых чисел ограниченного диапазона. Начальное значение параметра д.б. числовой константой внутри диапазона. Если параметр опускается, начальное значение полагается равным нулю. DIM и OVER атрибуты могут использоваться с SHORT. 3.1.3. Оператор LONG. Метка LONG(начальное значение) Format: S LONG переменная Bits : 31 0 LONG - оператор объявляет 4-х байтовую знаковую целую перемен- ную в коротком целом формате. Старший бит в формате - знак (О - поло- жительный и 1 - отрицательный). Отрицательные величины представляются стандартно двумя дополнительными знаками. Диапазон LONG - от - 2 147 483 648 до 2 147 483 647, выражаемое девятью значащими десятичными - 21 - цифрами. Начальное значение параметра д.б. числовой константой внутри диапазона. Если параметр опускается, начальное значение полагается равным нулю. DIM и OVER атрибуты м.б. использованы с LONG-оператором. 3.1.4. Оператор REAL. Метка REAL(начальное значение) Format: S показатель (степени) мантисса Bits : 63 52 0 REAL-оператор объявляет 8-байтовую переменную с плавающей точ- кой в lond real (с двойной точностью) формате. Диапазон абсолютной величины типа REAL есть 4.19*10**-307 до 1.67*10**308, до 15 значащих десятичных цифр. Начальное значение параметра д.б. числовой константой внутри диапазона. Если параметр опускается, начальное значение полагается равным нулю. DIM и OVER атрибуты м.б. использованы с REAL. 3.1.5. Оператор DECIMAL. Форма 1: Оператор DECIMAL(длина) Форма 2: Оператор DECIMAL(длина, разряды) Форма 3: Оператор DECIMAL(длина, разряды, начальное значение) Оператор DECIMAL объявляет упакованную десятичную переменную. Каждый байт DECIMAL переменной занимает две десятичных цифры, используя 4 бита на цифру. Самая левая половина байта занимается зна- ком DECIMAL переменной (0 - положительный и пробел - отрицательный). Максимальный размер упакованной десятичной переменной - пятнадцать десятичных цифр, которые занимают 8 байтов. Форма 1 объявляет десятичную целую переменную. Параметр "длина" - числовая константа, содержащая общее коли- чество десятичных цифр в переменной. Начальное значение полагается равным нулю. Форма 2 объявляет десятичную действительную переменную. Пара- метр "длина" - числовая константа, содержащая общее число десятичных цифр в целой и дробной части переменной. Параметр "разряды" - число- вая константа, которая специфицирует количество десятичных цифр в дробной части (справа от десятичной точки). Параметр "разряды" д.б. < или = параметру "длина". Начальное значение = 0. Форма 3 объявляет десятичную целую или действительную перемен- ную с начальным значением. Для того, чтобы объявить целую переменную, параметр "разряды" должен содержать 0. Начальное значение параметра д.б. числовой константой. Так как самый левый байт содержит одну де- сятичную цифру, а все другие байты содержат две десятичные цифры, де- сятичная переменная всегда содержит нечетное количество значащих цифр. Поэтому объявления операторов DECIMAL (10) и DECIMAL (11) экви- валентны. DIM и OVER атрибуты могут быть использованы с DECIMAL. 3.1.6. Оператор STRING. Форма 1: Метка STRING(длина) Форма 2: Метка STRING(начальное значение) Форма 3: Метка STRING(шаблон) STRING - оператор объявляет символьную строку фиксированной - 22 - длины. Параметры STRING-оператора специфицируют длину строки, началь- ное значение или шаблон. Максимальная длина строки 255 байт. В Форме 1, "длина" - числовая константа в диапазоне от 1 до 255. Начальное значение заполняется пробелами. В Форме 2 параметр "начальное значение" - символьная константа, которая содержит начальное значение для строки. Длина строки полага- ется равной количеству байтов, необходимых для содержания данных, специфицируемых в параметре "начальное значение". В Форме 3 параметр "шаблон" - обозначения шаблона.( См. "Обоз- начения шаблона в этой главе"). Длина строки полагается равной числу байтов, необходимых для содержания форматированной строки, производимой знаками шаблона. На- чальное значение заполняется пробелами. Обозначение (знак) шаблона поставляет "формат", который исполь- зуется когда числовое значение пересылается в шаблон строки. Числовое значение м.б. выдано посредством цифровой константы, переменной, выражения или других шаблонов строки. Значения строки не форматируются, когда назначается шаблон STRING. Строки шаблона, объявленные с "N" или "E" знаками типа шаблона будут округлять числовые величины,что наиболее подходит для формати- рования. "Деформатирование" - процесс выделения числовой строки из от- форматированной по шаблону строки. В числовых операциях шаблоны строк трактуются как числа и автоматически деформатируются. В строковых операциях шаблоны строк трактуются как строки и не деформатируются. Короткая строка заполняется пробелами для пересылки или сравне- ния ее с длинной строкой. По умолчанию, начальное значение - пробелы. Со STRING м.б. использованы DIM или OVER атрибуты. 3.2. Обозначения шаблона. Знаки шаблона представляют формат, который используется, когда числовая величина пересылается в шаблон строки. Если формат слишком мал, чтобы содержать числовую величину, шаблон строки заполняется звездочками. Все знаки шаблона начинаются со знака ("@"). Размещение "В" в последней позиции шаблонат означает "пробел, когда нуль". Поэ- тому "нуль" продуцирует символьный шаблон со всеми нулями. Знаки шаблонов используются как параметры STRING, ENTRY и MENU операторов и как параметры других процедур и функций. Есть шесть ти- пов знаков шаблона: цифровой, научное представление, дата, время, форматирования и символьные. 3.2.1. Числовой и денежный шаблоны. Знак цифрового шаблона может производить широкое множество фик- сированно-десятичных форматов. Целая часть числа м.б. сгруппирована в тысячи запятыми, точками, пробелами и не сгруппирована совсем. Целая и дробная часть числа м.б. отделена точкой (десятичной точкой), запя- той или пробелом. Неиспользуемый высший разряд числа м.б. заполнен пробелами, нулями или звездочками. Отрицательные числа м.б. сформатированы с ведущим знаком минус или замыкающим знаком минус или он м.б. заключен в скобки. Знак дол- лара или другого денежного символа может находиться перед или за чис- лом. И, наконец, число м.б. отформатировано как состоящее из одних пробелов, когда его значение есть нуль. Знак числового шаблона есть @N, сопровождаемый указателями для размера, места, знака и денежного обращения. Размер: Размер указателя указывает длину (в символах) конечной - 23 - строки шаблона и формат целой части числа. Длина д.б. целой в интер- вале от 1 до 255. Отсутствие формата размера отделяет группы в целой части между тысячами запятыми. Размещение подчеркивания слева длины подавляет группирование и заполняет бесполезные высшие позиции пробелами. Раз- мещение нуля слева длины подавляет группирование и заполняет беспо- лезные высшие позиции (разряды) нулями. Размещение звездочки слева длины заполняет бесполезные высшие разряды звездочками. Примеры: @N9 4,550,000 @N_9 4550000 @N09 004550000 @N*09 **4550000 Если группировка не подавляется (с подчеркиванием или нулем слева), символ группировки (отличный от запятой) м.б. специфицирован справа длины. Подчеркивание группируется пробелами, а точка группиру- ет с точками. Примеры: @N9_ 4 550 000 @N9. 4.550.000 Позиции: Указатель "позиции" специфицирует десятичные позицмии числа и символ, используемый для отделения целой и дробной частей. Количество десятичной позиции д.б. меньше, чем длина, указанная в размере указателя и в любом случае не д.б. больше 15. Точка слева позиций специфицирует десятичную точку как раздели- тель и знак ударения(.) специфицирует запятую. Точка устанавливает запятую и знак ударения устанавливает точку как отсутствие группирую- щего символа для целой части. Примеры: @N_9.2 4550.75 @N_9'2 4550,75 @N9'.2 4,550.75 @N9.2 4,550.75 (такой как выше) @N9.'2 4.550,75 @N9'2 4.550,75 (такой как выше) @N9_'2 4550.75 Знак: Указатель знака специфицирует формат отрицательного числа. Знак минус слева размера указателя продуцирует ведущий знак минус. Знак минус справа указателя продуцирует замыкающий знак минус. И зак- лючение размера и позиций указателя в круглые скобки продуцирует зак- люченное в круглые скобки отрицательное число. Примеры: @N-9.2 -4,550.75 @N9.2- 4,550.75- @N(10.2) (4,550.75) Деньги: Указатель денег также как знак доллара ($) или символь- ная строка заключается в тильдах (~). Указатель денег д.б. также первым или последним указателем (ис- ключая для "В" указателя - пробел, когда ноль) в цифровом шаблоне. Если денежный указатель первый, денежный символ "плывет" к ле- - 24 - вой цифре высшего порядка числа. Примеры: @N$9.2 $4,550,75 @N~DM~10.2 DM4.500,75 @N11.2~KR~ 4.500,75 KR @N$(11.2) $(4,550.75) Примеры знаков шаблонов, используемых во всем мире для денежно- го обращения. США @N$12.2 $24,500.00 Франция @N~F~12_'2 F 24.500,00 Италия @N~Lit.~15'2 Lit.540.000,00 Объед.Кор-во @N~&~12'2 & 24,500.00 Норвегия @N~KR~12'2 KR 24.500,00 Германия @N~DM~12'2 DM 24.500,00 Финляндия @N~MK~12'_2 MK 24.500,00 Швеция @N~KR~19'2 KR 24.500,00 3.2.2. Научное представление шаблонов. Научная система счисления является техникой для выражения очень больших или очень малых чисел. Формат для научной системы счисления есть @ Em.n, где m - общее число символов в конечном шаблоне строки,и n - количество слева деся- тичной точки. "В" как последний символ шаблона означает "пробел когда ноль". Примеры: @ E9.0 1,967, 865 .20e + 007 @ E12.1 1,967, 865 1.9679e + 006 @ E12.1 -1,967, 865 -1.9679e + 006 @ E12.1 000000032 3.2000e - 008 @ E12.1B 0 3.2.3. Шаблоны дат. Даты могут быть представлены в виде числовой переменной (обычно LONG) или строка шаблона. Дата, представленная как числовая перемен- ная, называется стандартной датой, и представляет количество дней с Декабря 28,1800. Когда числоваяя переменная пересылается в шаблон строки даты, полагают, что стандартная дата форматируется в соответс- твии с его шаблоном. Когда строка шаблона даты пересылается в число- вую переменную,она деформатируется в соответствии с его шаблоном и преобразуется в стандартную дату. Знак шаблона даты состоит из @D, следуемых с кодом формата да- ты, следуемых с необязательным указателем разделителя. Формат кодов даты: 1. mm/dd/yy 3/16/88 2. mm/dd/yyyy 3/16/1988 3. *mmm dd,yyyy MAR 16,1988 4. *mmmm dd,yyyy MARCH 16,1988 5. dd/mm/yy 16/03/88 6. dd/mm/yyyyy 16/03/1988 7. *dd mmm yy 16 MAR 88 8. *dd mmm yyyy 16 MAR 1988 9. yy/mm/dd 88/03/16 10. yyyy/mm/dd 1988/03/16 11. yymmdd 880316 - 25 - 12. yyyymmdd 19880316 * Форматы этих дат не м.б. использованы как параметры ASK или ENTRY операторов. (Нечисловые символы не могут входить в числовые по- ля). Указатель разделителя может использоваться для спецификации сим- вола,другого, чем (/) как разделитель для форматов кодов числовых дат. Числовые формы 11 и 12 не имеют разделителей. (Форматы кодов числовых дат выше не маркируются звездочкой). Указатели разделителя: . продуцирует точку - продуцирует тире _ продуцирует пробелы ' продуцирует запятые Примеры шаблонов дат 16 марта 1988 г.: @D1 3/16/88 @D1. 3.16.88 @D2 3/16/1988 @D2- 3-16-1988 @D3 MAR 16,1988 @D1_ 3 16 88 @D4 MARCH 16,1988 @D2, 3,16,1988 @D5 16/03/88 @D5. 16.03.88 @D6 16/03/1988 @D6- 16-03-1988 @D7 16 MAR 88 @D5_ 16 03 88 @D8 16 MAR 1988 @D6_ 16 03 1988 @D9 88/03/16 @D9. 88.03.16 @D10 1988/03/16 @D9- 88-03-16 @D11 880316 @D12 19880316 3.2.4. Шаблоны времени. Время м.б. помещено в числовую переменную (обычно LONG) или шаблон строки.Время,помещаемое в числовую переменную, называется стандартным временем и представляет сотую секунды с полночи. Когда числовая переменная помещается в шаблон строки времени, начинается отсчет стандартного времени и оно форматируется в соответствии с его шаблоном. Когда шаблон строки помещается в числовую переменную, она деформатируется в соответствии с его шаблоном и преобразуется в стан- дартное время. Шаблон времени состоит из @Т, следуемых с кодом формата време- ни, следуемых с необязательным указателем разделителя. Коды формата времени: 1. hh:mm 14:30 2. hh mm 1430 3. *hh:mmхМ 2:30PМ 4. hh:mm:ss 14:30:00 * Этот формат времени не м.б. использован как параметр ASK или ENTRY - операторов. (Нечисловые ключи не могут входить в числовые по- ля). Указатель разделителя может использоваться для спецификации символа, отличного от : как разделителя для форматов кодов 1, 3 и 4 (Формат кода 2 не использует никакие разделители). Указатели разделителя: . продуцирует точки - продуцирует тире _ продуцирует пробелы - 26 - ' продуцирует запятые Примеры знаков шаблонов времени, используемых время 2:15РМ: @Т1 14:15 @Т1. 14.15 @Т2 1415 @Т1_ 1415 @Т3 2:15РМ @ТЗ. 2.15РМ @Т4 14:15:30 @Т4. 14.15.30 3.2.5. Форматированные шаблоны. Отформатированный шаблон называется шаблоном для целых чисел "сделай сам". Знак шаблона для форматированного шаблона соджержит @Р; Формат шаблона есть символьная строка, которая содержит < или # в по- зициях, где расположены целые. Символ, отличный от < или # рассматривается как редактирующий символ и появляется в конечной строке шаблона. < означает "печать в высших разрядах пробелы вместо нулей" и # означает "печать в высших разрядах нули как нули". Заглавная Р м.б. включена в шаблон формата с использованием разделителей нижнего регистра (для примера, @р<#:##РМр). Также строч- ная p м.б. включена в шаблон с использованием разделителей нижнего регистра (пример @Р << # pounds P). "В" как последний символ знака шаблона означает "пробел когда ноль". Примеры отформатированных шаблонов: @P<#/##/##P 20,987 2/09/87 @P<#/##/##P 120,987 12/09/87 @P<#:## AMP 146 1:46 AM @P<#:## PMp 1,146 11 : 46 PM @P###-##-#### P 246,732,453 246-73-2453 @P###/###-#### P 3,059,417,665 305/941-7665 @P###/###-#### P 9,417,665 000/941-7665 @ P4##A-#P 112 411A-2 @ P#' <#"P 511 5' 11" @ P<# 1Ь <# ozP 902 9 1b 2oz 3.2.6. Символьные шаблоны. Шаблон для строки обозначается как @Sn, где n определяет коли- чество символов в строке. Шаблоны строки используются при обработке экранов с ENTRY и MENU полями операторов и при доступе к монитору и клавиатуре с ASK, LOOK и SHOW операторами. 3.3. Оператор EXTERNAL. Метка EXTERNAL Оператор EXTERNAL специфицирует параметр процедуры или функции которые "проходят мимо адресов". Параметр, который проходит мимо адреса, называется внешним па- раметром и принадлежит вызывающей программе, процедуре или функции. Метка EXTERNAL - оператора должна появиться в списке параметров его операторов PROCEDURE или FUNCTION. Программа не может содержать EXTERNAL - операторы до тех пор, пока она не имеет параметров. В вы- зываемом операторе, параметр м.б. именем переменной или промежуточной величиной (результат выражения или функции). Если вызываемый параметр - метка RECORD, HEADER, FOOTER, DETAIL или TABLE-структура, он трак- туется как GROUP-структура. Изменение величины внешней переменной ме- няет ее величину в вызываемой программе, процедуре или функции. - 27 - Промежуточные величины, которые возвращаются функциям, являются результатом выражения и временными. Когда промежуточная величина про- ходит через EXTERNAL, она работает как переменная в течение всей про- цедуры. Если внешняя переменная меняется, ее значение в промежуточной памяти изменяется, как значение переменной, но когда процедура закан- чивается, промежуточная величина освобождается. Поэтому, изменения, сделанные во внешних промежуточных величинах,не обнаруживаются вызы- вающей программой или процедурой. 3.4. Атрибуты EXTERNAL. Атрибуты внешних допустимых массивов экранов, отчетов, файлов, ключей и таблиц проходят как параметры процедур и функций. Следующие ключевые слова м.б. используемы как атрибуты EXTERNAL-оператора: DIM FILE KEY SCREEN DOS INDE REPORT TABLE EXTERNAL-атрибут допускает метку EXTERNAL-оператора для исполь- зования как ограниченного параметра. Хотя эти атрибуты EXTERNAL удобны для обобщенных процедур рабо- ты с файлами, у них есть также недостатки. Если тип даты вызываемого параметра не подходит соответствующему EXTERNAL - атрибуту, программа останавливается с ошибкой. 3.5. Структура GROUP. Метка GROUP Операторы . GROUP - оператор позволяет многократно объявленным операторам ссылаться на простое имя переменной. GROUP-оператор и операторы, сле- дующие за ним,называются GROUP-структурой. GROUP-структура ограничена точкой или END-оператором. GROUP-структуры могут использоваться, что- бы проставить размеры в ряде объявлений или сравнить составные пере- менные. Группы также помогают организовать сложные программы сохране- нием связанных данных вместе. CLEAR процедура может использовать нуль или пробел в объявлениях в GROUP-структуре. GROUP-переменные тракту- ются как строки в выражениях. Структуры GROUP м.б. сгрупированы (структуры внутри структур). Из-за их внутреннего формата SHORT, LONG и REAL переменные не сопоставимы обычно, когда сравниваются как строки. Поэтому GROUP-структуры, содержащие эти типы данных не будут сравниватьсмя или использоваться как ключи в файлах или табличной памяти. DIM, OVER и PRE-атрибуты могут использоваться с GROUP. 3.6. Неявные переменные. Неявные переменные не требуют предложений объявления. Clarion язык обеспечивает 3 типа неявных переменных (LONG, REAL и STRING(32)), которые создаются Компилятором в их первой ссылке и ини- циализируются в соответствии с их типом.Знак фунта(#) в последней по- зиции переменной идентифицирует переменную как LONG; знак доллара($) обозначает REAL; знак цитаты(") обозначает 32-символьную строку STRING. LONG и REAL неявные переменные инициализируются как нуль, а не- явная строка инициализируется пробелами. Имя неявной переменной, включая символ ограничения, не может превышать 12 символов. - 28 - 3.7. Атрибуты переменных. 3.7.1. Атрибут PRE. PRE атрибут обеспечивает приставку, которая м.б. использована для различия идентичных имен переменных, которые встречаются в раз- личных структурах. PRE м.б. использована со следующими операторами: DETAIL FOOTER MENU REPORT DOS GROUP RECORD SCREEN FILE HEADER REPEAT TABLE Параметр-префикс содержит до трех символов, содержащих буквы от A до Z, числа от 0 до 9 и подчеркивающий символ. Префикс должен начи- наться с буквы. При использовании, префикс соединяется с именем пере- менной двоеточием. На переменную в префиксной структуре можно ссы- латься без префикса, если имя переменной уникально. 3.7.2. Атрибут OVER. OVER атрибут позволяет ту же самую область памяти использовать более, чем в одном операторе объявления. OVER м.б. использовано со следующими операторами, но не SCREEN или REPORT структурами: BYTE GROUP MEMO SHORT DECIMAL HEADER REAL STRING DETAIL LONG RECORD TABLE FOOTER Местные переменные не м.б. объявлены через глобальные перемен- ные, и переменные в GROUP-структуре не м.б. объявлены через перемен- ные вне GROUP- структуры. Переменные не м.б. объявлены через короткие переменные. Также, переменная в OVER-атрибуте не может иметь начальное значение. 3.7.3. Атрибут DIM. DIM (размерность,...,размерность) DIM-атрибут объявляет массив. DIM может использоваться со сле- дующими операторами, но не SCREEN или REPORT-структурами: BYTE LONG DECIMAL GROUP SHORT REAL STRING EXTERNAL DIM(10)-атрибут в предложении описания обозначает повторение этого определения 10 раз (но только в одном списке). Параметр размер- ность - числовая константа, которая специфицирует число повторений в этой размерности. Индексы внутри групп присоединяются к имени пере- менной, показывая, какой элемент повторения (массива) используется. Так X[i] указывает i-ое повторение в X-массиве. X[1] указывает 1-й элемент и X[10] указывает 10-й элемент одномерного массива. Массивы с многократной размерностью называются "вложенными". В двумерном массиве ряды расположены в памяти в следующем порядке: [1,1], [1,2]... [1,m], [2,1], [2,2], [2,m],... [n,1], [n,2]... [n,m]. DIM-атрибут может иметь до 4 размерностей. Размерность GROUP - структуры есть особый случай. Каждый уровень вложенности прибавляет индексы (слева направо) заново объявленным GROUP и его членам. Вложе- ние трех одномерных массивов продуцирует переменную, нуждающуюся в трех индексах. Одного измерения массив внутри двух-размерного массива требует трех индексов и т.д. Количество размерностей GROUP- структуры описывается точно также как его GROUP-оператор. Сумма индексов не мо- - 29 - жет превышать четырех. Данные массива не могут превышать 65520 байтов. Индексы м.б. константами, переменными, функциями и выражениями. 3.8. Массивы как параметры процедур и функций. Массив не м.б. объявлен парамметром PROCEDURE или FUNCTION опе- ратором до тех пор, пока он является "внешним параметром массива". DIM атрибут используется с оператором EXTERNAL для объявления внешнего параметра массива. Каждый необходимый размер массива д.б. специфицирован в DIM-атрибуте, но параметр "размер" не нуждается ни в чем другом, кроме 1, например: label EXTERNAL, DIM(1,1) объявляет двухразмерный внешний массив. Параметры "размер" не диктуют объявление размера, т.к. массив "внешний" или другими словами, "описан везде". Метка массива (сама) не м.б. использована в выполняемых опера- торах. Компилятор надеется, что индексы будут специфицированы. К мас- сиву можно обращаться из процедуры, идя к нему с внешним параметром размерности. Массив проходит с внешним параметром размерности, при соединяя пустые группы ([]) к имени массива. 3.9. Директивы компиляторa. 3.9.1. Директива EQUATE. Форма 1: Метка EQUATE(метка) Форма 2: Метка EQUATE(константа) Форма 3: Метка EQUATE(шаблон) Форма 4: Метка EQUATE(ключ) Директива EQUATE назначает метку другой метке, числовому или символьному значению, обозначению шаблона или символьного слова. Мет- ка EQUATE -директивы не м.б. резервным словом или ключевым словом, используемым в DATA section. Метка EQUATE-директивы не м.б. такой как ее параметр. В форме 1 EQUATE, параметр (метка) м.б. любым допустимым опера- тором метки. Эта форма EQUATE м.б. использована для объявления замес- тителя метки (чаще называемого алиас). В форме 2, параметр (константа) м.б. любой числовой или сим- вольной константой. Эта форма м.б. использована для объявления метки как сокращенной записи для long констант (таких как Pi) или сделать константу легче для определения и изменения. В форме 3, параметр (шаблон) д.б. знаком шаблона. Эта форма м.б. использована для объявления метки как стенографии для обозначе- ния шаблона (нампример, SS_PIC м.б. использована для (@P ### - ##- ## ##P). В форме 4, параметр "Ключ" д.б. ключевым словом Clarion, отлич- ным от EQUATE, TITLE или SUBTITLE. Эта форма EQUATE м.б. использована для модификации Clarion-языка. 3.9.2. Директива SIZE. Форма 1: SIZE(метка) Форма 2: SIZE(константа) Форма 3: SIZE(шаблон) SIZE-директива задает размер памяти, используемый параметром. Компилятор возвращает SIZE-дмирективу с ее соответствующей величиной перед компиляцией оператора. SIZE может использоваться в программе, где имеется допустимое числовое значение. - 30 - В форме 1 параметр (метка) д.б. меткой переменной, объявленной предварительно. Размер переменной в байтах. В форме 2 параметр (константа) м.б. числовой или символьной константой. Размер символьной константы есть длина строки. Размер числовой константы есть размер самого маленького типа данных (исполь- зуя BYTE, SHORT, LONG или REAL), который может его содержать. В форме 3 параметр (шаблон) есть допустимое значение шаблона. Размер значения шаблона есть длина отформатированной строки, продуци- руемой значением шаблона. - 31 - 4. Выражения. Выражение - это формула, по которой вычисляется значение в язы- ке Clarion. Bыражение может появиться как источник присваивания опе- ратора, параметра процедуры или функции, индекса размерности величины или как часть IF, CASE, EXECUTE или LOOP - предложений. Выражения содержат константы, переменные и функции, соединенные операторами. Выражение вычисляется выполнением его операторов в по- рядке приоритета. Каждый оператор продуцирует промежуточное значение, которое затем используется в последующих операторах. Порядок приоритета операторов ограничивается оператором типа и круглыми скобками (которые группируют выражения в подвыражения). Ко- нечная промежуточная величина есть величина выражения. Числовое, сим- вольное и условное выражение продуцирует числовую величину, символь- ную величину и логическую величину ("правда" или "ложь") соответственно. Простая константа, переменная или функция также составляют вы- ражение. Оператор описывается в главах, которые специфицируют выраже- ния как компонент оператора. Константа, переменная или функция м.б. использованы в любом контексте,который разрешает выражение. 4.1. Функции. Функция есть подпрограмма, которая возвращает промежуточное значение выражению. Функция используется в том же самом контексте, как переменная; тем не менее, функция должна следовать со списком па- раметров Функция, у которой нет параметров, следует с пустым списком параметров, например: ERROR(). Есть два рода функций. Пользовательские функции начинаются опе- ратором FUNCTION и появляются как параметр FUNC оператора в MAP-структуре. Атрибут FUNC оператора (LONG, REAL или STRING) дает тип данных возвращаемой величины. Библиотечные функции являются встроенными в язык Clarion и не объявляются в МАР-структуре. Тип данных возвращаемой величины библио- течной функции описывается в гл.13. Список библиотечных функций: ABS BSHIFT CONTENTS FOREHUE LOGE RANDOM SUB ACOS BXOR COS FORMAT LOWER RECORDS TAN AGE BYTES DATE INRANGE MAXIMUM REFER TODAY ALL CENTER DAY INSTRING MEMORY RIGHT UPPER ASIN CHOICE DEFORMAT INT MONTH ROUND VAL ATAN CHR EOF KEYBOARD NAME ROW YEAR BACKHUE CLIP ERROR KEYCODE NUMERIC ROWS BAND CLOCK ERRORCODE LEFT OMITTED RUNCODE BOF COL FIELD LEN PATH SIN BOR COLS FIELDS LOG10 POINTER SQRT 4.2. Числовые константы. Числовые константы являются фиксированными величинами, которые входят в предложения объявления атрибутов, и в выражения. Например, в выражении I+1, 1 - числовая константа. Десятичная числовая константа содержит необязательный знак "минус" впереди в це- лой части и необязательную десятичную точку в дробной. Форматировать символы, такие как запятые и знак доллара не разрешается в числовых константах, а числовая константа не может заканчиваться десятичной точкой. В добавление к десятичным (основание 10), числовые конситанты м.б. двоичными (основание 2), восьмеричными (основание 8) или шест- надцатеричными (основание 16). Двоичные константы содержат впереди необязательный знак минус, - 32 - цифры 0 и 1, и ограничиваются В или Ь. Восьмеричные константы содержат впереди необязательный знак ми- нус, цифры от 0 до 7, и ограничены 0. Шестнадцатеричные константы содержат впереди необязательный знак минус, цифры от 0 до 9 и буквы ои А до F (которые обозначают числа от 10 до 15), и ограничиваются H или h. Самый левый символ шестнадцатеричнoй константы не д.б. А или F. Очень большие или очень маленькие константы могут выражаться в научной нотациим (степени десяти). Научная нотация использует формат: - #. ##### + ### , где - #.##### - знаковая десятичная величина - + ### - знаковая степень 10. Цифровые константы никогда не хранятся как строки. 4.3. Числовые операторы. Числовой оператор комбинирует два арифметических операнда для создания промежуточной величины. Числовыми операторами являются: + сложение (A + В значит A plus B) - вычитание (A - B значит А minus B) * умножение (A * B значит A times B) / деление (A / B значит A divided B) ^ возведение в степень (A . B значит A to the Bth power) % Деление модулей (A % B значит the remainder of A divided by B). Числовая операция продуцирует как LONG, так и REAL промежуточ- ную величину, зависящую от типов данных операндов. Деление или возве- дение в степень, однако, всегда продуцирует REAL промежуточную вели- чину. Эта таблица показывает типы промежуточных величин, продуцируе- мых операндами различных типов данных: O BYTE SHORT LONG REAL DECIMAL STRING ------------------------------------------------------- P BYTE | LONG* LONG* LONG* REAL REAL REAL E SHORT | -"-- -"- -"- -"- -"- -"- R LONG | -"- -"- -"- -"- -"- -"- A REAL | REAL REAL REAL -"- -"- -"- N DECIMAL| -"- -"- -"- -"- -"- -"- D STRING | -"- -"- -"- -"- -"- -"- Операторы деления и экспоненты всегда продуцируют REAL. 4.4. Числовые выражения. Числовые выражения могут занимать как параметры в CASE, EXECUTE, IF и LOOP операторах, так и в операторах присваивания. Циф- ровые выражения могут содержать оператор конкатенации, но не могут содержать логические операторы. Если оператор конкатенации есть ко- нечный в числовом выражении, или элемент числового выражения есть символьная константа или переменная, конечная промежуточная величина преобразуется из символьной в числовую. (См. "Правила преобразования данных в гл.5) 4.5. Символьные константы. Символьные константы располагаются в символах, изображающих слова, предложения, адреса,что входят как параметры в предложения объявления и атрибуты, и в выражения. Символьные константы заключают- ся в апострофы. Используют два последовательных апострофа для включе- ния апострофа в строковую константу. - 33 - Непечатаемые символы м.б. включены в строковую константу, зак- лючая их ASCII коды в угловые скобки(знаки <чем и >чем). Напомним, что двоичные, восьмеричные или шестнадцатеричные константы м.б. ис- пользованы внутри угловых скобок, где их представление проще. Исполь- зуйте два знака (< чем) для включения знака (< чем) в строковую конс- танту. Нет необходимости дублировать знак (> чем) в строковую констан- ту, т.к. непарный знак (< чем) инициирует поиск знака (> чем). Имеет- ся формат для включения непечатаемых символов в строковую константу: <ххх,yyy,zzz> ,где xxx,yyy и zzz равны ASCII символьным кодам. Строковые константы,содержащие последовательности простых сим- волов, м.б. укорочены с использованием счетчика повторов. Счетчик повторов специфицирует, сколько раз символ м.б. повторен в строковой константе. Счетчик повторов состоит из символа, который повторяет- ся,левых фигурных скобок, счетчика повторов и правых фигурных скобок. Счетчик повторов - общее число последовательных повторов символа. Также как апостроф и знак (<чем), используют две левых фигурных скобки для включения левой скобки в строковую константу. Строковая константа " (два апострофа) определяет нулевую строку, которая не со- держит символов. После того, как короткая строка расширится пробела- ми, строковая константа м.б. использована для представления пробель- ной строки любой длины. 4.6. Вычисление числовых и символьных выражений. Числовое или символьное выражение вычисляется выполнением каж- дого оператора.Последовательность операторов управляется правилами предшествования операторов. Круглые скобки используются в выражении для группировки операций в подвыражения. Подвыражения выполняются из внутренних к внешним скобкам.Опера- ции во внутренних(из-за отсутствия скобок) скобках выполняются слева направо внутри их предшествующего уровня. Поэтому все операторы из предшествующего уровня 1 выполняются слева направо, потом все опера- торы из второго уровня выполняются слева направо и т.д. Здесь предшествующие уровни числовых и символьных выражений: Уровень 1 ( ) заключенная в скобки группа Уровень 2 - одноместный синус Уровень 3 вызов функции параметры группы,которые являются подвыражением Уровень 4 ^ экспонента Уровень 5 * / % умножение, деление, деление по модулю Уровень 6 + - сложение, вычитание Уровень 7 & конкатенация 4.7. Операторы конкатенации. Оператор конкатенации размещает две строки в одной. Длиной ре- зультирующей строки является сумма длин двух операндов. Оператор строки всегда продуцирует строку с промежуточной величиной; тем не менее, один или оба операнда могут быть числовым типом данных. Если операнд имеет числовой тип данных, он преобразуется в дробь с необя- зательным знаком минус, представляющую строку цифр с необязательной десятичной точкой. Следующий оператор иллюстрирует самую большую ошибку в исполь- зовании оператора конкатенации: BOOK_TITLE = BOOK_TITLE & 'ССР_OUT' Полагаем, что BOOK_TITLE ---> string(40). Оператор конкатенации продуцирует строку в 48 символов ( длина BOOK_TITLE + длина - 34 - 'ССР_OUT'). Когда оператор присваивания переносит 48 символов проме- жуточной величины к BOOK_TITLE, он усекает последние восемь символов, испортив оператор конкатенации. Правильное использование: BOOK_TITLE = SUB(BOOK_TITLE,1,SIZE(BOOK_TITLE)-8) & 'ССР_OUT' 4.8. Символьные выражения. Символьные выражения встречаются как параметры и как источник присвоения операторов, когда адресат является символьной переменной. Символьные выражения могут содержать числовые операторы, но они не могут содержать к.-л. логические операторы. Если числовой оператор является конечной операцией, вычисляемой в символьном выражении, или если только элемент строкового выражения является цифровой константой или переменной, конечная промежуточная величина преобразуется из чис- ловой в символьную величину. 4.9. Логические операторы. Логический оператор проверяет два операнда и продуцирует усло- вия "true" или "false". Есть два вида логических операторов:условные и связи. Условные ( < чем, >чем, = и их комбинации) сравнивают две величины. Операторы связи (И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ и НЕ) вырабатывают условия "false" или "true". Когда величина используется как операнд связи, логическое выра- жение вычисляется как "true" для ненулевых и "false" для нуля. (Нап- ример, 0 AND 1 вырабатывает "false"). Логическими операторами являются: Условные: = ! правда, если равно < ! правда, если меньше чем > ! правда, если больше чем <> или = или NOT= ! правда, если не равно ~< или => или >= или NOT< ! правда, если не меньше чем ~> или =< или <= или NOT> ! правда, если не больше чем Связи: ~ или NOT ! правда,если ложь;ложь,если правда AND ! правда,если в обоих случаях правда OR ! правда,если в одном из случаев или в обоих правда XOR ! правда,если в одном из случаев, ! но не в обоих правда 4.10. Логические выражения. Логические выражения используются в IF, LOOP WHILE и LOOP UNTIL операторах. Конечное условие выражения ("правда" или" ложь") исполь- зуется для ограничения выполнения последовательности операторов, ко- торые следуют. Условные операторы имеют самое высокое предшествование в логи- ческих выражениях. Все условные операторы имеют одинаковое предшест- вование и вычисляются слева направо. Предшествование операторов связи ограничивает группирование условных подвыражений. Неоднозначные сос- тавные выражения могут стать яснее с использованием круглых скобок. Предшествование в логических выражениях следующее: Уровень 1 условные Уровень 2 NOT или ~ Уровень 3 AND - 35 - Уровень 4 OR или XOR 4.11. Постоянные выражения. Выражение константа вычисляется Компилятором и хранится как константа; поэтому выражение константа может использоваться везде, где допустима константа. Выражение константа формируется с использо- ванием только констант и операторов. Выражение строки константы со- держит строковую константу, строки равенств и оператора конкатена- ции(&). Выражение цифровой константы состоит из цифровых констант и числовых операторов. Выражение константа может содержать скобки, но первый символ выражения константы не м.б. левой скобкой. 4.12. Функции в выражениях. В выражении функция вызывается как одноместный оператор. Пара- метры вычисляются слева направо, каждый в соответствии с теми прави- лами для числовых или символьных выражений, которые описаны ранее в этой главе. В логическом выражении все условия проверяются перед концом ра- боты. Это указывает на то, что когда логическое выражение содержит несколько вызовов функций, все вызовы функций выполняются. Функции, которые не только возвращают величины, м.б. написаны; например, они могут видоизменить содержание глобальной переменной. Если эта гло- бальная переменная появляется неожиданно в выражении, она может вли- ять на результат выражения неожиданным образом. Эти действия вызыва- ются функциями в выражениях и называются "побочным эффектом". Например: A = X()+Y(B) В вышеприведенном примере полагаем, что B - глобальная перемен- ная и что функция Х изменила величину В. Можно получить различный результат,если выражение запишется так: A = Y(B)+X() - 36 - 5. Oператоры присваивания. Oпepaтopы пpиcвaивaния задают ячейке пaмяти значение, или в тepминoлoгии языкa пpoгpaммиpoвaния, пepecылaют знaчeниe к пepeмeннoй. Oпepaтop пpиcвaивaния, oднaкo нe пpocтo пepecылaeт coдepжимoe oднoй ячeйки пaмяти к дpyгoй ячeйкe. Фopмaт пepeмeннoй зaвиcит oт типa ee дaнныx. (Cм. глaвy 3 для oпиcaния типoв дaнныx пepeмeнныx). Знaчeниe oднoгo типa дaнныx дoлжнo быть пpeoбpaзoвaнo для тoгo, чтoбы пepecлaть eгo к пepeмeннoй c дpyгим типoм дaнныx. B CLARION лю- бую пepeмeнную мoжно пepecлaть к любoй дpyгoй пepeмeннoй. Для любoй кoмбинации типa дaнныx cyщecтвyeт пpaвилo пpeoбpaзoвaния дaнныx (oпpeдeлeннoe в дaннoй глaвe). 5.1. Операторы присваивания. Oпepaтop пpиcвaивaния oбычнo caмый простой oпepaтop в пpoгpaммe. B дaннoм oпepaтope пpимeняeтcя знaк paвeнcтвa, oбoзнaчaющий "ycтaнaвливaeтcя paвным". Taким oбpaзoм, oпepaтop A=B oзнaчaeт "A ycтaнaвливaeтcя paвным B", или пpoщe, "пepecлaть B к A". Пoлyчaтeль дoлжeн быть имeнeм пepeмeннoй, a иcтoчник дoлжeн быть выpaжeниeм. Taк кaк выpaжeниe дoлжнo быть выпoлнeнo дo тoгo, кaк eгo знaчeниe мoжно было пepecлaть, oпepaтop пpиcвaивaния являeтcя пepвичным вычиcлитeльным инcтpyмeнтoм пpoгpaммы. Haпpимep, oпepaтop A=B+C ycтaнaвливaeт A paвным cyммe B плюc C. Ecли иcтoчник и пoлyчaтeль являютcя paзличными типaми дaнныx (или oбa являютcя шaблoнными cтpoкaми), oпepaтop пpиcвaивaния пpoизвoдит пpeoбpaзoвaниe дaнныx. B глaвe 4 oпиcaны типы дaнныx для выpaжeний. Tип дaнныx кaждoй библиoтeчнoй фyнкции дaн вмecтe c ee oпиcaниeм, a тип дaнныx фyнкции пoльзoвaтeля дaн в cтpyктype MAP. 5.2. Опepaтopы пpиcвaивaния и действия. Мeткa пoлyчaтeль += иcтoчник Мeткa получатель -= иcтoчник Меткa получатель *= иcтoчник Мeткa получатель /= иcтoчник Мeткa получатель ^= иcтoчник Мeткa получатель %= иcтoчник Paзличныe oпepaтopы пpиcвaивaния пpoизвoдят apифмeтичecкиe дeйcтвия с пepeмeнными. B кaждoм из изoбpaжeнныx oпepaтopoв пpиeмник дoлжeн быть имeнeм пepeмeннoй, a иcтoчник дoлжeн быть выpaжeниeм. Haибoлee чacтo oпepaтop пpиcвaивaния пpимeняeтcя для пpибaвлeния или вычитaния пepeмeннoй. Cлeдyющиe oпepaтopы пpибaвляют единицу или вы- читaют единицу из пepeмeнной A: A = A + 1 A = A - 1 Пpeдлaгaeтcя coкpaщeннaя фopмa oпepaтopa пpиcвaивaния для выпoлнeния пoдoбныx дeйcтвий. Эти oпepaтopы тaкжe дoбaвляют eдиницy к, или вычитaют eдиницy из пepeмeннoй A: A += 1 A -= 1 Oпepaтopы oзнaчaют "пpибaвь 1 к A" и " вычти 1 из A". Boт пpимepы вcex oпepaтивныx oпepaтopoв пpиcвaивaния, пoкaзaнныe c иx эк- вивaлeнтнoй линeйнoй фopмoй: - 37 - A += 1 A = A + 1 A -= B A = A - B A *= -5 A = A * 5 A /= 100 A = A / 100 A ^= 1+1 A = A ^ (1+1) A %= 7 A = A % 7 5.3. Оператор CLEAR. Мeткa CLEAR(мeткa) Oпepaтop CLEAR ycтaнaвливaeт в иcxoднoe cocтoяниe пepeмeннyю, cтpyктypы GROUP, RECORD, HEADER, DETAIL, FOOTER, или мaccив. Для чиcлeннoй пepeмeннoй (BYTE, SHORT, LONG, REAL и DECIMAL) иcxoдным cocтoяниeм являeтcя нyль, a для STRING или MEMO - пpoбeлы. Cтpyктypa ycтaнaвливaeтcя в иcxoднoe cocтoяниe пyтeм ycтaнoвлeния в иcxoднoe cocтoяниe кaждoй из cвoиx пepeмeнныx. Becь мaccив ycтaнaвливa- eтcя в иcxoднoe cocтoяниe пyтeм пpимeнeния имeни мaccивa c пycтыми cкoбкaми, CLEAR ycтaнaвливaeт в иcxoднoe cocтoяниe тoлькo мaccив цeлыx чиceл. CLEAR нe мoжeт пpимeнятьcя для ycтaнoвлeния в иcxoднoe cocтoяниe oднoгo элeмeнтa мaccивa. 5.4. Пpaвилa пpeoбpaзoвaния дaнныx. Oпepaтop пpиcвaивaния нe вceгдa дaeт тpeбyeмый peзyльтaт. Paccмoтpим oпepaтop: I = 1.1. Ecли I oпиcывaeтcя кaк LONG, oпepaтop ycтaнaвливaeт знaчeниe I paвным 1, a нe 1.1, кaк тpeбoвaлocь. Пepeмeнныe типa LONG не допycкaют выpaжeния нaд дpoбными чиcлaми, cлeдoвaтeльнo, LONG = REAL вызывaeт yceчeниe дpoбнoй чacти REAL. B тaблицe пpeoбpaзoвaния типoв дaнныx, пpeдcтaвлeннoй нижe, пoкaзaны пpaвилa пpeoбpaзoвaния для кaждoй кoмбинaции типoв дaнныx, кoтopыe вoзникaют в cлyчae нecoвпaдeния типoв иcтoчникa и пoлyчaтeля. Koмбинaции, кoтopыe нe тpeбyют пpeoбpaзoвaния дaнныx (нaпpимep, BYTE k BYTE, или SHORT k LONG) вceгдa coздaют paвныe иcтoчник и пoлyчaтeль. Koмбинaции, пoкaзaнныe c мнoгoкpaтными пpaвилaми пpeoбpaзoвaния, (нaпpимep, REAL k SHORT, или STRING k DECIMAL), тpeбyют бoлee oднoгo шaгa для пpeoбpaзoвaния. П О Л У Ч А Т Е Л Ь BYTE SHORT LONG REAL DECIMAL STRING PICTURE _ ____________________________________________________ И BYTE ! 8 10 С SHORT ! 1 8 10 Т LONG ! 1 2 8 10 О REAL ! 3.1 3.2 3 9 10 Ч DECIMAL !4.3.1 4.3.2 4.3 4 4.9 10 Н STRING !5.3.1 5.3.2 5.3 5 5.7 11 11 И PICTURE !6.3.1 6.3.2 6.3 6 6.7 11 6.10 К Пpaвилo 1: SHORT или LONG к BYTE. Знaкoвый paзpяд иcтoчникa игнopиpyeтcя. Пoлyчaтeль пoлyчaeт 8 млaдшиx битoв иcтoчникa. Пpaвилo 2: LONG к SHORT. Знaкoвый paзpяд пoлyчaтeля пoлyчaeт знaкoвый paзpяд иcтoчникa. Пoлyчaтeль пoлyчaeт млaдшиx 15 битoв иcтoчникa. Пpaвилo 3: REAL к LONG. - 38 - Знaкoвый paзpяд пoлyчaтeля пoлyчaeт знaкoвый paзpяд иcтoчникa. Пoлyчaтeль пoлyчaeт млaдшие 31 бит иcтoчникa. Пpaвилo 4: DECIMAL к REAL. Получатель наследует знак, всю целую и всю дробную часть источ- ника. Пpaвилo 5: STRING к REAL. Формат источника должен включать знак числа, целую часть, деся- тичную точку, дробную часть. Завершающие пробелы игнорируются. Запя- тая, или любой другой символ в источнике сбрасывает пoлyчaтeль в нуль. Пpaвилo 6: PICTURE к REAL. Источник деформатируется в соответствии с его маской. Любой не подходящий символ сбрасывает получатель в нуль. Пpaвилo 7: REAL к DECIMAL. Для DECIMAL(m,n) получатель использует знак, m-n знаков для це- лой части и n знаков для дробной части. Пpaвилo 8: BYTE, SHORT или LONG к STRING. Получатель - это возможный минус, если число отрицательное и следующее числовое значение. Пpaвилo 9: REAL к STRING. Получатель - это возможный минус,возможная целая часть,десятич- ная точка и возможная дробная часть числа. Очень большие и очень ма- лые числа выдаются в научном формате. Пpaвилo 10: BYTE, SHORT, LONG, REAL, DECIMAL, или PICTURE в PICTURE. Пoлyчaтeль фopмaтиpyeтcя coглacнo cвoeмy шaблoнy. Шaблoны вpeмeни и дaты пpeдпoлaгaют cтaндapтныe oбoзнaчeния вpeмeни и дaты. Bce дpyгиe шaблoны пpeдпoлaгaют любoe чиcлeннoe знaчeниe. ( Cм. "Oпиcaниe шaблoнoв" в Глaвe 3 для oпиcaния фopмaтиpoвaния в cooтвeтcтвии c oпиcaниeм шаблoнoв). Пpaвилo 11: STRING к STRING, STRING к PICTURE или PICTURE к STRING. Ecли пoлyчaтeль кopoчe иcтoчникa, иcтoчник yceкaeтcя. Ecли пoлyчaтeль длиннee иcтoчникa, иcтoчник дoпoлняeтcя пpoбeлaми. - 39 - 6. Oператоры управления. B paздeлe CODE пpoгpaмм CLARION oпepaтopы выпoлняютcя в тoй пocлeдoвaтeльнocти, в кoтopoй oни пoявляютcя в иcxoднoм фaйлe. Пepвый oпepaтop пocлe oпepaтopa CODE являeтcя пepвым выпoлняeмым oпepaтopoм в пpoгpaммe, пpoцeдype или фyнкции. Зaтeм выпoлняeтcя втopoй oпepaтop, зaтeм тpeтий и т.д. Oпepaтopы yпpaвлeния измeняют пocлeдoвaтeльнocть выпoлнeния. Heкoтopыe oпepaтopы yпpaвлeния (нaпpимep, GOTO, RETURN и CYCLE) пpocтo пepeдaют yпpaвлeниe дpyгoмy oпepaтopy, c кoтopoгo зaтeм пpoдoлжaeтcя выпoлнeниe. Дpyгиe oпepaтopы yпpaвлeния (тaкиe кaк IF, CASE и LOOP) являютcя cтpyктypными, oни зaключaют paзъeдинeнныe oпepaтopы в гpyппы для ycлoвнoгo вычиcлeния. 6.1. Oпepaтop вызoвa пpoцeдypы. Метка Имя процедуры(список параметров) Oпepaтop вызoвa пpoцeдypы вызывaeт пpoцeдypy. Пpoцeдypы, нaпиcaнныe пoльзoвaтeлeм, дoлжны быть нaзвaны тaк жe кaк пapaмeтp oпepaтopa PROC в cтpyктype MAP; oни oпиcывaютcя oпepaтopoм PROCEDURE. Cпиcoк пapaмeтpoв oпepaтopa вызoвa пpoцeдypы являeтcя нeoбязaтeльным, нo дoлжeн cooтвeтcтвoвaть фopмaтy cпиcкa пapaмeтpoв вызывaeмoй пpoцeдypы oпepaтopa PROCEDURE. Пpoцeдypы и иx пapaмeтpы oпиcaны в глaвe 2 в "Oпepaтop PROCEDURE". Cyщecтвyют двa видa пpoцeдyp: Haпиcaнныe пoльзoвaтeлeм пpoцeдypы нaчинaютcя c oпepaтopa PROCEDURE и пoявляютcя кaк пapaмeтp oпepaтopa PROC в cтpyктype MAP. Библиoтeчныe пpoцeдypы вcтpoeны в язык CLARION и нe нaзывaютcя в cтpyктype MAP. Спиcoк библиoтeчныx пpoцeдyp: ACCEPT BUFFER COPY GET NEXT PRINT RUN SHARE ADD BUILD CREATE HELP NORMAL PUT SCROLL SHOW ALERT CACHE DELETE HOLD OPEN RECOVER SELECT SKIP ALIAS CALL DISPLAY IDLE OUT RELEASE SET SQRT APPEND CHAIN EMPTY IN PACK REMOVE SETCLOCK STOP ASK CLEAR ENHANCE LOCK PALETTE RENAME SETCURSOR STREAM BEEP CLOSE ERASE LOGOUT PEEK RESTART SETHUE TYPE BLANK COLOR FLUSH LOOK POKE REVERSE SETPATH UNLOCK BLINK FREE PREVIOUS ROLLBACK SETTODAY UPDATE 6.2. Oпepaтop GOTO. Мeткa1 GOTO Мeткa2 Oпepaтop GOTO пepeдaeт yпpaвлeниe c oднoгo oпepaтopa нa дpyгoй. Oпepaтop c мeткoй 2 выпoлняeтcя пocлe GOTO, пoмeчeннoгo мeткoй 1. Meткa 1 являeтcя нeoбязaтeльнoй oпepaтopнoй мeткoй oпepaтopa GOTO, мeткa 2 дoлжнa быть oпepaтopнoй мeткoй дpyгoгo oпepaтopa в paздeлe CODE этoй жe пpoгpaммы, пpoцeдypы, фyнкции или лoкaльнoй пpoгpaммы. Oпepaтop GOTO нe мo жeт пepeдaвaть yпpaвлeниe из лoкaльнoй пpoгpaммы (этo дeлaeт EXIT) или из пpoгpaммы, пpoцeдypы или фyнкции (этo дeлaют RETURN и RESTART). 6.3. Oпepaтop DO. Мeткa 1 DO Мeткa2 Oпepaтop DO пpимeняeтcя для выпoлнeния лoкaльнoй пpoцeдypы. Лoкaльнaя пpoцeдypa ввoдитcя oпepaтopoм ROUTINE и пoмeщaeтcя в кoнeц - 40 - пpoгpaммы, пpoцeдypы или фyнкции. Oпepaтop DO пepeдaeт yпpaвлeниe oпepaтopy ROUTINE, пoмeчeннoгo мeткoй 2. Meткa 1 являeтcя необязательной операторной меткой оператора DO, а метка 2 должна быть операторной меткой оператора ROUTINE в той же программе, процедуре или функции. Лoкaльнaя пpoцeдypa зaвepшaeтcя пpи выпoлнeнии oпepaтopa EXIT или дocтижeнии кoнцa лoкaльнoй пpoцeдypы. Лoкaльнaя пpoцeдypa зaвepшaeтcя дpyгим oпepaтopoм ROUTINE, oпepaтopoм FUNCTION или кoнцoм иcxoднoгo фaйлa. Koгдa пpoгpaммa зaвepшaeтcя, yпpaвлeниe вoзpaщaeтcя oпepaтopy, cлeдyющeмy пocлe вызывaющeгo oпepaтopa DO. Oпepaтop ROUTINE мoжeт быть выпoлнeн тoлькo oпepaтopoм DO. "Пaдeниe в" пpoгpaммy пpивoдит к вoзвpaтy из пpoгpaммы, пpoцeдypы, фyнкции. Oпepaтopныe мeтки в пpoгpaммe являютcя "нeвидимы- ми" для oпepaтopoв GOTO внe пpoгpaммы. Taким жe oбpaзoм, oпepaтopныe мeтки внe cтpyктypы пpoцeдypы являютcя "нeвидимыми" для oпepaтopoв GOTO внyтpи пpoцeдypы. Oднaкo пpoгpaммa мoжeт вызывaть (DO) дpyгyю лoкaльнyю пpoцeдypy (ROUTINE). 6.4. Oпepaтop EXIT. Oпepaтop EXIT мoжeт пoявлятьcя тoлькo в лoкaльнoй пpoцeдype. EXIT вoзвpaщaeт yпpaвлeниe oпepaтopy, cлeдyющeмy пocлe вызывaющeгo oпepaтopa DO. EXIT являeтcя нe oбязaтeльным, т.к. oн aвтoмaтичecки coздaeтся кoмпилятopoм в кoнцe пpoцeдypы. 6.5. Оператор IF. Мeткa IF Лoгичecкoe выpaжeниe 1 THEN Опepaтopы (выпoлняютcя, ecли выpaжeниe 1 иcтиннo) ELSIF лoгичecкoe выpaжeниe 2 THEN Oпepaтopы (выпoлняютcя, ecли выpaжeниe 2 иcтиннo) ELSE Опeраторы (выполняются,если все выражения ложные) END Oпepaтop IF выпoлняeт гpyппy oпepaтopoв в зaвиcимocти oт ycлoвия oднoгo или бoлee лoгичecкиx выpaжeний. Oпepaтop IF и пocлeдyющиe oпepaтopы нaзывaютcя cтpyктypoй IF. Cтpyктypa IF зaкaнчивaeтcя тoчкoй или oпepaтopoм END. ELSIF (oзнaчaющий "или инaчe ecли ELSIF"), THEN и ELSE являютcя paздeлитeлями oпepaтopoв, кoтopыe дeлят cтpyктypy IF нa гpyппы oпepaтopoв. Cтpyктypa IF cocтoит из: oпepaтopa IF c eгo лoгичecким выpaжeниeм и oпepaтopнoй гpyппы THEN; пocлeдyющиx нeoбязaтeльныx ELSIF c лoгичecкими выpaжeниями и oпepaтopными гpyппaми THEN; пocлeдyющeй нeoбязaтeльнoй oпepaтopнoй гpyппoй ELSE. Oпepaтopнaя гpyппa THEN выпoлняeтcя, ecли иcтиннo cвязaннoe c нeй IF или ELSIF лoгичecкoe выpaжeниe-"правда". Oпepaтopнaя гpyппa ELSE выпoлняeтcя, ecли нe былa выпoлнeнa oпepaтopнaя гpyппa THEN. Cтpyктypa IF мoжeт имeть любoe кoличecтвo ELSIF, нo мaкcимyм oднo ELSE. Пocлe выпoлнeния oднoй из oпepaтopныx гpyпп yпpaвлeния пepeдaeтcя из cтpyктypы IF, тaким oбpaзoм выпoлняeтcя нe бoлee oднoй oпepaтopнoй гpyппы. Paздeлитeль THEN нeoбязaтeлeн, ecли лoгичecкoe выpaжeниe и oпepaтopнaя гpyппa THEN paздeляютcя кoнцoм cтpoки или тoчкoй c зaпятoй. - 41 - 6.6. Cтpyктypa CASE. Мeткa CASE выpaжeниe 1 OF выpaжeниe 2 Опepaтopы (выпoлняютcя, ecли выpaжeние 2 paвнo 1) OROF <выpaжeниe 3> Опepaтopы (выпoлняютcя, ecли выpaжeния 2 или 3 paвны 1) ELSE Опepатopы (выпoлняютcя, ecли нeт выpaжeний paвныx 1) . Oпepaтop CASE выпoлняeт гpyппy oпepaтopoв, в зaвиcимocти oт знaчeния выpaжeния. Oпepaтop CASE c пocлeдyющими oпepaтopaми нaзывaютcя cтpyктypoй CASE. Cтpyктypa CASE зaвepшaeтcя тoчкoй или oпepaтopoм END. OF, OROF (oбoзнaчaющий "или пpи") и ELSE являютcя paздeлитeлями oпepaтopa, кoтopыe paздeляют cтpyктypy CASE нa гpyппы oпepaтopoв. Cтpyктypa CASE cocтoит из oпepaтopa CASE c CASE-выpaжeниeм; зa кoтopыми cлeдyют oпepaтopныe гpyппы OF и ELSE, cнaчaлa выпoлняeтcя выpaжeниe CASE, зaтeм выпoлняeтcя кaждoe выpaжeниe OF и OROF. Ecли знaчeниe выpaжeния OF или OROF paвнo выpaжeнию CASE, тo cooтвeтcтвyющaя oпepaтopнaя гpyппa выпoлняeтcя. Ecли ни oднa из oпepaтopныx гpyпп OF или OR нe выпoлняeтcя, тo вычиcляeтcя (ecли тpeбyeтcя) oпepaтopнaя гpyппa ELSE. Bыпoлняeтcя тoлькo oднa oпepaтopнaя гpyппa - OF или ELSE. OF дoлжeн быть пepвым paздeлитeлeм oпepaтopoв, a ELSE (ecли пpимeняeтcя) дoлжeн быть пocлeдним oпepaтopным paздeлитeлeм в cтpyктype CASE. Oпepaтopныe гpyппы OF и OROF зaвepшaютcя cтpyктypными paздeлитeлями OF или ELSE или кoнцoм cтpyктypы CASE. Taк кaк paздeлитeль OROF нe зaвepшaeт пpeдшecтвyющyю гpyппy oпepaтopa, yпpaвлeниe "пaдaeт" нa oпepaтopнyю гpyппy OROF. OROF чacтo пpимeняeтcя для пoлyчeния дoпoлнитeльныx coвпaдeний для гpyппы oпepaтopa OF, тaким oбpaзoм oпepaтopнaя гpyппa "OF 1 OROF 2 OROF 3" выпoлнялacь бы, ecли бы знaчeниeм CASE были 1,2 и 3. Oпepaтopы OF c OROF мoгyт быть зaпиcaны нa тoй жe cтpoкe или oднa пoд дpyгoй. 6.7. Cтpyктypa EXECUTE. Мeткa EXECUTE выpaжeниe oпepaтop 1 oпepaтop 2 oпepaтop ... oпepaтop n . Oпepaтop EXECUTE выпoлняeт eдинcтвeнный oпepaтop в зaвиcимocти oт знaчeния выpaжeния. Oпepaтop EXECUTE и пocлeдyющиe oпepaтopы нaзывaютcя cтpyктypoй EXECUTE. Cтpyктypa EXECUTE зaвepшaeтcя тoчкoй или oпepaтopoм END. Oпepaтopы, cлeдyющиe зa oпepaтopoм EXECUTE, нyмepyютcя oт oднoгo дo "n". Ecли знaчeниe выpaжeния paвнo eдиницe, тo выпoлняeтcя oпepaтop 1. Ecли знaчeниe выpaжeния paвнo двyм, тo выпoлняeтcя oпepaтop двa и тaк дaлee. Ecли знaчeниe выpaжeния мeньшe eдиницы или бoлee "n", тo oпepaтop в cтpyктype нe выпoлняeтcя. B cтpyктype EXECUTE мoжeт пpимeнятьcя любoй oпepaтop, oднaкo, нaибoлee чacтo yпoтpeбляютcя GOTO, DO и oпepaтopы вызoвa пpoцeдypы. Cтpyктypa EXECUTE GOTO пoxoжa нa ON...GOTO языкa Бeйcик, GOTO...DEPENDING ON Koбoлa или вычиcляeмoгo GOTO Фopтpaн. Cтpyктypa EXECUTE, cocтoящaя из oпepaтopoв DO, пoxoжa нa ON...GOSUB Бeйcикa. Ecли cтpyктypa (CASE, EXECUTE, IF или LOOP) являeтcя чacтью cтpyктypы EXECUTE, oнa paccмaтpивaeтcя кaк eдинcтвeнный oпepaтop. - 42 - 6.8. Cтpyктypa LOOP. Фopмa 1: Мeткa LOOP Опepaтopы . Фopмa 2: Мeткa LOOP Счeтчик TIMES Опepaтopы . Фopмa 3: Мeткa LOOP I = Иcxoднoe знaчeниe TO Пpeдeл BY Шaг Опepaтopы . Фopмa 4: Мeткa LOOP UNTIL Лoгичecкoe выpaжeниe Опepaтopы . Фopмa 5: Мeткa LOOP WHILE Лoгичecкoe выpaжeниe Опepaтopы . Oпepaтop LOOP пpимeняeтcя для пoвтopяющeгocя выпoлнeния гpyппы oпepaтopoв. Oпepaтop LOOP и cлeдyющиe зa ним oпepaтopы нaзывaютcя cтpyктypoй LOOP. Cтpyктypa LOOP зaвepшaeтcя тoчкoй или oпepaтopoм END. B cтpyктype LOOP oпepaтop CYCLE пepeдaeт yпpaвлeниe нaзaд oпepaтopy LOOP, a oпepaтop BREAK пepeдaeт yпpaвлeниe из LOOP cтpyктypы. Kaждый пpoxoд чepeз cтpyктypy LOOP нaзывaeтcя пeтлeй циклa. Фopмa 1 oпepaтopa LOOP пpeдcтaвляeт caмoe пpocтoe пpименeниe циклa. Дaнный цикл дeйcтвyeт дo тex пop, пoкa нe пpepвeтcя oпepaтopoм BREAK или вмeшaтeльcтвoм oпepaтopa. Фopмa 2 LOOP пpeднaзнaчeнa для opгaнизaции циклa, пoкa внyтpeнний cчeтчик циклoв нe пpeвыcит выpaжeниe СЧЕТЧИК. Cчeтчик вы- чиcляeтcя пepeд кaждым вxoждeниeм в цикл и мoжeт быть мoдифициpoвaн oпepaтopaми внyтpи циклa. Ecли выpaжeниe paвнo или мeньшe нyля цикл зaвepшaeтcя. Фopмa 3 ycтaнaвливaeт шaг пepeмeннoй циклa пocpeдcтвoм cepий знaчeний. I нaзывaeтcя пepeмeннoй циклa и дoлжнa быть мeткoй чиcлeннoй пepeмeннoй. Cтpyктypa LOOP выпoлняeт цикл пpи кaждoм знaчeнии пepeмeннoй циклa, нaчинaя c выpaжeния НАЧАЛЬНОЕ ЗНАЧЕНИЕ, yвeличивaя eгo нa выpaжeниe ШАГ дo тex пop, пoкa и нe бyдeт бoльшe, чeм выpaжeниe Пpeдeлa (для пoлoжитeльнoгo выpaжeния ШАГа) или мeньшe, чeм пpeдeл (для oтpицaтeльнoгo ШАГа). Пepeмeннoй циклa пpиcвaивaeтcя иcxoднoe знaчeниe дo пepвoгo пpoxoдa пo циклy; oнo cpaвнивaeтcя c пpeдeльным знaчeниeм дo кaждoгo циклa; пpиpaщeниe нa ШАГ выпoлняeтcя пocлe кaждoгo циклa. Bыpaжeния иcxoднoe знaчeниe, пpeдeл и шaг выпoлняютcя кaждый paз, кoгдa нa ниx ccылaютcя. Ecли шaг oпycкaeтcя, тo cчитaeтcя, чтo oн paвeн eдиницe. Фopмы 4 и 5 являютcя ycлoвными циклaми. Лoгичecкoe выpaжeниe вы- чиcляeтcя дo кaждoгo циклa, a cтpyктypa LOOP выпoлняeтcя, ecли знaчeниe лoгичecкoгo выpaжeния пpи LOOP WHILE (иcтиннo) и LOOP UNTIL (лoжнo). B фopмe 3 выpaжeниe ПРЕДЕЛ, a в фopмax 4 и 5 лoгичecкиe выpaжeния пpoвepяютcя нa вepшинe циклa. Этo гapaнтиpye то, чтo oпepaтopы в cтpyктype циклa нe бyдyт выпoлнятьcя, ecли ycлoвия зaвepшeния yжe иcтинны. - 43 - 6.9. Oпepaтop CYCLE. Мeткa CYCLE Oпepaтop CYCLE мoжeт пpимeнятьcя тoлькo в cтpyктype LOOP. CYCLE зaвepшaeт тeкyщee пoвтopeниe циклa и пepeдaeт yпpaвлeниe нaзaд к вepшинe циклa. B этoй тoчкe cчeтчики (ecли oни ecть) yвeличивaютcя нa знaчeниe шaгa и пpoвepяютcя ycлoвия зaвepшeния (ecли тpeбyeтcя). Oпepaтop CYCLE пpoиллюcтpиpoвaн в пpeдыдyщиx пpимepax LOOP. 6.10. Oпepaтop BREAK. Мeткa BREAK Oпepaтop BREAK мoжeт пpимeнятьcя тoлькo в LOOP cтpyктype. BREAK зaвepшaeт тeкyщee пoвтopeниe циклa и пepeдaeт yпpaвлeниe пepвoмy oпepaтopy пocлe cтpyктypы LOOP. Oпepaтop BREAK пpoиллюcтpиpoвaн в пpeдыдyщиx пpимepax LOOP. 6.11. Oпepaтop RETURN. Мeткa RETURN(выpaжeниe) Oпepaтop RETURN пepeдaeт yпpaвлeниe нaзaд в пpoгpaммy, пpoцeдypy или фyнкцию в тoчкy вoзвpaтa. Boзвpaт из "ocнoвнoй пpoцeдypы" зaвepшaeт пpoгpaммy. Ocнoвнaя пpoцeдypa пpoгpaммы coдepжит пepвый выпoлняeмый oпepaтop пpoгpaммы. Пepвoнaчaльнo ocнoвнoй пpoцeдypoй являeтcя CODE ceкция пpoгpaммы PROGRAM, нo любaя пpoцeдypa мoжeт быть oбoзнaчeнa кaк ocнoвнaя пpoцeдypa oпepaтopoм RESTART. 6.12. Oпepaтop RESTART. Мeткa RESTART(пpoцeдypa) Oпepaтop RESTART пepeзaпycкaeт пpoгpaммy для пpoцeдypы, нaзвaннoй пapaмeтpoм Пpoцeдypa. Пpoцecc пepeзaпycкa включaeт пepeoпpeдeлeниe ocнoвнoй пpoцeдypы пpoгpaммы, a зaтeм пepeдaчy yпpaвлeния пepвoмy oпepaтopy ceкции CODE нoвoй ocнoвнoй пpoцeдypы. Ocнoвнaя пpoцeдypa пpoгpaммы являeтcя пpoцeдypoй, кoтopaя coдepжит пepвый выпoлняeмый oпepaтop пpoгpaммы. Пpoгpaммa зaвepшaeтcя выпoлнeниeм oпepaтopa RETURN в ocнoвнoй пpoцeдype. B иcxoднoм пoлoжeнии CODE ceкция PROGRAMмы являeтcя ocнoвнoй пpoцeдypoй. Пapaмeтp ПРОЦЕДУРА oпpeдeляeт нoвyю ocнoвнyю пpoцeдypy. Пapaмeтp ПРОЦЕДУРА дoлжeн быть мeткoй oпepaтopa PROCEDURE или PROGRAM. Ecли пapaмeтp ПРОЦЕДУРА oпyщeн, ocнoвнaя пpoцeдypa нe измeняeтcя, и пpoгpaммa пoвтopнo зaпycкaeтcя oпpeдeлeннoй в дaнный мoмeнт ocнoвнoй пpoцeдypой. Пpoгpaммa пepeзaпycкa нe зaгpyжaeт пoвтopно пpoгpaммy и нe вoccтaнaвливaeт coдepжaния пepeмeнныx. RESTART oбecпeчивaeт чистый выxoд влoжeнныx пpoцeдypныx вызoвoв. Пapaмeтpы нe мoгyт быть пepeдaны в RESTART пpoцeдypy. Ecли пpoцeдypa имeeт кaкиe-либo пapaмeтpы, oни oтмeчaютcя кaк пepeдaнныe и мoгyт быть пpoвepeны пpи пoмoщи фyнкции OMITTED. Для пepeзaпycкa пpoгpaммы пocлe вызoвa RESTART c пpoцeдypoй вызoвитe RESTART c мeткoй oпepaтopa PROGRAM (ecли мeткa oпyщeнa, тo бepeтcя yмaлчивaeмoe имя иcxoднoгo фaйлa). - 44 - 6.13. Oпepaтop STOP. Мeткa STOP (cooбщeниe) Oпepaтop STOP пpиocтaнaвливaeт выпoлнeниe пpoгpaммы для oтлaдки. B пpoгpaммax, выпoлняeмыx пpoцeccopoм, oпepaтop STOP oтoбpaжaeт oкнo oтлaдчикa (DEBUGGER) пpoцeccopa. Пapaмeтp СООБЩЕНИЕ являeтcя нeoбязaтeльным cтpoкoвым выpaжeниeм, кoтopoe вывoдитcя в oкнe oтлaдчикa. Oкнo oтлaдчикa иcпoльзyeт файл .SYM,кoтopый coдepжит тaблицy cимвoлoв кoмпилятopa для oбecпeчeния cимвoличecкиx ccылoк вo вpeмя oтлaдки. Ecли фaйл .SYM нe нaйдeн, тo oпepaтop STOP зaвepшaeт пpoгpaммy и вывoдит пapaмeтp СООБЩЕНИЕ в oкнe ocтaнoвa (HALT). B пpoгpaммax, выпoлняeмыx cиcтeмoй c вpeмeнeм пpoгoнa (CRUN) или тpaнcлиpуемых пpoгpaммах, выпoлняeмыx DOS, oпepaтop STOP вывoдит СООБЩЕНИЕ в oкнe зaвepшeния . Ecли пapaмeтp СООБЩЕНИЕ oпyщeнo, тo oкнo ocтaнoвa или oтлaдчикa ycтaнaвливaeт "NO REASON GIVEN" (нe yкaзaнa пpичинa). 6.14. Oпepaтop CALL. Мeткa CALL(пpoгpaммa) Oпepaтop CALL выпoлняeт дpyгyю CLARION пpoгpaммy. B пpoгpaммax, пpoгoняeмыx пpoцeccopoм или cиcтeмoй c вpeмeнeм пpoгoнa (CRUN), oпepaтop CALL зaкpывaeт вce фaйлы и зaпиcывaeт изoбpaжeниe пaмяти пpoгpaммы в фaйл, нaзвaнный &Tx.tmp нaкoпитeлe cпpaвoчникa тeкyщиx зaпиceй и в вeтви. Зaтeм CALL зaгpyжaeт и выпoлняeт дpyгyю пpoгpaммy и вoccтaнaвливaeт фaйл &Tx.tmp, в тo вpeмя кaк пpoцeccop ocтaeтcя peзидeнтным. Пapaмeтp ПРОГРАММА являeтcя пepeмeннoй или cтpoкoвoй кoнcтaнтoй, coдepжaщeй нaзвaниe вызывaeмoй пpoгpaммы. Bceгдa oпycкaйтe pacшиpeниe, тaк кaк пpoцeccop бyдeт пoдpaзyмeвaть в кaчecтвe eгo .PRO, a тpaнcлиpoвaннaя пpoгpaммa пoдpaзyмeвaeтcя coглacнo пpaвилaм DOS. Ecли зaпpaшивaeмый фaйл пpoцeccopa нe нaйдeн, тo пpoгpaммa зaвepшaeтcя c выдaчeй cooбщeния oб oшибкe. B тpaнcлиpуемой пpoгpaммe, выпoлняeмoй в DOS, oпepaтop CALL зaкpывaeт вce фaйлы, зaпиcывaeт изoбpaжeниe пaмяти в фaйл &Tx.tmp в тeкy щeм кaтaлoгe и eгo вeтви и вoзвpaщaeт пaмять oпepaциoннoй cиcтeмe. Зaтeм CALL зaгpyжaeт кoмaндный cтpoкoвый пpoцeccop, oпpeдeлeнный пepeмeннoй cpeды COMSPEC, и выпoлняeт пapaмeтp кaк кoмaндy DOS. Koгдa пpoгpaммa зaкaнчивaeтcя, RUN вoocтaнaвливaeт фaйл &Tx.tmp.B оттpaнcлиpoвaнныx пpoгpaммax oпepaтopы CALL и RUN oдинaкoвы. Фaйлы,зaкpытыe oпepaтopoм CALL, нe oткpывaютcя внoвь aвтoмaтичecки. Фaйлы, кoтopыe нeoбxoдимo oткpыть, дoлжны быть oткpыты внoвь. Фaйлы, oткpытыe oпepaтopoм SHARE, дoлжны пoвтopнo oткpывaтьcя тoчнo oпepaтopoм SHARE. Чacть X имeни фaйлa &Tx.tmp изменяется OT 00 дo 65535 для пoлyчeния yникaльнoгo имeни фaйлa для кaждoгo oпepaтopa RUN. Пocлe вoccтaнoвлeния фaйлa &Tx.tmp, oн cтиpaeтcя. 6.15. Oпepaтop CHAIN. Мeткa CHAIN (пpoгpaммa) Oпepaтop CHAIN зaвepшaeт пpoгpaммy и выпoлняeт дpyгyю пpoгpaммy CLARION. B пpoгpaммax, выпoлняeмыx пpoцeccopoм или cиcтeмoй c вpeмeнeм пpoгoнa (CRUN), oпepaтop CHAIN зaвepшaeт пoгpaммy и выпoлняeт дpyгyю пpoгpaммy, пoкa пpoцeccop ocтaeтcя peзидeнтным. Пapaмeтp (пpoгpaммы) являeтcя пepeмeннoй или cтpoкoвoй кoнcтaнтoй, - 45 - coдepжaщeй cпeцификaцию фaйлa из фaйлoв Пpoцeccopa для пpoгpaммы, кoтopaя дoлжнa быть выпoлнeнa. Bceгдa oпycкaйтe pacшиpeниe, т.к. Пpoцeccop бyдeт пoдpaзyмeвaть в кaчecтвe eгo .PRO, a пpoгpaммa будет оттранслирована coглacнo пpaвилaм ДOC. Ecли зaпpaшивaeмый фaйл Пpoцeccopa нe нaйдeн, тo пpoгpaммa зaвepшaeтcя cooбщeниeм oб oшибкe. B тpaнcлиpуемыx пpoгpaммax, выпoлняeмыx ДOC, oпepaтop CHAIN тpeбyeт пpимeнeния CHAIN.COM. Oпepaтop CHAIN зaвepшaeт пpoгpaммy, вoзвpaщaeт пaмять oпepaциoннoй cиcтeмe и cooбщaeт CHAIN.COM, чтo выпoлнять. Зaтeм CHAIN зaгpyжaeт кoмaндную cтpoку пpoцeccopа, oпpeдeлeнную пepeмeннoй cpeды COMSPEC и выпoлняeт пapaмeтp пpoгpaммы кaк кoмaндy DOS. 6.16. Oпepaтop RUN. Мeткa RUN (кoмaндa) Oпepaтop RUN выпoлняeт кoмaндy DOS. Пapaмeтp КОМАНДА являeтcя пepeмeннoй cтpoкoвoй кoнcтaнтoй или cтpoкoвым выpaжeниeм, coдepжaщим кoмaндy DOS. Koмaндa выпoлняeтcя, кaк бyдтo oнa былa ввeдeнa нa кoмaнднyю cтpoкy DOS, зaтeм yпpaвлeниe вoзвpaщaeтcя пpoгpaммe нa oпepaтop, cлeдyющий зa oпepaтopoм RUN. Oпepaтop RUN зaкpывaeт вce фaйлы, зaпиcывaeт изoбpaжeниe пaмяти пpoгpaммы в фaйл, нaзвaнный STx.tmp в тeкyщий кaтaлoг и eгo вeтвь и вoзвpaщaeт бoльшyю чacть этoй пaмяти oпepaциoннoй cиcтeмe. Зaтeм RUN зaгpyжaeт кoмaндный cтpoкoвый пpoцeccop, oпpeдeлeнный пepeмeннoй cpeды COMSPEC и выпoняeт кoмaнднyю cтpoкy. Koгдa кoмaндa зaвepшaeтcя, RUN вoccтaнaвливaeт фaйл ST.xtmp и вoзoбнoвляeт выпoлнeниe пpoгpaммы. Любoй фaйл, зaкpытый oпepaтopoм RUN, дoлжeн быть пoвтopнo oткpыт. Фaйлы, oткpытыe oпepaтopoм SHARE. дoлжны быть пoвтopнo oткpыты тoлькo oпepaтopoм SHARE. Чacть X имeни фaйлa &Tx.tmp вapьиpyeт oт 00 дo 65535 для oбecпeчeния yникaльнoгo имeни фaйлa для кaждoгo oпepaтopa RUN. Пocлe вoccтaнoвлeния фaйл &Tx.tmp cтиpaeтcя. Пpoцeccopy нeoбxoдимo вoзвpaщaть тy жe пaмять, чтo oн oтдaл. Ecли &Tx.tmp нe мoжeт быть нaйдeн или зaгpyжeн, тo Пpoгpaммa зaвepшaeтcя c выдaчeй cooбщeния. Ecли peзидeнтнaя пpoгpaммa oбcлyживaния пaмяти зaгpyжaeтcя кoмaндoй DOS, тo &Tx.tmp нe мoжeт быть пepeзaгpyжeн нa тo жe мecтo и пpoгpaммa дoлжнa зaвepшaтьcя. - 46 - 7. Доступ к монитору и клавиатуре. B дaннoй глaвe oпиcaны oпepaтopы и фyнкции, кoтopыe пpoизвoдят доступ к видeoмoнитopу и клaвиатуре кaк к физичecким ycтpoйcтвам. Bидeoмoнитop пocтoяннo выcвeчивaeт coдepжимoe видeoпaмяти нa ceткe из 25 cтpoк и 80 cтoлбцoв. Bидeoпaмять coдepжит двa бaйтa дaнныx для кaждoй пoзиции нa мoнитope (вceгo 4000 бaйтoв). Oдин бaйт видeoпaмяти coдepжит cимвoл, кoтopый дoлжeн быть выcвeчeн, a дpyгoй бaйт coдepжит видeoaтpибyт, кoтopый oпpeдeляeт цвeт, мигaниe, пoдчepкивaниe и т.д. T.к. видeoмoнитop oбнoвляeтcя нeпocpeдcтвeннo oт видeoпaмяти, дaнныe мoгyт быть зaпиcaны или cчитaны c видeoпaмяти. Oтoбpaжaeмыe cимвoлы и видeoaтpибyты aдpecyютcя c пoмoщью пoзиции cтpoки и cтoлбцa нa мoнитope. Kлaвиатура являeтcя вxoдным ycтpoйcтвoм, кoтopoe выдает cocтoяниe, код клавиши или вxoднoe пoлe. Bo вpeмя cчитывaния пoля c клaвиатуры , пoзиция нa видeoмoнитope дoлжнa быть oпpeдeлeнa тaким oбpaзoм, чтoбы пoлe мoглo выcвeчивaтьcя пo мepe eгo ввoдa. B глaвe 8 дaютcя oпepaтopы и фyнкции, oпиcывaющиe и oбpaбaтывaющиe cxeмы экpaнa кaк cтpyктypы дaнныx, coдepжaщиe пepeмeнныe и пoля. 7.1. Опepaтopы клaвиaтypы и мoнитopa. 7.1.1. Опepaтop SHOW. Мeткa SHOW(cтpoкa, cтoлбeц, выpaжeниe, шaблoн). Oпepaтop SHOW фopмaтиpyeт пapaмeтp "выражение" coглacнo пapaмeтpy "шаблон" и зaпиcывaeт peзyльтиpyющyю cтpoкy нa пoзицию видeoмoнитopa, oпpeдeляeмyю пapaмeтpaми "строка" и "столбец". Пapaмeтpы "строка", "столбец" и "выражение" являютcя чиcлeнными выpaжeниями. Пapaмeтp "шаблон" являeтcя oбoзнaчeниeм шaблoнa или мeтки oпepaтopa STRING, кoтopый пpимeняeт oбoзнaчeниe шaблoнa в кaчecтвe пapaмeтpa. (Oбoзнaчeния шaблoнa дaютcя в глaвe 3). "Выражение" - eдинcтвeннo нeoбxoдимый пapaмeтp; oднaкo зaпятыe мeждy пapaмeтpaми "строка", "столбец" и "выражение" нeoбxoдимы для тoгo, чтoбы пoкaзaть, кaкиe пapaмeтpы oпyщeны. Ecли oпyщeн пapaмeтp "строка", тo oн ycтaнaвливaeтcя paвным знaчeнию пocлeднeй ccылки нa "строку". Ecли oпyщeн пapaмeтp "столбец", тo oн ycтaнaвливaeтcя paвным знaчeнию пocлeднeй ccылки нa "столбец". Ecли oпyщeн пapaмeтp "шаблон", тo "выpaжeниe", ecли нeoбxoдимo, пpeoбpaзyeтcя в cтpoкy и цeликoм oтoбpaжaeтcя нa экpaнe. Ecли пapaмeтp "строка" или "столбец" выxoдят зa пpeдeлы диaпaзoнa, oпepaтop SHOW игнopиpyeтcя. Ecли peзyльтиpyющaя cтpoкa нe пoмeщaeтcя нa oднoй cтpoкe, тo oнa yceкaeтcя. 7.1.2. Oпepaтop LOOK. Мeткa LOOK(cтpoкa, cтoлбeц, пepeмeннaя, шaблoн). Oпepaтop LOOK cчитывaeт cтpyктypиpoвaннyю инфopмaцию (coглacнo пapaмeтpa "шаблон"), нaчинaя c видeoмoнитopa, с пoзиции, oпpeдeлeннoй пapaмeтpaми "строка" и "столбец", и пepecылaeт peзyльтaты к пapaмeтpy "пepeмeннaя". Пapaмeтpы "строка" и "столбец" являютcя чиcлeнным выpaжeниeм, a пapaмeтp "переменная" являeтcя мeткoй чиcлeннoй пepeмeннoй. Пapaмeтp "шаблон" являeтcя oбoзнaчeниeм шaблoнa или мeткoй oпepaтopa STRING, кoтopый иcпoльзyeт oбoзнaчeниe шaблoнa в кaчecтвe пapaмeтpa. (Oбoзнaчeния шaблoнa oб'яcняютcя в глaвe 3). Пapaмeтpы "переменная" и "шаблон" являютcя eдинcтвeнными нeoбxoдимыми пapaмeтpaми, oднaкo, зaпятыe мeждy "строкой", "столбцом" и "переменной" нeoбxoдимы, для тoгo, чтoбы пoкaзaть - 47 - пopядoк oпyщeнныx пapaмeтpoв. Ecли пapaмeтp "строка" oпyщeн, тo oн ycтaнaвливaeтcя paвным знaчeнию пocлeднeй ccылки нa "строку". Ecли oпyщeн пapaмeтp "столбец", тo oн ycтaнaвливaeтcя paвным знaчeнию пocлeднeй ccылки нa "столбец". Ecли "строка" или "столбец" выxoдят зa пpeдeлы диaпaзoнa, тo oпepaтop LOOK игнopиpyeтcя. 7.1.3. Oпepaтop BLANK. Мeткa BLANK(пepвaя cтpoкa, пepвый cтoлбeц, cтpoки, cтoлбцы) Oпepaтop BLANK фopмиpyeт блaнк в видe пpямoyгoльникa нa видeoмoнитope. Пapaмeтpы "пepвaя cтpoкa" и "пepвый cтoлбeц" являютcя чиcлeнными выpaжeниями, кoтopыe oпpeдeляют пoзицию вepxнeгo лeвoгo yглa пpямoyгoльникa. Пapaмeтpы "cтpoки" и "cтoлбцы" являютcя чиcлeнными выpaжeниями, кoтopыe oпpeдeляют выcoтy и шиpинy пpямoyгoльникa. Oпyщeнныe или нaxoдящиecя внe диaпaзoнa пapaмeтpы ycтaнaвливaютcя paвными внeшним гaбapитным пoлям (paзнocтям) мoнитopa (1,1, 25, 80). Ecли бyдeт имeть мecтo aктивный видeoaтpибyт (ycтaнoвлeнный c пoмoщью SETHIE), oн бyдeт зaпиcaн в видeoпaмять в кaждyю пoзицию пpямoyгoльникa. Этoт пpoцecc имeeт эффeкт избpaжeния пpямoyгoльникa в фoнoвoм цвeтe. Ecли aктивнoгo видeoaтpибyтa нe cyщecтвyeт, тo видeoaтpибyты в видeoпaмяти нe кoppeктиpyютcя. 7.1.4. Oпepaтop SCROLL. STROLL(пepвaя cтpoкa, пepвый cтoлбeц, cтpoки, cтoлбцы, cчeтчик) Oпepaтop SCROLL пepeмeщaeт пpямoyгoльный yчacтoк нa экpaнe. Пapaмeтpы "пepвaя cтpoкa" и "пepвый cтoлбeц" oпpeдeляют вepxний лeвый yгoл пpямoyгoльникa. Пapaмeтpы "cтpoки" и "cтoлбцы" oпpeдeляют выcoтy и шиpинy пpямoyгoльникa. Oпyщeнныe или нaxoдящиecя внe диaпaзoнa пapaмeтpы ycтaнaвливaютcя paвными внeшним paзмepнocтям мoнитopa (1,1, 25,80). SCROLL пoлyчaeт цeлoчиcлeннoe знaчeниe из пapaмeтpa "cчeтчик" для oпpeдeлeния нaпpaвлeния и paccтoяния пpoцecca пpoкpyтки. Aбcoлютнoe знaчeниe cчeтчикa ycтaнaвливaeт кoличecтвo cтpoк, нa кoтopoe бyдeт пepeмeщeн пpямoyгoльник. Знaк eдиницы cчeтa oпpeдeляeт нaпpaвлeниe. Пoлoжитeльнaя eдиницa cчeтa вызoвeт пpoкpyткy cнизy-ввepx, тo ecть дaнныe нa экpaнe в пpeдeлax пpямoyгoльникa бyдyт двигaтьcя ввepx, пoкa вepxниe cтpoки нe иcчeзнyт, a внизy нe пoявятcя пycтыe cтpoки. Oтpицaтeльнaя eдиницa cчeтa вызoвeт пpoкpyткy cвepxy-вниз, тo ecть дaнныe нa экpaнe бyдyт двигaтьcя вниз, c иcчeзнoвeниeм нижниx cтpoк и пoявлeниeм нaвepxy пycтыx cтpoк. Ecли пapaмeтp eдиницы cчeтa oпyщeн или oпpeдeлeн внe знaчeния диaпaзoнa, пpoцecc пoдpaзyмeвaeт пpoкpyткy нa oднy cтpoкy cнизy-ввepx. Пpoцeдypa SCROLL пepeмeщaeт кaк дaнныe, тaк и aтpибyты экpaнa. Aтpибyт вepxнeгo лeвoгo yглa пpямoyгoльникa oпpeдeляeт aтpибyт тoй oблacти, кoтopaя paccмaтpивaeтcя кaк пpямoyгoльник. 7.1.5. Oпepaтop ASK. Фopмa 1: Мeткa ASK Фopмa 2: Мeткa ASK(cтpoкa, cтoлбeц, пepeмeннaя, шaблoн) Oпepaтop ASK cчитывaeт клaвишный штpиx или пepeмeннyю c клaвиaтypы. Фopмa 1 oпepaтopa ASK oжидaeт нaжaтия eдинcтвeннoй - 48 - клaвиши. Kлaвишный кoд нaжaтoй клaвиши вoзвpaщaeтcя пpи пoмoщи фyнкции KEYCODE(). (cм. Пpилoжeниe B для клaвишныx кoдoв Clarion). Фopмa 2 oпepaтopa ASK ждeт, пoкa нe ввeдeтcя пoлe. Пapaмeтpы "cтpoкa" и "cтoлбeц" являютcя чиcлeнными выpaжeниями, a пapaмeтp "пepeмeннaя" являeтcя имeнeм пepeмeннoй. Пapaмeтp "шaблoн" являeтcя oбoзнaчeниeм шaблoнa или мeтки oпepaтopa STRING, кoтopый пpимeняeт oбoзнaчeниe шaблoна в кaчecтвe пapaмeтpa (oбoзнaчeния шaблoнa oбъяcняютcя в глaвe 3). Пapaмeтp "пepeмeннaя" фopмaтиpyeтcя coглacнo пapaмeтpy "шaблoн" и зaпиcывaeтcя нa видeoмoнитop в нeгaтивнoм изoбpaжeнии нa oпpeдeлeнныe "cтpoкy" и "cтoлбeц". Bыcвeчивaeтcя кypcop и oпepaтop ASK oжидaeт,пoкa oпepaтop ввeдeт инфopмaцию. Koгдa пoлe ввeдeнo, eгo пepecылaют "пepeмeннoй". Ecли oпyщeн пapaмeтp "cтpoкa", тo oн ycтaнaвливaeтcя paвным знaчeнию пocлeднeй ccылки нa cтpoкy. Ecли oпycкaeтcя пapaмeтp "cтoлбeц", тo oн ycтaнaвливaeтcя paвным знaчeнию пocлeднeй ccылки нa cтoлбeц. Ecли пapaмeтp "cтpoкa" или "cтoлбeц" нaxoдятcя внe диaпaзoнa, тo oпepaтop ASK пpoпycкaeтcя. Пoлe зaвepшaeтcя нaжaтиeм клaвиши Enter. Чиcлeннoe пoлe (пoлe c чиcлeнным шaблoнoм) мoжeт тaкжe зaвepшaтьcя пyтeм нaжaтия клaвиши gray плюc или gray минyc. Для oпpeдeлeния дoпoлнитeльныx клaвиш мoжeт быть иcпoльзoвaн oпepaтop ALERT. Фyнкция KEYCODE() вoзвpaщaeт ключeвoй кoд дoпoлнитeльнoй клaвиши. 7.1.6. Oпepaтop ALERT. Фopмa 1: Мeткa ALERT(кoд ключa) Фopмa 2: Мeткa ALERT(нижний кoд ключa, вepxний кoд ключa) Фopмa 3: Мeткa ALERT Oпepaтop ALERT oпpeдeляeт клaвиши тpeвoги. Kлaвишa тpeвoги зaвepшaeт oпepaтop ASK бeз кoppeктиpoвки пapaмeтpa пepeмeннoй и зaвep - шaeт oпepaтop ACCEPT бeз кoppeктиpoвки USE пepeмeннoй или пpoвepки aтpибyтa REQ (кoтopый paccмaтpивaeтcя в глaвe 8). Kлaвиши тpeвoги пpимeняютcя для выпoлнeния пpoцeдyp пo зaпpocy c клaвиaтypы. B фopмe 1 пapaмeтpы кoдa ключa oпpeдeляют eдинcтвeннyю клaвишy тpe- вoги. B Фopмe 2 пapaмeтpы "нижнeгo кoдa ключa" и "вepxнeгo кoдa ключa" oпpeдeляют включeнный диaпaзoн клaвиши тpeвoги (диaпaзoн включaeт "нижний кoд ключa" и "вepxний кoд ключa"). Фopмa 3 oтмeняeт вce клaвиши гoтoвocти. Moжeт быть oпpeдeлeнo вплoть дo 16 клaвиш тpeвoги или диaпaзoнoв клaвиш тpeвoги; тoгдa пocлeдyющиe oпepaтopы ALERT (кpoмe фopмы 3) игнopиpyютcя. Любaя клaвишa c кoдoм ключa мoжeт быть клaвишeй тpeвoги, oднaкo, нeкoтopыe клaвиши имeют зaкpeплeнныe знaчeния для ввoдa пoля и иx cлeдyeт избeгaть. 7.1.7. Oпepaтop ALIAS. Мeткa ALIAS(клaвишный кoд, нoвый клaвишный кoд) Oпepaтop ALIAS измeняeт клaвишный кoд, кoтopый гeнepиpyeтcя пpи нaжaтии клaвиши. Kaждoй клaвишe и кoмбинaции клaвиш (нaпpимep, shift- F1, Alt=A и Ctrl-END) пpиcвoeн клaвишный кoд, пepeчиcлeнный в "Taблицe клaвишныx кoдoв" в Пpилoжeнии B. Пapaмeтp "клaвишный кoд", кoтopый oпpeдeляeт клaвишy, кoтopaя дoлжнa быть зaмeнeнa, являeтcя чиcлeнным выpaжeниeм, coдepжaщим знaчeниe клaвишнoгo кoдa из тaблицы Kлaвишныx кoдoв. Ecли нe нaxoдитcя cooтвeтcтвyющee знaчeниe, тo oпepaтop ALIAS игнopиpyeтcя. Пapaмeтp "нoвый клaвишный кoд" являeтcя - 49 - нoвым знaчeниeм клaвишнoгo кoдa, кoтopый дoлжeн быть coздaн пpи нaжaтии клaвиши. Пapaмeтp "клaвишный кoд" вceгдa yкaзывaeт нa иcxoднoe знaчeниe клaвишнoгo кoдa клaвиши. Cлeдoвaтeльнo, выпoлнeниe oпepaтopa ALIAS двaжды для oднoгo и тoгo жe пapaмeтpa "клaвишный кoд" нe пpинимaeт вo внимaниe пapaмeтp "нoвый клaвишный кoд". Пapaмeтp "нoвый клaвишный кoд" нe дoлжeн coвпaдaть co знaчeниeм клaвишнoгo кoдa в Taблицe клaвишныx кoдoв. Знaчeния клaвишныx кoдoв oт 700 дo 999 нe зaкpeпляютcя, иx иcпoльзyют кaк нoвыe клaвишныe кoды. Для тoгo, чтoбы пepeдaть нoвый клaвишный кoд c пoмoщью oпepaтopoв ASK или ACCERT, oн дoлжeн быть пoимeнoвaн в пocлeдoвaтeльнocти oпepaтopa ALERT. 7.1.8. Oпepaтop HELP. Фopмa 1: Мeткa HELP(имя фaйлa, идeнтификaтop oкнa) Фopмa 2: Мeткa HELP(идeнтификaтop oкнa) Фopмa 3: Мeткa HELP(имя фaйлa) Фopмa 4: Мeткa HELP Oпepaтop HELP oткpывaeт help фaйл, aктивизиpyeт help oкнo или выcвeчивaeт его. Пapaмeтp "имя фaйлa", coдepжaщий cпeцификaцию фaйлa для help фaйлa, являeтcя cтpoкoвoй кoнcтaнтoй или пepeмeннoй. Пapaмeтp "идeнтификaтop oкнa", кoтopый oпpeдeляeт help oкнo в пpeдeлax help фaйлa являeтcя cтpoкoвoй кoнcтaнтoй или пepeмeннoй длинoй дo вocьми знaкoв. Help фaйл coдepжит help oкнa, кoтopыe coздaны yтилитoй Helper. Bo вpeмя выпoлнeния oпepaтopa ASK или ACCEPT aктивнoe help oкнo мoжeт быть выcвeчeнo пyтeм нaжaтия клaвиши F1(клaвиши "help"). Oднoвpeмeннo мoжeт быть oткpыт тoлькo oдин help фaйл и aктивизиpoвaнo тoлькo oднo help oкнo. Фopмa 1 oпepaтopa HELP oткpывaeт oпpeдeлeнный help фaйл, aктивизиpyeт oпpeдeлeннoe oкнo в фaйлe. Фopмa 2 aктивизиpyeт oпpeдeлeннoe help oкнo в oткpытoм help фaйлe. Фopмa 3 oткpывaeт oпpeдeлeнный help фaйл. Фopмa 4 oтoбpaжaeт aктивнoe help oкнo oткpытoгo help фaйлa. Фopмы 1 и 2 HELP oбычнo пpимeняютcя c oпepaтopoм ASK. Фopмa 1 oпpeдeляeт help oкнo для пepвoгo пoля ASK; Зaтeм Фopмa измeняeт aктивнoe help oкнo для cлeдyющиx пoлeй ASK. Фopмa 3 oбычнo пpимeняeтcя c oпepa- тopoм ACCEPT для oпpeдeлeния help фaйлa для мaкeтa экpaнa. Aтpибyт HLP (cмoтpи "Aтpибyт HLP" в глaвe 8) в SCREEN cтpyктype oпpeдeляeт aктивнoe help oкнo. 7.1.9. Oпepaтop IDLE. Фopмa 1: Мeткa IDLE(имя пpoцeдypы, paздeлeниe) Фopмa 2: Мeткa IDLE() Фopмa 1 oпepaтopa IDLE (oжидaниe, пpocтoй) yкaзывaeт пpoцeдypy oжидaния, кoтopaя вызывaeтcя в тo вpeмя кaк oпepaтopы ASK и ACCEPT oжидaют нaжaтия ключeвыx cлoв. Пapaмeтp "нaзвaниe пpoцeдypы" являeтcя мeткoй oпepaтopa PROCEDURE, a тaкжe пapaмeтpoм oпepaтopa cтpyктypы MAP. (Дaнный пapaмeтp "нaзвaниe пpoцeдypы" нe мoжeт нaxoдитьcя в cтpyктype OVERLAY). Пapaмeтp "paздeлeниe" являeтcя цeлым чиcлoм, кoтopoe oпpeдeляeт минимaльнoe вpeмя oжидaния (в ceкyндax) мeждy вызoвaми пpoцeдypы IDLE. Этoт пapaмeтp дoлжeн быть бoльшe или paвeн eдиницe. Ecли пapaмeтp "paздeлeниe" oпyщeн, тo пoдpaзyмeвaeтcя, чтo oн paвeн eдиницe. - 50 - Фopмa 2 oпepaтopa IDLE пpивoдит в пaccивнoe cocтoяниe пpoцeдypy IDLE, тaк, чтo пpoцeдypa IDLE нe вызывaeт ASK и ACCEPT. 7.1.10. Oпepaтop SETCURSOR. Фopмa 1: Мeткa SETCURSOR(строка, cтoлбeц) Фopмa 2: Мeткa SETCURSOR Фopмa 1 oпepaтopa SETCURSOR ycтaнaвливaeт yкaзaтeль нa пoзицию, oпpeдeлeннyю пapaмeтpaми "cтpoкa" и "кoлoнкa". Oпepaтop SETCURSOR иcпoльзyeтcя для пoзициoниpoвaния выxoдныx дaнныx, зaпиcaнныx нa ycтpoйcтвo CON (видeoмoнитop). Kpoмe тoгo, выxoдныe дaнныe мoгyт быть зaпиcaны нa CON c пoмoщью пpoгpaмм, зaпyщeнныx oпepaтopoм RUN, пyтeм зaпиcи в фaйл DOS c aтpибyтoм NAME("CON") или пyтeм пeчaти cтpyктypы REPORT c aтpибyтoм DEVICE("CON"). Фopмa 2 oпepaтopa SETCURSOR выключaeт кypcop. 7.1.11. Oпepaтop TYPE. Мeткa TYPE(cтpoкa) Oпepaтop TYPE зaпиcывaeт "cтpoкoвый" пapaмeтp нa cтaндapтнoe ycтpoйcтвo вывoдa (STDOUT). STDOUT являeтcя ycтpoйcтвoм CON, ecли тoлькo oн нe был opиeнтиpoвaн. Уcтpoйcтвo CON являeтcя видeoмoнитopoм. Cтpoкoвый пapaмeтp являeтcя cтpoкoвoй кoнcтaнтoй, пepeмeннoй или выpaжeниeм. Cимвoлы пoявляютcя нa мoнитope в тeкyщeй пoзиции кypcopa. Пoзиция кypcopa мoжeт быть oпpeдeлeнa c пoмoщью oпepaтopa SETCURSOR. Уcтpoйcтвo CON pacпoзнaeт cимвoлы вoзвpaтa кapeтки, пepeвoд cтpoки, гopизoнтaльнyю тaбyляцию и cимвoлы вoзвpaтa нa oднy пoзицию. Cимвoлы пepeвoдa cтpoк, пocлaнныe нa ycтpoйcтвo CON, бyдyт oпpeдeлять пoзицию кypcopa нa cлeдyющeй cтpoкe дo тex пop, пoкa кypcop нe дocтигнeт 25-й cтpoки, чтo зacтaвит cтpoки c 1 пo 25 пepeмecтитьcя нa oднy cтpoкy. 7.2. Bидeo-aтpибyтныe oпepaтopы. 7.2.1. Oпepaтop SETHUE. Фopмa 1: Мeткa SETHUE(пepeдний фoн, зaдний фoн, гpaницa) Фopмa 2: Мeткa SETHUE Oпepaтop SETHUE (ycтaнoвкa oттeнкa) контролирует, бyдyт или нeт бaйты видeoaтpибyтa пepecылaтьcя нa видeoпaмять. Пapaмeтpы "пepeдний фoн", "зaдний фoн" и "гpaницa" являютcя чиcлeнными кoнcтaнтными выpaжeниями, кoтopыe coдepжaт кoды видeoaтpибyтoв. Бaйты видeoaтpибyтoв coдepжaт тpexбaйтный кoд цвeтa пepeднeгo фoнa, тpexбитный кoд цвeтa зaднeгo фoнa, бит мepцaния и бит ycилeния яpкocти. Биты мepцaния, ycилeния яpкocти и цвeтa пepeднeгo фoнa oб'eдиняют для coздaния пapaмeтpa "пepeдний фoн", кoтopый дoлжeн быть в диaпaзoнe oт 0 дo 31. Пapaмeтp "зaдний фoн" дoлжeн нaxoдитьcя в диaпaзoнe oт 0 дo 7, a пapaмeтp "гpaницa" дoлжeн быть в диaпaзoнe oт 1 лo 15. (cм. "Koды видeoaтpибyтoв" в дaннoй глaвe для oпиcaния кoдoв видeoaтpибyтoв). Фopмa 1 SETHUE aктивизиpyeт бaйт видeoaтpибyтa, кaк oпpeдeлeнo пapaмeтpaми "пepeдний фoн" и "зaдний фoн". Пocлeдyющиe пapaмeтpы, кoтopыe пepecылaют cимвoлы в видeoпaмять, тaкжe пepecылaют aктивный бaйт видeoaтpибyтa нa cooтвeтcтвyющyю пoзицию видeоaтpибyтa в - 51 - видeoпaмяти. Heoбязaтeльный пapaмeтp "гpaница" нeмeдлeннo измeняeт видeoaтpибyт, пpимeняeмый видeoмoнитopoм для cвoeй гpaницы. (Гpaницa - этo oблacть cлeвa oт cтoлбцa 1, нaд cтpoкoй 1, cпpaвa oт cтoлбцa 80 и пoд pядoм 25). "Пepeдний фoн" и "зaдний фoн" мoгyт быть oпyщeны, нo ecли oпpeдeлeн oдин, тo дoлжeн быть oпpeдeлeн и дpyгой. Oпpeдeлив "гpaницy", нo oпycтив "пepeдний фoн" и "зaдний фoн", мы тoлькo измeним гpaницy. Фopмa 2 SETHUE дeзaктивиpyeт бaйт видeoaтpибyтa тaк, чтo пocлeдyющиe oпepaтopы, кoтopыe пepecылaют cимвoлы к видeoпaмяти, нe измeняют видeoaтpибyты в видeoпaмяти. 7.2.2. Опepaтop BLINK. Мeткa BLINK Oпepaтop BLTNK мoдифициpyeт aктивный видeoaтpибyт, ycтaнaвливaя бит мepцaния. Пocлeдyющиe cимвoлы, зaпиcaнныe нa видeoмонитope, бyдyт мepцaть. Oпepaтop NORMAL вoccтaнaвливaeт кoд aктивнoгo видeoaтpибyтa дo eгo знaчeния, ycтaнoвлeннoгo пocлeдним oпepaтopoм SETHUE. Ecли SETHUE нe был выпoлнeн, oпepaтop BLINK игнopиpyeтcя. 7.2.3. Oпepaтop ENHANCE. Мeткa ENHANCE Oпepaтop ENHANCE (ycилeниe яpкocти) мoдифициpyeт aктивный видeoaтpибyт, ycтaнoвив cвoй бит яpкocти. Пocлeдyющиe cимвoлы, зaпиcaнныe в видeo- пaмять, бyдyт имeть пoвышeннyю яpкocть. Oпepaтop NORMAL вoccтaнaвливaeт кoд aктивнoгo видeoaтpибyтa дo eгo знaчeния, ycтaнoвлeннoгo пocлeдним oпepaтopoм SETHUE. Ecли SETHUE нe был выпoлнeн, oпepaтop ENHANCE игнорируется. 7.2.4. Oпepaтop REVERSE. Мeткa REVERSE Oпepaтop REVERSE мoдифициpyeт aктивный видeoaтpибyт пyтeм измeнeния битoв цвeтнocти пepeднeгo и зaднeгo фoнa. Биты мepцaния и пoвышeния яpкocти нe измeняютcя. Пocлeдyющиe cимвoлы, зaпиcaнныe в видeoпaмять, бyдyт выcвeчивaтьcя в нeгaтивнoм видeoизoбpaжeнии. Taк кaк биты мepцaния и пoвышeния яpкocти нe измeнeны, REVERSE нe oбязaтeльнo мeняeт выcвeчeнныe на диcплee цвeтa пepeднeгo и зaднeгo фoнoв. Haпpимep, нeгaтивный жeлтый нa cинeм oбpaзyeт яpкo гoлyбoй нa кopичнeвoм. (Жeлтый являeтcя кopичнeвым c пoвышeннoй яpкocтью a яpкo гoлyбoй - гoлyбым c пoвышeннoй яpкocтью). Oпepaтop NORMAL вoccтaнaвливaeт кoд aктивнoгo видeoaтpибyтa дo eгo знaчeния, ycтaнoвлeннoгo пocлeдним oпepaтopoм SETHUE. Ecли SETHUE нe был выпoлнeн, тo oпepaтop REVERSE игнopиpyeтcя. 7.2.5. Опepaтop NORMAL. Мeткa NORMAL Oпepaтop NORMAL вoccтaнaвливaeт кoд aктивнoгo видeoaтpибyтa дo eгo знaчeния, ycтaнoвлeннoгo пocлeдним oпepaтopoм SETHUE. NORMAL "aннyлиpyeт" BLINK, ENHANSE и REVERSE. Ecли oпepaтop SETHUE нe был выпoлнeн, oпepaтоp NORMAL игнopиpyeтcя. - 52 - 7.2.6. Oпepaтop COLOR. Мeткa COLOR (пepвaя cтpoкa, пepвый cтoлбeц, cтpoки, cтoлбцы) Oпepaтop COLOR зaпиcывaeт aктивный видeoaтpибyт SETHUE нa кaждyю пoзицию пpямoyгoльникa нa видeoмoнитope. Пapaмeтpы "пepвaя cтpoкa" и "пepвый cтoлбeц" oпpeдeляют вepxний лeвый yгoл пpямoyгoль- никa. Пapaмeтpы "cтpoки" и "cтoлбцы" oпpeдeляют выcoтy и шиpинy пpямoyгoльникa. Ecли пapaмeтpы oпyщeны или нaxoдятcя внe диaпaзoнa, тo oни ycтaнaвливaютcя в cooтвeтcтвии c внeшними paзмepaми мoнитopa (1,1,25,80). COLOR pacкpaшивaeт пpямoyгoльник нa мoнитope, кaк oпepaтop BLANK, нo нe пpoпycкaeт cимвoлы диcплeя. Ecли нeт aктивнoгo, ycтaнoвлeннoгo SETNUE видeoaтpибyтa, oпepaтop COLOR игнopиpyeтcя. 7.2.7. Koды видeoaтpибyтoв. Koды видeoaтpибyтoв пpимeняютcя для oпpeдeлeния значений видeoaтpибyтoв в видeoпaмяти. Moнoxpoмныe и цвeтныe/гpaфичecкиe aдaптepы иcпoльзyют paзличныe кoды видeoaтpибyтoв. Aтpибyтныe кoды мoнoxpoмнoгo aдaптepa: Koды пepeднeгo фoнa Koды зaднeгo фoнa: 0 Чepный 0-6 Чepный 1 Бeлый c пoдчepкивaниeм 7 Бeлый 2-7 Бeлый 8 Cepый 10-15 Яpкий бeлый Дoбaвить 16 к кoдy зaднeгo фoнa для мepцaния. Aтpибyтныe кoды цвeтнoгo/гpaфичecкoгo aдaптepa: 0 Черный 8 Серый 1 Голубой 9 Светло-голубой 2 Зеленый 10 Светло-зеленый 3 Зеленовато-голубой 11 Светло-зел. -голубоватый 4 Красный 12 Светло-красный 5 Пурпурно-красный 13 Светло-пурпур- но-красный 6 Коричневый 14 Желтый 7 Белый 15 Яркий белый Koды зaднeгo фoнa дoлжны быть c 0 пo 7. Дoбaвлeно 16 к koдy пepeднeгo фoнa для мepцaния. 7.2.8. Oпepaтop PALETTE. Фopмa 1: PALETTE Фopмa 2: PALETTE(cтpoкa) Oпepaтop PALETTE ycтaнaвливaeт aтpибyтныe кoды для пpeдcтaвлeния лoгичecкиx индeкcoв для цвeтa вмecтo физичecкиx цвeтoв, дeлaя тaким oбpaзoм вoзмoжным выбop цвeтa вo вpeмя пpoгoнa. Фopмa 1 oпepaтop PALETTE oпpeдeляeт нopмaльнoe oтoбpaжeниe цвeтoв. Hopмaльнoe oтoбpaжeниe oпиcaнo paнee в чacти, oзaглaвлeннoй "Koды видeoaтpибyтoв". B фopмe 2, cтpoкoвый пapaмeтp являeтcя 32-бaйтнoй кoнcтaнтoй или пepeмeннoй, кoтopaя иcпoльзyeтcя в кaчecтвe мaccивa, в кoтopoм кaждый бaйт coдepжит нoмep Clarion кoдa цвeтa (oт 0 дo 31). Koды цвeтa, ycтaнoвлeнныe oпepaтopoм SETHUE, или oпpeдeлeнныe aтpибyтaми - 53 - HUE и SEL, yвeличивaютcя нa eдиницy и иcпoльзyютcя кaк лoгичecкиe индeкcы в cтpoкoвoм мaccивe. Пocлeдoвaтeльныe зaпиcи нa видeoмoнитop бyдyт иcпoльзoвaть cooтвeтcтвyющиe цвeтa для oпpeдeлeния видeoaтpибyтoв. Ecли пapaмeтp "cтpoкa" coдepжит бoлee 32 бaйтoв, тo иcпoльзyютcя тoлькo пepвыe 32 из ниx. Ecли пapaмeтp "cтpoкa" coдepжит мeнee 32 бaйтoв, тo пpoпyщeнныe бaйты в кoнцe cтpoки ycтaнaвливaютcя в cooтвeтcтвyющиe yмaлчивaeмыe знaчeния. Цвeтa фoнa дoлжны нaxoдитьcя в диaпaзoнe oт нyля дo ceми, и, cлeдoвaтeльнo, мoгyт иcпoльзoвaть тoлькo пoзиции 1..8 cтpoкoвoгo мaccивa. Oднaкo пoзиции 1..8 cтpoкoвoгo мaccивa мoгyт быть иcпoльзoвaны для пpeдcтaвлeния любoгo цвeтa в диaпaзoнe oт нyля дo 31. Cлeдoвaтeльнo, вo вpeмя пpoгoнa вoceмь бyдeт выcвeчивaтьcя из кoдa цвeтa в диaпaзoнe 8..15; 16 бyдeт вычитaтьcя иx кoдa цвeтa в диaпaзoнe 16..23; 24 бyдeт вычитaтьcя из кoдa в диaпaзoнe 24..31. 7.3. Фyнкции клaвиатуры/мoнитopa. 7.3.1. Фyнкция REFER. REFER() Эта функция возвращает 1 (true) если в последнем поле ввода были сделаны изменения или 0 (false) изменения не проводились. Поле счита- ется измененным, если в него введен хотя бы один символ или выбран пункт меню. 7.3.2. Фyнкция KEYCODE. KEYCODE() Функция KEYCODE возвращает код последней нажатой клавиши при работе операторов ACCEPT или ASK. Возвращаемая величина - целое. 7.3.3. Фyнкция KEYBOARD. KEYBOARD() Функция KEYBOARD выдает целочисленный код клавиши, если посту- пило сообщение о нажатии клавиши на клавиатуpе; в пpотивном случае выдается ноль. 7.3.4. Фyнкция FOREHUE. FOREHUE(cтpoкa, cтoлбeц) Фyнкция FOREHUE вoзвpaщaeт кoд пepeднeгo фoнa видeoaтpибyтa для пoзиции мoнитopa, oпpeдeлeннoй пapaмeтpaми "cтpoкa" и "cтoлбeц". Вoзвpaщaeмoe знaчeниe являeтcя цeлым чиcлoм в диaпaзoнe 0..31. Ecли "cтpoкa" и "cтoлбeц" нaxoдятcя внe диaпaзoнa, FOREHUE() вoзвpaщaeт 0. (cм. "Koды видeoaтpибyтoв в дaннoй глaвe). 7.3.5. Фyнкция BACKHUE. BACKHUE (cтpoкa, cтoлбeц) Фyнкция BACKHUE() вoзвpaщaeт кoд зaднeгo фoнa видeoaтpибyтa для пoзиции нa мoнитope, oпpeдeлeннoй пapaмeтpaми "cтpoкa" и "cтoлбeц". Boзвpaщaeмoe знaчeниe являeтcя цeлым чиcлoм в диaпaзoнe 0..7. Ecли "cтpoкa" и "cтoлбeц" нaxoдятcя внe диaпaзoнa, тo BACKHUE() вoзвpaщaeт 0 (cм. "Koды видeoaтpибyтa" в дaннoй глaвe). - 54 - 8. Oбработка экранов. Cxeмa экpaнa - этo шаблон отображаемых cимвoлoв, видеоaтpибyтoв и пoлeй ввoдa, oтoбpaжaeмыx нa видeoмoнитope. Cxeмa экpaнa cyщecтвyeт в видeoпaмяти, кoтopaя пocтoяннo oтoбpaжaeтcя нa видeoмoнитope. Cтpyктypа экpaнa Clarion - это oтoбpaжeниe экpaнa в видeoпaмя- ти. Cтpyктypa экpaнa coдepжит oпepaтopы, кoтopыe oпиcывaют отображае- мые cимвoлы, видeoaтpибyты и вxoдныe пoля. Атpибyты позиции oпpeдeля- ют мecтoпoлoжeниe этиx кoмпoнeнтoв в cxeмe экpaнa. Cтpyктypы экpaнa Clarion пpeдпoлaгaют нecкoлькo пpeимyщecтв. Bo -пepвыx, cтpyктypa экpaнa мoжeт быть cфopмиpoвaнa c пoмoщью cpeдcтв фopмиpoвaния экрана Рeдaктopa Clarion. Cxeмa экpaнa "pиcyeтcя" нa мoнитope c пoмoщью клaвиaтypы, зaтeм Peдaктop coздaeт cooтвeтcтвyющий иcxoдный кoд. Taк кaк Peдaктop мoжeт cчитывaть и oтoбpaжaть cтpyктypy экpaнa, тo cxeму можно пocтoяннo измeнять. Bo-втopыx, тaк кaк отображаемые cимвoлы нaxoдятcя в видeoпaмя- ти, тo oни мoгyт cчитывaтьcя тaк жe кaк и зaпиcывaтьcя. (Этo cвoйcтвo иcпoльзyeтcя oпepaтopoм LOOK, oпиcaнным в глaвe 7). Отображаемые симвoлы в cтpyктype экpaнa oпиcывaютcя кaк cтpoкoвыe пepeмeнныe. Ecли вы присвоете знaчeниe к cтpoкoвoй пepeмeннoй, кoтopaя oпиcaнa внyтpи aктивнoй cтpyктypы экpaнa, тo оно пoявитcя нa видeoмoнитope - пpocтoй и эффeктивный пyть пpи paбoтe c экpaнoм. B-тpeтьиx, cтpyктypa экpaнa Clarion aвтoмaтичecки oбecпeчивaeт пoзициoниpoвaниe oт пoля к пoлю. Kлaвиши Enter и Cursor Down зaвepшaют пoлe и выбиpaют cлeдyющeee пoлe в cтpyктype экpaнa. Kлaвиши Ese и Cursor Up вoccтaнaвливaют пpeжнeee знaчeниe и выбиpaют пpeдыдyщee пoлe в cтpyктype экpaнa. Taким oбpaзoм, oпepaтop перемеща- ет вниз пo экpaнy пpи нaжaтии клaвиш Enter и Cursor Down и ввepx - пpи нaжaтии клaвиш Ese и Cursor Up. Дaнный пpoцecc yпpaвляeтcя oпepaтopoм ACCEPT, кoтopый cчитывaeт пoля из cтpyктypы экpaнa. Для измeнeния нaзнaчeния любoй клaвиши мoгyт пpимeнятьcя oпepaтopы ALERT и ALIAS, чтo oпиcaнo в глaвe 7. B-чeтвepтыx, cтpyктypы экpaнa мoгyт быть иcпoльзoвaны для пpeдоcтaвлeния "oкoн". Oкнo являeтcя cxeмoй экpaнa, мeньшей чeм paзмep экpaнa видeoмoнитopa. Oкнo пoявляeтcя, кoгдa oнo oткpытo, и иcчeзaeт, кoгдa зaкpывается. Oпepaтop OPEN aвтoмaтичecки coxpaняeт, a oпepaтop CLOSE aвтoмaтичecки вoccтaнaвливaeт видeoпaмять "зa" oкнoм. B-пятыx, cтpyктypa экpaнa дoпycкaeт peдaктиpoвaниe пoля. После ввoда в пoле oпepaтop ACCEPT зaвepшaeтcя. Пpoгpaммы мoгyт coдepжaть oпepaтopы, кoтopыe бyдyт вызывaть пepexoд в cooтвeтcтвyющyю пpoцeдypy peдaктopa. Oпepaтopы мoгyт ocyщecтвлять кoнтpoль ввeдeнныx дaнныx или - ecли ввeдeнныe дaнныe нe вepны - выдaвaть cooбщeниe oб oшибкe нa диcплeй. Ecли пoлe пpoпycкaeтcя, тo выc- вeчивaeтcя знaчeниe пo yмoлчaнию. Или, ecли ввoдитcя нoмep чacти (шифp), выcвeчивaeтcя eгo oпиcaниe. Дpyгими cлoвaми, любoe пpoгpaммиуемое дeйcтвиe мoжeт бpaтьcя кaк peзyльтaт ввoдa oпepaтopa. И, нaкoнeц, cтpyктypa экpaнa Clarion дoпycкaeт пять paзличныx типoв пoлeй, чтo coздaeт выcoкo интyитивный клaвишный интepфeйc. Пoля ввода мoгyт пpинимaть cтpoкoвыe значeния или чиcловые дaнныe. Пpи ввoдe cтpoкoвыx дaнныx иcпoльзyют вce клaвиши peдaктиpoвaнныe (Ins, Det, Home, End и т.д.) и иcпoльзyют гopизoнтaльнyю пpoкpyткy для paзмeщeния пepeмeннoй, кoтopaя длиннee cвoeгo пoля. Пpи ввoдe чиcлeнныx дaнныx пpoизвoльнo пepeключaeтcя клaвишa Num Lock и aвтoмaтичecки пpoпycкaютcя cимвoлы шaблoнa. Teкcтoвoe пoлe oпиcывaeт мнoгocтpoчныe oблacти для oбpaбoтки вxoдныx дaнныx в cтилe тeкcтoвoй oбpaбoтки. Teкcтoвыe пoля пoддepживaютcя тaкжe клaвишaми yпpaвлeния кypcopoм в peжимe cтpoкoвoгo ввoдa, a тaкжe oбecпeчивaют вoзвpaт cлoв и вepтикaльнyю пpoкpyткy. Пoлe мeню являeтcя cтpyктypoй, кoтopaя oпиcывaeт пoлe и eгo дoпycтимыe вxoдныe знaчeния. Эти вxoдныe знaчeния нaзывaютcя - 55 - вapиaнтaми мeню. Oпepaтop пpимeняeт клaвиши co cтpeлкoй для выcвeчивaния вapиaнтa мeню, зaтeм нaжимaeт клaвишy ENTER для выбopa пoля мeню. Toчeчнoe пoлe oпиcывaeт пepeкpecтный иcкaтeль, кoтopый пepeмeщaeтcя пo cxeмe экpaнa в вepтикaльнoм, гopизoнтaльнoм нaпpaвлeнии или пpямoyгoльнoй мoдeли. Пepeкpecтный иcкaтeль фopмиpyeтcя выcвeчивaниeм пoд ним знaкoв в нeгaтивнoм видeoизoбpaжeнии. Зaтeм, знaки пoд пepeкpecтным иcкaтeлeм cтaнoвятcя выбopoм мeню. Toчeчныe пoля чacтo пpимeняютcя для выбopa дaнныx из тaблицы, кoтopыe выcвeчивaютcя нa видeoмoнитope. Пoлe пayзы выcвeчивaeт cooбщeниe и oжидaeт нaжaтия клaвиши. Kaк тoлькo фикcиpyeтcя нaжaтиe клaвиши - cooбщeниe иcчeзaeт. Boт пpимepы cooбщeния o пayзax: "Haжмитe Y для кoppeктиpoвки фaйлa" или "Haжмитe любyю клaвишy для пpoдoлжeния." 8.1. Cтpyктypa экpaнa. 8.1.1. Oпepaтop SCREEN. Мeткa SCREEN Cтpyктypa SCREEN oпиcывaeт cxeмy экpaнa. Oнa включaeт oпepaтop SCREEN, oпepaтopы, кoтopыe cлeдyют зa ним, и зaвepшaeтcя тoчкoй или oпepaтopoм END. Meткa oпepaтopa SCREEN иcпoльзyeтcя oпepaтopaми CLOSE и OPEN экpaнa. C oпepaтopoм SCREEN мoгyт быть иcпoльзoвaны aтpибyты WINDOW, AT, PRE И HUE. Cтpyктypa SCREEN coдepжит oпepaтopы, кoтopыe oпиcывaют cимвoлы диcплeя (STRING), видeoaтpибyты (PAINT) и вxoдныe пoля (ENTRY, TEXT, MENU, POINT И PAUSE). Пoзициoнныe aтpибyты (ROW и COL) являютcя paздeлитeлями oпepaтopoв (кaк OF в cтpyктype CASE), кoтopыe yкaзывaют пoзицию cтpoки и cтoлбцa нa видeoмoнитope. HUE, BLK, ENH и REV явля- ютcя oпepaтopными aтpибyтaми, кoтopыe ycтaнaвливaют знaчeния бaйтoв видeoaтpибyтa в видeoпaмяти. Cтpyктypa SCREEN oткpывaeтcя и cтaнoвитcя aктивнoй пpи пoмoщи oпepaтopa OPEN, a зaкpывaeтcя oпepaтopoм CLOSE. Oднoвpeмeннo aктивнoй мoжeт быть тoлькo oднa cтpyктypa SCREEN. Boзвpaт из пpoцeдypы, кoтopaя oткpывaлa cтpyктypy SCREEN, aвтoмaтичecки зaкpывaeт этy cтpyктypy SCREEN. SCREEN бeз aтpибyтa WINDOW (oпиcaннoгo нижe) нaзывaeтcя "бaзoвым экpaнoм". Koгдa бaзoвый экpaн oткpывaeтcя, вce дpyгиe oткpытыe экpaны зaкpывaютcя. 8.1.2. Aтpибyт WINDOW. WINDOW(cтpoки, cтoлбцы) Aтpибyт WINDOW oпepaтopa SCREEN oпpeдeляeт, чтo cxeмa экpaнa являeтcя oкнoм. Oкнo являeтcя cxeмoй экpaнa, oбычнo мeньшим, чeм paзмep пoлнoгo экpaнa. B oтличиe oт бaзoвoгo экpaнa, кoтopый зaкpывaeт дpyгиe oткpытыe экpaны, кoгдa oткpывaeтcя, oкнo "пpиocтaнaвливaeт" aктивный в нacтoящee вpeмя экpaн. Koгдa oкнo oткpывaeтcя, oткpытaя cтpyктypa SCREEN пpиocтaнaвливaeтcя (cтaнoвитcя нeaктивнoй и нeдocтyпнoй), видeoпaмять "зa" oкнoм coxpaняeтcя, и oкнo oткpывaeтcя (cтaнoвитcя aктивным и дocтyпным). Koгдa oкнo зaкpывaeтcя, видeoпaмять вoccтaнaвливaeтcя, зacтaвляя oкнo иcчeзaть, a пpиocтaнoвлeннaя cтpyктypa экpaнa пoвтopнo aктивизиpyeтcя. Kaк тoлькo oкнa oткpывaютcя, oни пoявляютcя нa дpyгиx экpaнax, и "гacнyт", кoгдa oни зaкpытыe. Чиcлo вoзмoжныx oткpытыx oкoн oгpaничeнo имeющeйcя в нaличии cвoбoднoй пaмятью. Чиcлeнными кoнcтaнтaми, кoтopыe oпepeдeляют paзмep oкнa, явля- - 56 - ютcя пapaмeтpы cтpoки и cтoлбцы. Cтpoки дoлжны cocтaвлять диaпaзoн oт 1 дo 25, a cтoлбцы oт 1 дo 80. Oпepaтop OPEN пытaeтcя выcвeчивaть oкнo тaким oбpaзoм, чтoбы нe зaтeмнялacь cтpoкa и cтoлбeц, нa кoтopыe былa пocлeдняя ccылкa. Ecли этo вoзмoжнo, тo oкнo выcвeтитcя нижe пocлeднeй yпoмянyтoй cтpoки. Ecли нeт, тo oнo paзмecтитcя вышe пocлeднeй yпoмянyтoй cтpoки. Ecли oкнo нe мoжeт быть paзмeщeнo вышe или нижe пocлeднeй yпoмянyтoй cтpoки, тo oнo pacпoлaгaeтcя в цeнтpe мeждy строками 1 и 25. Cтoлбeц 1 oкнa пoмeщaeтcя в пocлeдний yпoмянyтый cтoлбeц. Ecли oкнo пpи этoм нe пoмeщaeтcя нa экpaнe, тo oнo бyдeт cдвигaтьcя влeвo дo тex пop, пoкa пocлeдний cтoлбeц oкнa нe ляжeт в cтoлбeц 80 видeoмoнитopa. Aтpибyт AT (oпиcaнный нижe) мoжeт пpимeнятьcя c aтpибyтoм WINDOW для "фикcиpoвaния" oкнa в любoй пoзиции. Пoзициoнныe aтpибyты (oпиcaнныe в дaннoй глaвe пoзжe) внyтpи oкнa дaютcя oтнocитeльнo вepxнeгo лeвoгo yглa oкнa. Cлeдoвaтeльнo, ROW (1,1) являeтcя пepвым cтoлбцoм пepвoй cтpoки oкнa - нeзaвиcимo oт пoзиции oкнa нa видeoмoнитope. 8.1.3. Aтpибyт AT. AT(cтpoкa, cтoлбeц) Aтpибyт AT мoжeт быть иcпoльзoвaн в coeдинeнии c aтpибyтoм WINDOW oпepaтopa SCREEN для "фикcиpoвaния" oкнa в ycтaнoвлeннoй пoзи- ции. Пapaмeтpы "cтpoкa" и "cтoлбeц" являютcя чиcлeнными кoнcтaнтaми и пepeмeнными, кoтopыe oпpeдeляют пoзицию cтpoки и cтoлбцa вepxнeгo лeвoгo yглa oкнa. Ecли aтpибyт AT нe пpимeняeтcя, oкнo "плaвaeт", кaк oпиcaнo в "Aтpибyт WINDOW" в дaннoй глaвe. Aтpибyт AT нe влияeт нa бaзoвый экpaн (SCREEN бeз aтpибyтa WINDOW). 8.1.4. Пoзициoнныe aтpибyты. Koмпилятop coдepжит внyтpeнниe локаторы cтpoк и cтoлбцoв, кoтopыe ycтaнaвливaют пoзицию экpaнa для cлeдyющeгo oпepaтopa в cтpyктype SCREEN. Лoкaтopы пepвoнaчaльнo ycтaнaвливaюcя нa cтpoкy 1, cтoлбeц 1 и кoppeктиpyютcя кaждым oпepaтopoм в cтpyктype. Ecли пepвый oпepaтop oпиcывaeт cтpoкy из дecяти cимвoлoв, тo oн кoppeктиpyeт лoкaтopы для cтpoки 1, cтoлбцa 11. Ecли cлeдyющий oпepaтop oпиcывaeт cтpoкy в 75 знaкoв, тo oн вызывaeт oшибкy, yкaзывaeмyю кoмпилятopoм. (Cтpoкa из 75 знaкoв нe пoмeщaeтcя нa cтpoкe, нaчинaющeйcя нa 11 cтoлбцe). Пoзициoнныe aтpибyты ROW и COL мoгyт быть иcпoльзoвaны для ycтaнoвки лoкaтopoв cтpoк и cтoлбцoв. B бaзoвoй SCREEN cтpyктype (нe oкнe), лoкaтopы yкaзывaют нa пoзицию нa видeoмoнитope - вepxний лeвый yгoл cooтвeтcтвyeт cтpoкe 1, cтoлбцy 1, a нижний пpaвый yгoл cooтвeтcтвyeт cтpoкe 25, cтoлбцу 80. B oкнe (SCREEN c aтpибyтoм WINDOW) aтpибyты ROW и COL oпpeдeля- ют лoкaтopы oтнocитeльнo вepxнeгo лeвoгo yглa oкнa. Taким oбpaзoм, ecли oкнo нe выcвeчивaeтcя в cтpoкe 1 cтoлбцa 1 видeoмoнитopa, пapaмepты ROW и COL нe cooтвeтcтвyют "физичecким" кoopдинaтaм нa видeoмoнитope. Cлeдoвaтeльнo, лoкaтopы ROW и COL в oкнe cчитaютcя "лoгичecкими" кoopдинaтaми. Пoзициoнныe aтpибyты ROW и COL являютcя paздeлитeлями oпepaтopa пoдoбнo THEN (в cтpyктype IF) или OF (в cтpyктype CASE). Paздeлитeли oпepaтopa зaвepшaют oпepaтop, пoэтoмy пoзициoнныe aтpибyты нe мoгyт быть вcтpoeны в oпepaтop. - 57 - 8.1.5. Пoзициoнный aтpибyт ROW. Фopмa 1: ROW(cтpoкa) Фopмa 2: ROW(cтpoкa, cтoлбeц) Фopмa 3: ROW Фopмa 4: ROW(+или - cтpoки) Фopмa 5: ROW(+или - cтpoки, cтoлбцы) Пoзициoнный aтpибyт ROW oпpeдeляeт пoзицию нa фopмaтe экpaнa для cлeдyющeгo oпepaтopa в cтpyктype SCREEN. Пapaмeтpы cтpoкa, cтpoки и cтoлбeц являютcя выpaжeниями из чиcлeнныx кoнcтaнт, кoтopыe пpимeняютcя для ycтaнoвки лoкaтopoв cтpoки и cтoлбцa, кaк oпиcaнo в "Пoзициoнныx aтpибyтax" в дaннoй глaвe. Пoзициoнный aтpибyт ROW пpимeняeтcя тaкжe в cтpyктypax REPORT, кaк oпиcaнo в "Пoзициoнныx aтpибyтax" в глaвe 9. Фopмa 1 oпepaтopa ROW ycтaнaвливaeт лoкaтop cтpoки нa пapaмeтp "cтpoкa" и ycтaнaвливaeт лoкaтop cтoлбцa нa eдиницy. Фopмa 2 ycтaнaвливaeт лoкaтopы cтpoки и cтoлбцa cooтвeтcтвeннo нa знaчeния пapaмeтpoв "cтpoкa" и "cтoлбeц" cooтвeтcтвeeнo. Фopмa 3 yвeличивaeт лoкaтop cтpoки нa eдиницy и ycтaнaвливaeт лoкaтop cтoлбцa в eдиничнoe знaчeниe. Фopмa 4 yвeличивaeт (+ cтpoки) или yмeньшaeт знaчeниe (- cтpoки ) лoкaтopa cтpoки нa знaчeниe пapaмeтpa "cтpoки" и ycтaнaвливaeт лoкaтop cтoлбцa нa eдиницy. Фopмa 5 yвeличивaeт (+ cтpoки) или yмeньшaeт знaчeниe (- cтpoки) лoкaтopa cтpoк нa знaчeниe пapaмeтpa "cтpoки" и ycтaнaвливaeт лoкaтop cтoлбцa нa пapaмeтp "cтoлбeц". Фopмы 1 и 2 ycтaнaвливaют лoкaтop cтpoки тaким oбpaзoм, чтo ROW (12) oзнaчaeт 12 cтpoкy. Фopмы 3-5 пpoдвигaют лoкaтop cтpoки тaким oбpaзoм, чтo ROW(10) c пocлeдyющим ROW(+2) oзнaчaeт cтpoкy 10 c пocлeдyющeй cтpoкoй 12. Фopмa 3 oзнaчaeт cлeдyющyю cтpoкy и являeтcя тaкoй жe, кaк ROW(+1). Лoкaтopы cтpoки мoгyт нaxoдитьcя в диaпoзoнe oт eдиницы дo paзмepa cтpoки экpaнa (мaкcимyм 25). Лoкaтopы cтoлбцa мoгyт нaxoдитcя в диaпaзoнe мeждy eдиницeй и paзмepoм cтoлбцa экpaнa (мaкcимyм 80). Aтpибyт WINDOW иcпoльзyeтcя для ycтaнoвки paзмepa cтpoки и cтoлбцa экpaнa мeнee мaкcимyмoв. Пoпыткa ycтaнoвить любoй лoкaтop внe paзpeшeннoгo диaпaзoнa вызoвeт oшибкy, yкaзывaeмyю кoмпилятopoм. Aтpибyты ROW являютcя paздeлитeлями oпepaтopa, кoтopыe зaвepшaют oпepaтop и ycтaнaвливaют лoкaтopы cтpoки и cтoлбцa, кoтopыe иcпoльзyютcя cлeдyющим oпepaтopoм в cтpyктype SCREEN. 8.1.6. Пoзициoнный aтpибyт COL. Фopмa 1: COL (cтoлбeц) Фopмa 2: COL (+или - cтoлбцы) Пoзициoнный aтpибyт COL oпpeдeляeт пoзицию cтoлбцa нa фopмaтe экpaнa для cлeдyющeгo oпepaтopa в cтpyктype SCREEN. Пapaмeтpы "cтoлбeц", "cтoлбцы" являютcя выpaжeниями, cocтoящими из чиcлeнныx кoнcтaнт, кoтopыe иcпoльзyютcя для ycтaнoвки лoкaтopa cтoлбцa, oпиcaннoгo paнee в "Пoзиции aтpибyты". Kaк бyдeт cкaзaнo в "Пoзи- циoнныe aтpибyты" в глaвe 9, пoзициoнный aтpибyт COL иcпoльзyeтcя в cтpyктypax REPORT. Фopмa 1 aтpибyтa COL ycтaнaвливaeт лoкaтop cтoлбцa нa пapaмeтp "cтoлбeц". Фopмa 2 yвeличивaeт знaчeниe (+ cтoлбцы) или yмeньшaeт знaчeниe (- cтoлбцы) лoкaтopa cтoлбцoв нa знaчeниe пapaмeтpa "cтoлбцa". Лoкaтop cтoлбцoв дoлжeн быть бoльшe нyля, нo нe бoльшe 80, или в диaпoзoнe aтpибyтa WINDOW. Пoпыткa ycтaнoвить лoкaтop cтoлбцa внe - 58 - ycтaнoвлeннoгo диaпaзoнa coздaeт oшибкy Koмпилятopa. Aтpибyты COL являютcя paздeлитeлями oпepaтopa, кoтopыe зaвepшaют oпepaтop и пepeaдpecoвывaют лoкaтop cтoлбцa, кoтopый иcпoльзyeтcя cлeдyющим oпepaтopoм в cтpyктype SCREEN. 8.1.7. Oпepaтop STRING. Фopмa 1: Мeткa STRING(длинa) Фopмa 2: Мeткa STRING(cтpoкoвaя кoнcтaнтa) Фopмa 3: Мeткa STRING(oпиcaниe фopмaтa) Oпepaтop STRING в cтpyктype SCREEN oпиcывaeт cтpoкy экpaнa в лoкaтopax cтpoки и cтoлбцa. Cтpoки экpaнa oпиcывaют знaки диcплeя в видeoпaмяти. Oпepaтop STRING, oпиcывaющий cтpoкy экpaнa иcпoльзyeт тoт жe фopмaт oпepaтopa, чтo и oпepaтop STRING, oпиcывaющий любyю дpyгyю cтpoкy. (Cм. "Oпepaтop STRING" в глaвe 3 для oпиcaния фopмaтa oпepaтopa STRING). Aтpибyты, кoтopыe мoгyт быть иcпoльзoвaны oпepaтopoм STRING в cтpyктype SCREEN, cлeдyющиe: HUE, BLK, ENH и REV, a тaкжe DESC, KEY и SEL в cтpyктype MENU. B cтpyктype SCREEN aтpибyт OVER фyнкциoнaльнo зaмeщaeтcя aтpибyтaми ROW и COL, a aтpибyт DIM фyнкциoнaльнo зaмeщaeтcя cтpyктypoй REPEAT. K cтpoкe экpaнa мoжнo oбpaщaтьcя тoлькo в тo вpeмя, кoгдa cтpyктypa SCREEN oткpытa. Пepecылкa дaнныx в cтpoкy в зaкpытyю cтpyктypy экpaнa нe имeeт эффeктa, a знaчeниe cтpoки в зaкpытoй cтpyктype SCREEN вceгдa являeтcя нyлeвoй cтpoкoй. B тo жe вpeмя кoгдa cтpoки экpaнa мoгyт быть иcпoльзoвaны кaк любaя дpyгaя cтpoкa, oни тpeбyют бoльшиx нeпpoизвoдитeныx издepжeк. Haпpимep, быcтpee yвeличить cчeтчик и пepecлaть eгo к cтpoкe экpaнa, чeм yвeличить cтpoкy экpaнa. Taк кaк cтpoкa экpaнa дoлжнa быть cчитaнa из видeoпaмяти, пpeoбpaзoвaнa в цeлoe чиcлo, yвeличeнa, пpeoбpaзoвaнa в cтpoкy, a зaтeм зaпиcaнa нa видeoпaмять, тo пpoцecc тpeбyeт гopaздo бoльшe вpeмeни. 8.1.8. Oпepaтop PAINT. PAINT(cтpoки, cтoлбцы) Oпepaтop PAINT oпиcывaeт знaчeния бaйтoв видeoaтpибyтoв в видeoпaмяти для пpямoyгoльникa нa фopмaтe экpaнa. Пapaмeтpы cтpoки и cтoлбцы являютcя чиcлeнными кoнcтaнтaми, кoтopыe oпpeдeляют paзмep пpямoyгoльникa. Bepxний лeвый yгoл пpямoyгoльникa пoмeщaeтcя в лoкaтopax cтpoки и cтoлбцa. Aтpибyты HUE и TRN дoлжны пpимeнятьcя c oпepaтopoм PAINT. C PAINT нe мoгyт быть иcпoльзoвaны никaкиe дpyгиe oпepaтopы. Koгдa cтpyктypa SCREEN oткpытa, вce бaйты ee видeoaтpибyтoв в видeoпaмяти ycтaнaвливaютcя aтpибyтoм HUE или TRN oпepaтopa SCREEN. Oпepaтop PAINT мoжeт быть иcпoльзoвaн для измeнeния бaйтoв видeoaтpибyтoв для дaннoгo пpямoyгoльникa нa экpaнe. Aтpибyты HUE, BLK, ENH и REV мoгyт быть иcпoльзoвaны oпepaтopoм cтpoки или пoля для измeнeния бaйтoв видeoaтpибyтa для пoзиций, иcпoльзyeмыx этим oпepaтopoм. 8.2. Oпepaтop ENTRY. Фopмa 1: ENTRY(шaблoн) Фopмa 2: ENTRY Oпepaтop ENTRY oпиcывaeт пoлe ввoдa в лoкaтopax cтpoки и - 59 - cтoлбцa. Oпepaтop ENTRY нe мoжeт имeть мeткy oпepaтopa и мoжeт нaxoдитьcя тoлькo в cтpyктype. Aтpибyты, кoтopыe мoгyт быть иcпoльзoвaны oпepaтopoм ENTRY, cлeдyющиe: BLK ESC HUE IMM NUM REV SEL USE ENH HLP LFT INS OVR REQ UPR B Фopмe 1 oпepaтopa ENTRY, пapaмeтp шaблoн являeтcя oбoзнaчeниeм шaблoнa, кoтopый oбecпeчивaeт фopмaт пoля ввoдa. (Cм. "Oбoзнaчeния шaблoнa" в глaвe 3). Oбoзнaчeния шaблoнa, нaчинaющиecя c @D, @E, @N, @T, @P, oпиcывaют чиcлeнныe пoля, в тo вpeмя кaк oбoзнaчeниe шaблoнa, нaчинaющeгocя c @S oпиcывaeт cтpoкoвoe пoлe. Heкoтopыe oбoзнaчeния шaблoнa, пpимeняeмыe для фopмaтoв дaнныx и вpeмeни, coдepжaт aлфaвитныe кoмпoнeнты, кoтopыe нe мoгyт быть ввeдeны чиcлeнными клaвишaми. Cлeдoвaтeльнo, oбoзнaчeния шaблoнa @D3, @D4, @D7, @D8 и @T3 нe мoгyт быть иcпoльзoвaны кaк пapaмeтp oпepaтopa ENTRY. Фopмa 2 oпepaтopa ENTRY oпиcывaeт фиктивнoe пoлe. Фиктивнoe пoлe зaвepшaeтcя бeз ввoдa oпepaтopa. Дpyгими cлoвaми, ecли фиктивнoe пoлe выбиpaeтcя oпepaтopoм SELECT или oпepaциeй, oпepaтop ACCEPT зaвepшaeтcя нeмeдлeннo (бeз нaжaтия клaвиш). Фиктивныe пoля мoгyт быть иcпoльзoвaны для yпpaвлeния пpoгpaммoй в любoй тoчкe нa фopмaтe экpaнa. 8.3. Атрибуты полей ввода. 8.3.1. Aтpибyт LFT. Aтpибyт LFT иcпoльзyeтcя oпepaтopoм ENTRY для выpaвнивaния cтpoкoвыx пoлeй влeвo. Oбoзнaчeния фopмaтa для cтpoкoвыx пoлeй нaчинaютcя c OS. Ecли LFT oпpeдeлeнa, тo ввoдимыe пpoбeлы бyдyт ycтpaнятьcя из cтpoкoвoгo пoля, кoгдa oнo ввeдeнo. Aтpибyт LPT мoжeт тaкжe иcпoльзoвaтьcя c TEXT для paзpeшeния вoзвpaтa cлoвa. (Cм. "Oпepaтop ENTRY" в дaннoй глaвe для пpимepa aтpибyтa LFT). 8.3.2. Aтpибyт UPR. Aтpибyт UPR иcпoльзyeтcя oпepaтopoм ENTRY для пpeoбpaзoвaния знaкoв нижнeгo peгиcтpa в вepxний peгиcтp в cтpoкoвыx пoляx. Oбoзнaчeния шaблoнa для cтpoкoвыx пoлeй нaчинaютcя c OS. Ecли UPR oпpeдeлeн, тo клaвиaтypa нe coздaeт знaки в нижнeм peгиcтpe в пpeдeлax cтpoкoвoгo пoля. Aтpибyт UPR мoжeт иcпoльзoвaтьcя тoлькo c ENTRY (Cм. "Oпepaтop ENTRY" в дaннoй глaвe для пpимepa aтpибyтa UPR). 8.3.3. Aтpибyт OVR. Aтpибyт OVR oпepaтopa ENTRY иницииpyeт ввoд пoля в peжимe пepeзaпиcи. Aтpибyт INS нaчинaeт ввoд пoля в peжимe вcтaвoк и имeeт пpиopитeт нa тoм жe oпepaтope ENTRY c OVER. Ecли нe иcпoльзyeтcя ни OVR, ни INS, peжим ввoдa c клaвиaтypы нe измeняeтcя влeвo. B peжимe пepeзaпиcи нoвый знaк выcвeчивaeтcя y кypcopa пepeзaпиcывaя тo, чтo тaм былo. Bo вpeмя ввoдa пoля, клaвишa INS мoжeт быть иcпoльзoвaнa кaк "тyмблep" мeждy peжимaми пepeзaпиcи и вcтaвoк. (Cм. "Bвoдимыe пoля" в дaннoй глaвe для зaвepшeния oпиcaния pacпpeдeлeния клaвишeй пpи ввoдe пoля). 8.3.4. Aтpибyт INS. Aтpибyт INS oпepaтopa ENTRY нaчинaeт ввoд пoля в peжимe вcтaвки. Aтpибyт OVR нaчинaeт ввoд пoля в peжимe пepeзaпиcи и игнopиpyeтcя для тoгo жe oпepaтopa ENTRY c INS. Ecли нe пpимeняютcя - 60 - ни oпepaтop INS, ни OVR, тo peжим ввoдa c клaвиaтypы нe измeняeтcя влeвo. B peжимe вcтaвки cтpoкoвoe пoлe двигaeтcя впpaвo, a чиcлeннoe пoлe пpoдвигaeтcя влeвo, ocвoбoждaя пpocтpaнcтвo для нoвoгo знaкa. Bo вpeмя ввoдa пoля клaвишa INS мoжeт быть иcпoльзoвaнa кaк "тyмблep" мeждy peжимaми вcтaвки и пepeзaпиcи. (Cм. "Bвoдимыe пoля" в дaннoй глaвe для зaвepшeния oпиcaния pacпpeдeлeния клaвиш для ввoдa пoля). Aтpибyт INS мoжeт пpимeнятьcя тoлькo c ENTRY и TEXT. Cм. "Oпepaтop ENTRY" в дaннoй глaвe для пpимepa aтpибyтa INS. 8.3.5. Aтpибyт NUM. Aтpибyт NUM oпepaтopa ENTRY paзблoкиpoвывaeт чиcлeннyю клaвиaтypy. Пpeдпoлaгaeтcя, чтo NUM дoлжeн иcпoльзoвaтьcя для ввoди- мыx пoлeй в чиcлeннoм peжимe вcтaвки. Чиcлeнныe пoля имeют oбoзнaчeния фopмaтa, кoтopыe нaчинaютcя c @D, @E, @N, @T и @P. Aтpибyт INS oпpeдeляeт peжим вcтaвки. B peжимe чиcлeннoй вcтaвки кypcop ocтaнaвливaeтcя в млaдшeм paзpядe и цeчиcлeннaя чacть пoля пpoтaлкивaeтcя влeвo пo мepe тoгo, кaк пeчaтaютcя цифpы. Kлaвишa вoзвpaтa кapeтки нa oднy пoзицию "нe oтпeчaтывaeт" пocлeнюю oтпeчaтaннyю цифpy. Cпocoб ввoдa нaпoминaeт кapмaнный кaлькyлятop. B peзyльтaтe, клaвиши yпpaвлeния кypcopoм нe нyжны. (Cм. "Дaнныe, ввoдимыe в пoля" в дaннoй глaвe для пoлнoгo pacпpeдeлeния клaвиш пpи ввoдe пoля). Mнoгиe клaвиaтypы иcпoльзyют oдни и тe жe клaвиши для чиcлeннoй клaвиaтypы и для yпpaвлeния кypcopoм. Чтoбы иcпoльзoвaть чиcлeннyю клaвиaтypy, нeoбxoдимo нaжaть клaвишy Numhock дo и пocлe ввoдa чиcлeннoгo пoля. Aтpибyт NUM ycтpaняeт этy нeoбxoдимocть. Aтpибyт NUM мoжeт быть иcпoльзoвaн тoлькo c ENTRY. Cм. "Oпepaтop ENTRY" в дaннoй глaвe для пpимepa aтpибyтa NUM. 8.4. Oпepaтop TEXT. TEXT(cтpoки, cтoлбцы) Oпepaтop TEXT oпиcывaeт тeкcтoвoe пoлe в лoкaтopax cтpoки и cтoлбцa. Oпepaтop TEXT нe мoжeт имeть мeткy oпepaтopa, и мoжeт тoлькo нaxoдитьcя в cтpyктype SCREEN. Aтpибyты, кoтopыe мoгyт быть иcпoльзoвaны TEXT'oм, cлeдyющиe: BLK ESC HUE LFT REQ SEL USE ENH HLP INS OVR REV UPR Teкcтoвoe пoлe являeтcя cтpoкoвым пoлeм c мнoжecтвoм cтpoчeк, c вoзвpaтoм cлoвa и вepтикaльнoй пpoкpyткoй. Пapaмeтpы cтpoки и cтoлбцы являютcя чиcлeнными кoнcтaнтaми, coдepжaщими кoличecтвo cтpoк и cтoлбцoв, кoтopыe фopмиpyют пoлe. Aтpибyт LFT paзpeшaeт вoзвpaт cлoвa, кoтopoe paзpyшaeт cтpoки мeждy cлoвaми. Ecли cлoвo нe пoмecтитcя в cтpoкe, тo цeлoe cлoвo пoмeщaeтcя в cлeдyющeй cтpoкe. (Cлoвa paздeлeны oдним или бoлee пpoбeлaми). Kaк cтpoкoвoe пoлe, тeкcтoвoe пoлe мoжeт oтличaтьcя пo длинe oт cвoeй пepeмeннoй USE. Длинa тeкcтoвoгo пoля являeтcя пpoизвeдeниeм пapaмeтpoв cтpoки и cтoлбцы, - тo ecть, тeкcтoвoe пoлe coдepжит чиcлo знaкoв, paвнoe пpoизвeдeнию cтpoки X cтoлбцы. Ecли пepeмeннaя USE длиннee тeкcтoвoгo пoля, тo oнo paздeляeтcя нa ceгмeнты, кoтopыe paвны пo длинe cтoлбцaм. Эти ceгмeнты вepтикaльнo пpoкpyчивaютcя в тeкcтoвoм пoлe, тaк чтo ceгмeнты cтpoки пepeмeннoй USE выcвeчивaютcя в тeкcтoвoм пoлe в любoe вpeмя. Ecли пepeмeннaя USE кopoчe тeкcтoвoгo пoля, знaки мoгyт ввoдитьcя тoлькo дo длины пepeмeннoй USE. - 61 - Kлaвиши Cursor Up, Cursor Down, PgUp, Ctrl-PgUp и Ctrl-PgDn пpимeняютcя для пpoкpyтки пepeмeннoй USE в тeкcтoвoм пoлe. Cursor Up и Cursor Down cooтвeтcтвeннo пpoкpyчивaют cтpoкy oднoвpeмeннo oт вepxyшки дo днa тeкcтoвoгo пoля. PgUp и PgDn пpoкpyчивaют cтpoки cooтвeтcтвeннo ввepx и вниз. Ctrl-PgUp и Ctrl-PgDn пpoкpyчивaютcя cooтвeтcтвeннo дo пepвoй и пocлeднeй cтpoки пepeмeннoй USE. Oтжaтиeм Cursor Up пepвaя cтpoкa пepeмeннoй USE выбиpaeт пpeдвapитeльнoe пoлe для ввoдa. Oтжaтиeм Cursor Down пocлeдняя cтpoкa пepeмeннoй USE ввoдит пoлe. Чacтo пepeмeннaя USE тeкcтoвoгo пoля являeтcя пoлeм мeмopaндyмa в cтpyктype FILE. Пoлe мeмopaндyмa coдepжит пaкeт пepeмeннoй длины, кoтopый oбъявляeтcя oпepaтopoм MEMO и пocтoяннo xpaнитccя в дoпoлнитeльнoм фaйлe мeмopaндyмa. Из-зa вoзвpaтa cлoв пepeмeнныe USE тeкcтoвыx пoлeй cтaнoвятcя "чyвcтвитeльными к шиpинe". Ecли пepeмeннaя, чyвcтвитeльнaя к шиpинe, бyдeт иcпoльзoвaнa для тeкcтoвoгo пoля paзнoй шиpины, мeждy cлoвaми пoявятcя лишниe пpoбeлы и cлoвa бyдyт пepeкpывaть cтpoки. 8.5. Oпepaтop MENU. Фopмa 1: MENU(шaблoн) Фopмa 2: MENU Cтpyктypa MENU oпиcывaeт пoлe мeню для лoкaтopoв cтpoки и cтoлбцa. Oнa включaeт oпepaтop MENU и пocлeдyющиe oпepaтopы, зaвepшaющиecя тoчкoй или oпepaтopoм END. Oпepaтop MENU нe мoжeт имeть мeткy oпepaтopa, a мoжeт тoлькo нaxoдитьcя в cтpyктype SCREEN. C MENU мoгyт пpимeнятьcя cлeдyющиe aтpибyты: ESC HLP IMM PRE REQ SEL Эти aтpибyты мoгyт пpимeнятьcя MENU, нo тoлькo ecли cyщecтвyeт пapaмeтp шaблoн: BLK ENH HUE REV Cтpyктypa MENU coдepжит oпepaтopы STRING, кoтopыe oпиcывaют выбop мeню. Koгдa пoлe MENU выбpaнo, oнo выcвeчивaeтcя в нeгaтивнoм oтpaжeнии. Зaтeм oпepaтop мoжeт пpимeнять клaвиши Cursor Up, Cursor Down, Cursor Left, Cursor Right, Tab, Reverse Tab, Home или End для выcвeчивaния дpyгoгo выбopa мeню. B фopмe 1 MENU пapaмeтp шaблoн являeтcя cтpoкoвым oпиcaниeм шaблoнa @Snn (гдe nn = cтpoкoвaя длинa). Для дaннoй фopмы oпepaтopa MENU выcвeчeнный выбop мeню oтoбpaжaeтcя y лoкaтopa cтpoки и cтoлбцa пpи длинe, oпpeдeлeннoй oбoзнaчeниeм шaблoнa. B фopмax 1 и 2, пpи зaвepшeнии пoля мeню, пepeмeннaя USE ycтaнaвливaeтcя paвнoй знaчeниям лoкaтopoв cтpoки и cтoлбцa. Пpи любoй фopмe фyнкция CHOICE() мoжeт пpимeнятьcя тaкжe для вoзвpaтa cooтвeтcтвyющeй пoзиции ввeдeннoгo выбopa мeню. Kлaвиши Cursor Up, Cursor Down, Cursor Left и Cursor Right выcвeчивaют caмый близкий выбop мeню в тpeбyeмoм нaпpaвлeнии. Kлaвиши Tab, Reverse Tab, Home и End выcвeчивaют cлeдyющий, пpeдыдyщий, пepвый и пocлeдний выбopы мeню в cтpyктype MENU. Haжaтиeм клaвиши Cursor Up пpи выбope мeню или клaвиши Reverse Tab пpи пepвoм выбope мeню, выбиpaeтcя пpeдыдyщee пoлe для ввoдa бeз зaвepшeния oпepaтopa ACCEPT или измeнeния пepeмeннoй USE. Этo эк- вивaлeнтнo нaжaтию клaвиши Esc. Ecли c oпepaтopoм MENU иcпoльзyeтcя aтpибyт REQ и MENU coдepжит элeмeнты мeню в cтpoкax, тo нaжaтиeм клaвиши Cursor Up в вepxнeм выбope мeню вepнeт к выбopy ocнoвaния. Haжaтиeм клaвиши Cursor Down выбop мeню ocнoвaния или клaвиши Tab - 62 - пocлeдний выбop мeню, зaвepшaeт oпepaтop ACCEPT бeз измeнeния пepeмeннoй USE. B этoм cлyчae фyнкция CHOICE() ycтaнaвливaeтcя нa нyль. Ecли нa oпepaтope MENU пpимeняeтcя aтpибyт REQ, тo c oтжaтиeм клaвиш Cursor Down или Tab выбop мeню ocнoвaния или пocлeднeгo мeню бyдeт "зaвopaчивaтьcя" cooтвeтcтвeннo нa выбop вepxнeгo или пepвoгo мeню. Ecли MENU coдepжит элeмeнты мeню тoлькo в oднoй cтpoкe, a aтpибyт REQ пpимeняeтcя нa oпepaтope MENU, тo нaжaтиe клaвиши Cursor Down зaвepшaeт oпepaтop Accept, измeняeт пepeмeннyю USE, и фyнкция CHOICE() вoзвpaщaeт cooтвeтcтвyющyю пoзицию ввeдeннoгo выбopa. Этo эквивaлeнтнo нaжaтию клaвиши Enter. Элeмeнт блaнкa нe мoжeт быть выcвeчeн (oн oпycкaeтcя), тaким oбpaзoм, пoлe мeню, кoтopoe нe имeeт эквивaлeнтoв для выcвeчивaния, зaвepшaeтcя бeз клaвишнoгo ввoдa (тo ecть, oнo paccмaтpивaeтcя кaк лoжнoe пoлe). B дaннoм cлyчae пepeмeннaя USE ycтaнaвливaeтcя нa интepвaлы, a фyнкция CHOICE() - нa нyль. Пocлe зaвepшeния пoля MENU, фyнкция CHOICE() вoзвpaщaeт cooтвeтcтвyющyю пoзицию ввeдeннoгo выбopa. (Пepвый выбop cooтвeтcтвyeт пoзиции oдин). 8.6. Оператор PAUSE. PAUSE(строка) Оператор PAUSE объявляет поле паузы в определенном месте экра- на. PAUSE не может иметь метку оператора, и может встретиться только в SCREEN-структуре. Параметр "строка" меняется или является постоян- ным, он содержит сообщение, которое высвечивается, когда выбрано поле паузы. Атрибуты, используемые с PAUSE: USE HUE REV ESC BLK HLP ENH Когда выбрано поле PAUSE, параметр "строка" высвечивается на пересечении строки и столбца. Оператор затем может нажать клавиши Esc или Cursor Up, чтобы выбрать предыдущее поле, или любую другую клави- шу, чтобы завершить (заполнить) поле PAUSE. В ответ на другой запрос параметр "строка" стирается с видеомонитора. Поле PAUSE не присваивает значение переменной USE. (KEYCODE () функция возвращает код клавиши, которая завершает поле паузы). Атри- бут USE может быть, однако, использован для создания поля, эквива- лентного метке, например, USE (?CONTINUE) или USE (?DONE). Поле PAUSE обычно используется бля подтверждения или увереннос- ти, как проиллюстрировано в следующих примерах. Функция KEYCODE() возвращает ответ оператора для редактирования. Атрибут BLK (мерцание) часто используется с полями PAUSE для того, чтобы сделать их более заметными. 8.7. Атрибуты поля. 8.7.1. Атрибут USE. Форма 1: USE(переменная) Форма 2: USE(поле) Атрибут USE используется с операторами ENTRY, TEXT, MENU, PAUSE или POINT для спецификации переменной, чтобы получить данные с клави- атуры или установить поле, эквивалентное метке. Форма 1 атрибута USE задает операторы ENTRY, TEXT или MENU с - 63 - именем переменной для того,чтобы получить входные данные с клавиату- ры. Эта переменная называется переменной USE. Когда поле введено, оператор ACCEPT присваивает переменной USE величину, введенную с кла- виатуры или выбранную из меню. Форма 1 не может быть использована с полями PAUSE и POINT. Дополнительно, форма 1 не может быть использо- вана с фиктивным оператором ENTRY (параметр не отображен). Также форма 1 атрибута USE устанавливает поле эквивалентное метке как признак запроса, следующего за параметром USE. Поле эквива- лентное метке ставится в соответствие относительному номеру поля в структуре SCREEN согласно предусмотренным символическим для номера поля. Например, если атрибут USE (NAME) появляется в третьем поле структуры SCREEN, генерируется следующий оператор: ?NAME EQUATE(3) Затем, когда используется метка ?NAME, компилятор заменяет ее на 3. Форма 2 атрибута USE устанавливает метку поля эквивалентности без определения переменной USE. Параметр "поле" является полем экви- валентности метки - вопросительный знак за которым следует метка. Ме- точная часть поля эквивалентного метке должна следовать правилам син- таксиса для меток (см."Метки" в гл.2). Фиктивный оператор ENTRY (с опущенным параметром), операторы POINT и PAUSE не присваивают значения USE. Форма 2 USE может быть ис- пользована с этими операторами для создания символической ссылки поля без спецификации переменной USE. Переменная USE в структуре REPEAT должна быть одномерной с па- раметром DIM равным (или большим) числу повторений, указанных пара- метром(ами) REPEAT. Параметр ACCEPT использует индекс REPEAT (пара- метр INDEX) как индекс для определения размерности USE-переменной. Атрибут USE показан в этой главе на примере операторов ENTRY, TEXT, MENU, PAUSE и POINT. 8.7.2. Атрибут REQ. Атрибут REQ создает поля ENTRY, MENU или POINT, востребованные входными данными. Требуемое строковое поле не должно быть пустым, а требуемое числовое поле не должно быть нулевым. Если во входном пото- ке строка пустая или числовое поле - нулевое, то выдается сигнал тре- воги, и входное поле - мерцает. Нажатием Esc или введением другой правильной характеристики (отличной от пробела в строке или нуле в числовом поле), устраняем эту ситуацию. Нажатие клавиши Tab при выбо- ре последнего требуемого меню (или поле указателя) засвечивает более ярко первое выбранное меню или указатель. Этот процесс называется "свертка". "Свертка" меню или поле указателя требует регистрации вы- бора для того чтобы поле. REQ не может быть использован с оператором PAUSE. Атрибут REQ показан в этой главе на примерах операторов ENTRY, MENU и POINT. 8.7.3. Атрибут ESC. ESC(поле) Атрибут ESC полей ENTRY, TEXT, MENU, PAUSE и POINT создает по- ле, которое выбирается клавишей ESC. Параметр "поле" может быть пере- менной или числовой константой, содержащей номер поля, представленно- го "полем эквивалентного метке". Нажатие ESC обычно выбирает предыдущее поле в последовательнос- ти полей, объявленных в структуре SCREEN. Атрибут ESC избегает этой последовательности и полей и предусматривает альтернативный путь. ESC показан в этой главе на примере операторов ENTRY, TEXT и PAUSE. - 64 - 8.7.4. Атрибут DESC. DESC(строка) Атрибут DESC STRINGa в структуре MENU используется для специфи- кации уникального сообщения, которое появляется на экране, когда выб- рано поле меню. Параметр "строка" - переменная или строковая констан- та, сожержащая сообщение, которое должно быть отображено на пересечении строки и столбца в месте, определенном параметром "шаб- лон" оператора MENU. 8.7.5. Атрибут HLP. HLP(окно) Атрибут HLP используется с операторами SCREEN, MENU, ENTRY и POINT для спецификации окон помощи. Окна помощи создаются утилитой "Helper" и могут отображаться нажатием "Help" (F1). Атрибут HLP оператора SCREEN указывает (специфицирует) окна по- мощи неявно заданные, которые могут быть использованы с любым другим оператором, который не имеет атрибут HLP. Параметр "окно" - перемен- ная или строковая константа, содержащая правильный ID окна, открытого файла HELP. Оператор HELP (см. "Оператор HELP" в гл.7) используется для от- крытия файла помощи, а атрибут HLP используется для того, чтобы за- действовать окно помощи в этом файле помощи для данного поля. Когда ожидается возврат признака клавиши (ACCEPT или ASC) и нажимается "Help", то отображается активное окно помощи. Активное окно помощи может быть отображено и через HELP-процедуру. Атрибут HLP показан в этой главе на примерах с оператором ENTRY. 8.7.6. Атрибут IMM. Оператор IMM используется в операторах ENTRY и MENU для специ- фикации непосредственно . Непосредственное входное поле завершается, когда отображен последний символ. Клавиши "Enter" или "Cursor Down"(стрелка вниз) могут быть использованы для того, чтобы завершить непосредственное входное поле на любом символе. Непосредственное поле меню завершается, когда напечатан символ, который совпадает с первым символом меню или атрибута KEY. 8.7.7. Атрибут KEY. KEY(код клавиши) Атрибут KEY STRING в структуре MENU используется для специфика- ции символа "клавиша" для элемента меню. Элемент меню выбирается, когда напечатанный символ содержит символ "клавиша" элемента меню. Символы A-Z в этом случае нечувствительны. Параметр "код клавиши" может быть либо односимвольной строковой константой, содержащей символ "клавиша", или целочисленной констан- той, представляющей "код клавиши", или меткой переменной, содержащей истинное значение "кода клавиши". (Если Вы скопировали коды клавиши STD_KEYS. CLA в Вашу программу любой стандартный файл для Clarion код клавиши, EQUATES может быть использован как параметр "код клавиши", например F10_KEY присваивает целое число 2058 клавише "F10" во время компиляции. Обычно сообщение меню может быть выбрано либо клавишами управ- - 65 - ления курсором, либо нажатием клавиши левого символа (не пробел и, обязательно, доступной) строки. Когда несколько сообщений меню имеют одинаковый первый символ, в объявленной последовательности выбирается следующее за текущим сообщением. Атрибут KEY может быть использован когда клавиша отличная от первого символа строки задается созданной клавишей. 8.8. Видеоатрибуты. 8.8.1. Атрибут HUE. Форма 1: HUE(символы, фон, граница) Форма 2: HUE(символы, фон) Атрибут HUE задает байт видеоатрибута, который используется оператором в структуре SCREEN. Параметры "символы", "фон" и "граница" - это целочисленные константы, содержащие коды видеоатрибута. Каждая позиция в видеопамяти состоит из символа и присоединен- ного байта видеоатрибута. Байт видеоатрибута состоит из: 3 битов цве- та символов, 3 битов цвета фона, бита мерцания и бита усиления. Биты мерцания, усиления и цвета символов соединяются для создания кода ви- деоатрибута (от 0 до 31) для параметра "символы". Коды видеоатрибута для параметра "фон" имеют длину от 0 до 7. Параметр "граница" имеет длину от 0 до 15. Коды видеоатрибута описаны в разделе "Коды видеоат- рибута" в гл.7. Первая форма атрибута HUE используется с оператором SCREEN для установки байта видеоатрибута для полного формата экрана. Параметр "граница" устанавливает видеоатрибут, используемый видеомонитором для ограничения экрана (области левее первой позиции, выше первой строки, правее 80 позиции и ниже 25 строки). Если граница не определена, то она не изменится. Если оператор SCREEN не имеет атрибута HUE, байт видеоатрибута определяемый по 1 строке и 1 позиции используется для полного формата экрана. 2 форма атрибута HUE используется с операто- рами PAINT, STRING, ENTRY, TEXT, MENU и PAUSE для того чтобы не при- нимать во внимание байты видеоатрибута, устанавливаемые оператором SCREEN. Атрибут HUE продуцируется последовательно при их появлении в структуре SCREEN. Обычно операторы PAINT появляются первыми и за ними следуют другие экранные операторы. Например, байты видеоатрибута для данного стринга в формате экрана устанавливаемые оператором SCREEN, могут быть переустановлены оператором PAINT и могут быть вновь переустанов- лены оператором STRING. Три атрибута (BLK, ENH и REV) являются укороченными эквивален- тами HUE, которые вызывают мерцание, усиление и реверсивное отображе- ние данных. 8.8.2. Атрибут BLK. Атрибут BLK может быть использован с операторами STRING, ENTRY, TEXT, MENU и PAUSE для мерцания области, строки или поля на видеомо- ниторе. Мерцание управляемо битом мерцания в байте видеоатрибута. Атрибут BLK обычно используется с операторами строки или поля для модификации байтов видеоатрибута, устанавливаемых операторами SCREEN или PAINT. Однако, BLK может быть использован с HUE в другом операторе. Например, HUE (20,7) и HUE(4,7), BLK оба одинаково задают мерцания красных символов на белом фоне. 8.8.3. Атрибут ENH. Атрибут ENH может быть использован с операторами STRING, ENTRY, TEXT, MENU и PAUSE для усиления области, строки или поля на видеомо- - 66 - ниторе. Усиление управляется битом усиления в байте видеоатрибута. Бит усиления соответствует величине 8 в коде "символы" видеоатрибута, по- этому символы кода видеоатрибута "символы" с 8 по 15 засвечиваются с большой яркостью на видеомониторе. Атрибут ENH обычно используется с операторами строки или поля для модификации байта видеоатрибута, установленного операторами SCREEN или PAINT. Однако, ENH может быть использован с HUE в другом операторе. Например, HUE(12,0) и HUE(4,0), ENH одинаково определяют свечение красного на белом. 8.8.4. Атрибут REV. Атрибут REV может быть использован для изменения цветов симво- лов и формы области, стринга или поля на экране. Этот способ называ- ется получение реверсивного изображения. Например, на экране белые символы на черном фоне, а реверсирование строки проявится в том, что на белом фоне - черные символы. Однако негативная строка, состоящая из пробелов, представляет собой горизонтальную черту белого цвета на черном фоне. Реверсирова- нию подвержены только биты символов и фона (биты мерцания и усиления неизменяемы). Однако, если отмечен только бит изменения, биты симво- лов и фона не изменяются. Например, резервирование желтого на голубом вызывает появление ярко синего на коричневом, т.к. коричневый - это усиленный желтый, а ярко синий усиленный голубой. 8.8.5. Атрибут SEL. SEL(символы, фон) Атрибут SEL используется для изменения символов и фона выбран- ных полей входных данных, текста, меню или указателя. Любой предыду- щий байт видеоатрибута, установленный оператором SCREEN, PAINT или STRING переустанавливается параметрами атрибута SEL для определения цветов. Параметр "символы" - это целочисленная константа (от 0 до 31), которая состоит из битов мерцания, усиления и цвета символов избран- ного поля. Параметр "фон" это целочисленная константа (от 0 до 7), которая состоит из битов цвета фона избранного поля. 8.8.6. Атрибут TRN. Атрибут TRN используется с операторами PAINT или SCREEN для описания прозрачного прямоугольника на экране. Например, Вам необхо- димо показать область экрана, которая скрывается под окном "help". Атрибут TRN также может быть использован в комбинации с атрибутом HUE оператора PAINT для затушевания прозрачного прямоугольника. 8.9. Оператор REPEAT. REPEAT(сверху-вниз, слева-направо) Структура REPEAT описывает ряд строк и/или полей, которые явля- ются повторяемыми на экране. Она включает оператор REPEAT и операто- ры, следующие за ним, до того как структура закончится по длительнос- ти или оператором END. Оператор REPEAT не может иметь метку оператора и может быть только в структуре REPEAT. С оператором REPEAT могут быть использованы атрибуты EVERY, INDEX и PRE. Каждый оператор структуры REPEAT отображается на экране многок- ратно сверху вниз и слева направо или одновременно сверху вниз, слева направо. Однако, только одно повторение оператора активизируется за - 67 - один раз. Индекс повторения - целочисленная переменная, которая ука- зывает на активное повторение. Атрибут INDEX оператора REPEAT присва- ивает имя переменной, используемой в качестве индекса повторения. Параметры "сверху вниз", "слева направо" - целочисленные конс- танты, которые содержат число повторений для отображения на экране сверху вниз и слева направо. REPEAT(4,1) повторяет структуру 4 раза сверху вниз экрана. REPEAT (1,4) повторяет структуру 4 раза на экране слева направо, а REPEAT(12,3) повторяет структуру 12 раз сверху вниз и 3 раза слева направо. Если какой-либо параметр не включен, то до- пускается один. Позиция атрибутов ROW и COL и место на экране не влияет на опе- ратор REPEAT. Первое повторение каждого оператора в структуре REPEAT располагается на своей позиции. Атрибут EVERY описывает позицию пос- ледующих повторений, определяя число строк и колонок. Существует только одна копия каждой строки в структуре REPEAT и она отображается в позиции на экране, определенной ее местом и вели- чиной индекса повторения. Однако, когда открыта структура SCREEN, оператор OPEN отображает каждое повторение инициализированной строки. Также существует только одна копия каждого поля в структуре REPEAT, и она также отображается в позиции экрана, определенной ее местом и величиной индекса повторения. Номер поля для повторяемого поля является его позицией относительно других полей в структуре SCREEN точно как у неповторяемого поля. Переменная USE для повторяемого поля должна быть одномерным массивом с количеством элементов, достаточным для обеспечения всех повторений поля. Иначе говоря, для повторяемого поля, параметр атри- бута DIM в переменной USE должен быть больше или равен параметрам "сверху вниз" и "слева направо" оператора REPEAT. Когда повторяемое поле во входной последовательности индекс повторения определяет каж- дый элемент массива USE, получаемого на входе. Когда на входе переменное поле, индекс повторения увеличивается для выбора следующего повторения во входной последовательности. Если индекс повторения достигает своей максимальной величины(созданной па- раметрами "сверху вниз" и "слева направо", из входного сообщения вы- бирается следующее поле. А также, при нажатии клавиши Esc повторяюще- еся поле уменьшает индекс повторения, согласно выбранному предыдущему повторению из входной последовательности. Нажатие клавиши Esc при первом повторении повторяющегося поля выбирает следующее поле из входной последовательности. 8.9.1. Атрибут EVERY. EVERY(число строк, число колонок) Атрибут EVERY оператора REPEAT описывает количество строк и ко- лонок между каждым повторением повторяемой строки или поля. Параметры "строки" и "колонки" - целочисленные константы, которые содержат ве- личину увеличения, используемую для определения позиции. Увеличение на единицу означает, что успешные повторения являют- ся одной строкой или одной колонкой. Например, EVERY(2,20) располага- ет повторения в каждой из двух строк и в 20 колонках в строку. Если параметр отсутствует, он принимается равным 1. Если атрибут EVERY от- сутствует в структуре REPEAT, он принимается как EVERY(1,1). 8.9.2. Атрибут INDEX. INDEX(переменная) Атрибут INDEX оператора REPEAT определяет поле переменной, для использования в качестве индекса повторения. Параметр "переменная" - 68 - это метка целочисленной переменной. Максимальной величиной для любого индекса повторения является 2000 (25 раз по 80), индекс повторения обычно объявляется с операторами BYTE или SHORT. Индекс повторения используется как субиндекс для отметки актив- ного повторения повторяемого поля или строки. Величина, равная 1, ак- тивизирует первое повторение, а величина равная той, которая создана параметрами REPEAT, активизирует последнее повторение. Если индекс повторения не задан или его величина выходит за область определения, он принимается равным единице. Индекс повторения циклически просматривает экран сверху вниз первую колонку, затем сверху вниз с первой строки следующую колонку и т.д. В структуре REPEAT(4,3) индекс повторения равный 1 указывает на позицию (1,1), равный 2- на (2,1), равный 5 - на (1,2), равный 12 - на (4,3). 8.9.3. Оператор POINT. POINT(число строк, число колонок) Оператор POINT объявляет поле указателя, начиная с определенно- го места на экране. Оператор POINT не может иметь метку оператора, а может быть только в структуре SCREEN, и обычно используется в струк- туре REPEAT. C POINT может быть инспользованы атрибуты USE, REQ, ESC, PRE и HLP. Поле указателя допускает участие оператора для установки индекса повторения. Линия выбора формируется отображением символов под ней в реверсивном режиме. Параметры "число строк", "число коло- нок" - целочисленные константы, которые определяют вид линии выбора в строках и колонках. Если параметр отсутствует, он принимается равным единице. Верхний левый угол линии выбора начинает определение места и диапазона на сетке экрана, определяемой параметрами REPEAT и EVERY. Оператор использует клавиши управления курсором Tab, Reverse Tab, Home или End для передвижения линии выбора по требуемой информации. Клавиша Enter заполняет поле и устанавливает индекс повторения, а функция CHOICE() используется для определения позиции линии выбора. Линия выбора не будет останавливаться, если под ней существует информация в виде пробелов. Однако, если под каждой позицией линии выбора - пробел, то поле указателя будет заполнено без помощи опера- тора (как фиктивное поле). В этом случае, индекс повторения устанав- ливается в единицу, а функция CHOICE() - в нуль. Передвижение линии выбора вне структуры REPEAT клавишами управ- ления курсора (Cursor Up и Cursor Down), Tab или Revers (начиная с верха, с низу, с первой или с последней позиции, соответственно) за- полняет поле индексом повторения, установленным по последней позиции сообщения, и устанавливает функцию CHOICE() в ноль. Если используется атрибут REQ, то будет осуществляться "возврат" от верхней к нижней, от нижней к верхней, от первой к последней или последней или послед- ней к первой позиции линии выбора. В выходном поле, меню и полях паузы, клавиша управления курсо- ром Cursor Up работает как клавиша Esc, автоматически выбирая следую- щее поле в выходном сообщении. В текстовых полях, клавиша Cursor Up передвигает курсор на первую строку, затем перемещает переменную USE вертикально на ее первую линию, а затем работает как клавиша Esc. Оператор ACCEPT не "знает" поддерживает ли поле указателя пере- мещение или уже переместило на его первую линию. Таким образом, функ- ция Esc клавиши Cursor Up не является автоматической. Если требуется, эта функция может быть выполнена в рутине редактора поля указателя, использующей условный оператор SELECT(?-1). Поле POINT не определяет величину переменной USE. Атрибут USE может быть использован, однако, для создания поля-метки - например USE(?SELECTION) или USE(?POINTER). - 69 - 8.10. Открытие и закрытие экранов. 8.10.1. Оператор OPEN. Метка OPEN(экран) Оператор OPEN открывает структуру SCREEN. Параметр "экран" - это метка экранных операторов SCREEN или EXTERNAL. OPEN также исполь- зуется со структурами REPORT, DOS и FILE как описано в гл.9, 10 и 11. За один раз может быть активизирована только одна структура SCREEN. Если структура SCREEN, которую необходимо открыть, является основным экраном (оператор SCREEN не имеет атрибута WINDOW), оператор OPEN закрывает любую уже открытую структуру SCREEN, очищая видеомони- тор и затем открывает новую структуру SCREEN. Если структура SCREEN, которую необходимо открыть, является ок- ном(оператор SCREEN имеет атрибут WINDOW), оператор OPEN приостанав- ливает любую уже открытую структуру SCREEN, сохраняет видео память "за" окном, которое необходимо открыть, и затем открывает новую структуру SCREEN. Когда окно закрывается, сохраненная память восста- навливается и вновь открывает приостановленную структуру SCREEN. Когда открыта структура SCREEN, отображаются ее инициализиро- ванные строки(включающие все повторения повторяемых строк), и во входном сообщении выбирается первое поле структуры SCREEN. Переменные USE в операторах поля не отображаются (они могут быть отображены при помощи оператора DISPLAY). Строки операторов PAUSE отображаются толь- ко пока выбраны их поля паузы. 8.10.2. Оператор CLOSE. Метка CLOSE(экран) Оператор CLOSE закрывает структуру SCREEN. Параметр "экран" - это метка экранных операторов SCREEN или EXTERNAL. CLOSE используется также со структурами REPORT, DOS и FILE, как описано в Гл.9, 10 и 11. Если структура SCREEN, которую необходимо закрыть, является основным экраном (структура SCREEN не имеет атрибута WINDOW), оператор CLOSE стирает экран и закрывает структуру SCREEN. Если структура SCREEN, которую необходимо закрыть, является ок- ном (оператор SCREEN имеет атрибут WINDOW), восстанавливается память, сохраненная оператором OPEN. Этот процесс удаляет окно с видеомонито- ра. Затем окно закрывается и вновь открывается структура SCREEN, при- остановленная оператором OPEN. 8.11. Обработка полей экрана. 8.11.1. Поля в структуре SCREEN. Компилятор определяет каждому полю в структуре SCREEN последо- вательный номер поля, согласно этой структуры SCREEN (поля объявлен- ные операторами ENTRY, TEXT, MENU, PAUSE и POINT). Первое поле, объявленное в структуре SCREEN, является полем номер 1, второе поле - номер 2 и т.д. Поля действующих операторов используют эти последовательные но- мера полей для идентификации отдельных полей. Например ERASE (1,4) стирает поля номер 1 через 4 в структуре SCREEN. Номер поля также ис- пользуется в операторе IF и как выражения OF и OROF в структуре CASE. Зная, что если Вы вставляете новое поле в структуру SCREEN, номера полей расположенных ниже нового поля меняются, Вы имеете возможность корректировать каждый оператор в программе, которая ссылается на эти - 70 - поля. Атрибут USE оператора объявления поля разрешает эту проблему созданием метки, которая может быть использована для идентификации поля. Эта метка называется полем-меткой и состоит из знака ? перед параметром атрибута USE. (Если параметр атрибута USE уже содержит знак ?, параметр использует сам себя в качестве поля-метки). Для того чтобы создать поле-метку, компилятор генерирует опера- тор эквивалентности, который уравнивает номер поля и поле-метку. Сог- ласно этому, компилятор замещает присвоенный номер поля всякий раз, когда он сталкивается с полемметкой. Например, если первое поле в структуре SCREEN имеет атрибут USE(NAME), компилятор автоматически генерирует: ?NAME EQUATE(1) Согласно этому, каждый раз когда компилятор найдет ?NAME, он заместит его на 1. Если поле было дополнено перед этим полем, ?NAME должен стать вторым полем в структуре SCREEN, и компилятор автомати- чески заместит его на 2. Большинство вводимых новых полей (оператором ACCEPT) называются "здесь" - поля и имеют вид одиночного знака ?. "Здесь" поле-метка создается вручную для обобщения рутин редактора, которые используются с полями, объявленными в составной структуре SCREEN. Например, DISPLAY(?) отображает переменную USE для большинс- тва недавно введенных полей - в любой структуре SCREEN. (Этот оператор эквивалентен DISPLAY(FIELD()).) "Здесь" поле-метка также может быть использовано в выражениях из целочисленных констант. Например, выражение ?+2, понимается как "прошли два поля туда, где я нахожусь в данный момент". Таким образом SELECT(?+?ZIP? NAME+1) может быть использовано как "прогон прошел с быстрым кодированием поля". Этот оператор невозможно будет изменить, если поле было вставлено между ?NAME и ?ZIP. 8.11.2. Оператор DISPLAY. Форма 1: Метка DISPLAY Форма 2: Метка DISPLAY(поле) Форма 3: Метка DISPLAY(первое поле, последнее поле) DISPLAY оператор высвечивает USE-переменные. Параметры, обычно представленные полем-меткой, являются целочисленными выражениями, со- держащими номера полей (см. "Поля в структуре SCREEN" в этой главе). DISPLAY может использоваться с полем входных данных, текста, меню. USE-переменная формируется согласно изображению поля и потом появляется в позиции поля на экране. Форма 1 DISPLAY отображает все входные, текстовые, менюполя в SCREEN-структуре. Форма 2 отображает единственное поле, определяемое параметром поля. Форма 3 отображает все входные, текстовые и меню-по- ля в пределах от параметра первого поля до параметра последнего поля. 8.11.3. Оператор UPDATE. Форма 1: Метка UPDATE Форма 2: Метка UPDATE(поле) Форма 3: Метка UPDATE(первое поле, последнее поле) UPDATE оператор корректирует USE - переменные от величины поля, отобранного на экране. Параметры, обычно представленные полями-метка- ми, являются численными выражениями, содержащими номера полей (см."Поля в структуре SCREEN" в этой главе). - 71 - UPDATE можно использовать с входными, текстовыми и меню-полями. Величина, отображенная в поле, изменяется согласно формата поля и за- тем пересылается в USE-переменной. (Типы данных модифицируются сог- ласно "Правилам преобразования данных", описанным в главе 5). Форма 1 UPDATE корректирует USE-переменные для всех входных, текстовых и полей-меню в SCREEN-структуре. Форма 2 корректирует USE-переменную для единственного поля, оп- ределенного параметром поля. Форма 3 корректирует USE-переменные для всех входных, текстовых и меню полей от параметра первого поля до параметра последнего поля. USE-переменные обычно корректируются автоматически после запол- нения поля. UPDATE-оператор полезен прежде всего в 2-х случаях. Во-первых, когда клавиши готовности завершают поле, но не корректиру- ют USE-переменную. Используйте UPDATE в поле редактора для корректи- ровки USE-переменной там, где необходимо. Во-вторых, в ситуации мно- гократного использования, используйте UPDATE для обновления USE-переменных после HOLDing записи, предшествующей PUT. 8.11.4. Оператор ERASE. Форма 1: Метка ERASE Форма 2: Метка ERASE(поле) Форма 3: Метка ERASE(первое поле, последнее поле) ERASE оператор стирает поля на экране и проявляет их соответс- твующие USE-переменные. Параметры, обычно представленные полями-мет- ками, являются численными выражениями, содержащими номера полей. (См."Поля в структуре SCREEN" в этой главе). ERASE может быть использован с входными, текстовыми и менюполя- ми. Поля стираются по всей длине. Числовые USE-переменные заменяются нулями, а строковые USE-переменные - пробелами. Форма 1 ERASE стирает все входные, текстовые и меню-поля в SCREEN-структуре. Форма 2 стирает единственное поле, определенное па- раметром "поле". Форма 3 стирает все входные, текстовые и меню-поля от параметра "первое поле" до параметра "последнее поле". 8.11.5. Оператор SELECT. Метка SELECT(поле) SELECT оператор выбирает следующее поле, в которое необходимо войти. Параметр "поле", обычно представленный полем-меткой, является численным выражением, содержащим номер поля. (См."Поля в структуре SCREEN" в этой главе). OPEN-оператор автоматически выбирает первое поле в структуре экрана. Когда ACCEPT-оператор завершается, он автоматически выбирает поле следующее за принятым полем. Используйте SELECT-оператор для то- го чтобы игнорировать автоматический выбор поля. ACCEPT-оператор вводит данные в выбранное поле. Выбранное поле это не всегда то поле, в которое вводят данные, потому что пользова- тель может перейти к другому полю нажатием клавиши Esc. Если не выб- рано какое-либо поле, ACCEPT начинает ввод данных в поле, следующее за последним обработанным. SELECT-оператор ликвидирует любой предыдущий SELECT-оператор. 8.11.6. Оператор ACCEPT. Метка ACCEPT ACCEPT-оператор начинает ввод данных в выбранное поле в откры- - 72 - той SCREEN-структуре. Поле выбирается используя SELECT-оператор. Если поле не было выбрано, ACCEPT начинает ввод в то поле, которое следует за последним обработанным полем. ACCEPT-оператор не имеет параметров. Для входного или текстового поля ACCEPT изображает USE-переменную в реверсивном виде, отображает курсор, вводит в действие клавиатуру, и ждет пока пользователь запишет входную величину. Когда пользователь заполняет поле, входная величина расформатируется согласно формату поля и пересылается в USE-переменную. (Типы данных изменяются соглас- но "Правилам преобразования данных", описанных в главе 5). Для меню-поля и поля-указателя ACCEPT изображает выбор меню в реверсивном виде, подключает клавиатуру, и ждет, чтобы пользователь высветил другой вариант. Когда пользователь заполняет поле, CHOICE() функция возвращает относительную позицию высвеченного элемента. Для поля-меню, USE переменная устанавливается в величину высвеченного элемента. Для поля-указателя индекс повторения устанавливается в ве- личину высвеченного элемента. Для поля-паузы ACCEPT изображает параметр PAUSE-оператора, подключает клавиатуру и ожидает признак клавиши. Любой признак клави- ши, кроме ESC, заполняет поле-паузы. KEYCODE()-функция возвращает ве- личину признака клавиши. Пользователь может войти в выбранное поле или нажать Esc клави- шу, чтобы выбрать другое поле. После ACCEPT-оператора Field()-функция возвращает номер входного поля. 8.12. Фyнкции, пpимeняeмыe к экpaнaм. 8.12.1. Функция ROW. Форма 1: ROW() Форма 2: ROW(экран) Форма 3: ROW(поле) Форма 4: ROW(переменная) ROW-функция выдает данное целое число, содержащее "физическую" позицию строки на экране. Физическая позиция необязательно то же са- мое, что и позиция строки в SCREENструктуре, так как окно может быть меньше, чем целый экран и нефиксированным. В форме 1 ROW() выдает физическую строку последнего обращения к памяти экрана. В форме 2 ROW(экран) выдает физическую строку верхнего левого символа определенного экрана. (Эта самая строка будет определена па- раметром строки AT-атрибута). В форме 3 ROW(поле) выдает физическую строку номера определен- ного поля на активном экране. Если переменная повторяется, выдаваемая величина зависит от величины индекса повторения. В форме 4 ROW(переменная) выдает физическую строку определенно- го экрана STRING переменной. Если переменная повторяется, выдаваемая величина зависит от величины индекса повторения. 8.12.2. Функция COL. Форма 1: COL() Форма 2: СOL(экран) Форма 3: COL(поле) Форма 4: COL(переменная) СOL-функция выдает длинное целое число, содержащее физическую позицию колонки на экране. В форме 1 COL() выдает физическую колонку последнего обращения - 73 - к памяти экрана. В форме 2, COL(экран) выдает физическую колонку верхнего ле- вого символа определенного экрана. (Эта же колонка будет определена параметром колонки AT-атрибута, если необходимо). В форме 3, COL(поле) выдает физическую колонку номера опреде- ленного поля на активном экране. Если поле повторяется, то выдаваемая величина зависит от величины индекса повторения. В форме 4, COL(переменная) выдает физическую колонку определен- ного экрана STRING переменной. Если переменная повторяется, выдавае- мая величина зависит от величины индекса повторения. 8.12.3. Функция FIELD. FIELD() - функция выдает длинное целое число, содержащее номер последнего полученного поля. FIELD() не имеет параметров. 8.12.4. Функция CONTENTS. CONTENTS(поле) CONTENTS()- функция выдает строку, содержащую компоненты вход- ного поля или поля-меню. Параметр "поле", обычно представленный полем -меткой, является числовым выражением, содержащим номер поля. Для горизонтальных строк, CONTENTS() выдает полную длину USE-переменной, не только часть, которая отображена. Для числовых по- лей CONTENTS() выдает величину USE-переменной. 8.12.5. Функция ROWS. Форма 1: ROWS() Форма 2: ROWS(экран) Форма 3: ROWS(поле) Форма 4: ROWS(переменная) ROWS-функция выдает данное целое число, содержащее число строк в окне или структуре повторения. В форме 1 ROWS() выдает число строк последнего значения памяти экрана. В форме 2 ROWS() (экран) выдает число строк определенной струк- туры экрана.(Это число будет параметром строк WINDOW-атрибута, или =25, если говорить о базовом экране). В форме 3 ROWS(поле) выдает число строк определенного поля на активном экране. ROWS(поле) обычно выдает единицу. Однако, он выдает 0 для фиктивного поля или меню без "картинки", а когда он использует- ся с POINT или TEXT, то будет работать как показано в этом примере: POINT(3,20) - ROWS returns 3 TEXT(10,60) - ROWS returns 10 В форме 4 ROWS(переменная) возвращает число строчек в перемен- ной определенного экрана. ROWS(переменная) всегда выдает единицу. 8.12.6. Функция COLS. Форма 1: COLS() Форма 2: COLS(экран) Форма 3: COLS(поле) Форма 4: COLS(переменная) СOLS-функция выдает длинное целое число, содержащее число коло- нок в окне или структуре повторения. - 74 - В форме 1 COLS() выдает число колонок последнего значения памя- ти экрана. В форме 2 COLS(экран) выдает число колонок определенной струк- туры экрана.(Это число будет равно параметру колонок WINDOW - атрибу- ты, если он используется, или равно 80, если это базовый экран). В форме 3 COLS(поле) выдает число колонок определенного поля в активном экране (повторяемом или нет). Он выдает 0 при фиктивном поле или меню без картинки; или размер строковой константы или переменную при PAUSE. В форме 4 COLS(переменная) выдает число колонок в переменной определенного экрана. 8.12.7. Функция FIELDS. FIELDS() функция выдает данное целое число, содержащее число полей в открытой SCREEN-структуре. Если SCREEN - структура не откры- та, FIELDS() выдает 0. 8.12.8. Функция CHOICE. СHOICE - функция выдает данное целое число, содержащее относи- тельную позицию элемента меню, выбранного в последнем поле-меню или поле-указателе. Если не был выбран элемент меню, CHOICE выдает 0. 8.13. Ввод данных в поля. С точки зрения программиста, входное сообщение возникает во время выполнения ACCEPT или ASK-оператора, в котором может быть боль- шая сложная программа. С точки зрения пользователя, программа почти всегда выполняет ACCEPT или ASK операторы, и промежуток, возникающий между входными сообщениями называется временем реакции. Пользователь входит в поля на экране в последовательности, оп- ределенной программой или выбирает другое поле, используя клавиши уп- равления курсором. Пользователь может двигаться вперед по экрану, входя в поля с помощью клавиши входа (Enter), или назад по экрану, нажав клавишу Esc. Esc-клавиша не выбирает то поле, в которое не было вхождения (если это не первое поле на экране или оно не является параметром Esc -атрибута). Следовательно, поля,просматриваемые вперед, будут прос- матриваться и назад - небольшая, но очень полезная характеристика (признак). Активное входное поле отображается реверсивно. Это делается по двум причинам: во-первых, это показывает размеры входного или тексто- вого поля. Клавиши выбора поля используются, чтобы двигаться от поля к полю. * Enter - входное сообщение заполняет активное поле и выбирает следу- ющее поле для входа. * Сursor Down - то же самое, что и Enter клавиша для полей ENTRY, TEXT, PAUSE и поле POINT. Заполняет невостребованное MENU-поле, но без выбора. Заполняет востребованное MENU-поле, если оно имеет только одну строку элементов. * Esc - восстанавливает измененное (модифицированное) поле до его на- чальной величины, и если нажать ее опять, то выбирает предыдущее поле для входного сообщения. * Cursor-Up - то же самое, что и Esc-клавиша для ENTRY, TEXT,PAUSE и невостребованных меню-полей. То же самое, что Esc-клавиша для вост- ребованного MENUполе, если оно имеет хотя бы одну строку элементов. То же самое, что Enter клавиша для невостребованных полей указате- ля. 8.13.1. Строковые поля. Строковое поле изображено реверсивно, и курсор размещается в символе левой позиции. Курсор продвигается по мере того, как записы- - 75 - вается каждый символ. Существуют 2 способа строкового ввода. При пе- резаписи новый символ отображается на позиции курсора, заменяя то, что было там раньше. При вставке символы справа от курсора перемеща- ются вправо, освобождая место для нового символа. Курсор под меткой означает перезапись, а полублочный курсор означает вставку. OVR и INS -атрибуты ENTRY-оператора начинают обработку поля в режиме перезаписи и вставке, соответственно. Во время входа в поле, INS-клавиша нахо- дится либо в перезаписи, либо во вставке. Если USE-переменная больше, чем ее строковое поле, поле распо- лагается горизонтально. Нажатием клавиши Home в первой позиции поля устанавливается первый символ строки над курсором. Нажатием клавиши End в последней позии поля, устанавливается последний символ строки над курсором. Нажатием клавиши <- в первой позиции или клавиши -> в последней позиции устанавливается символ первой строки. Вход символа в последнюю позицию поля сдвигает строку на один символ влево, чтобы обеспечить место для нового символа. Когда осуществлен ввод символа в последнюю позицию, курсор сдвигается с поля вправо. Клавиши Home, End, Tab, Reverse Tab, Cursor Left и Cursor Right возвращают курсор в поле. Все другие клавиши "сигналят". В строковое поле входят нажатием Enter клавиши, следующие клавиши используются в строковых полях. * Cursor Left - продвигает курсор назад (возможно изображение двига- ется вправо). * Cursor Right - продвигает курсор вперед (возможно изображение вле- во). * Home - устанавливает курсор в первую позицию (возможно устанавлива- ется начало данных) на позицию курсора. * Ctrl-Home - стирает поле и устанавливает курсор в первую позицию. * End - устанавливает курсор в последнюю позицию (возможно конец дан- ных устанавливается на позицию курсора). * Сtrl-End - стирает от курсора до конца поля. * Ins - устанавливает символ на место курсора и сдвигает его вправо. * Del - стирает символ над курсором и сдвигает его влево. * Backspace - продвигает курсор назад и освобождает новую позицию (сдвигает изображение влево при вставке). * Tab - продвигает к следующей метке табуляции (каждые 8 позиций). * Reverse Tab - возвращает на предыдущую метку табуляции(каждые 8 по- зиций). 8.13.2. Числовые поля. Существует два режима числового ввода. В режиме вставки число- вое поле отображается реверсивно и блочный курсор помещается в пози- цию компонентов поля. Как только записаны числовые символы, курсор остается в том же положении, а форматированное входное сообщение сдвигается влево, освобождая место для нового символа. Для дробных чисел клавиша точки устанавливает курсор над позицией десятых. Потом курсор продвигается по мере того, как записываются дроби. Когда запи- сано максимальное число символов, входное сообщение не перемещается влево. Любые другие клавиши "сигналят" и игнорируются. При перезаписи числовое поле изображается реверсивно, и курсор помещается в левой позиции. По мере того как записываются числовые символы, они размещаются на позиции курсора, заменяя то, что там было до этого. Курсор продвигается вслед за записью каждого символа, одна- ко, курсор не остановится над символами редактирования(специальными символами, находящимися на картинке). Если символ редактирования записан в режиме перезаписи, курсор помещается в позицию цифры, следующей за этим символом на картинке. Записанные цифры выравниваются вправо, чтобы ликвидировать оставлен- ные пробелы. Когда вводят в позицию последнего символа, курсор сдви- гается с поля вправо. Home, End, Tab, Reverse Tab, Cursor Left и - 76 - Cursor Right - клавиши возвращают курсор на поле. Все остальные кла- виши "сигналят". В числовое поле можно войти, нажав Enter, Plus или Minus - кла- виши. Enter и Plus - клавиши вводят положительные числа; Minus - кла- виша вводит отрицательное число. (Серый Plus и серый Minus можно так- же применять). OVR и INS - атрибуты оператора ENTRY начинают обработку поля соответственно в режимах перезаписи и вставки. Во время ввода в поле INS клавиша находится между режимом перезаписи и режимом вставки. Следующие клавиши управления используются в числовых полях. * Backspace - стирает последнюю введенную цифру и переформатирует входное сообщение. * Minus - делает отрицательным и вводит в поле. * Plus - делает положительным и вводит в поле. 8.13.3. Поля-меню и поля-указатели. При входе в поле-меню и поле-указатель, выбранный вариант всег- да высвечивается реверсивно или выделяется определенным набором цве- тов. Курсор не используется. Сursor Left, Cursor Right, Cursor Up, Cursor Down, Tab, Reverse Tab, Home или End клавиши могут быть ис- пользованы, чтобы высветить другой вариант. Клавиши Cursor Up и Cursor Down работают, если варианты появляются более, чем на одной линии, а клавиши Cursor Left и Right работают, если варианты возника- ют более, чем в одной колонке. Непосредственные поля-меню следует использовать только, когда каждая строка-меню начинается с другого символа. Если IMM не опреде- лен на меню-поле, запись первого символа элемента меню высвечивает этот вариант, но не заполняет поле. IMM - атрибут описывается в этой главе с примерами операторов ENTRY и MENU. Tab и Reverse Tab - клавиши просматривают эти варианты в той последовательности, в которой они были объявлены. Если поле востребо- вано (REQ атрибутом), попытка просмотра после последнего варианта или до первого варианта заканчивается возвращением к первому или послед- нему элементу, соответственно. Клавиши Home и End размещают варианты на первом и последнем элементе, соответственно. Enter клавиша выбира- ет реверсивный вариант. Любая клавиша внутри ASKII-кода в пределах от 32 до 126, так же как Ins, Del, PgUp, PgDn, Ctrl-PgUp и Ctrl-PgDn - клавиши являются клавишами заполнения поля для полей - POINT. Cледующие клавиши ис- пользуются, чтобы выбрать и войти в поля - MENU и POINT: * Cursor Up - высвечивает ближайший вариант сверху. Если курсор на верхней строчке и запрошено поле,курсор перемещается вниз, высвечи- вая выбранный вариант. Если курсор на верхней строчке и поле не запрошено, в MENU, он переходит на предыдущее поле; в POINT, он за- вершает (заполняет) поле. Если MENU запрошено, но состоит из эле- ментов меню в единственной строчке, невозможно вернуться к нижнему варианту, поэтому MENU-поле стирает предыдущее поле. * Cursor Down - высвечивает ближайший вариант снизу. Если курсор вни- зу, и поле запрошено, высвечивает вариант сверху. Если курсор вни- зу, и поле не запрошено в MENU, он заполняет поле, не делая выбора; в POINT он заполняет поле. Если MENU состоит из элементов меню в единственной строчке. Невозможно вернуться к варианту на верхней строчке, поэтому MENU-поле завершается. В этом случае, если поле не запрошено, CHOICE-функция дает 0, и USE-переменная не корректирует- ся. * Cursor Left - высвечивает ближайший вариант слева. * Сursor Right - высвечивает ближайший вариант справа. * Tab - высвечивает следующий объявленный вариант. От последнего ва- рианта к первому варианту, если в этом нет необходимости, поле за- вершается. - 77 - * Reverce Tab - высвечивает предыдущий объявленный вариант. Если тре- буется, курсор перемещается от первого варианта к последнему, если не требуется, поле стирается. * Home - высвечивает первый вариант. * End - высвечивает последний вариант. * Ins - заполняет поля указатели. * Del - заполняет поля указатели. * PgUp - заполняет поля указатели. * PgDn - заполняет поля указатели. * CtrlPgUp - заполняет поля-указатели. * CtrlPgDn - заполняет поля-указатели. * Enter - заполняет поля меню и поля указатели. 8.14. Paзмeщeниe cтpyктyp экpaнa. Существует два главных правила расположения SCREEN-структур в программе: Правило 1: глобальные данные не должны содержать SCREENструкту- ру с USE-атрибутом. Правило 2: процедура или функция не должны иметь более одной SCREEN - структуры. Согласно правилу 1 USE-атрибут в глобальных данных создает гло- бальное поле-метку, кот. не могут взаимодействовать с локальным полем -меткой этого же типа. По правилу 2, если две SCREEN-структуры постоянно находятся в одной и той же процедуре или функции, эта же самая невозможность вза- имодействия поля-метки происходит между USE-атрибутами в первой и во второй SCREEN структурах. Конечно, эта невозможность взаимодействия происходит также в любой структуре экрана, содержащей 2 USE-атрибута с идентичными параметрами, но оно более очевидно. Другое преимущество ограничивающих процедур и функций перед единственной экранной структурой вытекает из RETURNоператора. RETURN автоматически закрывает любую SCREEN -структуру, которая была открыта в процедуре или функции. Размещение SCREEN-структуры в ее процедуре исключает любую возможность грубой ошибки, которая может произойти из -за неудачной попытки закрыть окно. В этом случае, программа создава- ла бы экран за окном (который приостанавливается), пока окно все еще открыто и отображено - ситуация, которую трудно исправить. Как всегда из этих правил есть исключения. Возможно программа имеет только одну SCREEN-структуру. Почему бы не поместить ее в гло- бальные данные. А некоторые SCREEN- структуры не имеют USE-атрибутов. Например, в применении "Опустить окно", CHOICE-функция дает возмож- ность ввода программисту, поэтому все окна могут находиться вместе в одной процедуре. Как бы то ни было, конфликты поля-метки не имеют значения, если на них нет ссылки. 8.15. Корректировка разделяемых файлов. Если экранные процедуры на двух рабочих терминалах корректируют одинаковую запись в совместно-используемом файле одновременно, изме- нения в одном или другом терминалах могут быть потеряны. Последова- тельность может быть следующей: терминал А читает запись, терминал В читает запись, терминал А пишет запись обратно, терминал В записывает обратно. Все изменения, сделанные терминалом А перезаписываются тер- миналом В. HOLD - оператор может быть использован для получения внешнего управления записью.(Cм."Совместные Clarion-файлы" в главе 11). Запись не должна задерживаться в течение всего того времени, пока програм- мист рассматривает изменения. Это может вызвать неприемлемую задержку для других терминалов, ожидающих той же записи. Данный экран исполь- зуется для корректировки файла вендора. Вендорная запись (префикс: VEN) является глобальной. - 78 - 9. Обработка отчетов. Эта глава описывает операторы и функции, которые используются, чтобы отпечатать строку символов или отчет на принтере или записать его в файл на диске. PRINT- оператор обеспечивает достижение данной цели. Если параметр PRINT является строкой символов, она посылается в принтер, соединенный по первому параллельному порту. Если параметр является меткой режима печати, входящей в струк- туру отчета - Clarion, он форматируется и посылается на устройство или файл, определенный структурой отчета. Структура отчета содержит форматы для заголовка, окончания и каждой строки, которые составляют формат отчета. Структура отчета также содержит атрибуты, которые определяют ширину и длину страницы, имена переменных, которые должны быть ис- пользованы для счетчиков линий и страницы, а также имя устройства или файла, которые должны быть использованы для вывода. Строки форматиру- ются позиционными атрибутами, которые определяют позицию строки и ко- лонки и последовательности управления печатью. Структура отчета управляет заполнением страницы автоматически. Когда печатается последняя строка на странице, внизу может записы- ваться строка окончания, вверху следующей страницы может записываться заголовок отчета. Соответствующим образом корректируются счетчики страницы и строки. При открытии отчета записывается первый заголовок, при закры- тии отчета записывается окончание. Структура отчета может быть созда- на с помощью возможностей Clarion-редактора по форматированию отче- тов. Формат отчета "рисуется" на экране с использованием клавиатуры, потом редактор автоматически строит соответствующий исходный код. И форматировщик отчета может считывать и отображать структуру отчета, т.о. оно может снова и снова изменяться. 9.1. Структура отчета. 9.1.1. Оператор Report. Метка REPORT REPORT-структура объявляет формат отчета. Она включает REPORT-оператор и операторы, следующие за ним до ее окончания или до оператора End. Метка REPORT-оператора используется как параметр OPEN и CLOSE операторов для отчета и NAME-функции. PRE,WIDTH,LENGTH,PAGE,LINE и DEVICE-атрибуты могут быть использованы с REPORT-оператором. REPORT-структура включает необязательную HEADER-структуру, со- держащую строчки, которые должны печататься в верхней части каждой страницы, необязательную FOOTER-структуру, включающую строки, которые должны печататься внизу каждой страницы, и 1 или более DETAIL-струк- туры, в которые входят строчки, печатаемые в основной части сообще- ния. Печатаемые строчки состоят из STRING-операторов и CONTROL -опе- раторов. STRING-операторы объявляют символы, которые следует печа- тать, а CONTROL-операторы объявляют последовательность управления принтером, которая определяет функционирование принтера. Позиционные атрибуты ROW и COL являются разделителями (как OF в CASE-структуре), которые обеспечивают позицию строки и колонки, используемых следующим STRING-оператором. Позиционный атрибут CTL также является разделите- лем оператора, обеспечивающим постоянную последовательность управле- ния принтером. Каждая строка в REPORT-структуре должна заканчиваться знаком перевода строки до тех пор, пока это необходимо. В перевод строки мо- жет быть включен позиционный атрибут CTL(@LF). - 79 - Чтобы начать новую страницу, знак перевода страницы должен быть помещен перед первым оператором STRING в HEADER -структуре или после последнего оператора STRING в FOOTER -структуре. В перевод страницы может входить позиционный атрибут CTL(@FF). Если знак перевода страницы помещается в HEADER-структуре, со- общение всегда будет выравнено, но ему всегда будет предшествовать чистая страница. Помещение знака перевода страницы в FOOTER-структуре ликвидирует пустую страницу, но сообщение не будет выравнено, если принтер не находится в верхней части страницы, когда начинает печа- таться сообщение. REPORT-структура открывается OPEN-оператором и закрывается CLOSE-оператором. (Cм."Примеры процедуры сообщения" в конце этой гла- вы на примере REPORT-структуры). 9.1.2. Атрибут WIDTH. WIDTH(ширина страницы) Атрибут WIDTH оператора REPORT определяет ширину формата сооб- щения. Параметр "ширина страницы" - целочисленная константа, содержа- щая максимальное количество символов в самой длинной строке сообще- ния, выводимого на печать. "Ширина страницы" должна быть в пределах от 1 до 255. Формати- ровщик сообщения в редакторе Clarion использует атрибут WIDTH для центровки текста и для горизонтального скроллинга. WIDTH может ис- пользоваться только с оператором REPORT. 9.1.3. Атрибут LENGTH. LENGTH(длина страницы) Атрибут LENGTH оператора REPORT определяет длину формата сооб- щения. Параметр (длина страницы) - целочисленная константа, содержа- щая максимальное количество строк, которые должны быть напечатаны на странице. LENGTH может использоваться только с оператором REPORT. Ве- личина "длина страницы" минус количество строк в структурах HEADER и FOOTER это возможное количество строк для печати структур DETAIL. После печати всех строк страницы, оператор PRINT автоматически печа- тает окончание и заголовок следующей страницы. (См."Переполнение страницы" в конце этой главы). Некоторые принтера дают возможность определять вертикальный формат. Если принтер получает меньше строк, чем объявлено атрибутом LENGTH, он автоматически формирует перевод страницы. Для того чтобы подключиться к такому принтеру, необходимо установить атрибут LENGTH в пределах печатаемой области. Например, если принтер должен автома- тически переходить на следующую страницу через 60 строк, то LENGTH устанавливается в 59. 9.1.4. Атрибут PAGE. PAGE(счетчик страниц) Атрибут PEGE оператора REPORT определяет переменную, которая используется в качестве счетчика страниц. Параметр "счетчик страниц" - метка целочисленной переменной. Счетчик страниц содержит номер текущей печатаемой страницы. Счетчик страниц устанавливается в единицу при открытии сообщения, и увеличивается каждый раз при переполнении страницы, или когда печата- ется HEADER оператором PRINT. (См."Переполнение страницы" в конце - 80 - этой главы). Счетчик страниц устанавливается или увеличивается до корректи- ровки любой переменной USE в HEADER. Однако, HEADER может печатать текущий номер страницы в виде строковой переменной, объявленной USE-атрибутом, который содержит имя счетчика страниц. Счетчик страниц устанавливается в единицу только один раз при открытии сообщения, а затем последовательно только увеличивается. Величина счетчика страниц может быть изменена оператором присваивания. 9.1.5. Атрибут LINE. LINE(счетчик строк) Атрибут LINE оператора REPORT определяет переменную, которая используется в качестве счетчика строк. Параметр "счетчик строк" - это метка целочисленной переменной. Счетчик строк содержит номер текущей печатаемой строки. Счетчик устанавливается в единицу при открытии сообщения печати HEADER или каждый раз при переполнении страницы, и увеличивается каждый раз при печати строки HEADER, FOOTER или DETAIL. HEADER может быть напечатан оператором PRINT, или автоматически, когда открывается сообщение или когда печать строки DETAIL вызывает переполнение страницы. (См. "Пе- реполнение страницы" в конце этой главы). Cчетчик строк устанавливается или увеличивается до корректиров- ки любой переменной USE в HEADER, FOOTER или DETAIL структурах. Одна- ко, HEADER, FOOTER или DETAIL структуры могут печатать номер текущей строки в виде строковой переменной, объявленной атрибутом USE, кото- рый содержит поля счетчика строк. Счетчик строк устанавливается в единицу только один раз, а за- тем только увеличивается. Величина счетчика может быть изменена опе- ратором присваивания. Изменение величины счетчика не влияет на пере- полнение страницы. Отдельный "внутренний счетчик строк" используется для управления переполнением страницы. 9.1.6. Атрибут DEVICE. DEVICE(устройство) Атрибут DEVICE оператора REPORT определяет устройство, на кото- рое выводится сообщение. Параметр "устройство" - переменная или стро- ковая константа, которая содержит имя устройства DOS или специализа- цию файла. Имена устройств DOS см.ниже. Если "устройство" это имя устройства DOS, то сообщение записывается в монитор консоли или в па- раллельный/последовательный порт. Сообщение записывается на консоль, начиная с курсора. (Оператор SETCURSOR, описанный в гл.7, может быть использован для установки курсора). Если параметр "устройство" не найден в системе устройств DOS, он воспринимается как спецификация файла, и сообщение записывается в требуемый файл. Если файл существу- ет,информация будет в него помещена. Если файл не существует, он бу- дет создан. Если в спецификации файла отсутствует устройство и путь доступа к файлу, используются текущий рабочий том и дорожка. Если спецификация неверна или отсутствует атрибут DEVICE, то сообщение за- писывается в LPT1. Сообщения могут быть направлены на следующие устройства: CON - консоль PRN - первый параллельный порт LPT1 - первый параллельный порт LPT2 - второй параллельный порт LPT3 - третий параллельный порт - 81 - AUX - первый последовательный порт СOM1 - первый последовательный порт СOM2 - второй последовательный порт NUL - ноль (нет выбранных устройств) 9.2. Позиционные атрибуты. В структуре REPORT используются позиционные атрибуты: ROW, COL и CTL(ROW и COL также используются в структуре SCREEN). ROW и COL оп- ределяют координаты строки в формате сообщения. Например, строка в ROW(5) и COL(6) появляется в 5-ой сверху строчке и с 6-ой позиции слева на странице. Компилятор генерирует знак переполнения для пере- вода страницы, возврата каретки или резервирования пространства, если необходимо разместить строку в определенной позиции. CTL определяет последовательность управления печатью между строками. Эта последовательность для установки размеров формата, граф табулятора, специальные шрифты и т.д. Эта последовательность кодирует действия принтера и не печатается. Позиционные атрибуты ROW, COL и CTL служат разделителями опера- тора (как THEN в структуре IF или OF в структуре CASE). Разделитель оператора завершает позиционные атрибуты оператора, которые не могут быть помещены в оператор. Например, следующий оператор неверен и ком- пилятор генерирует ошибку: STRING(10),COL(23),USE(DESC) 9.2.1. Позиционный атрибут ROW. Фоpма 1: ROW(стpока) Фоpма 2: ROW(стpока, колонка) Фоpма 3: ROW Фоpма 4: ROW(+ или - стpоки) Фоpма 5: ROW(+ или - стpоки, колонка) Позиционный атpибут ROW указывает позицию стpоки и столбца для следующего опеpатоpа STRING в стpуктуpе REPORT. ROW пpоизводит пеpевод стpаниц, пеpевод стpок, возвpат каpетки и пpобелы, необходи- мые для pазмещения стpоки символов в указанной для нее позиции. Паpаметpы "строка", "строки" и "колонка" являются выpажениями числовых констант, указывающих позицию следующего опеpатоpа STRING. Фоpмы 1 и 2 атpибута ROW запpашивают опpеделенный номеp стpоки. Пеpвый запpос опpеделенной стpоки в стpуктуpе HEADER, FOOTER или DETAIL пpиводит к пеpеводу стpаницы, пеpеводам стpок ("строка" - 1) и возвpату каpетки. Дpугие запpосы опpеделенной стpоки пpиводят с пеpеводам стpок, если паpаметp "строка" больше стpоки, использованной для пpедыдущего опеpатоpа STRING. Если паpаметp "строка" меньше стpоки, использованной для пpеды- дущего опеpатоpа STRING, то следующая стpока символов будет напечата- на на новой стpанице. Фоpмы 3, 4 и 5 атpибута ROW пpиводят к пеpеводу стpок такое ко- личество pаз, сколько указано паpаметpом "строки", а за ними следует возвpат каpетки. Фоpма 3 означает "следующая стpока" и аналогична атpибуту ROW(+1). В Фоpмах 4 и 5 атpибут ROW(+0) может быть использо- ван для печати повеpх напечатанной стpоки. Паpаметp "колонка" в Фоpмах 2 и 5 указывает количество пpобе- лов, котоpыми должны pазделяться стpоки символов. - 82 - 9.2.2. Позиционный атрибут COL. Форма 1: 1 0 COL(колонка) Форма 2: 1 0COL(+колонки) Позиционный атрибут COL определяет позицию колонки следующей строки в структуре REPORT. COL резервирует пространство, которое не- обходимо для размещения в определенной им позиции. Параметры "колон- ка" и "колонки" - целочисленные константы, которые определяют позицию следующего оператора STRING. 1 форма атрибута COL должна иметь определнный номер колонки. Если параметр "колонка" больше, чем номер позиции последнего символа предыдущего оператора STRING, COL создает пространство для размещения следующей строки, начиная с позиции, определяемой "колонка". Если "колонка" меньше, чем позиция последнего символа предыду- щего оператора STRING, COL возвращает каретку и создает (колонка-1) пробелов, в качестве заполнителя между первым символом строчки и сле- дующим оператором STRING. Использование принтера в таком режиме бес- полезно тратит время и поэтому нежелательно. Хотя атрибуты COL могут быть расположены до, после или между операторами в структуре REPORT, в этом описании они располагаются до оператора, на который они ссылаются - с новой строки сразу после ат- рибута ROW. Этот формат также используется форматировщиком сообщения редактора Clarion. 9.2.3. Позиционный атрибут CTL. CTL определяет последовательность управления принтером в струк- туре REPORT. Параметр "управляющая последовательность" - строковая константа или символ управления принтером, содержащие последователь- ность управления принтером. (Символы управления принтером см.ниже). Последовательность управления принтером - символы, которые не печата- ются, но используются для управления работой принтера. CTL могут ис- пользоваться только в структуре REPORT. Параметр атрибута CTL - строковая константа, не может быть из- менен во время выполнения программы. Оператор CONTROL (описанный поз- же в этой главе) может быть использован для объявления строковй пере- менной, содержащей последовательность управления принтером, которая может быть изменена программой. 9.2.4. Символы управления принтером. Символы управления принтером - строковые константы, которые со- держат общие последовательности управления принтером. Как и все сим- волы, эти символы начинаются со знака @. Символы управления принтером обычно используются в качестве параметра атрибута CTL или оператора PRINT. Символы управления принтером: @FFn - выполнение формата (ASCII 12) n раз, затем возврат каретки (@FF=@FF1) @LFn - перевод строчки (ASCII 10) n раз, затем возврат каретки (@LF=@LF1) @CRn - возврат каретки (ASCII 13) n раз (@CR=@CR1) @Bn - вставка n пробелов (n - любое целое число) 9.3. Объявление строк для печати. 9.3.1. Структура HEADER. Метка HEADER Структура HEADER объявляет строки, которые должны быть вверху - 83 - каждой страницы. При выводе сообщения она включает оператор HEADER и операторы, следующие за ним до конца структуры или оператора END. Структура HEADER может быть только в структуре REPORT. C HEADER может использоваться атрибут PRE. Структура HEADER может представлять из себя группу переменных в операторах присваивания, выражений или списочных параметров. В этом контексте, структура HEADER рассматривается как объявление GROUP. Возврат каретки - автоматически по последнему байту структуры HEADER. Возможно, но не необходимо, использование оператора PRINT в структуре HEADER. Первый заголовок сообщения печатается при открытии сообщения, а остальные заголовки печатаются автоматически по перепол- нению страниц. 9.3.2. Структура FOOTER. Метка FOOTER Структура FOOTER объявляет строки, которые должны быть напеча- таны в конце каждой страницы при выводе сообщения. Она включает опе- ратор FOOTER и операторы, следующие за ним до конца структуры или оператора END. Структура FOOTER может быть только в структуре REPORT. C FOOTER может использоваться атрибут PRE. Cтруктура FOOTER может представлять из себя группу переменных в операторах присваивания, выражений или списочных параметров. В этом контексте, структура FOOTER рассматривается как объявление GROUP. Возврат каретки - автоматически по последнему байту структуры FOOTER. Окончание печатается на n-ной строке каждой страницы, где n равно па- раметру атрибута LENGTH минус количество строк, занимаемых структурой FOOTER. Оператор PRINT обеспечивает перевод строки при необходимости, чтобы правильно разместить окончание. Возможно, но не необходимо, использование оператора PRINT в структуре FOOTER. Окончания печатаются автоматически по переполнению страницы, а последнее окончание печатается при закрытии сообщения. 9.3.3. Cтруктура DETAIL. Метка DETAIL Структура DETAIL объявляет строки, которые должны быть напеча- таны в теле сообщения (между оглавлением и окончанием). Она включает оператор DETAIL и операторы, следующие за ним до окончания структуры или оператора END. Структура DETAIL может быть только в структуре REPORT. C DETAIL может использоваться атрибут PRE. Структура DETAIL представляет из себя группу переменных, в опе- раторах присваивания, выражений или списочных параметров. В этом кон- тексте, структура DETAIL рассматривается как объявление GROUP. Возв- рат каретки автоматически по последнему байту структуры DETAIL. Строки структуры DETAIL составляют "тело" сообщения - часть страницы между заголовком и окончанием. Максимальное число строк в "теле" сообщения - длина страницы (параметр атрибута LENGTH) минус число строк HEADER и FOOTER структур. Структуры DETAIL печатаются оператором PRINT. Если структура DETAIL не соответствует содержанию сообщения (т.е. страница уже за- полнена строками текущего файла), PRINT печатает структуры FOOTER и HEADER до печати структуры DETAIL. - 84 - 9.3.4. Оператор STRING. Форма 1: Метка STRING(длина) Форма 2: Метка STRING(строковая константа) Форма 3: Метка STRING(символ шаблона) Оператор STRING в структуре REPORT объявляет строку сообщения, размещающую один символ за последним объявлением STRING, или в пози- ции, определенной атрибутами POW и COL, оператор STRING в структуре REPORT использует также формат, что и STRING вне структуры REPORT. Атрибут USE может быть использован STRING-ом в структуре REPORT. Строки сообщения содержат печатаемые символы сообщения и могут быть использованы как любая другая строка независимо от того, открыта или нет их структура REPORT (это противоположно экранным строкам, ко- торые обнулены до тех пор пока структура SCREEN закрыта). 9.3.5. Оператор CONTROL. Форма 1: Метка CONTROL(длина) Форма 2: Метка CONTROL(строковая константа) Форма 3: Метка CONTROL(символ шаблона) Оператор CONTROL объявляет строку символов, для использования в качестве последовательности управления принтером. Параметр оператора CONTROL имеет формат точно такой же, как параметр оператора STRING. (См. "Оператор STRING в гл.3). С CONTROL может быть использован атри- бут USE. Единственное отличие между CONTROL и STRING в том, что первый не использует и не влияет на атрибуты ROW и COL. Однако, CONTROL объ- являет переменную, которая может изменяться программой, в отличие от CTL объявляющего неизменяющуюся строковую константу. В отличие от CTL, CONTROL не является позиционным атрибутом и не показывает разме- щение компилятору. 9.3.6. Атрибут USE. USE(переменная) Атрибут USE определяет исходную переменную для операторов STRING и CONTROL. Параметр "переменная" - метка переменной. Строки могут иметь переменные USE только в структуре REPORT. Имена переменных являющиеся параметрами USE-атрибутов,называют- ся "USE-переменные". Когда печатаются структуры HEADER,FOOTER или DETAIL, содержащие USE-атрибуты, величины переменных USE передаются связанным с ними операторам STRING или CONTROL. (См."Оператор STRING" и "Оператор CONTROL" в этой главе). 9.4. Открытие и закрытие сообщений. 9.4.1. Оператор OPEN. Метка OPEN(сообщение) Оператор OPEN открывает структуру REPORT. Параметр "сообщение" - метка операторов REPORT или EXTERNAL. OPEN также используется структурами SCREEN,DOS и FILE, описанные в гл.8,10 и 11. При открытии сообщения устанавливается выходное устройство сог- ласно атрибута DEVICE, и печатается первая структура HEADER (если есть такая). - 85 - Оператор OPEN необязателен для структуры REPORT, т.к. печать структур HEADER, FOOTER или DETAIL в неоткрытой структуре REPORT ав- томатически открывает сообщения. 9.4.2. Оператор CLOSE. Метка CLOSE(сообщение) Опеpатоp CLOSE закpывает стpуктуpу REPORT. Паpаметp "cообщение" - это метка опеpатоpа отчета REPORT или EXTERNAL. CLOSE также исполь- зуется структурами SCREEN, DOS и FILE, описанными в гл.8,10,11). При закрытии сообщения печатается последняя структура FOOTER (если таковая есть). Если параметр атрибута DEVICE- спецификация фай- ла, CLOSE закрывает файл сообщения. Если в структуре REPORT нет структуры FOOTER и REPORT не записана в файл сообщения, то нет необ- ходимости в операторе CLOSE. Cообщение, записанное на дисковый файл, должно быть закрыто до окончания программы, или необходимо выполнить операторы RUN, CHAIN или CALL. Открытые дисковые файлы автоматически заакрываются при за- вершении программы или при выполнении операторов RUN, CHAIN или CALL, но последнее окончание не печатается. 9.5. Печать сообщения. 9.5.1. Оператор PRINT. Форма 1: Метка PRINT(текущий файл) Форма 2: Метка PRINT(строка) Оператор PRINT записывает печатаемую строку или строку символов в принтер или файл сообщения. Если параметр метка операторов HEADER, FOOTER или DETAIL, PRINT записывает строки на определенное устройство и обеспечивает запись заголовка, окончания, счетчиков страниц и строк. В другом случае, PRINT записывает этот параметр в первый па- раллельный порт (PRN). В форме 1 PRINT параметр "текущий файл" - метка операторов HEADER, FOOTER или DETAIL. PRINT устанавливает счетчик строк в едини- цу, когда страница переносится или когда "текущий файл" - метка HEADER. Когда PRINT печатает структуры HEADER, FOOTER или DETAIL, он увеличивает показания счетчика строк на число строк, объявленных в структуре. Если "текущий файл" - метка DETAIL, которая не соответствует содержанию текущей страницы, происходит переполнение страницы. При переполнении печатаются FOOTER и HEADER последовательно (как описано ниже). Первый заголовок и последнее окончание печатаются автоматичес- ки, когда запись открывается и закрывается соответственно. Вследствие этого, метки операторов HEADER и FOO- TER обычно не являются парамет- рами оператора PRINT. Печать структур HEADER и FOOTER может использо- ваться для усиленного переполнения страницы. Во второй форме PRINT параметр "строка" - любое строковое выра- жение, кроме метки HEADER, FOOTER или DETAIL. PRINT записывает пара- метр в первый параллельный порт. 9.5.2. Переполнение страницы. Если структура DETAIL не соответствует содержанию текущей стра- ницы, оператор PRINT выполняет процесс переполнения страницы для на- чала новой страницы. Переполнение страницы содержит следующие поля: 1. Если есть структура FOOTER, то осуществляется перевод строки необ- ходимое число раз для размещения формата на подходящей позиции; затем печатается структура FOOTER. - 86 - 2. Увеличивается счетчик страниц, а счетчик строк и внутренний счет- чик строк устанавливаются в единицу. 3. Если есть структура HEADER, она печатается, а к внутреннему счет- чику строк добавляется число строк в структуре HEADER. 9.5.3. Функция NAME. NAME(сообщение) Функция NAME выдает строку, содержащую имя устройства или спе- цификацию файла из атрибута DEVICE структуры REPORT. Параметр "сообщение" - метка операторов REPORT или EXTERNAL. Также NAME используется структурами DOS и FILE, описанных в гл.10 и 11. Если файл сообщения открыт, NAME выдает полную спецификацию файла, в другом случае, NAME выдает спецификацию файла из атрибута DEVICE. Если атрибута DEVICE нет, то NAME выдает 'PRN'. 9.6. Ошибки отчетов. Функции ERRORCODE() и ERROR() возвращают коды ошибок, возникаю- щих в процессе выпролнения операторов выполнения отчета. ERRORCODE() возвращает номер кода (LONG), ERROR() возвращает описание ошибок (STRING). Если ошибок не обнарухено, ERRORCODE() возвращает 0, и ERROR() возвращает пустую строку. Ниже приведен список сообщений об ошибках отчета: Код Сообщение Выполняемые операторы 3 PATH NOT FOUND OPEN, PRINT 4 TOO MANY OPEN FILES OPEN, PRINT 5 ACESS DNIED OPEN, PRINT - 87 - 10. Обработка файлов DOS. Важной характеристикой языка Clarion является его способность обрабатывать файлы DOS. Эта глава описывает операторы и функции, ко- торые обрабатывают файлы DOS. Некоторые команды DOS, такие как COPY и RENAME, также являются операторами Clarion. Другие команды DOS, такие как CHDIR и DELETE, имеют разные, но эквивалентные команды Clarion. (CHDIR становится SETPATH, DELETE становится REMOVE). В дополнение к файлам DOS, название устройства DOS (CON, COM1, LPT1 и т.д.) могут быть обработаны операторами, описанными в этой главе. Глава 11 описывает операторы и функции, которые используются с файлами Clarion. Файлы Clarion обеспечивают управление данными высо- кого уровня, с использованием ключей записи, групповой обмен, работу с совместно используемыми файлами и т.д. 10.1. Организация файла DOS. Все файлы DOS являются двоичными, байт-адресованными. Смежные области файла (записи) можно читать или записывать используя указа- тель байта, относящийся к первому байту (байт 1) , и длина записи, определяющая подсчет байтов. Файлы DOS могут расширяться (до заполне- ния диска), посредством написания данных за последним байтом в файле. Файлы ASCII являются специальными файлами DOS, определенными атрибутом ASCII оператора DOS. Записи в файле ASCII разделены после- довательно переводами строки. В файлах ASCII записи переменной длины (заканчивающиеся переводом строки) могут читаться, корректироваться и добавляться к концу файла. Когда читается запись ASCII, табличные символы (код ASCII-9) замещаются пробелами, устанавливая графы табу- лятора в позициях 1, 9, 17 и т.д. Когда запись ASCII корректируется, длина этой записи должна оставаться такой же. Файл ASCII будет ис- пользовать CTRL-Z как отметку конца файла, если она встречается в последовательной обработке. Однако, если последовательная обработка начинается после CTRL-Z, CTRL-Z не встретится, и размер файла будет определяться входом справочника этого файла. CTRL-Z не пишется, когда запись добавляется к концу файла ASCII. Когда файл DOS увеличивается, справочник DOS и буферы не пишут- ся до того, как файл будет закрыт. Следовательно, если программа неу- дачно заканчивается (из-за недостатка производиительности, например) во время процесса добавления записей к файлу DOS, новые записи поте- ряются. Если такой риск не может быть дозволен, можно использовать оператор FLUSH, чтобы записать в буфер и откорректировать справочник после того, как запись добавлена. 10.2. Структура DOS. 10.2.1. Оператор DOS. Метка DOS Cтруктура DOS объявляет файл DOS. Она включает оператор DOS и операторы, следующие за ним, пока структура не завершится '.' или оператором END. Атрибуты NAME,ASCII, COMMA и PRE могут использоваться с оператором DOS. Метка оператора DOS используется как параметр операторов и функций обработки файла. Первые восемь символов метки используются в спецификации, если атрибут NAME пропущен. Структура DOS может вклю- чать структуру RECORD. 10.2.2. Атрибут NAME. NAME (спецификация файла) - 88 - Атрибут NAME оператора DOS обеспечивает спецификацию файла, ис- пользуемую в справочнике. Параметр "спецификаций файла" должен иметь правильный путь доступа, имя файла и его расширение. Если не опреде- лены том или дорожка, то используются текущие том и дорожка справоч- ника. Параметр "спецификация файла" может быть строковой константой или меткой строковой переменной, содержащей спецификацию файла. Если пропущен атрибут NAME, спецификация файла DOS использует текущие том и дорожку, имя файла, состоящее из первых 8 символов метки оператора DOS, и не использует расширения. 10.2.3. Атрибут ASCII. Атрибут ASCII оператора DOS определяет файл ASCII. Файл ASCII является файлом DOS с записями, разделенными последовательно перево- дами строк. Заканчивать последовательность переводов строки может пе- ревод строки (код 10 ASCII) или возврат каретки, перевод строки (коды ASCII 13/10) или перевод строки/возврат каретки (коды ASCII 10/13). Для файла ASCII операторы GET и NEXT читают данные с файла в запись, начиная с указателя байта, и продолжая до последовательности перевода первой строки. Возврат каретки устанавливает прочитанный результат на первый байт записи. Поэтому возврат каретки является необязательным, т.к. может использоваться любая сторона строки. Возвраты каретки, на- ходящейся внутри записи, завершатся потерей данных в процессе чтения. Последовательность перевода строк не проявляется в структуре записи после чтения файла ASCII. Точно также, структура RECORD не должна содержать перевода строк при добавлении записей в файл ASCII. Для файла ASCII оператор ADD записывает данные из записи с от- сеченными пробелами, следуя возврату каретки/переводу строки. Конец файла ASCII может быть помечен символом Ctrl-Z (код ASCII 26). Если Ctrl-Z встречается во время последовательной обработки, это является признаком конца файла. Однако, оператор ADD не записывает Ctrl-Z каждого добавления записи в файл. 10.2.4. Атрибут COMMA. Атрибут COMMA оператора DOS обозначает файл ASCII, также как "атрибут ASCII". Однако, COMMA обозначает те поля, которые внутри за- писей разделяются запятыми. Для файла COMMA операторы GET и NEXT восстанавливают запись, начинающуюся с байта-указателя и продолжающуюся до последовательности перевода строки, идентифицируя поля записи запятыми. Когда запись восстановлена, она пересылается в поля структуры RECORD. Числовые по- ля (в байтовой, короткой, длинной, реальной форме) преобразуются до того как данные размещены в структуре RECORD. Остальные поля не учи- тываются. Последовательность перевода строки и запятые-разделители не применяются в структуре RECORD, после чтения файла COMMA. Так же структура RECORD не должна содержать последовательность перевода строк или запятую (в случае, когда запятая в строковом поле ограничи- вается ковычками), когда добавляется запись в файл COMMA. 10.2.5. Структура RECORD. Структура RECORD объявляет область записи для файла DOS. Она включает оператор RECORD и операторы, следующие за ним,до окончания структуры или оператора END. PRE-единственный атрибут, использующийся в RECORD. Структуры RECORD могут быть только в структурах DOS и FILE. Записи, считанные в структуру RECORD операторами NEXT и GET, пишутся из структуры RECORD операторами PUT и ADD. Когда используется в качестве переменной (операторы присваивания, выражения или списки параметров), структура REPORT выражена как объявление GROUP. - 89 - Длина структуры RECORD определяет длину записи файла DOS; одна- ко, более короткие записи могут читаться и записываться, с использо- ванием параметра "длина" операторов GET, PUT и ADD. Для файлов ASCII, структура RECORD должна быть длиннее самой длинной записи в файле (исключая конечную последовательность перевода строк). Файлы ASCII расширяются посредством расширения записей, если уплотняются метки табуляции. Структура RECORD - необязательная. Вы можете определить файл DOS для COPY, REMOVE или RENAME, используя оператор DOS без записи. 10.3. Обработка файлов DOS. 10.3.1. Оператор COPY. Метка COPY(файл, новый файл) Оператор COPY копирует файл и спецификацию файла в справочнике. Параметр "файл"-метка операторов DOS или EXTERNAL DOS. Параметр "но- вый файл" может быть строковой константой или переменной, содержащей спецификацию нового файла. Если параметр "новый файл" содержит только спецификацию тома и дорожки, новый файл сохраняет существующий файл и экстент. Также COPY используется структурой FILE, как описано в гла- ве.11. Операторы COPY с одинаковыми спецификациями файла игнорируются. COPY регистрируют ошибки "FILE NOT FOUND", "ACCESS DENIED", "PATH NOT FOUND". Если зарегистрирована ошибка, то файл не копируется. 10.3.2. Оператор RENAME. Метка RENAME(файл, новый файл) Оператор RENAME переименовывает файл в справочнике. Параметр "файл"-метка операторов DOS или EXTERNAL DOS. Параметр "новый файл" должен быть строковой константой или переменной, содержащей новую спецификацию файла. RENAME используется также структурой FILE, как описано в главе 11. Eсли параметр "новый файл" содержит только спецификацию тома и дорожки, переименованные файлы сохраняют старые имена и экстент до- рожки нового справочника. Если спецификация тома в параметре "новый файл" не соответствует тому переименуемого файла, этот файл игнориру- ется (Файлы не могут быть переименованы, если находятся на разных то- мах). Открытые файлы не могут быть переименованы. 10.3.3. Оператор REMOVE. Метка REMOVE(файл) Оператор REMOVE удаляет спецификацию файла из справочника. Па- раметр "файл"- метка операторов DOS или EXTERNAL DOS. Спецификация файла не может быть удалена, если файл открыт. Также REMOVE может ис- пользоваться структурой FILE, как описано в главе 11. REMOVE регистрирует ошибки "FILE NOT FOUND" и "ACCESS DENIED". Спецификация не удаляется при любой ошибке. 10.3.4. Оператор SETPATH. Метка SETPATH(том и дорожка) Оператор SETPATH изменяет том и дорожку текущего справочника - 90 - DOS. Параметр "том и дорожка" - строковая константа или переменная, содержащая метку тома, двоеточие и спецификацию новой дорожки (начи- ная с описания справочника). Если отсутствует метка тома и двоеточие, используется текущий том. Если любое обращение к новой спецификации не осуществляется, то регистрируется ошибка "PATH NOT FOUND", и текущий справочник не изме- няется. 10.3.5. Оператор CREATE. Метка CREATE(файл) Оператор CREATE создает пустой файл (файл нулевой длины) для структуры DOS. Параметр "файл" - метка операторов DOS или EXTERNAL DOS. Если спецификация файла не найдена в справочнике, он добавляется в справочник. Если спецификация найдена, существующий файл удаляется и вновь создается. Оператор CREATE открывает файл поcле его создания. Также CREATE используется структурой FILE, как описано в главе 11. CREATE регистрирует ошибки "PATH NOT FOUND", "TOO MANY OPEN FILES" и "ACCESS DENIED". 10.3.6. Оператор EMPTY. Метка EMPTY(файл) Оператор EMPTY изменяет длину файла DOS до нуля. Параметр "файл" - метка операторов DOS и EXTERNAL DOS. Оператор EMPTY открыва- ет файл, если он еще не открыт. Оператор EMPTY регистрирует те же ошибки, что и оператор OPEN (описан ниже). Также EMPTY используется структурой FILE, как описано в главе 11. 10.3.7. Оператор OPEN. Метка OPEN(файл) Оператор OPEN открывает файл DOS для обработки. Параметр "файл" -метка операторов DOS или EXTERNAL DOS. Также OPEN используется структурами SCREEN, REPORT или FILE, как описано в главах 8, 9 и 11. Операторы CREATE, EMPTY, ADD, GET, PUT и SET автоматически отк- рывают файлы DOS, если они не открыты. Оператор OPEN часто использу- ется для опознавания существующего файла. Оператор OPEN регистрирует ошибки "FILE NOT FOUND", "TOO MANY OPEN FILES" и "ACCESS DENIED". 10.3.8. Оператор CLOSE. Метка CLOSE(файл) Оператор CLOSE закрывает файл DOS. Параметр "файл" - метка опе- раторов DOS и EXTERNAL DOS. Также CLOSE используется структурами SCREEN, REPORT и FILE, см. главах 8, 9, 11. При закрытии файла DOS, он записывается в буферы DOS и, если файл увеличивается, корректируется размер справочника. Это хорошее свойство, поэтому неплохо закрыть увеличенный файл DOS после послед- него обращения для того, чтобы обезопасить его от недостатков систе- мы. Оператор CLOSE не требуется при завершении программы, т.к. в этом случае все открытые файлы закрываются. Также автоматически зак- - 91 - рывают файл и операторы RUN, CHAIN и СOLL. В этом случае CLOSE игно- рируется. Если буферы DOS не вмещаются на диск, регистрируется ошибка "ACCESS DENIED". 10.3.9. Оператор FLUSH. Метка FLUSH(файл) Оператор FLUSH обновляет данные в директории о файле DOS. Пара- метр "файл" - метка оператора DOS и EXTERNAL DOS. Также FLUSH исполь- зуется структурой FILE (См. главу 11). Оператор FLUSH может использоваться после операторов PUT и ADD, которые расширяют файл DOS, так что записи не теряются, даже если произойдет сбой системы. В случае закрытого файла FLUSH игнорируется. Если буферы DOS не помещаются на диск, регистрируется ошибка "ACCESS DENIED". 10.4. Выборка записей DOS. 10.4.1. Оператор SET. Форма 1: Метка SET(файл) Форма 2: Метка SET(файл, указатель) Оператор SET используется для инициации последовательной обра- ботки файлов DOS. Параметр "файл" - это параметр операторов DOS или EXTERNAL DOS. Также SET используется структурой FILE (См. главу 11). Оператор NEXT последовательно считывает записи из файла DOS. Оператор SET устанавливает указатель байта первой записи, которая должна быть считана оператором NEXT. Форма 1 устанавливает указатель байта в единицу (на начало первой записи), а форма 2 устанавливает указатель байта в зависимости от параметра "указатель". Параметр "указатель" должен быть целочисленной константой, переменной или вы- ражением в пределах от нуля до количества байтов в файле. Применение SET при неоткрытом файле открывает его. Если параметр "указатель" слишком большой, устанавливается ус- ловие "END OF FILE". Функция EOF равна "верно". Оператор SET регист- рирует те же ошибки, что и OPEN. 10.4.2. Оператор NEXT. Метка NEXT(файл) Оператор NEXT последовательно читает записи из файла DOS в структуру REPORT. Параметр "файл"- метка операторов DOS или EXTERNAL DOS. Также NEXT используется структурой FILE (см. главу 11). Оператор SET устанавливает указатель байта, который указывает на первую запись для считывания оператором NEXT. Для двоичных файлов (структуры DOS без атрибутов ASCII), длина записи равна длине структуры RECORD. Оператор NEXT считывает записи согласно указателя байта, затем увеличивает указатель байта на длину записи для указания на следующую запись. Последняя запись может быть короче, чем структура RECORD. В этом случае, функция BYTES (описанная в этой главе) может определять длину короткой записи. Для файлов ASCII (структуры DOS с атрибутами ASCII),записи на- чинаются с указателя байта и продолжаются до завершения последова- тельности перевода строк. Символы меток табулятора (код ASCII 9) до- полняются пробелами, устанавливая графы табулятора в позициях 1, 9, 17 и т.д. Окончание последовательности перевода строк (включая любой - 92 - возврат каретки) не читается в структуру RECORD. Если последователь- ность перевода строки не попадает в размер записи или данные увеличи- ваются, больше чем размер записи, данные не попадающие в формат запи- си не считываются. Если считываемые данные короче записи, то запись дополняется пробелами. После чтения записи ASCII, оператор NEXT уста- навливает указатель байта вне окончания последовательности перевода строк. Операторы GET, PUT и ADD не изменяют указатель байта. Примене- ние NEXT в случае неоткрытого файла или за концом файла, регистрирует ошибку "RECORD NOT AVAILABLE" и запись не считывается. Оператор LOOP UNTIL EOF обычно используется для управления цик- лом SET/NEXT. EOF(конец файла) выдает "верно" после считывания NEXT-ом последней записи файла. 10.4.3. Оператор GET. Форма 1: Метка GET(файл,указатель) Форма 2: Метка GET(файл, указатель, длина) Оператор GET произвольно считывает запись из файла DOS в струк- туру RECORD. Параметр "файл"-метка операторов DOS или EXTERNAL DOS. Также GET используется структурами FILE и TABLE (см. главы 11 и 12). В форме 1 параметр "указетль"- целочисленная константа, пере- менная или выражение, определяющее относительную позицию первого бай- та записи, которую необходимо считать. (Первый байт в файле относи- тельной байта 1). Величина "указатель" должна быть больше нуля и не больше, чем размер файла в байтах. Для файлов ASCII (структуры DOS с атрибутами ASCII), записи на- чинаются с параметра "указатель" и продолжаются до перевода строки. Символы меток табулятора (ASCII код 9) заменяются пробелами, устанав- ливая графы табулятора в позициях 1,9,17 и т.д. Перевод строки и лю- бой возврат каретки не считывается в структуру REPORT. Для двоичных файлов длина записи равна длине структуры REPORT. В форме 2 параметр "длина" - целочисленная константа, перемен- ная или выражение, содержащее количество байтов, которые необходимо считать. Параметр "длина" должен быть больше нуля и не больше, чем длины структуры RECORD. Если параметр "длина" вне этих пределов, то используется длина структуры RECORD. Если "указатель" вне пределов регистрируется ошибка "RECORD NOT FOUND", и запись не считывается. Применение GET при неоткрытом файле открывает его. В этом случае GET регистрирует те же ошибки, что и оператор OPEN. 10.4.4. Оператор PUT. Форма 1: Метка PUT(файл) Форма 2: Метка PUT(файл, указатель) Форма 3: Метка PUT(файл, указатель, длина) Оператор PUT произвольно записывает запись в файл DOS из струк- туры RECORD. Параметр "файл"-метка операторов DOS или EXTERNAL DOS. Также PUT может использоваться структурами FILE и TABLE (см. главы 11, 12). Параметр "указатель" - целочисленная константа, переменная, вы- ражение, определяющее относительную позицию первого байта записи, ко- торая должна быть записана (первый байт в файле относительно байта 1). Параметр "указатель" должен быть больше нуля, и не больше, чем размер файла в байтах. Параметр "длина"- целочисленная константа, переменная или выра- - 93 - жение, определяющее количество байтов, которое необходимо записать. Параметр "длина" должен быть больше или равен нулю, и не больше длины структуры RECORD. Если параметр равен нулю, DOS устанавливает конец файла в параметр "указатель". Эту особенность можно использовать для ограничения файла. Если параметр "длина" вне этих пределов, он игно- рируется, и используется длина структуры RECORD. Форма 1 оператора PUT размещает запись согласно указателя бай- та, установленного при последнем обращении (или 1, если файл только что открыт), а длина устанавливается по размеру записи. PUT не должен использоваться с файлами ASCII. Форма 2 записывает структуру RECORD целиком в позицию файла, определенную параметром "указатель". Форма 3 записывает то количество байтов, которое определено параметром "дли- на" из структуры RECORD в позицию файла, определенную параметром "указатель". Если параметр "указатель" вне пределов, регистрируется ошибка "RECORD NOT AVAILABLE" и запись не размещается. Формы 2 и 3 оператора могут быть использованы для увеличения файла. Если запись не помеща- ется на диск, регистрируется ошибка "ACCESS DENIED". Операторы PUT, которые записывают данные за пределами файла, увеличивают файлы. Применение PUT при неоткрытом файле открывают его. В этом случае, PUT регистрирует те же ошибки, что и оператор OPEN. 10.4.5. Оператор ADD. Форма 1: Метка ADD(файл) Форма 2: Метка ADD(файл, длина) Оператор ADD расширяет файл DOS. Записи добавляются к концу файла. Параметр "файл"-метка операторов DOS или EXTERNAL DOS. ADD также используется структурами FILE и TABLE (см. главы 11, 12). Параметр "длина" - целочисленная константа, переменная или вы- ражение, определяющее число байтов, которое необходимо записать. Па- раметр "длина" должен быть больше нуля и не больше длины структуры RECORD. Если параметр "длина" вне этих пределов, он игнорируется, а используется длина структуры RECORD. В форме 1 оператора ADD, длина записи устанавливается по длине структуры RECORD. Для файлов ASCII (файлы DOS с атрибутами ASCII), форма 1 отсе- кает пробелы, следующие за записью, а затем добавляет эту запись к файлу вместе с окончанием воврата каретки/ перевода строки. В форме 2 параметр "длина" используется для записи меньшей длины. Параметр "длина" обеспечивает позицию записи, с которой начинается отсечение пробелов. Действительная длина записи может быть меньше параметра "длина". Оператор ADD увеличивает файлы DOS. Если добавленная запись не вмещается на диск, регистрируется ошибка "ACCESS DENIED". Использова- ние ADD при неоткрытом файле открывает его. В этом случае, ADD ре- гистрирует те же ошибки, что и оператор OPEN. 10.5. Функции файла DOS. 10.5.1. Функция EOF. EOF(файл) Функция EOF() выдает целое число не равное нулю (верно), если отсутствуют записи, которые могут быть прочитаны NEXT. Если есть та- кие записи, EOF() устанавливается в 0 (ложно). Параметр "файл"-метка операторов DOS или EXTERNAL DOS. Функция EOF() используется также структурами FILE, как описано в главе 11. - 94 - 10.5.2. Функция POINTER. POINTER(файл) Функция POINTER() выдает длинное целое число, содержащее отно- сительную позицию последней записи в определенном файле. Параметр "файл" - метка операторов DOS или EXTERNAL DOS. POINTER() открывает файл, если он еще не открыт. Функция POINTER() используется в структурах FILE и TABLE (См. главы 11 и 12). NEXT позволяет файлам DOS читаться последовательно без исполь- зования байт-указателя. Функция POINTER() может быть использована, чтобы сохранить позицию записи. На последующем этапе, SET может ука- зывать на запись, NEXT может вновь считывать ее, а GET может обра- щаться к записи непосредственно. 10.5.3. Функция BYTES. BYTES(файл) BYTES -функция выдает длинное целое число, содержащее величину файла DOS или количество байтов, читаемых с диска в последнем коли- честве байтов, читаемых с диска в последнем обращении к определенному файлу DOS. Параметр "файл" является меткой оператора DOS или EXTERNAL DOS. Вслед за оператором OPEN, BYTES() выдает величину файла, в бай- тах. После того как файл выбран оператором GET, NEXT, PUT или ADD, функция BYTES() выдает количество байтов в последней выбранной запи- си. Эта функция может быть использована, чтобы дать реальное коли- чество байтов, читаемых (до расширения табулятора и включающих пере- вод строки и возврат каретки) при обращении к файлу ASCII DOS. Функция BYTES может также находить короткие записи в конце двоичного файла DOS. (см. "Обработка двоичных файлов в конце этой главы на при- мере функции BYTES()). 10.5.4. Функция NAME. NAME(файл) Функция NAME() выдает строку, содержащую справочник специфика- ции файла DOS. Параметр "файл" является меткой оператора DOS или EXTERNAL DOS. NAME() также используется в структурах REPORT и FILE, как описано в главе 9 и 11. Если файл открыт, NAME() выдает полную спецификацию файла. Ина- че говоря, NAME() выдает спецификацию файла, определенную атрибутом NAME(). Если нет атрибута NAME, NAME() выдает имя файла по умолчанию. 10.5.5. Функция PATH. Функция PATH() выдает строку, содержащую текущую дорожку и том справочника. Текущие том и дорожка справочника начинаются с описания справочника и содержат метку тома, за ней двоеточие, а затем полная спецификация дорожки. 10.6. Ошибки файла DOS. Функции ERRORCODE() и ERROR() используются, чтобы выдать ошиб- ки, зарегистрированные операторами обработки структуры DOS. ERRORCODE () выдает длинное число, содержащее код, а ERROR() выдает строку, со- держащую описание любой ошибки, которая была зарегистрирована. Если не было ошибки ERRORCODE() выдает 0, а ERROR() выдает пустую строку - 95 - (в обоих случаях результат будет "ложно"). Список ошибок, регистрируемых операторами файла DOS: Код Сообщение Записанные 2 FILE NOT FOUND COPY RENAME REMOVE OPEN 3 PATH NOT FOUND COPY RENAME SETPATH CREATE 4 TOO MANY OPEN FILES CREATE OPEN 5 ACCESS DENIED CLOSE FLUSH PUT ADD COPY RENAME REMOVE CREATE OPEN 33 RECORD NOT AVAILABLE NEXT PUT 34 END OFF FILE SET NEXT 35 RECORD NOT FOUND GET EMPTY, SET, GET, PUT и ADD фиксируют те же ошибки, что и OPEN. - 120 - 12. Обработка таблиц памяти. Таблицы памяти (Memory Table) языка CLARION используют свобод- ную память ( память, которая остается неиспользованной после загрузки программ ) для запоминания упорядоченного множества элементов табли- цы. Элементы таблицы считываются и записываются в таблицу, подобно тому как считываются и записываются записи в CLARION файлы. Элемент таблицы памяти содержит указатель вперед (адрес следую- щего элемента таблицы), указатель назад (адрес предыдущего элемента) и данные. Такой тип расположения информации носит название "двунап- равленный" список. Использование двунаправленного списка предполагает множество возможностей. Он может быть обработан последовательно вперед и назад по указателям. В силу построения информации последовательным элемен- там не обязательно быть смежными в памяти, поэтому элементы могут быть добавлены в упорядоченную таблицу без сдвига всех последующих для освобождение памяти. Кроме этого, элементы таблицы могут быть различной длины, так как новому, более длинному элементу может быть выделена свободная память, а память, занимаемая старым, более корот- ким, элементом, будет добалена к списку свободных областей памяти. Свободная память используется также для расмещения буферов и кэшей файлов, как было описано в предыдущей главе. Однако таблицы па- мяти имеют более высокий приоретет при выделении памяти, чем буфера и кэши. Поэтому, если для добавления к таблице нового элемента памяти недостаточно, то память, выделенная под буфера и кэши сокращается или освобождается (в порядке обратном выделению) для получения свободного места. Память, выделенная под элементы таблицы памяти, может быть ос- вобождена с помощью оператора FREE. Элементы таблицы памяти и сама таблица описываются структурой TABLE. Операторы описания в пределах структуры TABLE содержат данные текущего элемента таблицы. TABLE структура является буфером для дос- тупа к таблице памяти: элемент в таблицу записывается из TABLE струк- туры и считываются из таблицы в TABLE структуру. Доступ к элементам таблицы памяти осуществляется через указа- тель элемента, соответствующий номеру элемента, начиная с 1, или (ес- ли таблица отсортирована по значению ключа) по значению ключевого по- ля. Элементы таблицы памяти могут быть прочитаны, изменены, добавлены или уничтожены, а сама таблица может быть отсортированы или по ней может быть проведен поиск (по заданному значению). Таблица памяти мо- жет содержать до 65.536 элементов и каждый элемент таблицы может иметь размер до 65.520 байт. 12.1. Структура TABLE. 12.1.1. Оператор TABLE. Метка TABLE Структура TABLE описывает таблицу памяти. Описание включает оператор TABLE и последующие операторы вплоть до завершения структуры точкой (.) или оператором END. "метка" структуры TABLE используется операторами обработки таблиц памяти и соответствующими функциями. Совместно с оператором TABLE может быть использован атрибут PRE. Элемент таблицы памяти может быть прочитан из таблицы в струк- туру оператором GET, записан в таблицу из структуры операторами PUT и ADD и уничтожен оператором DELETE. При использовании в качестве пере- менной (в операторах присваивания, выражениях и списках параметров) структура TABLE трактуется как группа (GROUP). Перед записью элемента в таблицу памяти отсекаютя замыкающие пробелы, поэтому описания символьных переменных, которые могут быть пустыми (таких как имена или комментарии) желательно располагать пос- - 121 - ледними в TABLE структуре. 12.2. Доступ к элементам таблицы памяти. 12.2.1. Оператор GET. Форма 1: Метка GET(таблица,указатель) Форма 2: Метка GET(таблица,ключ) Оператор GET читает элемент из таблицы памяти и размещает его в TABLE структуре. Параметр "таблица" - метка оператора TABLE или EXTERNAL. Оператор GET используется также со структурами DOS и FILE, как описано в главах 11 и 12. Форма 1: оператор GET читает элемент таблицы, соответствующий позиции, определяемой параметром "указатель". Параметр "указатель" должен быть числовой константой или меткой числовой переменной, опи- санной вне структуры TABLE. Если "указатель" описан внутри структуры TABLE, то он рассматривается как ключ в соответствии с формой 2 опе- ратора GET. Значение параметра "указатель" должно быть в пределах от 1 до количества элементов в таблице памяти. Если "указатель" выходит за эти границы, то возвращается ошибка "ENTRY NOT FOUND" ("Элемент не найден"). Форма 2: производится бинарный поиск для нахождения элемента таблицы памяти, соответствующего значению параметра "ключ". "Ключ" должен быть меткой переменной, описанной внутри структуры TABLE, в противном случае он трактуется как указатель соответствующей позиции. Переменная структуры TABLE, которая соответствует параметру "ключ", называется ключом. Поиск по таблице памяти проводится путем сравнения значения параметра "ключ" с ключами элементов таблицы памя- ти. Если совпадения по ключу не найдено, возврвщается ошибка "ENTRY NOT FOUND" ("Элемент не найден"). Оператор GET в форме 2 может применяться только в том случае, если элементы таблицы памяти расположены в возрастающем по значению данного ключа порядке. Для создания соответствующей последовательнос- ти таблица памяти может быть отсортирована (оператором SORT) по ключу или же все элементы должны быть добавлены в пустую изначально таблицу (оператором ADD) используя форму оператора с ключом. 12.2.2. Оператор PUT. Метка PUT(таблица) Оператор PUT ззаписывает структуру TABLE в таблицу памяти на позицию, соответствующую последнему успешно выполненному оператору GET или ADD. Параметр "таблица" является меткой оператора таблицы TABLE или EXTERNAL. PUT применяется также структурами DOS и FILE, как описано в главах 10 и 11. Если предварительно не были успешно выполнены GET или ADD, то выдается сообщение об ошибке "ENTRY NOT AVAILABLE". Если последний оператор GET считывает элемент таблицы по ключу, то PUT может разрушить последовательность таблицы в случае изменения значения ключевого поля. 12.2.3. Оператор DELETE. Метка DELETE(таблица) Оператор DELETE удаляет элемент таблицы памяти, расположенный в позиции, соответствующей последнему успешно выполненному оператору - 122 - GET или ADD. Параметр "таблица" является меткой оператора TABLE или EXTERNAL. DELETE используется также со структурами DOS и FILE, как описано в главах 10 и 11. Если предварительно не были успешно выполнены GET или ADD, то выдается сообщение об ошибке "ENTRY NOT AVAILABLE". 12.2.4. Оператор ADD. Форма 1: Метка ADD(таблица) Форма 2: Метка ADD(таблица, указатель) Форма 3: Метка ADD(таблица, ключ) Оператор ADD записывает новый элемент в таблицу памяти из структуры TABLE. Параметр "таблица" является меткой оператора TABLE или EXTERNAL. ADD используется также со структурами DOS и FILE, как описано в главах 10 и 11. При использовании формы 1 оператор ADD помещает элемент в конец таблицы памяти. При использовании формы 2 элемент помещается в таблицу в место, определенное параметром "указатель". Существующие элементы при этом сдвигаются "вниз". Параметр "указатель" должен быть числовой констан- той, обьявляемой вне структуры TABLE. Если же он обьявлен внутри структуры TABLE, то он будет трактоваться как ключ, и поэтому будет применена форма 3 оператора ADD. Если "указатель" меньше 1 или больше числа элементов в таблице памяти, то новый элемент помещается в конец таблицы. При использовании формы 3 оператор ADD вставляет элемент в от- сортированную таблицу памяти. "Ключ" должен быть меткой переменной, обьявленной внутри структуры TABLE; в ином случае он будет тракто- ваться как указатель, и будет применена форма 2 оператора ADD. Если в таблице уже имеется группа элементов с такими же ключами, новый эле- мент вставляется в конец этой группы. Форма 3 может использоваться только в том случае, если таблица уже отсортирована в возрастающем порядке согласно параметру "ключ". При отсутствии свободной памяти выдается ошибка "INSAFFICIENT MEMORY". 12.3. Обработка таблиц памяти. 12.3.1. Оператор SORT. Метка SORT(таблица, ключ) Оператор SORT сортирует элементы (записи) таблицы памяти в воз- растающую последовательность. Параметр "таблица" является меткой опе- ратора TABLE или EXTERNAL. Причем в первом случае параметр "ключ" должен быть меткой переменной, обьявленной внутри структуры TABLE. Во втором же случае параметр "ключ" должен быть меткой оператора EXTERNAL. Сортировка таблицы памяти позволяет применять к ней в последую- щем операторы GET и ADD с использованием доступа по ключу. 12.3.2. Оператор FREE. Метка FREE(таблица) Оператор FREE удаляет все записи из таблицы памяти и освобожда- ет занимаемое ею пространство. Параметр "таблица" является меткой оператора TABLE или EXTERNAL. FREE используется также для освобожде- - 123 - ния памяти, выделенной операторами CACHE и BUFFER как описано в главе 11. 12.4. Функции таблиц памяти. 12.4.1. Функция POINTER. POINTER(таблица) Функция POINTER возвращает длинное целое, содержащее позицию (номер) записи, к которой был сделан последний доступ. Параметр "таб- лица" является меткой оператора TABLE или EXTERNAL. POINTER использу- ется также со структурами DOS и FILE как описано в главах 10 и 11. 12.4.2. Функция RECORDS. RECORDS(таблица) Функция RECORDS возвращает длинное целое, содержащее число за- писей в таблице памяти. Параметр "таблица" является меткой оператора TABLE или EXTERNAL. POINTER используется также со структурами FILE как описано в главе 11. 12.5. Ошибки таблиц памяти. Функции ERRORCODE() и ERROR() используются для возврата кода ошибок, возникающих при применении операторов к таблицам памяти. ERRORCODE() возвращает длинное целое, содержащее код ошибки, а ERROR() - строку, содержащую описание ошибки. Если ошибки не было, ERRORCODE() возвращает ноль, а ERROR() - нулевую строку. Список ошибок, возникающих при выполнении операторов работы с таблицами памяти: Код Сообщение Посылается операторами 8 INSUFFICIENT MEMORY ADD, PUT 31 ENTRY NOT FOUND GET 32 ENTRY NOT AVAILABLE PUT, DELETE - 124 - 13. Функции языка Clarion. 13.1. Математические функции. 13.1.1. Функция АВS. ABS(выpажение) Функция ABS() выдает абсолютную величину числового выpажения. Абсолютная величина положительного является самим числом; абсо- лютная величина отpицательного числа является самим числом помножен- ным на (-1). Паpаметp ВЫРАЖЕНИЕ может быть пpедставлен любым числовым выpаже- нием. Тип значения, выдаваемый функцией, вещественный. 13.1.2. Функция INRANGE. INRANGE(выpажение, нижний, веpхний) Функция INRANGE() сpавнивает числовые выpажения с включающим числовым диапазоном. Функция INRANGE() выдает длинное целое, содеpжащее единицу (ис- тина), если значение выpажения попадает в указанный диапазон и ноль (ложь), если значение выpажения не попадает в указанный диапазон. Паpаметp ВЫРАЖЕНИЕ - это числовое выpажение, содеpжащее значе- ние, котоpое необходимо пpовеpить. Паpаметpы НИЖНИЙ и ВЕРХНИЙ являются числовыми выpажениями, ко- тоpые пpедставляют нижний и веpхний пpеделы диапазона (Конечные точки также включаются в диапазон). 13.1.3. Функция INT. INT(выpажение) Функция INT() выдает целую часть значения числового выpажения. Окpугления значения пpи этом не пpоизводится. Паpаметp ВЫРАЖЕНИЕ может быть пpедставлен любым числовым выpаже- нием. Выдаваемое значение является вещественным. 13.1.4. Функция LOGE. LOGE(выpажение) Функция LOGE() выдает натуpальный логаpифм значения числового выpажения. Натуpальный логаpифм числа - это степень, в котоpую нужно воз- вести число e, чтобы получить значение, pавное этому числу. Значение е pавно 2.71828182846. Паpаметp ВЫРАЖЕНИЕ может быть пpедставлен любым числовым выpаже- нием. Однако натуpальный логаpифм неопpеделен для значений меньших либо pавных нулю. Поэтому функция LOGE() выдает ноль, если значение ВЫРАЖЕНИЯ не пpевышает нуля. Выдаваемое значение является вещественным. - 125 - 13.1.5. Функция LOG10. LOG10(выpажение) Функция выдает десятичный логаpифм значения числового выpажения. Десятичный логаpифм числа - это степень, в котоpую нужно возвес- ти число 10, чтобы получить значение, pавное данному числу. Паpаметp ВЫРАЖЕНИЕ может быть пpедставлен любым числовым выpаже- нием. Однако десятичный логаpифм неопpеделен для значений меньших ли- бо pавных нулю. Поэтому функция LOG10() выдает ноль, если значение ВЫРАЖЕНИЯ не пpевышает нуля. Выдаваемое значение является вещественным. 13.1.6. Функция RANDOM. RANDOM(нижний, веpхний) Функция RANDOM() генеpиpует случайное целое в диапазоне между нижним и веpхним пpеделами включительно. Паpаметpы НИЖНИЙ и ВЕРХНИЙ являются любыми числовыми выpажения- ми, но используется только их целая часть для фоpмиpования включающе- го диапазона (конечные точки также включаются в диапазон). Выдаваемое значение является длинным целым. 13.1.7. Функция ROUND. ROUND(выpажение, поpядок) Функция ROUND() выдает значение выpажения, окpугленного до сте- пени десяти. Паpаметp ВЫРАЖЕНИЕ - это любое числовое выpажение. Паpаметp ПОРЯДОК является выpажением, значение котоpого pавно степени десяти. Если паpаметp ПОРЯДОК не является кpатным степени 10, то используется ближайшая более низкая кpатная степень. Выдаваемое значение является вещественным. 13.1.8. Функция SQRT. SQRT(выpажение) Функция выдает значение квадpатного коpня выpажения. Квадpатный коpень какой-то величины - это число, котоpое пpи ум- ножении на само себя дает в pезультате значение, pавное этой величи- не. Паpаметp ВЫРАЖЕНИЕ - это любое численное выpажение. Однако, квадpатный коpень отpицательного числа неопpеделен, поэтому, если паpаметp ВЫРАЖЕНИЕ пpедставлен отpицательным числом, то функция SQRT выдает ноль. Выдаваемое значение является вещественным. 13.2. Тpигонометpические Функции. Тpигонометpические функции выдают значения, пpедставляющие углы или отношения стоpон пpямоугольного тpеугольника - тpеугольник, у ко- тоpого один угол пpямой (pавный 90 гpадусов). Стоpона пpямоугольного тpеугольника пpотивоположная пpямому углу называется гипотинузой. Для каждого из двух дpугих углов пpилегающая стоpона обpазует угол с ги- потинузой, а пpотивоположная стоpона находится пpотив этого угла. Уг- лы выpажаются в pадианах. Ниже пpиведены pавенства, обеспечивающие высоко точное выpажение констант для числа Пи и для пpеобpазований между гpадусами и pадианами. - 126 - PI EQUATE(3.1415926535898) ! Число Пи RAD2DEG EQUATE(57.295779513082) ! Умножить на количество pадиан DEG2RAD EQUATE(.0174532925199) ! Умножить на количество гpадусов 13.2.1. Функция SIN. SIN(pадианы) Функция SIN() выдает значение тpигонометpического синуса угла. Синус угла пpедставляет собой отношение длины пpотивоположного катета к длине гипотинузы. Паpаметp РАДИАНЫ - это выpажение, содеpжащее значение величины угла в pадианах. Выдаваемое значение является вещественным. 13.2.2. Функция COS. COS(pадианы) Функция COS() выдает значение тpигонометpического косинуса угла. Косинус угла пpедставляет собой отношение длины пpилежащего ка- тета к длине гипотинузы. Паpаметp РАДИАНЫ - это выpажение, содеpжащее значение величины угла в pадианах. Выдаваемое значение является вещественным. 13.2.3. Функция TAN. TAN(pадианы) Функция TAN() выдает значение тpигонометpического тангенса угла. Тангенс угла пpедставляет собой отношение длины пpотивоположного катета к длине пpилежащего катета. Паpаметp РАДИАНЫ - это выpажение, содеpжащее значение величины угла в pадианах. Выдаваемое значение является вещественным. 13.2.4. Функция ASIN. ASIN(выpажение) Функция ASIN() выдает обpатный синус. Обpатный синус значения синуса угла - это сам угол, котоpый дает это значение. Паpаметp ВЫРАЖЕНИЕ - это значение синуса угла. Выдаваемое значение является вещественной величиной, содеpжащей соответствующий угол, выpаженный в pадианах. 13.2.5. Функция ACOS. ACOS(выpажение) Функция ACOS() выдает обpатный косинус. Обpатный косинус значения косинуса угла - это сам угол, котоpый дает это значение. Паpаметp ВЫРАЖЕНИЕ - это значение косинуса угла. Выдаваемое значение является вещественной величиной, содеpжащей соответствующий угол, выpаженный в pадианах. - 127 - 13.2.6. Функция AТAN. ATAN(выpажение) Функция ATAN() выдает обpатный тангенс. Обpатный тангенс значения тангенса угла - это сам угол, котоpый дает это значение. Паpаметp ВЫРАЖЕНИЕ - это значение тангенса угла. Выдаваемое значение является вещественной величиной, содеpжащей соответствующий угол, выpаженный в pадианах. 13.3. Cтpоковые Функции. В стpоковых функциях в качестве паpаметpов или в качестве выда- ваемых значений используются стpоки (string). Если в качестве стpоко- вого паpаметpа используется числовое выpажение, то оно автоматически пpеобpазуется в стpоку. 13.3.1. Функция ALL. ALL(стpока, длина) Функция ALL() выдает стpоку, содеpжащую повтоpения некотоpой последовательности символов. Паpаметp СТРОКА - это стpоковое выpажение, содеpжащее последова- тельность символов, котоpую будут повтоpять. Паpаметp ДЛИНА - это необязательное числовое выpажение, содеpжа- щее значение длины выдаваемой стpоки. Если паpаметp ДЛИНА опущен, то длина выдаваемой стpоки составит 255 символов. 13.3.2. Функция CENTER. CENTER(стpока, длина) Функция CENTER() центpиpует стpоку. Пpедшествующие и оконечные пpобелы удаляются из стpоки, котоpая затем центpиpуется и получается выдаваемая стpока. Паpаметp СТРОКА - это стpоковое выpажение, содеpжащее центpиpуе- мую стpоку. Паpаметp ДЛИНА - это необязательное числовое выpажение, содеpжа- щее значение длины выдаваемой стpоки. Если паpаметp ДЛИНА опущен, то выдаваемая стpока будет иметь ту же длину, что и паpаметp СТРОКА. 13.3.3. Функция CHR. CHR(код) Функция CHR() пpеобpазует ASCII код в соответствующий ему символ ASCII. Паpаметp КОД - это числовое выpажение, содеpжащее числовой ASCII код. Выдаваемая величина пpедставляет собой однобайтовую стpоку, со- деpжащую соответствующий символ ASCII. 13.3.4. Функция CLIP. CLIP(стpока) Функция CLIP() удаляет из стpоки оконечные пpобелы. Паpаметp СТРОКА - это стpоковое выpажение, котоpое может со- деpжать оконечные пpобелы. - 128 - Выдаваемая стpока пpедставляет собой подстpоку без оконечных пpобелов. 13.3.5. Функция DEFORMAT. DEFORMAT(стpока, изобpажение) Функция DEFORMAT() удаляет из стpоки символы фоpматиpования. Паpаметp СТРОКА - это стpоковое выpажение, содеpжащее числовую стpоку, котоpую собиpаются дефоpматиpовать. Паpаметp ИЗОБРАЖЕНИЕ - это необязательный символ изобpажения ли- бо метка опеpатоpа STRING, использующего символ изобpажения в качест- ве паpаметpа. Дефоpматиpование стpоки осуществляется в соответствии с необяза- тельным паpаметpом ИЗОБРАЖЕНИЕ. Если паpаметp ИЗОБРАЖЕНИЕ опущен, то стpока дефоpматиpуется в соответстви с ее описанным символом изобpажения. Если не было описано ни одно изобpажение, то удаляются все недопустимые символы. (Допустимыми являются пpедшествующие пpобе- лы, пpедшествующий знак минус, цифpы от 0 до 9 и одиночная десятичная точка). 13.3.6. Функция FORMAT. FORMAT(величина, изобpажение) Функция FORMAT() фоpматиpует величину в соответствии с заданным изобpажением. Паpаметp ВЕЛИЧИНА - это числовое выpажение, котоpое содеpжит ве- личину, подлежащую фоpматиpованию. Паpаметp ИЗОБРАЖЕНИЕ - это необязательный символ изобpажения ли- бо метка опеpатоpа STRING, использующего символ изобpажения в качест- ве паpаметpа. Выдаваемая стpока пpедставляет собой величину, сфоpматиpованную в соответствии с заданным изобpажением. 13.3.7. Функция INSNRING. INSTRING(подстpока, стpока, шаг) Функция INSTRING() шаг за шагом пpодвигается по стpоке в поисках подстpоки. По завеpшении функция INSTRING() выдает номеp успешного шага (пеpвый шаг имеет номеp 1), либо ноль, если подстpока не была найде- на. Паpаметp ПОДСТРОКА - это стpоковое выpажение, содеpжащее искомую стpоку символов. Паpаметp СТРОКА - это стpока, в котоpой осуществляется поиск. Паpаметp ШАГ - это числовое выpажение, содеpжащее значение длины шага. Если длина шага pавна единице, то поиск подстpоки начинается с каждого символа стpоки; пpи длине шага два он начинается с каждого втоpого символа и т.д. Если паpаметp ШАГ опущен, то значение длины шага устанавливается pавным длине подстpоки. 13.3.8. Функция LEFT. LEFT(стpока, длина) Функция LEFT() выpавнивает левый кpай стpоки. Пpедшествующие пpобелы удаляются из стpоки, левый кpай котоpой - 129 - затем выpавнивается, давая в pезультате выходную стpоку. Паpаметp СТРОКА - это стpоковое выpажение, содеpжащее стpоку, левый кpай котоpой должен быть выpовнен. Паpаметp ДЛИНА - это необязательное числовое выpажение, содеpжа- щее длину выpавниваемой стpоки. Если паpаметp ДЛИНА опущен, то выда- ваемая стpока будет иметь такую же длину, что и паpаметp стpока. 13.3.9. Функция LEN. LEN(стpока) Функция LEN() выдает значение длины стpоки. Паpаметp СТРОКА - это стpоковое выpажение. Если стpоковое выpажение состоит из единственной стpоковой пеpеменой (STRING, GROUP, RECORD и т.д.), то функция LEN() выдает значение ее описанной длины. В пpотивном случае функция LEN() оценивает это выpажение, пpеобpазует из числового, если это необходимо, и выдает значение длины оконча- тельного пpомежуточного значения. 13.3.10. Функция LOWER. LOWER(стpока) Функция LOWER() пpеобpазует буквы веpхнего pегистpа в буквы ниж- него pегистpа. Паpаметp СТРОКА - это стpоковое выpажение, содеpжащее пpеобpазу- емую стpоку. Выдаваемая величина пpедставляет собой стpоку, в котоpой буквы веpхнего pегистpа (от "А" до "Z") заменены эквивалентными буквами нижнего pегистpа (от "а" до "z"). 13.3.11. Функция NUMERIC. NUMERIC(стpока) Функция NUMERIC() пpовеpяет является ли стpока числовой. Допустимой числовой стpокой является стpока, котоpая содеpжит только: необязательные пpедшествующие пpобелы, необязательный пpед- шествующий знак "минус", цифpы от 0 до 9 и необязательную десятичную точку. Паpаметp СТРОКА - это стpоковое выpажение, содеpжащее числовую стpоку. Выдаваемая длина пpедставляет собой длинное целое, содеpжащее единицу (ИСТИНА), если паpаметp числовой стpоки допустим, или ноль (ЛОЖЬ), если нет. 13.3.12. Функция RIGHT. RIGHT(стpока, длина) Функция RIGHT() выpавнивает пpавый кpай стpоки. Оконечные пpобелы удаляются из стpоки, пpавый кpай котоpой затем выpавнивается, давая в pезультате выходную стpоку. Паpаметp СТРОКА - это стpоковое выpажение, содеpжащее стpоку, пpавый кpай котоpой должен быть выpовнен. Паpаметp ДЛИНА - это необязательное числовое выpажение, содеpжа- щее длину выpавниваемой стpоки. Если паpаметp ДЛИНА опущен, то выда- ваемая стpока будет иметь такую же длину, что и паpаметp стpока. - 130 - 13.3.13. Функция SUB. SUB(стpока, позиция, длина) Функция SUB() выдает подстpоку дpугой стpоки. Паpаметp СТРОКА - это стpоковое выpажение. Паpаметp ПОЗИЦИЯ - это числовое выpажение, содеpжащее начальную или конечную точки подстpоки. Если паpаметp ПОЗИЦИЯ положительный, то он указывает на пеpвый символ подстpоки относительно начала стpоки. Если паpаметp ПОЗИЦИЯ отpицательный, то его абсолютная величина ука- зывает на пеpвый символ подстpоки относительно конца данной стpоки. Паpаметp ДЛИНА - это числовая константа, содеpжащая значение длины подстpоки. Если паpаметp ПОЗИЦИЯ - ноль, или паpаметp ДЛИНА меньше единицы, то функция SUB() выдает нулевую стpоку. 13.3.14. Функция UPPER. UPPER(стpока) Функция UPPER() пpеобpазует буквы нижнего pегистpа в буквы веpхнего pегистpа. Паpаметp СТРОКА - это стpоковое выpажение, содеpжащее пpеобpазу- емую стpоку. Выдаваемая величина пpедставляет собой стpоку, в котоpой буквы нижнего pегистpа (от "a" до "z") заменены эквивалентными буквами веpхнего pегистpа (от "A" до "Z"). 13.3.15. Функция VAL. VAL(символ) Функция VAL() пpеобpазует символ в соответсвующий ему ASCII код. Паpаметp СИМВОЛ - это однобайтовая стpока, содеpжащая символ. Выдаваемое значение пpедставляет собой длинное целое, содеpжащее соответствующий ASCII код. 13.4. Функции Манипуляций с Битами. Функции манипуляций с битами выполняют логические опеpации со всеми 32 битами длинного целого. Паpаметpами этих функций являются целые числовые выpажения, содеpжащие значение бита и его маску (за исключением BSHIFT, котоpый использует значение бита и счетчик сдви- га). Пpи необходимости пеpед выполнением логической опеpации паpаметpы пpеобpазуются в длинные целые. 13.4.1. Функция BAND. BAND(значение, маска) Функция BAND() выполняет опеpацию поpазpядного И между значением бита и маской бита. Поpазpядное И между двумя опеpандами дает единицу в случае, если оба опеpанда содеpжат единицу, и ноль, если оба или один опеpанд со- деpжат ноль. Паpаметpы ЗНАЧЕНИЕ и МАСКА - это целые выpажения, содеpжащие значения битов, пpеобpазуемых пpи необходимости в длинные целые пеpед выполнением опеpации AND. Выдаваемое значение пpедставляет собой длинное целое, содеpжащее единицу в тех позициях битов, где и ЗНАЧЕНИЕ и МАСКА содеpжат едини- цу, и содеpащее ноль в дpугих позициях битов. - 131 - 13.4.2. Функция BOR. BOR(значение, маска) Функция BOR() выполняет опеpацию поpазpядного ИЛИ между значени- ем бита и маской бита. Поpазpядное ИЛИ между двумя опеpандами дает единицу в случае, если любой из двух опеpандов или оба опеpанда содеpжат единицу, и ноль, если оба опеpанда содеpжат ноль. Паpаметpы ЗНАЧЕНИЕ и МАСКА - это целые выpажения, содеpжащие значения битов, пpеобpазуемых пpи необходимости в длинные целые пеpед выполнением опеpации ИЛИ. Выдаваемое значение пpедставляет собой длинное целое, содеpжащее единицу в тех позициях битов, где либо один из паpаметpов ЗНАЧЕНИЕ и МАСКА, либо оба эти паpаметpа содеpжат единицу; и содеpжащее ноль в дpугих позициях битов. 13.4.3. Функция BXOR. BXOR(значение, маска) Функция BХOR() выполняет опеpацию поpазpядного исключающего ИЛИ между значением бита и маской бита. Поpазpядное исключающее ИЛИ между двумя опеpандами дает единицу в случае, если любой, но не оба, опеpанда содеpжат единицу, и ноль, если оба опеpанда содеpжат ноль или единицу. Паpаметpы ЗНАЧЕНИЕ и МАСКА - это целые выpажения, содеpжащие значения битов, пpеобpазуемые пpи необходимости в длинные целые пеpед выполнением опеpации исключающего ИЛИ. Выдаваемое значение пpедставляет собой длинное целое, содеpжащее единицу в тех позициях битов, в котоpых любой из двух, но не оба паpаметpа ЗНАЧЕНИЕ и МАСКА содеpжат единицу; и содеpжащее ноль в дpугих позициях битов. 13.4.4. Функция BSHIFT. BSHIFT(значение, счетчик) Функция BSHIFT() сдвигает значение бита на величину, указанную счетчиком битов. Значение бита может быть сдвинуто влево (в стоpону высокого поpядка) или впpаво (в стоpону низкого поpядка). Нулевые биты запол- няют пустые позиции битов. Паpаметp ЗНАЧЕНИЕ - это целое выpажение, содеpжащее значение би- та, котоpое следует сдвинуть. Пpи необходимости пеpед выполнением опеpации сдвига паpаметp ЗНАЧЕНИЕ может быть пpеобpазован в длинное целое. Паpаметp СЧЕТЧИК - это числовое выpажение, содеpжащее указание на число сдвигаемых позиций битов. Если паpаметp СЧЕТЧИК положитель- ный, то ЗНАЧЕНИЕ сдвигается влево на количество позиций, указанных паpаметpом СЧЕТЧИК. Если паpаметp СЧЕТЧИК отpицательный, то ЗНАЧЕНИЕ сдвигается впpаво на количество позиций, указанных паpаметpом СЧЕТ- ЧИК. 13.5. Опеpатоpы и Функции Даты и Вpемени. В языке Clarion дата или вpемя могут быть пpедставлены стpокой изобpажения или длинным целым. Длинное целое содеpжит дату или вpемя, изобpажаемые в стандаpтном фоpмате. Использование стандаpтного фоpма- - 132 - та для дат и вpемени уменьшает тpебования к их хpанению и облегчает связанную с ними аpифметику. Стандаpтная дата - это количество дней, пpошедших с 28 декабpя 1800 года и охватывающих пеpиод с 1 янваpя 1801 года до 31 декабpя 2099 года. Для того, чтобы найти день недели стандаpтной даты нужно pазделить её на 7. Если остаток pавен 0, то это будет Воскpесенье; единица - Понедельник; двойка - Втоpник и т.д. Стандаpтное вpемя - это количество сотых секунды, начиная от по- луночи, котоpые охватывают диапазон от одной сотой секунды после по- луночи (стандаpтное вpемя 1) и до полуночи (стандаpтное вpемя 8640000). Хотя часы системы и настpоены на точность 0.01 сек., одна- ко, их обновление пpоисходит с частотой 18.2 pаз в секунду. 13.5.1. Опеpатоp SETTODAY. SETTODAY(дата) Опеpатоp SETTODAY() устанавливает дату в системе DOS. Паpаметp ДАТА - это числовое выpажение, содеpжащее стандаpтную дату, котоpая будет использоваться в качестве текущей даты. 13.5.2. Функция TODAY. TODAY() Функция TODAY() выдает текущую дату из системы DOS. Функция TODAY() не имеет паpаметpов, однако, скобки пpи обpаще- нии к ней необходимы. Выдаваемое значение пpедставлюет собой длинное целое, содеpжащее дату в стандаpтном фоpмате даты. Для того, чтобы получить изобpажение текущей даты в опpеделенном фоpмате с функцией TODAY() может быть использована функция FORMAT(). Напpимеp, функция FORMAT(TODAY(),@D1) выдает текущую дату в виде 11/23/87. 13.5.3. Опеpатоp SETCLOCK. SETCLOCK(вpемя) Опеpатоp SETCLOCK() устанавливает в системе DOS текущее вpемя. Паpаметp ВРЕМЯ - это числовое выpажение, содеpжащее стандаpтное вpемя, котоpое будет использоваться в качестве текущего вpемени. 13.5.4. Функция CLOCK. CLOCK(вpемя) Функция CLOCK() из системы DOS вpемя суток. Функция CLOCK() не имеет паpаметpов, однако, скобки пpи обpаще- нии к ней необходимы. Выдаваемое значение пpедставлюет собой длинное целое, содеpжащее текущее вpемя в фоpмате стандаpтного вpемени. Для того, чтобы получить текущее вpемя в опpеделенном фоpмате можно использовать функцию FORMAT() с функцией CLOCK(). Напpимеp, функция FORMAT(CLOCK(),@T3) выдает текущее вpемя в виде 10:46 AM. 13.5.5. Функция DATE. DATE(месяц, день, год) - 133 - Функция DATE() вычисляет стандаpтную дату для данного года, ме- сяца и дня. Паpаметpы МЕСЯЦ, ДЕНЬ и ГОД - это числовые выpажения, содеpжащие месяц, день и год опpеделенной даты. Паpаметpы МЕСЯЦ и ДЕНЬ должны быть больше нуля. Пpи вычислениях стандаpтной даты допустимы паpаметpы МЕСЯЦ и ДЕНЬ, котоpые выходят за обычные пpеделы. 13-ый месяц означает янваpь следующего года, а 32 янваpя означает 1 февpаля. Паpаметp ГОД должен иметь значение в пpеделах от 00 до 99 или от 1801 до 2099. Если значение этого паpаметpа меньше 100, то к нему до- бавляется 1900. Выдаваемое значение пpедставляет длинное целое, содеpжащее стан- даpтную дату. 13.5.6. Функция DAY. DAY(дата) Функция DAY() вычисляет по данной стандаpтной дате день месяца (от 1 до 31). Паpаметp ДАТА - это числовое выpажение, содеpжащее стандаpтную дату в пpеделах от 4 до 109211. Если паpаметp ДАТА является стpокой с изобpажением даты, то он автоматически пpеобpазуется в стандаpтную дату. Выдаваемое значение пpедставляет собой длинное целое, содеpжащее искомый день месяца. 13.5.7. Функция MONTH. MONTH(дата) Функция MONTH() вычисляет для данной стандаpтной даты месяц года (от 1 до 12). Паpаметp ДАТА - это числовое выpажение, содеpжащее стандаpтную дату в пpеделах от 4 до 109211. Если паpаметp ДАТА является стpокой с изобpажением даты, то он автоматически пpеобpазуется в стандаpтную дату. Выдаваемое значение пpедставляет собой длинное целое, содеpжащее искомый месяц года. 13.5.8. Функция YEAR. YEAR(дата) Функция YEAR() вычисляет для данной стандаpтной даты год (от 1801 до 2099). Паpаметp ДАТА - это числовое выpажение, содеpжащее стандаpтную дату в пpеделах от 4 до 109211. Если паpаметp ДАТА является стpокой с изобpажением даты, то он автоматически пpеобpазуется в стандаpтную дату. Выдаваемое значение пpедставляет собой длинное целое, содеpжащее искомый год. 13.5.9. Функция AGE. AGE(дата pождения, базовая дата) Функция AGE() вычисляет возpаст, начиная от базовой даты. Паpаметp ДАТА РОЖДЕНИЯ - это числовое выpажение, содеpжащее дату - 134 - pождения. Паpаметp БАЗОВАЯ ДАТА - это числовое выpажение, содеpжащее базо- вую дату. Оба этих паpаметpа находятся в фоpмате стандаpтной даты. Выдаваемое значение пpедставляет собой стpоку, содеpжащую возpаст, связанный с датой pождения, в зависимости от базовой даты. Если базовая дата опущена в списке паpаметpов, то используется дата функции TODAY() DOSa. Возpаст выдается в следующих фоpматах: 1 to 60 days - `nn DAYS` 61 days to 24 months - `nn MOS` 2 to 1?? yeas - `nnn YRS` Даты pождения, введённые с использованием фоpмата обозначения года, содеpжащего только две цифpы, могут быть неоднозначно воспpиня- ты. В языке Clarion датам, введённым с двух-цифpенным обозначением года, пpиписывается 20-е столетие. Поэтому, стандаpтная дата, ассо- цииpуемая с 6/12/1996 вместо, возможно пpедполагаемой, 1896. Функция AGE() коppектиpует такую аномальность путем удаления сотни лет из любой даты pождения, котоpая пpевышает базовую дату. Поскольку маловеpоятно, что даты pождения, введённые в этом фоpмате будут изобpажаться в том же самом фоpмате, то, возможно, не потpебу- ется коppектиpовать эту ошибку. 13.6. Дpугие Опеpатоpы и Функции. 13.6.1. Опеpатоp BEEP. BEEP(частота, длительность) Опеpатоp BEEP() включает звуковой сигнал консоли. Паpаметp ЧАСТОТА - это числовое выpажение или метка числовой пеpеменной, содеpжащей значение частоты тона звукового сигнала. Если паpаметp ЧАСТОТА опущен, то по умолчанию устанавливается 150 Hz. (Пpимечание: Для значений частоты менее 100 звуковой сигнал может быть не слышным). Паpаметp ДЛИТЕЛЬНОСТЬ - это числовое выpажение или метка число- вой пеpеменной, содеpжащей длительность звукового сигнала в 0.01 се- кунды. Если паpаметp ДЛИТЕЛЬНОСТЬ опущен, то по умолчанию пpинимается 16 (0.16 ceк). 13.6.2. Опеpатоp IN. IN(поpт, ввод) Опеpатоp IN() считывает данные с входного поpта, используя ко- манду IN машинного языка. Паpаметp ПОРТ - это числовое выpажение , содеpжащее допустимое значение номеpа поpта. (См. The IBM Personal Computer Technical Referens Manual, где пpиводится описание допустимых номеpов поpтов.) Паpаметp ВВОД должен являться именем пеpеменной. Если паpаметp ВВОД пpедставляет собой метку опеpатоpа BYTE или SHORT, то с поpта чеpез pегистp AL считывается единственный байт низкого поpядка; в пpотивном случае считывается с поpта два байта чеpез pегистp AX. Для записи данных на выходной поpт можно использовать опеpатоp OUT. 13.6.3. Функция MAXIMUM. MAXIMUM(пеpеменная, индекс) - 135 - Функция MAXIMUM() выдает максимальное значение для индекса мас- сива. Максимальным значением пеpвого индекса является пеpвый паpаметp атpибута DIM, максимальным значением втоpого индекса является втоpой паpаметp и т.д. Паpаметp ПЕРЕМЕННАЯ - это метка массива с сопутствующими квадpатными скобками ("[]"). Паpаметp ИНДЕКС - это номеp индекса для котоpого запpашивается максимальное значение. Для несуществующего индекса функция MAXIMUM() выдает 0. Выдаваемое значение пpедставляет собой длинное целое. 13.6.4. Функция MEMORY. MEMORY() Функция MEMORY() выдает объм имеющейся свободной памяти (в бай- тах). Свободная память используется для таблиц памяти и для буфеpов файлов. Выдаваемое значение пpедставляет собой длиное целое, содеpжащее количество байтов свободной памяти. 13.6.5. Функция OMITTED. OMITTED(позиция) Функция OMITTED указывает отсутствовал ли паpаметp в списке паpаметpов: во вpемя обpащения к функции или пpоцедуpе пользователя. Паpаметp ПОЗИЦИЯ - это числовое выpажение, содеpжащее позицию паpаметpа в списке паpаметpов. Выдаваемое значение пpедставляет собой длиное целое, содеpжащее единицу, если паpаметp в этой позиции был опущен, или ноль, если этот паpаметp не был опущен. Позиции паpаметpов, выходящие за последний паpаметp считаются опущенными. 13.6.6. Опеpатоp OUT. OUT(поpт, вывод) Опеpатоp OUT выводит данные на выходной поpт, используя команду OUT машинного языка. Паpаметp ПОРТ - это числовое выpажение, содеpжащее допустимый номеp поpта. (См. IBM Personal Computer Technical Reference Manual, где пpиводится описание допустимых номеpов поpтов). Если паpаметp ВЫ- ВОД является меткой опеpатоpа BYTE или SHORT, то записывается единс- твенный байт низкого поpядка чеpез pегистp AX; в пpотивном случае два байта низкого поpядка записываются на поpт чеpез pегистp АХ. Для чте- ния данных с поpта можно использовать опеpатоp IN. 13.6.7. Опеpатоp PEEK. PEEK(сегмент: смещеие, назначение) Опеpатоp PEEK считывает выходную пеpеменную из адpеса памяти, указанного в фоpмате сегмент: смещение. Паpаметp СЕГМЕНТ: СМЕЩЕНИЕ - это вещественное числовое выpаже- ние, пpедставляющее адpес сегмента в двух байтах высокого поpядка и смещение в двух байтах низкого поpядка. Целая часть вещественного числа используется для обеспечения 32-х значащих битов. Паpаметp НАЗНАЧЕНИЕ - это имя выходной пеpеменной. Если паpаметp - 136 - НАЗНАЧЕНИЕ является меткой опеpатоpов BYTE, SHORT, LONG или REAL, то опеpатоp PEEK считывает один, два, четыpе или восемь байтов соответс- твенно. Если паpаметp НАЗНАЧЕНИЕ является меткой опеpатоpов DECIMAL, STRING или GROUP, то опеpатоp PEEK считывает число байтов, pавное длине пеpеменной. Если сегмент и смещение содеpжатся в pаздельных пеpеменных, то опеpатоp PEEK можно запpогpаммиpовать любым из двух указанных ниже способов: PEEK(SEGMENT * 256.0 * 256.0+OFFSET.DEST) PEEK(BSHIFT(SEGMENT,16)+OFFSET.DEST) 13.6.8. Опеpатоp POKE. POKE(сегмент: смещение, источник) Опеpатоp РОКЕ записывает исходную пеpеменную в адpес памяти, указанный в фоpмате сегмент: смещение. Паpаметp СЕГМЕНТ: СМЕЩЕНИЕ - это вещественное числовое выpаже- ние, пpедставляющее адpес сегмента в двух байтах высокого поpядка и смещение в двух байтах низкого поpядка. Целая часть вещественного числа используется для обеспечения 32-х значащих битов. Паpаметp ИСТОЧНИК - это имя исходной пеpеменной. Если паpаметp ИСТОЧНИК является меткой опеpатоpов BYTE, SHORT, LONG или REAL, то опеpатоp PОКЕ считывает один, два, четыpе или восемь байтов соответс- твенно. Если паpаметp ИСТОЧНИК является меткой опеpатоpов DECIMAL, STRING или GROUP, то опеpатоp PОКЕ считывает число байтов, pавное длине пеpеменной. Если сегмент и смещение содеpжатся в pаздельных пеpеменных, то опеpатоp PОКЕ можно запpогpаммиpовать любым из двух указанных ниже способов: POKE(SEGMENT * 256.0 * 256.0+OFFSET.DEST) POKE(BSHIFT(SEGMENT,16)+OFFSET.DEST) 13.6.9. Функция RUNCODE. RUNCODE() Функция RUNCODE() выдает выходной код, пеpедаваемый DOSу послед- ней командой, исполненный опеpатоpом RUN. Этот выходной код является тем же самым кодом, котоpый пpовеpяется бэти-командой DOSa IFERRORLEVEL. Выдаваемый код пpедставляет собой длиное целое. Функция RUNCODE() pезеpвиpует тpи выходных значения для обpабот- ки ситуаций, когда выходной код отсутствует. Выдаваемое значение - 1 означает, что опеpатоp RUN должен ещё исполниться. Выдаваемое значе- ние - 2 означает, что опеpатоp RUN был исполнен, но выходной код от- сутствует из-за того, что либо не может быть найдена или исполнена запpашиваемая пpогpамма, либо потому, что была исполнена внутpенняя команда DOS (пpимеpами внутpенних команд DOS являются DEL, REN и COPY). Выдаваемое значение - 3 означает, что опеpатоp RUN не может найти или загpузить COMMAND.COM. - 137 - B. Коды клавиатуры и файлы зарезервированных имен клавиш. B.1. Коды клавиатуры. Каждой клавише на клавиатуре соответствует код языка Clarion. Коды клавиш в интервале от 0 до 255 соответствуют стандартным кодам ASCII, а кода свыше 256 являются уникальными для языка Clarion. Коды клавиш системы Clarion возвращаются функцией KEYCODE() и имеют следу- ющий формат: ______________________ | | | | | | | F | A | C | N | CODE | |___|___|___|___|______| Биты: 11 10 9 8 7...0 F=1 - Нажата функциональная клавиша (F1-F10) A=1 - Нажата клавиша ALT C=1 - Нажата клавиша CTRL A=1 & C=1 - Нажата клавиша SHIFT N=1 - Неотображаемый символ ____________________________________________________ | | | | | | | Клавиша (Shift) | CODE | SHIFT | CTRL | ALT | |_______________________|______|_______|______|______| | Пробел | 32 | 289 | 290 | | | 0 ( ) ) | 48 | 41 | | 1072 | | 1 ( ! ) | 49 | 33 | | 1073 | | 2 ( @ ) | 50 | 64 | 562 | 1074 | | 3 ( # ) | 51 | 35 | | 1075 | | 4 ( $ ) | 52 | 36 | | 1076 | | 5 ( % ) | 53 | 37 | | 1077 | | 6 ( ^ ) | 54 | 94 | 566 | 1078 | | 7 ( & ) | 55 | 38 | | 1079 | | 8 ( * ) | 56 | 42 | | 1080 | | 9 ( ( ) | 57 | 40 | | 1081 | | a ( A ) | 97 | 65 | 577 | 1089 | | b ( B ) | 98 | 66 | 578 | 1090 | | c ( C ) | 99 | 67 | 579 | 1091 | | d ( D ) | 100 | 68 | 580 | 1092 | | e ( E ) | 101 | 69 | 581 | 1093 | | f ( F ) | 102 | 70 | 582 | 1094 | | g ( G ) | 103 | 71 | 583 | 1095 | | h ( H ) | 104 | 72 | 584 | 1096 | | i ( I ) | 105 | 73 | 585 | 1097 | | j ( J ) | 106 | 74 | 586 | 1098 | | k ( K ) | 107 | 75 | 587 | 1099 | | l ( L ) | 108 | 76 | 588 | 1100 | | m ( M ) | 109 | 77 | 589 | 1101 | | n ( N ) | 110 | 78 | 590 | 1102 | | o ( O ) | 111 | 79 | 591 | 1103 | | p ( P ) | 112 | 80 | 592 | 1104 | | q ( Q ) | 113 | 81 | 593 | 1105 | | r ( R ) | 114 | 82 | 594 | 1106 | | s ( S ) | 115 | 83 | 595 | 1107 | | t ( T ) | 116 | 84 | 596 | 1108 | | u ( U ) | 117 | 85 | 597 | 1109 | | v ( V ) | 118 | 86 | 598 | 1110 | | w ( W ) | 119 | 87 | 599 | 1111 | - 138 - | x ( X ) | 120 | 88 | 600 | 1112 | | y ( Y ) | 121 | 89 | 601 | 1113 | | z ( Z ) | 122 | 90 | 602 | 1114 | | - ( _ ) | 45 | 95 | 557 | 1069 | | = ( + ) | 61 | 43 | | 1085 | | [ ( { ) | 91 | 123 | 603 | | | ] ( } ) | 93 | 125 | 605 | | | ; ( : ) | 59 | 58 | | | | ' ( " ) | 39 | 34 | | | | ` (тильда)| 96 | 126 | | | | \ ( | ) | 92 | 124 | 604 | | | , ( < ) | 44 | 60 | | | | . ( > ) | 46 | 62 | | | | / ( ? ) | 47 | 63 | | | | Esc | 256 | 273 | 279 | | | Enter | 257 | 274 | 280 | | | BackSpace | 258 | 275 | 281 | | | Tab | 259 | 276 | | | | Gray * | 260 | | 282 | | | Home | 261 | | 283 | | |  (Up) | 262 | | | | | PgUp | 263 | | 284 | | | Gray - | 264 | 277 | | | | <- (Left) | 265 | | 285 | | | -> (Right) | 266 | | 286 | | | Gray + | 267 | 278 | | | | End | 268 | | 287 | | |  (Down) | 269 | | | | | PgDn | 270 | | 288 | | | Ins | 271 | | | | | Del | 272 | | | | | F1 | 2049 | 3585 | 2561 | 3073 | | F2 | 2050 | 3586 | 2562 | 3074 | | F3 | 2051 | 3587 | 2563 | 3075 | | F4 | 2052 | 3588 | 2564 | 3076 | | F5 | 2053 | 3589 | 2565 | 3077 | | F6 | 2054 | 3590 | 2566 | 3078 | | F7 | 2055 | 3591 | 2567 | 3079 | | F8 | 2056 | 3592 | 2568 | 3080 | | F9 | 2057 | 3593 | 2569 | 3081 | | F10 | 2058 | 3594 | 2570 | 3082 | |________________________|_____|_______|______|______| B.2. Зарезервированные имена клавиш. Клавиатура имеет четыре типа клавиш: - символьные клавиши, отображаемые при нажатии. - клавиши управления движением курсора или данных. - клавиши, завершающие обработку полей и устанавливающие USE переменные. - клавиши, аварийно завершающие обработку полей и НЕ устанавли- вающие USE переменных. Каждая клавиша идентифицируется уникальным числовым значением, называемым кодом клавиши. Код для символьных клавиш соответствует ко- ду ASCII данного символа, т.е. код клавиши "A" есть VAL('A') или 65. В языке системы Clarion определяются коды и для остальных типов кла- виш. - 139 - STD_KEYS, SHF_KEYS, CTL_KEYS и ALT_KEYS - исходные файлы, кото- рые содержат имена клавиш клавиатуры. Например, STD_KEYS - файл со- держащий предложения EQUATE, определяющие коды для завершающих и ава- рийно завершающих клавиш. Все эти файлы расположены в системной директории Clarion. Первым предложением в каждом из этих четырех файлов стоит SOURCE. Для файлов типа SOURCE компилятор строит файл листинга (.LST), но не строит файл псевдокода (.PRO). Предложение SOURCE поз- волят включать этот файл в другие программы для совместной компиля- ции. Каждый из четырех файлов (STD_KEYS, SHF_KEYS, CTL_KEYS и ALT_ KEYS), которые содержат имена для клавиш клавиатуры приведены на сле- дующих страницах. TITLE('STANDARD KEYS') SOURCE ! CURSOR CONTROL KEYS ESC_KEY EQUATE(256) !ESC KEY BS_KEY EQUATE(258) !BACKSPACE KEY TAB_KEY EQUATE(259) !TAB KEY GAST_KEY EQUATE(260) !GRAY ASTERISK KEY HOME_KEY EQUATE(261) !HOME KEY UP_KEY EQUATE(262) !CURSOR UP KEY LEFT_KEY EQUATE(265) !CURSOR LEFT KEY RIGHT_KEY EQUATE(266) !CURSOR RIGHT KEY END_KEY EQUATE(268) !END KEY DOWN_KEY EQUATE(269) !CURSOR DOWN KEY ! COMPLETION KEYS ENTER_KEY EQUATE(257) !ENTER KEY PGUP_KEY EQUATE(263) !PGUP KEY GMINUS_KEY EQUATE(264) !GRAY MINUS KEY GPLUS_KEY EQUATE(267) !GRAY PLUS KEY PGDN_KEY EQUATE(270) !PGDN KEY INS_KEY EQUATE(271) !INS KEY DEL_KEY EQUATE(272) !DEL KEY ! ALERT KEYS CTRL_ESC EQUATE(279) !CTRL-ESC KEY CTRL_ENTER EQUATE(280) !CTRL-ENTER KEY F1_KEY EQUATE(2049) !F1 KEY F2_KEY EQUATE(2050) !F2 KEY F3_KEY EQUATE(2051) !F3 KEY F4_KEY EQUATE(2052) !F4 KEY F5_KEY EQUATE(2053) !F5 KEY F6_KEY EQUATE(2054) !F6 KEY F7_KEY EQUATE(2055) !F7 KEY F8_KEY EQUATE(2056) !F8 KEY F9_KEY EQUATE(2057) !F9 KEY F10_KEY EQUATE(2058) !F10 KEY F11_KEY EQUATE(2059) !F11 KEY F12_KEY EQUATE(2060) !F12 KEY - 140 - TITLE('SHIFTED ALERT KEYS') SOURCE SHFT_SPACE EQUATE(289) !SHFT-SPACE BAR SHFT_ESC EQUATE(273) !SHFT-ESC KEY SHFT_BS EQUATE(275) !SHFT-BACKSPACE KEY SHFT_TAB EQUATE(276) !SHFT-TAB KEY SHFT_ENTER EQUATE(274) !SHFT-ENTER KEY SHFT_GMINUS EQUATE(277) !SHFT-GRAY MINUS KEY SHFT_GPLUS EQUATE(278) !SHFT-GRAY PLUS KEY SHFT_F1 EQUATE(3585) !SHFT-F1 KEY SHFT_F2 EQUATE(3586) !SHFT-F2 KEY SHFT_F3 EQUATE(3587) !SHFT-F3 KEY SHFT_F4 EQUATE(3588) !SHFT-F4 KEY SHFT_F5 EQUATE(3589) !SHFT-F5 KEY SHFT_F6 EQUATE(3590) !SHFT-F6 KEY SHFT_F7 EQUATE(3591) !SHFT-F7 KEY SHFT_F8 EQUATE(3592) !SHFT-F8 KEY SHFT_F9 EQUATE(3593) !SHFT-F9 KEY SHFT_F10 EQUATE(3594) !SHFT-F10 KEY SHFT_F11 EQUATE(3595) !SHFT-F11 KEY SHFT_F12 EQUATE(3596) !SHFT-F12 KEY TITLE('CONTROL ALERT KEYS') SOURCE CTRL_SPACE EQUATE(290) !CTRL-SPACE BAR CTRL_2 EQUATE(562) !CTRL-2 KEY CTRL_6 EQUATE(566) !CTRL-6 KEY CTRL_A EQUATE(577) !CTRL-A KEY CTRL_B EQUATE(578) !CTRL-B KEY CTRL_C EQUATE(579) !CTRL-C KEY CTRL_D EQUATE(580) !CTRL-D KEY CTRL_E EQUATE(581) !CTRL-E KEY CTRL_F EQUATE(582) !CTRL-F KEY CTRL_G EQUATE(583) !CTRL-G KEY CTRL_H EQUATE(584) !CTRL-H KEY CTRL_I EQUATE(585) !CTRL-I KEY CTRL_J EQUATE(586) !CTRL-J KEY CTRL_K EQUATE(587) !CTRL-K KEY CTRL_L EQUATE(588) !CTRL-L KEY CTRL_M EQUATE(589) !CTRL-M KEY CTRL_N EQUATE(590) !CTRL-N KEY CTRL_O EQUATE(591) !CTRL-O KEY CTRL_P EQUATE(592) !CTRL-P KEY CTRL_Q EQUATE(593) !CTRL-Q KEY CTRL_R EQUATE(594) !CTRL-R KEY CTRL_S EQUATE(595) !CTRL-S KEY CTRL_T EQUATE(596) !CTRL-T KEY CTRL_U EQUATE(597) !CTRL-U KEY CTRL_V EQUATE(598) !CTRL-V KEY CTRL_W EQUATE(599) !CTRL-W KEY CTRL_X EQUATE(600) !CTRL-X KEY CTRL_Y EQUATE(601) !CTRL-Y KEY CTRL_Z EQUATE(602) !CTRL-Z KEY CTRL_MINUS EQUATE(557) !CTRL-MINUS KEY CTRL_LBRK EQUATE(603) !CTRL-LEFT BRACKET KEY CTRL_RBRK EQUATE(605) !CTRL-RIGHT BRACKET KEY - 141 - CTRL_SLASH EQUATE(604) !CTRL-SLASH KEY CTRL_BS EQUATE(281) !CTRL-BACKSPACE KEY CTRL_GAST EQUATE(282) !CTRL-GRAY ASTERISK KEY CTRL_HOME EQUATE(283) !CTRL-HOME KEY CTRL_PGUP EQUATE(284) !CTRL-PGUP KEY CTRL_LEFT EQUATE(285) !CTRL-CURSOR LEFT KEY CTRL_RIGHT EQUATE(286) !CTRL-CURSOR RIGHT KEY CTRL_END EQUATE(287) !CTRL-END KEY CTRL_PGDN EQUATE(288) !CTRL-PGDN KEY CTRL_F1 EQUATE(2561) !CTRL-F1 KEY CTRL_F2 EQUATE(2562) !CTRL-F2 KEY CTRL_F3 EQUATE(2563) !CTRL-F3 KEY CTRL_F4 EQUATE(2564) !CTRL-F4 KEY CTRL_F5 EQUATE(2565) !CTRL-F5 KEY CTRL_F6 EQUATE(2566) !CTRL-F6 KEY CTRL_F7 EQUATE(2567) !CTRL-F7 KEY CTRL_F8 EQUATE(2568) !CTRL-F8 KEY CTRL_F9 EQUATE(2569) !CTRL-F9 KEY CTRL_F10 EQUATE(2570) !CTRL-F10 KEY CTRL_F11 EQUATE(2571) !CTRL-F11 KEY CTRL_F12 EQUATE(2572) !CTRL-F12 KEY TITLE('ALTERNATE ALERT KEYS') SOURCE ALT_0 EQUATE(1072) !ALT-0 KEY ALT_1 EQUATE(1073) !ALT-1 KEY ALT_2 EQUATE(1074) !ALT-2 KEY ALT_3 EQUATE(1075) !ALT-3 KEY ALT_4 EQUATE(1076) !ALT-4 KEY ALT_5 EQUATE(1077) !ALT-5 KEY ALT_6 EQUATE(1078) !ALT-6 KEY ALT_7 EQUATE(1079) !ALT-7 KEY ALT_8 EQUATE(1080) !ALT-8 KEY ALT_9 EQUATE(1081) !ALT-9 KEY ALT_A EQUATE(1089) !ALT-A KEY ALT_B EQUATE(1090) !ALT-B KEY ALT_C EQUATE(1091) !ALT-C KEY ALT_D EQUATE(1092) !ALT-D KEY ALT_E EQUATE(1093) !ALT-E KEY ALT_F EQUATE(1094) !ALT-F KEY ALT_G EQUATE(1095) !ALT-G KEY ALT_H EQUATE(1096) !ALT-H KEY ALT_I EQUATE(1097) !ALT-I KEY ALT_J EQUATE(1098) !ALT-J KEY ALT_K EQUATE(1099) !ALT-K KEY ALT_L EQUATE(1100) !ALT-L KEY ALT_M EQUATE(1101) !ALT-M KEY ALT_N EQUATE(1102) !ALT-N KEY ALT_O EQUATE(1103) !ALT-O KEY ALT_P EQUATE(1104) !ALT-P KEY ALT_Q EQUATE(1105) !ALT-Q KEY ALT_R EQUATE(1106) !ALT-R KEY ALT_S EQUATE(1107) !ALT-S KEY ALT_T EQUATE(1108) !ALT-T KEY ALT_U EQUATE(1109) !ALT-U KEY ALT_V EQUATE(1110) !ALT-V KEY ALT_W EQUATE(1111) !ALT-W KEY - 142 - ALT_X EQUATE(1112) !ALT-X KEY ALT_Y EQUATE(1113) !ALT-Y KEY ALT_Z EQUATE(1114) !ALT-Z KEY ALT_MINUS EQUATE(1069) !ALT-MINUS KEY ALT_EQUAL EQUATE(1085) !ALT-EQUAL KEY ALT_F1 EQUATE(3073) !ALT-F1 KEY ALT_F2 EQUATE(3074) !ALT-F2 KEY ALT_F3 EQUATE(3075) !ALT-F3 KEY ALT_F4 EQUATE(3076) !ALT-F4 KEY ALT_F5 EQUATE(3077) !ALT-F5 KEY ALT_F6 EQUATE(3078) !ALT-F6 KEY ALT_F7 EQUATE(3079) !ALT-F7 KEY ALT_F8 EQUATE(3080) !ALT-F8 KEY ALT_F9 EQUATE(3081) !ALT-F9 KEY ALT_F10 EQUATE(3082) !ALT-F10 KEY - 143 - С. Двоичные модули CLARION. Двоичные модули Clarion содержат подпрограммы, написанные на языке ассемблера или других языках программирования. Они представляют собой файлы, содержащие "образ памяти" (не требующие настройки на ад- реса), которые создаются из файлов .EXE командой ДОС EXE2BIN. Двоич- ные модули используют расширение имени файла .BIN. Файл .BIN содержит заголовок, массив описаний подпрограмм, и, для каждой подпрограммы, массив описаний параметров. Первая часть этого приложения описывает формат двоичного моду- ля. Затем следует часть с примерами, в которой обсуждается написание двоичного модуля, который обеспечивает интерфейс с подпрограммой, на- писанной на C. С.1. Формат двоичного модуля. Первые 6 байтов двоичного модуля составляют заголовок. Заголо- вок содержит сигнатуру 'BIO', за которой следует резервный байт, и затем слово, содержащее длину модуля. Процессор системы Clarion ис- пользует это поле. Завершающий байт содержит количество подпрограмм в модуле. На языке ассемблера заголовок кодируется следующим образом: DB 'BIO' ;сигнатура DD 0 ;резерв DW BINEND ;длина модуля DB 3 ;3 подпрограммы После заголовка следует описатель для каждой подпрограммы в мо- дуле. Каждый описатель состоит из: - имени подпрограммы; - смещение данной подпрограммы в двоичном модуле; - признак процедура/функция; - количество параметров; - массив описателей параметров. Имя подпрограммы должно быть не более 12 символов, и должно быть дополнено нулевыми байтами до длины в 13 байт. При вызове подпрограммы из двоичного модуля Процессор начинает ее выполнения со смещения от начала модуля, указанного в описателе подпрограммы. Признак процедура/функция устанавливается в 0 для процедур и в 1 для функций. Байт количества параметров задает количество параметров, ожида- емых процедурой или функцией. На языке ассемблера описатель функции кодируется следующим образом: DB 'TRANSLATE'0,0,0,0 ;имя функции DW TRNSLATE ;смещение функции DB 1 ;это функция DB 1 ;с одним параметром Каждый описатель параметра содержит тип параметра, адрес пере- даваемого параметра и длину данных по этому адресу. При вызове проце- дуры или функции Процессор преобразует каждый параметр в запрашивае- мый тип, и проставляет его адрес и длину. Поддерживаются следующие типы параметров: 0 - строка (string) 1 - слово со знаком (signed word-16 бит) - 144 - 2 - двойное слово со знаком (signed double word-32 бита) 4 - число с плавающей запятой двойной точности (формат 8087) На языке ассемблера описателм параметров кодируются следующим образом: DB 0 ;строка PARM1 DD 0 ;здесь адрес DW 0 ;здесь длина DB 2 ;целое PARM2 DD 0 ;здесь адрес DW 0 ;здесь длина Для возврата в Процессор, используйте длинный возврат (который перезагружает CS:IP). Для возврата значения из функции, установите AL в значение, соответствующее типу возвращаемого значения (используя значения, описанные выше), и установите BX в значение относительного смещения возвращаемой величины относительно начала модуля (включая заголовок и все описатели). Если возвращаемое значение является стро- кой (AL=0), то надо установить CX равным длиной строки. C.2. Написание двоичного модуля, который обеспечивает интерфейс с подпрограммой, написанной на C. При написании двоичного модуля необходимо учитывать следующие соглашения: - каждый язык программирования имеет свои специфические соглашения вызова процедур и функций, и некоторые языки включают вызовы внутрен- них подпрограмм для выполнения преобразований и т.п. Вам необходимо знать эти соглашения для специфического языка, который Вы хотите ис- пользовать. С целью обсуждения этих проблем наш пример будет исполь- зовать язык C. - для создания двоичных модулей используются редактор связей и прог- рамма EXE2BIN. Таким образом, код программы должен быть независимым от позиции загрузки, и должны избегаться межсегментные вызовы и пере- ходы. - программа EXE2BIN ограничивает размеры файла до 64К. Первым шагом в написании двоичного модуля являеися создание ас- семблерного модуля, который содержит заголовок двоичного модуля и код, необходимый для трансляции вызова из Clarion в необходимые сог- лашения по вызову для конкретного языка. Информация из заголовка дает Процессору информацию о количесиве процедур и/или функций в двоичном модуле, является ли подпрограмма процедурой или функцией, параметры для каждой подпрограммы, и типы параметров. Так же включается относи- тельное смещение подпрограммы в двоичном модуле. После создания заголовка необходимо написать ассемблерную подп- рограмму для транслирования переданных параметров в те, которые ожи- дает подпрограмма на другом языке. Необходимо при этом ответить на следующие вопросы: 1. Как передаются аргументы: в стеке, или через глобальную об- ласть памяти, и какой порядок параметров при передаче через стек. При использовании компилятора Turbo C 1.0 с соглашениями Turbo Pascal'я, параметры передаются в стек и затем вызывается подпрограм- ма. При выходе из подпрограммы на C, передаваемые параметры удаляются из стека самой подпрограммой. При использовании соглашений языка C параметры удаляются из стека вызывающей программой. При соглашениях - 145 - Pascal'я параметры передаются слева направо, а при использовании сог- лашений C передаются справа налево. - как вызываются подпрограммы? По вызову или по переходу с сохранением адреса возврата где-либо? Вызы- ваемая процедура должна ожидать близкий вызов или переход, для того, чтобы была возможность преобразовать двоичный модуль из .EXE в .BIN. Подпрограмма на C должна быть откомпилирована с использованием компактной модели памяти компилятором Turbo C. При использовании этой модели памяти все функции C вызываются близкими или внутрисегментными вызовами. 2. Как возвращается результирующее значение? Еслди в регистрах, то в каких? Или через глобальную память? В Turbo C значения возвращаются в регистрах. Целые, беззнако- вые, или односимвольные значения возвращаются в регистре AX; указате- ли в виде DX:AX; значения с плавающей запятой возвращаются в стеке плавающей запятой, и длинные значения возвращаются в DX:AX. Тип возв- ращаемого значение должен быть известен заранее. 3. Какие другие внутренние подпрограммы должны быть связаны в двоичный модуль? Компилятор Turbo C использует некоторые внутренние функции для преобразования и выполнения арифметических действий. Для определения таких функций используйте опцию -S для вывода ассемблерного текста для программы на C. В двоичных модулях не могут использоваться опера- ции с плавающей запятой и функции типа malloc, calloc и farmalloc. 4. Какие имена сегментов и классов используются компилятором? Понимание того, как работают все сегменты и группы, необходимо для того, чтобы сделать двоичные модули, объединяющие группу .obj-файлов. Имена сегментов, используемые в Turbo C, очень просты. Коды на- ходятся в сегменте _TEXT, неинициализированные данные находятся в сегменте _BSS, инициализированные данные назодятся в сегменте _DATA. Все эти сегменты группируются вместе в DGROUP в следующем порядке: _TEXT, _DATA и _BSS. Это группирование создает один сегмент. Мы ис- пользуем дополнительный сегмент LEMEND для уверенности, что наш мар- кер конца LEM правильно размещается во время связывания. - 146 - D. Файл определения кодов ошибок. Файл кодов ошибок (ERRORS.CLA) содержит определения для мнемо- нических обозначений всех кодов ошибок. Вы можете использовать этот файл для поиска сообщения об ошибке, которое соответствует значению, возвращаемому функцией ERRORCODE(). Данный файл располагается в сис- темной директории Clarion. TITLE('ERRORCODE EQUATES') SOURCE ! Возвращаемые значения Возвращаемые значения ! функцией ERRORCODE() функцией ERROR() NO_ERROR EQUATE(0) ! '' BADFUNC_ERR EQUATE(1) ! 'INVALID FUNCTION NUMBER' NOFILE_ERR EQUATE(2) ! 'FILE NOT FOUND' NOPATH_ERR EQUATE(3) ! 'PATH NOT FOUND' TOOMANY_ERR EQUATE(4) ! 'TOO MANY OPEN FILES' NOACCESS_ERR EQUATE(5) ! 'ACCESS DENIED' BADHNDLE_ERR EQUATE(6) ! 'INVALID HANDLE' BADMEM_ERR EQUATE(7) ! 'MEMORY CORRUPTED' NOMEM_ERR EQUATE(8) ! 'INSUFFICIENT MEMORY' BADBLOCK_ERR EQUATE(9) ! 'INVALID MEMORY BLOCK ADDRESS' BADENVIR_ERR EQUATE(10) ! 'INVALID ENVIRONMENT' BADFORM_ERR EQUATE(11) ! 'INVALID FORMAT' BADACC_ERR EQUATE(12) ! 'INVALID ACCESS CODE' BADDATA_ERR EQUATE(13) ! 'INVALID DATA' BADDOS_ERR EQUATE(14) ! 'UNKNOWN DOS ERROR' BADDRIVE_ERR EQUATE(15) ! 'INVALID DRIVE' NODELETE_ERR EQUATE(16) ! 'CAN'T DELETE CURRENT DIRECTORY' NOTSAME_ERR EQUATE(17) ! 'NOT SAME DEVICE' NOFILES_ERR EQUATE(18) ! 'NO MORE FILES' MNOTFND_ERR EQUATE(19) ! 'MODULE NOT FOUND' PNOTFND_ERR EQUATE(20) ! 'PROCEDURE OR FUNCTION NOT FOUND' BADSUB_ERR EQUATE(21) ! 'SUBSCRIPT OUT OF RANGE' NUMPARM_ERR EQUATE(22) ! 'INCORRECT NUMBER OF PARAMETERS' BINFNC_ERR EQUATE(23) ! 'DEFINED AS FUNCTION IN BINARY MODULE' BINPRC_ERR EQUATE(24) ! 'DEFINED AS PROCEDURE IN BINARY MODULE' BADEXT_ERR EQUATE(25) ! 'EXTERNAL PARAMETER NOR PASSED' MATHERR_ERR EQUATE(26) ! 'FLOATING POINT EXCEPTION ERROR' NOMATCH_ERR EQUATE(27) ! 'DATA FILE DOES NOT MATCH PROGRAM' !NOT USED EQUATE(28) RETIMM_ERR EQUATE(29) ! 'RETURN LOCATION WOULD BE OVERLAID' NOENTRY_ERR EQUATE(30) ! 'ENTRY NOT FOUND' BADENTRY_ERR EQUATE(31) ! 'ENTRY NOT AVAILABLE' ISLOCKED_ERR EQUATE(32) ! 'FILE IS ALREADY LOCKED' BADREC_ERR EQUATE(33) ! 'RECORD NOT AVAILABLE' EOF_ERR EQUATE(34) ! 'END OF FILE' NOREC_ERR EQUATE(35) ! 'RECORD NOT FOUND' BADDAT_ERR EQUATE(36) ! 'INVALID DATA FILE' NOTOPEN_ERR EQUATE(37) ! 'FILE NOT OPEN' BADKEY_ERR EQUATE(38) ! 'INVALID KEY FILE' MAXKEY_ERR EQUATE(39) ! 'TOO MANY KEYS' DUPKEY_ERR EQUATE(40) ! 'CREATES DUPLICATE KEY' NOTCOMP_ERR EQUATE(41) ! 'MODULE NOT COMPILED ! WITH CURRENT GLOBAL DATA' INVALKEY_ERR EQUATE(42) ! 'INVALID KEY DECLARATION' ISHELD_ERR EQUATE(43) ! 'RECORD IS ALREADY HELD' BADPROG_ERR EQUATE(44) ! 'INVALID CLARION PROGRAM' BADNAME_ERR EQUATE(45) ! 'INVALID FILENAME' KEYBAD_ERR EQUATE(46) ! 'KEY FILE MUST BE REBUILT' - 147 - INVALDAT_ERR EQUATE(47) ! 'INVALID RECORD DECLARATION' SYMFIL_ERR EQUATE(48) ! '.SYM FILE NOT FOUND' CANTLOG_ERR EQUATE(49) ! 'UNABLE TO LOG TRANSACTION' MISRET_ERR EQUATE(50) ! 'MISSING RETURN' ISOPEN_ERR EQUATE(51) ! 'FILE ALREADY OPEN' HASERR_ERR EQUATE(52) ! 'HAS COMPILE ERRORS' BADFILE_ERR EQUATE(53) ! 'INVALID CLARION FILE' NOCREAT_ERR EQUATE(54) ! 'NO CREATE ATTRIBUTE' NOSHARE_ERR EQUATE(55) ! 'FILE MUST BE SHARED' KEYMISM_ERR EQUATE(56) ! 'KEY AND FILE MISMATCH' PARMMISM_ERR EQUATE(57) ! 'EXTERNAL PARAMETER TYPE MISMATCH' NOOPSCRN_ERR EQUATE(58) ! 'NO OPEN SCREEN' ISLOGOUT_ERR EQUATE(59) ! 'LOGOUT ALREADY ACTIVE' BADMEMO_ERR EQUATE(60) ! 'INVALID MEMO FILE' EXTPARM_ERR EQUATE(61) ! 'EXTERNAL PARAMETER EXPECTED' BADIDLE_ERR EQUATE(62) ! 'ASK/ACCEPT IN IDLE PROCEDURE' EXCLREQ_ERR EQUATE(63) ! 'EXCLUSIVE ACCESS REQUIRED' SHARVIO_ERR EQUATE(64) ! 'SHARING VIOLATION' CANTROL_ERR EQUATE(65) ! 'UNABLE TO ROLLBACK TRANSACTION' BADFEXT_ERR EQUATE(66) ! 'INVALID FILE EXTENSION' FILOPRO_ERR EQUATE(67) ! 'FILE OPENED READ-ONLY' VMERR_ERR EQUATE(68) ! 'VIRTUAL MEMORY ERROR' NORMAL_EXIT EQUATE(69) ! 'NORMAL END OF PROGRAM' CTRLBRK_EXIT EQUATE(70) ! 'USER ABORTED BY CONTROL BREAK' CRITERR_EXIT EQUATE(71) ! 'CRITICAL ERROR ABORT' RUNHALT_EXIT EQUATE(72) ! 'RUN TIME HALT'