OberonCore https://forum.oberoncore.ru/ |
|
#040 Ошибка в реализации форм https://forum.oberoncore.ru/viewtopic.php?f=134&t=6682 |
Страница 1 из 1 |
Автор: | adimetrius [ Четверг, 26 Ноябрь, 2020 03:24 ] |
Заголовок сообщения: | #040 Ошибка в реализации форм |
Коллеги, я взялся делать реализацию 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. В этом варианте вообще никакие интерфейсы затрагивать не придется. |
Автор: | Иван Денисов [ Четверг, 26 Ноябрь, 2020 06:48 ] |
Заголовок сообщения: | Re: Ошибка в реализации форм |
Было бы здорово иметь какой-то пример для тестирования и документирования такого изменения. Можете поделиться своим альтернативным элементом управления? Хотя бы в каком-то минимальном виде для иллюстрации. |
Автор: | Info21 [ Четверг, 26 Ноябрь, 2020 10:07 ] |
Заголовок сообщения: | Re: Ошибка в реализации форм |
Предположу (в меру неполного понимания ситуации), что это недоделка -- они сами не успели окончательно решить, как сделать. В принципе обычная ситуация при разработке сложного каркаса. Такой вывод чему-нибудь противоречит? Нужно смотреть на конкретный пример, взятый из реальности. Можно еще прикинуть, что у них было сделано раньше, что позже. Более позднее решение может быть попыткой дать более правильное решение. |
Автор: | adimetrius [ Четверг, 26 Ноябрь, 2020 18:15 ] | ||
Заголовок сообщения: | Re: #040 Ошибка в реализации форм | ||
Формоконтроллер я получил так: взял FormControllers, сохранил как ChartControllers, выпилил все что касается Controller, оставил то, что касается StdController. Вот и все. Делал ради того, чтобы обрабатывать клавиши особым образом - переопределить ArrowChar и/или HandleCtrlMsg. Для запуска из меню добавил процедуры ChartControllers.ToggleFocusCtrl и ChartControllers.CtrlGuard - переключают на фокусной форме контроллер между стандартным и моим, и галочку рисуют, когда контроллер у формы мой. Чтобы продемонстрировать ошибку: на форме разместить кадр (view) и убедиться, что пункт меню Layout->ForceToGrid (силой за решетку ) доступен. Затем включить мой контроллер, и убедиться, что силой за решетку уже не посадишь - пункт меню недоступен.
|
Автор: | adimetrius [ Четверг, 26 Ноябрь, 2020 19:41 ] |
Заголовок сообщения: | Re: Ошибка в реализации форм |
Info21 писал(а): Предположу (в меру неполного понимания ситуации), что это недоделка -- они сами не успели окончательно решить, как сделать. В принципе обычная ситуация при разработке сложного каркаса. Такой вывод чему-нибудь противоречит? Нужно смотреть на конкретный пример, взятый из реальности. Можно еще прикинуть, что у них было сделано раньше, что позже. Более позднее решение может быть попыткой дать более правильное решение. Да наэн так и есть - недоделка, небольшой огрех. Я нахожу у себя подобные огрехи, когда делаю "нестандартную реализацию" абстрактного интерфейса в еще одном модуле - это заставляет прояснять взаимоотношения между базовым/расширяющим типами, процедурами, экспортировать нужные константы и т.п. Вероятно, стандартный формоконтроллер удовлетворительно хорош, и иную реализацию никогда не делали, и не обнаружилась эта проблема. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |