ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

PARADOX APPLICATION LANGUAGE

 ____________________________________________________________
  
                                            PAL User's Guide
     
     
     
     
     
     
     
              P A R A D O X   A P P L I C A T I O N
     
                      L A N G U A G E
                                           
     
     
     
     
     
     
.

                           - 3 -
                           
     
     
                         
                         СОДЕРЖАНИЕ
     
     
     ЧАСТЬ   I.ОСНОВНЫЕ  ПОНЯТИЯ
     
                   ГЛАВА 1. ВВЕДЕНИЕ В PAL
     
                   ГЛАВА 2. СЦЕНАРИИ
     
                   ГЛАВА 3. РЕДАКТОР
     
                   ГЛАВА 4. МЕНЮ PAL
     
     
     ЧАСТЬ  II.ОПИСАНИЕ  ЯЗЫКА И ТЕХНИКИ ПРОГРАММИРОВАНИЯ
     
                   ГЛАВА 5. ВЗАИМОДЕЙСТВИЕ С ПОЛЬЗОВАТЕЛЕМ
     
                   ГЛАВА 6. БЛОКИ СОСТАВЛЯЮЩИЕ PAL
     
                   ГЛАВА 7. ТЕХНИКА ПРОГРАММИРОВАНИЯ PAL
     
                   ГЛАВА 8. ОТЛАДЧИК СЦЕНАРИЕВ (DEBUGGER)
     
     
     ЧАСТЬ III.ОПИСАНИЕ КОМАНД И ФУНКЦИЙ
     
                   ГЛАВА 9. КОМАНДЫ
     
                   ГЛАВА 10.ФУНКЦИИ
     
.

                           - 4 -
                           
                                               
                                               Ч А С Т Ь  1
 __________________________________________________________
     
                 О С Н О В Н Ы Е   П О Н Я Т И Я
 __________________________________________________________
     
  Глава 1. Ведение в PAL
       Что такое PAL
       Использование PAL
     
  Глава 2. Cценарии
     Элементы  сценариев
       Выбор меню
       Специальные клавиши
       Строки в кавычках
       Сборка сценариев
     Выводы
     
  Глава 3. Редактор сценариев PAL
     Составление и редактирование сценариев
       Как войти в редактор
       Работа с редактором
       Функциональные клавиши и меню
     Сценарии накопленных вопросов редактора
     
  Глава 4. Меню PAL
     Доступность меню PAL
       Play (запустить)
       BeginRecord (Началo записи)
       Debug (Отладка)
       Value (Значение)
       MiniScripts(Мини сценарий)
     
.

                           - 5 -
                           
                               
                                                 Г Л А В А  1
 ____________________________________________________________
     
                 В В Е Д Е Н И Е  В  P A L
 ____________________________________________________________
  
                          ЧТО ТАКОЕ PAL?
                          ______________
     
     PAL  -  (  прикладной  язык PARADOX`a) высоко уровневый
 структурированный  программный   язык,   который   суммарно
 обьединен   с   PARADOXом.   PAL  позволяет  вам  расширить
 возможности PARADOXа таким образом, что вы можете быстро  и
 легко создать прикладные системы.
     Cовместно  с  Редактором  и  Отладчиком,  PAL и PARADOX
 образуют полную пользовательскую среду. Но PAL пригоден  не
 только  для  разработок.  Он  также  позволяет  вам  писать
 макрокоманды клавиатуры, которые  вам  необходимы,  и  даже
 конструировать  свои  меню в PARADOXе. Короче, PAL позволит
 вам использовать PARADOX в вашей работе.
     PAL  автоматически  взаимодействует  с  PARADOX`ом  под
 вашим полным контролем. Вы изучаете автоматический доступ к
 каждой  операции  PARADOX`a, включая запросы, использование
 форм и отчетов, сортировку, редактирование  и  диагностику.
 Если вы используете PARADOX и пишите сценарии, то вы вскгда
 используете PAL. Сценарии PARADOX`a являются программами на
 PALе  и PAL- программы являются сценариями PARADOX`a. Таким
 образом,  программистам,  которые  начинают  знакомиться  с
 PARADOX`ом, не стоит особого труда применения языка PAL.
     


                           - 6 -
     PAL - полная программная окружающая среда
     _________________________________________
     Совместно с возможностями PARADOX`a PAL открывает новый
 метод его использования. Вы можете использовать PARADOX для
 быстрого моделирования и изменения компонент, и после этого
 использовать   команды  PAL  для  упаковки  этих  компонент
 вместе.   В   других   системах   вы    можете    создавать
 пользовательские   экраны   серией  команд,  которые  имеют
 небольшое или совсем не имеют отношение к отображаемому  на
 экране.  В  PALе  этот  процесс очень отличается. Используя
 простые формы PARADOX`a, вы можете  выстро  создать  формы,
 которые  используются  для ввода данных и отображения. Ваши
 формы пользователь увидит на экране.  Для  создания  вашего
 экрана  с помощью PAL программы потребуется минимум усилий.
 Проектирование вывода на печать также более  просто  в  PAL
 посредством генератора отчетов.
     PAL  и  PARADOX  - новая ступень в программировании баз
 данных. Если вы являетесь программистом или  пользователем,
 вы будете использовать мощные языковые конструкции, которые
 предлагает   PAL.   Также   PAL   дает  вам  неограниченное
 количество переменных и массивов,  мощные  по  возможностям
 процедуры,  взаимосвязанные  отладчики и широкую библиотеку
 функций, включающую математические, финансовые.  Даже  если
 вы являетесь пользователем, использующим другие системы баз
 данных вы найдете PAL более богатым и элегантным.
     Приведем некоторые основные особенности PAl.
     >>>>  Доступ  к  ресурсам PARADOX`a. Посредством PAL вы
 можете   получить   доступ    к    широким    возможностям,
 представляемым  PARADOXом.  Здесь  представленно  несколько
 наболее полезных особенностей PARADOX`a, имеющих  отношение
 к используемой разработке:
     >>    язык    вопросов    PARADOX`a    с   его   мощным
     query-bu-еxample     интерфейсом      позволит      вам
     конструировать  запросы от простейших до самых сложных.
     Широкие возможности, которые обьединяют много таблиц  в
     единственный  запрос  встроены  в PARADOX. PAL дает вам
     возможность  для  взаимосвязи  переменных  в  запросах.
     Уникальная способность PARADOX`a (QuerySave) делает его


                           - 7 -
     незаменимым  для  вас  при использовании вопросительных
     выражений в ваших PAL программах.
     >>  PAL  имеет  прямой  доступ  к  управлению  широкими
     возможностями     PARADOX`a.    Значения    проверяются
     автоматически. Другие типы имеющихся проверок,  включая
     форматирование  картинок  и просмотр таблиц, могут быть
     быстро и просто установлены в любом месте.
     >> Вы можете быстро создавать новые табличные структуры
     быстро  по   мере   необходимости   вы   можете   также
     модифицировать  существующие  структурные  таблицы  без
     риска потери данных. Отметим, что всякий раз, когда  вы
     модифицируете  структуру таблицы, PARADOX автоматически
     обновляет  все  обьекты,  связанные  с  этой   таблицей
     (формы, отчеты и указатели).
     >>  PAL,  кроме  того,  дает  вам  доступ  к генератору
     отчетов  PARADOX`a,  который  позволяет   вам   создать
     разнообразные   выходные   форматы.  Генератор  отчетов
     содержит до 16 уровней. Он  также  выводит  вычисленные
     значения, содержащими одно или более полей.
     >>>> Неограниченное число переменных и массивов. В  PAL
 количество  переменных  и  массивов  вы  можете  определить
 ограничиваясь только системной памятью. Массивы могут иметь
 почти   неограниченное   количество   элементов.    Простое
 построение   массивов   производится  манипуляцией  входных
 записей, что позволяет вам  использовать  все  преимущества
 PARADOX`a.
     >>>> Очень мощное представление процедур. PAL размещает
 без ограничений то количество процедур, которое требуется в
 данное время.
     В внутри  процедуры PAL позволяет:
     >> локальные и глобальные переменные;
     >> рекурсию;
     >> динамический размер переменных;
     >>  определение  процедуры  и  ее употребление в других
 языках высокого уровня, таким как СИ и Pascal и способность
 ее автоматически создавать и управлять библиотеками  других
 процедур.


                           - 8 -
     >>>> Имеется большая библиотека встроенных функций.
     >>  Большое  количество  математических,  статических и
     трансцендентных функций.
     >> Финансовые функции, такие как вычисление зарплаты  и
     вычисление вознаграждения и стоимости.
     >>   Мощные   функции,   которые   позволяют  упростить
     синтаксический  поиск  по   образцу   так   же   ка   и
     форматирование текстов.
     >>    Установка    функций,   которые   позволяют   вам
     манипулировать   и   определять    признаки    обьектов
     PARADOX`a.
     >>>> Широкие возможности экрана и клавиатуры по вводу и
 выводу  информации - PAL дает вам полное управление по всем
 аспектам   ввода-вывода   и   взаимодействия   с   конечным
 пользователем.   Как   отмечалось   ранее,   обычная  форма
 PARADOX`а позволяет разбивать ввод данных и вывод на экраны
 для  вашего  приложения.  Специальная  функция  WAIT   дает
 выборочное  управление для пользователей таким образом, что
 они могут читать или обновлять записи, поля  или  введенные
 таблицы  до тех по пока они не нажмут определенную клавишу,
 которая возвращает управление вашему сценарию.
     >>>> Простейший контроль - в дополнение  к  стандартным
 управляющим    структурам,    таким    как    IF-THEN-ELSE,
 WHILE-ENDWHILE  и  SWITCH-CASE,  PAL  имеет   мощную   SCAN
 конструкцию,  которая  быстро  выполняет последовательность
 операторов для каждого элемента таблицы.
     >>>> Простота  в  создании  вторичных  индексов  -  при
 помощи  PAL  вы  можете  установить  вторичные  индексы для
 таблиц  PARADOX`a.  Они  могут  быть  легко  созданы  после
 создания   для   ускорения   доступа.   Вторичные   индексы
 поддерживаются автоматически.
     >>>>  Полная  паролевая  защита  -  PAL  позволяет  вам
 отобрать шифрованные данные в таблицах и сценариях.
     >>>>   Макрооперации  -  вы  можете  вычислить  строки,
 которые интерпретируются как команды.


                           - 9 -
     >>>> Сокращенные команды  меню  -  PAL  предлагает  вам
 специальный  класс команд, которые позволяют вам изображать
 процесс  выбора  меню  в  PARADOX`е   путем   использования
 синтаксиса и параметров программы языкового стиля.
     Для  непрограммистов,  PAL  обеспечивает простой путь к
 изучению программирования.  Если  вы  записали  сценарий  в
 PARADOX`е,  можно программировать без знания его. С помощью
 редактора для  расширения  записываемого  сценария,  вы  вы
 можете использовать их внутри программ. И нет необходимости
 начинать  программирование для того, чтобы извлекать пользу
 из PAL  как  только  вам  потребуется  увеличить  мощьность
 PARADOX`a в вашей ежедневной работе.
     
                 ПЕРЕД ИСПОЛЬЗОВАНИЕМ  PAL
                 
     Ввиду   того,   что   PAL  и  PARADOX  являются  сильно
 интегрированными,   наиболее   важным    требованием    для
 использования   PAL   является   понимание  PARADOX`a.  Без
 основных знаний концепций  и  способностей  PARADOX`a  ваши
 возможности в использовании PAL будут ограничены. Чем лучше
 вы  знаете PARADOX, тем более полно вы сможете использовать
 преимущества его в ваших PAL программах.
     Естественно,  для  программистов,  которые  привыкли  к
 традиционным  методологиям, нужно начинать программирование
 в традиционном стиле. Рассмотрим простой пример. Если вы не
 были осведомлены, что PARADOX имеет широкие возможности  по
 упрвлению  данными, можно будет логически принять, что даты
 должны  быть  представлены   в   форме   "yyyy/mm/dd"   для
 сортировки  их  и для производства арифметических действий.
 Это  тот  случай,  который  встречается  во  многих  других
 программах  баз  данных,  однако,  по  мере  того,  как  вы
 знакомитесь   с   PARADOX`ом,   поддерживающим    конверсию
 автоматически,  вы  начнете  позволять  PARADOX`у управлять
 данными за вас. Этот пример имеет аналогии во многих других
 программах. Как только вы получите знания и познакомитесь с
 PARADOX`ом, вы будете ценить его мощь  и  чувствовать  себя
 более  комфортабельно. Вы найдете, что можете разрабатывать
 программы с  меньшей  принужденностью,  в  более  свободных


                           - 10 -
 формах. Вы сможете использовать PARADOX как прототип многих
 компонент  сложных  приложений,  включая  таблицы, вопросы,
 формы  и  записи.  Вы  сможете  быстро  проверять  идеи   и
 концепции.
     Запись-сценарий    PARADOX`a    фактически    позволяет
 проверить  различные  решения   проблем   без   какого-либо
 программирования. Вы записываете сценарий, который содержит
 полезный  шаблон,  а затем можете использовать редактор PAL
 для того, чтобы прочитать сценарий в программу.
                                          
                  Как использовать эту книгу?
     
     Руководство  использования  по   языку   PAL   является
 введением в концепции и технику программирования на PALе, а
 также справочником по языку.
     Книга  делится на три части: Основные понятия, Описание
 языка  и  техники  программирования,  Справочник  команд  и
 функций.
 
                 Часть 1. Основные понятия.
      
     Всякий,  кто  хочет  изучить  PAL,  должен прочитать об
 основных понятиях. В этом разделе три главы.
     Глава  2.  Сценарии.В  главе  обсуждается  как  PARADOX
 представляет  ключевые слова в сценариях, когда вы создаете
 этот сценарий,  записываемых  его.  Изучение  путей  записи
 сценариев становится необходимым при изучении PAL.
     Глава  3.  Редактор  PAL  сценариев. Описывает редактор
 сценариев PAL. Редактор является средой, в которой сценарии
 просматриваются, редактируются, печатаются и комбинируются.
     Глава 4. Меню PAL,  описывает  доступные  разделы  меню
 PAL.
     
 


                           - 11 -
    Часть 2. Описание языка и технически программирования
     
     Четыре главы  представляют  информацию,  которая  будет
 полезной при построении PAL программы.
     Глава  5.  Взаимодействие  с  пользователем.  Описывает
 ручной ввод программ с клавиатуры.
     Глава 6. Блоки, составляющие  PAL.  Представляет  собой
 детальное   описание   компонент  языка,  включая  создание
 выражений, команд, процедур, типов данных и других основных
 понятий.
     Глава 7. Техника  программирования  Представляет  собой
 краткое    обсуждение    методов    программирования   PAL,
 технических приемов и стилей.
     Глава 8. Отладчик  PAL.  Описывает  систему  отладки  в
 PALе.   Используя  систему  отладки,  вы  можете  выполнять
 сценарий по шагам и  видеть  результаты  каждой  инструкции
 непосредственно.
     
             Часть 3. Справочник команд и функций
      
     Эти  главы являются алфавитными списками команд/функций
 с полным описанием синтаксиса, употребления и эффектов.
     Глава 9. Команды, включает все команды PAL.
     Глава 10. Функции, включает около 100 строящих  функций
 PAL.
.

                           - 12 -
                           
     
                                               Г Л А В А  2
 ___________________________________________________________
     
                С Ц Е Н А Р И И
 ___________________________________________________________
      
               ЭЛЕМЕНТЫ ЗАПИСЫВАЕМЫХ СЦЕНАРИЕВ
               _______________________________
    
    Когда  вы  используюте  выборку   SCRIPTS/BEGIN   RECORD
 Парадокса  или открываете запись сценариев клавишей ALT F3,
 Парадокс  автоматически  записывает  клавишу  в   сценарий.
 Записанные  сценарии  вы  можете увеличивать, связывая их в
 более тщательно сделанный сценарий. Вы можете  использовать
 также  PAL  для  того,  чтобы  упаковать вместе любое число
 записываемых   сценариев   в    большие    сценарии.    PAL
 проектировался  для  того,  чтобы  помочь  быстро  и просто
 развивать простые и сложные программы и системы.
     Эта глава имеет большое значение для вашей работы с PAL
 путем просматривания элементов,  которые  включают  в  себя
 записанные сценарии.
     Записанные    сценарии    содержат   последовательность
 ключевых слов и команд PARADOX`a. Четыре  класса  элементов
 могут  присутствовать  в  написанном  сценарии: выбор меню,
 специальные  клавиши   PARADOX`a,   символьные   строки   в
 кавычках, представления вопросов.
     >>>>  Выбор  меню  - где бы вы не осуществляли выбор из
 меню  или  некоторых  типов  PARADOX`a  (таких  как   имена
 некоторых  таблиц, созданных вами ) во время взаимодействия
 с меню, меню появляется в сценарии, заключенным в скобки ({
 }).
     
     >>>> Специальные клавиши PARADOX`a - где бы не нажимали
 клавиши, которые имеют специальное назначение в  PARADOX`е,
 такие   как   функциональные  клавиши,  клавиши  управления


                           - 13 -
 курсором, последовательность ключевых команд ( [Ctrl] [ R ]
 ), или другие клавиши, такие как [Enter] или [Esc], нажатая
 клавиша  записывается   используемыми,   зарезервированными
 словами ( такими как EDITKEY для [F9] (EDIT)).
    
     >>>>  Строки  в кавычках - когда вы набираете строки, в
 свободном пространстве меню -  имя  редактируемой  таблици,
 номер формы, или отчета - строки записываются, заключенными
 между двойными кавычками.
     Например:
     
        Выбор из меню                  Специальные команды
       /       /     \                  /       /      \
     {Modify} {Sort} {stock} {stksrot} Down "1" DO_IT! Menu
     {Scripts}{EndRecord}
     
     >> Когда вы запишете предложения запроса с помощью  ус-
     луги   scripts/querysave  PARADOX  запишет  графическое
     представление запрсов в программу. Если у  Вас  имеется
     таблица:
      
     WorkSpase
     
      NOTES---Company Name---Last Update---Notes 1---Notes 2
            :              :             :         :
            : +S..         : +>=1/30/85  : +       : +
            :              :             :         :
            :              :             :         :
           
     то графическое представление запроса выглядит следующим
     образом:
     
     Query
         
      NOTES:Company Name:Last Update     :Notes 1:Notes 2
           : CHECK S..  : CHECK >=1/30/85: CHECK : CHECK
     


                           - 14 -
     EndQuery
     Следующий параграф рассматривает каждый из четырех эле-
 ментов, записываемых в сценарии.
     
                           ВЫБОР МЕНЮ
                           
     PARADOX заключает в фигурные скобки все выборы, которые
 вы  можете  сделать  из  меню и все другие типы, которые вы
 получаете во время взаимодействия с меню, такие как  отклик
 на приглашение,
     Заметим,  что  PARADOX  не  записывает  каждое ключевое
 слово, которое вы выбираете  пока  находитесь  в  меню.  Он
 записывает   только   выбранные  вами  пункты  меню  ,  или
 значения, которые вы предусмотрели в отклике на приглашение
 меню.
     
          Команда главного меню       Образец   директории
         /                            \ печатается в отве-
        /   Команда  Tools меню        \ те на запрос
       /    \                           \
      /      \                           \
     {Tools} {Info} {Inventory} {Files} {su*.*} Menu
     {Scripts} {EndRecord}
     
     Например, PARADOX не записывает каждое ключевое  слово,
 которое вы выбираете при нажатии клавиш управления курсором
 в  меню,  или  при  использовании  клавиши  [BackSpace] для
 стирания   символов.   Программа   не   будет    записывать
 последовательность,  в которой вы пытаетесь выбрать таблицу
 или сценарий, которые на самом деле не существуют.
 
 
     
                       СПЕЦИАЛЬНЫЕ КЛАВИШИ
                       
     Во  время  записи  сценария  вы   нажимаете   одну   из
 специальных    клавиш    PARADOX`a,   имена   этих   клавиш


                           - 15 -
 записываются. В случае, когда нажатая клавиша записывается,
 имя специальной клавиши представляется в комбинации верхних
 и нижних  букв,  для  того,  чтобы  было  легко  читать.  В
 таблице,  приведенной  ниже  приведена  каждая  специальная
 клавиша и ее представление в скрипте.
 
     
.

                           - 16 -
                           
     Специальные клавиши в скриптах
     _____________________________________________________
                                                          
     Группа              Клавиша             Представление
                                             в скрипте
     _____________________________________________________
                                                          
     Управление          [HOME]              Home
                         [End]               End
                         [PgUp]              PgUp
                         [PgDn]              PgDn
                         [<-]                Left
                         [->]                Right
                         [Стрелка вверх]     Up
                         [Стрелка вниз]      Down
                         [Enter]             Enter
                         [Backspase]         Backspase
                         [Tab]               Tab
                         [Ins]               Ins
                         [Del]               Del
                         [Esc]               Esc
                         [Shift][Tab]        ReversTab
                         [Ctrl][Break]       CtrlBreak
                         [Ctrl][Home]        CtrlHome
                         [Ctrl][End]         CtrlEnd
                         [Ctrl][<-]          CtrlLeft
                         [Ctrl][->]          CtrlRight
                         [Ctrl][Backspase    CtrlBacks
                         [Ctrl][PgUp]        CtrlPgUp
                         [Ctrl][PgDn]        CtrlPgDn
     Специальные Ctrl    [Ctrl][D]           Ditto
     последовательности  [Ctrl][E]           Editor
                         [Ctrl][F]           FieldView
                         [Ctrl][O]           DOS
                         [Ctrl][R]           Rotate
                         [Ctrl][U]           Undo
                         [Ctrl][V]           VertRuler
                         [Ctrl][Y]           DeleteLine


                           - 17 -
     Функциональные      [F1]                Help
     клавиши             [F2]                DO_IT!
                         [F3]                UpImage
                         [F4]                DownImage
                         [F5]                Example
                         [F6]                Check
                         [F7]                FormKey
                         [F8]                ClearImage
                         [F9]                EditKey
                         [F10]               Menu
     Функциональные      [Alt][F3]           InstantRecord
     клавиши с Alt       [Alt][F4]           InstantPlay
                         [Alt][F5]           FieldView
                         [Alt][F6]           CheckPlus
                         [Alt][F7]           InstantReport
                         [Alt][F8]           ClearAll
                         [Alt][F10]          PALMenu
     
     Стрелки, нажатые  в  области  меню  и  любое  сделанное
 исправление  в  идентификаторах  директория  или таблице не
 записываются в сценарий.
                                    Клавиша  счетчика  строк
                                     показывает номер строки
                                             \
                                              \
     {Report}{Change}{stock}{R}{Stock Report} VertRuler Menu
     {Field}{Unit Prise}{Sum}{Overall} End Up Up Up Up Right
     Right Enter Enter Enter DO_IT! {Scripts} / {End-Record}
      \                                      /
       \                         [стрелка вверх] продвижение
        \                        к 17 строке в нижней  части
         \                       страницы
        [->] продвижение на два пробела
     
     [End] клавиша продвижения к концу описания отчета
           (21строка)


                           - 18 -
     
     
                        СТРОКИ В КАВЫЧКАХ
                        
     Когда вы набираете текст свободного  пространства  меню
 во  время  записи  сценария,  текст  будет представляться в
 сценарии  как  строка  символов,  заключенных   в   двойные
 кавычки.  Такие строки создаются, когда вы вводите данные в
 таблицу  или  форму  во  время  редактирования  или  записи
 данный,  когда вы вводите дословно форму или детали отчета,
 когда вы устанавливаете порядок  сортировки  в  сортируемых
 формах и когда вы вводите во многие другие места в PARADOX.
     Ниже  приведен  скрипт,  который создает новую таблицу,
 названную orders, устанавливает ее стьруктуру, помещает  ее
 в рабочую область, и затем заполняет первые пять записей:
     
     {Create} {orders} "Month" Right "A30" Down
     "Week} Right "N" Down
     "Customer" Right "A30" Down
     "Part No" Right "N" Down
     "Quan Ordered" Right "N" Down
     "Order Date" Right "A30" DO_IT! {View}{purchase} EditKey
     Enter "2" Right "Acme Hardware" Right "10028" Right "23"
     Right "1/31/84/" Down
     "June" Right "2" Right "Acme Hardware" Right "27001"
     Right "23" Right "1/31/84" Down
     DO_IT! Menu {Scripts} {End-Record}
                                       
     
                     ПРЕДСТАВЛЕНИЕ ЗАПРОСОВ
                     
     Как  сказано  в  10 главе "Руководства для пользователя
 PARADOX`a" вы можете включать вопросительные утверждения  в
 запросов при помлщи выбора QuerySave из меню сценариев пока
 вопросительные    высказывания   отображаются   в   рабочем
 пространстве.


                           - 19 -
     При использовании QuerySave,  запросы  накапливаются  в
 графическом  виде, также и появляются на экране. Это делает
 утверждения   запросов   видимыми   на   экране    и    его
 представлением как QuerySave в сценарии.
     
       PRODUCTS-----Stock#----Description---Quant----Price
      /          :++9999    :             :>10 \    :+
     /           :          :             :     \   :
    /                                            \
   /                                              \
 Имя таблицы                                       \
    \                                                Имя поля
     \
       QUERY
     
        Products:     Stock#     : Quant : Price :
                : CHECKPLUS_9999 :  >10  : CHECK :
     
       ENDQUARY
     Как   вы   можете   видеть,   структура  форм  запросов
 представленных в сценарии  использует  вертикальные  линии.
 Содержание  форм запросов заключено в специальные служебные
 символы PAL Query и EndQuery.
     Есть несколько существенных отличий между  существующей
 формой  запроса  и ее представлением в сценарии. Во первых,
 контрольный   признак   используемый   в   формах   запроса
 обозначается    служебным    словом    CHECK   "CHECK-PLUS"
 порождаемых  нажатием  [  Alt  ]  [  F6  ],  представляется
 служебным  словом  СHECK-PLUS.  Элемента  примеров, которые
 отображаются  в  реверсивном   изображении   в   PARADOX`а,
 представляются  в  сценарии  с  помощью знака подчеркивания
 (Например__123). Наконец,  не  все  поля  в  вопросительных
 формах  воспроизводятся  в  QuerySave, включаются только те
 поля, которые содержат признак выбора или критерии выбора.
      Возможно   редактирование   формы   запроса,    котрая
 накоплена  в сценарии с помощью редактора сценария. Однако,
 если   большие    изменения,    то    лучше    использовать


                           - 20 -
 непосредственное  редактирование.  Выберите Scripts/Play из
 главного меню Парадокса.
      На экране  появится  форма  запроса.  После  изменения
 сохраните   запрос   при   помощи   QuerySave.  Этод  метод
 предпочтительнее,  потому  что,  представление  запроса   в
 сценарии    не   обеспечивается   структурной   поддержкой.
 Например, поля в формах  запроса  являются  растягиваемыми,
 т.е.   они  расширяются,  когда  вы  хотите  ввести  в  них
 информацию, которая не помещается в прежних границах.  Этой
 эластичности   не   существует  в  сценарном  представлении
 вопросительных форм.
      
                      СБОРКА СЦЕНАРИЕВ
                     
      Вы   можете   создать   хранимый   вопрос    используя
 Scripts/BeginRecord,  выбирая  Ask из меню и заполняя форму
 запроса, в  этом  случае  сложнее  будет  читать  сценарий,
 потому, что вы будете видеть только серию ключевых слов.
      
                          И Т О Г И
                          _________
      
      Когда  бы  вы  не  записывали  сценарий  в  PARADOX`е,
 ключевые слова  представляются  при  помощи  четырех  типов
 элементов:  выбор  меню,  обозначение  специальных  клавиш,
 строки в кавычках, формы запросов.
      Вы можете редактировать сценарий с  помощью  редактора
 сценариев  (рассматриваемого  в  следующей главе). Редактор
 используется   для   изменения   и   увеличения   сценариев
 соединением их вместе с использованием команд PAL.
 
.

                           - 21 -
                           
      
                                                Г Л А В А  3
 ___________________________________________________________
                                                           
            Р Е Д А К Т О Р   С Ц Е Н А Р И Е В   PAL
 ___________________________________________________________
      
      Редактор  сценариев  PAL это среда в которой вы можете
 составлять,   комбинировать,   печатать   и   редактировать
 сценарии  PARADOX`a.  Сценарии  являются  просто текстовыми
 файлами ASCII со специальным расширением  ".SC",  и  именно
 поэтому  они  могут  быть  записаны  и  редактированы любым
 текстовым редактором.  Однако,  ввиду  того,  что  редактор
 сценариев  полностью  совместим с PAL и PARADOX`ом, для вас
 остается только  выбрать  между  редактором,Парадоксом  или
 PALом.
      Таким   образом,   часто   более  удобно  использовать
 Редактор PAL, хотя его возможности по введению  текстов  не
 могут поддерживаться в других редакторах.
      Выбор  READ в меню редактора, который рассмотрен ниже,
 позволяет записать в составленный сценарий другой  сценарий
 и  после этого выполнить в нем другие сценарии. Это простой
 пример использования  Редактора  для  комбинации  маленьких
 записываемых сценариев в большие сценарии.
      
           СОСТАВЛЕНИЕ  И РЕДАКТИРОВАНИЕ СЦЕНАРИЕВ
           _______________________________________
      
      В  PARADOX`е  и  PAL  вы  можете  создать  сценарии  в
 следующих различных случаях:
      Вы   можете    использовать    Script/BeginRecord    и
 Scripts/EndRecord  выборки  меню  из меню PARADOX`a или PAL
 меню. записанные  ключевые  слова  будут  представляться  в
 сценарии  с учетом специальных условий, описанных во второй
 главе.
     Используйте   характерные   черты   сценария    записей


                           - 22 -
 Парадокса  для  записи  сценария  нажимая  [ ALT ] [ F3 ] в
 начале и в конце последовательности ключевых слов,  которые
 вы  хотите записать. Ваши ключевые слова будут записываться
 в сценарий с именем instant.
     С  помощью  услуги  Scripts/QuerySave  для  того  чтобы
 записать  предложения  запросов, как обьясняется в Главе 2,
 QuerySave размещает графическое  представление  предложения
 запроса в сценарии.
     Используйте   Редактор   для  составления  сценария  из
 сборки. Используйте  услугу  Read  из  меню  редактора  для
 обьединения маленьких сценариев в большой.
     Используйте  Редактор  для  модификации любого сценария
 записанного или созданного любым из методов описанных выше.
     
                      КАК ВОЙТИ В РЕДАКТОР
                      
     Возможны два пути доступа в редактор PAL.
     1.   Из   главного   меню    PARADOX`a,    с    помощью
 Scripts/Editor.   на   экране   появится   меню   с   двумя
 услугами:Write и Edit.  Выберите  Write,  если  вы  желаете
 написать  новый  сценарий.  После этого последует вопрос об
 имени нового сценария.
     Если вы хотите редактировать существующий сценарий,  то
 выберите  Edit. Последует вопрос об имени сценария, который
 вы  хотите  редактировать.  Для  того,  чтобы  выбрать  имя
 сценария  из  меню  сценариев, необходимо либо набрать имя,
 либо  нажать  [  Enter  ].  Заметим,  что  вы   не   можете
 редактировать сценарий, пока этот сценарий выполняется.
     2. Если вы находитесь в отладчике PAL, выбирите Edit из
 меню отладчика или нажмите [ Ctrl ] [ E ]. Работа отладчика
 и все выполняемые сценарии будут остановлены и вы перейдете
 в   редактор   Сценариев,  который  вы  отлаживаете  Курсор
 редактора будет  установлен  в  начале  строки,  содержащей
 команду,  которая выполнялась в то время, когда вы покинули
 отладчик. Это мощное и  полезное  средство  при  разработке
 программ  и  процессов.  Отметим,  что  вы можете выполнить
 сценарии если находитесь в меню редактора  PAL  (необходимо


                           - 23 -
 выбрать Play), но не можете проиграть этот сценарий если вы
 находитесь внутри редактора.
     
                       РАБОТА С РЕДАКТОРОМ
                       
     Редактор  сценариев PAL простой текстовый редактор. Его
 операции являются почти идентичными с  генератором  отчетов
 PARADOX`a.  Существенное  отличие  заключается  в  том, что
 отчеты могут быть неограниченными по  ширине,  а  текстовые
 строки не могут быть больше 132 символов в ширину. Сценарий
 может  содержать  практически  неограниченное  число сторк.
 Клавиши [<-- ] и [ --> ]  двигают  курсор  на  один  символ
 влево  и вправо соответственно [Ctrl][<-- ] и [Ctrl][ --> ]
 сдвигают изображение влево или вправо на один экран.
     [ стрелка вверх ] и [ стрелка вниз  ]  клавиши  двигают
 курсор  на одну строку вниз или вверх в редакторе. [ Home ]
 клавиша и [  End  ]  клавиша  двигает  курсор  к  последней
 строке.  [Ctrl][Home]  перемещает  курсор  горизонтально  к
 первой позиции строки (к той, которая является самой  левой
 позицией  экрана),  в  то  время как [Ctrl][End] перемещает
 курсор  к  последнему   символу   строки.   (Отметим,   что
 [Ctrl][End] перемещает курсор не в первую позицию экрана, а
 только  к последнему символу строки. Если строка чистая, то
 влияние [Ctrl][Home] и [Ctrl][End] будут одинаковыми.
     
     [ Ins ]
    
     Когда вы находитесь в редакторе, вы можете использовать
 [Ins] клавишу для переключения  между  режимами  вставки  и
 замены  символов..  При вставке информации "Ins" появляется
 индикатор "Ins" в правом  верхнем  углу  экрана.  Когда  вы
 вводите   в   режиме  вставки  изображения,  новые  символы
 вводятся, а все  элементы  сдвигаются  вправо  от  вводимых
 символов.  В  режиме  замены,  наоборот,  символы справа от
 курсора  будут  замещаться  новыми  символами,  которые  вы
 вводите.
     


                           - 24 -
     [ Del ]
   
     [  Del  ] клавиша удаляет символ курсора. Любые символы
 справа от  курсора  будут  двигаться  влево,  когда  символ
 удаляется  при  помощи  [  Del  ]. Операция [ Del ] клавиши
 идентична вставке и записыванию символов.
     
     [ <---]    [  BackSpase ]
     
     Клавиша удаляет  символ  слева  от  курсора.  В  режиме
 вставки,  удаление  символов [ BackSpase ] приведет к тому,
 что все символы от удаляемых символов  будут  двигаться  на
 свободное пространство слева. Если вы нажимаете [BackSpase]
 в  режиме  вставки,  когда  курсор  в  самой  левой позиции
 экрана,  то  начало  текущей  строки   появится   в   конце
 предыдущей  строки.  В  режиме  замещения, [ BackSpase ] не
 влияет на не удаляемые символы.
     
     [ Enter ]
     
     Для того  чтобы  вставить  новую  строку  в  редакторе,
 необходимо   просто   нажать  [  Enter  ],  когда  редактор
 находится в режиме вставки. Если курсор находится  в  самой
 левой    позиции    экрана,    пустая    строка    появится
 непосредственно над строкой, где находиться курсор.  Строка
 с  курсором и все строки ниже будут сдвинуты на одну строку
 вниз.
     Если  курсор  находится  внутри  текстовой  строки,  то
 нажимая  [Enter],  пока  редактор  в режиме вставки, символ
 курсора и все символы справа от курсора перемещаются вниз в
 начало следующей строки.  Если  курсор  находится  в  конце
 строки  текста [ Enter ] открывает новую пустую строку ниже
 текущей.
      
     [ Сtrl ]  [  Y  ]
      
     [Ctrl][Y] клавиши удаляют текст справа  от  курсора  до
 конца  строки. Если курсор находиться в самой левой позиции
 экрана, нажатие [Ctrl] [Y] удаляет эту строку.


                           - 25 -
       
     [ Сtrl ]  [  V  ]
     
     [Ctrl] [V] (Переключатель указателя  строк)  Отображает
 указатель  строк,  который может быть полезен для нумерации
 следа строк в длинном сценарии.
     
                  ФУНКЦИОНАЛЬНЫЕ КЛАВИШИ И МЕНЮ
                  
     В редакторе доступны три функциональные  клавиши:  Help
 [F1],   DO_IT!   [f2]  и  Меnu  [F10].  Нажимая  [F10],  вы
 отобразите меню  редактора.  Это  меню  содержит  следующие
 пункты:
      - Read   (читать)
      - Go     (идти)
      - Print  (печать)
      - Help   (помощь)
      - DO_IT!
      - Cancel (отменять)
  
     Следующие  параграфы рассматривают каждую из этих услуг
 в отдельности.
     
     Read (читать)
     _____________
     
     Услуга Read позволяет комбинировать сценарии. Используя
 эту  услугу,  можно  связать  один  записанный  сценарий  с
 другими в сценарий, созданный в редакторе. Когда вы выбрали
 Read, то появится приглашение, чтобы вы ввели имя сценария,
 который  нужно  прочитать  в сценарий, находящийся в данный
 момент в редакторе. Вы можете  набрать  имя  сценария,  или
 нажать [Enter] и выбрать сценарий из меню.
     Сценарий,  который  вы  выбрали  будет  копироваться  в
 текущий сценарий, начиная со  строки  непосредственно  ниже


                           - 26 -
 текущей  строки  (строки,  где  находится  курсор) Строки в
 первоначальном  сценарии  ниже  строки  с  курсором   будут
 располагаться  ниже  записанного  сценария.  Чтение  одного
 сценария в другой не приводит к  каким  либо  изменениям  в
 считанном сценарии.
                                       
     GO (идти)
     _________
     
     GO выборка заканчивает текущее редактирование сценария,
 сохраняя все изменения в сценарии во время редактирования и
 непосредственно     начинает    выполнять    сценарий.    В
 действительности, она сочетается с услугой DO_IT! из меню и
 услугой Play из меню PARADOX. Услуга GO очень  полезна  при
 отладке сценариев.
     
     Print (печать)
     ______________
     
     Выбирая   Print  из  меню,  или  нажимая  [Alt][F7]  вы
 посылаете  копию  вашего   сценария   на   принтер.   Длина
 принтерного  вывода  по умолчанию равна установленной длине
 страницы Отчета в обычной  конфигурации  программ  PARADOX.
 Если  ваша  программа слишком длинная, вы можете по желанию
 установить параметр длины  страницы  "C"  для  непрерывного
 вывода  без  разбиения  на  страницы.  Смотрите признак "C"
 "Руководства  пользователя  PARADOX"  для  получения  более
 подробной информации.
     Ширина  вывода будет определяться шириной каждой строки
 сценария.  Если  количество  символов  в  строке  превышает
 максимальную строку принтера, то В зависимости от того, как
 ваш  принтер  работает,  строка  будет либо продолжаться на
 следующей строке, либо отсекаться.
     
     


                           - 27 -
     Help (помощь)
     _____________
     
     Услуга  Help  обеспечивает  вас  помощью  о   редакторе
 сценария.  Нажимая  Help [F1] получите тот же самый эффект,
 как если бы вы выбрали Help из меню.
     
      DO_IT!
      ______
     
     Выбирая DO_IT! из меню или нажимая  [F2]  вы  сохраните
 все    изменения   сделанные   во   время   редактирования.
 Редактирование закончится  и  вы  переместитесь  в  главное
 рабочее пространство PARADOX.
     
      Cancel
      ______
     
     Услуга  Cancel  заканчивает редактирование и перемещает
 вас  в  главное   рабочее   пространство   PARADOX`a.   без
 сохранений  изменений,  которые  вы  сделали  в сценарии во
 время редактирования. Если вы писали новый сценарий, он  не
 будет записываться на диске.
     
         CЦЕНАРИИ СОХРАНЕННЫХ ЗАПРОСОВ ПРЕДЛОЖЕНИЙ
         _________________________________________
                                             
     Как  сказанно в Главе 2, когда вы сохраняете в сценарии
 предложения  запросов  с   помощью   QuerySave,   наглядное
 представление  формы  запроса  записывается  в сценарий. Вы
 можете   просматривать,   редактировать   и   комбинировать
 QuerySave  сценарии  так  же  просто  как  и  любые  другие
 сценарии. Однако, если вы нуждаетесь в больших  изменениях,
 то   лучше   использовать  непосредственное  редактирование
 запроса в рабочем поле.


                           - 28 -
     Для использования PARADOX для редактирования  QuerySave
 сценариев, проигрывайте сценарии, содержащие вопросительные
 выражения  выбирая Scripts/Play и наберите имя сценария. На
 экране появится форма запроса. Сделайте в  ней  необходимые
 изменения  и  после этого используйте Scripts/QuerySave для
 сохранения  запроса.  Используя  этот  метод,   вы   можете
 получить преимущества структурной поддержки PARADOX.
 
.

                           - 29 -
 
     
                                                Г Л А В А  4
 ___________________________________________________________
     
                          P A L   М Е Н Ю
 ___________________________________________________________
     
            Д О С Т У П Н О С Т Ь  М Е Н Ю  P A L
            _____________________________________
                                      
     PAL  меню снабжает вас мощным средством для создания, и
 отлаживания  программных  документов.  Через  PAL  меню  вы
 можете  записать  и исполнять программы, вычислять величины
 выражений и исполнять  произвольные  PAL  команды  в  любом
 контексте.   Меню   также  дает  возможность  вам  вызывать
 интерактивный Отладчик, описываемый в главе 8.
     Вы можете обратиться к PAL  меню  немедленно  почти  из
 любой  точки  PAL  или  PARADOX  посредством нажатия клавиш
 [ALT] [F10]. В этом случае PAL меню идентично PARADOX меню.
 Вы  можете  выбрать  из  его  из  любого  меню  посредством
 использования   клавиш,  управляющих  курсором  (освещенный
 квадратик)  перемещая  его   по   опций   меню   и   выбрав
 интересуемый  вас  нажать клавишу [ENTER]. Так же вы можете
 нажать  клавишу,  соответствующую   первой   литере   имени
 выбранной опции.
     Если  вы  находитесь не в отладчике или не в редакторе,
 то когда вы вызываете PAL меню, можете видеть  отображаемые
 опции:
     - Play         ( исполнять, играть),
     - Begin Record ( началоь записи)
     - Debug        ( отладкак )
     - Value        ( значение) величина,
     - MiniScript   ( мини сценарий)
     Если  вы  отлаживаете  документ,  то  нажав  [ALT][F9],
 получаете доступ в PAL Отладчик меню, который описывается в
 главе 8 этой книги. Для редактирования  (записи)  документа


                           - 30 -
 вы  выбираете  имеющуюся  соответствующую опцию в PAL меню,
 которая описывается в конце этой главы.
     Когда вы вызываете PAL меню, вы можете выбрать  ту  или
 иную  опцию  или  вернуться  назад,  нажав  клавишу  [ESC].
 Запросить одновременно можно одну опцию.
      
     P l a y (проиграть)
     ___________________
     
     Выбранный  режим   PLAY   позволяет   проиграть   любую
 программу.   Когда   вы   выбрали   режим  Play,  программа
 выполняется.
     Это  действие  похоже  на  выбор   опций   Scripts/Play
 (Документы/Выполнение)  из главного меню PARADOX. Заметьте,
 что если вы находитесь в PARADOX`e обычно  в  таких  опциях
 как  Edit (Редактор), Report (Отчеты), Forms (Формы), вы не
 можете получить доступ к опции Scripts (Документы) меню без
 возвращения из них. PAL  Menu/Play  позволяет  вам  выбрать
 опцию  (Play)  выполнения  программы  из  фактически любого
 контекста без остановки его.
     
     BeginRecord (начало записи)
     ___________________________
     
     Выбор  функции  (Begin  Record)  Начало   записи   дает
 возможность  начать  запись  новой  программы.  Функция PAL
 MENU/Begin Record дает преимущества перед PAL  MENU/PLAY  -
 вы  можете начать запись почти с любого контекста, исключая
 промежуток уже вами записанный или выполненный.
     Как и для функции Scripts/BeginRecord, так и для функци
 и  PAL  MENU/Begin  Record,  вы   указываете   имя   нового
 документа.  Если  данное  имя  уже  существует,  то PARADOX
 предупрежда ет об этомт и  предлагает  вам  либо  закончить
 запись, либо записать под этим именем вашу новую программу,
 уничтожив старую.
     


                           - 31 -
     Debug (Отладчик)
     ________________
     
     Функция  Debug  (отладка)  позволяет  использовать  PAL
 отладчик для  отладки  любой  программы.  Эта  функция  при
 указании вами имени отлаживаемой программы позволяет быстро
 войти  в PAL отладчик. Если документ охраняется паролем, то
 вы также указываете пароль.
     
      Value (Значение)
     _________________
             
     Функция   Value   дает   доступ   к   разным   полезным
 возможностям  системы  PAL.  Это  позволяет непосредственно
 определить значение любого выражения системы PAL.
     Функцию Value можно считать очень мощным  вычислителем,
 который  может  вычислять больше чем обычные арифметические
 выражения.
     Используя Value, вы можете определить текущие  значения
 переменных   и   массивов;   вызывать   из  библиотеки  PAL
 математические, финансовые и ряд других  функций  или  даже
 запросить время.
     Когда  вы  выбрали  Value  из  PAL  MENU,  вас попросят
 записать вычисляемое выражение.  Вычисленное  PAL  системой
 его значение высветится в окне сообщений внизу экрана.

     MiniScript
     __________
     
     Функция   позволяет  исполнять  маленькие  скрипты  без
 обращения к редактору EDIT. Минискрипт полезен при обучении
 PAL,  когда  при  вводе  различных  команд  можно  сразу-же
 просмотреть результат.
.

                           - 32 -
                           
                                               Ч А С Т Ь  II
 ___________________________________________________________

         ОПИСАНИЕ ЯЗЫКА И ТЕХНИКИ ПРОГРАММИРОВАНИЯ
 ___________________________________________________________

     Глава 5. Взаимодействие с пользователем
         Управление изображением
         Канва языка PAL
           Активизация канвы
           Изменение внешнего вида канвы
           Взаимодействие с пользователем (команда Wait)
           Создание меню (команда ShowMenu)
           Переключатель содержимого экрана (команда ECHO)
         Вызов сценариев из DOS
     
     Глава 6. Блоки PAL-конструкции
         Команды
           Последовательности команд
           Синтаксис команд
           Коментарии
           Использование верхнего и нижнего регистра
           Типы команд языка PAL
           Аббревиативные меню команды
           Уничтожение с подтверждением
           Команды TYPEIN и SELECT
         Выражения
           Типы данных
           Вычисление выражений
         Константы
           Алфавитно-цифровые константы
           Обратный слэш и специальные символы
           Числа
           Даты
           Логические константы


                           - 33 -
         Имена переменных, массивов и процедур
         Переменные
         Массивы
           Обьявление массивов
           Элементы массива
           Сохранение массивов и элементов массива в памяти
           Имена полей как заголовки
         Операторы
           Оператор +
           Оператор -
           Опреаторы * и /
           Операторы сравнения
           Логические операторы (and, or, not)
           Порядок вычисления
         Ключевые коды PAL
         Маска
           Как определить маску
           Счетчик повторений
           Определение возможных частей масок
           Определение альтернатив
           Комбинирование различных возможностей
         Функция формат
           Спецификация ширины
           Спецификация выравнивания
                    (The Alingment Specification)
           Спецификация состояния
                    (The Case Specification)
           Спецификация редактирования
                    (The Edit Specification)
           Спецификация признака
                    (The Sign Specification)
           Спецификация даты
                    (The Date Specification)
         Встроенные функции
         Процедуры
           Определения процедур (Defining Procedurs)
           Вызов процедур (Calling Procedures)
           Создание и использование библиотеки процедур


                           - 34 -
           Запись процедур в библиотеки
           Чтение процедур из библиотеки
           Распечатка содержания библиотеки
           Отладка процедур, записанных в библиотеках
           Частные и глобальные переменные
           Каманда Private
         Поля доступа в изображениях
           Доступ к текущему изображению
           Доступ к другим изображениям
           Присвоение значения полю -
               изменение значений полей в изображении
           Запросы в языке PAL
         Вычисляемые макросы
         Специальные скрипты
           INIT
           INSTANT
         Защита паролем
     
     Глава 7 Техника программирования
         Комплексный подход
         Создание приложений
           Методология
         Время и место компромиссов в использовании процедур
     
     Глава 8 Отладчик скриптов (Debugger)
         Режим отладки
          Вход в отладчик
          Экран отладчика
          Типы ошибок


                           - 35 -
     Управляющие клавиши и меню
        Величина        (Value)
        Шаг             (Step) [Ctrl][S]
        Следующий       (Next) [Ctrl][N]
        Идти            (Go) [Ctrl][G]
        Минискрипт      (MiniScript)
        Где?            (Where) [Ctrl][W]
        Выход           (Quit) [Ctrl][Q]
        Верхний уровень [Ctrl][P]
        Редактор        [Ctrl][E]
     Использование отладчика
     
.

                           - 36 -
                           
                                               Г Л А В А  5
 __________________________________________________________
     
 В З А И М О Д Е Й С Т В И Е  С  П О Л Ь З О В А Т Е Л Е М
 __________________________________________________________
                                                           
     В Главе 2 описывается как записать и запускать сценарии
 автоматически.  Являясь  потенциально  очень  мощными,  эти
 сценарии едва приоткрывают завесу возможностей  языка  PAL.
 Следующие две главы открывают перед вами возможности языка,
 выходящие за грани записываемых сценариев и необходимые для
 разработки различных приложений. Как вы увидите, совместное
 использование  этих приложений значительно упрощает работу,
 т.к. язык PAL обеспечивает вам  полный  доступ  к  ресурсам
 ПАРАДОКСА.  Вы  можете  создавать запросы, входные/выходные
 пользовательские заказные  формы,  отчеты  и  разрабатывать
 ваше собственное меню.
     В  этой  главе  рассматриваются  уникальные конструкции
 экрана   и   входные/выходные    конструкции    клавиатуры.
 Реализация  этих  возможностей  позволит  вам разрабатывать
 сценарии, контролирующие изображения на экране в то  время,
 когда  на  заднем плане производятся операции с обьектами в
 рабочем пространстве ПАРАДОКСА
     В Главе, детально описываются все компоненты языка  PAL
 -  такие,  как  команды,  функции,  выражения,  операторы и
 определенные  пользователем  процедуры,  а   также   другие
 средства,   необходимые   вам  для  разработки  программ  и
 приложений.
     
        У П Р А В Л Е Н И Е   И З О Б Р А Ж Е Н И Е М
        _____________________________________________
     
     Разработка приложений с помощью языка PAL очень  похожа
 на постановку пьесы. Аудиторией при этом является, конечно,
 предполагаемый  пользователь.  Как продьюсер и постановщик,
 вы должны в полной мере представляеть себе картину, которую


                           - 37 -
 видят зрители. Также как в ходе пьесы многое происходит  за
 сценой,  так и в процессе выполнения операций приложения вы
 можете скрыть  их  от  зрителя  (например,  манипулирование
 таблицами в рабочем пространстве).
     Управляя процессом "высвечивания" вы можете либо скрыть
 выполняемые операции, либо показать фазу процесса.
     Вы  также  можете  привлечь  пользователя  к  участию в
 процессе. Например,  вы  можете  вызвать  на  экран  форму,
 приглащую  пользователя просмотреть ее или отредактировать.
 По  окончании  работы  пользователя  при  нажатии   им   на
 соответствующую  клавишу управление возвращается к сценарию
 для продолжения последующих операций.
     Местом  постановки  вашего  сценария  является  рабочее
 пространство ПАРАДОКСА. Именно в нем производится настоящая
 работа.  В  процессе  выполнения  сценария вы манипулируете
 таблицами, формами, отчетами и запросами так, как будто  вы
 используете  ПАРАДОКС напрямую. Единственными реальными от-
 личиями являются следующие:
     1.  Действия   чаще   контролируются   сценарием,   чем
 командами с клавиатуры;
     2. У вас есть возможность скрыть происходящее в рабочем
 пространстве операции от пользователя.
     Имея  связь  со всеми режимами и функциями ПАРАДОКС, вы
 можете  разрабатывать  комплексные  приложения   быстро   и
 просто.
     
                К А Н В А  Я З Ы К А   P A L
                ____________________________
     
     После  того, как вы ознакомились с некоторыми моментами
 постановки дейстаия на сцене, то осуществлять управление за
 изображением,  которое  видит   пользователь   в   процессе
 исполнения сценария, является простым делом.
     Представьте   себе   большой   полупрозрачный  занавес,
 простирающийся от одной стороны сцены до  другой.  Когда  в
 зале  загорается  свет,  занавес становиться непроницаемым.
 При этом все, что вы можете увидеть - это  нарисованное  на


                           - 38 -
 нем  художниками  сцены  изображение.  Когда же свет в зале
 гаснет, а сзади занавеса загорается, происходящее на  сцене
 за ним становиться видимым для вас.
     При  работе с языком PAL возникает аналогичная картина.
 Как   разработчик   сценария   вы   можете   контролировать
 проницаемость  занавеса.  Занавес называется- "канва" языка
 PAL. Как художник сцены вы можете  разрисовать  канву  PALa
 так  как  вы хотите. Вы также можете управлять "подсветкой"
 таким образом, чтобы пользователь  в  определенные  моменты
 мог  взаимодействовать  с  рабочим  пространством ПАРАДОКСА
 (например, работа с таблицами) за канвою.
     Важно запомнить, что в любое время в процессе отработки
 сценария пользователи наблюдают на  экране  либо  "занавес"
 PALa  либо рабочее пространство ПАРАДОКСА - всегда либо то,
 либо другое, но никогда не одновременно.  Запомните  также,
 что   в  языке  PAL  существует  ряд  операций,  таких  как
 присвоение значений  переменным  или  массивам,  выполнение
 которых  пользователь  никогда  не  видит.  Для  детального
 рассмотрения  взаимосвязи  между  канвой  PALa  и   рабочим
 пространством   обратитесь   к   Главе   8  ("Использование
 отладчика").
     
                      АКТИВИЗАЦИЯ КАНВЫ
     
     При использовании ПАРАДОКСА без  разыгрывания  сценария
 вы   никогда   не   увидите   текущее   состояние  рабочего
 пространства. При запуске сценария (например, выбирая опцию
 PLAY  из  меню  Scripts),  канва   неожиданно   становиться
 непрозрачной.  Хотя  перед  этим,  на  экране  на мгновение
 появляется  изображение  "сцены",   но   при   этом   смена
 изображений  происходит настолько быстро, что сидящие перед
 экраном не в состоянии ощутить эту смену.  У  пользователей
 возникает  впечатление, что состояние рабочего пространства
 ПАРАДОКСА как бы заморожено  в  том  виде,  в  котором  оно
 находилось на момент начала работы сценария.
     Безусловно это только иллюзия, т.к. в  соответствии  со
 сценарием  в рабочем пространстве ПАРАДОКС  (РПП) за канвой
 над обьектами происходят указанные  операции.


                           - 39 -
     По  окончании  работы  сценария  "занавес" поднимается,
 "зажигаются  огни  рампы"  и  перед   пользователем   снова
 предстает РПП.
     В   качестве   примера  рассмотрим  следующий  короткий
 сценарий, который помещает таблицы  "orders"  и  "stock"  в
 РПП.
           "View" "orders"
           "View" "stock"
 (команда  View  является  командой  языка PAL, и выбирается
 пользователем опцией View из главного меню ПАРАДОКСА)
     В   процессе  работы  сценария  пользователь  не  видит
 результатов  выполнения  заданных   операций   до   момента
 окончания   сценария,  после  чего  две  таблицы  магически
 появляются в  рабочем  пространстве.  В  течение  короткого
 промежутка    времени,    когда   разыгрывается   сценарий,
 пользователь смотрит на непроницаемую канву виде застывшего
 на момент начала работы сценария изображение РПП.
     
                ИЗМЕНЕНИЕ ВНЕШНЕГО ВИДА КАНВЫ
     
     Почти во всех случаях использования  PAL  у  вас  может
 возникнуть желание изменить изображение канвы на  экране  в
 процессе выполнения сценария.
     Например, у вас может появиться желание очистить  канву
 и  высветить на экран приветствие при запуске сценария. Для
 очистки и изменения вида канвы в  языке  PAL  предусмотрены
 несколько команд. При использовании команды STYLE вы можете
 рисовать   используя   различные   видеостили   (такие  как
 негативное  изображение  или,  при  использовании   палитры
 цветной графики и цветного дисплея,-различные цвета)
     Вы  также  можете  контролировать  положение курсора на
 канве. Имея несколько команд изменения изображения  экрана,
 вы  сначала помещаете курсор в требуемую позицию (используя
 команду @), а затем, начиная от позиции курсора изображаете
 все, что вам угодно.
     Запомните, что при завершении сценария  канва  и  любые
 сделанные вами на ней изменения исчезают.


                           - 40 -
     
         ВЗАИМОДЕЙСТВИЕ С ПОЛЬЗОВАТЕЛЕМ (команда WAIT)
  
     В   процессе  выполнения  операций  сценария  возникают
 ситуации, когда вы хотели бы, чтобы  пользователь  временно
 мог   увидеть   рабочее   пространство   и   поработать   с
 непосредственно с ПАРАДОКСОМ. Например,  вам  бы  хотелось,
 чтобы пользователь заполнил находящуюся на экране форму. По
 окончании  выполнения  этой  операции пользователь нажимает
 соответствующую клавишу  и  управление  опять  переходит  к
 сценарию.  В  качестве другого примера можно привести вывод
 на    экран    таблицы    и    приглашения     пользователя
 проанализировать ее содержимое.
     По  окончании  этой  операции и нажатии соответствующей
 клавиши управление также возвращается сценарию.
     PAL располагает специальной командой, называемой  WAIT,
 которая   делает   такое   взаимодействие   возможным.  При
 выполнении этой команды на  экране  появляется  изображение
 содержимого РПП и пользователью предоставляется возможность
 просматривать и воздействовать на содержимое РПП.
     Вполне естественно желание иметь возможность ограничить
 круг   пользователей  при  внесении  изменений  в  процессе
 взаимодействия.  Вы  можете,  например,   предоставить   им
 возможность    только    просматривать   таблицу,   но   не
 редактировать ее. Или вам бы хотелось разрешить им  вносить
 изменения в определенную запись, не допуская такой операции
 в отношении других записей. Команда WAIT как раз и дает вам
 возможность управлять этими и другими ситуациями.
     Время действия команды WAIT заканчивается после нажатия
 пользователем клавиши, определенной вами, как разработчиком
 сценария.  В  этот момент изображение РПП пропадает и снова
 появляется  изображение  канвы.  В  момент  начала   работы
 сценария  последняя  картина  экрана  на  мгновение  как бы
 застывает.  Продолжение  выполнения  операций,  входящих  в
 сценарий,  осуществляется  с момента получения следующей за
 WAIT командой.  Коменда  WAIT  может  быть  использована  в


                           - 41 -
 процессе  работы  сценария неоднократно. Порядок выполнения
 сценария       не       обязательно       должен       быть
 последовательным-возможно использование циклов.
     
              СОЗДАНИЕ МЕНЮ (команда ShowMenu)
     
     Другая   специальная   команда  языка  PAL,  называемая
 ShowMenu,   позволяет   устанавливать   режим   работы    с
 пользователем,  эквивалентный  работе с меню ПАРАДОКСА. При
 выполнении  команды  ShowMenu  в   верхней   части   экрана
 появляется   ряд   определенных   вами  услуг  меню.  Затем
 управление передается пользователю, чтобы  он  мог  сделать
 выбор.
     Ваше  меню  работает  также,  как  и меню ПАРАДОКСА. Вы
 также можете определить содержание подсказок  по  одной  на
 каждую  услугу  меню,  которые будут выводиться на экран во
 второй строке меню.
     После  того,  как  пользователь сделал выбор (или нажал
 [Esc]),  указанной  вами  переменной присваивается значение
 выбранной опции и управление  возвращается  к  сценарию.  В
 этот же момент сценарий вызывает другой сценарий, определя-
 ющий операции, которые соответствуют сделанному пользовате-
 лем выбору.
     
      ПЕРЕКЛЮЧАТЕЛЬ СОДЕРЖИМОГО ЭКРАНА (команда ЕСНО)
     
     Подчас могут возникать ситуации, когда бы вам  хотелось
 наблюдать  РПП  в течение всего времени работы сценария или
 выборочно в разные моменты. Это возможно с помощью  команды
 ЕСНО, которую можно вставить в любое место вашей программы.
 Она  позволит вам видеть все, что происходит в РПП во время
 работы программы. Команда ЕСНО является более  мощной,  чем
 опция Scripts/ShowPlay главного меню ПАРАДОКСА.
  


                           - 42 -
     
          В Ы З О В   С Ц Е Н А Р И Е В   И З   DOS
          _________________________________________
  
     Помимо   возможности   выполнить   операции   сценария,
 используя услугу Scripts/Play основного меню ПАРАДОКСА, или
 вызывая услугу сценария из другого с помощью команды  Play,
 существует   возможность   разыграть   их  из  DOS,  набрав
 директиву:
                  PARADOX <имя сценария>
     При этом,  управляющие  функции  будут  сразу  переданы
 названному  сценарию,  минуя  этап  выведения  картинки  на
 экран, приглашающей в ПАРАДОКС.
     Это   свойства   в    совокупности    с    возможностью
 перекодировки  сценариев  и  таблиц позволяет разрабатывать
 программы, которые полностью  скрывают  факт  использования
 ПАРАДОКСА.
     Если  вызванный  из DOS сценарий заканчивается командой
 EXIT,  то  по  окончании  его  исполнения  она  приведет  к
 возвращению  из  PARADOX'a  в  DOS. Такие сценарии являются
 полностью закрытыми, поскольку конечный пользователь  не  в
 состоянии понять, что сценарий разыгрывается в операционной
 среде PARADOX'a.
     Если  же сценарий заканчивается командой QUIT, то после
 исполнения сценария пользователь  окажется  в  операционной
 среде  ПАРАДОКСА.  Такие  сценарии,  называемые "открытыми"
 могут быть использованы для  разработки  процедур,  которые
 переводят   PARADOX  в  состояние  готовности  поддерживать
 работу  пользователя  с   данными   и   другими   подобными
 операциями.
.

                           - 43 -
                           
                                              Г Л А В А  6
 ___________________________________________________________
     
          Б Л О К И   С О С Т А В Л Я Ю Щ И Е   P A L
 ___________________________________________________________
     
     В  этой  главе детально обсуждаются все компоненты PAL,
 которые необходимы для работы с ним.
                               
     
                       К О М А Н Д Ы
                       _____________
     
                 ПОСЛЕДОВАТЕЛЬНОСТИ  КОМАНД
     
     PAL-программа   или   "скрипт"  (сценарий),  (мы  будем
 пользоваться  этими  терминами,  как  взаимозаменяемыми  ),
 состоит  из последовательности команд. Для начала или конца
 скрипта   не   требуется   специального   синтаксиса.   При
 выполнении    скрипта    команды    в    нем    исполняются
 последовательно. Однако, некоторые команды, такие как IF  и
 WHILE  могут  изменять  ход  управления. Скрипт может также
 запускать выполнение  другого  скрипта  (используя  команду
 PLAY),  который,  в  свою очередь, может запускать еще один
 скрипт.
     Выполнение  скрипта  заканчивается,  когда  команды   в
 первоначально активизированном скрипте исполнены, или когда
 активизируется  (вызывается)  команда,  которая  приводит к
 завершению  скрипта  (например,  QUIT).  В   этих   случаях
 управление возвращается к ПАРАДОКСУ и экран обновляется для
 отображения текущего состояния ПАРАДОКСА. Например, скрипт
            
        VIEW  "orders"  EditKey
        
 размещает  таблицу  "orders" в рабочем пространстве памяти.
 Команда  Editkey  аналогична  нажатию  клавиши  Edit  [F9].


                           - 44 -
 PARADOX  останется  в  режиме  Edit  с  таблицей  в рабочей
 области. Это верно даже в случае, если  выполнение  скрипта
 инициировано командной строкой DOS.
     Если  вы  хотите  вернуться  прямо к DOS из скрипта, вы
 можете сделать это  использованием  команды  EXIT,  которая
 имеет  такой  же эффект, как и услуга EXIT из главного меню
 (набора) ПАРАДОКСА.
     
                      СИНТАКСИС  КОМАНД
                      
     Синтаксис  PAL'а является свободным по форме. Это озна-
 чает, что за небольшими исключениями  вы  можете  поместить
 сколько  угодно  команд,  разделенных пропусками в пределах
 одной строки. Вы можете также разделить команду между двумя
 строками, но будьте осторожны и  не  допускаете  разделения
 посередине   ключевого  слова  (дискриптора),  наименования
 (имени) или числовой величины. Строки не могут быть  длиной
 более 132 кодовых знаков.
     Хотя  скрипты  при  записи  создаются,   как   правило,
 размещением  нескольких  команд  на  одной  строке, вам для
 удобства чтения обычно хочется поместить на каждой  строчке
 только  одну или две команды. Для определенных команд таких
 как RETURN, STYLE, SETKEY и TEXT, есть правила,  содержащие
 ограничения  на  то,  что  может  следовать  за командой на
 строке. Эти правила детально рассмотрены в описании  каждой
 из таких команд в главе 9.
     
                         КОМЕНТАРИИ
     
     Вы можете включить коментарии в ваши скрипты. Для этого
 необходимо  поставить знак ";"(точка с запятой) и PAL будет
 игнорировать все что следует за ним.
 Например:
     BEEP  BEEP  ; сигнал тревоги для пользователя.
     Коментарии   могут   использоваться   на  любой  строке
 скрипта. Они могут даже следовать за командами (такими  как
 RETURN),  которые имеют ограничения на размещение команд на
 той же самой строке.


                           - 45 -
     
          ИСПОЛЬЗОВАНИЕ ВЕРХНЕГО И НИЖНЕГО РЕГИСТРА
     
     Командные  ключевые  слова  (дискрипторы)  могут   быть
 составлены  из  букв  верхнего  регистра, нижнего регистра.
 Например, можно печатать Add, ADD или даже aDd. Тоже  самое
 относится  к  названиям таблиц, полей, переменным масивов и
 процедур. Регистра имеет значение  в  том  случае,  если  в
 скрипте находятся строки алфавитно-цифровых величин данных.
 Например, последовательность "abc" не эквивалентна "ABC".
     
                    ТИПЫ КОМАНД ЯЗЫКА PAL
     
     В Главе 2 обсуждаются типы команд, которые появляются в
 записываемых скриптах. Они делятся на 4 категории:
     -особые  команды управления клавишами (например, Menu и
 PgUp);
     -выбора типа меню (набора  альтернатив), заключаемые  в
 фигурные скобки (например {View});
     -последовательности  заключенные  в  кавычках(например,
 "James B.Baker");
     -запрсы, генерируемые с использованием QuerySave  (сох-
 ранение запросов).
     Наиболее легкий путь включения запросов в ваши програмы
 является  обьединение их на рабочем поле и запись их в файл
 с использованием Scripts/QuerySave, и затем слияние файла с
 основным телом вашей программы в скрипт-редакторе.
     Большинство  других  PAL-команд  состоит  из  ключевого
 слова,  сопровождаемого  несколькими  параметрами.  Команда
 BEEP например, состоит из единственно ключевого слова ВЕЕР.
 Команда   МESSAGE,   содержит   ряд   разделенных   запятой
 аргументов, как в случае:
     MESSAGE "The time is ", TIME()
     Одной   очень   полезной   категорией  команд  являются
 "аббревиативные меню-команды".  Они  являются  сокращениями
 для  последовательностей  выборок  меню,  используемых  для
 активизации наиболее общих операций ПАРАДОКСА.
     Эти команды обсуждаются в следующем разделе.


                           - 46 -
     
                   АББРЕВИАТИВНЫЕ МЕНЮ-КОМАНДЫ
     
     Ряд      команд      PAL      являются      сокращеными
 последовательностями  услуг  меню, которые используются для
 активизации более общих операций  ПАРАДОКСА.  Например,  вы
 можете сказать:
     Rename  "Stock"  "Product"  (переименовать  "Stock"  на
 "Product")
     На месте услуги записывается последовательность выборки:
     Menu{Tools} {Rename} {Stock} {Products}
     В таблице 6-1 перечислены команды ПАРАДОКСА для которых
 обеспечивается аббревиативные услуги меню.
.

                           - 47 -
                           
                                                 
                                                 Таблица 6-1
     
                   Аббревиативные меню-команды
 ___________________________________________________________
 I    Команды            I Меню, используемые для операций I
 I                       I доступа через PARADOX           I
 I_______________________I_________________________________I
 I   ADD                 I     TOOLS                       I
 I   CANCELEDIT          I     EDIT                        I
 I   COPY                I     TOOLS                       I
 I   CREATE              I     MAIN                        I
 I   DELETE              I     TOOLS                       I
 I   EDIT                I     MODIFY                      I
 I   EMPTY               I     TOOLS                       I
 I   EXIT                I     MAIN                        I
 I   PICKFORM            I     IMAGE                       I
 I   PLAY                I     SCRIPTS                     I
 I   PROTECT             I     TOOLS                       I
 I   RENAME              I     TOOLS                       I
 I   REPORT              I     REPORT                      I
 I   SETDIR              I     TOOLS                       I
 I   SORT                I     MODIFY                      I
 I   SUBTRACT            I     TOOLS                       I
 I   UNPASSWORD          I     TOOLS                       I
 I   VIEW                I     MAIN                        I
 I   DOS                 I     TOOLS                       I
 I                       I                                 I
.

                           - 48 -
                           
                                           
    Если  вы  программируете  скрипт  в  редакторе (Editor),
 аббревиативные команды  меню  являются  более  легкими  для
 использования,   чем  их  эквиваленты  записанные  в  форме
 скриптов. Однако, если вы моделируете прикладную  задачу  и
 обьединяете   маленькие   скрипты   в  большой  скрипт,  то
 программа может содержать как аббревиативные команды  меню,
 так   и  последовательности  записанных  меню-выборок.  При
 усовершенствовании задачи вы можете заменить куски  в  виде
 записанных меню выборок на аббревиативные команды меню.
     Аббревиативные   меню-команды   являются   также  более
 гибкими, чем  их  эквиваленты  в  виде  последовательгостей
 услуг,  так  как  они  могут  принимать  произвольный вид в
 качестве аргументов. Например, чтобы  просмотреть  таблицу,
 имя  которой  соответствует  текущей величине переменной х,
 необходимо сказать:
                 VIEW  X
     Заметим, что последовательность из меню "Menu{View}{x}"
 -это  просто  вызов  на  дисплей   таблицы,   имя   которой
 обозначено буквой "х".
     Чтобы  понять как работают аббревиативные команды меню,
 давайте  посмотрим  на  аббревиативные  команды  меню   для
 образования  (формирования)  и  упорядочивания (сортировки)
 таблиц. В этих  случаях  вы  задаете  список  аргументов  к
 командам,  давая полям имена и типы (в случае создания) или
 порядок  сортировки  (в   случае   Sort).   Закулисно   PAL
 активизирует  режимы "Create" и "Sort", затем автоматически
 запрашивает   соответствующую   серию    ключевых    строк,
 необходимых   для   образования  форм,  которые  вы  обычно
 применяете с этими подсистемами.
     Вы   можете   наблюдать    последовательность    шагов,
 вызываемых   этими  командами,  если  вы  напишете  простой
 скрипт, включающий их,  и  затем  выполните  его  используя
 выборку Scripts/ShowPlay (cкрипты/показ выполнения) из меню
 ПАРАДОКСА.


                           - 49 -
     Так   как  аббревиативные  команды  меню  воспроизводят
 услуги меню,  то  они  могут  быть  использованы  только  в
 контексте,  в  котором  эти  ключевые  строки  осуществляют
 считывание. Например,  может  быть  допущена  ошибка,  если
 команда:
                       VIEW  "orders"
     исполнена в контексте (таком как режим EDIT), в котором
 {VIEW} не является достоверной выбору из меню.

     
                 УНИЧТОЖЕНИЕ С ПОДТВЕРЖДЕНИЕМ
     
     Есть   случаи,   когда   прямая  выборка  меню  требует
 подтверждения, например,  когда  производимый  выбор  может
 вызвать  потерю  данных,  такое подтверждение автоматически
 обеспечивается  аббревиативными  меню-командами.  Например,
 если  вы  копируете  таблицу  "orders"  в таблицу "newords"
 посредством выбора последовательности из меню:
     MENU {TOOLS} {COPY} {TABLE} {orders} {newords}
     Однако,  если  таблица  "newords"  уже  существует,  то
 другой выбор потребует от вас подтвердить копирование:
                          {Replace}
     C другой стороны, если вы используете аббревиатуру меню
 команды:
                   COPY "orders" "newords"
 то подтверждения копирования в этом случае не выдается.
     Чтобы  по  возможности  избежать  потерю данных в таких
 ситуациях, вы можете использовать функцию ISTABLE, для того
 чтобы  копирование  в  выходную   таблицу   из   за   вашей
 невнимательности без подтверждения не происходило.
     
                   КОМАНДЫ  TYPEIN И SELECT
     
     PAL   имеет   две  команды  TYPEIN  И  SELECT,  которые
 облегчают вызов из меню ПАРАДОКСА для  которых  сокращенные
 команды  не  применимы.  Подобно сокращенным меню командам,


                           - 50 -
 команды   TYPEIN   и   SELECT    допускают    использование
 произвольных выражений в качестве параметров. Например:
                           VIEW x
 может быть достигнуто с помощью следующего набора команд:
                      Menu
                      SELECT  "View"
                      SELECT   x
     Более подробно описание команд TYPEIN и SELECT смотрите
 в главе 9.
     
                          В Ы Р А Ж Е Н И Я
                          _________________
     
     Аргументы PAL команд называются выражениями.  Например,
 команда
          MESSAGE "Сегодняшняя дата ",TODAY()+1
 имеет  два  аргумента:  выражение  "Сегодняшняя  дата  "  и
 выражение  TODAY()+1.  Выражения  строятся   из   констант,
 переменных,    операторов   и   других   элементов   языка,
 обсуждаемых  в  этой  главе.  Приведем  несколько  примеров
 выражений:
                        5
                        "abcde"
                        "6*(3+t)
                        TODAY() > 5/1/60
     
                         ТИПЫ ДАННЫХ
     
     Значением PAL выражений может быть любой тип поля ПАРА-
 ДОКСА, такой как:
                   А1 - А255 алфавитно-цифровое
                   N  -      число
                   $  -      доллар
                   D  -      дата
                   S  -      короткое число
     Выражениям   PAL   тип   присваивается   автоматически.
 Например: 5 * 5 -число, а TODAY() - дата.  Дополнительно  с
 типом  данных  ПАРАДОКСА  PAL также поддерживает логический


                           - 51 -
 тип данных (True и False).
     Выражение TODAY() > 5/1/60 будет True если  сегодняшняя
 дата  больше  даты  1.5.60 и False, если меньше. Логический
 тип данных не может  быть  использован  как  тип  данных  в
 таблице.  Однако,  он может быть использован во всех других
 случаях, в которых выражение используется.
     
                    ВЫЧИСЛЕНИЕ ВЫРАЖЕНИЙ
     
     Вы можете вычислить значение выражения в  любое  время,
 выбрав  Value  из  PAL  меню. Применяя в качестве основного
 калькулятора  Value  позволит  вам  запрашивать   величины,
 переменные,  элементы  массива  или  любое другое выражение
 ПАРАДОКСА.
     Необходимо  различать   Value   и   MiniScript.   Value
 используется  для  вычисления выражения, а MiniScript - для
 выполнения последовательности команд. Если вы выбрали одно,
 когда вы находитесь в  другом,  это  приведет  к  ошибке  в
 программе.
     Следуюшие  пункты  описывают  различные элементы языка,
 которые входят в выражения.
     
                      К О Н С Т А Н Т Ы
                      _________________
     
     Элементы       простого       выражения        являются
 алфавитно-цифровые, числовые, дата и логические константы.
     
                АЛФАВИТНО-ЦИФРОВЫЕ КОНСТАНТЫ
     
     Алфавитно-цифровые константы часто называют строками. В
 PAL  командах  строки  должны  быть выделены с обеих сторон
 кавычками. Максимальная длина строки - 255 символов.
     Пример: "Hello"
     


                           - 52 -
     
             ОБРАТНЫЙ СЛЭШ И СПЕЦИАЛЬНЫЕ СИМВОЛЫ
     
     Некоторые ASCII символы  не  могут  быть  напечатаны  в
 строке.  Например,  двойная  кавычка  (").  Для того, чтобы
 можно было их использовать, применяется обратный слэш (\).
     Например:
       "\"Эта строка выдает двойную кавычку \" "
     Строка  заключена  в  кавычки. Если необходимо в строке
 иметь  обратный  слэш,  его  надо  удвоить,  т.е.  написать
 "\\123\\".  После  обратного слэша может быть введено любое
 трех значное число, которое воспримется как соответствующий
 ASCII код.
     В таблице ниже, приведены специальный  слэш  последова-
 тельности, используемые обычно с командой PRINT.
   
   ---Последовательность-----Функция-------------------
   
       \t                    Табуляция [Cntl][I]
       \n                    Новая строка [Cntl][J]
       \f                    Перевод строки [Cntl][L]
       \r                    Возврат каретки [Cntl][M]
     
     
                            ЧИСЛА
     
     Числовые  константы записываются как последовательности
 чисел. Если число отрицательное, то перед ним ставится знак
 "-"(минус), если число положительное, то плюс необязателен.
 Точка используется для отделения дробной части от целой.
     Например:    25
                  3.75
                -17.00000000001
                  5.6Е+17
     Числовые константы представляются как 64 битное поле  в
 диапазоне  от  (+-10Е-307)  до  (+-10Е308).  Это  позволяет
 использовать 15 знаков после запятой.
     Все числовые константы имеют тип  "N".  Константы  типа
 "N" можно всегда использовать в выражениях где присутствуют
 данные типа "D" или "S".


                           - 53 -
     
                            ДАТЫ
     
     Даты  могут быть представлены в двух формах: через слэш
 и через тире.
     Например: 5/1/1960
               1-may-60
     Для дат, чьи года начинаются с числа "19",  первые  два
 числа могут быть опущены.
     Например: 5/1/60
     
                   ЛОГИЧЕСКИЕ КОНСТАНТЫ

     Это  True  и  False. Вы можете писать их как прописными
 буквами, так и строчными буквами.
                                                  
     
            ИМЕНА ПЕРЕМЕННЫХ, МАССИВОВ И ПРОЦЕДУР
            ______________________________________
     
     Имена   переменных,  массивов  и  процедур  пишутся  по
 следующим правилам:
     >> первый символ должен быть буквой;
     >> последующие символы должны  быть  буквы,  числа  или
 следующие специальные знаки: ., $, !, _(подчеркивание);
     >> верхний и нижний регистры символов игнорируются;
     >> зарезервированные слова не используются;
     >> имена могут быть  любой  длинны,  но  не  более  132
 символов;
     >> имена не могут содержать пробелы.
     Примеры:
         foo                правильно
         time.period        правильно
         !claim             неправильно
         claim!             правильно
         This_is_a_name     правильно
         5a6                неправильно
         abc xyz            неправильно


                          - 54 -
     
     
                     П Е Р Е М Е Н Н Ы Е
                     ___________________
     
     Переменные используются для временного хранения данных.
 Величины любого  типа  ПАРАДОКСА  могут  быть  сохранены  в
 переменных. Для того, чтобы переменной присвоить какое либо
 значение, используют команду (=).
     Например: переменной х присваивается строка "tann"
          х = "tann"
     Если  переменной  х  было  присвоино  ранее  какое либо
 значение, то оно теряется. Некоторые другие команды  (такие
 как   SHOWMENU,   ACCEPT  и  LOCATE)  присваивают  величины
 переменным как  команды  с  побочным  эффектом.  Переменные
 должны  быть  определены  перед  тем,  как использоваться в
 выражении.
     Например, если команда
           MESSAGE "Величина х=", х
     выполняется перед тем, как х будет присвоена  величина,
     программа завершится с ошибкой.
     Функция  ISASSIGNED   может   быть   использована   для
 проверки, присвоено или нет значение переменной.
     В своей программе  вы  можете  использовать  переменных
 столько, сколько доступно оперативной памяти.
     Заметим,  что  переменные  имеют  простые  типы данных.
 Например, последовательности команд:
     х="tann"
     х=5+5
     х=1-may-60
     Переменная х в первом случае-строка, во втором-число, в
 третьем-дата.
     Переменные  сохраняют  свои  значения  только  в  одном
 сеансе  работы  ПАРАДОКСА.  Вы,  например,  можете выделить
 переменную в программе и позднее использовать ее из  других
 программ.  Величина  теряется тоько тогда, когда мы выходим


                           - 55 -
 из среды ПАРАДОКСА или используем команду RELEASE. Если  вы
 хотите,  вы  можете  сохранить  с  помощью команды SAVEVARS
 текущие  переменные  (все  или  часть)  в  файле  и   затем
 восстановить  их позднее. Это свойство полезно для отладки.
 Как упоминалсь выше,команда RELEASE может быть использована
 для "отмены назначения" одной  или  нескольких  перемеррых.
 Эта операция возвращает их в назначенные ячейки памяти.
     
                        М А С С И В Ы
                        _____________
     
     PAL   поддерживает  понятие  описанной  переменной  как
 массив. (или "список"). Массивы используются для временного
 описания последовательности данных. Одно из наиболее частых
 применений заключается  в  хранении  и  распределерии  всех
 данных одновременно.
     Специальные        команды        COPYFROMARRAY       и
 COPYTOARRAY,поддерживаются PALом для  обеспечения  простоты
 использования массивов.
 
     
                     ОБЬЯВЛЕНИЕ МАССИВОВ
     
     Различные простые переменные, списки должны объявляться
 до   того,   как   их  элементы  получат  значения.  Массив
 объявляется с использованием команды ARRAY и создает список
 с размером (т.е. количеством элементов) заданным вами.
     Например:
     ARRAY Т(5)
 объявляет список имён Т, состоящий из пяти элементов
     Т(1),Т(2),........Т(5).
     В принципе, массивы могут объявлять до 15000 элементов.
 На  практике,  однако,  размер   и   количество   массивов,
 описываемых вами ограничено размером памяти.
     Размер   списка,   который  вы  точно  определяете  при
 объявлении массива, может быть произвольным выражением.


                           - 56 -
  Например, если переменная х имеет начальное значение 5,то:
     ARRAY Т(x+3)
     Массив Т  объявлен  как  список  из  восьми  элементов.
 Правила обьявления массивов такие же, как для переменных.
     
                      ЭЛЕМЕНТЫ МАССИВА
     
     Вы   можете  представить  каждый  элемент  массива  как
 независимую переменную. Так  же,  как  простым  переменным,
 элементам  массива  до  того  как  они будут использованы в
 программе, должны быть присвоены начальные значения.
     Например, после использования следующих команд значение
 выражения Т(3)+2 примет значение  12,  тогда  как  значение
 Т(4)+2 приведет к ошибке программы:
     ARRAY Т(5)          ; объявляет Т как массив размером 5
     х=2                 ;присваивает 2 переменной х
     Т(х+1)=10           ;присваивает 10 Т(3)
     В   выражении   Т(х+1),   (х+1)  называется  "описанием
 выражения". Описания выражения должно  отражать  количество
 доступных чисел от 1 до размера массива (сключение из этого
 правила объясняется далее в документации).
     Как  и  в  большинстве языков программирования PAL дает
 возможность  хранить  в  одном  массиве   значения   данных
 различных   типов.  Например,  справедлив  следующий  набор
 команд:
     ARRAY  Т(3)
     Т(1)="АВС"
     Т(2)=3.14
     Т(3)=5/1/60
     Что касается  переменных,  то  переназначение  элемента
 приводит к потере предыдущего значения.
     
     СОХРАНЕНИЕ МАССИВОВ И ЭЛЕМЕНТОВ МАССИВА В ПАМЯТИ
     
     Так же, как переменные, массивы и их элементы сохраняют
 свои  значения во всем сеансе работы ПАРАДОКСА. Если массив
 переобъявлен,   его   начальная   декларация,   вместе   со
 значениями  всех  элементов, изменяется. Описание массива и
 его составляющих также изменяется в памяти.


                           - 57 -
     
                  Хранение и перенос значений.
     
     Одна из наиболее полезных областей применения  массивов
 в  PALе  -  хранение  полей  данных  всех записей в формате
 ПАРАДОКСА.  Массивы  при  этом  могут  использоваться   для
 хранения  записей  временно,  и  переносить записи с одного
 места на другое.
     Две специальные команды  PALа  облегчают  использование
 массивов,  это: COPYTOARRAY и COPYFROMARRAY. Каждая из этих
 команд предпологает, что на экране высвечено нужное  место.
 Команда  COPYTOARRAY  создает  новый массив и копирует поле
 текущих записей в массив. COPYFROМARRAY  копирует  хранимые
 параметры текущего масCOPYTOARRAY в текущую запись.
     Пример:
     COPYTOARRAY  Т     ; создает  массив ,хранит текущие
                          записи в нем
     DOWN               ; переходит к следующей записи
     EDITREY            ; режим редактирования
     COPYFROMARRAY Т    ; переносит значение
     DO-IT!             ; окончание редактирования
     
     Обычно  COPYFROMARRAY  автоматически  создает массив, с
 именем названным в ее аргументе и больше  никаких  описаний
 не требуется. Также обычно ПАРАДОКС должен быть в состоянии
 редактирования для использования COPYFROMARRAY.
     
     
                  ИМЕНА ПОЛЕЙ КАК ЗАГОЛОВКИ
                              
     Когда   вы  создали  массив  с  использованием  команды
 COPYFROMARRAY, вы можете  описать  доступ  к  особым  полям
 массива  имен.  Например, если запись, хранимая в массиве Т
 является описанием таблицы orders и если PART  NO  является


                           - 58 -
 полем данной таблицы, то выражение:
      Т("PART NO")
 описывает  параметры  поля  "PART NO", хранимые в описанной
 записи.
      Этот   тип   описания   удобен  ,т.к.  каждый  массив,
 созданный COPYTOARRAY имеет  размер  на  один  больше,  чем
 количество  полей  в  хранимых в копии. Имена текущих полей
 таблицы хранится в первом элементе массива, первый  элемент
 массива  располагается  во  втором  элементе массива и т.д.
 Пока массив имеет имя Т("PART NO),  PAL  смотрит  в  формат
 имен в первом элементе массива. Затем он интерпретирует это
 поле как спиок имен полей таблицы. Поле имен превращается в
 поле  номеров,  увеличенное  на  один,  и  используется как
 индекс в массиве.
      Например,если  "PART   NO"   является   вторым   полем
 упорядоченной  таблицы и Т(1) содержится в поле "оrders",то
 Т("PART NO") эквивалентно: Т(2).
      Команда COPYFROMARRAY пропускает первый элемент своего
 аргумента  и начинает перенос значений со второго элемента.
 Смотрите описание команд COPYFROVARRAY и COPYTOARRAY в час-
 ти 9 более подробно.
     
                        О П Е Р А Т О Р Ы
                       __________________
     
      Выражения  могут  содержать   следующие   из   четырех
 основных  операторов,  используемых  для  работы  с данными
 ПАРАДОКСА:
     +
     -
     *
     /
 В PALе также используются операторы сравнения:
     =    равно
     <>   не равно
     <    меньше
     <=   меньше или равно
     >    больше
     >=   больше или равно
 и логические операторы (И,ИЛИ,НЕ).


                           - 59 -
     
                              
                         ОПЕРАТОР +
               
      Действие оператора зависит от типов  входящих  в  него
 операторов.  Имея  два  оператора,  оператор  +  возьмет их
 арифметическую  сумму.  Имея  две  строки,  оператор  +  их
 "склеит".   Имея   дату  в  качестве  первого  аргумента  и
 положительное или отрицательное число N в качестве  второго
 аргумента, он вычислит дату N дней "в сторону " от заданной
 даты.
     Примеры:
       45+50.2+5      ; имеет величину 100.2
       "Income"+"Tax" ; имеет величину "Income Tax"
       "Income"+"   " ; имеет величину "Income"
       "  "+"  "      ; имеет величину "   "
       12/17/83+7     ; имеет величину 12/24/86
 Никакие другие комбинации типов аргументов с  оператором  +
 не применяются. Например, 7+12/17/83 приведет к ошибке,т.к.
 первый  аргумент месяц.
 
                         ОПЕРАТОР -
     
     Может быть использован для  обозначения  отрицательного
 числа или как оператор вычитания.
     Для чисел, оператор используется для вычисления разницы
 между  ними,  для  даты  он  может  использоваться  как для
 вычисления числа дней так и для вычисления разницы (в днях)
 между двумя датами. Например:
     25-17                     ; имеет значение 8
     -(5+3)                    ; имеет значение (-8)
     independence-3            ; имеет значение 7/1/86
     independence-7/1/86       ; имеет значение 3
     
     Никакие другие комбинации  аргументов  не  используются  с
 оператором  (-).


                           - 60 -
 
                       ОПЕРАТОРЫ * и /
     
     Оператор  *  (умножение)  и  /  (деление)  может   быть
 использован  с  числовыми аргументами. Деление на нуль дает
 результат 0.
     
                     ОПЕРАТОРЫ СРАВНЕНИЯ
     
    Выражения могут содержать следующие операторы сравнения:
            =    равно
            <>   не равно
            <    меньше
            <=   меньше или равно
            >    больше
            >=   больше или равно
     Эти операторы могут использоваться для сравнения  любых
 типов   данных,   исключая   логические.   Действие   таких
 операторов, таких как <и> зависит от типов аргументов.  Для
 строковых  величин используется нумерация ASCII; для данных
 используется  хронологическая  нумерация;  для   логических
 FALSE рассматривается как предшествующий TRUE.
     Например:
     5+1 < 6*2                        ;дает TRUE
     independence = 7/4/86            ;дает TRUE
     Trua <> False                    ;дает TRUE
     "abc" = "ABC"                    ;дает FALSE
     "ab" = "ab"                      ;дает FALSE
     "ab" < "ab"                      ;дает TRUE
     independence"abc"                         ;дает TRUE
 Пустые значения всегда меньше любых данных  того же  типа.
     Например,
     "  " < "А"                       ;дает TRUE
     "  "   - воспринимается как пустое множество.
     


                           - 61 -
     
             ЛОГИЧЕСКИЕ ОПЕРАТОРЫ (AND, OR, NOT)
     
     Выражения  с  логическими  величинами  могут  применять
 логические операторы: AND, OR и NOT.
     AND выражение имеет величину True, если  оба  аргумента
 True  и величину False в других случаях; OR выражение имеет
 величину True если хотя бы один из аргументов  True,  иначе
 False.  NOT  выражение  имеет  величину  True если аргумент
 False и наоборот.
     Заметим разницу между оператором сравнения < > (не рав-
 но) и логическим оператором NOT.
     
     
                      ПОРЯДОК ВЫЧИСЛЕНИЯ
     
     Для  выражений,  содержащих  более  чем  один  оператор
 необходимо  знать  порядок  вычисления  выражения.  Круглые
 скобки   определяют  группу  величин,  которые  вычисляются
 первыми. Ниже приведен порядок (приоритет)  вычисления  PAL
 операторов.
                                                 
     
     *, /
     +, -
     =, <>, <, <=, >, >=
     NOT
     AND
     OR
 
                К Л Ю Ч Е В Ы Е   К О Д Ы   P A L
                _________________________________
     
                      
     Некоторые PAL команды, определенные как ASC,  KEYPRESS,
 SETKEY  и  WAIT  принимают  коды  символов с клавиатуры как
 аргументы. Чтобы обеспечить Вам ссылки  на  различные  коды


                           - 62 -
 (включая  спецклавиши), PAL обеспечивает несколько способов
 обозначения клавиш:
     1.  Односимвольные  строки  -  строка,  содержащая один
 символ,  используется  для  обозначения  клавиши  с   таким
 символом.  Например,  строка "Q" соответствует клавише Q на
 верхнем регистре.
     2. Положительные коды - любые  256  кодов.  В  качестве
 ключевого  кода  PAL  может быть представлен код [Ctrl][R].
     3. Отрицательные коды - много клавиш клавиатуры IBM  PC
 не соответствует любому ASCII коду. К этой категории ключей
 относятся   функциональные  клавиши  и  комбинации  нажатия
 клавиш совместно с [Alt]. Эти ключи называются  Расширенным
 кодом IBM.
     В  PAL  такую клавишу можно определить как отрицательное
 число  (от -1 до -132). Например, [Alt][2] имеет код 44, PAL
 код должен быть равен -44. Если положительное число, то  это
 ASCII код.
     4. Строки предстовляющие функциональные клавиши. Строки
 "F1"  -  "F40"  могут  быть  использованы  для  отображения
 следующих функциональных клавиш:
      "F1" - "F10"  - стандартные функциональные клавиши
      "F11" - "F20" - клавиша Shift и клавиша Fx
      "F21" - "F30" - клавиша Ctrl и клавиша Fx
      "F31" - "F40" - клавиша Alt и клавиша Fx
      Напрмер, строка "F12" соответсвует клавишам [Shift][F2]
 и расширенному коду -85.
      5.  Строки  отражающие специальные ключевые коды PAL. -
 Это такие ключи как Menu, Help, CtrlPgUp и т.д. Например, Вы
 можете сослаться к ключевому слову  Help  с  помощью  строки
 "Help".  Заметим,  что во многих случаях вы можете сослаться
 на некоторые ключи различными путями. Например,  Help  может
 быть построен с помощью PAL клавиши "Help", "F1" или -59. Их
 надо использовать в зависимости от контекста.
      Также заметим, что все команды PAL применимы к вышеука-
 занным строкам. Например, если переменная Х содержит строко-
 вые выражение "3", вы можете использовать
                             "F" + X


                           - 63 -
 чтобы  построить  PAL  строку F3, соответсвующую клавише F3.
 Например, SETKEY и KEYPRESS команды используют ключевые коды
 PAL как аргументы. Существует  несколько  различий  (версий)
 команды  SETKEY  использующих ключ Help так что они вызывают
 режим просмотра поля:
              SETKEY  "Help"  KEYPRESS  "FieldView"
              SETKEY  "Help"  KEYPRESS  -108
              SETKEY  "F1"    KEYPRESS  (-1 * 108)
      Следующий пример читает символ с клавиатуры и  вызывает
 различные  программы, в зависимости от того какой символ был
 нажат:
          C = GETCHAR()    ;ждет нажатия символа и читает его
          SWITCH
            CASE  C = ASC ("Menu"):
            PLAY "menusels"
            CASE  C = ASC ("Help"):
            PLAY "showhelp"
            CASE  C = ASC ("Q"):
            QUIT
          ENDSWITCH
      Заметим, что функции ASC и GETCHAR возвращают ключевые
 коды PAL в виде числа  (положительные  для  ASCII  кодов  и
 отрицательные для расширенного кода).
      Функция ASC преобразует выражения "Menu", "Help", и "Q"
 к  числовой  форме так что они могут быть сравнимы с числом,
 полученным от функции GETCHAR.
      
                      М А С К А  (Picture)
                      ____________________
     
     Команда PICTURE - мощное и гибкое средство для контроля
 ввода пользователя  в  поле  данных.  Например,  если  поле
 содержит номера социального страхования, можно потребовать,
 чтобы любые значения, набранные в этом поле, имели вид:
                          ###-##-####
  где: # представляет любую цифру.


                           - 64 -
     Или  можно  потребовать,  чтобы вводимые значения имели
 форму телефонных номеров.
     Маски позволяют Вам предавать пользователю,  что  может
 быть  введено  в поле таким или иным способом. Но они также
 делают ввод данных быстрей и  легче  путем  автоматического
 добавления  требуемых символов. Например, можно сделать так
 чтобы дефисы в телефонных  номерах  и  номерах  социального
 страхования  вводились  автоматически в нужные места. Можно
 также организовать появление возможных значений при нажатии
 пользователем пробела.
     Маска  -  это  путь определения новых типов полей путем
 увеличения ограничений любого  из  существующих  типов.  Не
 обязательно   использовать   PAL,чтобы  получить  доступ  к
 маскам. Они доступны прямо из ПАРАДОКСА  в  выборе  Edit  и
 Data  Entry/Valchek.  (см. описание в Paradox User`s Guide,
 гл.7).  Маски  могут  использоваться  в  PAL   совмесно   с
 командами Wait и Accept.
 
 
                      КАК ОПРЕДЕЛИТЬ МАСКИ
     
     Маска    это    род    шаблона.    Она    состоит    из
 последовательности литералов ,"переплетенных" с  символами,
 список которых приведен в таблице ниже и некоторами другими
 спецсимволами.
                         
 --Символы----Описание-------------------------------
     #        только цифра
     ?        только буква(верхн. или нижн. регистр)
     @        любой символ
     $        только буква ,с конвертированием в заглавную
     !        любой символ ,с конвертированием в заглавный
     
     Как  показано  выше,  N  может  быть  определен маской:
 ###-##-####.
     Здесь,  #  означает  символ  маски,  разрешающий только
 цифру.
     "-" - это литерал, означающий, что он должен без  изме-
 нения появиться во введенном значении.


                           - 65 -
    Эта  маска  ожидает  ввода  первых  трех символов в виде
 цифр.  Если  пользователь  набирает  букву,   то   выдается
 звуковой  сигнал  и  буква не отображается на экране. После
 набора трех первых цифр на экране автоматически  появляется
 "-"  и  т.д. (Конечно, это не запрещает пользователю нажать
 [Back  space]  для очистки поля). Если пользователь пробует
 покинуть  поле  (или,  в  случае PAL ACCEPT команды, нажать
 [Enter])  для  ввода  по  маске  ,на  экране   отображается
 сообщение об ошибке "In- complete Field" и курсор останется
 в  поле.  Единственное исключение составляет случай, когда,
 если  не  специфицированы   Valcheck/Required   или   опция
 Reauired  команды  ACCEPT, пользователь может ввести пустое
 поле .
     Литералы, стоящие  в  начале  масок,  автоматически  не
 добавляются. Например: при маске ABC-###,
     "ABC-" добавляется только при нажатии пробела или буквы
 А (заглавлой или прописной).
     Если  надо  специфицировать  один из символов маски как
 литерал, надо перед ним поставить ";". Тоже относится  и  к
 спецкодам масок
  
 --Символ---Описание---------------
     ;    следуюй символ - литерал
     *    счетчик повторений
     []   опция
     {}   оператор группирования
     ,    набор альтернатив
      
     Следующие  разделы обсуждают некоторые мощные и гибккие
 возможности масок.
      
                       СЧЕТЧИК ПОВТОРЕНИЙ
      
      Можно определить количество  повторений  для  литерала
 или символа, напимер:
      ABC*25#    тоже самое что и
      ABC########################


                           - 66 -
      
      Можно  определить  количество  повторений  для  группы
 символов, заключив их в { }:
      *3{ABC}##
      Если не указывать номера после *,  то  определяются  0
 или  больше  повторений символа или группы, следующей за *.
 Например, ##*# разрешает значение из двух или более цифр.
      
               ОПРЕДЕЛЕНИЕ ВОЗМОЖНЫХ ЧАСТЕЙ МАСОК
      
      Часть  маски  может  быть  лишь   возможной,   но   не
 обязательной, путем заключения ее в [ ].Например:
      
                     [(###)]###-####
     
 позволит    вводить   семизначные   телефонные   номера   с
 трехзначной  областью  лишь  по  необходимости.  Если  ввод
 начинается  с "(",то эта часть будет введена, если нет - то
 будет пропущена. Технология  ввода  такова,  что  возможные
 значения  будут вводится только при нажатии первого символа
 этих значений или пробела.
      Помните,   что    маски    просматриваются    системой
 слева-направо. Неосторожность может привести к ошибкам .
      
                     ОПРЕДЕЛЕНИЕ АЛЬТЕРНАТИВ
      
      Во  многих  приложениях  требуется  чтобы пользователь
 вводил часть  или  все  поле  как  один  из  фиксированного
 количества  возможных  альтернатив.  Например,  номер может
 состоять из  шести  цифр,  между  парами  из  трех  которых
 находится  один  из  кодов  цветов  RED,GRE,YEL,BLU.  Можно
 определить  набор альтернатив в маске, разделив их запятой.
 В случае описанном выше :
            ###RED###,###GRE###,###YEL###,###BLU###.
 Более эффектно,можно записать:
                     ###{RED,GRE,YEL,BLU}###


                           - 67 -
     Зесь,  {  }  испольуются для группирования альтернатив.
 Литералы в альтернативах не  вставляются  автоматически,  а
 появляются  после  нажатия  пробела или ввода первой бууквы
 альтернативы.
      Различные  альтернативы не обязательно должны быть ли-
 тералами, а могут быть любыми масками. Например, так  можно
 определить число из двух или трех цифр:
                             ###,##
      Заметим  ,что  маска  ##,### не будет работать, потому
 что после ввода первых двух цифр первая альтернатива  будет
 удовлетворена, и ввод закончится.
      В следующем примере маска используется для того, чтобы
 ограничить ввод дат первой неделей месяца:
                  #[#]/{1,2,3,4,5,6,7}/##[#][#]
      
              КОМБИНИРОВАНИЕ РАЗЛИЧНЫХ ВОЗМОЖНОСТЕЙ
      
      Помещая вместо символов маски повторения, альтернативы
 и   опции   можно  создать  большое  количество  масок  для
 приложений. Приведем несколько примеров:
      Количество  долларов,  с  использованием  скобок   для
 отрицательных значений:
                         (#.##),*#.##
      Положительные  целые  с  запятыми,  разделяющие группы
 трех цифр:
                         #[#][#]*{;,###}
      Различные напряжения:
                         {20,40,60,75,100}W
      Размеры:
                         {A,B,C,D,E,F,G,H}[R]##-##
      


                           - 68 -
     
                  Ф У Н К Ц И Я   Ф О Р М А Т
                  _____________________________
      
      Функция FORMAT позволяет  установит  спецификации  для
 отображения  и  ввода  значений данных, в отличие от масок,
 позволяющих форматировать ввод данных.
      FORMAT позволяет вам управлять точностью цифр,  вводом
 в  заглавных  или прописных букв, форматом дат, подавлением
 или включением индицирующих пробелов и многим другим.
      В  следующей  таблице  приведены  все  возможные  типы
 форматов и типы данных, к которым они относятся.
.

                           - 69 -
 ____________________________________________________________
     
  Формат        Спецификация                          Тип
 ____________________________________________________________
     
 Ширина  Wn     числовые значения                      all
         Wn.m   числовое значение с десятичной точкой  N$
 Выров-  AL     левоустановленный                      all
 ненный  AR     правоустановленный                     all
         AC     центрированный                         all
 Регистр CU     заглавные буквы (верхний регистр)      all
         CL     прописные буквы (нижний регистр)       all
         CC     только заглавные буквы                 all
 Редакти-E$     плавающая запятая                      N,S,$
 рование EC     отделяет каждые три целые цифры        N,S,$
         EZ     печать незначащих нулей                N,S,$
         EB     бланк для печатающих нулей             N,S,$
         EI     международный формат                   N,S,$
         ES     печать в научных системах              N,S,$
         S+     печать "+" или "-" числа               N,S,$
         S-     печать "-" числа                       N,S,$
         SP     печать отрицательного числа            N,S,$
         SD     печать в DB или CR системах            N,S,$
         SC     печать CR после отрицательного числа   N,S,$
         D1     использование формата даты mm/dd/yy    D
         D2     использование формата Month dd/yy      D
         D3     использование формата mm/dd            D
         D4     использование формата mm/yy            D
         D5     использование формата dd-Month         D
         D6     использование формата Mon yy           D
         D7     использование формата dd-Mon-yyyy      D
         D8     использование формата mm/dd/yyyy       D
         D9     использование формата dd.mm.yy         D
         D10    использование формата dd/mm/yy         D
         D11    использование формата yy-mm-dd         D
         LY     использование Yes/No для  True/False   L
         LO     использование On/Off для True/False    L
     
   Типы:  N  - целое, S - дробная часть, $-валюта,   D-дата,
     L-логическое.


                           - 70 -
     
      
                       СПЕЦИФИКАЦИЯ ШИРИНЫ
      
      Спецификация    ширины   позволяет   управлять   общим
 количеством  символов  в  значении.  Если  выражение   было
 числом,   спецификация  ширины  позволит  определить  число
 знаков после запятой. Ширина может быть между 1 и 255. Если
 ширина не определена, то значение будет выведено  так,  как
 введено.
     Если выражение имеет численный тип ("numeric type") или
 тип даты ("date type"), и длина его возвращаемого  значения
 превышает  величину,  допускаемую функцией FORMAT, то будет
 возвращена строка, состоящая из звездочек (знаков "*"). Для
 буквенно-числовых и логических значений в том случае,  если
 длина  значения  больше,  чем  отображаемое  поле, значение
 будет уничтожено.
      Далее  приводятся  некоторые   примеры   использования
 спецификации поля (ширины):
      
      FORMAT ("W6", "This is a test") = "This i"
      
      FORMAT ("W6", 1234567) = ******
      
      FORMAT ("W1", 5=5) = "T"
      
      Для  чисел  Вы можете указать число десятичных позиций
 после  точки,   которые   Вы   хотите   отобразить.   Форма
 спецификации следующая:
      
      Wn.m
      где  n  -  общая  длина  возвращаемого значения, а m -
 число отображаемых (показываемых) десятичных позиций  после
 точки. Это число не может превышать 15. Величина n включает
 позиции  для  десятичной  точки,  число  цифр слева от нее,


                           - 71 -
 число цифр справа от точки, признак числа  (как  в  случае,
 когда он отображается, так и когда не отображается) и любой
 другой  знак  (например, запятую). Если форматируемое число
 имеет больше цифр справа от  десятичной  точки,  чем  может
 быть отображено, то лишние цифры будут отброшены.
      Несколько примеров использования спецификации Wn.m:
      
      FORMAT ("W9.2", 1234.123) = 1234.12
      
      FORMAT ("W6.1", 123456.12) = 123456
     
      
   СПЕЦИФИКАЦИЯ ВЫРАВНИВАНИЯ (The Alingment Specification)
      
      Спецификация   выравнивания   регулирует  расположение
 форматируемой величины с учетом ее ширины поля. Если ширина
 не специфицирована или если ширина  равна  длине  значения,
 выравнивание не эффективно.
      Если   выравнивание   не   специфицировано,  строки  и
 логические значения выравниваются влево, а числа и  даты  -
 вправо.
      Следующие   примеры   иллюстрируют  некоторые  аспекты
 спецификации выравнивания.
      
   FORMAT ("W20, ac", "This is") = "       This is      "
      
   FORMAT ("W20, ac", "The Title") = "      The Title     "
      
   FORMAT ("W20, ac", "Of the Book") =     Of the Book    "
      
   FORMAT ("W20, al", 12345) = "12345               "
      
   FORMAT ("W20, ar", 12345) = "               12345"
      


                           - 72 -
       СПЕЦИФИКАЦИЯ СОСТОЯНИЯ (The Case Specification)
      
       Спецификация состояния предоставляет Вам  возможность
 управлять    способом   отображения   состояния   значений.
 (Замечание перев.: здесь под "состоянием"  понимается,  вид
 букв:  прописные (строчные). Опция задания первой прописной
 буквы - СС - превращает  в  прописную  букву  первую  букву
 каждого    слова.    Слово    определяется    как    строка
 буквенно-числовых  символов,  ограниченная   символом,   не
 являющимся буквой.
      Примеры использования спецификации состояния:
      
 FORMAT ("cu", "the quick brown fox") ="THE QUICK BROWN FOX"
      
 FORMAT ("cl", "JUMPS OVER THE LAZY DOG") ="jump   over  the
                                            Lazy dog"
      
 FORMAT ("cc", "how now brown cow") =    "How Now Brown Cow"
                                       
 FORMAT ("cc", "asdf1asdf asdf") =       "Asdf1Asdf Asdf"
                                      
    СПЕЦИФИКАЦИЯ РЕДАКТИРОВАНИЯ (The Edit Specification)
      
      Спецификаторы редактирования предоставляют возможность
 управления  способом  представления  численных  величин. Вы
 можете указать: хотите ли Вы отобразить число  с  плавающим
 знаком  доллара, ввести запятую (отделение разрядов тысяч -
 прим.  перев.),  хотите  ли,  чтобы   перед   числом   были
 напечатаны   нули  или  чтобы  пробелы  перед  числом  были
 заменены звездочками. Последняя  опция  полезна  для  таких
 приложений,  как выписывание чеков, когда необходима защита
 от несанкционированного дописывания цифр к числу.
      Спецификаторы E$ и EC могут применяться  одновременно,
 а также дополняться спецификаторами EZ, EB либо E*. Однако,
 в  отличие  от  синтаксиса  других  спецификаторов формата,
 E-префикс используется в  утверждении  FORMAT  только  один
 раз. Так, если Вы хотите использовать одновременно как знак
 доллара,  так  и  запятую  при  форматировании,  Вы  можете
 достичь этого при помощи  включения  следующего  выражения:
 "E$C".


                           - 73 -
      Спецификаторы    редактирования   взаимодействуют   со
 спецификаторами признака при определении  вида,  в  котором
 будет отображаться число.
      В следующих примерах предполагается, что x=34567.78;
      
      FORMAT("W10.2, E$C", x) = $34,567.78
      
      FORMAT("W16.2, E$C*",x) = $*****34,567.78
      
       СПЕЦИФИКАЦИЯ ПРИЗНАКА (The Sign Specification)
      
      Спецификаторы  признака  могут быть применены только к
 числам.  Как  отмечалось  выше,  спецификаторы  признака  и
 редактирования   взаимодействуют  между  собой.  Вы  можете
 указать, каким образом будут отображаться признаки, включая
 отображение символов CR и DB  в  приложениях,  связанных  с
 бухгалтерским учетом.
      Элементы   спецификаторов  редактирования  и  признака
 имеют  следующий   порядок   отображения   (заметьте,   что
 одновременно   может   быть   использован  только  один  из
 элементов признака):
      открывающаяся скобка;
      знак доллара;
      + или -;
      fill символы (знаки, символы, цифры, признаки,  буквы,
           литеры) (предваряющие нули или звездочки);
           собственно число;
      DB или CR;
      закрывающаяся скобка.
      Примеры, в которых предполагается, что x=-3467.78
      
      FORMAT("W14.2, e$c*, sp", x) = ($***3,467.78)
      
      FORMAT("W11.2, e$c, sc",x) = $3,467.78 CR
      
         СПЕЦИФИКАЦИЯ ДАТЫ (The Date Specification)
      


                           - 74 -
      Спецификатор  даты   прадоставляет   Вам   возможность
 форматирования  даты  в  одном  из  восьми  форматов  даты,
 поддерживаемых генератором отчетов PARADOX. В случае,  если
 в   выражение   FORMAT   включен  параметр  ширины  поля  и
 специфицированная  им  длина  меньше,  чем  требуемая   для
 формата даты, будет возвращена строка звездочек.
      Следующие     примеры    иллюстрируют    использование
 спецификации даты:
      
      FORMAT("d2", 7/4/1776) = July 4, 1776
      
      FORMAT("d7", 7/4/1776) = 4 - Jul - 1776
      
     ЛОГИЧЕСКАЯ СПЕЦИФИКАЦИЯ (The Logical Specification)
      
      Логические спецификаторы применимы только к логическим
 значениям.  Они  предоставляют   Вам   возможность   замены
 используемых по умолчанию значений True/False на логические
 пары Yes/No или On/Of/f.
      Например:
      FORMAT("LY", 5=5) = "Yes"
      
     
              В С Т Р О Е Н Н Ы Е   Ф У Н К Ц И И
              ___________________________________
      
              (B U I L T - I N   F U N C T I O N S)
                    
      PAL  поддерживает  расширенную  библиотеку  встроенных
 функций. Функции вводятся для:
      - оперирования со строками, поиска и форматирования;
      - оперирования с датой и временем;
      - тригонометрических и логарифмических вычислений;
      - статистических  вычислений,  таких,  как  вычисление
 дисперсии и стандартного отклонения;
      -  финансовых  вычислений,  таких,  как чистый доход в
 чистых ценах;


                           - 75 -
      - преобразование величин из одного типа данных в другой;
      - поддержки операций ввода/вывода с экраном, клавиату-
 рой, принтером;
      -  получение  информации  о таблицах, экранных образах
 (images;возм.   употребление   в    значениях:    "метафора
 экрана","форма  отображения данных на экране" и др. - прим.
 перев.)  и  о  текущем  состоянии  PARADOX'а.  Обращения  к
 встроенным  функциям  имеют форму имени функции, за которым
 следует список аргументов, заключенный в скобки.
      Например:
      
      SQRT(49)      ;имеет значение 7, являющееся квадратным
                    ;корнем из 49
      UPPER("abc")  ;имеет значение "ABC"
      TIME()        ;может иметь значение "10:20:43"
      
      Заметьте, что скобки,  следующие  за  именем  функции,
 обязательны  даже  в том случае, когда эта функция не имеет
 аргументов. PAL позволяет Вам  создавать  Ваши  собственные
 функции.  Такие функции пользователя (функции, определенные
 пользователем  -   User   defined   functions)   называются
 "процедурами". Детально они описаны в следующем разделе.
                                         
      
                       П Р О Ц Е Д У Р Ы
                       _________________
      
                      (P R O C E D U R E S)
                              
      Вы  можете дополнить встроенные функции, поддрживаемые
 PAL'ом, путем  определения  Ваших  собственных  процедур  и
 библиотек   процедур.   Процедуры  более  всего  напоминают
 скрипты        возможны        значения:        "сценарии",
 "макросы","запрограммированные  клавиши"  и т.п., в которых
 последовательности команд объединены  в  пакет.  Однако,  в
 отличие   от   скриптов,   процедуры  могут  иметь  входные
 параметры.  Более  того,  процедура,   которая   возвращает


                           - 76 -
 значение    (используя   оператор   RETURN),   может   быть
 использована  точно  таким  же  образом,   как   встроенная
 функция.
      Другое отличие между скриптами и процедурами состоит в
 том, что как только процедура определена, она размещается в
 памяти в то время, как скрипты всегда размещаются в файлах.
 В  результате, повторяющиеся вызовы процедур в общем случае
 выполняются  быстрее,   чем   повторяющиеся   обращения   к
 скриптам.  С  другой  стороны,  скрипты не занимают места в
 памяти.
      Библиотека   процедур   представляет   собой    группу
 предварительно  определенных  процедур, размещенных в файле
 на диске.  Такие  процедуры  содержатся  в  форме,  которая
 позволяет  быстро  загрузить их в память и выполнить. Это в
 свою очередь приводит к  быстрому  улучшению  характеристик
 больших   приложений.   Кроме   того  появляется  еще  одно
 преимущество,  состоящее  в  сокращении  числа   прикладных
 файлов,   которые   необходимо  предоставить  пользователю.
 Комбинация небольших скриптов, множества  таблиц,  форм,  и
 файл  библиотеки  процедур  включает  в себя все, что может
 потребоваться Вам для обеспечения  большинства  из  обычных
 приложений. Процесс создания и работы с библиотеками описан
 выше.
      
          ОПРЕДЕЛЕНИЕ ПРОЦЕДУР (Defining Procedurs)
      
      Процедура  определяется  путем  использования  команды
 PROC. Пример, приведенный  ниже,  иллюстрирует  определение
 процедуры  DelLast.  При  вызове данной процедуры строкой с
 входным параметром, являющимся именем таблицы, она  удаляет
 последнюю запись из этой таблицы:
      
   PROC  DelLast(tabname);заголовок процедуры DelLast
   EDIT  tabname         ;вызов режима редактирования
   End                   ;перемещение на последнюю запись
   Del                   ;удалить последнюю запись
   DO-IT!                ;завершение процесса редактирования
   ENDPROC               ;конец процедуры DelLast


                           - 77 -
   
      Первая  строка  определения,  называемая "заголовком",
 состоит из: ключевого слова PROC, имени процедуры и  списка
 формальных  параметров - переменных, разделенных запятыми и
 заключенных  в  скобки.  Скобки  обязательны,   даже   если
 процедура  не  имеет параметров. Команды, находящиеся между
 заголовком  и  ключевым  словом  ENDPROC,  составляют  тело
 процедуры.  При  выполнении  команды  PROC  PAL преобразует
 определение процедуры в специальную внешнюю форму,  которая
 обеспечивает быстрое ее выполнение, и размещает определение
 в   памяти.   После  этого  можно  сказать,  что  процедура
 определена  и  может  быть  впоследствие   вызвана.   Время
 существования определения процедуры совпадает с таковым для
 текущей скрипт-операции верхнего уровня.
      В   типовых  приложениях  Вы  можете  разместить  Ваши
 определения прцедур в одном или  нескольких  скрипт-файлах,
 выделенных  из файла главного скрипта. Главный скрипт может
 в  своих   нескольких   первых   командах   обратиться   (с
 использованием   команды   PLAY)   к  любому  из  скриптов,
 содержащих  определение   процедуры,   так   что   загрузка
 последних  в память произойдет в самом начале (работы). Вам
 нет необходимости выделять  Ваши  определения  процедур  из
 файла  главного  скрипта,  если это неудобно для Вас. Но Вы
 должны быть уверены, что команда PROC, в которой определена
 процедура, выполняется раньше, чем  происходит  вызов  этой
 процедуры.
      Процедура  не  может  быть  переопределена  в  течение
 выполнения  скрипта.  В  целях   предотвращения   ненужного
 использования   ресурсов  памяти,  сразу  после  выполнения
 команды PROC, определяющей процедуру с данным  именем,  все
 последующие выполнения PROC для того же имени игнорируются.
 Отсюда   следует,  что  Вы  можете  без  опасений  включить
 определение процедуры в циклы или в другой  контекст  (как,
 например,  в  тело  процедуры),  где  они могут выполняться
 неоднократно. Заметьте, что процедура, определенная  внутри
 другой  процедуры,  не будет реально определена до тех пор,
 пока включающая процедура не начнет выполняться.


                           - 78 -
      Исключение  из   правила   включения   переопределения
 процедур  вводится  командами RELEASE PROCS и RELEASE PROCS
 ALL. В том случае, когда в большом  приложении  не  хватает
 памяти  для  размещения  всех необходимых процедур, команды
 RELEASE PROCS и RELEASE PROCS ALL могут  быть  использованы
 для   отмены   определения   любой   из  процедур,  которые
 использовались ранее  в  данном  скрипте.  Команда  READLIB
 может быть затем использована для того, чтобы быстро ввести
 новые  процедуры  из предварительно определенной библиотеки
 процедур. Либо Вы можете просто определить новую  процедуру
 в теле скрипта, как только это потребуется.
      Память,  занимаемая  любой  высвобождаемой  (released)
 процедурой, возвращается в пул (pool)  памяти.  Таже  самая
 или  другая  процедура может быть впоследствии использована
 или переопределена. Будьте  внимательны  с  тем,  чтобы  не
 выполнить команду RELEASE PROCS ALL изнутри процедуры.
      
               ВЫЗОВ ПРОЦЕДУР (Calling Procedures)
      
      Процедуры  могут  быть  вызваны  двумя  способами. Как
 упоминалось  ранее,  если  процедура  возвращает   значение
 (используя  команду  RELEASE), Вы можете вызвать ее в любой
 ситуации, которая предполагается выражением,  точно  также,
 как  и  для  встроенных  функций. Если процедура возвращает
 значение, это значение присваивается специальной внутренней
 переменной, называемой retval.
      Вы также можете вызвать процедуру как одиночную коман-
 ду, например:
      
      DelLast  ("orders");удалить  последнюю  запись таблицы
                          orders.
      
      В любом случае вызов состоит из  имени  процедуры,  за
 которым  стоит список выражений для аргументов, разделенный
 запятыми и заключенный в скобки. Число аргументов в  вызове
 процедуры должно равняться числу формальных параметров в ее


                           - 79 -
 определении.  Так  же, как и для встроенных функций, скобки
 обязательны в том случае, когда процедура имеет  аргументы,
 так  и  когда  их  не  имеет.  Массивы как таковые не могут
 передаваться в качестве аргументов в процедуры. Однако,  Вы
 имеете возможность передать элемент массива (как, например,
 b[3]).
                         
      СОЗДАНИЕ И ИСПОЛЬЗОВАНИЕ БИБЛИОТЕКИ ПРОЦЕДУР
      
      Как было отмечено выше, Вы можете создавать библиотеки
 предопределенных   ПАЛ-процедур.  Бибилиотека  процедуры  в
 дальнейшем дает Вам  много  преимуществ  в  компиляции  при
 разработке  Ваших  приложений.  Библиотека  процедуры - это
 специальный файл, который хранит одно  или  более  описаний
 процедуры  в  специальной  форме,  которая  позволяет очень
 быстро считывать их в память и выполнять. Вместе с командой
 RELEASE  PROCS  библиотеки  процедуры  позволяют  загружать
 процедуры  в  память  и  выводить  их  из  памяти  во время
 выполнения приложений,  без  чтения  каждый  раз  из  файла
 программы   описаний   процедуры.  Таким  образом,  большие
 приложения могут быть описаны, как процедуры и, посредством
 этого программа, в  которой  процедуры  не  использовались,
 существенно улучшается.
      Библиотеки   процедуры   позволяют   также  объединить
 несколько   програмных   файлов,    составляющих    большое
 приложение,  в  единственный  файл  библиотеки  процедуры и
 начальную   управляющую   программу.    После    построения
 библиотеки   процедуры   исходные   программы,   содержащие
 описания процедуры, уже не нужны для запуска  приложения  -
 только для его отладки.
      
      
                       СОЗДАНИЕ БИБЛИОТЕК
      
      Библиотеки  процедуры  создаются  при  помощи  команды
 CREATELIB, которая создает  пустую  библиотеку,  в  которой
 может  храниться до 50 процедур. Все библиотеки должны быть


                           - 80 -
 обязательно  созданы  перед  тем,  как  сохранять   в   них
 процедуры.  Библиотеки  процедур  - это файлы с расширением
 ".lib". CREATLIB в качестве расширения  использует  строку,
 которая специфицирует имя библиотеки. Например, команда
      CREATELIB "mylib"
 создает   файл   с  именем  mylib.lib.  Отметим,  что  хотя
 созданная  вновь  библиотека  не  содержит  процедур,   она
 занимает   некоторое   место,   используемое  для  хранения
 директории библиотеки и другой внутренней информации.
 
                ЗАПИСЬ ПРОЦЕДУР В БИБЛИОТЕКИ
      
      После создания библиотеки командой CREATELIB Вы можете
 использовать команду WRITELIB для записи  в  нее  процедур.
 Команда  WRITELIB  использует  в  качестве  аргументов  имя
 библиотеки процедуры и список процедур, которые должны быть
 в  библиотеку  записаны.  Для  того,   чтобы   использовать
 WRITELIB   процедуру   или  процедуры,  которые  Вы  хотите
 сохранить  в  библиотеке,  должны  быть  в  текущий  момент
 времени   загружены   в  память.  Таким  образом,  типичным
 использованием команды WRITELIB  может  быть  программа,  в
 которой  эта  команда следует за описаниями PROC. Следующая
 программа,   например,   создает    библиотеку    Birthday,
 описывающую две процедуры, которые определяют, сколько дней
 осталось до указанного дня, а затем использует WRITELIB для
 записи их в библиотеку.
      
      CREATRLIB "birthday" (день рождения)
      
      PROC Nextbday(date, yrsmore)
          PRIVATE datetoday
          nextdate  =  DATEVAL(STRVAL(MONTH(date))  +  "/" +
              STRVAL(DAY(date)) + "/" + STRVAL(YEAR(TODAY())
                 + yrsmore))
          IF (nextdate = "Error")
            THEN RETURN(367)
            ELSE RETURN(nextdate - TODAY())
          ENDIF
      ENDPROC


                           - 81 -
      
      PROC Days(date)
      days = Nextbday(date,0)
          IF days < 0
             THEN days = Nextbday(date,1)
             ELSE
             IF (days > 366)
                THEN RETURN "You do not have a birthday this
                                                      year"
             ENDIF
          ENDIF
      
          IF (days = 0)
             THEN RETURN "HAPPY BIRTHDAY"
             ELSE
               RETURN "There are " + STRVAL(days) + " days
                                 left until your birthday"
          ENDIF
      ENDPROC
      
      WRITELIB "birthday" Nextbday, Days
      
      Отметим, что WRITELIB может быть использована повторно
 для  записи  дополнительных процедур в данную библиотеку. В
 действительности, если библиотека предназначена для  записи
 большего  числа  процедур,  чем  их  может  разместиться  в
 памяти,  она  должна  быть  построена  следующим   образом:
 описывается  несколько  процедур,  затем  они записываются,
 память освобождается, описываются другие процедуры и т.д.
      Запись  процедуры  с  именем,  которое  уже   есть   в
 библиотеке,  приведет  к  потере  старого  описания. Однако
 пространство, занимаемое файлом  со  старым  описанием,  не
 перекрывается.   Кроме   того,   процедуры  не  могут  быть
 перемещены из библиотеки.
      


                           - 82 -
      
                  ЧТЕНИЕ ПРОЦЕДУР ИЗ БИБЛИОТЕК
      
      Процедуры,  записанные  в   библиотеку,   могут   быть
 загружены   во  время  выполнения  программы,  либо  прямым
 использованием   команды   READLIB,   либо    автоматически
 автозагрузкой.    Загрузка    процедуры    из    библиотеки
 соответствует описанию ее с  использованием  команды  PROC,
 только намного быстрее.
      Команда  READLIB  указывает  имя библиотеки процедуры,
 которая должна быть прочитана, и список  процедур,  которые
 должны   быть  загружены.  Следующая  программа,  например,
 загружает процедуры из библиотеки Birthday, описанной выше:
      
      READLIB "birthday" Days, Nextday
      
      CLEAR
      @10,10 ?? "What is your birthdate: "
      ACCEPT "d" to x
      RETURN (Days(x))
      
      Вы можете использовать  READLIB  для  чтения  стольких
 процедур,  сколько  необходимо  в текущий момент. Когда ряд
 процедур больше не нужны, команда RELEASE PROCS может  быть
 использована  для освобождения памяти, которую они занимают
 с  тем,  чтобы,  например,  могли  быть  загружены   другие
 процедуры.
      С  ипользованием  автозагрузки  процедуры  могут  быть
 считаны автоматически. Когда вызывается процедура,  которая
 не была ранее описана, ПАЛ ищет библиотеку с именем paradox
 в  текущем  каталоге.  Если такая библиотека существует, то
 процедура ищется в ней и,  если  находится,  загружается  в
 память.  Если  же  такой  библиотеки  нет  или процедура не
 найдена,  фиксируется  программная  ошибка   о   том,   что
 процедура не определена.
      Вы    можете   определить   другую   библиотеку,   как
 автозагружаемую изменением значения переменной PAL autolib.


                           - 83 -
 Если  эта  переменная  имеет  значение,  она  должна   быть
 строкой-именем библиотеки. Например:
      
      autolib = "sam"
      
 определяет   для   автоматического   поиска   и   просмотра
 библиотеку   sam.lib.   Вместо   paradox.lib   Вы    можете
 использовать для автозагрузки различные библиотеки даже для
 одного  приложения,  изменяя  в  подходящий момент значение
 autolib.  Отметим,  что  объявив   autolib,   как   частную
 переменную  для  процедуры,  Вы  можете изменить библиотеку
 автозагрузки только на время вызова данной процедуры.
      
      
                РАСПЕЧАТКА СОДЕРЖАНИЯ БИБЛИОТЕКИ
      
      Команда INFOLIB создает специальную временную  таблицу
 List,   которая  показывает,  какие  процедуры  записаны  в
 указанной  библиотеке.  Таблица  включает   приблизительный
 объем  (в  байтах),  который  каждая  процедура  занимает в
 памяти. Например:
      
      INFOLIB "Birthday"
      
 выдает  таблицу  List,   содержащую   записи   для   каждой
 процедуры,  записанной  в  библиотеке Birthday. Легче всего
 вызвать команду INFOLIB из минискрипта.
      
      
           ОТЛАДКА ПРОЦЕДУР, ЗАПИСАННЫХ В БИБЛИОТЕКАХ
      
      Поскольку   процедуры   записаны   в   библиотеках   в
 специальном  виде,  они  не могут быть отлажены до тех пор,
 пока программа, содержащая исходное описание процедуры,  не
 будет доступно отладчику. ПАЛ может найти это описание, имя
 файла   программы,   записанное   в   библиотеки  вместе  с
 процедурой. Имя файла записано в  полном  виде  и  содержит


                           - 84 -
 спецификацию устройства, каталог и имя файла. Отладчик ищет
 файл  программы  в его каталоге. Если программа, содержащая
 описание  процедуры,  не  может  быть  найдена,   выводится
 сообщение об ошибке и отладка заканчивается.
      
      
                    КАК ПЕРЕДАЮТСЯ АРГУМЕНТЫ
      
      При  вызове  процедуры последовательно просматриваются
 ее  аргументы.   Затем   значения   аргументов   передаются
 формальным  параметрам, определенным в описании. Этот метод
 передачи аргументов называется "вызов по значению".
      Рассмотрим,  например,  следующее  описание  и   вызов
 процедуры с именем Future. Эта процедура принимает дату d и
 число  недель  w  как  аргументы и возвращает дату, которая
 будет ровно через w  недель  от  d.  Мы  предполагаем,  что
 переменная   x   уже   была  проинициализирована  значением
 некоторого числа недель:
      
      ; Первое описание процедуры Future
      PROC Future(d,w)
      w = w * 7
      RETURN(d + w)
      ENDPROC
      ;
      ; Затем отображается сообщение о дате, которая будет
      ; через х недель от сегодняшнего дня
      MESSAGE "Будущая дата -", Future(TODAY(),x)
      
      Когда процедура Future  вызывается  командой  MESSAGE,
 аргументы  TODAY()  и  х  известны и их значения передаются
 параметрам d и  w.  Затем  выполняется  тело  процедуры,  в
 котором  изменяется  w  и  возвращается  значение  d  +  w.
 Отметим, что применение w внутри  процедуры  не  влечет  за
 собой  изменение  переменной  х.  То  есть после выполнения
 команды MESSAGE переменная х будет иметь  то  же  значение,
 что и до этого.


                           - 85 -
     
                 ЧАСТНЫЕ И ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
                 
      Поскольку  d  и  w  являются  формальными  параметрами
 процедуры, их "время  жизни"  ограничено  временем  вызова.
 Другими  словами,  как только Future возвращает управление,
 об  этих  переменных  можно  забыть,  их  как   бы   и   не
 существовало.  По  этой  причине  мы  говорим,  что  d  и w
 являются частными (PRIVATE)  по  отношению  к  Future.  Как
 будет   вкратце   обсуждено,   переменные,   не  являющиеся
 формальными параметрами, могут быть также сделаны  частными
 по отношению к процедуре.
      Предположим, что w было присвоено значение до вызова:
      
      w = 3
      x = 4
      MESSAGE Future(TODAY(),x)
      MESSAGE "w = ", w       ; будет равно 3
      
      Внутри тела процедуры Future все ссылки на  переменную
 w   будут   относиться  к  частному  формальному  параметру
 (инициализированным значением х). Глобальное значение 3  не
 учитывается.
      Усложняя   этот  пример,  предположим,  что  некоторая
 процедура (назовем ее Past) была объявлена  внутри  Future.
 Хотя  w была частной для Past, любое использование w внутри
 Past будет относится к значению w в процедуре Future.
      В  целом,  если  переменная  v  является  частной  для
 процедуры  P,  любое  использование  v внутри P относится к
 частному значению. Иначе говоря, оно относится к значению v
 в контексте, в котором P была вызвана.  Отметим,  что  этот
 контекст  сам  может  быть  телом процедуры и в этом случае
 правило должно быть применено опять.  Эта  схема  известна,
 как "динамическая видимость" переменных.
      
      


                           - 86 -
     
                         КОМАНДА PRIVATE
      
      Поскольку  формальные  параметры являются частными для
 процедур, в  которых  они  описаны,  Вы  можете  менять  их
 значение    внутри   процедуры   без   боязни   модификации
 переменных, имеющих такое же  имя,  используемых  в  другом
 месте программы.
      Для того, чтобы другие переменные, которые Вы временно
 используете  внутри процедуры, могли быть защищены подобным
 образом,  ПАЛ  предоставляет   команду   PRIVATE,   которая
 объявляет одну или более переменных частными для процедуры,
 в  которой команда PRIVATE используется. При использовании,
 команда  PRIVATE  должна  быть  первой  командой   в   теле
 процедуры.
      PROC Hypotenuse(x,y)
        PRIVATE w, z
        w = x * x
        z = y * y
        RETURN(SQRT(w + z))
      ENDPROC
      Вы  можете объявить также частные массивы. Для этого в
 команде PRIVATE указывается просто  имя  массива,  а  затем
 массив объявляется внутри процедуры:
      PROC Foo(x)
        PRIVATE a
        .
        .
        ARRAY a[20]
        .
        .
      ENDPROC
     


                           - 87 -
     
       П О Л Я  Д О С Т У П А   В  И З О Б Р А Ж Е Н И Я Х
       ___________________________________________________
      
      Поскольку   PAL-программы   манипулируют  таблицами  в
 рабочей  области  Paradox,  Вы  должны  иметь   возможность
 использовать    и    модифицировать    значения   полей   в
 изображениях. PAL обеспечивает специальную конструкцию  для
 доступа к полям, которая называется спецификатор "поля".
      
                  ДОСТУП К ТЕКУЩЕМУ ИЗОБРАЖЕНИЮ
      
      Спецификатор поля, в своей основной форме, это  просто
 имя поля в квадратных скобках:
      [Part No]
      Предположим.   Part   No   одно   из   полей  текущего
 изображения; значение выражения [Part No]  -  это  значение
 поля Part No в текущей записи. Если имя поля не определено,
 используется  значение  текущего  поля текущей записи (т.е.
 поля, в котором находится курсор). Например, выражение
      3 + []
 оценивается значением текущего поля плюс 3 (предполагается,
 что текущее поле цифровое).
      Спецификаторы поля могут быть использованы для доступа
 к полям, как выводимого изображения,  так  и  запроса.  Оба
 типа выводимых изображений - табличное и страничное - могут
 быть   доступны.  Поля  запроса  всегда  содержат  строчное
 значение, дающее набранный в поле текст.
      Значения в самой левой позиции запроса  или  выводимого
 изображения  могут  быть  доступны, благодаря использованию
 специального  имени  поля  #.  Для  выводимых   изображений
 значение  [#]  -  это  запись  номера  текущей  записи. Для
 запросов это просто строка, дающая содержимое  самой  левой
 позиции запроса.
     
                  ДОСТУП К ДРУГИМ ИЗОБРАЖЕНИЯМ
      
      Для  операций,  использующих более 1 таблицы в рабочей
 области, часто возникает необходимость  доступа  к  полю  в
 некотором  изображении, не являющимся текущим. Для этого Вы


                           - 88 -
 должны включить ссылку на интересующее Вас изображение, как
 часть идентификатора поля.
      Предположим, например, что Вы имеете в рабочей области
 представления stock и orders, а текущее изображение  -  это
 изображение   stock.   Спецификатор  со  следующими  полями
 обращается к полю Part No текущей записи изображения orders:
      
      [orders -> Part No]
      
      Вы можете обратиться к текущему  полю  записи  orders,
 опустив имя поля:
      
      [orders ->]
      
      В   том   случае,  когда  в  рабочей  области  имеются
 многократные изображения одной таблицы (изображение запроса
 и визуальное изображение, или два  визуальных  изображения)
 Вы должны определить спецификацию подробнее. Запись вида:
      
      [orders(2) ->]
      
      указывает  на второе визуальное изображение (начиная с
 верхушки). Отметим, что пересчитываются только изображения,
 а не запроса. В таблице ниже приведены все возможные комби-
 нации описаний идентификатора полей.
      
      
               ПРИСВОЕНИЕ ЗНАЧЕНИЯ ПОЛЮ
      
               ИЗМЕНЕНИЕ ЗНАЧЕНИЯ ПОЛЕЙ В ИЗОБРАЖЕНИЯХ
      
      Вы  можете модифицировать поля в изображениях, исполь-
 зуя поля спецификатора в левой части оператора назначения.
      Например, команда
      
      [quantity] = [quantity] + 1
                       


                           - 89 -
      увеличивают значение поля Qufntaty текущей записи.
      Назначение  полей  работает  только  в  ПАРАДОКСе вида
 Edit. Это эквивалентно следующей последовательности  дейст-
 вий:
      
      1.сдвиг  курсора  к нужному полю таблицы в рабочей об-
 ласти;
      2.очистка поля;
      3.ввод назначенного значения;
      4.перемещение курсора обратно в исходное положение.
      
                      Спецификаторы полей.
      
      Указатель-------------Значение----------------------
      
      [ ]                Текущее поле в текущем изображении
      [#]                Порядковый номер текущей записи
      [fld]         Поле с именем [fld] текущего изображения
      [tbl ->fld]   Поле с именем "fld" изображения "tbl"
      [tbl ->]           Текущее поле изображения "tbl"
      [tbl(n) ->fld]  Поле с именем "fld" n-го визуального
                       изображения таблицы "tbl"
      [tbl(n) ->]  Текущее поле n-го визуального изображения
                   таблицы "tbl"
      [tbl(Q) -> fld] Поле с именем "fld" изображения запро-
                      са для "tbl"
      [tbl(Q) ->] Текущее поле изображения запроса для "tbl"
      
      Тип передаваемого значения должен быть совместим с ти-
 пом  поля-получателя - данные не должны быть присвоены циф-
 ровому полю, например. Число может быть присвоено денежному
 полю и наоборот, поскольку число и dollar - совместимые ти-
 пы.
      


                           - 90 -
      
               ПЕРЕМЕЩЕНИЕ ПО ПОЛЯМ В ИЗОБРАЖЕНИИ
      
      Спецификаторы поля могут также использоваться с коман-
 дой MOVETO для перемещения курсора в указанное поле. Напри-
 мер:
      
      MOVETO [orders(Q) ->Part No]
      
      делает запрос представления orders текущим изображени-
 ем, а поле Part No текущим полем. Вы можете также использо-
 вать MOVETO для перемещения к заданной записи. Например:
      
      MOVETO RECORD 23
      
      
               З А П Р О С Ы  В  Я З Ы К Е   P A L
               ____________________________________
      
      Задание и выполнение запроса  в  языке  PAL  столь  же
 легко,  как  и  в  системе  ПАРАДОКС (см. Гл.4 "Руководства
 пользователя системы Paradox" для полного описания запросов
 системы Paradox). В действительности, эта процедура одна  и
 та  же  за  одним исключением. Как было рассмотрено в Гл.2,
 операторы запроса системы ПАРАДОКС в рабочей области  могут
 быть  сохранены,  как  программа  с  использованием  пункта
 Scripts/QuerySave из главного меню. Вследствие того, что  в
 системе  ПАРАДОКС осуществляется  структурная поддержка при
 заполнении бланка запроса, и автоматическая  синтаксическая
 проверка  при формировании операторов запроса, почти всегда
 более  предпочтительным  является   использование   системы
 ПАРАДОКС для построения и редактирования запросов с  после-
 дующей  их  записью  в  программу, чем попытка формирования
 временного запроса с помощью редактора.
      Разница между ПАРАДОКСОМ и PALом является  способность
 PALа  доступа  к переменным в операторах запроса. Признаком
 переменной в запросе является знак тильды (~),  с  которого
 начинается  имя переменной. Отметим, что эти переменные мо-
 гут быть использованы только как подстановка для  констант.
 Позтому  они  не  могут занимать места постоянных выражений


                           - 91 -
 полей операторов запроса. Эти выражения, однако, могут быть
 вычислены в ходе программы и введены в запрос с использова-
 нием присваивания полей.
      Отметим,   что   использование  QuerySave  для  записи
 запроса  в  программный  файл  только  сохраняет   оператор
 запроса.  Для  выполнения  сохраненного  запроса  Вы можете
 добавить команду Do_It! после ключевого слова ENDQUERY.
      
      
              В Ы Ч И С Л Я Е М Ы Е   М А К Р О С Ы
              ______________________________________
      
      Для  некоторых  целей  бывает  полезно  вычислять  или
 составлять команды PAL, как строковые выражения и выполнять
 их.  Такие "вычисляемые макросы", как они называются, могут
 быть созданы при помощи команды EXECUTE.
      Предположим, например, Вы хотите  написать  программу,
 которая  принимает  выражение  от  пользователя и вычисляет
 значение этого выражения. Следующие команды  выполняют  эту
 задачу:
      
      @12,5 ?? "Enter an expression:  "  ;  приглашение
                            ;  пользователю ввести выражение
      Accept "a50" to express   ; ввод выражения
      EXECUTE "MESSAGE "  +  express  ;  вычисление  команды
                                         MESSAGE
                                         
      Если, скажем, пользователь набрал выражение
      
      3 + 45 * 6
      
      в   соответствии   с   приглашением,  оператор  ACCEPT
 присвоит строку "3  +  45  *  6"  переменной  exp.  Строка,
 вычисляемая,  как  аргумент оператора EXECUTE будет поэтому
 "MESSAGE3 + 45 * 6". Оператор EXECUTE выполняет строку, как
 команду, а значение отображает на экране дисплея.


                           - 92 -
      Вычисляемые  строки  могут  быть  обычно  представлены
 целой   последовательностью  команд  -  видом  минискрипта.
 Применительно к приведенному  выше  примеру,  мы  могли  бы
 задать
      EXECUTE "MESSAGE " + exp + " Sleep 1000"
      вызывая  задержку,  которая дала бы пользователю время
 проверить значение.
      
              С П Е Ц И А Л Ь Н Ы Е   С К Р И П Т Ы
              _____________________________________
      
                       I N I T
      
       После  запуска  системы  ПАРАДОКС из  DOS  в  текущей
 директории  осуществляется  поиск  специальной  программы -
 init. Если эта программа найдена,  то  она  выполняется  до
 того,  как  управление  будет  передано пользователю (или в
 случае, если программа запущена прямо из  командной  строки
 DOS,  init  выполняется  перед  тем,  как  управление будет
 передано разработанной программе).
      Вы  можете  использовать   init   для   приспособления
 интерфейся   системы   Paradox   согласно  Вашему  желанию.
 Например, Вы можете включить любое число команд SETKEY  для
 приспособления   клавиатуры   или   инициализации   макроса
 клавиатуры. Вы можете  также  задать  выдачу  сообщений  на
 экран - например, о времени и дате.
      Ниже приведен простой пример программы init:
      ; Init Script for Fred Jones
      SETKEY "Fll"  PLAY "Myscript"  ; закрепить Myscript за
                                     ; {Shift{F1}
      SETKEY "FormKey" PICKFORM 1    ; с помощью {F7}
                                     ; выбрать форму F1
      IF DOW(TODAY()) = "Fri"
         THEN
           RETURN "TGIF! "
         ELSE
           RETURN "Today is " + STRVAL(TODAY())
      ENDIF


                           - 93 -
                           
                          I N S T A N T
  
     Специальная  программа,  названная  instant, записывает
 последовательность  каждый  раз,  когда  во  время   работы
 системы  Paradox  нажатием  клавиш  [ALT][F3]. Записываемая
 программа Instant  может  быть  выполнена  нажатием  клавиш
 [ALT][F4].    Однако    это    не    является   необходимым
 использованием этих клавиш для записи или запуска  instant.
 Могут   быть  случаи,  когда  вы  предпочтете  использовать
 [ALT][F4] для запуска более сложной программы  нежели  той,
 что  может  быть  построена  путем записи нажатия клавиш. В
 этих  случаях  вы  можете  записать  программу,   названную
 instant,   или   переименовать   в   instant   существующую
 программу. После этого  нажатие  [ALT][F4]  даст  доступ  к
 сохраненной программе.
     
                  З А Щ И Т А    П А Р О Л Е М
                  ____________________________
     
     В   системе  PARADOX  могут  быть  защищены  паролем  и
 программы  и  таблицы.  Естественно,  не   слишком   хорошо
 использовать защищение таблицы в программе, каторая сама не
 защищена.  Программа  может  быть  защищена  только выбором
 пункта Tools/More/Protect из главного меню системы PARADOX.
 Команда меню Protect не работает с программами.
     Защита паролем не позволяет тем, кто не  знает  пароля,
 исследовать   и   модифицировать  текст  программы,  но  не
 запрещает выполнять программу. Конечно, если вы хотите,  вы
 можете  установить  специальную  команду  (команда Accept),
 запрещающую пользователем работать с  программой,  пока  не
 будет указан правильный пароль.
     Точно   так  же,  как  и  таблицы,  файл  с  защищенной


                           - 94 -
 программой шифруется. Последующий вызов защищенного  файла,
 будь  он  из  редактора  или  пункта меню Debug, приведет к
 тому, что PARADOX запросит пароль. Как и для таблиц, пароль
 запрашивается  один  раз  за  сеанс  работы.  Отметим,  что
 паролирование   предотвращает   редактирование   защищенной
 программы в отдельном текстовом редакторе.
     Обычно,   нажатие   клавиш   [Ctrl][Break]   во   время
 выполнения   программы  приводит  к  тому,  что  выполнение
 программы прерывается. Однако если попытка прерывания имеет
 место во время выполнения защищенной программы,  прерывание
 не проходит.
     Если  вы используете программу, зашифрованную с помощью
 системы PARADOX версии 1.1, вы  не  можете  ее  просто  так
 запустить в системе PARADOX версии 1.0. Для этого вы должны
 дешифровать программу с использованием системы версии 1.1.
     Для удобства вы можете группировать  несколько  таблиц,
 задавая  им  один  и  тот  же пароль. В этом случае по всем
 таблицам или  программам  группы  можно  иметь  доступ  без
 повторного запроса ввести пароль.
     
.

                           - 95 -
     
                                                Г Л А В А  7
 ___________________________________________________________
     
                  ТЕХНИКА ПРОГРАММИРОВАНИЯ
 ___________________________________________________________
     
     В  этой  главе  сжато представлены методы использования
 PAL и PARADOX. PAL - является языком  высокого  уровня.  Он
 предназначен  для  работы с обьектами языка PARADOX. На нем
 можно составлять программы и применять его  для  разработки
 программ с защитой. Мы уверены, что работа с языком PAL, не
 составит для вас никакого труда.
     PAL  облегчает  Вам  работу, расширяет Ваши возможности
 работы в  PARADOX.  С  помощью  клавиатуры  можно  записать
 макрокоманды  в "текущий сценарий". Вы можете, для примера,
 используя "Setkey", подключить  макрокоманду  или  сценарий
 любой клавишей.
     В   этой   главе  объяснено,  как  применять  PAL,  как
 создавать программы или системы и а как использовать PAL  и
 PARADOX.
     
             К О М П Л Е К С Н Ы Й   П О Д Х О Д
             ___________________________________
     
     PARADOX предназначен для автоматизирования многих задач
 в  области  хранения  и обработки данных, и пользователю не
 баз данных не приходится беспокоится о  многом,  о  чем  он
 должен  помнить  при  использовании  других  баз  данных, а
 именно:
     
     >>  PARADOX  оптимизирует   запросы.   Он   анализирует
 оператор   запроса   и   автоматически   находит  быстро  и
 эффективно путь к решению.
     >> PARADOX  работает  с  индексами.  Только  вы  должны
 произвести  установку индексов. PARADOX знает, как защищать
 и использовать их.


                           - 96 -
     >> PARADOX знает даты, он имеет автоматический контроль
 истинности дат. Он знает, как считать даты.
     >>  Когда  изменяется  таблица,  PARADOX  автоматически
 корректирует   в   соответствии  с  этими  изменениями  все
 связанные с этой таблицей формы, отчеты, индексы  и  другие
 объекты.
     >>  Он  позволяет  вам  установить усложненный контроль
 целостности при вводе, включая просмотр таблиц, минимальных
 и максимальных значений и др.
     >>  Он  обеспечивает  шифровку  и  защиту  паролем  как
 таблиц, так и скриптов.
     Все   эти   операции   и  многое  другое  автоматически
 предоставляется вам  PARADOXом  и  программировать  это  не
 требуется. Пусть PARADOX заботится обо всем этом.Как мы уже
 утверждали,  PAL  и  PARADOX  вместе  с  редакторм скриптов
 (Script Editor) и отладчиком (Debugger)  составляют  единое
 целое.   Эта  среда  была  создана  для  того,  чтобы  дать
 возможность  программистам   и   разработчикам   приложений
 конструировать, проверять и представлять готовые приложения
 быстро и эффективно.
     Цель  этой главы заключается в том, чтобы показать Вам,
 как  комбинировать  PAL  BULDING   BLOCKS,   описанными   в
 последующей главе, для создания мощных и полезных программ,
 приложений и продуктивных макро.
     
            С О З Д А Н И Е   П Р И Л О Ж Е Н И Й
            _____________________________________
     
     Наилучшим  путем  создания решения в PAL является путь,
 аналогичный пути создания  решения  в  PARADOX.  PAL  очень
 удобен для моделирования приложений по следующим причинам:
 
     1. Вы можете использовать PARADOX для быстрого создания
 таблиц, запросов, форм, циклов (отчетов), которые Вы хотите
 использовать  в  Вашем приложении. Вы можете проверить Ваши
 объекты и быстро видоизменять их по-необходимости. В  вашем
 приложении,  по  аналогии  с  формами  в PARADOX, Вы можете


                           - 97 -
 использовать  PAL  для  объединения  их   вместе   в   одно
 приложение.  PAL  позволяет  Вам  облегчить  дополнительный
 контроль структуры и управлять экраном и клавиатурой.
     Мы  рекомендуем  следующий общий подход и стратегию для
 разработки приложения:
     >> Создание таблиц, запросов, формы и отчетов,  которые
 будут составлять ядро Вашего приложения.
     >> Определение общей структуры приложения. Использовать
 "Showmenu" для создания дерева меню.
     >>  Разработка  малых, дискретных компонент приложения,
 используя PARADOX для  записи  последовательностей  нажатия
 клавиш и запросов внутри скрипта.
     Особенности Instant/Script Record PARADOX  часто  более
 полезно  для  быстрой  записи  последовательностей  нажатий
 клавиш.
     >>  Использование  PAL  Script  Editor  (или   внешнего
 редактора)  для  комбинирования  отдельных  самостоятельных
 скриптов в большие модули.
     >> Связь модулей дополнительным  контролем  структур  и
 экрана.
                           МЕТОДОЛОГИЯ
     
     В следующем параграфе разбирается этот метод. Для того,
 чтобы   сделать  краткий  обзор  предложенной  методологии,
 полезно обратиться к главе 4 (Примеры прстого  приложения),
 которая    реализует    понятия    и    подходы   (методы),
 представленные здесь.
     
            Разработка и создание необходимых таблиц.
     
     После того, как Вы приступили к  построению  приложения
 вам   необходимо   решить,   какие  таблицы  Вам  при  этом
 понадобятся, и какой они будут структуры.  Благодаря  тому,
 что   PARADOX   является   почти  реляционной  моделью,  он
 облегчает Вам разработку нормализованных структур данных  и
 гарантирует  Вам  возможность  легкого  комбинирования ими,
 когда это необходимо.


                           - 98 -
     Добавим,   что   PARADOX    делает    легким    процесс
 реструктуризации   любой  таблицы  всякий  раз,  когда  это
 необходимо.Если Вы обнаружите, что должны увеличить размеры
 или изменить  тип  поля,  уничтожить  или  дополнить  поле,
 переименовать  поле  или  изменить  порядок  в  таблице, Вы
 можете  сделать  это   без   труда.   Также   очень   легко
 индексировать   таблицы   после   создания.  Вам  не  нужно
 беспокоится  об  индексах  при  моделировании   приложения.
 Позже,  когда  все работает так, как Вам хочется, Вы можете
 дополнить индексы для повышения производительности.
     
     Создание   суперструктуры    приложения.    Определение
     операций,  которые  будут  ее  поддерживать. Разработка
     меню.
     
     Создав  основные  таблицы  для  Вашего  приложения,  Вы
 можете  разработать  суперструктуру.  Наиболее  просто  это
 сделать с помощью команды ShowMenu для создания  тех  меню,
 которые    пользователь    будет    использовать.   Полезно
 использовать  ShowMenu  в  комбинации  с   Swich/Case   для
 создания  иерархии  меню.  Каждый  выбор  из  меню вызывает
 оператор или группу операторов.
 
                 Создание скриптов или процедур
                 
     
      Для записи небольших фрагментов  Вашего  приложения  в
 PARADOX  можно  использовать  возможности  Instant Script .
 Затем можно  использовать  Script  Editor  для  объединения
 новых  программ  в  библиотеку  процедур.  Вы  можете легко
 интегрировать  целое  приложение   путем   помещения   всех
 процедур   в   одну   или  несколько  библиотек.  Т.к.  они
 расположены в оперативной памяти,  процедуры  и  библиотеки
 процедур  могут составить основу мощных прикладных средств,
 которые  могут  применяться  в  различных   местах   одного
 приложения   и   могут   быть   легко   восстановлены   для
 использования в других приложениях.


                           - 99 -
     
           Использование PARADOXa  для создания запроса
     
      Очень полезным специальным  случаем  записи  программы
 является  утверждение запроса, сохраняемое в программе. Это
 можно сделать с помощью выбора Scripts/QuerySave в PARADOX.
      Сохраняемые  утверждения  запроса  являются   простыми
 примерами моделирующих возможностей PAL и PARADOX.
      После того как вы создали таблицы, необходимые в вашем
 приложении,  вы можете загрузить их с небольшим количеством
 выбранных данных и начать создание запросов.
      Используя PARADOX для интерактивной работы,  сохраните
 запрос в скрипт, используя Script/QuerySave. Затем спомощью
 Editor объедините сохраненные скрипты приложение. Вы можете
 "параметризовать"  утверждение  запроса объединением тильда
 переменных или с помощью Script Editor.
 
              Создание запросов и отчетов в  PARADOX
     
     Используйте Paradox Form Mode и Report  Generator,  для
 разработки   форм  и  отчетов,  необходимых  для  I/O.  При
 разработке приложения Вы можете не  беспокоится  о  внешнем
 виде   форм  и  отчетов  потому,  что  у  Вас  всегда  есть
 возможность  возвратиться  для   применения   и   улучшения
 спецификации форм или отчетов.
     
                    Использование Pal Debuger
                      для отладки приложения
            
     PAL  Debuger  является  бесценным средством для отладки
 приложения /см. следующий раздел/. Debug является полностью
 интегрированной с PAL/PARADOX  средой  и  позволяет  быстро
 отлавливать ошибки в программах и решать другие проблемы.
     
                Настройка приложения
                Оптимизация кода и процедурализация
     


                           - 100 -
     Как только все компоненты приложения начинают работать,
 можно приступить к более точной настройке:
     -обратить   внимание,   на   какие  запросы  приложения
 тратится много времени и  использовать  команду  INDEX  для
 вторичной индексации таблиц;
     -просмотреть все формы и отчеты для того, чтобы сделать
 их   более   привлекательныим   и  более  читабельными  для
 пользователя;
     -найти  те  места  в  программе,  где  вы  использовали
 последовательность   записей   нажатий  клавиш,  как  часть
 процесса создания приложения. Вы можете исключить некоторые
 из  этих  последовательностей,  заменив   их   на   команды
 сокращенного меню. Это сделает скрипт более читаемым;
     -Записать   некоторые   части  скрипта  в  процедуры  -
 "процедурализация".  Используя  преимущественно  библиотеки
 процедур,  можно сделать скрипт более быстрым. Однако, есть
 несколько компромиссов в  использовании  процедур,  которые
 обсуждаются в следующем разделе этой части;
     -установить защиту паролем  Вашего  скрипта  и  таблиц,
 связанных с ним.
     Мы  уверены,  что  используя  этот  метод  или похожий,
 который  вы  используете  в  вашем  стиле  работы,  помогут
 использовать  PAL  для  построения  удобных  и  эффективных
 приложений. Экспериментируйте с PARADOXом  и  выясните  все
 его возможности. Изучайте новые пути решения проблем.
                                               
     
      ВРЕМЯ И МЕСТО КОМПРОМИССОВ В  ИСПОЛЬЗОВАНИИ ПРОЦЕДУР
      ____________________________________________________
     
     Процедуры  PALa  дают Вам инструмент для структуризации
 выших скриптов в модульные  компоненты  и  для  обеспечения
 бестрого  их выполнения. Процедура - это законченный скрипт
 у которого, последовательность команд  связана  в  файл.  С
 помощью  процедур  можно возвращать параметры (использовать
 команду Return) и использовать эту возможность, как одну из
 встроенных функций PALa.


                           - 101 -
     Когда Вы работаете со сценарием,  PAL  -  интерпретатор
 считывает   скрипт.   Во   время   считывания  команды  она
 синтаксически   преобразуется   во   внутреннюю   форму   и
 выполняется.
 
     Поскольку    команды    считываются    и    выполняются
 последовательно,   то   очень   небольшая   часть   скрипта
 загружается  в  память  за  один  раз.  Преимущество такого
 подхода заключается в том, что размер скрипта не  ограничен
 объемом  памяти  и компромисс заключается в том, что время,
 необходимое для чтения  скрипта  заменяется  скоростью  его
 исполнения.
     В  отличие  от  скриптов, процедуры находятся в памяти.
 При  вызове  процедуры  она  помещается   в   память.   Она
 выполняется быстро, независимо от того сколько команд в ней
 содержится.
     Если  приложения большие, то для загрузки всех процедур
 может не хватить  места  в  памяти.  В  этом  случае  можно
 создать  одну  или несколько библиотек процедур. Библиотеки
 позволяют быстро загрузить и выполнить процедуры. Используя
 команды  "Readlib"  и  "Release  crocs",  можно  подключать
 процедуры  по мере необходимости с небольшой задержкой в их
 выполнении.  Приложение  может  быть   организовано   таким
 образом, что загрузка процедур в память и очищение ее будет
 полностью обрабатываться автоматически PALом.
     Вы   можете,  например,  организовать  алгоритм  вашего
 приложения как цикл WHILE, тело которого  содержит  команду
 RELEASE  PROCS  ALL,  команду  SHOWMENU  и  команду SWITCH.
 Каждый раз, проходя через цикл команда  RELEASE  PROCS  ALL
 удаляет из памяти все процедуры. Затем SHOWMENU высвечивает
 на  дисплее  главное  меню  приложения.  Когда пользователь
 делает выбор, выполняется одна из ветвей SWITCH, каждая  из
 которых  состоит  из  команды  READLIB,  которая  загружает
 процедуруры, исполняемые в этой ветви.
     Конечно, если скорость исполнения не является решающей,
 то Вы можете вообще не  использовать  процедуры.  Поскольку
 скрипт  располагаем  на  диске,  Вы  можете запустить очень


                           - 102 -
 большой скрипт, не беспокоясь о недостатке места в памяти.
     Необходимо   соблюдать   осторажность    в    отношении
 следующего  аспекта  использования  процедур.  Когда скрипт
 завершается, все процедуры, определенные в нем удаляются из
 памяти,  в  отличие  от  переменных  и   массивов,   котрые
 сохраняются  во  время  всего  сеанса  работы  с PARADOXом.
 Поэтому  Вы  не  можете  создать  макроклавиатуру,  которая
 просто вызывает процедуру.
     Рассмотрим   процедуру  colstat,  определенную  ниже  в
 скрипте.  Эта  процедура  вызывает  на  дисплей  сообщение,
 показывающее сумму и среднее значение поля текущей таблицы.
 Команда  SETKEY  появляется  ниже  определения  процедуры и
 обеспечивает  вызов  colstat   всякий   раз   при   нажатии
 [Shift][F11].
     PROC colstat ()
          X = csum(table(),field())
          Y = caverage(table(),field())
          MESSAGE "The sum of the column is ",X,
                   "the caverage is ",Y
          SLEEP 2000
     ENDPROC
     SETKEY "F11" colstat()
     Этот скрипт не будет работать, т.к. когда проигрывается
 скрипт, то процедура colstat загружается в память и клавиша
 [F1]  прикрепляется  к  вызову  процедуры. Когда выполнение
 скрипта заканчивается, то colstat и  все  другие  процедуры
 немедленно стираются из памяти. Если вы теперь нажмете F11,
 то  будет зарегистрирована ошибка, т.к. colstat оказывается
 неопределенной. Эта проблема  решается  следующим  образом.
 Команда  setkey  должна  содержать  не процедуру, а скрипт,
 т.е. setkey  play,  котрый  загружает  процедуру,  а  затем
 вызывает ее:


                           - 103 -
     PROC colstat ()
          X = csum(table(),field())
          Y = caverage(table(),field())
          MESSAGE "The sum of the column is ",X,
                   "the caverage is ",Y
          SLEEP 2000
     ENDPROC
     colstat()
     SETKEY "F11" play colstat()
     
.

                           - 104 -
     
                                              Г Л А В А  8
 ___________________________________________________________

          О Т Л А Д Ч И К   С К Р И П Т О В  (Debugger)
 ___________________________________________________________
                          
     
     Это мощный инструмент можно использовать для проверки и
 обнаружения  ошибок.  Debugger - важный компонент окружения
 PAL/Paradox. В предыдущих главах  вам  представили  идею  о
 том,  что  PAL  -  автоматизированный пользователь Paradox,
 которого можно инструктировать и  контролировать.  Debugger
 дает  возможность  контроля над PAL и Paradox. Он позволяет
 интерактивно выполнять скрипт покомандно и видеть результат
 каждого шага.
     Эта глава знакомит Вас с Debuggerом и объясняет  основы
 отладки скриптов.
     Debugger позволяет закончить выполнение скрипта в любой
 точке  для  контроля  состояния  PAL  или Paradox. Вы также
 можете :
     - интерактивно вычислять выражения;
     -  контролировать   текущее   значения   переменных   и
 элементов массивов;
     - сохранять текущие значения переменных  и  массивов  в
 файл;
     - выполнять команды в течении выполнения скрипта;
     - определить положение внутри вложенных уровней скрипта
 и выполняемых процедур;
     -  возвратиться  из  многоуровневого  скрипта  в  любую
 точку.
     
     


                           - 105 -
                     D E B U G   M O D E
                     ___________________
     
                         ВХОД В Debugger
     
     Вы можете войти в Debugger четырьмя способами:
     1. PAL автоматически вводит Вас в Debugger,  когда  при
 выполнении     скрипта     регистрируется    ошибка.    Вам
 предоставляется меню из двух  пунктов:  Cancel  или  Debug.
 Выбирая  Cancel,  Вы  заканчиваете  работу скрипта. Выбирая
 Debug, Вы войдете в отладчик.
     2. Если вы находитесь в Paradox, то вызовите PAL меню с
 помощью [Alt][F10] и выберите из него Debug. Затем  введите
 имя  скрипта,  который  хотите  отладить,  и  вы немедленно
 окажетесь в отладчике.
     3. Вы можете поместить  команду  Debug  в  любую  точку
 скрипта.  Это позволит входить в отладчик всякий раз, когда
 скрипт доходит до этого места.
     4.  Вы  можете  вмешаться  в  работу  скрипта  нажатием
 [Ctrl][Break],  затем  выберать  Debug  из  представленного
 меню.
                       ЭКРАН  Debugger
     
     Debugger  использует  две  нижние  строки  экрана   для
 высвечивания    информации    о   состоянии   отладчика   и
 демонстрации кода скрипта,  который  отлаживается.  Наличие
 этих двух строк определяет ваше нахождение в отладчике.
 ___________________________________________________________
     
 *View Ask Report Create Modify Image Forms Tools Scripts Help Exit
  View a table.
 ___________________________________________________________
                                  Сообщение об ошибке
    Status line                     /           \
     /        \            Cannot continue from syntax error.
 Script: main  Line:  3             Type [Ctrl][Q] to Quit
 CLEAR >> foo       ; clears the canvas
       /                   \
   Debugger cursor       Script line
 ___________________________________________________________


                           - 106 -
     
     
     Вторая  строка  снизу  называется Debugger Status Line.
 Она  показывает  имя  скрипта,  отлаживаемого  в  настоящее
 время,   и   номер   отлаживаемой  строки.  Вторая  строка,
 называемая Script Line, показывает текущую строку  скрипта.
 Курсор  Debugger  (стрелка)  указывает  на команду скрипта,
 которая  была  в  процессе  выполнения,  когда  был  вызван
 Debugger.
     В  Debugger сообщение об ошибке выдается в правой части
 экрана на третьей строке снизу.
     
                         ТИПЫ ОШИБОК
     
     В процессе выполнения скрипта могут выявиться ошибки  2
 типов  - синтаксические и ошибки выполнения. Синтаксические
 ошибки появляются  в  результате  неправильного  оформления
 команд, когда PAL не может их распознать. Ошибки выполнения
 появляются,  когда  синтаксис  команды  правилен, но она не
 может быть выполнена.
     Например, команда
                       Vew "orders"
 выдаст  синтаксическую ошибку, т.к.  не  правильная  запись
 "Vew" не распознается.
     С другой стороны, 2 команды:
                       View "orders"
                  [Part No] = [Part No] * 1.6
 даст  ошибку,  т.к. рабочая область должна быть в состоянии
 Edit для такого присваивания значений образам полей.
     Ошибки выполнения отличаются от синтаксических тем, что
 они могут быть временно "отремонтированы" внутри  Debugger.
 Например,  если  вы  вошли  в  Debugger в результате ошибки
 прогона вы можете решить  эту  проблему  нажатием  Edit,  а
 затем продолжить выполнение скрипта нажатием [Ctrl][G], как
 описано  в  следующей  главе. Конечно, это только временно.


                           - 107 -
 Если вы не можете сделать  необходимые  изменения  в  файле
 скрипта   сами,   ошибка   появится   снова,   когда  будет
 выполняться скрипт.
     В  случае  синтаксической  ошибки  ничего  не  остается
 делать,   как  оставить  Debugger  и  отредактировать  файл
 скрипта.
 
     
       Отладка скриптов, содержащих процедуры из библиотек
     
     Как  указано  в  главе  6,  для  отлаживания   скрипта,
 содержащего  процедуры из библиотеки, текст процедур должен
 быть представлен в файле и директории, в котором  процедура
 была  первоначально  определена, и считан в библиотеку. Это
 так, потому что  в  порядке  определения  процедуры,  когда
 процедура  хранится  в библиотеке, она хранится с полностью
 идентифицированным именем носителя и директория, в  котором
 процедура  была  первоначально  найдена.  В  течение сеанса
 отладки   полностью   идентифицированное   имя    процедуры
 захватывается  к  Debuggerом. Таким образом, если процедура
 не  представлена   своим   первоначальным   директорием   и
 драйвером, она не может быть захвачена Debuggerом.
     
     
      У П Р А В Л Я Ю Щ И Е  К Л А В И Ш И  И  М Е Н Ю
     _________________________________________________
     
     Когда Вы находитесь в Debugger, можно управлять Paradox
 с  клавиатуры  естественным  способом.  Например, вы можете
 передвигаться в рабочей  области,  делать  выбор  меню  или
 запускать скрипты.(Однако, вы не можете сохранять скрипты.)
     Вдобавок  к  тому, что можно делать в Paradox, Debugger
 обеспечивает некоторые специальные отладочные функции.  Это
 достигается  как  путем  выбора  из  Debugger-меню,  так  и
 нажатием   специальных    управляющих    клавиш,    которые
 эквивалентны   некоторым   выборкам   меню.   Вы  получаете
 Debugger-меню путем нажатия [Alt][F10]. Следующий  параграф
 описывает   доступные  выборы  меню  и  соответствующие  им
 последовательности управляющих клавиш.


                           - 108 -
                                             
     
                          ВЕЛИЧИНА (Value)
     
     Этот выбор позволяет вам вычислить любое выражение.  Он
 эквивалентен  выбору  Value  из PAL-меню. (См. главу 4 "PAL
 меню".) Value может быть очень полезен  во  время  отладки,
 т.к.  он  позволяет  вам быстро определить текущее значение
 любого выражения или элемента массива. Если вызов процедуры
 активен в отладочном смысле, вы можете запрашивать значения
 ее формальных параметров и локальных переменных.
     Как объяснялось в главе  4,  выражения,  вычисленные  с
 помощью   Value,   ограничены  до  50  символов.  Результат
 высвечивается на экране в окне сообщений  в  нижнем  правом
 углу экрана.
     Выбор   Value   из  меню  работает  с  помощью  запуска
 специального  однокомандного  скрипта,  называемого  value,
 который имеет форму:
              Return 
     Здесь    -  выражение,  чье значение должно
 быть подсчитано.  Действие  RETURN  заключается  в  простом
 определении   скрипта   и   выводе   на   дисплей  значения
  в окне сообщений.(См. описание RETURN в  главе
 9).
     Использование Value само может выдать ошибку. Например,
 если  вас интересует значение выражения m + 3, и переменная
 m не определена, то появится ошибка. Ошибка также  появится
 и при неправильном синтаксисе. В обоих случаях вы окажетесь
 в  отладчике.(В  этом случае вам сообщат, что вы находитесь
 на  "нижнем  отладочном   уровне".)   Status   line   будет
 называться  value,  как  и  скрипт,  который в данное время
 отлаживается, Script  line  будет  показывать  неправильное
 выражение.  В  этом  месте  вы  можете  сменить  отладочный
 уровень нажатием [Ctrl][P]. Вы вернетесь  туда,  где  перед
 этим находились.


                           - 109 -
     Некоторые  примеры  выражений  Value, которые вы можете
 использовать в сеансе отладки:
     
     -  x                   - просмотр текущего значения пе-
                              ременной x;
     - nkeyfields(table())  - определение номера поля  ключа
                              текущей  таблицы в рабочей об-
                              ласти;
     - time()               - определение  времени  перерыва
                              для ужина.
         
     
                           ШАГ (Step)
            
     Этот  выбор  из Debugger-меню (или [Ctrl][S]) позволяет
 вам выполнять скрипт, который вы  отлаживаете,  покомандно.
 Step   выполняет   команды   скрипта,  помещенные  курсором
 Debugger на  Script  line  отладочного  окна  и  перемещает
 курсор  к следующей команде, которая должна быть выполнена.
 Как это более полно описано  ниже,  это  свойство  особенно
 полезно  для  текущего контроля выполнения каждой команды в
 рабочей области Paradox и PAL.
     Если  вы  вошли  в   Debugger   в   результате   ошибки
 выполнения,  то  командой,  которая  выполняется  в  момент
 выбора Step, будет команда, которая породила  ошибку.  Если
 вы   сразу  не  исправили  причину,  вызвавшую  ошибку,  то
 наиболее вероятно, что она появится снова, и Step не  будет
 иметь нужного эффекта. Step не может быть использован, если
 вы  попали  в  Debugger из-за синтаксической ошибки. В этом
 случае вам нужно войти в Script Editor (см. "Editor" ниже),
 исправить ошибку и начать все сначала.
     Заметим, что  если  вы  в  Step,  то  есть  возможность
 наблюдать  действия  команд,  которые  делают  изменения  в
 рабочей области Paradox или работатает с канвой I/O. Другие
 команды, такие как  присваивание  значений  переменным,  не
 производят   другого   явного  эффекта,  кроме  перемещения
 курсора Debugger. Если вы  "шагаете"  по  скрипту,  который


                           - 110 -
 использует  определение процедуры, то все, что вы увидите в
 момент,  когда  процедура  определена   -   это   заголовок
 процедуры.  Когда  процедура  вызывается  и исполняется, вы
 можете "шагать" покомандно сквозь ее тело. Если вы  шагаете
 сквозь  команду  EXECUTE,  следующей  командой будет первая
 команда скрипта execute.
              
     
                   СЛЕДУЮЩИЙ (Next [Ctrl][N])
     
     Этот выбор  или  нажатие  [Ctrl][N]  вызывает  Debugger
 курсор для того, чтобы переместить его к следующей команде,
 что  позволяет  пропустить  выполнение текущей команды. Это
 полезно, когда  вы  хотите  пропустить  команду,  вызвавшую
 ошибку выполнения.
     
     
                       ИДТИ (Go [Ctrl][G])
     
     Этот   выбор   или   нажатие  [Ctrl][G]  позволяет  вам
 возобновить работу скрипта, начиная с  команды,  помеченной
 Debugger курсором.
     Как  и  в  предыдущих случаях, ее нельзя использовать в
 случае синтаксической ошибки. Более того, если вы  вошли  в
 Debugger  из-за  ошибки выполнения, следует сначала удалить
 причину ошибки, и ошибка будет немедленно  регистрироваться
 повторно.  Конечно,  если  скрипт имеет более одной ошибки,
 другая ошибка может появиться при возобновлении  выполнения
 скрипта.
     Если   при   нажатии  GO  Вы  находитесь  во  вложенных
 отладочных контекстах , вы закончите выполнение в следующем
 высшем отладочном уровне, где завершается текущий скрипт.
     
     


                           - 111 -
                           
                     МИНИСКРИПТ (MiniScript)
     
     MiniScript   позволяет   составлять   и    использовать
 маленький  скрипт  (длинной  до  50  символов).  Эта услуга
 работает подобно услугам PAL меню. (См. главу  4.)  Главное
 отличие  заключается  в том, что мини-скрипт не выполняется
 немедленно при нажатии клавиши  [ENTER].  Вместо  этого  он
 становится текущим отлаживаемым скриптом и высвечивается на
 экране  в  в нижней части экрана в окне Debugger. Вы можете
 выполнить его, "шагая" по командам (используя [Ctrl[S]) или
 выполняя полностью ([Ctrl][G]). Любой путь вернет вас в  то
 место, где вы находились в первоначальном скрипте.
     MiniScript     особенно    полезен    для    временного
 "закрепления",  когда  вы  входите  в  Debugger  по  ошибке
 выполнения.  Например,  если  Вы пренебрегли инициализацией
 переменных перед  их  использованием  в  выражении,  ошибка
 выполнения   будет  зарегестрирована  во  время  вычисления
 выражения. Если вы затем  войдете  в  Debugger,  вы  можете
 выбрать  MiniScript  для присваивания значений переменным и
 нажать Go для продолжения выполнения скрипта.
     Заметим, что если переменная имеет локальное значение в
 текущем отлаживаемом контексте, то при  любом  обращении  к
 этой  переменной  в вашем мини-скрипте будет приниматься во
 внимание частное значение. (См. описание частных переменных
 в главе 6).
     Как и в случае  с  Value,  если  встречается  ошибка  в
 процессе  выполнения мини-скрипта, вы можете заново войти в
 Debugger  на  один  уровень  ниже  первоначального   уровня
 отладки.  Вы можете "прыгнуть" в предыдущий контекст в этой
 точке с помощью нажатия [Ctrl][P].
                     
                     ГДЕ (Where? [Ctrl][W])
     
     Этот  выбор  или  нажатие  [Ctrl][W]  позволяет  видеть
 вложенность  скриптов,  процедур  и  отлаживаемых уровней в


                           - 112 -
 текущем  контексте.  Предположим,  например,   что   скрипт
 начинается  с выполнением скрипта A, который затем вызывает
 процедуру B, которая в свою очередь вызывает  скрипт  С,  в
 котором   затем  была  зарегистрирована  ошибка.  Когда  Вы
 нажмете Where?, Вы увидите  порядок  вложенности  скриптов,
 процедур и вызывов Debugger в графической форме.
     Если  ваше  приложение  имеет вложенные уровни скриптов
 или   вызывов   процедур,   услуга   Where?   полезна   при
 отслеживании  ошибок.  На  следующем рисунке показан пример
 изображения Where? с несколькими уровнями работ скрипта:
     
 ___________________________________________________________
     
 Script a                                     ->  Уровень А
 ___________________________________________________________
   
   Proc b(x)                                  ->  Уровень В
   x = 4
 ___________________________________________________________
     
     Script с                                 ->  Уровень С
 ___________________________________________________________
     
       **Debugger** [Run Error]
     
         (You are here)
     
     
     
     
                                Press any key to continue...
     
 Script: c   Line: 1             Type [Ctrl][Q] to Quit
 x = "hi" + >> 1
     
 ___________________________________________________________
     


                           - 113 -
     
     Where?    также    полезна,     когда     вы     имеете
 зарегистрированную "ошибку в ошибке" и не полностью уверены
 в текущем отладочном уровне.
     Заметим,  что  для  уровней  процедур Where? показывает
 значение всех формальных параметров и локальных переменных,
 определенных в этой процедуре.
     Если  Вы  находитесь  на   достаточно   низком   уровне
 выполняемого  скрипта, то изображение всех уровней может не
 поместиться на одном  экране.  В  этом  случае  вы  увидите
 приглашение  о  том,  чтобы  нажать любую клавишу для того,
 чтобы увидеть продолжение. Вы  должны  стереть  все  экраны
 Where?  перед  тем,  как  продолжить  или  прекратить сеанс
 отладки.
     
                     ВЫХОД (Quit [Ctrl][Q])
     
     Эта услуга служит для завершения отладки  и  выхода  со
 всех   уровней   выполнения   скрипта.   Когда   происходит
 завершение  работы  скрипта  верхнего  уровня,  выбор  Quit
 заставляет   PAL   сбрасывать   все  определения  процедур.
 Значения   же,   присвоенные   переменным    и    массивам,
 сохраняются.
     
                 ВЕРХНИЙ УРОВЕНЬ (Pop [Ctrl][P])
     
     Этот  выбор вызывает отказ от работы текущего скрипта и
 помещает вас в скрипт, который  его  вызвал.  Если  текущий
 скрипт  -  скрипт  верхнего  уровня,  то  Pор дает такой же
 эффект, что и Quit  -  все  работы  скриптов  и  отладчиков
 завершаются, и вы попадаете в Paradox.
     Выбор  Pор  полезен  для выхода из ошибки, которая была
 зарегистрирована,  когда   вы   работаете   с   Value   или
 MiniScript.  (Заметим,  что  как  Value,  так  и MiniScript
 работают, выполняя скрипт с одной  единственной  строчкой.)
 Если  вы находитесь в "ошибке внутри ошибки внутри ошибки",
 то каждое использование Pор поглощает один уровень.


                           - 114 -
                   
                   РЕДАКТОР (Editor [Ctrl][E])
                                      
     Этот выбор перемещает вас из Debugger  прямо  в  Script
 Editor.  Когда  вы  выбираете  Editor, отладка и выполнение
 скриптов  завершается,  и  становится   доступным   Editor.
 Скрипт,  который вы отладили, будет считан в Script Editor,
 и курсор редактора будет помещен в начало  строки  скрипта,
 видимой в окне отладчика, когда был вызван Script Editor.
     Когда  Вы завершили редактирование, Вы можете запустить
 скрипт, выбрав Go из меню редактора.
     
     
         И С П О Л Ь З О В А Н И Е   О Т Л А Д Ч И К А
         _____________________________________________
     
      При работе в отладчике вы имеете полный  контроль  над
 всей  средой  PAL/Paradox.  Вы  можете  немедленно  увидеть
 эффект каждой команды в рабочей области Paradox или в  PAL.
 Вы  можете также менять состояние PAL и Paradox всякий раз,
 когда это необходимо.
     Debugger применяется для  проверки  действий  различных
 команд.   Чтобы  продемонстрировать  их  работу,  следующий
 пример использует Debugger для прохода упрощенного варианта
 первых нескольких строк PAL Sample Application,  описанного
 в    части   4.   Пример   разработан   для   того,   чтобы
 продемонстрировать  действие  Debugger  и   облегчить   его
 использование   при   разработке   приложений.  Действуйте,
 руководствуясь примерами, приведенными ниже:
     >>  Если  ваша  система  размещена  на  жестком  диске,
 поместите  Paradox  Sample  Tables (дискету) в накопитель А
 вашего компьютера. Используя Paradox Tools/Copy, скопируйте
 скрипт  bugtest  c  диска  Sample  Tables  в  ваш   рабочий
 директорий Paradox. Назовите скопированный скрипт maintest.


                           - 115 -
     >>  Если  ваша  система  размещена  на 2 гибких дисках,
 поместите копию Paradox Sample Tables в  драйвер  В  вашего
 компьютера.  Убедитесь,  что  драйвер  В - текущий драйвер.
 Используйте  Paradox  Tools/Copy  для  копирования  скрипта
 bugtest  с  диска  Sample  Tables в новый скрипт, названный
 maintest.
     Смотрите рисунок, ниже представляющий  первые 35 строк
 скрипта maintest. Выполняя указания, приведенные ниже, за-
 пустите Paradox и убедитесь, что рабочая область чиста.
      1. Чтобы очистилась рабочая область PAR и  высветилось
 главно  меню,  нажмите  [Alt]  [F10]. Выберете DEBUG из Pal
 меню и введите имя "maintest" в качестве  скрипта,  который
 нужно   отладить.   Внимательно   исследуем  экран  в  этом
 состоянии. Вы увидите D STATUS LINE и SCRIPT LINE в  нижней
 части  экрана,  и  как  выглядит главное меню PAR в верхней
 части экрана. То, что Вы видите, есть  канва  PALa,  где  D
 накладывается  сверху.  Как  только Вы вызвали D,"maintest"
 начинает выполняться.  При  этом  канва  PALa  исчезает,  и
 высвечивается  главное меню PARADOXa.Курсор канвы находится
 в   своей   исходной   позиции   -   левом   верхнем   углу
 экрана.Заметим,  что  курсор  может никогда не занимать эту
 позицию (при выборе VIEW из меню)  вне  программ  PALa.  Вы
 можете совершать следующие действия:
      Вы  можете  начать  шагать  по  скрипту  "maintest" по
 одному шагу в единицу времени путем выбора STEP из  меню  D
 или нажимом [Ctrl] [S].
      Вы   можете  произвести  манипуляции  с  канвой  PALa,
 выбирая MINISCRIPT из  D-меню  и  выпуская  соответствующие
 команды.
      Вы   можете  манипулировать  рабочей  областью  PAR  с
 помощью услуг из главного меню.


                           - 116 -
 ___________________________________________________________
     
 1 ;MAINTEST.SC - PAL DEBUGGER EXERCISE
 2
 3 CLEAR               ;clears the canvas
 4 CLEARALL            ;clears all images off workspace
 5 @ 4,1               ;position the cursor on the canvas
 6 title  =  format("w80,ac","The  PAL  People  and Project
 7                   Accounting System")
 8 STYLE REVERSE
 9 ?title
 10 STYLE
 11 @7,1
 12 TEXT
 13        The PAL People and Project Accounting System   is
 14  designed to demonstrate how easy it is to use  PAL  and
 15  Paradox to meet almost  any  information  storage   and
 16  retrieval requirement. The System allows users to build
 17  tables of information about  people and  projects,  and
 18  then to link people together by making assignments.
 19        The System illustrates many basic concepts of PAL
 20  including the use of the SHOWMENU command to create the
 21  basic structure of an application.
 22
 23 ENDTEXT
 24
 25 WHILE (TRUE)
 26   CLEARALL         ;clears all images off workspace
 27   SHOWMENU         ;builds main menu
 28   "People":   "Add,  Change  or  Delete  records  in the
                   People table",
 29   "Projects": "Add,   Change  or  Delete  records in the
                   Projects table",
 30   "Assign":   "Assign people to projects",
 31   "What":     "List projects assigned to people",
 32   "Who":      "List people assigned to a project",
 33   "Reports":  "Print  a list  of  people,  projects,  or
                   timesheets by person",
 34   "Exit":     "Leave the application"
 35   TO choice
 ___________________________________________________________


                           - 117 -
         
      2. Давайте  начнем  шагать  по  скрипту  в  отладчике.
 Нажмите [Ctrl][S] для выполнения первой команды.
      Первой  командой в скрипте является команда CLEAR. Она
 очищает  канву  PAL.  Когда  вы  исполняете  эту   команду,
 начальная  картина  канвы  стирается,  и  вы  видите пустой
 экран, кроме курсора в верхнем левом углу, и окно отладчика
 внизу.
      Следующая  команда  в  скрипте  CLEARALL  эквивалентна
 нажатию  [Alt][F8]  в  Paradox. Она очищает главную рабочую
 область Paradox. Перед  исполнением  этой  команды  давайте
 наберем что-нибудь в рабочей области, чтобы посмотреть, как
 среда PAL/Paradox доступна в процессе сеанса отладки.
      3.  Нажмите  [->].  Это  действие  возможно  только  в
 рабочей области Paradox. Это нажатие передвинет  курсор  по
 меню вправо, в данном случае с View на Ask.
      В  данном  случае,  когда  вы нажали [->], канва канва
 станет  прозрачной,  и  вы  увидите   рабочую   область   с
 высвеченным  Ask.  Давайте  продолжим использование рабочей
 области.
      4. Нажмите [ENTER]. Теперь вам будет предложено ввести
 имя таблицы. Нажмите  [ENTER]  дважды  для  получения  форм
 запросов для таблицы Paradox (все равно какой).
     Теперь вы имеете форму запросов в рабочей области. Кан-
 ва  PAL прозрачна и окно отладчика перед вами.
      Как  мы  отмечаем прежде, следующая команда, ожидающая
 выполнения в скрипт, - это  CLEARALL.  Давайте  перепрыгнем
 через  нее для того, чтобы форма запроса, которую мы только
 что получили, осталась в рабочей области.
      5. Нажмите [CTRL][N]. Это вызовет прыжок через текущую
 команду  без  ее   выполнения.   Tеперь   курсор   Debugger
 показывает  на строку @4,1. Эта команда требует передвинуть
 курсор к 4-ой строке, 1-ому столбцу. Для показа вам  этого,
 свет позади канвы выключается и картина на канве становится
 видимой. Этого не произойдет, если вы выполните команду.


                           - 118 -
      6.Нажмите   [CTRL][S]  для  выполнения  команды  @4,1.
 Заметим, что экран очистится, остается только курсор канвы,
 который теперь располагается в позиции 4,1. Важно отметить,
 что когда канва появляется снова,  в  этот  момент  она  не
 начинается  из  снова из сцены, находящей в рабочей области
 PARADOXa.  Это  поисходит  потому,  что  Debugger  пытается
 показать   вам,  какое  действие  произойдет,  если  скрипт
 выполнится правильно. Если мы не были в Debugger,  и  формы
 запроса  были  помещены  в  рабочую область под управлением
 скрипта,  рабочая  область  никогда   не   будет   видимой.
 Следовательно,  канва  не  будет изображать форму запроса в
 этой точке.
      Рассмотрим еще  несколько  шагов,  чтобы  вы  получили
 более   четкое  понятие  о  взаимодействии  канвы,  рабочей
 области и Debugger.
      7. Нажмите [CTRL][S] еще три раза.  Начнет  появляться
 открытый заголовок страницы SAMPLE APPLICATION.
      Теперь  нажмите  [->].  Канва  станет  прозрачной и вы
 снова увидите рабочую область PARADOXa с формами  запросов.
 С  другой  стороны,  клавиши  стрелки  работают  с  рабочей
 областью и не оказывают никакого действия на канве. Т.к. мы
 поместили в рабочую область формы запроса, нажатие  стрелки
 заставляют  PARADOX  двигаться  на одно поле вправо в форме
 запроса.
      8. Продолжаем шагать  по  скрипту,  нажимая  [CTRL][S]
 более  4-х  раз. Теперь Мы попали на вершину цикла, который
 содержит главное меню.  Нажмите  [CTRL][S]  еще  два  раза.
 Последняя   выполненная  команда  очищает  рабочую  область
 PARADOXa и вы видите, как форма запроса исчезает из рабочей
 области.
      9.  Следующая  команда  SHOWMENU.  Еще   раз   нажмите
 [CTRL][S] и меню приложения появится на канве.
      Если  теперь  вы попытаетесь нажать еще раз [CTRL][S],
 то обнаружите, что  не  можете  перейти  в  Debugger,  т.к.
 команда  SHOWMENU теперь получила управление и ожидает, что
 вы сделаете  выбор  меню  для  завершения  выполнения  этой
 команды.
     10.  Прежде,  чем  продолжить  дальше,  давайте  введем
 незначительную ошибку в скрипт и посмотрим, что произойдет.


                           - 119 -
 Нажмем [CTRL][Е], чтобы перейти из Debugger в Script  Edit.
 Сеанс  отладки  завершится  и  Вы увидите скрипт maintest в
 Edit. Курсор находится в начале строки, которую  мы  только
 что остановили в Debugger-первая строка структуры SHOWMENU.
 Нажмите   [CTRL][V],  чтобы  вызвать  на  дисплей  Editor`s
 Vertical Ruler. Используйте [стрелка вверх] для продвижения
 к 25 строке. Теперь продвинте курсор в  начало  утверждения
 (TRUE),  следующая  за  WHILE  на  этой строке. Используйте
 клавишу [Del] для  уничтожения  выражения  (TRUE).  Нажмите
 DO_IT! [F2]. Скрипт с ошибкой будет сохранен, и вы попадете
 в PARADOX.
     11.    Теперь   давайте   выполним   скрипт.   Выберите
 SCRIPT/PLAY  из  меню.  Когда  Вас  спросят  имя,  наберите
 maintest.   На   экране  появится  титульный  экран.  Почти
 одновременно  выполнение  скрипта  прекратится,   и   экран
 Debugger наложится сверху титульного экрана.
      В  окне сообщений появится сообщение об ошибке "SYNTAX
 ERROR: не ожидается ключевое слово CLEARALL". PAL не  может
 найти  логической  связи  между  утверждением  WHILE  на 25
 CLEARALL. Синтаксически это не будет иметь смысла,  поэтому
 будет зарегистрирована ошибка.
     12.  Если  Вы  захотите исправить ошибку, выберите E из
 PAL-меню. Вы попадете в  SCRIPT  maintest  и  курсор  будет
 установлен  на  26 строке. Поместите выражение "TRUE" после
 WHILE и нажмите DO_IT! [F2]. Теперь скрипт  будет  работать
 правильно.
     Этот  пример демонстрирует мощность и гибкость, которую
 Debugger     обеспечивает     Вам,     когда     необходимо
 непосредственное взаимодействие в среде PARADOX/PAL.
                                                        


Яндекс цитирования