OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 20:16

Часовой пояс: UTC + 3 часа




Форум закрыт Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 5 ] 
Автор Сообщение
СообщениеДобавлено: Понедельник, 26 Июль, 2010 11:46 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
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 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Не эквивалентная замена 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 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Евгений, а можете немного подробнее, почему она не эквивалентна?
Также, если у Вас родилось понимание Properties.TypePref, то не могли бы, пожалуйста, изложить суть?

Интерес в связи с обсуждением фикса: http://forum.blackboxframework.org/view ... =238#p2196


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Май, 2015 16:12 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Обертки не всегда наследники. Сообщения проходят, а типы предков могут не совпадать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 26 Май, 2015 20:07 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Пётр Кушнир писал(а):
Обертки не всегда наследники. Сообщения проходят, а типы предков могут не совпадать.

Спасибо! Вроде понял. Написал пример для понятности.

Код:
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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Форум закрыт Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB