(*~\Глагол\ПриложенияКОС\ОболочкаКОС\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                           ОТДЕЛ ОболочкаКОС+;
(*============================================================================*)
(* НАЗНАЧЕНИЕ:                                                                *
 *         Приложение для ввода и преобразование программ на рус.ЯП Глагол    *
 *      ( консольная оболочка для Преобразователя Глагола - ОболочкаКОС.exe ) *)
(*============================================================================*)

ИСПОЛЬЗУЕТ
(*                 из \Глагол\                  *)
  Положение         ИЗ "..\..\Отделы\Оболочка\",
  ПолеПриложение    ИЗ "..\..\Отделы\Оболочка\",
  ПолеНастройки     ИЗ "..\..\Отделы\Оболочка\",
  ПолеПоискЗамена   ИЗ "..\..\Отделы\Оболочка\",
(*       из \Глагол\                  *)
  Справка ИЗ "..\..\Отделы\Оболочка\",
(*       из \Глагол\                  *)
  Текст   ИЗ "..\..\Отделы\Обмен\",
  ОС      ИЗ "..\..\Отделы\Обмен\",
  Окно    ИЗ "..\..\Отделы\Обмен\",
  Ввод    ИЗ "..\..\Отделы\Обмен\",
    Файл  ИЗ "..\..\Отделы\Обмен\",
   ВФайл  ИЗ "..\..\Отделы\Обмен\ВводВывод\",
  ИзФайла ИЗ "..\..\Отделы\Обмен\ВводВывод\",
(*       из \Глагол\                         *)
 оЗнака   ИЗ "..\..\Отделы\Иное\",
 оЦепи    ИЗ "..\..\Отделы\Иное\",
(*                 из \Глагол\               *)
  Рамка             ИЗ "..\..\Отделы\Поле\",
  Надел             ИЗ "..\..\Отделы\Поле\",
  Поле              ИЗ "..\..\Отделы\Поле\",
  ПолеВвода         ИЗ "..\..\Отделы\Поле\",
  ПолеСВосклицанием ИЗ "..\..\Отделы\Поле\",
  ПолеСВопросом     ИЗ "..\..\Отделы\Поле\",
  Закладки          ИЗ "..\..\Отделы\Поле\",
  Кнопка            ИЗ "..\..\Отделы\Поле\",
  Памятка           ИЗ "..\..\Отделы\Поле\",
  Холст             ИЗ "..\..\Отделы\Поле\";

ПОСТ
                  (* начальный размер поля *)
  Строк  = 30;
  Колонок= 80;
                  (* действия кнопок *)
  діяПомощь   = 1;
  діяСохранить= 2;
  діяОткрыть  = 3;
  діяИскать   = 4;
  діяНастроить= 5;
  діяЗапуск   = 6;
  діяВыход    = 7;
                      (*--- локальные переменные ---*)
ПЕР
  полеД                   :     Поле.Доступ;  (* поле приложения *)
  закладкиНаХолстеД       : Закладки.Доступ;  (* закладки для холстов *)
  положениеУказкиНаХолстеД:Положение.Доступ;  (* положение указки на текущем холсте *)
               наВесьЭкран:          КЛЮЧ;    (* текущий размер поля *)

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА задПолеНаВесьЭкран;
(*
 * Расширяет поле на весь экран или восстанавливает его исходный размер
 *)
ПЕР
  всегоСтрок,
  всегоКолонок:ЦЕЛ;
       строк,
       колонок:ЦЕЛ;
УКАЗ
  ЕСЛИ
       наВесьЭкран
  ТО                (* уже расширено *)
    строк:=Строк;
    колонок:=Колонок
  ИНАЧЕ
    Окно.РазмерЭкрана(всегоСтрок,всегоКолонок);
    строк:=всегоСтрок-3;
    колонок:=всегоКолонок
  КОН;
  наВесьЭкран:=НЕ наВесьЭкран;
  Рамка.Подготовить(полеД,0,0,строк,колонок);
  Поле.ОкноНаВсёПоле(полеД);
  Поле.Рисовать(полеД)
КОН задПолеНаВесьЭкран;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА задПомощь;                                     (* Неотложная помощь F1 *)
УКАЗ
  Справка.Раздел("Obolochka.htm")
КОН задПомощь;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА задСправка;                              (* Справка по отделам Ctrl-F1 *)
ПЕР
  понятие:ЦЕПЬ[100];
       холстД:Холст.Доступ;
УКАЗ
       холстД:=закладкиНаХолстеД.холстД;
  ЕСЛИ
       холстД = ПУСТО
  ТО
    ВОЗВРАТ
  КОН;
  Холст.ПонятиеВЦепь(холстД,понятие);
  Справка.Ключ(понятие)
КОН задСправка;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА задОткрытьФайл;
ПЕР
  имяФайла:Файл.ВПолного;
УКАЗ
  имяФайла:="";
  ЕСЛИ
       ПолеВвода.Выполнить("Открыть",50,полеД,4,"введите имя файла",имяФайла) = Поле.состДалее
  ТО
    Закладки.Открыть(закладкиНаХолстеД,имяФайла)
  КОН
КОН задОткрытьФайл;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА задСохранитьКак(холстД:Холст.Доступ);
ПЕР
  имяФ:Файл.ВПолного;
УКАЗ
  ЕСЛИ
        холстД = ПУСТО
  ТО
    ВОЗВРАТ
  КОН;
  имяФ:=холстД.имяФ;
  ЕСЛИ
       ПолеВвода.Выполнить("Сохранить",50,полеД,0,"введите имя файла",имяФ) = Поле.состДалее
  ТО
    ЕСЛИ
          Холст.ЗаписатьВФайл(холстД,имяФ)
    ТО 
        Закладки.Открыть(закладкиНаХолстеД,имяФ)
    КОН
  КОН
КОН задСохранитьКак;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА задСохранитьХолст(холстД:Холст.Доступ);
УКАЗ
  ЕСЛИ холстД = ПУСТО ТО
    ВОЗВРАТ
  КОН;
  ЕСЛИ
       Холст.СохранитьВФайл(холстД)
  ТО
  КОН
КОН задСохранитьХолст;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА задЗакрытьХолст(холстД:Холст.Доступ);
ПЕР
  цОтвет:ЦЕЛ;
  вопрос:ЦЕПЬ[100];
УКАЗ
  ЕСЛИ холстД = ПУСТО ТО
    ВОЗВРАТ
  КОН;
  ЕСЛИ холстД.изменён = "*" ТО
    вопрос:="Сохранить отдел ";
    оЦепи.ДобавитьВКонец(вопрос,холстД.имя);
    оЦепи.ДобавитьВКонец(вопрос," ?");

         цОтвет:=ПолеСВопросом.Выполнить("Вопрос",1,ДЛИНА(вопрос),полеД,0,вопрос);
    ЕСЛИ
         цОтвет = Поле.состОтмена
    ТО
      ВОЗВРАТ
    КОН;
    ЕСЛИ
         цОтвет = ПолеСВопросом.состДа
    ТО
      задСохранитьХолст(холстД)
    КОН
  КОН;
  Закладки.Удалить(закладкиНаХолстеД)
КОН задЗакрытьХолст;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА задИскать(заменить,     (* ВКЛ\ОТКЛ ключа замен в Холст.поиск.заменить *)
                   сПолем,     (* ВКЛ\ОТКЛ поиск с заменой на Поле Закладки на Холсте *)
                 наоборот :КЛЮЧ     (* инверсия поиска в Холст.поиск.обратный *)
                );
ПЕР
       холстД:Холст.Доступ;
УКАЗ
       холстД:=закладкиНаХолстеД.холстД;
  ЕСЛИ
       холстД # ПУСТО
  ТО                                   (* ВКЛ\ОТКЛ ключа Холст.поиск.заменить *)
      Холст.поиск.заменить:=заменить;
                                                 (* инверсия обратного поиска *)
    ЕСЛИ
         наоборот
    ТО
      Холст.поиск.обратный:= НЕ Холст.поиск.обратный
    КОН;
    ЕСЛИ сПолем ТО     (* ВКЛ\ОТКЛ поиск с заменой на Поле Закладки на Холсте *)
      ЕСЛИ
           ПолеПоискЗамена.Выполнить(полеД,холстД) = Поле.состДалее
      ТО
        Холст.ИскатьЗаменить(холстД,ОТКЛ)
      КОН
    ИНАЧЕ
      Холст.ИскатьЗаменить(холстД,ВКЛ)
    КОН;
                            (* восстановление обратного поиска после инверсии *)
    ЕСЛИ наоборот ТО
      Холст.поиск.обратный:= НЕ Холст.поиск.обратный
    КОН
  КОН
КОН задИскать;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА задНастроить;
УКАЗ
  ПолеПриложение.Выполнить(полеД)
КОН задНастроить;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА БылаОшибка(файлОбмена-:ЦЕПЬ):КЛЮЧ;
(*
 * Цель:  отработать сообщение об ошибке при работе Преобразователя Глагола 
 * До:    <файлОбмена> - имя файла, в котором находятся сообщения от ПГ.exe = ПГ.обм
 * Ответ: ВКЛ, если ошибка была найдена 
 *)
ПЕР
  потокД:ИзФайла.ДкПотоку; (* сообщения от ПГ *)
  имяФайла:Файл.ВПолного;   
  цепь:ЦЕПЬ[200];
      поз:ЦЕЛ;
  стр,кол:ЦЕЛ;             (* стр=строка, кол=колонка ошибки *)
  былаОшибка:КЛЮЧ;
  холстД:Холст.Доступ;
УКАЗ
  былаОшибка:=ОТКЛ;
  потокД:=ИзФайла.Открыть(файлОбмена);
  ЕСЛИ
       потокД # ПУСТО
  ТО
    потокД.цВидЗнаков:=ИзФайла.знДос;
    ПОКА
          ИзФайла.НачалоСтроки(потокД)
        И
         (НЕ былаОшибка)
    ВЫП
      ИзФайла.Строку(потокД,цепь);
      поз:=оЦепи.ПозицияОбразца(" (",цепь,0);
      ЕСЛИ 
           (поз # -1)
          И
            оЗнака.Цифра(цепь[поз+2])
      ТО                                 (* кажется нашли сообщение об ошибке *)
                                         (* выделяем файл отдела *)
        оЦепи.Часть(цепь,имяФайла,0,поз);
                                         (* выделяем позицию в файле *)
        УВЕЛИЧИТЬ(поз,2);
        стр:=Текст.ВЦел(цепь,поз);
        УВЕЛИЧИТЬ(поз);
        кол:=Текст.ВЦел(цепь,поз);
                                         (* выделяем пояснение *)
        оЦепи.Часть(цепь,цепь,поз+4,РАЗМЕР(цепь));
        оЦепи.Вставить("Ошибка - ",цепь,0);
                                         (* выводим предупредительную надпись *)
        Закладки.ВыводОшибки(закладкиНаХолстеД,имяФайла,стр,кол,цепь);
        былаОшибка:=ВКЛ
      КОН
    КОН;
                                         (* закрываем файл *)
    ИзФайла.Закрыть(потокД)
  КОН;
  ВОЗВРАТ былаОшибка
КОН БылаОшибка;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА задЗапуск;
(*
 * Файл ОболочкаКОС.exe обязательно должен находится в папке \Глагол\Службы\
 *)
ПОСТ
  файлОбмена="ПГ.обм";     (* сюда перенаправляется вывод от ПГ.exe *)

ПЕР
  текПуть:Файл.ВПути;      (* путь к папке приложения относительно \Глагол\Службы\ *)
  имяФайла:Файл.ВПолного;  (* имя файла головного отдела *)
  имяОтдела:Файл.ВИмени;   (* имя головного отдела *)
  комСтрока:Файл.ВПолного; (* командная строка для вызова \Глагол\Службы\Построить.bat *)

 (*..........................подЗадача..*)
  ЗАДАЧА ПросмотрОшибкиСборки;
  (* посмотрим, что же произошло при преобразовании и сборке *)
  УКАЗ
    комСтрока:="type ";
    оЦепи.ДобавитьВКонец(комСтрока,файлОбмена);
    ОС.Вызов(комСтрока);
             (* не будем удалять файл 0,5с, чтобы "type" успела его прочитать *)
    ОС.Спать(500) 
  КОН ПросмотрОшибкиСборки;

УКАЗ
  ПолеНастройки.СписатьИмяФайла(имяФайла);
  ЕСЛИ имяФайла = "" ТО
    ВОЗВРАТ
  КОН;
  Закладки.СохранитьИзменённые(закладкиНаХолстеД);
  ПолеНастройки.РазобратьФайлНастроек;
                                   (* подготовка переменных для Построить.bat *)
  ОС.ПисатьВПерОкружения("slujput",".");
  Файл.ПутьИзПолного(имяФайла,текПуть);
  ОС.ПисатьВПерОкружения("tekput",текПуть);
                                                       (* вызов Построить.bat *)
  Файл.ИмяИзПолного(имяФайла,имяОтдела);
  ЕСЛИ
       НЕ ПолеНастройки.ВклМалыйПГ       (* .МПГ *)
  ТО
    ВЫБРАТЬ ПолеНастройки.видПриложения ИЗ
    | ПолеНастройки.впТекстовое: комСтрока:="Построить "
    | ПолеНастройки.впОконное:   комСтрока:="ПостроитьО "   (* или
                                            "ПостроитьГОС "  *)
    | ПолеНастройки.впБиблиотека:комСтрока:="ПостроитьБ "          (* или
                                            "ПостроитьБиблиотеку "  *)
    КОН
  ИНАЧЕ
                                      (* для МПГ *)
    комСтрока:="ПостроитьМ "  (* или
               "ПостроитьМалымПГ "   *)
  КОН;
  оЦепи.ДобавитьВКонец(комСтрока,имяОтдела);
  ОС.ВызовВФайл(комСтрока,файлОбмена);
                                              (* обрабатываем сообщения от ПГ *)
  ЕСЛИ НЕ БылаОшибка(файлОбмена) ТО 
                                                 (* получен файл приложения ? *)
    СПИСАТЬ(текПуть,комСтрока);
    оЦепи.ДобавитьВКонец(комСтрока,имяОтдела);
    ЕСЛИ
         (НЕ ПолеНастройки.ВклМалыйПГ (* .МПГ *))
        И 
         (ПолеНастройки.видПриложения = ПолеНастройки.впБиблиотека)
    ТО
      оЦепи.ДобавитьВКонец(комСтрока,".dll");
      ЕСЛИ
           НЕ Файл.Существует(комСтрока)
      ТО
        ПросмотрОшибкиСборки
      КОН
    ИНАЧЕ
      оЦепи.ДобавитьВКонец(комСтрока,".exe");
      ЕСЛИ
           НЕ Файл.Существует(комСтрока)
      ТО
        ПросмотрОшибкиСборки
      ИНАЧЕ                                  (* вызов построенного приложения *)
        ЕСЛИ
             НЕ ПолеНастройки.ВклМалыйПГ (* .МПГ *)
        ТО
          ОС.Вызов(комСтрока)
        ИНАЧЕ
                                      (* для МПГ *)
        КОН
      КОН
    КОН
  КОН;
  ЕСЛИ ОС.УдалитьФ(файлОбмена) ТО
  КОН
КОН задЗапуск;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА задВыход;
ПЕР
         цОтвет:ЦЕЛ;
УКАЗ
  ЕСЛИ
       Закладки.СИзменениями(закладкиНаХолстеД)
  ТО
         цОтвет:=ПолеСВопросом.Выполнить("Вопрос",1,0,полеД,0,"Сохранить отделы ?");
    ЕСЛИ
         цОтвет = Поле.состОтмена
    ТО
      ВОЗВРАТ
    КОН;
    ЕСЛИ
         цОтвет = ПолеСВопросом.состДа
    ТО
      Закладки.СохранитьИзменённые(закладкиНаХолстеД)
    КОН
  КОН;
  полеД.состояние:=діяВыход
КОН задВыход;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА задПерейти;
ПЕР
  цепь:ЦЕПЬ[20];
   стр,
   кол,
  цПоз:ЦЕЛ;
УКАЗ
  цепь:="";
  ЕСЛИ
       ПолеВвода.Выполнить("Перейти",
                            22,
                            полеД,
                            6,
                           "введите номер строки^и колонки через пробел",
                            цепь
                          ) = Поле.состДалее
  ТО
                         цПоз:=0;
    стр:=Текст.ВЦел(цепь,цПоз);
               УВЕЛИЧИТЬ(цПоз);
       кол:=1;
    ЕСЛИ
          цПоз < ДЛИНА(цепь)
    ТО
       кол:=Текст.ВЦел(цепь,цПоз)
    КОН;
    Холст.ВыставитьУказку(закладкиНаХолстеД.холстД,стр-1,кол-1)
  КОН
КОН задПерейти;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Приём(полеД:Поле.Доступ;
          посылка+:Ввод.нПосылка);
ПЕР                             (* получить и обработать управляющие послания *)
      кодПосылки:ЦЕЛ;
УКАЗ
                             (* анализ многоформия (полиморфизма) у <посылка> *)
  ДЛЯ    посылка ВИДА
  | Ввод.нОтКлавиш:
      кодПосылки:=посылка.код;
                  посылка.код:=0;          (* скорее всего отработаем посылку *)
      ЕСЛИ
          посылка.упрАльт
      ТО
        ВЫБРАТЬ   кодПосылки ИЗ
(* F1  *) | 70H: задПомощь
(* F3  *) | 72H: задЗакрытьХолст(закладкиНаХолстеД.холстД)
(* F7  *) | 76H: задИскать(ОТКЛ,ОТКЛ,ВКЛ)
(* F8  *) | 77H: задПерейти
(* "X" *) | 58H: задВыход
        ИНАЧЕ
          посылка.код:=кодПосылки
        КОН
      АЕСЛИ
          посылка.упрШифт
      ТО
        ВЫБРАТЬ кодПосылки ИЗ
(* F2  *) | 71H: задСохранитьКак(закладкиНаХолстеД.холстД)
(* F7  *) | 76H: задИскать(ОТКЛ,ОТКЛ,ОТКЛ)
        ИНАЧЕ
          посылка.код:=кодПосылки
        КОН
      АЕСЛИ
          посылка.упрКонтр
      ТО
        ВЫБРАТЬ кодПосылки ИЗ
(* Tab *) |  9H: Закладки.Следующая(закладкиНаХолстеД)
(* F1  *) | 70H: задСправка
(* F7  *) | 76H: задИскать(ВКЛ,ВКЛ,ОТКЛ)
        ИНАЧЕ
          посылка.код:=кодПосылки
        КОН
      ИНАЧЕ
        ВЫБРАТЬ кодПосылки ИЗ
(* F1  *) | 70H: задПомощь
(* F2  *) | 71H: задСохранитьХолст(закладкиНаХолстеД.холстД)
(* F3  *) | 72H: задОткрытьФайл
(* F5  *) | 74H: задПолеНаВесьЭкран
(* F7  *) | 76H: задИскать(ОТКЛ,ВКЛ,ОТКЛ)
(* F8  *) | 77H: задНастроить
(* F9  *) | 78H: задЗапуск
(* F10 *) | 79H: задВыход
        ИНАЧЕ
          посылка.код:=кодПосылки
        КОН
      КОН
  | Холст.нПосылка:
      положениеУказкиНаХолстеД.Приём(положениеУказкиНаХолстеД,посылка)
  | Кнопка.нПосылка:
      ВЫБРАТЬ
              посылка.кнопкаД.действие
      ИЗ
      | діяПомощь   : задПомощь
      | діяСохранить: задСохранитьХолст(закладкиНаХолстеД.холстД)
      | діяОткрыть  : задОткрытьФайл
      | діяИскать   : задИскать(ОТКЛ,ВКЛ,ОТКЛ)
      | діяНастроить: задНастроить
      | діяЗапуск   : задЗапуск
      | діяВыход    : задВыход
      КОН
  ИНАЧЕ
  КОН             
КОН Приём;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА СоздатьПоле;                            (* создает рабочее поле экрана *)
ПЕР
  кнопПомощьД,
  кнопСохранитьД,
  кнопОткрытьД,
  кнопИскатьД,
  кнопНастроитьД,
  кнопЗапускД,
  кнопВыходД     :Кнопка.Доступ;
УКАЗ
                                                              (* создаём поле *)
  наВесьЭкран:=ОТКЛ;
  полеД:=Поле.Создать(0,0,Строк,Колонок,ПУСТО,ОТКЛ,Приём);
                                                            (* создаём наделы *)
  закладкиНаХолстеД:=Закладки.Создать(0,0,-1,0);

  (*|00000000001111111111222222222233333333334444444444555555555566|*)
  (*|01234567890123456789012345678901234567890123456789012345678901|*)
  (*| Помощь  Сохранить  Открыть  Искать  Настроить  Запуск  Выход |*) 

  кнопПомощьД   :=Кнопка.Создать(-1, 0," ~Помощь "   ,діяПомощь   ,ОТКЛ); 
  кнопСохранитьД:=Кнопка.Создать(-1, 8," ~Сохранить ",діяСохранить,ОТКЛ); 
  кнопОткрытьД  :=Кнопка.Создать(-1,19," ~Открыть "  ,діяОткрыть  ,ОТКЛ); 
  кнопИскатьД   :=Кнопка.Создать(-1,28," ~Искать "   ,діяИскать   ,ОТКЛ); 
  кнопНастроитьД:=Кнопка.Создать(-1,36," ~Настроить ",діяНастроить,ОТКЛ); 
  кнопЗапускД   :=Кнопка.Создать(-1,47," ~Запуск "   ,діяЗапуск   ,ОТКЛ); 
  кнопВыходД    :=Кнопка.Создать(-1,55," ~Выход "    ,діяВыход    ,ОТКЛ); 

  положениеУказкиНаХолстеД:=Положение.Создать(-1,62);

                    (* добавляем наделы в порядке отрисовки и получения ввода *)
  Поле.ДобавитьНадел(полеД,закладкиНаХолстеД);

  Поле.ДобавитьНадел(полеД,кнопПомощьД);
  Поле.ДобавитьНадел(полеД,кнопСохранитьД);
  Поле.ДобавитьНадел(полеД,кнопОткрытьД);
  Поле.ДобавитьНадел(полеД,кнопИскатьД);
  Поле.ДобавитьНадел(полеД,кнопНастроитьД);
  Поле.ДобавитьНадел(полеД,кнопЗапускД);
  Поле.ДобавитьНадел(полеД,кнопВыходД);

  Поле.ДобавитьНадел(полеД,положениеУказкиНаХолстеД)
КОН СоздатьПоле;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Поехали;
ПЕР
  читФД:ИзФайла.ДкПотоку;
  писФД: ВФайл.ДкПотоку;
УКАЗ (*
       Подготовить обращение к файлу помощи из приложения ОболочкаКОС.exe
 По умолчанию приложение ОболочкаКОС.exe находится в папке \Глагол\Службы\.
 В этой же папке с приложением ОболочкаКОС.exe должны быть: файл Глагол.chm
                                                       и
                                                         файл Spravka.DLL, который
 обеспечивает навигацию по справочнику Глагол.chm.
       Подготовка заключается в передаче в отдел Справка в локальную
 переменную Справка.имяФ имени chm-справочника по рус.ЯП Глагол.
      *)
  Справка.Подготовить("Глагол.chm");
                                                (* восстанавливаем настройки, *)
      читФД:=ИзФайла.Открыть("ОболочкаКОС.нст");(* ранее сохранённые в файле ОболочкаКОС.нст в папке с приложением ОболочкаКОС.exe *)
  ЕСЛИ
      читФД # ПУСТО
  ТО
            (* уточняем кодировку при чтении из файла Оболочка.нст по доступу   
     <читФД> *)
      читФД.цВидЗнаков:=ИзФайла.знУни;
            Памятка.ЧитатьНастройки(читФД);
    ПолеПоискЗамена.ЧитатьНастройки(читФД);
            ИзФайла.Закрыть(читФД)
  КОН;

  Окно.Текстовое(ПУСТО);           (* "ОболочкаКОС Глагола в консольном окне" *)
             (*
                 ПУСТО - в заглавии текстового Окна в консоле Windows
              *)
(*
  Окно.Графическое("Оболочка Глагола в графическом окне","Lucida Sans Unicode",16,ПУСТО);
*)
  СоздатьПоле;
         Поле.ОкноНаВсёПоле(полеД);
         Поле.Рисовать(полеД);
  Окно.Показать;

                  (*--------- основная работа ОболочкаКОС.exe --------*)
  ПОВТОРЯТЬ
         Поле.Проверить(полеД)
  ДО полеД.состояние # Поле.состРабота;
                                                      (* сохраняем настройки, *)
      писФД:=ВФайл.Открыть("ОболочкаКОС.нст");        (*             в файле ОболочкаКОС.нст в папке с приложением ОболочкаКОС.exe *)
  ЕСЛИ
      писФД # ПУСТО
  ТО
            (* уточняем кодировку при записи в файл Оболочка.нст по доступу
     <писФД> *)
      писФД.цВидЗнаков:=ВФайл.знУни;
            Памятка.ПисатьНастройки(писФД);
    ПолеПоискЗамена.ПисатьНастройки(писФД);
              ВФайл.Закрыть(писФД)
  КОН
КОН Поехали;

(*-SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS-*)
УКАЗ
  Поехали
КОН ОболочкаКОС.