|
Программируем по-русски
|
Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку. Издатель Глагола
|
(*~\Глагол\Отделы\Поле~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*) (**) ОТДЕЛ Закладки; (*============================================================================* * НАЗНАЧЕНИЕ: закладки на холсты в главном окне *============================================================================*) ИСПОЛЬЗУЕТ Рамка, Надел, Поле, Холст, ОС ИЗ "..\Обмен\", ЦвЗнак ИЗ "..\Обмен\", Окно ИЗ "..\Обмен\", Файл ИЗ "..\Обмен\", Ввод ИЗ "..\Обмен\"; ПОСТ Закладок = 30; (* всего может быть закладок *) (* цвет *) цРамка = 1BX; цОткрытая = 1FX; цЗакрытая = 17X; цРКнопка = 1FX; цНКнопка = 17X; ВИД Доступ-=ДОСТУП К Вид; Вид-=НАБОР(Надел.Вид) закладок:ЦЕЛ; (* используется закладок *) открытая:ЦЕЛ; (* номер открытой закладки *) первая:ЦЕЛ; (* первая видимая закладка *) холст-:Холст.Доступ; (* открытый холст *) холсты:РЯД Закладок ИЗ Холст.Доступ; естьПраваяКнопка,естьЛеваяКнопка:КЛЮЧ; былаОшибка:КЛЮЧ; (* в нижней строке отображается сообщение об ошибке *) КОН; ПЕР (* составные постоянные *) пОткрытыйПробел:ЦвЗнак.Вид; пЗакрытыйПробел:ЦвЗнак.Вид; пВертЧерта :ЦвЗнак.Вид; пГорЧерта :ЦвЗнак.Вид; пПНУгол :ЦвЗнак.Вид; пЛНУгол :ЦвЗнак.Вид; пНУглы :ЦвЗнак.Вид; пЧерта :ЦвЗнак.Строка; (******************************************************************************) ЗАДАЧА ПодготовитьПостоянные; ПЕР поз:ЦЕЛ; УКАЗ ЦвЗнак.ИзЗнакаИЦвета(" ",цЗакрытая,пЗакрытыйПробел); ЦвЗнак.ИзЗнакаИЦвета(" ",цОткрытая,пОткрытыйПробел); ЦвЗнак.ИзЗнакаИЦвета(2502X,цРамка,пВертЧерта); ЦвЗнак.ИзЗнакаИЦвета(2500X,цРамка,пГорЧерта); ЦвЗнак.ИзЗнакаИЦвета(2518X,цРамка,пПНУгол); ЦвЗнак.ИзЗнакаИЦвета(2514X,цРамка,пЛНУгол); ЦвЗнак.ИзЗнакаИЦвета(2534X,цРамка,пНУглы); ОТ поз:=0 ДО РАЗМЕР(пЧерта)-1 ВЫП пЧерта[поз]:=пГорЧерта КОН КОН ПодготовитьПостоянные; (******************************************************************************) ЗАДАЧА ОтрисовкаЗаголовка(закладки:Доступ); ПЕР верх,низ:ЦвЗнак.Строка; (* для ускорения вывода *) знак,цвет:ЗНАК; поз:ЦЕЛ; закладка:ЦЕЛ; послк:ЦЕЛ; (* последняя колонка *) к:ЦЕЛ; (* обрабатываемая колонка (0..послк) *) лк,пк,вс,нс:ЦЕЛ; УКАЗ лк:=закладки.лк; пк:=закладки.пк; вс:=закладки.вс; нс:=вс+1; послк:=пк-лк-2; низ:=пЧерта; (* место под кнопки *) верх[0]:=пВертЧерта; низ[0]:=пНУглы; верх[послк]:=пВертЧерта; низ[послк]:=пНУглы; (* существование кнопок *) закладки.естьЛеваяКнопка:=ОТКЛ; закладки.естьПраваяКнопка:=ОТКЛ; ЕСЛИ закладки.первая > 0 ТО закладки.естьЛеваяКнопка:=ВКЛ КОН; (* для всех видимых закладок *) к:=0; закладка:=закладки.первая; КОЛЬЦО ЕСЛИ (закладка >= закладки.закладок) ИЛИ (к >= послк) ТО ВЫХОД КОН; (* передний разделитель *) верх[к]:=пВертЧерта; ЕСЛИ закладка = закладки.открытая ТО низ[к]:=пПНУгол ИНАЧЕ ЕСЛИ закладка-1 = закладки.открытая ТО низ[к]:=пЛНУгол ИНАЧЕ низ[к]:=пНУглы КОН КОН; УВЕЛИЧИТЬ(к); (* текст *) поз:=0; КОЛЬЦО ЕСЛИ поз >= ДЛИНА(закладки.холсты[закладка].имя) ТО ВЫХОД КОН; ЕСЛИ к >= послк ТО закладки.естьПраваяКнопка:=ВКЛ; ВЫХОД КОН; знак:=закладки.холсты[закладка].имя[поз]; ЕСЛИ закладка = закладки.открытая ТО ЦвЗнак.ИзЗнакаИЦвета(знак,цОткрытая,верх[к]); низ[к]:=пОткрытыйПробел ИНАЧЕ ЦвЗнак.ИзЗнакаИЦвета(знак,цЗакрытая,верх[к]) КОН; УВЕЛИЧИТЬ(к); УВЕЛИЧИТЬ(поз) КОН; УВЕЛИЧИТЬ(закладка) КОН; (* задний разделитель *) верх[к]:=пВертЧерта; ЕСЛИ закладка-1 = закладки.открытая ТО низ[к]:=пЛНУгол ИНАЧЕ низ[к]:=пНУглы КОН; УВЕЛИЧИТЬ(к); (* свободное место *) ПОКА к < послк ВЫП верх[к]:=пЗакрытыйПробел; УВЕЛИЧИТЬ(к) КОН; (* кнопки *) ЕСЛИ закладки.естьЛеваяКнопка ТО цвет:=цРКнопка ИНАЧЕ цвет:=цНКнопка КОН; Окно.ПисатьЦвет(вс,лк,цвет); Окно.ПисатьЗнак(вс,лк,25C4X); Окно.ПисатьЦвет(нс,лк,цРамка); Окно.ПисатьЗнак(нс,лк,2500X); ЕСЛИ закладки.естьПраваяКнопка ТО цвет:=цРКнопка ИНАЧЕ цвет:=цНКнопка КОН; Окно.ПисатьЦвет(вс,пк,цвет); Окно.ПисатьЗнак(вс,пк,25BAX); Окно.ПисатьЦвет(нс,пк,цРамка); Окно.ПисатьЗнак(нс,пк,2500X); (* вывод *) Окно.ПисатьСтроку(верх,вс,лк+1,послк+1); Окно.ПисатьСтроку(низ,нс,лк+1,послк+1) КОН ОтрисовкаЗаголовка; (******************************************************************************) ЗАДАЧА ОтрисовкаОткрытой(закладки:Доступ); ПЕР отрисовка:Поле.Отрисовка; холст:Холст.Доступ; УКАЗ ЕСЛИ закладки.закладок = 0 ТО Окно.РазмерУказки(0); закладки.холст:=ПУСТО; Окно.ЦветнойПробел(закладки.вс+2,закладки.лк,закладки.нс,закладки.пк,Надел.цХолста) ИНАЧЕ холст:=закладки.холсты[закладки.открытая]; Рамка.Выставить(холст,закладки.поле); холст.Приём(холст,отрисовка); закладки.холст:=холст КОН КОН ОтрисовкаОткрытой; (******************************************************************************) ЗАДАЧА ВыровнятьПервую(закладки:Доступ); ПЕР длина:ЦЕЛ; первая:ЦЕЛ; УКАЗ ЕСЛИ закладки.закладок = 0 ТО ВОЗВРАТ КОН; ЕСЛИ закладки.первая > закладки.открытая ТО закладки.первая:=закладки.открытая ИНАЧЕ длина:=закладки.пк-закладки.лк-4; первая:=закладки.открытая; ПОКА длина > 0 ВЫП ЕСЛИ первая = закладки.первая ТО ВОЗВРАТ КОН; УМЕНЬШИТЬ(длина,ДЛИНА(закладки.холсты[первая].имя)+1); УМЕНЬШИТЬ(первая) КОН; закладки.первая:=первая+1 КОН КОН ВыровнятьПервую; (******************************************************************************) ЗАДАЧА НажатаМышка(закладки:Доступ; км:ЦЕЛ); ПЕР к,пк,закладка:ЦЕЛ; УКАЗ пк:=закладки.пк-закладки.лк; ЕСЛИ км <= 1 ТО ЕСЛИ закладки.естьЛеваяКнопка ТО УМЕНЬШИТЬ(закладки.первая) КОН АЕСЛИ км >= пк-1 ТО ЕСЛИ закладки.естьПраваяКнопка ТО УВЕЛИЧИТЬ(закладки.первая) КОН ИНАЧЕ закладка:=закладки.первая; к:=1; КОЛЬЦО ЕСЛИ (закладка >= закладки.закладок) ИЛИ (к >= пк-1) ТО ВЫХОД КОН; УВЕЛИЧИТЬ(к,ДЛИНА(закладки.холсты[закладка].имя)+1); ЕСЛИ км <= к ТО закладки.открытая:=закладка; ОтрисовкаОткрытой(закладки); ВЫХОД КОН; УВЕЛИЧИТЬ(закладка) КОН КОН; ОтрисовкаЗаголовка(закладки) КОН НажатаМышка; (******************************************************************************) ЗАДАЧА Приём(надел:Надел.Доступ; посылка+:Ввод.Посылка); ПЕР закладки:Доступ; ЗАДАЧА ПриёмУХолста; ПЕР холст:Холст.Доступ; УКАЗ холст:=закладки.холст; ЕСЛИ холст # ПУСТО ТО холст.Приём(холст,посылка) КОН КОН ПриёмУХолста; УКАЗ закладки:=надел(Доступ); ЕСЛИ закладки.былаОшибка ТО ОтрисовкаОткрытой(закладки); закладки.былаОшибка:=ОТКЛ КОН; ДЛЯ посылка ВИДА | Поле.Отрисовка: ОтрисовкаЗаголовка(закладки); ОтрисовкаОткрытой(закладки) | Ввод.ОтМышки: ЕСЛИ посылка.с < 2 ТО ЕСЛИ посылка.события = {} ТО НажатаМышка(закладки,посылка.к) КОН ИНАЧЕ УМЕНЬШИТЬ(посылка.с,2); ПриёмУХолста КОН ИНАЧЕ ПриёмУХолста КОН КОН Приём; (******************************************************************************) ЗАДАЧА Открыть-(закладки:Доступ; оИмяФ-:Файл.ВПолного); (* открывает закладку на холст с заданным именем файла *) ПЕР имяФ:Файл.ВПолного; холст:Холст.Доступ; закладка:ЦЕЛ; УКАЗ ОС.МестоФ(оИмяФ,имяФ); (* может закладка с таким именем файла уже существует *) ОТ закладка:=0 ДО закладки.закладок-1 ВЫП ЕСЛИ закладки.холсты[закладка].имяФ = имяФ ТО закладки.открытая:=закладка; ОтрисовкаЗаголовка(закладки); ОтрисовкаОткрытой(закладки); ВОЗВРАТ КОН КОН; (* создаём новую закладку *) ЕСЛИ закладки.закладок >= Закладок ТО ВОЗВРАТ КОН; холст:=Холст.СоздатьИзФайла(2,0,-1,0,имяФ); (* сажаем холст на наше поле *) холст.поле:=закладки.поле; холст.состояние:=Надел.сВыбран; (* добавляем холст в закладки *) закладки.холсты[закладки.закладок]:=холст; закладки.открытая:=закладки.закладок; УВЕЛИЧИТЬ(закладки.закладок); ОтрисовкаОткрытой(закладки); ВыровнятьПервую(закладки); ОтрисовкаЗаголовка(закладки) КОН Открыть; (******************************************************************************) ЗАДАЧА Удалить-(закладки:Доступ); (* удаляет открытую закладку *) ПЕР закладка,открытая:ЦЕЛ; УКАЗ ЕСЛИ закладки.закладок = 0 ТО ВОЗВРАТ КОН; УМЕНЬШИТЬ(закладки.закладок); открытая:=закладки.открытая; ОТ закладка:=открытая ДО закладки.закладок-1 ВЫП закладки.холсты[закладка]:=закладки.холсты[закладка+1] КОН; ЕСЛИ открытая = закладки.закладок ТО УМЕНЬШИТЬ(закладки.открытая) КОН; ОтрисовкаОткрытой(закладки); ВыровнятьПервую(закладки); ОтрисовкаЗаголовка(закладки) КОН Удалить; (******************************************************************************) ЗАДАЧА Следующая-(закладки:Доступ); (* выбор следующей закладки *) УКАЗ ЕСЛИ закладки.закладок = 0 ТО ВОЗВРАТ КОН; УВЕЛИЧИТЬ(закладки.открытая); ЕСЛИ закладки.открытая >= закладки.закладок ТО закладки.открытая:=0 КОН; ВыровнятьПервую(закладки); ОтрисовкаЗаголовка(закладки); ОтрисовкаОткрытой(закладки) КОН Следующая; (******************************************************************************) ЗАДАЧА СИзменениями-(закладки:Доступ):КЛЮЧ; (* Есть изменённые холсты? *) ПЕР закладка:ЦЕЛ; УКАЗ ОТ закладка:=0 ДО закладки.закладок-1 ВЫП ЕСЛИ закладки.холсты[закладка].изменён = "*" ТО ВОЗВРАТ ВКЛ КОН КОН; ВОЗВРАТ ОТКЛ КОН СИзменениями; (******************************************************************************) ЗАДАЧА СохранитьИзменённые-(закладки:Доступ); ПЕР закладка:ЦЕЛ; холст:Холст.Доступ; УКАЗ ОТ закладка:=0 ДО закладки.закладок-1 ВЫП холст:=закладки.холсты[закладка]; ЕСЛИ холст.изменён = "*" ТО ЕСЛИ Холст.СохранитьВФайл(холст) ТО КОН КОН КОН КОН СохранитьИзменённые; (******************************************************************************) ЗАДАЧА Создать-(верх,лево,строк,колонок:ЦЕЛ):Доступ; ПЕР закладки:Доступ; УКАЗ СОЗДАТЬ(закладки); Надел.Подготовить(закладки,верх,лево,строк,колонок,{Надел.прВыбираемый},Приём); ВОЗВРАТ закладки КОН Создать; (******************************************************************************) ЗАДАЧА ВыводОшибки-(закладки:Доступ; имяФ-:Файл.ВПолного; с,к:ЦЕЛ; текст-:ЦЕПЬ); ПЕР нс,лк,пк:ЦЕЛ; УКАЗ Открыть(закладки,имяФ); ЕСЛИ закладки.закладок = 0 ТО ВОЗВРАТ КОН; Холст.ВыставитьУказку(закладки.холст,с-1,к-1); нс:=закладки.нс; лк:=закладки.лк; пк:=закладки.пк; Окно.ЦветнойПробел(нс,лк,нс,пк,Надел.цПредупреждения); Окно.Цепь(нс,лк,нс,пк,текст); закладки.былаОшибка:=ВКЛ КОН ВыводОшибки; (******************************************************************************) УКАЗ ПодготовитьПостоянные КОН Закладки. |
▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com
|
|