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

ИСПОЛЬЗУЕТ
  Надел,
  Памятка,
  СтрокиПамятки,
  Поле,
        (*  \Глагол\               *)
  Ввод    ИЗ "..\..\Отделы\Обмен\";

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА                                                            (*(Поле.Вид)*)
       Приём(полеД:Поле.Доступ;
          посылка+:Ввод.нПосылка); (* = Пустой.Вид; - абстрактный опорный набор *)
ПЕР
        кодПосылки:ЦЕЛ;         (* получить и обработать управляющие послания *)
УКАЗ      (*
           * полеД:Поле.Доступ - НЕ надо преобразовывать
           *)
                             (* анализ многоформия (полиморфизма) у <посылка> = Пустой.Вид *)
  ДЛЯ     посылка ВИДА
  | Ввод.нОтКлавиш:
       кодПосылки:=посылка.код;
                   посылка.код:=0;         (* скорее всего отработаем посылку *)
      ВЫБРАТЬ кодПосылки ИЗ
      | 1BH: полеД.состояние:=Поле.состОтмена (* Esc *)
      | 79H: полеД.состояние:=Поле.состДалее  (* F10 *)
      | 0DH: полеД.состояние:=Поле.состДалее  (* Ent *)
      ИНАЧЕ
          посылка.код:=кодПосылки
      КОН
  | Ввод.нОтМышки:
      ЕСЛИ
           НЕ (Ввод.прокрут В посылка.события)
      ТО
             полеД.состояние:=Поле.состДалее;
          посылка.отработана:=ВКЛ
      КОН
  ИНАЧЕ
  КОН             
КОН Приём;

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

УКАЗ
  верх:=холстД.вс+1;
  лево:=холстД.лк;
  строк:=окружениеД.нс-верх+1;
  ЕСЛИ
       строк > памяткаД.строк+2
  ТО
       строк:=памяткаД.строк+2
  КОН;
  колонок:=холстД.пк-лево+1;
    полеД:=         Поле.Создать(верх,лево,строк,колонок,ПУСТО,ОТКЛ,Приём (* посылок для <полеД> *) );
  строкиД:=СтрокиПамятки.Создать(0,0,строк,колонок,памяткаД);

    Поле.ДобавитьНадел(полеД,строкиД);

                             (*--- основная работа ---*)

(*......................................................... проверяем <полеД> *)
    Поле.Рисовать(полеД);
  ПОВТОРЯТЬ

    Поле.Проверить(полеД)

  ДО полеД.состояние # Поле.состРабота;
(*................................................. восстанавливаем окружение *)

    Поле.Рисовать(окружениеД);

(*...................................................... перебрасываем данные *)
  ЕСЛИ
       полеД.состояние = Поле.состДалее
  ТО
    ВОЗВРАТ строкиД.текущая
  ИНАЧЕ
    ВОЗВРАТ -1
  КОН
КОН Выполнить;

КОН ПолеПамятки.
