



                          ГЛАВА 12

                     Стандартные модули

     В Главе 11 ("Стандартные процедуры и функции)  описыва-
лись все встроенные процедуры и функции Турбо-Паскаля, кото-
рые могут вызываться без явного их указания  (каким,  напри-
мер,  является  стандартное  определение Паскаля). Используя
стандартные модули Турбо-Паскаля, вы сможете реализовать на-
ибольшие  возможности  программирования (более подробная ин-
формация содержится в Главе 16  "Процедуры и функции  Турбо-
Паскаля").
     Стандартные  модули не отличаются от тех модулей, кото-
рые вы  сами  можете писать.  Можно  использовать  следующие
стандартные модули:
     Сrt - позволяет использовать все возможности  дисплея и
клавиатуры персонального компьютера РС,  включая  управление
режимом экрана,  расширенные  коды  клавиатуры, цвет, окна и
звуковые сигналы;
     Dos - поддерживает различные функции ДОС, включая уста-
новку и получение текущего значения даты и времени, поиск по
каталогам файлов и выполнение программ;
     Graph3 - реализует  графику  версии  3.0 Турбо-Паскаля,
использующую относительные команды (TurtleGraphics);
     Overlay - реализует мощную подсистему управления  овер-
леями версии 5.0 Турбо-Паскаля (см. Главу 13 "Оверлеи").
     Рrinter - позволяет легко организовать доступ к устрой-
тству печати.
     System - библиотека  поддержки  Турбо-Паскаля (этот мо-
дуль може автоматически вызываться любым модулем программы).
     Тurво3 - обеспечивает  наиболее высокую степень совмес-
тимости с версией 3 Турбо-Паскаля.
     Graph - мощный  графический пакет с независимой от уст-
ройств графической поддержкой для графических адаптеров СGS,
ЕGА, VGА, НЕRС, ИБМ 3270 РС, МСGА и АТТ 6300.
     Чтобы использовать  стандартный  модуль, его имя доста-
точно включить в предложение  использования вашей программы.

                                - 2 -


Например:

   uses Dos,Crt,Graph;

     Обычно все стандартные  модули  находятся в  библиотеке
TURBO.ТРL,  которая  автоматически  загружается  при запуске
Турбо-Паскаля.  Для  экономии памяти вы можете удалить редко
используемые модули,  такие,  как  ТURВО3 и GRAPН3, из файла
ТURВО.ТРL с помощью утилиты ТРUМОVЕR.

              Зависимость стандартных модулей

     Оба модуля, предназначенных  для совместимости версий -
ТURВО3 и GRАРН3 - зависят от  средств,  доступных для модуля
Сrt. Поэтому при использовании данных  модулей нужно сначала
определить  модуль  Сrt  в  предложении  использования вашей
программы.  В Таблице 12.1 приводится список стандартных мо-
дулей.

                  Стандартные модули       Таблица 12.1
-------------------------------------------------------
       Модуль                    Задание в предложении
                                     использование
-------------------------------------------------------
      Сrt                            не требуется
      Dos                            не требуется
      Grарн                          не требуется
      Grарн3                            Сrt
      Overlay                        не требуется
      Printer                        не требуется
      System                         не требуется
      Тurво3                            Сrt
-------------------------------------------------------

     Мы намеренно не отметили в  таблице, что все модули ис-
пользуют блок Systем,  программы  динамической поддержки для
всех встроенных функций, таких, как файловый ввод-вывод, об-
работка строк,  операции  с плавающей запятой и динамическое

                                - 3 -


распределение  памяти. Модуль Systем автоматически использу-
ется  любым модулем или программой и его не требуется указы-
вать в предложении uses.
     Процедуры и функции, содержащиеся в модуле System, опи-
сываются в Главе 10 ("Ввод и вывод") и в Главе 11 ("Стандар-
тные процедуры и функции"). Имеется также ряд  предописанных
переменных, включая:

  const
    OvrCodeList : word = 0;  { список сегментов оверлейного
                               кода }
    OvrHeapSize : word = 0;  { начальный размер оверлейного
                               буфера }
    OvrDebugPtr : pointer = nil; { используется при отладке
                                оверлеев }
    OvrHeapOrg : word = 0;    { начало оверлейного буфера }
    OvrHeapPtr : word = 0;  { указатель оверлейного буфера }
    OvrHeapEnd : word = 0;    { конец оверлейного буфера }
    OvrLoadList : word = 0;  { список загруженных оверлеев }
    OvrDosHandle : word = 0;  { канал оверлеев ДОС }
    OvrEmsHandle : word = 0;  { канал оверлеев EMS }
    HeapOrg : pointer = nil;  { начало динамически рас-
                                пределяемой области }
    HeapPtr : pointer = nil;  { указатель динамически рас-
                                пределяемой области }
    FreePtr : pointer = nil;  { указатель на список свобод-
                                ных областей }
    FreeMin : word = 0; { минимальный размер списка свобод-
                                ных областей }
    HeapError : pointer = nil; { функция ошибки динамически
                                распределяемой области памя-
                                ти }
    ExitProc : pointer = nil;  { процедура выхода }
    ExitCode : integer = 0;    { код выхода }
    ErrorAddr : pointer = nil; { адрес ошибки времени выпол-
                                 нения }
    PrefixSeg : word = 0;      { префиксный сегмент програм-
                                 мы }

                                - 4 -


    StackLimit : word = 0;     { указатель на нижнюю границу
                                 стека }
    InOutRes : integer = 0;    { буфер результата операции
                                 ввода-вывода }
    RandSeed : longint = 0;    { случайное число (генериру-
                                 ется датчиком случайных
                                 чисел) }
    FileMode : byte = 2;       { режим открытия файла }
    Test8087 : byte = 0;       { результат проверки процес-
                                 сора 8087 }

  var
    Input: text;          { стандартный файл ввода }
    Output: text;         { стандартный файл вывода }
    SaveInt00: pointer;   { сохраненное прерывание $00 }
    SaveInt02: pointer;   { сохраненное прерывание $02 }
    SaveInt1B: pointer;   { сохраненное прерывание $1B }
    SaveInt23: pointer;   { сохраненное прерывание $23 }
    SaveInt24: pointer;   { сохраненное прерывание $24 }
    SaveInt34: pointer;   { сохраненное прерывание $34 }
    SaveInt35: pointer;   { сохраненное прерывание $35 }
    SaveInt36: pointer;   { сохраненное прерывание $36 }
    SaveInt37: pointer;   { сохраненное прерывание $37 }
    SaveInt38: pointer;   { сохраненное прерывание $38 }
    SaveInt39: pointer;   { сохраненное прерывание $39 }
    SaveInt3A: pointer;   { сохраненное прерывание $3A }
    SaveInt3B: pointer;   { сохраненное прерывание $3B }
    SaveInt3C: pointer;   { сохраненное прерывание $3C }
    SaveInt3D: pointer;   { сохраненное прерывание $3D }
    SaveInt3E: pointer;   { сохраненное прерывание $3E }
    SaveInt3F: pointer;   { сохраненное прерывание $3F }
    SaveInt75: pointer;   { сохраненное прерывание $75 }

     Модулем Overlay для  реализации  подсистемы  управления
оверлеями используются переменные: OvrCodeList, OvrHeapSize,
OvrDebugPtr, OvreHeapOrg, OvrHeapPtr,  OvrHeapEnd,  OvrLoad-
List, OvrDosHandle и OvrEmsHandle. Оверлейный буфер распола-
гается между сегментом стека  и  динамически  распределяемой

                                - 5 -


областью,  при этом OvrHeapOrg и OvrHeapEnd содержат началь-
ный и конечный адреса  сегмента.  Назначаемый  по  умолчанию
размер  оверлейного буфера соответствует размеру наибольшего
оверлея программы. Если программа не содержит  оверлеев,  то
размер  оверлейного буфера будет равен нулю. Размер оверлей-
ного буфера можно увеличить с помощью обращения к  программе
модуля  Overlay  OvrSetBuf.  В  этом  случае при перемещении
HeapOrg в более старшие адреса размер  динамической  области
будет соответственно уменьшаться.
     Подсистемой управления динамически распределяемой обла-
стью  памяти для реализации программ динамического распреде-
ления памяти Турбо-Паскаля используются переменные  HeapOrg,
HeapPtr, FreePtr, FreeMin и HeapError. Подсистема управления
динамически распределяемой  областью  памяти  описывается  в
Главе 15 ("Внутренняя организация Турбо-Паскаля").
     Для реализации процедур выхода используются  переменные
ExitProc, ErrorCode и ErrorAdr. Это также описывается в Гла-
ве 15.
     PrefixSeg представляет собой переменную длиной в слово,
содержащую  адрес префиксного сегмента программы (PSP), соз-
даваемого при  выполнении  программы  операционной  системой
ДОС. Полное описание PSP приведено в руководстве по операци-
онной системе ДОС.
     Переменная StackLimit содержит  смещение  анчала  стека
относительно  сегмента стека, что соответствует минимальному
допустимому значению регистра SP, после которого уже  возни-
кает ситуация переполнения стека. По умолчанию значение этой
переменной равно 0, но если программа компилируется с дирек-
тивами {$N+,$E+}, то эмулятор сопроцессора 8087 при отсутст-
вии в системе сопроцессора 8087 для резервирования  места  в
младших адресах сегмента стека будет устанавливать ее в зна-
чение 224.
     Переменная InOutRes используется встроенными программа-
ми  ввода-вывода  для  сохранения значения, возращаемого при
следующем обращении к фукнции IOResult.
     В RandSeed сохраняется начальное значение для  встроен-
ного генератора случайных чисел. Если присваивать этой пере-
менной определенное значение, то функция Random будет  гене-

                                - 6 -


рировать  заданную  последовательность  случайных чисел. Это
может оказаться  полезным в  задачах  кодирования  данных, а
также в статистике и моделировании.
     Переменная FileMode позволяет изменять режим доступа  к
открытым типизованным и нетипизованным файлам. Более подроб-
но это описано в Главе 10 ("Ввод и вывод").
     В переменной Test8087 сохраняется результат работы  ал-
горитмов  автоматическиго  распознавания  сопроцессора 8087,
которые начинают работать при запуске программы, скомпилиро-
ванной с директивой {$N+}. Более подробно это описано в Гла-
ве 14 ("Использование сопроцессора 8087").
     Input и Оutput - это  стандартные  файлы  ввода-вывода,
необходимые  в  каждой  реализации Паскаля. По умолчанию они
связываются со стандартными входными и выходными  файлами  в
Dos. Более подробно это описано в Главе 10 ("Ввод и вывод").
     Модуль System перехватывает некоторые векторы  прерыва-
ний.  Перед  инициализацией своих собственных программ обра-
ботки прерываний модуль Systем сохраняет  старые  векторы  с
помощью четырех переменных-указателей:

  SaveInt00,          { $00 }
  SaveInt02,          { $02 }
  SaveInt23,          { $23 }
  SaveInt75 : pointer { $75 }

     Отметим, что для отслеживания критических ошибок модуль
System  содержит  обработчик  прерывания INT 24. В программе
Турбо-Паскаля критическая ошибка  ДОС  обрабатывается  точно
также,  как любая другая ошибка ввода-вывода. При компиляции
с директивой {$I+} программа будет завершать работу с  ошиб-
кой  времени  выполнения, в состоянии {$I-} функция IOResult
будет возвращать ненулевое значение.
     Приведем пример небольшой программы, которая восстанав-
ливает  первоначальный вектор и, таким образом, первоначаль-
ную логику обработки критической ошибки:

 program Restore;
 uses Dos;

                                - 7 -


 begin
   SetIntVec($24, SaveInt24);
   ...
 end.

     Программа SwapVectors в модуле Dos меняет  местами  со-
держимое  переменных SaveIntXX и текущее содержимое векторов
прерываний. Процедуру SwapVectors  следует  вызывать  непос-
редственно  перед и непосредственно после обращения к проце-
дуре Exec. Этим обеспечивается, что процесс Exec не  исполь-
зует  никаких обработчиков прерываний, установленных текущим
процессом (и нооборот). Более подробная информация приведена
в  Главе 16 ("Краткий справочник по Турбо-Паскалю") в описа-
нии SwapVactors.

                        Модуль Рrinter

     Модуль Рrinter - это очень  небольшой модуль, созданный
для облегчения использования в программе устройства  печати.
Модуль Рrinter описывает текстовый файл с именем Lst  и свя-
зывает его с устройством Lpt1.  Использование модуля Рrinter
избавляет вас от необходимости  описания, присваивания, отк-
рытия и закрытия текстовых файлов.  Приведем пример небольшой
программы, в которой используется модуль Рrinter:

  program HelloPrinter;
  uses Printer;
  begin
    Writeln(Lst,'Hello printer...');
  end.

                         Модуль Dоs

     С помощью модуля  Dos  реализуется  целый  ряд программ
операционной системы и программ обработки файлов. Ни одна из
программ модуля Dos не определена в стандартном Паскале, по-
этому они помещаются в отдельный модуль.
     Более полное описание операций ДОС приведено в руковод-

                                - 8 -


ствах по ДОС фирмы IBM.

                Константы, типы и переменные

     В данном разделе  кратко  обсуждаются константы, типы и
переменные, определяемые в модуле  Dos.  Более детальная ин-
формация содержится в  описании  процедур и функций, которые
зависят  от  этих  объектов, в Главе 16  ("Процедуры и функ-
ции Турбо-Паскаля).

                      Константы флагов

     После обращения к процедурам Inrt или МsDos для провер-
ки отдельных битов в регистре флагов  используются следующие
константы:

  const
    FCarry             = $0001
    FParity            = $0004
    FAuxilliary        = $0010
    FZero              = $0040
    FSign              = $0080
    FOverflow          = $0800

     Например, если  Р является записью, содержащей регистр,
то проверки:

  R.Flags and FCarry <> 0
  R.Flags and FZero = 0

принимают значение  Тruе,  когда, соответственно, установлен
флаг переноса (Carry) и сброшен флаг Zero.

                   Константы режима файла

     Эти константы используются в  процедурах обработки фай-
лов при открытии и  закрытии файлов  на  диске.  Поля режима
файловых переменных  Турбо-Паскаля будут  содержать  одно из

                                - 9 -


приведенных ниже значений:

  const
    fmClosed   = $D780
    fmInput    = $D781
    fmOutput   = $D782
    fmInOut    = $D783

                         Тип FileRec

     Определения записей, использующиеся в Турбо-Паскале для
внутренних  целей,  описываются  также  в  модуле  Dos.  Тип
FilеRес используется как для типизованных, так и для нетипи-
зованных файлов, в то время, как ТехtRес  представляет собой
внутренний формат переменной текстового типа.

  type
    { Типизованные и нетипизованные файлы }
    FileRec = record
                Handle: Word;
                Mode: Word;
                RecSize: Word;
                Private: array[1..26] of Byte;
                UserData: array[1..16] of Byte;
                Name: array[0..79] of Char;
              end;
    { запись Textfile }
    TextBuf = array[0..127] of Char;
    TextRec = record
               Handle: Word;
               Mode: Word;
               BufSize: Word;
               Private: Word;
               BufPos: Word;
               BufPtr: ^TextBuf;
               OpenProc: Pointer;
               InOutProc: Pointer;
               FlushProc: Pointer;

                                - 10 -


               CloseProc: Pointer;
               UserData: array[1..16] of Byte;
               Name: array[0..79] of Char;
               Buffer: TextBuf;
             end;

                  Константы атрибута файла

     Эти константы используются  для  проверки,  установки и
очистки  битов  атрибута  файлов  при использовании процедур
GetFAttr, SetFAttr, FindFirst и FindNext:

  const
    ReadOnly   = $01;  { доступ только по чтению }
    Hidden     = $02;  { "скрытый" файл }
    SysFile    = $04;  { системный файл }
    VolumeID   = $08;  { метка тома }
    Directory  = $10;  { каталог }
    Achive     = $20;  { признак архивизации }
    AnyFile    = $3F;  { прочий файл }

     Эти константы являются аддитивными, то есть оператор

  FindFirst('*.*',ReadOnly + Directory, S);

приведет к поиску  всех обычных файлов, а также файлов, дос-
тупных только по чтению, в текущем каталоге файлов. Констан-
та АnyFilе - это просто сумма всех атрибутов.

                 Регистровый тип (Registers)

     Переменные  регистрового  типа применяются в процедурах
Intr и  МsDos  для  задания  содержимого входного регистра и
проверки содержимого выходного регистра при прерываниях, ис-
пользующихся в программном обеспечении.

  type
    Registers = record

                                - 11 -


                 case integer of
                  0: (AX,BX,CX,DX,BP,SI,DS,ES,Flags: word);
                  1: (AL,AH,BL,BH,CL,CH,L,DH: byte);
                 end;

     Обратите внимание на использование  оператора  варианта
для того, чтобы отметить запись из  восьмибитовых регистров,
находящихся в начале шестнадцатибитовой записи.

                Тип даты и времени (DateTime)

     Переменные типа DateTiме  (даты и времени) используются
в процедурах  UnраскТiме и  РаскТiме для анализа, упаковки и
построения  четырехбайтового  значения,  содержащего  дату и
время. Это четырехбайтовое  значение  используется  затем  в
процедурах GetFTiме, SetTiме, FindFirst и FindNехt.

  type
    DateTime = record
                 Year,Month,Day,Hour,Min,Sec: integer;
               end;

     Допустимыми  диапазонами  являются: для переменной Year
(год) - с 1980 по 2099,  для  переменной Моnth (месяц) - с 1
по 12, для переменной Dау (день) - с 1 по 31, для переменной
Ноur (час) - от 0 до 23,  для переменной Мin (минута) - от 0
до 59, для переменной Sес (секунда) - от 0 до 59.

                        Тип SearchRec

     Переменные типа  SearchRес  используются  в  процедурах
FindFirst и Findnext для просмотра каталогов файлов.

  type
    SearchRec = record
    Fill: array[1..2] of byte;
    Attr: byte;
    Time: longint;

                                - 12 -


    Size: longint;
    Name: string[12];
  end;

     Информация по каждому из найденных с помощью  одной  из
этих   процедур   файлов   помещается   опять  в  переменную
SearchRес. Поле Аttr содержит атрибуты файла (построенные из
констант атрибута файла),  поле  Тiме  содержит дату и время
создания файла в  упакованном формате (для распаковки содер-
жимого этого поля  можно использовать процедуру UnpackТiме),
поле Sizе содержит размер файла в байтах, а поле Nаме содер-
жит его имя. Поле Fill в зарезервировано ДОС и не должно из-
меняться.

                    Переменная DosError

     Переменная  Doserror используется во многих программах,
работающих с  модулем Dos, для того, чтобы получить информа-
цию об ошибках.

  var DosError: integer;

     В переменной Doserror запоминаются коды ошибок ДОС.
Значение 0  указывает на отсутствие ошибки. Другие возможные
коды ошибок включают в себя:

     2 - файл не найден;
     3 - путь доступа не найден;
     5 - доступ отвергнут;
     6 - недопустимая обработка;
     8 - недостаточно памяти;
     10 - недопустимая программная среда;
     11 - неверный формат;
     18 - файлы отсутствуют.

             Процедуры обслуживания прерываний

     Приведем краткий список процедур, обслуживающих преры-

                                - 13 -


вания:

------------------------------------------------------------
     Процедура GetIntVес - возвращает адрес,  сохраненный  в
заданном векторе прерываний.
     Процедура Intr - выполняет заданное  программное преры-
вание.
     Процедура МsDos - выполняет вызов функции ДОС.
     Процедура SetIntVес - устанавливает по заданному адресу
заданный вектор прерывания.
     Процедура GetDate - возвращает  текущую  дату, установ-
ленную в операционной системе.
     Процедура GetFTime - возвращает дату и время  последней
записи файла.
     Процедура GetTiме - возвращает текущее время,  установ-
ленное в операционной системе.
     Процедура РackТiме - преобразует запись  DateTiме в че-
тырехбайтовое  упакованное  символьное  представление даты и
времени длинного  целого типа, которое используется в проце-
дуре SetTiме.  Поля записи DateTiме не проверяются на допус-
тимость границ.
     Процедура SetDate - устанавливает для операционной сис-
темы текущую дату.
     Процедура SetFTiме - устанавливает время и дату послед-
ней записи файла.
     Процедура SetTiме - устанавливает в операционной систе-
ме текущее время.
     Процедура UnpackТiме - преобразует четырехбайтовое упа-
кованной символьное  представление  даты  и времени длинного
целого типа, возвращаемого процедурами  GetFTiме, FindFirst,
FindNext в распакованную запись DateTiме.
------------------------------------------------------------

           Функции, проверяющие состояние  диска

------------------------------------------------------------
     Функция DiskFrее - возвращает число свободных байтов на
диске в заданном дисководе.

                                - 14 -


     Функция DiskSize - возвращает полный объем в байтах за-
данного диска.
------------------------------------------------------------

                 Процедуры обработки файлов

------------------------------------------------------------
     Процедура FindFirst - производит  поиск в заданном (или
текущем) каталоге записи, содержимое которой совпадает с за-
данным именем файла и атрибутами.
     Процедура FindNext - возвращает  следующую  запись, имя
файла и атрибуты в которой  совпадают с  теми,  которые были
заданы при предыдущем обращении к продедуре FindFirst.
     Процедура GetFAttr - возвращает атрибуты файла.
     Процедура SetFAttr - устанавливает атрибуты файла.
------------------------------------------------------------

         Процедуры и функции управления процессами

------------------------------------------------------------
     Функция DosExitCode -  возвращает для  подпроцесса  код
завершения.
     Процедура Ехесutе - выполняет заданную программу с ука-
занной командной строкой.
     Процедура Keep -  сохраняет  (прекращает  выполнение  и
сохраняет в памяти) прекратившую работу программу,  оставляя
ее резидентной в памяти.
     Процедура SwapVectors - меняет местами содержимое  сох-
раненных векторов прерываний и текущих векторов.
------------------------------------------------------------

           Фукнции управления операционной средой

------------------------------------------------------------
     Функция EnvCount - возвращает число строк, содержащихся
в операционной среде ДОС.
     Функция EnvStr - возвращает заданную строку  операцион-
ной среды.

                                - 15 -


     Функция GetEnv - возвращает значение заданной  перемен-
ной операционной среды.
------------------------------------------------------------

               Смешанные процедуры и функции

------------------------------------------------------------
     DosVersion - возвращает номер версии операционной  сис-
темы ДОС.
     GetCBreak  -  возвращает  проверяемое   ДОС   состояние
Ctrl-Break.
     SetCBreak -  устанавливает  проверяемое  ДОС  состояние
Ctrl-Break.
     GetVerify - возвращает состояние флага проверки в ДОС.
     SetVerify - устанавливает состояние  флага  проверки  в
ДОС.
------------------------------------------------------------

                         Модуль Сrt

     Модуль Сrt реализует ряд мощных  программ, предоставля-
ющих вам полную возможность управления средствами компьютера
РС, такими, как управление режимом экрана, расширенные  коды
клавиатуры, цвета, окна, и звуковые сигналы.  Модуль Сrt мо-
жет использоваться только в программах, работающих на персо-
нальных компьютерах IBM РС, РС АТ, РS/2  фирмы  ИБМ  и  пол-
ностью совместимых с ними.
     Одним из основный преимуществ использования  модуля Сrt
является является большая скорость и гибкость при выполнении
операций работы с экраном. Программы, не  работающие с моду-
лем Сrt, выводят на экран информацию с  помощью средств опе-
рационной системы ДОС, что  связано с  дополнительными избы-
точными  затратами.  При  использовании модуля Сrt выводимая
информация посылается непосредственно в базовую систему вво-
да-вывода  (ВIОS),  или, для еще более быстрых операций, не-
посредственно в видеопамять.


                                - 16 -


                  Входные и выходные файлы

     При инициализации модуля Сrt для того, чтобы можно было
обращаться к СRТ,  вместо  стандартных файлов ввода и вывода
ДОС  назначаются  стандартные  входные  и выходные текстовые
файлы. Это соответствует выполнению в  начале программы сле-
дующих операторов:

  AssignCrt(Input); Reset(Input);
  AssignCrt(Output); Rewrite(Output);

     Это означает, что  переопределение  входных  и выходных
файлов далее не допускается до тех пор, пока для данных фай-
лов не будет выполнено обратного  переназначения и  не прои-
зойдет  переход к  стандартному вводу и выводу с помощью вы-
полнения операторов:

  Assing(Input,''); Reset(Input);
  Assing(Output,''); RewriteOutput);

                            Окна

     Модуль Сrt поддерживает простую, но, тем не менее, мощ-
ную форму использования окон. Процедура Window позволяет вам
определить  в каком-либо месте экрана окно. При записи в это
окно  оно  ведет себя точно также, как целый экран. При этом
остальная часть экрана остается нетронутой. Другими словами,
доступ к экрану  вне окна отсутствует. Внутри окна можно до-
бавлять и  удалять  строки,  при  этом курсор возвращается к
правому краю и при  достижении  курсором нижней строки текст
продвигается вверх.
     Все координаты  экрана, кроме тех, которые используются
для определения окна,  относятся к текущему окну. Координата
экрана (1,1) соответствует левому верхнему углу экрана.
     По умолчанию окном считается весь экран.

                    Специальные символы

     При записи в выходной файл или в файл, который назначен

                                - 17 -


для модуля Сrt, специальное  значение имеют следующие управ-
ляющие символы:
     #7 - вызывает звуковой  сигнал,  издаваемый  с  помощью
внутреннего динамика.
     #8 - возврат на одну позицию. Вызывает перемещение кур-
сора  влево на одну позицию. Если курсор уже находится у ле-
вого  края текущего окна, то никаких действий не производит-
ся.
     #10 - перевод строки.  Перемещает курсор на одну строку
вниз.  Если курсор  уже  находится на нижней строке окна, то
окно пролистывается вверх на одну строку.
     #13 - возврат каретки.  Возвращает курсор с левому краю
текущего окна.
     Все другие символы при записи выводятся на экран.

                         Ввод строк

     При чтении из входного файла (Input) или при из тексто-
вого файла, который назначен  для модуля Сrt, текст вводится
по одной строке.  Строка  запоминается  во внутреннем буфере
текстового файла и  когда  переменные  считываются, то в ка-
честве  источника  используется этот буфер. Каждый раз когда
буфер становится  пустым,  вводится  новая строка. При вводе
строк можно использовать следующие клавиши редактирования:

     Вacksрасе - удаляет последний введенный символ.
     Еsс - удаляет всю вводимую строку.
     Еnter - прекращает ввод строки и записывает метку конца
строки (возврат каретки / перевод строки) в буфере.
     Сtrl-S - действует также, как Васкsрасе.
     Сtrl-D - извлекает  один  символ  из последней вводимой
строки и выводит его на экран.
     Сtrl-F - восстанавливает на  экране  последнюю вводимую
строку.
     Сtrl-Z - завершает ввод строки и генерирует символ кон-
ца файла.
     Сtrl-Z  генерирует  символ конца  файла  только  в  том
случае, если  переменная  СhескЕоf  установлена  в  значение
Тruе (по умолчанию ей присвоено значение Falsе).

                                - 18 -



     Для  проверки  состояния  клавиатуры  и ввода отдельных
символов  под   управлением  программы  используйте  функции
KeyРressed и Rеаdkey.

                Константы, типы и переменные

     В данном разделе кратко обсуждается каждая из констант,
типов переменных, задаваемых с помощью модуля Сrt.

                Константы режима модуля Сrt

     В качестве параметров процедуры  ТextМоdе  используются
следующие константы:

 const
  BW40  = 0;       { 40х25,  черно-белый  режим  на  цветном
                     адаптере }
  C40   = 1;       { 40х25, цветной режим на  цветном  адап-
                     тере }
  BW80  = 2;       { 80х25,  черно-белый  режим  на  цветном
                     адаптере }
  C080  = 3;       { 80х25, цветной режим на цветном адапте-
                     ре }
  Mono  = 7;       { 80х25, черно-белый режим на  монохрома-
                     тическом адаптере }
  Font8x8 = 256;   { 43 и 50 строк для адаптеров EGA/VGA }
  C40   = C040;    { для совместимости с версией 3.0 }
  C80   = C080;    { для совместимости с версией 3.0 }

     ВW40, С040, ВW80 и С080 представляют собой четыре цвет-
ных  текстовых  режима, поддерживаемых в цветном графическом
адаптере (СGА) на компьютере РС фирмы  ИБМ.  Константа  Моnо
представляет собой отдельный черно-белый режим, поддерживае-
мый монохроматическим адаптером на компьютере РС фирмы  ИБМ.
Font8x8  -  это режимы адаптеров EGA/VGA с 43 и 50 строками.
Константы С40 и С80 предназначены для совместимости с верси-
ей 3.0 Турбо-Паскаля.

                                - 19 -


                      Константы цветов

     При работе с процедурами ТехтСоlor и ТехтВаскground ис-
пользуются следующие константы:

 const
   Black          = 0;      { черный }
   Blue           = 1;      { синий  }
   Green          = 2;      { зеленый }
   Cyan           = 3;      { бирюзовый }
   Red            = 4;      { красный }
   Magenta        = 5;      { малиновый }
   Brown          = 6;      { коричневый }
   LightGray      = 7;      { светло-серый }
   DarkGray       = 8;      { темно-серый }
   LightBlue      = 9;      { светло-голубой }
   LightGreen     = 10;     { светло-зеленый }
   LightCyan      = 11;     { светло-бирюзовый }
   LightRed       = 12;     { светло-красный }
   LightMagenta   = 13;     { светло-малиновый }
   Yellow         = 14;     { желтый }
   White          = 15;     { белый }
   Blink          = 128;    { мерцание }

     Цвета представлены их номерами от 0 до 15. Чтобы легко
идентифицировать каждый цвет, вместо цветов можно использо-
вать данные константы. В цветном текстовом режиме цвет каж-
дого символа выбирается из 16 цветов, а фоновый цвет - из 8
цветов. Цвет каждого символа можно сделать мерцающим.

                       Переменные Crt

     В модуле Crt содержатся следующие переменные:

 var
   CheakBreak   : boolean;
   CheckEof     : boolean;

                                - 20 -


   CheckSnow    : boolean;
   DirectVideo  : boolean;
   LastMode     : word;
   TextAttr     : byte;
   WindMin      : word;
   WindMax      : word;

                   Переменная СhескВrеak

     Переменная СheckВrеak разрешает или запрещает  проверки
ситуации Сtrl-Вreak.

     var CheckBreak: boolean;

     Когда переменная СhескВrеak принимает значение Тruе, то
нажатие  клавиш Сtrl-Вrеak приведет к принудительному завер-
шению работы программы при следующей операции вывода на  эк-
ран  дисплея, которую выполнит эта программа. Когда перемен-
ная СhескВreak  принимает  значение  Falsе,  нажатие  клавиш
Сtrl-Вreak  не  вызовет никаких действий. По умолчанию пере-
менная СhескВrеак принимает значение Тruе. (Во время  выпол-
нения  модуль  Сrt  сохраняет  старый  вектор  прерываний по
Сtrl-Вreak, $1В, в глобальной переменной-указателе с  именем
SaveInt1В).

                     Переменная СhесkЕОF

     Переменная СhесkЕОF разрешает или запрещает символ кон-
ца файла:

  var CheckEOF: boolean;

     Если переменная СhесkЕОF имеет значение Тruе, то, когда
чтение производится  из  файла  назначенного экрану дисплея,
при нажатии клавиш  Сtrl-Z  генерируется символ конца файла.
Когда переменная СhесkЕОF имеет значение False  при  нажатии
клавиш  Сtrl-Z  никаких  действий  не выполняется.  Значение
Falsе присваивается переменной СhесkЕОF по умолчанию.

                                - 21 -



                    Переменная СhесkSnow

     Переменная СhесkSnow  разрешает  или  запрещает  видео-
контроль при записи  символов непосредственно в видеопамять.
(При отсутсвии такого контроля на экране дисплея могут  воз-
никать помехи в виде "снега".)

  var CheckSnow: boolean;

     В большинстве  адаптеров СGА, если символы запоминаются
в видеопамяти не во время интервалов обратного хода горизон-
тальной развертки, то будут возникать помехи.  При использо-
вании монохроматических адаптеров или адаптера ЕGА этого  не
происходит.
     Когда   выбран   цветной  текстовый  режим,  переменной
СhескSnow присвоено значение Тruе и прямая запись в видеопа-
мять  производится только во время интервалов обратного хода
горизонтальной развертки.  При работе в последними  моделями
адаптеров СGА вы, возможно,  захотите в  начале  программы и
после каждого вызова процедуры ТехтМоdе присвоить переменной
СhескSnow значение Falsе. Это вызовет отмену  видеоконтроля,
что приведет к значительно большей скорости работы.
     Когда  переменная DirectVideo имеет значение Falsе, пе-
ременная СhескSnow никаких действий не вызывает.

                   Переменная DirесtVidео

     Переменная DirесtVidео разрешает или  запрещает  прямой
доступ к  памяти  при  использовании  операторов  Writе  или
Writeln, с помощью которых информация выводится на экран.

  var DirectVideo: boolean;

     Когда переменная  DirесtVidео  имеет  значение Тruе, то
при использовании операторов записи Write и  Writeln в файл,
связанный с  устройством  СRТ, вместо обращения  для  вывода
символов  к  средствам  ВIОS (базовая система ввода-вывода),

                                - 22 -


что значительно замедляет процесс,  они  будут  записываться
непосредственно в видеопамять.
     По умолчанию переменная DirесtVidео всегда имеет значе-
ние Тruе. Если по каким-либо  причинам вы хотите, чтобы сим-
волы выводились с  помощью  обращений к базовой системе вво-
да-вывода, то в начале вашей программы и после каждого обра-
щения в процедуре ТехтМоdе присвойте переменной DirесtVidео
значение Falsе.

                    Переменная ТехтАttr

     Переменная ТехтАttr используется для сохранения выбран-
ных текущих текстовых атрибутов.

  var TextAttr: byte;

     Текстовые атрибуты обычно устанавливаются с помощью вы-
зова процедур  ТехtСоlоr и  ТехtВаckground, однако вы можете
также установить их путем непосредственной записи значения в
переменную TextАttr.  Информация о цветах кодируется в пере-
менной TextАttr следующим образом:

          7    6  5  4   3  2  1  0
       ------------------------------
       !  В  ! b  b  b ! f  f  f  f !
       ------------------------------

где ffff - четырехбитовый цвет текста, bbb - трехбитовый фо-
новый цвет, а В - бит,  разрешающий режим мерцания. Если для
задания значений переменной ТехтАttr вы используете констан-
ты цветов, заметим, что в качестве фонового цвета можно выб-
рать только  один  из  первых 8 цветов и что для того, чтобы
разместить  его  в  правильных  позициях битов, это значение
нужно умножить на 16. При следующих присвоениях будут выбра-
ны желтые мерцающие символы на голубом фоне.

  TextAttr := Yellow + Blue * 16 + Blink;


                                - 23 -



                Переменные WindMin и WindМах

     Переменные WindMin и WindМах используются для запомина-
ния координат экрана для текущего окна.

  var WindMin, WindMax : word;

     Эти переменные устанавливаются с помощью  вызова проце-
дуры Window.  Переменная  WindMin  определяет  левый верхний
угол, а переменная  WindМах -  нижний правый угол. В младшем
байте хранится  координата Х, а в старшем байте - координата
Y. Например,  Lо(WindMin)  дает координату  Х левого края, а
Нi(WindМах)  - кординату Y нижнего края.  Левый верхний угол
экрана соответствует координатам (Х,Y) = (0,0). Заметим, од-
нако, что при передаче  координат в  качестве параметров при
обращении  к процедурам  Window и  GоtоХY верхний левый угол
задается координатами (1,1).

                    Процедуры и функции

------------------------------------------------------------
     Процедура АssignCrt - назначает текстовый файл для уст-
ройства СRТ.
     Процедура СlrЕоl - очищает все символы, начиная от  по-
зиции курсора до конца строки, без перемещения курсора.
     Процедура СlrScr - очищает экран и  помещает  курсор  в
верхнем левом углу.
     Процедура Dеlау - выполняет задержку на указанное число
миллисекунд.
     Процедура DelLine - удаляет строку, на которой находит-
ся курсор и перемещает все  следующие  строки на одну строку
вверх. Нижняя строка очищается.
     Процедура GоtоХY - выполняет позиционирование  курсора.
Х - это горизонтальная позиция, Y - вертикальная позиция.
     Процедура НightVideo - выбирает символы с подсветкой.
     Процедура InsLine - вставляет  пустую  строку  в  месте
расположения курсора.

                                - 24 -


     Функция KeyРrеssеd - возвращает  значение  Тruе,   если
клавиша на клавиатуре нажата и Falsе - в противном случае.
     Процедура LowVidео - выбирает символы с пониженной  яр-
костью.
     Функция NormVideo - выбирает символы с нормальной ярко-
стью.
     Процедура NoSound - выключает внутренний динамик.
     Функция Rеаdкеу - считывает символ с клавиатуры.
     Процедура RеstorеСrt - восставливает  исходный видеоре-
жим, который использовался при запуске.
     Процедура Sound - включает внутренний динамик.
     Процедура ТехtВаскground - выбирает фоновый цвет.
     Процедура ТехtСоlor - выбирает цвет самого символа.
     Процедура ТехtМоdе - выбирает  конкретный текстовый ре-
жим.
     Функция WherеХ - возвращает координату  Х  для  текущей
позиции курсора, относящуюся к текущему окну. Х представляет
собой горизонтальную позицию.
     Функция WhereY - возвращает  координату  Y  для текущей
позиции курсора, относящуюся к текущему окну. Y представляет
собой вертикальную позицию.
     Процедура Window - определяет на экране текстовое окно.
------------------------------------------------------------

                        Модуль Graph

     Модуль Graph  реализует  полную библиотеку из более чем
50 графических программ -  от вызовов процедур и функций вы-
сокого уровня, как,  например, SetViewPort, Ваr3D, DrowPoly,
до программ,  ориентированных на работу с битами, таких, как
GetImage или РutImage. Поддерживается несколько видов закра-
шивания и  типов  линий и имеется несколько шрифтов, которые
можно изменять  по величине, выравнивать и ориентировать го-
ризонтально или вертикально.
     Для  компиляции  программы,  использующей модуль Grарh,
вам не потребуется никаких внешних  файлов  (кроме, конечно,
исходного  текста  вашей  программы, компилятора и доступа к
стандартным модулям в ТURВО.ТРL). Для запуска программы, ис-

                                - 25 -


пользующей модуль Grарh, кроме вашей программы с расширением
.ЕХЕ вам  потребуются  один  или более графических драйверов
(см. далее файлы .BGI).  В  придачу к  этому вам потребуется
также один или  более  файлов  шрифтов  (.СНR), если в вашей
программе используются какие-либо шрифты.
     В соответствии  с  лицензионными  условиями  вы  можете
распростанять файлы .CHR и .BGI наряду с со своими  програм-
мами.

                          Драйверы

     Для перечисленных ниже графических  адаптеров и  полно-
стью совместимых с ними предусмотрены  следующие графические
драйверы:

     - СGА;
     - МСGА;
     - ЕGА;
     - VGА;
     - Неrcules;
     - АТ&Т 400;
     - 3270 РС;
     - IBM-8514.

     Каждый драйвер содержит выполняемый код и данные и хра-
нится в отдельном файле на диске. Во время работы  процедура
InitGraph идентифицирует графическую аппаратуру и производит
загрузку и инициализацию соответствующего графического драй-
вера, переводит систему в графический режим, а затем возвра-
щает управление вызывающей  программе.  Процедура СloseGraph
выгружает драйвер из памяти и восстанавливает предыдущий ви-
деорежим. С помощью программ  RеstoreCrtMode и  SetGraphMode
вы можете переключаться между текстовым и графическим  режи-
мом.
     Модуль Grаph может также работать на компьютерах с дву-
мя мониторами. При инициализации модуля Graph с помощью про-
цедуры InitGraph для графического драйвера и требуемого  ре-
жима будет выбран нужный монитор. При завершении работы гра-

                                - 26 -


фической программы предыдущий видеорежим будет восстановлен.
Если для графической аппаратуры с двумя мониторами требуется
автоматическое распознавание, то процедура InitGraph выберет
монитор и графическую плату,  при  которой  будет получаться
наилучшее качество выводимой графической информации.

 CGA.BGI     - драйвер для адаптеров CGA, MCGA фирмы IBM.
 EGAVGA.BGI  - драйвер для адаптеров EGA, VGA фирмы IBM.
 HERC.BGI    -   драйвер   для  монохроматического  адаптера
Hercules фирмы IBM.
 ATT.BGI     - драйвер для AT&T 6300 (400 строк).
 PC3270.BGI  - драйвер для IBM PC 3270.
 IBM8514.BGI - драйвер для IBM8514.

               Поддержка устройства IBM-8514

     Турбо-Паскаль поддерживает графическую плату  IBM-8514,
которая представляет собой новую графическую плату с высоким
разрешением, позволяющую получить разрешающую способность до
1024х768 точек и палитру, содержащую  256  оттенков  из  256
цветов. Файл драйвера для этой графической платы  называется
IBM8514.BGI.
     Графическая плата IBM-8514 не может правильно распозна-
ваться при автоматическом обнаружении  (она будет  распозна-
ваться алгоритмами автообнаружения,  как плата  VGA).  Таким
образом,  чтобы  использовать  плату  IBM-8514,   переменной
GraphDriver при вызове InitGraph  нужно  присвоить  значение
IBM8514 (которое определено в модуле  Graph).  При  работе с
платой   IBM-8514   не  следует   использовать  с  InitGraph
DetectGraph или DETECT (если только вы не хотите эмулировать
режим VGA).
    Для  платы  IBM-8514  поддерживаются  следующие  режимы:
IBM8514LO (640х480 элементов изображения) и IBM8514HI  (1024
х768 элементов изображения). Обе константы режима определены
в интерфейсной части GRAPH.TPU.
    Для определения цветов в плате IBM-8514 используются три
6-битовых значения. Для каждого определяемого цвета  имеются
6-битовые компоненты Red (красный), Green (зеленый)  и  Blue

                                - 27 -


(голубой). Для того, чтобы при работе с  графической  платой
IBM-8514 пользователь мог задавать цвета,  в библиотеку  BGI
добавлена новая программа. Эта программа определяется в  мо-
дуле GRAPH.TPU следующим образом:

 procedure SetRGBPalette(ColorNum, Red, Green, Blue : word);

    Аргумент  ColorNum  задает запись палитры, которую нужно
загрузить. Этот аргумент представляет собой целое значение в
диапазоне от 0 до 255 (дес.). Аргументы Red,  Green  и  Blue
определяют компоненты цветов в записи палитры.  Используется
только младший байт этих значений и только 6  старших  битов
этого байта загружаются в палитру.
    Другие программы, модифицирующие палитру (SetAllPalette,
SetPalette, GetPalette),  при работе  с  графической  платой
IBM-8514 использовать не следует.
    Для совместимости с графическими  адаптерами  фирмы  IBM
драйверы формата BGI определяют для первых 16 цветов палитры
IBM-8514 значения цветов, принятые по умолчанию для  адапте-
ров EGA/VGA. Эти значения могут использоваться в  неизменен-
ном   виде   или   модифицироваться   с   помощью  процедуры
SetGRBPalette.
    Процедура   FloodFill  с  драйвером  графической   платы
IBM-8514 работать не будет.
    При  работе с графическим адаптером VGA в цветном режиме
256К имеют место те же ограничения.

                     Система координат

     По соглашению верхний левый угол экрана имеет координа-
ту (0,0). У более правого столбца координата х больше, у бо-
лее нижней строки больше координата y.  То есть координата х
увеличивается при перемещении вправо,  а  координата y - при
перемещении вниз. Таким образом координаты каждого из  четы-
рех углов и конкретной точки (середины экрана) будут  выгля-
деть следующим образом:


                                - 28 -


 (0,0)                                    (319,0)
   --------------------------------------------
   !                                          !
   !                                          !
   !                                          !
   !                . (159,99)                !
   !                                          !
   !                                          !
   !                                          !
   !                                          !
   --------------------------------------------
 (0,199)                                 (319,199)

                     Текущий указатель

     Понятие текущего указателя  (СР - Сurrent Pointer)  ис-
пользуется во многих графических системах. Понятие СР анало-
гично понятию курсора для  текстового режима, за исключением
того, что текущий указатель невидим.

  Write('ABC');

     В текстовом  режиме предшествующий оператор Write оста-
вит курсор в колонке, непосредственно следующим за буквой С.
Если буква С была  введена  в колонке 80, то курсор перейдет
на колонку 1  следующей строки.  Если буква С была введена в
колонке 80  строки  25,  то  произойдет пролистывание экрана
вверх на 1  строку и  курсор  будет находится в 1 колонке 25
строки.

  MoveTo(0,0);
  LineTo(20,20)

     В графическом режиме данный оператор LinеТо оставит те-
кущий  указатель  в последней заданной точке  (20,20).  Если
действует режим отсечения, реальная  выводимая  прямая будет
отсечена до  текущей  точки.  Заметим, что текущий указатель
никогда не отсекается.
     Команда  МоvеТо  является  эквивалентом команды GotoXY.

                                - 29 -


Единственное ее назначение - это перемещение текущего указа-
теля. Перемещение текущего  указателя  может  использоваться
только в следующих командах, использующих текущий указатель:

 MoveTo, InitGraph, MoveRel, LineTo, LineRel, OutText,
 SetGraphMode, ClearDevice, SetViewPort, ClearViewPort

                           Текст

     В графическом режиме  для  вывода  текста  используется
шрифт с растром 8х8 и несколько "штриховых" шрифтов. Растро-
вый  символ  задается  с  помощью  матрицы элементов изобра-
жения. Штриховой шрифт задается рядом векторов, которые ука-
зывают графической системе, как рисовать шрифт.
     Преимущество использования штриховых шрифтов становится
очевидным, когда вы начинаете рисовать большие символы. Пос-
кольку штриховой шрифт задается векторами, то при увеличении
шрифта качество и разрешение остаются, тем не менее, хороши-
ми.
     Когда увеличивается растровый шрифт, то матрица умножа-
ется на масштабный коэффициент, а когда  этот масштабный ко-
эффициент  увеличивается,  разрешение  у символов становится
более грубым.  Для маленьких  шрифтов растровый шрифт должен
быть достаточно приемлимым, но для больших шрифтов вы, веро-
ятно, захотите выбрать шириховой шрифт.
     Выравнивание графического текста управляется процедурой
SetТехtJustify. Масштабирование и выбор шрифта осуществляет-
ся с помощью процедуры SetТехtStyle. Графический текст выво-
дится с помощью процедур ОutТехt или ОutТехtХY. Запрос о те-
кущих  установленных для текста параметрах выполняется с по-
мощью обращения к процедуре GetТехtSettings. Шириховые шриф-
ты хранятся каждый в отдельном файле на диске и должны  при-
сутствовать  там  во  время  работы  (при  вызове  процедуры
SetТехtStyle).  Размер  штрихового  шрифта можно настроить с
помощью процедуры SetUserCharSize.  Файлы  шрифтов  (которые
имеют  расширение  .CHR) могут загружаться с диска автомати-
чески модулем Graph, или их можно компоновать  с  программой
пользователя  или загружать и "регистрировать" с помощью мо-

                                - 30 -


дуля Graph.
     Для преобразования файла  шрифта  (или  любого  другого
предназначенного  для  этой  цели  двоичного файла данных) в
файл .OBJ, который можно компоновать с модулем или  програм-
мой  с помощью директивы компилятора $L предусмотрена специ-
альная утилита BINOBJ.EXE. При этом становится возможным по-
местить  все файлы шрифтов в выполняемый файл .EXE (см. ком-
ментарии в начале примера программы GRLINK.PAS на  дистрибу-
тивном диске).

             Графические изображения и их виды

     Для вычерчивания  и  закрашивания графических изображе-
ния, включая точки, прямые, окружности,  дуги, эллипсы, пря-
моугольники, многоугольники, шриховку,  трехмерную штриховку
и секторы, имеется  целый  ряд  обеспечивающих программ. Для
управления видом  линии - будет она тонкой или толстой, неп-
рерывной или состоящей из точек, или же построенной по ваше-
му  собственному  образцу -  можно  использовать   процедуру
SetLineStyle.
     Для закрашивания области или многоугольника  пересекаю-
щейся штриховкой или чем-либо более сложным  можно использо-
вать процедуры:

  SetFillStyle, SetFloodPattern, FillPoly, FloodFill


            Области просмотра и двоичные образы

     Процедура  ViewPoint позволяет всем командам вывода ра-
ботать в прямоугольной области  экрана.  Графики,  прямые  и
другие графические изображения (весь графический вывод) свя-
зывается с областью просмотра, пока эта область не изменяет-
ся. Предусмотрены программы для  очистки области просмотра и
считывания ее текущих определений.  Если задан режим отсече-
ния, то весь графический  вывод отсечется  до текущей точки.
Заметим, что текущий указатель никогда не отсекается.
     Для считывания и вывода  элементов  изображения предус-

                                - 31 -


мотрены  процедуры  GetPixel и  Putpixel.  Чтобы сохранить и
восстановить на экране прямоугольную область,  можно исполь-
зовать  процедуры  GetImage и  PutImage.   Они  обеспечивают
полное выполнение  операций  процедуры  ВitВlt  (нормальное,
хоr, оr, аnd, nоt).

                 Поддержка страниц и цвета

     Имеется много других поддерживающих  программ,  включая
поддержку  для  нескольких  графических  страниц (только для
адаптеров  ЕGА, VGА и Неrcules; это особенно полезно при ис-
пользовании в мультипликации), палитры, цвета и так далее.

                      Обработка ошибок

     Внутренние  ошибки  модуля  Graph возвращаются функцией
GraphResult. Эта функция возвращает код ошибки, показывающий
состояние последней графической операции.  Имеются следующие
коды возврата с ошибкой:

      0 - ошибки нет;
     -1 - (BGI) графика не установлена (используйте процеду-
          ру InitGraph);
     -2 - аппаратное обеспечение для графики не найдено;
     -3 - не найден файл драйвера устройства;
     -4 - неверный файл драйвера устройства;
     -5 - не хватает памяти для загрузки драйвера;
     -6 - выход за границы памяти при сканировании области
          закрашивания;
     -7 - выход за границы памяти при заполнении закрашивае-
          мой области;
     -8 - не найден файл шрифта;
     -9 - не хватает памяти для загрузки шрифта;
     -10 - недопустимый для выбранного драйвера графический
          режим.

     Значение кода возврата для функции GraphResult устанав-
ливается следующими процедурами:

                                - 32 -



  DetectGraph, InitGraph, FloodFill, FillPoly, DrawPoly,
  Bar, Bfr3D, PieSlice, ClearViewPort, SetTextStile,
  SetGraphMode, CloseGraph, GetGraphMode, ImageSize,
  InstallUserDriver, InstallUserFont, RegisterBGIDriver,
  RegisterGBIFont, SetAllPalette, SetFillPattern,
  SetFillStyle, SetGraphBufSize, SetGraphMode, SetLineStyle,
  SetPalette, SetTextJustify

     Заметим, что функция GraphResult после обращения к  ней
сбрасывает код ошибки в 0. Таким образом, пользователь  дол-
жен сохранить значение кода ошибки во временной переменной и
затем проверить его.  Определены  следующие  константы  кода
возврата:

 const
   { Коды возврата функции GraphResult }
   grOk                     =  0;
   grNoInitGraph            = -1;
   grNotDetected            = -2;
   grFileNotFound           = -3;
   grInvalidDriver          = -4;
   grNoLoadMem              = -5;
   grNoScanMem              = -6;
   grNoFloodMem             = -7;
   grFontNotFound           = -8;
   grNoFontMem              = -9;
   grInvalidMode            = -10;


                       Начало работы

     Приведем пример простой графической программы:

  1 program GraphTest;
  2 uses
  3   Graph;
  4 var

                                - 33 -


  5   GraphDriver  : integer;
  6   GraphMode    : integer;
  7   ErrorCode    : integer;
  8 begin
  9   GraphDriver := Detect;    { Установить флаг: выполнить
                                  распознавание }
  10  InitGraph(GraphDriver, GraphMode, 'C:\DRIVERS');
  11  ErrorCode := GraphResult;
  12  if ErrorCode <> grOk then  { ошибкаь }
  13  begin
  14    Writeln('Ошибка графики: ',GraphErrorMsg(ErrorCode);
  15    Writeln('Программа аварийно завершила работу...');
  16    Halt(1);
  17  end;
  18  Rectangle(0, 0, GetMaxX, GetMaxY); { нарисовать  рамку
                                          размером в экран }
  19  SetTextJustify(CenterText, CenterText); {  центрирова-
                                          ние текста }
  20  SetTextStyle(DefaultFont, HorizDir, 3);
  21  OutTextXY(GetMaxX div 2, GetMaxY div 2, { центр экр. }
  22         'Графический интерфейс фирмы Borland (BGI)');
  23  Readln;
  24  CloseGraph;
  25 end. { GraphTest }

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

      Примечание: Устройство АТ&Т400 не распознается автома-
      тически. Тем не менее вы можете пользоваться драйвером
      графии АТТ путем отмены автоматической проверки, пере-
      сылки  исполняемого  кода   драйвера   АТ&Т  процедуре

                                - 34 -


      InitGraph и установки допустимого графического режима.
      Замените 8 и 9 строку в предыдущем примере  следующими
      тремя строками:

   GraphDriver := ATT400;
   GraphMode := ATT400Hi;
   InitGraph(GraphDriver, GraphMode, 'C:\DRIVER');

           Это укажет  графической  системе на необходимость
      загрузки драйвера устройства АТ&Т400, расположенного в
      каталоге  С: DRIVERS и установит графический режим 640
      на 400.

     Приведем еще один пример, который показывает, как можно
переключаться между графическим и текстовым режимами:

  1 program GraphTest;
  2 uses
  3   Graph;
  4 var
  5   GraphDriver  : integer;
  6   GraphMode    : integer;
  7   ErrorCode    : integer;
  8 begin
  9   GraphDriver := Detect;    { Установить флаг: выполнить
                                  распознавание }
  10  InitGraph(GraphDriver, GraphMode, 'C:\DRIVERS');
  11  ErrorCode := GraphResult;
  12  if ErrorCode <> grOk then  { ошибкаь }
  13  begin
  14    Writeln('Ошибка графики: ',GraphErrorMsg(ErrorCode);
  15    Writeln('Программа аварийно завершила работу...');
  16    Helt(1);
  17  end;
  18  OutText('Графический режим. Нажмите <RETURN>');
  19  Readln;
  20  RestoreCrtMode;
  21  Write('Текстовый режим. Нажмите <RETURN>');

                                - 35 -


  22  Readln;
  23  SetGraphMode(GraphMode);
  24  OutText('Снова графический режим. Нажмите <RETURN>');
  25  Readln;
  26  CloseGraph;
  27 end. { GraphTest }

     Заметим,  что вызов процедуры SetGraphMode на строке 23
сбрасывает все  графические параметры (палитра, текущий ука-
затель, основной и  фоновый цвета и т.д.) и им присваиваются
принятые по умолчанию значения.

             Программы управления динамически
     распределяемой областью, написанные пользователем

     Для модуля Graph предусмотрены две программы управления
динамически   распределяемой    областью    GraphFrееМем   и
GraphGetМем. Первая из них освобождает память,  распределен-
ную для драйверов, а вторая -  распределяет память для драй-
веров  графических  устройств.  Стандартные  программы имеют
следующий вид:

  procedure GraphGetMem(var P : Pointer; Size : word);
  { выделить память для драйверов графических устройств }
  procedure GraphFreeMem(var P : Pointer; Size : word);
  { освободить память для драйверов графических устройств }

     В модуле Graph имеются два указателя, которые по умол-
чанию указывают на две описанные здесь стандартные програм-
мы. Эти указатель определяются следующим образом:

  var
    GraphGetMemPtr  : pointer;
    { указатель на программу распределения памяти }
    GraphFreeMemPtr : pointer;
    { указатель на программу освобождения памяти }

     Во время инициализации модуля Graph  эти указатели ссы-

                                - 36 -


лаются  на  стандартные  графические  программы  распределе-
ния-освобождения,  которые  определяются в секции реализации
модуля Graph.  Чтобы  задать ваше собственное управление па-
мятью, в модуле Graph вы можете изменить значения этих  ука-
зателей так, чтобы они ссылались на ваши  собственные  прог-
раммы. Программы, заданные пользователем должны иметь тот же
список параметров,  что  и  стандартные  программы, и должны
иметь дальний тип  вызова.  Приведем  далее  пример заданных
пользователем программ распределения и  освобождения памяти.
Заметим, что при использовании процедуры Ехit  автоматически
вызывается процедура СloseGraph.

 program UserHeapManegement;
 { программа показывает, как пользователь может работать с
   программами управления динамически распределяемой облас-
   тью памяти, используемыми в модуле Graph }
 uses
    Graph;
 var
    GraphDriver, GraphMode : integer;
    ErrorCode              : integer; { используется для
              сохранения кода возврата функции GraphResult }

    PreGraphExitProc       : pointer { используется для сох-
              ранения исходной процедуры выхода }
 {$F+}      { процедуры пользователя должны использовать
              дальний тип обращения }
  procedure MyGetMem(var P : Pointer; Size : word);
            { выделить память для драйверов графичес-
              ких устройств }
  begin
    Write('Была вызвана процедура MyGetMem, нажмите
           <RETURN>:');
    GetMem(P, Size);
  end; { MyGetMem }

  procedure MyFreeMem(ver P : Pointer; Size : word);
  { освободить память, занятую драйверами графических

                                - 37 -


    устройств }
  begin
    RestoreCRTMode;
    Write('Была вызвана процедура MyFreeMem, нажмите
           <RETURN>:'); Readln;
    if P <> Nil Then { не освобождать пустые указатели }
    begin
      FreeMem(P, Size);
      P := Nil;
    end; { MyFreeMem }

 procedure MyExitProc;
 { процедура всегда получает вызов при прекращении работы
   программы }
 begin
   ExitProc := PreGraphExitProc; { восстановить исходную
                                   процедуру выхода }
   CloseGraph;         { очистить динамически распределяемую

                         область }
 end; { MyExitProc }

 { $F- }

 Begin
 { инициализировать программу очистки памяти }
    PreGraphExitProc := ExitProc;
    ExitProc := @MyExitProc;
    GraphGetMemPtr := @MyGetMem ; { заменить распределение
                                    памяти }
    GraphFreeMemPtr := @MyFreeMem ; { заменить освобождение
                                    памяти }
    GraphDriver := Detect;
    InitGraph(GraphDriver, GraphMode, '');
    ErrorCode := GraphResult;
    if ErrorCode <> grOk then
  begin
   Writeln('Графическая ошибка: ' GraphErrorMsg(ErrorCode);

                                - 38 -


   Readln;
   Halt(1);
  end;
  Line(0, 0, GetMaxX, GetMaxY);
  OutText(1, 1, 'Нажмите клавишу <RETURN>:');
  Readln;
 end. { UserHeapManegement }

             Интерфейсная секция модуля  Graph:
                константы, типы и переменные

     В модуле  Graph имеется много полезных описаний типов и
констант.  Ниже  приводится  часть интерфейсной секции файла
GRАРН.ТРU, на переменные которой вы можете ссылаться.

                         Константы

     Функцией GraphResult  возвращаются  следующие  значения
кодов ошибок:

 const
    { коды ошибок, возвращаемые процедурой GraphResult }
   grOk                     =  0;
   grNoInitGraph            = -1;
   grNotDetected            = -2;
   grFileNotFound           = -3;
   grInvalidDriver          = -4;
   grNoLoadMem              = -5;
   grNoScanMem              = -6;
   grNoFloodMem             = -7;
   grFontNotFound           = -8;
   grNoFontMem              = -9;
   grInvalidMode            = -10;
   grError                  = -11;  { общая ошибка графики }
   grIOError                = -12;
   grInvalidFont            = -13;
   grInvalidFontNum         = -14;


                                - 39 -


     Следующие константы драйверов и константы режимов можно
использовать при работе с процедурами InitGraph, DetectGraph
и GetModeRange:

   { определить графические драйверы }
 const
   Detect          = 0; { требуется автоматическое распозна-
                          вание }
   CGA             = 1;
   MCGA            = 2;
   EGA             = 3;
   EGA64           = 4;
   EGAMono         = 5;
   RESERVED        = 6; { зарезервировано (не используется) }
   HercMono        = 7;
   ATT400          = 8;
   VGA             = 9;
   PC3270          = 10;

   { графические режимы для каждого драйвера }
   CGAC1        = 0; { 1 палитра цветов 320х200: красный,
                       желтый, зеленый; 1 страница }
   CGAC2        = 1; { 2 палитра цветов 320х200: светло-
                       бирюзовый, малиновый, белый; 1
                       страница }
   CGAHi        = 2; { 640х200, 1 страница }
   MCGAC1       = 0  { 1 палитра цветов 320х200: красный,
                       желтый, зеленый; 1 страница }
   MCGAC2       = 1; { 2 палитра цветов 320х200: светло-
                       бирюзовый, малиновый, белый; 1
                       страница }
   MCGAMed      = 2; { 640х200, 1 страница }
   MCGAHi       = 3; { 640х480, 2 цвета, 1 страница }
   EGALo        = 0; { 640х200, 4 страницы }
   EGAHi        = 1; { 640х350, 16 цветов, 2 страницы }
   EGA64Lo      = 0; { 640х200, 16 цветов, 1 страница }
   EGA64Hi      = 1; { 640х350, 4 цвета, 1 страница }
   EGA64MonoHi  = 3; { 640х350, 64К на плату, 1 страница -

                                - 40 -


                       256К на плзту, 4 страницы }
   HercMonoHi   = 0; { 720х348, 2 страницы }
   ATT400C1     = 0; { 1 палитра цветов 320х200: красный,
                       желтый, зеленый; 1 страница }
   ATT400C2     = 1; { 2 палитра цветов 320х200: светло-
                       бирюзовый, малиновый, белый; 1
                       страница; 20 - 640х200, 1 страница }
   ATT400C3     = 3; { 3 палитра цветов 320х200: светло-
                       бирюзовый, малиновый, белый; 1
                       страница; 20 - 640х200, 1 страница }
   ATT400Med    = 4; { 640х200, 1 страница }
   ATT400Hi     = 5; { 640х200, 1 страница }
   VGALo        = 0; { 640х200, 16 цветов, 4 страницы }
   VGAMed       = 1; { 640х350, 16 цветов, 2 страницы }
   VGAHi        = 2; { 640х480, 16 цветов, 1 страница }
   VGANi2       = 3; { 640х480, 2 цвета, 1 страница }
   PC3270Hi     = 0; { 720х350, 1 страница }
   IBM8514LO    = 0; { 640х480 точек, 256 цветов }
   IBM8514HI    = 1; { 1024х768 точек, 256 цветов }

     Следующие константы можно  использовать  при  работе  с
процедурами SetPalette и SetAllPalette:

 const
  { цвета для процедур SetРаlette и SetАllРаlette }
   Black          = 0;      { черный }
   Blue           = 1;      { синий  }
   Green          = 2;      { зеленый }
   Cyan           = 3;      { бирюзовый }
   Red            = 4;      { красный }
   Magenta        = 5;      { малиновый }
   Brown          = 6;      { коричневый }
   LightGray      = 7;      { светло-серый }
   DarkGray       = 8;      { темно-серый }
   LightBlue      = 9;      { светло-голубой }
   LightGreen     = 10;     { светло-зеленый }
   LightCyan      = 11;     { светло-бирюзовый }
   LightRed       = 12;     { светло-красный }

                                - 41 -


   LightMagenta   = 13;     { светло-малиновый }
   Yellow         = 14;     { желтый }
   White          = 15;     { белый }

     Следующие константы цветов могут использоваться в  про-
цедуре  SetGRBPalette  для выбора стандартных цветов EGA при
работе с графической платой IBM 8514:

 const
  EGABlack          = 0;      { черный }
  EGABlue           = 1;      { синий  }
  EGAGreen          = 2;      { зеленый }
  EGACyan           = 3;      { бирюзовый }
  EGARed            = 4;      { красный }
  EGAMagenta        = 5;      { малиновый }
  EGABrown          = 20;     { коричневый }
  EGALightGray      = 7;      { светло-серый }
  EGADarkGray       = 56      { темно-серый }
  EGALightBlue      = 57;     { светло-голубой }
  EGALightGreen     = 58;     { светло-зеленый }
  EGALightCyan      = 59;     { светло-бирюзовый }
  EGALightRed       = 60;     { светло-красный }
  EGALightMagenta   = 61;     { светло-малиновый }
  EGAYellow         = 62;     { желтый }
  EGAWhite          = 63;     { белый }

     При работе с процедурами  GetLineStyle  и  SetLineStyle
можно использовать следующие константы типов линий:

 const
  { типы линий и их толщина для процедур Get или
    SetLineStyle }
   SolidLn       = 0;       { непрерывная линия }
   DottedLn      = 1;       { линия, состоящая из точек }
   CenterLn      = 2;       { центрированная линия }
   DashedLn      = 3;       { пунктирная линия }
   UserBitLn     = 4;       { тип линии, заданный пользова-
                              телем }

                                - 42 -


   NormWidth     = 1;       { обычная толщина }
   ThickWidth    = 3;       { жирная линия }

     При работе с процедурами  SetTextStyle  и  GetTextStyle
можно использовать следующие константы управления шрифтом:

 const
  { константы для процедур Set/GetTextStyle }
   DefaultFont  = 0;        { шрифт с побитовым отображением
                              8х8 }
   TriplexFont  = 1;        { "штриховой" шрифт }
   SmallFont    = 2;        { мелкий шрифт }
   SanScrifFont = 3;
   GothicFont   = 4;

   HorizDir       = 0;      { направление слева-направо }
   VertDir        = 1;      { снизу-вверх }
   NormSize       = 1;      { типовой размер }

     Для управления отсечением изображения при работе с про-
цедурой SetViewPort используйте следующие константы. При ус-
тановленном отсечении изображения оно  будет  обрезаться  на
границах области просмотра:

 const
  { константы отсечения }
   ClipOn  =  true;
   ClipOff =  false;

     Следующие константы можно  использовать  при  работе  с
процедурой  Bar3D. Они задают, будет ли следующий параллеле-
пипед располагаться на вершине  предыдущего  (таким  образом
столбец будет наращиваться):

 const
  { константы Bar3D }
   TopOn   = true;
   TopOff  = false;

                                - 43 -



     Следующие константы образцов заполнителей  используются
процедурами GetFillSettings и SetFillStyle. Чтобы определить
ваш собственный образец заполнителя (UserFill),  используйте
процедуру   SetFillPattern,   а   затем  вызовите  процедуру
SetFillStyle. Например:

     SetFillStyle(UserFill, SomeColor)

 const
  { образцы заполнителей для процедур Get/SetFill/Style }
   EmptyFill     = 0;   { заполнить область фоновым цветом }
   SolidFill     = 1;   { непрерывное заполнение област  за-
                          данным цветом }
   LineFill      = 2;   { заполнить --- }
   LtSlashFill   = 3;   { заполнить /// }
   SlashFill     = 4;   { заполнить жирными линиями ///}
   BkSlashFill   = 5;   { заполнить \\\ (жирными линиями) }
   LtBkSlashFill = 6;   { заполнить \\\ }
   HatchFill     = 7;   { заполнить редкой штриховкой }
   XHatchFill    = 8;   { заполнить частой пересекающейся
                          штриховкой }
   InterLeaveFill = 9;  { заполнить прерывистой линией }
   WideDotFill   = 10;  { заполнить редкими точками }
   CloseDotFill  = 11;  { заполнить частыми точками }

     Следующие операции используются при работе с процедура-
ми PutImage и SetWriteMode:

 const
    CopyPut         = 0;            { MOV }
    XORPut          = 1;            { XOR }

     Сдедующие операции используются  только  при  работе  с
процедурой PutImage:

 const
  { битовые операции для процедуры PutImage }

                                - 44 -


   OrPut      = 2;  { OR }
   AndPut     = 3;  { AND }
   NotPut     = 4;  { NOT }

     Для определения записи PaletteType и при работе с  про-
цедурами  GetPalette,  GetDefaultPAlette,  SetAllPalette ис-
пользуется следующая константа:

 const
    MaxColors  = 15;

     Для горизонтального и вертикального выравнивания текста
при  работе с процедурой SetTextJustify используются следую-
щие константы:

 const
  { горизонтальное и вертикальное выравнивание для  процеду-
ры SetТехtJustify }
  CenterText = 1;  { центрирование текста }
  LeftText   = 0;  { выравнивание по левому краю }
  RightText  = 2;  { выравнивание по правому краю }
  BottomText = 0;  { перемещение текста в нижнюю часть экра-
                     на }
  TopText    = 2;  { перемещение текста в верхнюю часть  эк-
                     рана }

                            Типы

     Следующая запись используется в процедурах  GetPalette,
GetDefaultPalette и SetAllPalette:

 type
   PaletteType = record;
       Size   : byte;
       Colors : array[0..MaxColors] of shortint;
   end;

     Данная запись используется процедурой GetLineSettings:


                                - 45 -


 type
   LineSettingType = record
       LineStyle   : word;
       Pattern     : word;
       Thickness   : word;

     Следующая      запись      используется      процедурой
GetTextSettings:

 type
   TextSettingsType = record;
       Font       : word;
       Direction  : word;
       CharSize   : CharSizeType;
       Horiz      : word;
       Vert       : word;
   end;

     Следующая      запись      используется      процедурой
GetFillSettings:

 type
   FillSettingsType = record;
       Pattern    : word;
       Color      : word;
   end;

     Следующая     запись      используется      процедурами
GetFillPattern и SetFillPattern:

 type
   FillPatternType = array[1..8] of byte; { тип заполнителя,
                                определяемый пользователем }

     Этот тип введен для вашего удобства. Обратите внимание,
что поля записи имеют тип integer, а не word:

 type

                                - 46 -


   PointType = record
      X, Y : integer;
    end;

     Следующая      запись      используется      процедурой
GetViewSettings  для  сообщении  о состоянии текущей области
просмотра:

 type
   ViewPotrType = record
      x1, y1, x2, y2 : word;
      Clip           : boolean;
    end;

     Следующая запись используется процедурой GetArcCoords и
может служить для получения информации о последнем обращении
к процедурам Arc или Ellipse:

 type
   ArcCoordsType = record
      X, Y : integer;
      Xstart, Ystart, Xend, Yend : integer;
    end;

                         Переменные

      Данные переменные первоначально указывают на программы
управления динамически распределяемой областью памяти модуля
Graph. Если ваша программа использует  собственные  средства
управления  динамически  распределяемой  областью, присвойте
адреса ваших программ ваших процедур выделения и  освобожде-
ния  памяти  соответственно переменным GraphGetMemPtr и Gra-
phFreeMemPtr:

   GraphGetMemPtr : Pointer { позволяет пользователям  заме-
                              нить распределение  динамичес-
                              кой области }
   GraphFreeMemPrt : Pointer { позволяет пользователям заме-

                                - 47 -


                               нить распределение динамичес-
                               кой области }

                    Процедуры и функции

------------------------------------------------------------
     Процедура Аrс - рисует дугу  окружности  от  начального
угла до конечного угла; точка  (x,y) берется в качестве цен-
тра окружности.
     Процедура Ваr - рисует  столбец,  используя текущий тип
закраски.
     Процедура Ваr3D - рисует  трехмерный столбец, используя
текущий тип закраски.
     Процедура Сirclе - рисует  окружность с центром в точке
(x,y).
     Процедура СlearDeviсе -  сбрасывает  текущие параметры,
установленные  для  устройства  вывода, и подготавливает его
для вывода.
     Процедура ClearViewPort - очищает текущую область прос-
мотра (окно экрана).
     Процедура CloseGraph -  выполняет  останов  графической
системы.
     Процедура DetectGraph - распознает аппаратуру и опреде-
ляет, какой графический драйвер и режим нужно использовать.
     Процедура DrawPoly -  рисует  многоугольник,  используя
текущий тип линии и цвет.
     Процедура Еllipse - рисует  эллиптическую  дугу  от на-
чального угла до конечного угла, использую (Х,Y), как  точку
центра.
     Процедура FillPoly - закрашивает многоугольник, исполь-
зуя преобразователь развертки.
     Процедура FloodFill - закрашивает ограниченную область,
используя текущий образец закраски.
     Процедура GetArcCoods - позволяет пользователю запраши-
вать координаты последней команды Аrс.
     Процедура GetAspectRatio - возвращает  действующее раз-
решение графического экрана, на  основе  которого может быть

                                - 48 -


вычислен коэффициент относительного удлиннения (Хаsр,Yаsр).
     Функция GetВkСоlor - возвращает текущий фоновый цвет.
     Функция GetСоlor - возвращает текущий цвет рисунка.
     Процедура GetDefaultPalette - в записи типа PaletteType
возвращает используемую по умолчанию палитру.
     Функция GerDriverName - возвращает  строку,  содержащую
имя текущего драйвера.
     Процедура GetFillPattern - возвращает последний образец
заполнителя,  установленный  с помощью обращения к процедуре
SetFillPattern.
     Процедура GetFillSetting - позволяет  пользователю  вы-
полнить запрос о текущем образце и цвете  закраски, установ-
ленными с помощью процедур SetFillStyle и SetFillPattern.
     Функция GetGraphMode - возвращает  текущий  графический
режим.
     Процедура GetImage - сохраняет двоичный  образ заданной
области в буфере.
     Процедура GetLineSettings - возвращает  текущий тип ли-
нии, образец  линии и  толщину  линии,  заданные  процедурой
SetLineStyle.
     Функция GetMaxColor - возвращает максимальное  значение
цвета, которое можно передать процедуре SetColor.
     Функция GetMAxMode - возвращает максимальный номер  ре-
жима для текущего загруженного драйвера.
     Функция  GetМахХ -  возвращает для текущего графическо-
го драйвера и режима самую правую колонку (разрешение по х).
     Функция  GetМахY -  возвращает для текущего графическо-
го драйвера и режима самую нижнюю строку (разрешение по у).
     Процедура GetPalette - возвращает текущую палитру и  ее
размер.
     Функция  GetPaletteSize  -  возвращает  размер  таблицы
просмотра палитры.
     Функция GetPixel - возвращает значение элемента изобра-
жения в точке Х,Y.
     Процедура GetТехtSettings - возвращает текущий  тексто-
вый шрифт, направление, размер и выравнивание для  него, ус-
тановленные с помощью процедур SetТехtStyle и SetТехtJustify.

                                - 49 -


     Процедура GetViewSettings - позволяет  пользователю вы-
дать запрос о текущей области изображения и параметрах отсе-
чения изображения.
     Функция GetХ - возвращает координату Х  текущей позиции
(текущего указателя).
     Функция GetY - возвращает координату Y  текущей позиции
(текущего указателя).
     Функция GraphErrorMsg - для заданного кода ошибки возв-
ращает строку сообщения об ошибке.
     Функция GraphResult - возвращает код ошибки для послед-
ней графической операции.
     Функция ImageSize - возвращает  число  байтов,  которые
требуются для сохранения прямоугольной области экрана.
     Процедура InitGraph - инициализирует графическую систе-
му и переводит аппаратуру в графический режим.
     Функция InstallUserDriver -  устанавливает  добавленный
пользователем драйвер в таблице драйверов устройств BGI.
     Функция  InstallUserFont  -  устанавливает  новый  файл
шрифта, не встроенный в графическую систему.
     Процедура Line - рисует прямую линию из точки (x1,y1) в
(x2,y2).
     Процедура LineRel -  рисует   прямую  линию  до  точки,
представляющей  собой  относительное  расстояние от текущего
указателя.
     Процедура LinеТо - рисует линию из текущего положения в
точку (x,y).
     Процедура МоveRеl -  перемещает  текущий  указатель  на
расстояние, являющееся  относительным расстоянием от текущей
позиции.
     Процедура МоvеТо - перемещает текущий указатель в точку
(x,y).
     Процедура ОutТехt - посылыет строку на устройство выво-
да, начиная с текущего указателя.
     Процедура ОutТехtХY - посылает строку на устройство вы-
вода.
     Процедура РieSlice - рисует сектор; точка (Х,Y) исполь-
зуется в качестве центра, а сектор рисуется от начального до
конечного угла.

                                - 50 -


     Процедура РutImagе - выводит на экран двоичный образ.
     Процедура РutРiхеl - строит элемент изображения в точке
x,y.
     Процедура Rесtanglе - рисует  прямоугольник,  используя
текущий тип линии и цвет.
     Функция  RegisterBGIDriver  -  регистрирует  допустимый
драйвер (формата BGI) в графической системе.
     Функция RegisterBGIFont -  регистрирует  в  графической
системе допустимый (формата BGI) шрифт.
     Процедура RеstorеСRТ - восстанавливает для Сrt видеоре-
жим, установленный при загрузке.
     Процедура RеstoreСRТМоdе - восстанавливает исходный ре-
жим экрана, который был  установлен при инициализации графи-
ки.
     Процедура SetActivePage - устанавливает для графическо-
го вывода активную страницу.
     Процедура SetAllPalette - изменяет все  цвета  палитры,
как было указано.
     Процедура SetAspectRatio - изменяет принятый по умолча-
нию коэффициент относительного удлиннения.
     Процедура SetВkСоlor - используя палитру, устанавливает
текущий фоновый цвет.
     Процедура SetColor - используя  палитру,  устанавливает
текущий цвет рисунка.
     Процедура SetFillPattern - выбирает  образец  закраски,
заданный пользователем.
     Процедура SetFillStyle - устанавливает образец закраски
и ее цвет.
     Процедура SetGraphBufSize - позволяет  изменить  размер
буфера, используемого для опроса и закраски.
     Процедура SetGraphMode - переключает систему  в  графи-
ческий режим и очищает экран.
     Процедура SetLineStyle - устанавливает  текущий тип ли-
нии и ее ширину.
     Процедура SetPalette - изменяет один цвет  палитры, за-
данный переменными Colornum и Color.
     Процедура SetGRBPalette - позволяет модифицировать  за-
писи палитры для драйверов IBM-8514 и VGA.

                                - 51 -


     Процедура SetТехtJustify -   с   помощью    ОutТеxt   и
ОutТехтХY устанавливает значения для выравнивания текста.
     Процедура SetТехtStyle -   задает   текущий   текстовый
шрифт, его тип и коэффициент размера символа.
     Процедура SetUserCharSize - позволяет вам для штриховых
шрифтов изменить высоту и ширину символа.
     Процедура SetViewPort - для  графического  вывода уста-
навливает текущую область вывода или окно.
     Процедура SetVisualPage - задает визуальный номер стра-
ницы графики.
     Процедура SetWriteMode - устанавливает режим вывода  на
экран  (копирование  или  с помощью операции XOR) для линий,
вычерчиваемых процедурами DrawPoly, Line,  LineRel,  LineTo,
Rectangle.
     Функция ТехtНеight - возвращает высоту страниц  в  эле-
ментах изображения.
     Функция ТехtWidth - возвращает ширину строки в  элемен-
тах изображения.
------------------------------------------------------------

     Подробное описание каждой процедуры и  функции  дано  в
Главе 16.

                       Модуль Тurbo3

     Каждая программа в этом модуле является повторением или
улучшенным вариантом программ из других стандартных модулей.
Модуль Тurbo3 предусмотрен только в целях обратной совмести-
мости.  С  помощью  модуля  Тurbo3 вы можете добиться лучшей
совместимости с  версией  3.0,  но потеряете при этом прямой
доступ к важным  новым средствам, которые дублируются здесь.
(Заметим,   что вы можете использовать эти стандартные прог-
раммы с  помощью дополнительного синтаксиса блока. Так, нап-
ример,    МемАvail    модуля    Тurbo3    вызывает   функцию
Systтем.МемАvail, даже если в своей программе вы используете
модуль Тurbo3. Более подробно о том, как  использовать прог-
раммы с теми же именами в  других  блоках,  рассказывается в
Главе 4, в разделе "Модули и связанные и ними тонкости".)

                                - 52 -



      Примечание: Описанные далее  программы  не  описаны  в
      справочном разделе Главы 16.  Более подробная информа-
      ция о программах модуля  Тurbo3 содержится в "Справоч-
      ном руководстве по Турбо-Паскалю, версия 3.0".


                    Интерфейсная секция

     Приведем пример интерфейсной секции модуля Тurbo3:

   unit Turbo3;
   interface
   uses Crt;
   var
     Kbd: Text;
     Cbreak: Boolean absolute CheckBreak;
   function MemAvail: integer;
   function MaxAvail: integer;
   function LongFileSize(var F): real;
   function LongFIlePos(var F): real;
   procedure LongSeek(var F; Pos: real);
   procedure HighVideo;
   procedure NormVideo;
   procedure LowVideo;
   function IOResult : integer;

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

                        Драйвер Кbd

     Этот драйвер предусмотрен для программ версии 3.0,  ко-
торые    считывают    данные    с    клавиатуры   (например,
Rеаd(Кbd,СharVar)). Заметим, что теперь эта функция включена
в модуль Сrt и  называется  RеаdКеy.  Поэтому ее следует ис-
пользовать вместо Rеаd(Кbd,СharVar). Далее следуют две прог-
раммы, которые считывают символ  с  клавиатуры  и  сообщает,

                                - 53 -


была ли нажата клавиша из  расширенного набора (F1,F2, левая
стрелка и т.д.):

  program TestKbd;
  uses Crt, Turbo3;
  var
    c: char;
  begin
    Read(Kbd, c);
    if (c = #27) and KeyPressed then
    begin
      Read(Kbd, c);
      Writeln('Extended key:', c);
    end
    else
      Writeln(c);
  end;

     Заметим, что драйвер Кbd преобразует клавиши  расширен-
ного набора от (ноль +  символ)  до  (ЕSС +  второй символ).
Поскольку клавиша ЕSС ( 27) - это обычная клавиша, использу-
емая для ввода с  клавиатуры, то для того, чтобы определить,
была ли нажата перой клавиша с кодом  27 из расширенного на-
бора или действительно использовалась клавиша ЕSС, нужно ис-
пользовать функцию  КеyРressed. Если была нажата клавиша ЕSС
и за ней до того, как программа смогла распознать ЕSС, быст-
ро последовал другой символ, то две клавиши были бы ошибочно
распознаны, как клавиши из расширенного набора.
     В версии 5.0 Турбо-Паскаля:

 program TestReadKey;
 uses Crt;
 var
   c : char;
 begin
   c := ReadKey;
   if (c = #0) then
      Writeln('Extended key: ', ReadKey);

                                - 54 -


   else
      Writeln(c);
   end;

     Исходный код в версии 5.0 имеет меньший объем (и выпол-
няется быстрее) и не содержит двусмысленности по отношению к
нажатию первого символа при использовании расширенного набо-
ра клавиш.  (Невозможно  иначе получить нулевой символ с по-
мощью  клавиатуры,  кроме  как воспользовавшись клавишами из
расширенного набора.)

                     Переменная Сbrеаk

     Переменная   Сbrеаk   в  версии   5.0  переименована  в
СhесkBreak. Обратная совместимость достигается путем присво-
ения переменной Сbreak того же адреса, что и СhесkBreak, ко-
торая описывается в  модуле  Сrt.  Оператор  Сbreak := Falsе
выключает проверку на  нажатие клавиш Сtrl-Вreak, а оператор
Сbreak := Тruе снова ее включает.
     В модуле Тurbо3 имеются следующие процедуры и функции:

------------------------------------------------------------
     Функция МемАvail - возвращает число  свободных парагра-
фов для имеющейся динамически рапределяемой области памяти.
     Функция МахАvail - возвращает размер наибольшего непре-
рывного свободного блока в динамически распределяемой облас-
ти (в параграфах).
     Функция LongFileSize - возвращает объем файла.  Возвра-
щаемое значение представляет собой вещественное число.
     Функция LongFilePos - возвращает для файла  текущую по-
зицию файла.  Возвращаемое значение  представляет  собой ве-
щественное число.
     Процедура LongSeek - перемещает текущую позицию файла к
заданному элементу. Для задания номера элемента используется
параметр, представляющий собой действительное число.
     Процедура HighVideo - устанавливает видеоатрибут в жел-
тый на черном фоне (цветные системы)  белый  на  черном фоне
(черно-белые, монохроматические системы).

                                - 55 -


     Процедура NormVideo - то же, что и HightVideo. Устанав-
ливает видеоатрибут в желтый на черном  фоне (цветные систе-
мы) белый на черном  фоне  (черно-белые,  монохроматические
системы).
     Процедура LowVideo - устанавливает видеоатрибут в свет-
ло-серый на черном фоне (LigthGray).
     Функция IОRеsult - возвращает целое значение, представ-
ляющее  собой  состояние  последней выполненой операции вво-
да-вывода. Там,  где  это  возможно, функция IOResult модуля
Тurbо3 возвращает коды, совместимые с кодами версии 3.0.
------------------------------------------------------------

                       Модуль Graph3

     Модуль Graph3  -  это  прямая  реализация  графического
драйвера,  использующего только относительные команды, кото-
рый имеется в версии 3.0 Турбо-Паскаля.  В версии  3.0  Тур-
бо-Паскаля драйвер, использующий относительные команды, сос-
тоял из двух файлов -  GRAPH.Р и GRAPH.ВIN.  GRAРН.Р в  дей-
ствительности определяет программы внешнего  машинного кода,
содержащегося в GRAPH.BIN.  Модуль Graph3 объединяет GRAPH.Р
и GRAPH.BIN в один  блок,  сохраняющий  свое  функциональное
назначение. Единственное изменение, которое вы должны внести
в программу, использующую версию 3.0 Турбо-Паскаля  и  драй-
вер, работающий с  относительными  командами,  это  удаление
директивы компилятора {$I GRAPH.Р} и замена ее в предложении
использования (uses) программы ссылками на Сrt и Graph3.

      Примечание:  Приводимые  далее  программы не описаны в
      справочном разделе Главы 16.  Более подробная информа-
      ция по  программам модуля Graph3 содержится в справоч-
      ном руководстве по версии 3.0 Турбо-Паскаля.

             Процедуры и функции модуля Graph3

------------------------------------------------------------
     Процедура GraphColorMode - устанавливает цветной графи-
ческий режим 320х200.

                                - 56 -


     Процедура GraphMode - устанавливает черно-белый  графи-
ческий режим 320х200.
     Процедура Hires - устанавливает для экрана  графический
режим с разрешением 640х200.
     Процедура Раlette - активизирует заданную  палитру цве-
тов.
     Процедура HiResColor - выбирает  цвета,  использующиеся
для изображений в графике  с  высокой  разрешающей способно-
стью.
     Процедура GraphBackGround -  устанавливает фоновый цвет
экрана.
     Процедура GraphWindow - возволяет вам в любом гарфичес-
ком режиме определить область экрана, как активное окно.
     Процедура Plot - строит точку заданного  цвета с задан-
ными координатами.
     Процедура Draw - рисует  прямую  линию  заданного цвета
между заданными точками.
     Процедура ColorTable -  задает  таблицу  преобразования
цветов, которая позволяет для  текущего цвета в любой задан-
ной точке определить новый  цвет этой точки, когда она будет
заново нарисована.
     Процедура Аrс -  используя  заданные  параметры  рисует
дугу.
     Процедура Circle - рисует окружность.
     Процедура GetPic - копирует содержимое области на экра-
не в буфер.  Это содержимое можно  потом  восстановить с по-
мощью процедуры PutPic.
     Процедура PutPic - копирует содержимое буфера.
     Процедура GetDotColor -  возвращает  значение  цвета  в
точке в указанном месте.
     Процедура FillScreen - заполняет все активное окно ука-
занным цветом.
     Процедура FillShape - заполняет заданным цветом область
любой формы.
     Процедура FillPattern - заполняет прямоугольную область
по текущему образцу, используя указанный цвет.
     Процедура Pattern -  определяет  образец  8х8,  который
должен использоваться в процедуре FillPattern.

                                - 57 -


     Процедура Васk - [для графики, использующей относитель-
ные команды] перемещает маркер назад на заданное расстояние.
     Процедура Forwd - [для  графики,  использующей  относи-
тельные команды]  перемещает  маркер вперед на заданное рас-
стояние.
     Процедура ClearScreen - [для графики,  использующей от-
носительные команды] очищает активное окно и перемещает мар-
кер в начало экрана.
     Процедура Неаding - [для графики,  использующей относи-
тельные команды] возвращает текущую головку маркера.
     Процедура HideTurtle - [ для графики,  использующей от-
носительные команды] делает маркер невидимым.
     Процедура Номе - [для графики, использующей относитель-
ные команды] помещает маркер в начало (левый верхний угол)
украна.
     Процедура NoWrap - [для графики,  использующей  относи-
тельные команды] запрещает автоматический переход  маркера к
началу следующей строки при достижении границы экрана.
     Процедура РеnDown - [для графики, использующей  относи-
тельные команды] "опускает"  маркер (аналог поднятия пера на
графопостроителе), так что любое перемещение маркера  приво-
дит к вычерчиванию линии.
     Процедура РеnUр - [для  графики,  использующей  относи-
тельные команды] "поднимает" маркер. При этом его можно  пе-
ремещать без вычерчивания линии.
     Процедура SetHeading - [для графики, использующей отно-
сительные команды] поворачивает головку маркера на  заданный
угол.
     Процедура SetPenColor - [для графики,  использующей от-
носительные команды]  устанавливает  цвет,  используемый для
рисунка при перемещении маркера.
     Процедура SetPosition - [для графики, использующей  от-
носительные команды] перемещает маркер в  точку с  заданными
координатами без вычерчивания линии.
     Процедура ShowTurtle - [для графики, использующей отно-
сительные команды] делает маркер видимым.
     Процедура TurnLeft - [для графики, использующей относи-
тельные команды] поворачивает головку  маркера влево (против

                                - 58 -


часовой стрелки).
     Процедура TurnRight - [для графики,  использующей отно-
сительные команды] поворачивает  головку  маркера вправо (по
часовой стрелке).
     Процедура TurnWindow - [для графики, использующей отно-
сительные команды]  определяет  область экрана, как активную
область.
     Процедура TurtleThere - [для  графики, использующей от-
носительные команды] проверяет,  является ли маркер в актив-
ном окне экрана видимым.
     Процедура TurtleDelay - [для  графики, использующей от-
носительные команды] устанавливает задержку между каждым пе-
ремещением маркера.
     Процедура Wrap - [для графики, использующей относитель-
ные команды] автоматически перемещает маркер к противополож-
ной границе экрана при достижении края экрана.
     Процедура ХСоr - [для графики, использующей относитель-
ные команды] возвращает текущую Х-координату маркера.
     Процедура YСоr - [для графики, использующей относитель-
ные команды] возвращает текущую Y-координату маркера.
------------------------------------------------------------



