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

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

  Поле     ИЗ "..\..\Отделы\Поле\",
  Подложка ИЗ "..\..\Отделы\Поле\",
  Записка  ИЗ "..\..\Отделы\Поле\",
  Кнопка   ИЗ "..\..\Отделы\Поле\",
  Черта    ИЗ "..\..\Отделы\Поле\";

ПОСТ             (* действия кнопок *)
  діяПуск =1;
  діяСтоп =2;
  діяСброс=3;
  діяВыход=4;

ПЕР
  идётИзмерение:КЛЮЧ;             (* ВКЛ, если идёт измерение времени  *)
  измеренноеВремя:ЦЕЛ;            (* промежуток времени в мс           *)
  моментОбновления:ЦЕЛ;           (* показаний                         *)

  записаноВремяД:Записка.Доступ;  (* записка с показаниями секундомера *)

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА Приём(   полеД:Поле.Доступ;
             посылка+:Ввод.нПосылка);
(*
 * получить и обработать управляющие послания
 *)
УКАЗ
  ДЛЯ
      посылка
  ВИДА
  | Кнопка.нПосылка:
      ВЫБРАТЬ
            посылка.кнопкаД.действие
      ИЗ
      | діяПуск:  идётИзмерение:=ВКЛ
      | діяСтоп:  идётИзмерение:=ОТКЛ
      | діяСброс: измеренноеВремя:=0
      | діяВыход: полеД.состояние:=Поле.состДалее
      КОН
  | Ввод.нОтКлавиш:
      ЕСЛИ
            посылка.упрАльт И (посылка.код = 58H) (* Alt+'X' *)
         ИЛИ
           (посылка.код = 1BH)                    (* Esc     *)
      ТО                                        
        полеД.состояние:=Поле.состДалее
      КОН
  ИНАЧЕ
  КОН
КОН Приём;

(*-----------------------------------------локальная ЗАДАЧА-------------------*)
ЗАДАЧА ОбновитьПоказания(номерЧасов:ЦЕЛ);
(*
 * обновить показания секундомера
 *)
ПЕР
  прошлоВремени:ЦЕЛ;
  сейчас:ЦЕЛ;
  сотые,
  секунды,
  минуты,
  часы:ЦЕЛ;
УКАЗ
                    сейчас:=ОС.Время();
     прошлоВремени:=сейчас-моментОбновления;
  моментОбновления:=сейчас;
  ЕСЛИ
       идётИзмерение
  ТО
    УВЕЛИЧИТЬ(измеренноеВремя,прошлоВремени)
  КОН;
                         сотые:=измеренноеВремя ДЕЛИТЬ 10;
                секунды:=сотые ДЕЛИТЬ 100;
        минуты:=секунды ДЕЛИТЬ 60;
  часы:=минуты ДЕЛИТЬ 60;

  Записка.Из4хЦел(
                  записаноВремяД,
                  "%.2d:%.2d:%.2d.%.2d",
                  часы,
                   минуты ОСТАТОК 60,
                  секунды ОСТАТОК 60,
                    сотые ОСТАТОК 100
                 )
КОН ОбновитьПоказания;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Главная;
ПЕР
  полеД:Поле.Доступ;                           (* рабочее   поле экрана   *)
  подложкаД:Подложка.Доступ;                   (* подложкаД поля          *)
  кнопСтоп,
  кнопПуск,
  кнопСброс,
  кнопВыход:Кнопка.Доступ;                (* управляющие кнопки    *)
    черта1,
    черта2 : Черта.Доступ;                (* разделительные черты  *)

  часы:ЦЕЛ;

  (*------------------- подЗадача --------------*)
  ЗАДАЧА СоздатьПоле;                          (* создаёт рабочее поле экрана *)
  УКАЗ
                                                              (* создаём поле *)
    полеД:=Поле.Создать(0,0,8,17,ПУСТО,ОТКЛ,Приём);
                                                            (* создаём наделы *)
         подложкаД:=Подложка.Создать(0,0,0,0,"");
    записаноВремяД:=Записка.Создать(1,3,1,11,"00:00:00.00");
                                                             (* создаём черты *)
      черта1 := Черта.Создать(2,0,1,0);
    кнопПуск :=Кнопка.Создать(3,2,"[~Пуск]",діяПуск,ВКЛ);
    кнопСтоп :=Кнопка.Создать(3,9,"[~Стоп]",діяСтоп,ВКЛ);

    кнопСброс:=Кнопка.Создать(4,4,"[ С~брос ]",діяСброс,ВКЛ);
      черта2 := Черта.Создать(5,0,1,0);
    кнопВыход:=Кнопка.Создать(6,4,"[ ~Выход ]",діяВыход,ВКЛ);

                                (* добавляем наделы в порядке получения ввода *)
    Поле.ДобавитьНадел(полеД,подложкаД);
    Поле.ДобавитьНадел(полеД,записаноВремяД);
    Поле.ДобавитьНадел(полеД,черта1);
    Поле.ДобавитьНадел(полеД,кнопПуск);
    Поле.ДобавитьНадел(полеД,кнопСтоп);
    Поле.ДобавитьНадел(полеД,кнопСброс);
    Поле.ДобавитьНадел(полеД,черта2);
    Поле.ДобавитьНадел(полеД,кнопВыход)
  КОН СоздатьПоле;

УКАЗ
  Окно.Текстовое(ОбновитьПоказания);
(*
  Окно.Графическое("Секундомер в графическом окне","Lucida Console",30,ОбновитьПоказания);
*)
  СоздатьПоле;

  Поле.ОкноНаВсёПоле(полеД);
  Поле.Рисовать(полеД);
  часы:=Окно.СоздатьЧасы(1,100); (* обновляем показания через 100мс *)
  Окно.Показать;
                                 (* проверяем и обрабатываем ввод от человека *)
  ПОКА
       полеД.состояние = Поле.состРабота
  ВЫП
    Поле.Проверить(полеД)
  КОН;
  Окно.УдалитьЧасы(часы)
КОН Главная;

(*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*)
УКАЗ
      измеренноеВремя:=0;
  идётИзмерение:=ОТКЛ;
  Главная
КОН СекундомерКОС. 
