(*~\Глагол\Отделы\Поле\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                           ОТДЕЛ Рамка;
(*============================================================================* 
 * НАЗНАЧЕНИЕ: размеры и местоположение для Поле и Надел
 *============================================================================*)

ВИД
  Доступ- = ДОСТУП К Вид;  (* Рамка.Доступ - опорный ВИД доступа *)

                     Вид- =(* Рамка.Вид    - опорный ВИД набор   *)
  НАБОР
                                       (* расположение на экране границ рамки *)
    вс-    :ЦЕЛ;    (* верхняя строка   *)
    лк-    :ЦЕЛ;    (* левая колонка    *)
    нс-    :ЦЕЛ;    (* нижняя строка    *)
    пк-    :ЦЕЛ;    (* правая колонка   *)

                    (*--- размеры и положение относительно окружающего поля --*)

    верх   :ЦЕЛ;    (* при < 0 расстояние от нижней внешней границы поля
                     *                                                   до верхней строки *)
    лево   :ЦЕЛ;    (* при < 0 расстояние от правой внешней границы поля
                     *                                                   до левой колонки *)
    строк  :ЦЕЛ;    (* при <= 0 расстояние нижней границы поля 
                     *                                                   до нижней строки *)
    колонок:ЦЕЛ;    (* при <= 0 расстояние от правой границы поля
                     *                                                   до правой колонки *)
  КОН;


(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА                                                           (*(Рамка.Вид)*)
       Выставить-(рамкаД,полеД:Рамка.Доступ);
(*
 * Выставляет границы <рамкаД> на экране, учитывая положение окружающего <полеД>
 *)
УКАЗ
                                      (* перевод левого верхнего угла *)
  ЕСЛИ
       рамкаД.верх < 0
  ТО
    рамкаД.вс:=полеД.нс+1+рамкаД.верх
  ИНАЧЕ
    рамкаД.вс:=полеД.вс  +рамкаД.верх
  КОН;
  ЕСЛИ
       рамкаД.лево < 0
  ТО
    рамкаД.лк:=полеД.пк+1+рамкаД.лево
  ИНАЧЕ
    рамкаД.лк:=полеД.лк  +рамкаД.лево
  КОН;
                                      (* перевод правого нижнего угла *)
  рамкаД.нс:=рамкаД.вс+рамкаД.строк-1;
  рамкаД.пк:=рамкаД.лк+рамкаД.колонок-1;
  ЕСЛИ
       рамкаД.строк <= 0
  ТО
    рамкаД.нс:=полеД.нс+рамкаД.строк
  КОН;
  ЕСЛИ
       рамкаД.колонок <= 0
  ТО
    рамкаД.пк:=полеД.пк+рамкаД.колонок
  КОН
КОН Выставить;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА                                                           (*(Рамка.Вид)*)
       Подготовить-(рамкаД:Рамка.Доступ;
                    верх,
                    лево,
                    строк,колонок:ЦЕЛ);
УКАЗ
  рамкаД.верх:=верх;
  рамкаД.лево:=лево; 
  рамкаД.строк:=строк;
  рамкаД.колонок:=колонок;
                          (* если это положение относительно экрана *)
  рамкаД.вс:=верх;
  рамкаД.лк:=лево; 
  рамкаД.нс:=верх+строк-1;
  рамкаД.пк:=лево+колонок-1
КОН Подготовить;

КОН Рамка.
