OberonCore https://forum.oberoncore.ru/ |
|
B11: DevCommanders.par: неверно определяются beg и end https://forum.oberoncore.ru/viewtopic.php?f=116&t=2752 |
Страница 1 из 1 |
Автор: | Евгений Темиргалеев [ Понедельник, 26 Июль, 2010 11:46 ] |
Заголовок сообщения: | B11: DevCommanders.par: неверно определяются beg и end |
1) Для командера в конце текста д.б. par.beg = par.end = par.text.Length() выходит par.beg = par.text.Length() - 1 par.end = par.text.Length() испр: Код: PROCEDURE Execute (t: TextModels.Model; pos: INTEGER; VAR end: INTEGER; unload: BOOLEAN); VAR s: Scanner; beg, res: INTEGER; cmd: Dialog.String; BEGIN ... IF s.s.type IN {qualident, TextMappers.string} THEN beg := s.s.Pos()(* - 1 *); IF ~s.s.rider.eot THEN DEC(beg) END; GetParExtend(s.s.rider, end); ASSERT(~cleanerInstalled, 101); ... END END Execute; 2) обновл. 27.07.2011 Когда список параметров пуст и сразу заканчивается коммандером (^Q или ~), то коммандер не отрабатывает как стопор: - перед вызовом GetParExtent в Execute s.s.rider уже содержит предпрочитанной одну "позицию" (особенность работы сканера). - в GetParExtent используется r.ReadView, который не предполагает предпрочтения и "начинается" с r.Read. Испр. + переписан цикл: Код: PROCEDURE GetParExtend (r: TextModels.Reader; VAR end: INTEGER);
VAR v: Views.View; BEGIN IF r.view # NIL THEN v := r.view ELSE r.ReadView(v) END; WHILE ~r.eot & ~( Services.Is(v, "DevCommanders.View") OR Services.Is(v, "DevCommanders.EndView") ) DO r.ReadView(v) END; end := r.Pos(); IF ~r.eot THEN DEC(end) END END GetParExtend; |
Автор: | Евгений Темиргалеев [ Понедельник, 28 Октябрь, 2013 23:46 ] |
Заголовок сообщения: | Re: B11: DevCommanders.par: неверно определяются beg и end |
Не эквивалентная замена Properties.ThisType на Services.Is отменена Код: WHILE ~r.eot & ~( (v # NIL) & ( (Properties.ThisType(v, "DevCommanders.View") # NIL) OR (Properties.ThisType(v, "DevCommanders.EndView") # NIL) ) ) DO
r.ReadView(v) END; |
Автор: | Иван Денисов [ Вторник, 26 Май, 2015 14:13 ] |
Заголовок сообщения: | Re: B11: DevCommanders.par: неверно определяются beg и end |
Евгений, а можете немного подробнее, почему она не эквивалентна? Также, если у Вас родилось понимание Properties.TypePref, то не могли бы, пожалуйста, изложить суть? Интерес в связи с обсуждением фикса: http://forum.blackboxframework.org/view ... =238#p2196 |
Автор: | Пётр Кушнир [ Вторник, 26 Май, 2015 16:12 ] |
Заголовок сообщения: | Re: B11: DevCommanders.par: неверно определяются beg и end |
Обертки не всегда наследники. Сообщения проходят, а типы предков могут не совпадать. |
Автор: | Иван Денисов [ Вторник, 26 Май, 2015 20:07 ] |
Заголовок сообщения: | Re: B11: DevCommanders.par: неверно определяются beg и end |
Пётр Кушнир писал(а): Обертки не всегда наследники. Сообщения проходят, а типы предков могут не совпадать. Спасибо! Вроде понял. Написал пример для понятности. Код: MODULE DemoWrapper;
IMPORT Log, Views, Properties, Ports, Stores, Services; TYPE View = POINTER TO ABSTRACT RECORD (Views.View) END; StdView = POINTER TO RECORD (View) END; StdViewWrapper = POINTER TO RECORD (Views.View) inner: StdView; END; PROCEDURE (v: StdView) Restore (f: Views.Frame; l, t, r, b: INTEGER); BEGIN f.DrawRect(l, t, r, b, Ports.fill, Ports.red) END Restore; PROCEDURE (v: StdViewWrapper) Restore (f: Views.Frame; l, t, r, b: INTEGER); BEGIN Views.InstallFrame(f, v.inner, 0, 100 * f.dot, 0, TRUE) END Restore; PROCEDURE (v: StdView) HandlePropMsg (VAR msg: Properties.Message); BEGIN WITH msg: Properties.Preference DO WITH msg: Properties.TypePref DO IF Services.Is(v, msg.type) THEN msg.view := v END ELSE END ELSE END END HandlePropMsg; PROCEDURE (v: StdViewWrapper) HandlePropMsg (VAR msg: Properties.Message); BEGIN Views.HandlePropMsg(v.inner, msg) END HandlePropMsg; PROCEDURE New(): View; VAR v: StdView; BEGIN NEW(v); RETURN v END New; PROCEDURE Wrap(inner: View): StdViewWrapper; VAR v: StdViewWrapper; BEGIN NEW(v); WITH inner: StdView DO v.inner := inner; Stores.Join(v, v.inner); RETURN v ELSE RETURN NIL END END Wrap; PROCEDURE Do*; VAR v1: View; v2: StdViewWrapper; BEGIN v1 := New(); v2 := Wrap(v1); IF Properties.ThisType(v1, "DemoWrapper.StdView") # NIL THEN Log.Bool(v1 IS StdView); Log.Ln; END; IF Properties.ThisType(v2, "DemoWrapper.StdView") # NIL THEN Log.Bool(TRUE); Log.Ln; END; END Do; END DemoWrapper. DemoWrapper.Do |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |