OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Суббота, 30 Март, 2024 02:46

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




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
СообщениеДобавлено: Суббота, 25 Март, 2023 12:22 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 79
Я посылаю на выполнение контейнером TextModels.Model (или же контейнером является TextViews - пока не разобрался) запрос от встроенного отображения:
Код:
TYPE
   MyProposal* = RECORD (Models.Proposal)
   END;
...
VAR myProposal;
innerView.context.Consider (myProposal);

Далее импортирую эту запись в модуль, в котором и создаю текстовый контейнер. Но вот как обработать этот запрос?
Неужели надо обязательно переопределять Context?
Код:
TYPE
   MyContext = POINTER TO RECORD (TextModels.Context);
   END;

Но в этом случае придётся заново переписывать все абстрактные методы (Attr, Pos, ThisModel, GetSize, Normalize), а это такой геморрой... Одним словом - лень. Нельзя ли как-нибудь попроще?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 25 Март, 2023 14:09 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
В Блэкбоксе контейнеры не умеют никакие такие Proposal отбаратывать. А вот если создаёте свой контейнер, то для него уже сделайте свой контекст, который что-то вашему контейнеру сможет через контекст передавать от встроенных отображений.

"Далее импортирую эту запись в модуль, в котором и создаю текстовый контейнер"
точно контейнер, а не модель или вид?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 25 Март, 2023 19:08 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 79
Да, вид:
Код:
t := TextModels.dir.New();
v := TextViews.dir.New(t);

Как я понял, вот это текстовое отображение, контейнер, связывается с внедрённым отображением посредством Models.Context. Там даже реализована возможность изменять размеры внедрённого отображения через innerView.context.SetSize (w, h). Кстати, когда я сам пробовал реализовать это, то в контексте реализовывал метод:
Код:
PROCEDURE (obj: Context) SetSize (w, h: INTEGER);
BEGIN
   Properties.PreferredSize (obj.innerView, 50 * Ports.point, 60 * Ports.point, 100 * Ports.point, 200 * Ports.point, 55 * Ports.point, 150 * Ports.point, w, h);

Правда никакого эффекта не получил.

Неужели придётся переписывать весь TextViews ради реакции на Proposal?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 25 Март, 2023 19:17 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 79
Например, хочу я реализовать такую штуку: во внедрённом отображении движется мишень и когда кликаешь на ней, в текстовом отображении-контейнере выводится надпись: попал, столько-то очков. Выводить это в рабочий журнал не выход: я хочу в последующем распечатать текст вместе с мишенью.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 29 Март, 2023 20:59 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Получить модель контекста, куда встроено ваше отображение, довольно просто через
v.context.ThisModel()

останется только привести к типу текстовой модели, и можете подключать сканнер и форматтер, чтобы писать в неё
v.context.ThisModel()(TextModels.Model)


Пример модуля для вашей задачи:
Код:
MODULE DemoContextPrint;

IMPORT Views, Ports, Models, Controllers, TextMappers, TextModels, Properties;

TYPE
   View = POINTER TO RECORD (Views.View) END;

   PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER);
   VAR w, h: INTEGER;
   BEGIN
      v.context.GetSize(w, h);
      f.DrawOval(0, 0, w, h, Ports.fill, Ports.blue);
   END Restore;

   PROCEDURE (v: View) HandleCtrlMsg (f: Views.Frame;
      VAR msg: Controllers.Message; VAR focus: Views.View);
   VAR wr: TextMappers.Formatter;
   BEGIN
      WITH msg: Controllers.TrackMsg DO
         wr.ConnectTo(v.context.ThisModel()(TextModels.Model));
         wr.WriteString("test"); wr.WriteLn;
      ELSE END
   END HandleCtrlMsg;

   PROCEDURE (v: View) HandlePropMsg (VAR msg: Properties.Message);
   BEGIN
      WITH msg: Properties.FocusPref DO
         msg.hotFocus := TRUE
      ELSE END
   END HandlePropMsg;

   PROCEDURE Deposit*;
   VAR v: View;
   BEGIN
      NEW(v);
      Views.Deposit(v)
   END Deposit;

END DemoContextPrint.

"DemoContextPrint.Deposit; StdCmds.PasteView"


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 29 Март, 2023 22:08 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Александр К писал(а):
Там даже реализована возможность изменять размеры внедрённого отображения через innerView.context.SetSize (w, h). Кстати, когда я сам пробовал реализовать это, то в контексте реализовывал метод:
Код:
PROCEDURE (obj: Context) SetSize (w, h: INTEGER);
BEGIN
   Properties.PreferredSize (obj.innerView, 50 * Ports.point, 60 * Ports.point, 100 * Ports.point, 200 * Ports.point, 55 * Ports.point, 150 * Ports.point, w, h);

Правда никакого эффекта не получил.


Тут немного иначе, контекст как разу нужен, чтобы вы из родительского вида указать размеры.

Типовая реализация такая:
Код:
   PROCEDURE (c: Context) SetSize (w, h: INTEGER);
   BEGIN c.w := w; c.h := h
   END SetSize;



И потом из Restore уже перед установкой встроенных видов, передать их контекстам требуемые размеры.
Вот кусочек реального кода, который рисует у меня кнопки на панели инструментов:
Код:
   PROCEDURE (v: PanelView) Restore* (f: Views.Frame; l_, t_, r_, b_: INTEGER);
   VAR w, h, last: INTEGER; button: PanelButton; asc, dsc, fw: INTEGER;
   BEGIN
      v.context.GetSize(w, h);
      f.DrawRect(0, 0, w, panelHeightPx * Ports.point, - 1, param.backgroundColor);
      button := v.root;
      WHILE button # NIL DO
         button.context.SetSize(button.w * Ports.point, button.h  * Ports.point);
         Views.InstallFrame(f, button, button.x * Ports.point, button.y * Ports.point, 0, TRUE);
         last := button.x * Ports.point + button.w * Ports.point;
         button := button.next;
      END;
      
      fontStatus.GetBounds(asc, dsc, fw);
      f.DrawString(last + 200 * Ports.point, h DIV 2 + (asc - dsc) DIV 2, param.statusColor, status, fontStatus)
   END Restore;


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 01 Апрель, 2023 16:21 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 79
Цитата:
останется только привести к типу текстовой модели, и можете подключать сканнер и форматтер, чтобы писать в неё
v.context.ThisModel()(TextModels.Model)

Нет, писать я собираюсь в контейнер и именно в тот момент, когда происходит событие во встроенном отображении, например при попадании в мишень. Для этого у типа Context в модуле Models есть метод:
Код:
(c: Context) Consider (VAR p: Proposal), NEW, EMPTY;

Но как им воспользоваться применительно к текстовому TextViews?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 01 Апрель, 2023 21:37 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Никак, текстовый контекст никак не поддерживает такие "предложения". Это метод и механизм для каких-то других пользовательских контекстов.

Поизучайте мой пример выше, я уверен, что там можно модифицировать под попадании в мишень без особых проблем. Неясно зачем вам усложнять систему, если у вас есть прямой доступ к текстовой модели, куда вставлено ваше отображение с мишенью.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 01 Апрель, 2023 22:19 

Зарегистрирован: Воскресенье, 25 Декабрь, 2022 23:14
Сообщения: 1163
у меня есть подозрение, что мы тут наблюдаем классическую попытку оверинжиниринга, основаную или на неверном понимании границ изоляции, или на попытке решить более общую (несуществующую) задачу при помощи адаптации решения задачи конкретной.

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

а если это попытка решить какую-то другую задачу, используя мишень как пример, то так опять не работает, потому что другая задача может потребовать другого решения, и пытаться сделать одно универсальное на все случаи может быть не лучшей идеей.

механизм предложений (proposals) служит немного для другой цели. если вам очень надо создать контейнер, который будет содержать текст и ваш view — то вам таки опять в ObxTwins, где показано, как делать контейнеры-«хозяева». а если вы хотите внедрять ваш view в произвольный текстовый документ, и чтобы он в этот же документ писал результаты… а точно так надо, это точно не оверинжиниринг опять?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 02 Апрель, 2023 06:19 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
А вот вопрос, мишень внедрена в текстовое отображение? Или текстовое отображение является встроенным в некий ваш вид, как и мишень?


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

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


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

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


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

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