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

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

ВИД
  Доступ- = ДОСТУП К Вид;  (* СтрокиПамятки.Доступ <- Надел.Доступ <- Рамка.Доступ *)
                     Вид- =
  НАБОР (Надел.Вид)        (* СтрокиПамятки.Вид    <- Надел.Вид    <- Рамка.Вид    *)
    памяткаД :Памятка.Доступ;
                           (* строки памятки: *) 
    последняя:ЦЕЛ;                          (* из добавленных в хвост очереди *)
    верхняя  :ЦЕЛ;                          (* первая из добавленных *)
    текущая- :ЦЕЛ;
  КОН;

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

  памяткаД:=строкиД.памяткаД;
    строка:=строкиД.верхняя;

  ОТ со:=вс+1 ДО нс-1 ВЫП
    ЕСЛИ
         строка = строкиД.текущая
    ТО
      цвет:=Надел.цветОтметкиСтрокиПамятки
    ИНАЧЕ
      цвет:=Надел.цветСтроки
    КОН;
    Окно.ЦветнойПробел(со,лк,со,пк,цвет);
    Окно.ЦепьЗнаков(со,лк+1,со,пк-1,памяткаД.рСтроки[строка]^);
    УВЕЛИЧИТЬ(строка)
  КОН;
  Окно.ЦветнойПробел(вс,лк,вс,пк,Надел.цветСтроки);
  Окно.ЦветнойПробел(нс,лк,нс,пк,Надел.цветСтроки);
  Окно.Рамка1(вс,лк,нс,пк)
КОН Отрисовка;

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА                                                    (*СтрокиПамятки.Вид)*)
       СтрокуВыше(строкиД:СтрокиПамятки.Доступ);
УКАЗ
  ЕСЛИ
              строкиД.текущая > 0
  ТО
    УМЕНЬШИТЬ(строкиД.текущая);
    ЕСЛИ
              строкиД.текущая < строкиД.верхняя
    ТО
              строкиД.верхняя:=строкиД.текущая
    КОН;
    Отрисовка(строкиД)
  КОН
КОН СтрокуВыше;

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

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА                                     (* (СтрокиПамятки.Вид <- Надел.Вид)*)(* приём посылок из вне (снаружи) *)
       Приём(наделД:Надел.Доступ;
           посылка+:Ввод.нПосылка); (* = Пустой.Вид; - абстрактный опорный набор *)
ПЕР
  строкиД:СтрокиПамятки.Доступ;
УКАЗ                                                         (* преобразование
           наделД                       из Надел.Доступ в
                  СтрокиПамятки.Доступ  <- Надел.Доступ <- Рамка.Доступ *)
  строкиД:=наделД(СтрокиПамятки.Доступ);
                             (* анализ многоформия (полиморфизма) у <посылка> = Пустой.Вид *)
  ДЛЯ      посылка ВИДА
  | Поле.нОтрисовка:
      Отрисовка(строкиД)

  | Ввод.нОтМышки:
           посылка.отработана:=ВКЛ;
      ЕСЛИ
           Ввод.прокрут В посылка.события
      ТО
        ЕСЛИ
           посылка.прокрут > 0
        ТО
          СтрокуВыше(строкиД)
        ИНАЧЕ
          СтрокуНиже(строкиД)
        КОН
      ИНАЧЕ                     (* нажали кнопку *)
        ЕСЛИ
           посылка.с = 0
        ТО
          СтрокуВыше(строкиД)
        АЕСЛИ
           посылка.с = строкиД.нс - строкиД.вс
        ТО
          СтрокуНиже(строкиД)
        ИНАЧЕ
          строкиД.текущая:=строкиД.верхняя + посылка.с -1;
          Отрисовка(строкиД);
           посылка.отработана:=ОТКЛ
        КОН
      КОН

  | Ввод.нОтКлавиш:
      ВЫБРАТЬ
           посылка.код
      ИЗ
(* <-,^ *) | 25H,26H: 
                     СтрокуВыше(строкиД);
                     посылка.код:=0
(* ->,V *) | 27H,28H: 
                     СтрокуНиже(строкиД);
                     посылка.код:=0
      ИНАЧЕ
      КОН
  ИНАЧЕ
  КОН
КОН Приём;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~общедоступная ЗАДАЧА~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА                                                    (*СтрокиПамятки.Вид)*)
       Создать-(верх,
                лево,
                строк,
                колонок:ЦЕЛ;
               памяткаД:Памятка.Доступ):СтрокиПамятки.Доступ;
ПЕР
                    строкиД:СтрокиПамятки.Доступ;
УКАЗ
            СОЗДАТЬ(строкиД);
  Надел.Подготовить(строкиД,
                       верх,
                       лево,
                      строк,
                    колонок,
  {Надел.признакВыбираемый},
                      Приём   (* посылок для <наделД> *)
                   );
                    строкиД.памяткаД :=памяткаД;
                    строкиД.последняя:=памяткаД.строк-1;
            ВОЗВРАТ строкиД
КОН Создать;

КОН СтрокиПамятки.
