|
(*~\Глагол\Отделы\Поле~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**) ОТДЕЛ Надел;
(*============================================================================*
* НАЗНАЧЕНИЕ: надел это область на экранном поле для ввода/вывода текстовых
* данных. Вид Надел является основой для видимых наделов.
* Также в данном отделе содержатся вспомогательные задачи для вывода
* надписей с выделяемыми особым цветом буквами - буквицами.
* При нажатии Альт-кода буквицы происходит переключение клавиатурного ввода
* на надел, в надписи которого содержится данная буквица.
*============================================================================*)
ИСПОЛЬЗУЕТ
Рамка,
Знак ИЗ "..\Иное\",
ОС ИЗ "..\Обмен\",
ЦвЗнак ИЗ "..\Обмен\",
Окно ИЗ "..\Обмен\",
Ввод ИЗ "..\Обмен\";
ПОСТ
(* надел может находится в следующих состояниях: *)
сОбычный- =0; (* отображается на поле без осуществления ввода *)
сВыбран- =1; (* осуществляется ввод в данный надел *)
сОтключен-=2; (* выбор данного надела невозможен *)
(* итого *)
Состояний-=3;
(* признаки поведения *)
прВыбираемый-=0; (* может выбираться человеком для ввода *)
прГлухой- =1; (* не воспринимает действия человека *)
(* цвета ОС (место,знак), используемые для отображения наделов *)
цОбычный- =70X;
цБуквицы- =7EX;
цОтключенный- =78X;
цВыбраннойКнопки- =30X;
цБуквицыВыбраннойКнопки-=3EX;
цХолста- =1BX;
цОтметкиХолста- =30X;
цОтключенногоХолста- =18X;
цСтроки- =3FX;
цОтметкиСтроки- =3BX;
цОтключеннойСтроки- =38X;
цОтметкиСтрокиПамятки- =0FX;
цПредупреждения- =4FX;
цБуквицыПредупреждения- =4EX;
ВИД
Доступ-=ДОСТУП К Вид;
Задача=ЗАДАЧА(надел:Доступ; посылка+:Ввод.Посылка);
Вид-=НАБОР(Рамка.Вид)
следующий- :Доступ; (* следующий надел на поле *)
предыдущий- :Доступ; (* предыдущий надел на поле *)
Приём- :Задача; (* приём и обработка посылок *)
признаки- :МНОЖ; (* признаки (множество из пр...) *)
состояние+ :ЦЕЛ; (* текущее состояние (одно из с...) *)
поле+ :Рамка.Доступ; (* поле, содержащее надел *)
цветНадписи+:ЦЕПЬ[Состояний]; (* цвет надписи в определённом состоянии *)
цветБуквицы+:ЦЕПЬ[Состояний]; (* цвет буквицы в определённом состоянии *)
КОН;
Надпись-=ЦЕПЬ[64]; (* перед буквицей ставится знак "~" *)
(******************************************************************************)
ЗАДАЧА Очистить-(надел:Доступ);
(* Заполняет надел пробелом с цветом надписи текущего состояния *)
УКАЗ
Окно.ЦветнойПробел(надел.вс,
надел.лк,
надел.нс,
надел.пк,
надел.цветНадписи[надел.состояние])
КОН Очистить;
(******************************************************************************)
ЗАДАЧА ВыводНадписи-(надел:Доступ; надпись-:Надпись; с:ЦЕЛ);
(* Цель: отобразить надпись на заданной строке надела
* До: <надел> - данный надел
* <надпись> - цепочка отображаемых знаков
* <с> - строка надела, на которую необходимо вывести надпись *)
ПЕР
цвСтрока:ЦвЗнак.Строка;
поз,к,пко:ЦЕЛ;
знак,былЗнак:ЗНАК;
цвет,цНадписи,цБуквицы:ЗНАК;
УКАЗ
(* определим цвета *)
цНадписи:=надел.цветНадписи[надел.состояние];
цБуквицы:=надел.цветБуквицы[надел.состояние];
(* начальные значения *)
к:=-1;
пко:=надел.пк - надел.лк;
поз:=0;
былЗнак:=0X;
КОЛЬЦО
ЕСЛИ поз >= РАЗМЕР(надпись) ТО ВЫХОД КОН;
знак:=надпись[поз];
ЕСЛИ (знак = 0X) ИЛИ (к > пко) ТО ВЫХОД КОН;
ЕСЛИ (былЗнак = "~") И Знак.БукваЦифра(знак) ТО
цвет:=цБуквицы
ИНАЧЕ
цвет:=цНадписи;
УВЕЛИЧИТЬ(к)
КОН;
ЦвЗнак.ИзЗнакаИЦвета(знак,цвет,цвСтрока[к]);
былЗнак:=знак;
УВЕЛИЧИТЬ(поз)
КОН;
Окно.ПисатьСтроку(цвСтрока,надел.вс+с,надел.лк,к+1)
КОН ВыводНадписи;
(******************************************************************************)
ЗАДАЧА СчитатьНадпись-(цепь-:ЦЕПЬ; надпись+:Надпись; длина+,буквица+:ЦЕЛ);
(* Цель: переписать <цепь> в <надпись> и найти её длину и последнюю буквицу
* До: <цепь> - исходная цепочка
* <надпись> - переписанная <цепь>
* После: <длина> - длина отображаемых знаков
* <буквица> - код для последней подсвеченной буквы *)
ПЕР
поз:ЦЕЛ;
знак,былЗнак,буква:ЗНАК;
УКАЗ
буква:=0X;
былЗнак:=0X;
длина:=0;
СПИСАТЬ(цепь,надпись);
ОТ поз:=0 ДО ДЛИНА(надпись)-1 ВЫП
знак:=надпись[поз];
ЕСЛИ былЗнак = "~" ТО
ЕСЛИ Знак.БукваЦифра(знак) ТО
УМЕНЬШИТЬ(длина);
буква:=знак
КОН
КОН;
УВЕЛИЧИТЬ(длина);
былЗнак:=знак
КОН;
буквица:=ОС.ВинЗнакВКодКлавиши(буква)
КОН СчитатьНадпись;
(******************************************************************************)
ЗАДАЧА Добавить-(наделы+,надел:Доступ);
(* Добавить <надел> в конец двусвязанного списка <наделы> *)
ПЕР
следующий,предыдущий:Доступ;
УКАЗ
ЕСЛИ наделы = ПУСТО ТО
надел.следующий:=надел;
надел.предыдущий:=надел;
наделы:=надел
ИНАЧЕ
следующий:=наделы;
предыдущий:=следующий.предыдущий;
предыдущий.следующий:=надел;
следующий.предыдущий:=надел;
надел.предыдущий:=предыдущий;
надел.следующий:=следующий
КОН
КОН Добавить;
(******************************************************************************)
ЗАДАЧА Подготовить-(надел:Доступ; верх,лево,строк,колонок:ЦЕЛ; признаки:МНОЖ; Приём:Задача);
УКАЗ
Рамка.Подготовить(надел,верх,лево,строк,колонок);
надел.признаки:=признаки;
надел.Приём:=Приём;
надел.цветНадписи[сОбычный] :=цОбычный;
надел.цветБуквицы[сОбычный] :=цБуквицы;
надел.цветНадписи[сВыбран] :=цОбычный;
надел.цветБуквицы[сВыбран] :=цБуквицы;
надел.цветНадписи[сОтключен]:=цОтключенный;
надел.цветБуквицы[сОтключен]:=цОтключенный
КОН Подготовить;
КОН Надел.
|
|