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/