|
(*~\Глагол\Отделы\Обмен~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**) ОТДЕЛ Окно;
(*============================================================================*
* НАЗНАЧЕНИЕ: ввод и вывод текста в Графическое или Консольное окно
*============================================================================*)
ИСПОЛЬЗУЕТ
ЦвЗнак,
Ввод,
ГОС,
КОС;
(* ссылка на соответствующие задачи из ГОС и КОС *)
ПЕР
ПисатьЦвет- :ЗАДАЧА(с,к:ЦЕЛ; цвет:ЗНАК);
ПисатьЗнак- :ЗАДАЧА(с,к:ЦЕЛ; цвет:ЗНАК);
ЧитатьЦвет- :ЗАДАЧА(с,к:ЦЕЛ):ЗНАК;
ЧитатьЗнак- :ЗАДАЧА(с,к:ЦЕЛ):ЗНАК;
Вверх- :ЗАДАЧА(вс,лк,нс,пк:ЦЕЛ; новЗнак-:ЦвЗнак.Вид);
Вниз- :ЗАДАЧА(вс,лк,нс,пк:ЦЕЛ; новЗнак-:ЦвЗнак.Вид);
ПисатьСтроку- :ЗАДАЧА(цвСтрока-:ЦвЗнак.Строка; с,к,длина:ЦЕЛ);
ПереместитьУказку- :ЗАДАЧА(с,к:ЦЕЛ);
РазмерУказки- :ЗАДАЧА(размер:ЦЕЛ);
Опрос- :ЗАДАЧА(отКлавиш+:Ввод.ОтКлавиш; отМышки+:Ввод.ОтМышки):ЦЕЛ;
РазмерЭкрана- :ЗАДАЧА(строк+,колонок+:ЦЕЛ);
ИзменитьРазмер- :ЗАДАЧА(строк,колонок:ЦЕЛ);
СоздатьЧасы- :ЗАДАЧА(номер,время:ЦЕЛ):ЦЕЛ;
УдалитьЧасы- :ЗАДАЧА(номерУд:ЦЕЛ);
Показать- :ЗАДАЧА;
Отработать- :ЗАДАЧА;
(******************************************************************************)
ЗАДАЧА Графическое-(имяПриложения-,имяШрифта-:ЦЕПЬ;
размерШрифта:ЦЕЛ; задачаЧасы:ГОС.ВидЗадачиЧасы);
(* Цель: подготовка к работе графического окна *)
УКАЗ
ПисатьЦвет :=ГОС.ПисатьЦвет;
ПисатьЗнак :=ГОС.ПисатьЗнак;
ЧитатьЦвет :=ГОС.ЧитатьЦвет;
ЧитатьЗнак :=ГОС.ЧитатьЗнак;
Вверх :=ГОС.Вверх;
Вниз :=ГОС.Вниз;
ПисатьСтроку :=ГОС.ПисатьСтроку;
ПереместитьУказку:=ГОС.ПереместитьУказку;
РазмерУказки :=ГОС.РазмерУказки;
Опрос :=ГОС.Опрос;
РазмерЭкрана :=ГОС.РазмерЭкрана;
ИзменитьРазмер :=ГОС.ИзменитьРазмерОкна;
СоздатьЧасы :=ГОС.СоздатьЧасы;
УдалитьЧасы :=ГОС.УдалитьЧасы;
Показать :=ГОС.ПоказатьОкно;
Отработать :=ГОС.Отработать;
ГОС.Подготовить(имяПриложения,имяШрифта,размерШрифта,задачаЧасы)
КОН Графическое;
(******************************************************************************)
ЗАДАЧА Текстовое-(задачаЧасы:КОС.ВидЗадачиЧасы);
(* Цель: подготовка к работе консольного окна *)
УКАЗ
ПисатьЦвет :=КОС.ПисатьЦвет;
ПисатьЗнак :=КОС.ПисатьЗнак;
ЧитатьЦвет :=КОС.ЧитатьЦвет;
ЧитатьЗнак :=КОС.ЧитатьЗнак;
Вверх :=КОС.Вверх;
Вниз :=КОС.Вниз;
ПисатьСтроку :=КОС.ПисатьСтроку;
ПереместитьУказку:=КОС.ПереместитьУказку;
РазмерУказки :=КОС.РазмерУказки;
Опрос :=КОС.Опрос;
РазмерЭкрана :=КОС.РазмерЭкрана;
ИзменитьРазмер :=КОС.ИзменитьРазмерОкна;
СоздатьЧасы :=КОС.СоздатьЧасы;
УдалитьЧасы :=КОС.УдалитьЧасы;
Показать :=КОС.ПоказатьОкно;
Отработать :=КОС.Отработать;
КОС.Подготовить(задачаЧасы)
КОН Текстовое;
(******************************************************************************)
ЗАДАЧА Пробел-(вс,лк,нс,пк:ЦЕЛ);
(* Заполняет прямоугольник пробелом. *)
ПЕР
с,к:ЦЕЛ;
УКАЗ
ОТ с:=вс ДО нс ВЫП
ОТ к:=лк ДО пк ВЫП
ПисатьЗнак(с,к,' ')
КОН
КОН
КОН Пробел;
(******************************************************************************)
ЗАДАЧА Цвет-(вс,лк,нс,пк:ЦЕЛ; цвет:ЗНАК);
(* Устанавливает цвет прямоугольника. *)
ПЕР
с,к:ЦЕЛ;
УКАЗ
ОТ с:=вс ДО нс ВЫП
ОТ к:=лк ДО пк ВЫП
ПисатьЦвет(с,к,цвет)
КОН
КОН
КОН Цвет;
(******************************************************************************)
ЗАДАЧА ЦветнойПробел-(вс,лк,нс,пк:ЦЕЛ; цвет:ЗНАК);
(* Заполняет прямоугольник пробелом заданного цвета. *)
ПЕР
строка:ЦвЗнак.Строка;
пробел:ЦвЗнак.Вид;
с,к,пко:ЦЕЛ;
УКАЗ
пробел.знак:=" ";
пробел.цвет:=цвет;
пко:=пк-лк;
ОТ к:=0 ДО пко ВЫП
строка[к]:=пробел
КОН;
ОТ с:=вс ДО нс ВЫП
ПисатьСтроку(строка,с,лк,пко+1)
КОН
КОН ЦветнойПробел;
(******************************************************************************)
ЗАДАЧА Тень-(вс,лк,нс,пк:ЦЕЛ);
(* Снаружи прямоугольника рисует тень. *)
ПЕР
с,к:ЦЕЛ;
ЗАДАЧА Потушить(с,к:ЦЕЛ);
УКАЗ
ПисатьЦвет(с,к,ВЗНАК(ВЦЕЛ(ЧитатьЦвет(с,к)) ОСТАТОК 8))
КОН Потушить;
УКАЗ
УВЕЛИЧИТЬ(пк);
УВЕЛИЧИТЬ(нс);
ОТ с:=вс+1 ДО нс ВЫП
Потушить(с,пк)
КОН;
ОТ к:=лк+1 ДО пк ВЫП
Потушить(нс,к)
КОН
КОН Тень;
(******************************************************************************)
ЗАДАЧА Рамка1-(вс,лк,нс,пк:ЦЕЛ);
(* Обрамляет прямоугольник одинарной линией. *)
ПЕР
с,к:ЦЕЛ;
УКАЗ
ПисатьЗнак(вс,лк,250CX);
ПисатьЗнак(нс,лк,2514X);
ПисатьЗнак(вс,пк,2510X);
ПисатьЗнак(нс,пк,2518X);
ОТ к:=лк+1 ДО пк-1 ВЫП
ПисатьЗнак(вс,к,2500X);
ПисатьЗнак(нс,к,2500X)
КОН;
ОТ с:=вс+1 ДО нс-1 ВЫП
ПисатьЗнак(с,лк,2502X);
ПисатьЗнак(с,пк,2502X)
КОН
КОН Рамка1;
(******************************************************************************)
ЗАДАЧА Рамка2-(вс,лк,нс,пк:ЦЕЛ);
(* Обрамляет прямоугольник двойной линией. *)
ПЕР
с,к:ЦЕЛ;
УКАЗ
ПисатьЗнак(вс,лк,2554X);
ПисатьЗнак(нс,лк,255AX);
ПисатьЗнак(вс,пк,2557X);
ПисатьЗнак(нс,пк,255DX);
ОТ к:=лк+1 ДО пк-1 ВЫП
ПисатьЗнак(вс,к,2550X);
ПисатьЗнак(нс,к,2550X)
КОН;
ОТ с:=вс+1 ДО нс-1 ВЫП
ПисатьЗнак(с,лк,2551X);
ПисатьЗнак(с,пк,2551X)
КОН
КОН Рамка2;
(******************************************************************************)
ЗАДАЧА Черта-(вс,лк,нс,пк:ЦЕЛ);
(* Рисует горизонтальную или вертикальную черту, учитывая пересечения. *)
ПЕР
с,к:ЦЕЛ;
зн:ЗНАК;
УКАЗ
ЕСЛИ вс = нс ТО (* горизонтальная черта *)
зн:=ЧитатьЗнак(вс,лк);
ЕСЛИ зн = 2502X ТО
зн:=251CX
АЕСЛИ зн = 2551X ТО
зн:=255FX
ИНАЧЕ
зн:=2500X
КОН;
ПисатьЗнак(вс,лк,зн);
ОТ к:=лк+1 ДО пк-1 ВЫП
зн:=ЧитатьЗнак(вс,к);
ЕСЛИ зн = 2502X ТО
зн:=253CX
АЕСЛИ зн = 2551X ТО
зн:=256BX
ИНАЧЕ
зн:=2500X
КОН;
ПисатьЗнак(вс,к,зн)
КОН;
зн:=ЧитатьЗнак(нс,пк);
ЕСЛИ зн = 2502X ТО
зн:=2524X
АЕСЛИ зн = 2551X ТО
зн:=2562X
ИНАЧЕ
зн:=2500X
КОН;
ПисатьЗнак(нс,пк,зн);
ИНАЧЕ (* вертикальная черта *)
зн:=ЧитатьЗнак(вс,лк);
ЕСЛИ зн = 2500X ТО
зн:=252CX
АЕСЛИ зн = 2550X ТО
зн:=2564X
ИНАЧЕ
зн:=2502X
КОН;
ПисатьЗнак(вс,лк,зн);
ОТ с:=вс+1 ДО нс-1 ВЫП
зн:=ЧитатьЗнак(с,лк);
ЕСЛИ зн = 2500X ТО
зн:=253CX
АЕСЛИ зн = 2550X ТО
зн:=256AX
ИНАЧЕ
зн:=2502X
КОН;
ПисатьЗнак(с,лк,зн)
КОН;
зн:=ЧитатьЗнак(нс,пк);
ЕСЛИ зн = 2500X ТО
зн:=2534X
АЕСЛИ зн = 2550X ТО
зн:=2567X
ИНАЧЕ
зн:=2502X
КОН;
ПисатьЗнак(нс,пк,зн)
КОН
КОН Черта;
(******************************************************************************)
ЗАДАЧА Цепь-(вс,лк,нс,пк:ЦЕЛ; цепь-:ЦЕПЬ);
(* Записывает цепочку знаков в прямоугольную область. *)
ПЕР
поз:ЦЕЛ;
с,к:ЦЕЛ;
знак:ЗНАК;
длина:ЦЕЛ;
былаВолна:КЛЮЧ;
УКАЗ
былаВолна:=ОТКЛ;
поз:=0;
с:=вс;
длина:=ДЛИНА(цепь);
ПОКА с <= нс ВЫП
к:=лк;
ПОКА к <= пк ВЫП
ЕСЛИ поз >= длина ТО ВОЗВРАТ КОН;
знак:=цепь[поз];
ЕСЛИ былаВолна ТО
ПисатьЗнак(с,к,знак);
былаВолна:=ОТКЛ
ИНАЧЕ
ЕСЛИ знак = '^' ТО
к:=пк
АЕСЛИ знак = '~' ТО
былаВолна:=ВКЛ
ИНАЧЕ
ПисатьЗнак(с,к,знак)
КОН
КОН;
УВЕЛИЧИТЬ(поз);
УВЕЛИЧИТЬ(к)
КОН;
УВЕЛИЧИТЬ(с)
КОН
КОН Цепь;
КОН Окно.
|
|