Zorko писал(а):
Столкнулся с ошибкой в модуле Master/Mod/ColorViews.odc, которую даже не знаю как исправлять (ввиду слабого знания BlackBox API). Ошибка проявляется при наличии в автоподсвечиваемом исходнике маркеров. При этом первый раз не срабатывает копирование выделенного текста. Воспроизвести можно так. Откройте, например, модуль WinDev/Mod/ASCII.Mod, внесите искусственно ошибку, скомпилируйте (F11) и, когда маркер ошибки появится, выделите любой фрагмент текста и скопируйте его (Ctrl+C или выбором «Копировать» в контекстном меню, без разницы). Теперь если вставить текст из буфера — это не будет скопированный только что фрагмент. Но если скопировать повторно, во второй раз, тогда скопируется. Ошибка эта не очень критична, но конечно некрасива, и исправить надо, так что буду рад помощи или совету.
Покопался в потрохах ББ и вот что удалось понять (не претендую на полное знание этих "потрохов", выяснял больше методом тыка
).
ColorViews отслеживает события Controllers.EditMsg в процедуре PROCEDURE (v: View) HandleCtrlMsg*(...). Это ввод\удаление символа и операции с буфером обмена , в т.ч. и Ctrl+C «Копировать». На каждую такую операцию происходит перераскраска отображения (View) текста программы (Text). При ошибке Ofront вставляет в текст маркер ошибки, но это не событие EditMsg, поэтому ColorViews пока об этом не знает. Мы выделяем текст, но это тоже не EditMsg. А теперь нажали Ctrl+C - вот это уже EditMsg! HandleCtrlMsg запускает Colorize, определенную в этом же модуле, в которой вызывается MasterColors.ColorizeText. ColorizeText просматривает текст, видит маркер ошибки и изменяет его атрибуты на "лучшие" с точки зрения этого Мастера. Текст оповещает все свои отображения, что он изменился, в результате чего выделение сбрасывается и в буфер нечего копировать. Поэтому копирование не срабатывает.
Почему оно срабатывает в следующий раз? А потому что атрибуты у маркера ошибок уже "хорошие" с точки зрения Мастера, поэтому они не меняются и текст не посылает сообщение своим вьюшкам об обновлении.
Поэтому же не мешает копированию в буфер маркер ошибок, появляющийся по Ctrl-K, потому что у него изначально "хорошие" текстовые атрибуты. А может совсем атрибуты при вставке не задаются или вставляется маркер каким-то образом, что Мастер это замечает и успевает атрибуты сменить. Кстати, видно, что маркеры по Ctrl-K и по F11 отличаются, а после нажатия любой клавиши маркер Ofront'a превращается в «стандартный».
Если изменить атрибуты какого-то участка текста, то Ctrl+C тоже не сработает, пока Мастер не изменит эти атрибуты в соответствии со своими правилами.
Для Ctrl+C «Copy» исправить это несложно. Ведь эта команда не изменяет текст, а значит и перекрашивать его не надо. Поэтому изменим в модуле MasterColorViews процедуру
Код: "OBERON"
PROCEDURE (v: View) HandleCtrlMsg* (f: Views.Frame; VAR msg: Controllers.Message; VAR focus: Views.View);
BEGIN
WITH
| msg: Controllers.EditMsg DO
IF msg.op # Controllers.copy THEN (*добавили вот это условие*)
v.Colorize(); v.needRefresh := TRUE
END
| msg: Controllers.TickMsg DO
IF v.needRefresh THEN v.needRefresh := FALSE; v.Colorize() END
ELSE
END;
focus := v.inner;
END HandleCtrlMsg;
Всё бы хорошо, но такая же проблема и с операцией Ctrl-X “Cut”. Можно конечно написать
Код: "OBERON"
IF (msg.op # Controllers.copy) & (msg.op # Controllers.cut) THEN
v.Colorize(); v.needRefresh := TRUE
END
но это неправильно, потому что вырезание как-раз меняет текст, в результате чего может измениться окраска — попробуйте, например, вырезать в буфер часть ключевого слова. Так что для Ctrl-X “Cut” проблема пока открыта.