OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 29 Июль, 2021 20:58

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: #040 Ошибка в реализации форм
СообщениеДобавлено: Четверг, 26 Ноябрь, 2020 03:24 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 494
Коллеги, я взялся делать реализацию FormControllers.Controller, и обнаружил, что FormControllers.Focus() не "видит" никаких реализаций контроллеров, кроме стандартных.

Чтобы найти контроллер в фокусе, она посылает сообщение PollFocusMsg:
Код:
   PROCEDURE Focus* (): Controller;
      VAR msg: PollFocusMsg;
   BEGIN
      msg.c := NIL;
      Controllers.Forward(msg);
      RETURN msg.c
   END Focus;


И на это сообщение откликается стандартный контроллер:

Код:
   PROCEDURE (c: StdController) HandleCtrlMsg (f: Views.Frame; VAR msg: Views.CtrlMessage;
                                                         VAR focus: Views.View);
   BEGIN
      WITH msg: PollFocusMsg DO
         c.HandleCtrlMsg^(f, msg, focus);
         msg.c := c
      ELSE
         c.HandleCtrlMsg^(f, msg, focus)
      END
   END HandleCtrlMsg;


И вот беда: PollFocusMsg не экспортируется. Поэтому никакая другая реализация контроллера не может откликнуться на него, и потому невидима для Focus().

Замечу, что TextControllers.Focus() реализована иначе, не задействуя сообщения напрямую:
Код:
   PROCEDURE (*TextControllers.*)Focus* (): Controller;
      VAR v: Views.View; c: Containers.Controller;
   BEGIN
      v := Controllers.FocusView();
      IF (v # NIL) & (v IS TextViews.View) THEN
         c := v(TextViews.View).ThisController();
         IF (c # NIL) & (c IS Controller) THEN RETURN c(Controller)
         ELSE RETURN NIL
         END
      ELSE RETURN NIL
      END
   END Focus;


Предлагаю исправить эту ошибку, вариантов несколько:
1) Экспортировать PollFocusMsg из FormControllers, либо
2) Перенести отклик на PollFocusMsg из скрытого FormControllers.StdController.HandleCtrlMsg в FormControllers.Controllers.HandleCtrlMsg. При этом придется сделать его EXTENSIBLE и вызывать из расширений, либо делать нерасширимым и вводить HandleCtrlMsg2. Громоздко.
3) Переделать вообще реализацию по типу TextControllers. В этом варианте вообще никакие интерфейсы затрагивать не придется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в реализации форм
СообщениеДобавлено: Четверг, 26 Ноябрь, 2020 06:48 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3124
Было бы здорово иметь какой-то пример для тестирования и документирования такого изменения. Можете поделиться своим альтернативным элементом управления? Хотя бы в каком-то минимальном виде для иллюстрации.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в реализации форм
СообщениеДобавлено: Четверг, 26 Ноябрь, 2020 10:07 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Предположу (в меру неполного понимания ситуации), что это недоделка -- они сами не успели окончательно решить, как сделать. В принципе обычная ситуация при разработке сложного каркаса.

Такой вывод чему-нибудь противоречит?

Нужно смотреть на конкретный пример, взятый из реальности.

Можно еще прикинуть, что у них было сделано раньше, что позже. Более позднее решение может быть попыткой дать более правильное решение.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: #040 Ошибка в реализации форм
СообщениеДобавлено: Четверг, 26 Ноябрь, 2020 18:15 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 494
Формоконтроллер я получил так: взял FormControllers, сохранил как ChartControllers, выпилил все что касается Controller, оставил то, что касается StdController. Вот и все. Делал ради того, чтобы обрабатывать клавиши особым образом - переопределить ArrowChar и/или HandleCtrlMsg.

Для запуска из меню добавил процедуры ChartControllers.ToggleFocusCtrl и ChartControllers.CtrlGuard - переключают на фокусной форме контроллер между стандартным и моим, и галочку рисуют, когда контроллер у формы мой.

Чтобы продемонстрировать ошибку: на форме разместить кадр (view) и убедиться, что пункт меню Layout->ForceToGrid (силой за решетку :) ) доступен. Затем включить мой контроллер, и убедиться, что силой за решетку уже не посадишь - пункт меню недоступен.


Вложения:
Controllers.odc [29.09 КБ]
Скачиваний: 60
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка в реализации форм
СообщениеДобавлено: Четверг, 26 Ноябрь, 2020 19:41 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 494
Info21 писал(а):
Предположу (в меру неполного понимания ситуации), что это недоделка -- они сами не успели окончательно решить, как сделать. В принципе обычная ситуация при разработке сложного каркаса.

Такой вывод чему-нибудь противоречит?

Нужно смотреть на конкретный пример, взятый из реальности.

Можно еще прикинуть, что у них было сделано раньше, что позже. Более позднее решение может быть попыткой дать более правильное решение.


Да наэн так и есть - недоделка, небольшой огрех. Я нахожу у себя подобные огрехи, когда делаю "нестандартную реализацию" абстрактного интерфейса в еще одном модуле - это заставляет прояснять взаимоотношения между базовым/расширяющим типами, процедурами, экспортировать нужные константы и т.п. Вероятно, стандартный формоконтроллер удовлетворительно хорош, и иную реализацию никогда не делали, и не обнаружилась эта проблема.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

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


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

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


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

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