OberonCore
https://forum.oberoncore.ru/

Как правильно открыть модель в разных документах?
https://forum.oberoncore.ru/viewtopic.php?f=24&t=6861
Страница 1 из 1

Автор:  GameHunter [ Среда, 27 Июль, 2022 20:39 ]
Заголовок сообщения:  Как правильно открыть модель в разных документах?

Здравствуйте.

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

Код:
PROCEDURE Do1 * ();
  VAR
    m:TextModels.Model;
    v1,v2:TextViews.View;
  BEGIN
    m:=TextModels.dir.New();
    m.NewWriter(NIL).WriteChar('0');
    v1:=TextViews.dir.New(m);
    v2:=TextViews.dir.New(m);
    Views.OpenView( v1 );
    Views.OpenView( v2 );
  END Do1;


Но при этом эти окошки не являются независимыми документами: если закрыть первый документ, то закрывается и второй; если второй документ помечен как несохранённый (dirty), то при его закрывании не выдаётся запрос на сохранение.

Вопрос: как открыть модель в разных документах, чтобы они по настоящему были независимыми?

Автор:  GameHunter [ Среда, 27 Июль, 2022 20:41 ]
Заголовок сообщения:  Re: Как правильно открыть модель в разных документах?

BB 1.8-b1 build number 166

Автор:  Trurl [ Четверг, 28 Июль, 2022 07:33 ]
Заголовок сообщения:  Re: Как правильно открыть модель в разных документах?

GameHunter писал(а):
Вопрос: как открыть модель в разных документах, чтобы они по настоящему были независимыми?

Модель это и есть документ. Если хотите разные документы, создавайте разные модели.

Автор:  GameHunter [ Четверг, 28 Июль, 2022 17:34 ]
Заголовок сообщения:  Re: Как правильно открыть модель в разных документах?

Цитата:
Модель это и есть документ...

Да вроде бы нет... Вроди бы контейнеры могут содержать самые разнообразные вьюшки со своими моделями...

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

Автор:  Илья Ермаков [ Суббота, 30 Июль, 2022 17:09 ]
Заголовок сообщения:  Re: Как правильно открыть модель в разных документах?

Нужно чуть больше подробностей того, что вы хотите.

Вопрос, что вы понимаете под "независимые". Модель-то одна - уже зависимость.

Автор:  GameHunter [ Воскресенье, 31 Июль, 2022 16:19 ]
Заголовок сообщения:  Re: Как правильно открыть модель в разных документах?

Хочу к некоторым документам приделать снизу что-то вроде продвинутого статусбара - это будет вьюшка, отображающая текстовую модель. Этот "статусбар" и будет себя вести как статусбар - т.е. он не будет сохраняться в документ. Проблема в том, что если в разные документы внедрить общую модель (при этом получается, что оба документа принадлежат одному domain'у), то появляются описанные выше побочные эффекты.

Автор:  Илья Ермаков [ Понедельник, 01 Август, 2022 23:28 ]
Заголовок сообщения:  Re: Как правильно открыть модель в разных документах?

Ну а отображаемый статус глобален?

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

И вставлять во все документы независимо.

Автор:  GameHunter [ Вторник, 02 Август, 2022 03:51 ]
Заголовок сообщения:  Re: Как правильно открыть модель в разных документах?

То есть надо копировать текст, отражающий глобальное состояние, в каждый документ, правильно я понял?

Автор:  Иван Денисов [ Среда, 03 Август, 2022 20:11 ]
Заголовок сообщения:  Re: Как правильно открыть модель в разных документах?

То, что вы хотите сделать, называется обертка "wrapper".
Посмотрите пример ObxWrappers.

Автор:  GameHunter [ Вторник, 09 Август, 2022 00:53 ]
Заголовок сообщения:  Re: Как правильно открыть модель в разных документах?

Обёртки я уже освоил. Дело не в этом. Проблема, кажется, в том, что если открывать модель в разных вьюшках, а эти вьюшки открывають в разных документах, то получается, что разные документы принадлежат к одному Domain'у, и тогда имеют место описанные выше побочные эффекты. Запустите процедурку, которую я привёл в самом начале, - и сразу увидите проблему.

Автор:  Иван Денисов [ Вторник, 09 Август, 2022 09:02 ]
Заголовок сообщения:  Re: Как правильно открыть модель в разных документах?

GameHunter писал(а):
Обёртки я уже освоил. Дело не в этом. Проблема, кажется, в том, что если открывать модель в разных вьюшках, а эти вьюшки открывають в разных документах, то получается, что разные документы принадлежат к одному Domain'у, и тогда имеют место описанные выше побочные эффекты. Запустите процедурку, которую я привёл в самом начале, - и сразу увидите проблему.

Так это не проблема - а заложенное поведение. Он вам не даёт создать второй документ, не связанный с первым. Иначе бы посыпалась внутренняя логика работы фреймворка. Поэтому реально создаётся только один документ для одной модели. А потом открываются только визуальные копии одного документа с разными видами.

Автор:  Иван Денисов [ Вторник, 09 Август, 2022 09:07 ]
Заголовок сообщения:  Re: Как правильно открыть модель в разных документах?

Ещё, когда хотите, чтобы народ ваш тест запустил, лучше приводите весь код вот так примерно. А то приходится дописывать.

Код:
MODULE TestTest;

   IMPORT TextModels, TextViews, Views;
   
   PROCEDURE Do1* ();
  VAR
    m:TextModels.Model;
    v1,v2:TextViews.View;
  BEGIN
    m:=TextModels.dir.New();
    m.NewWriter(NIL).WriteChar('0');
    v1:=TextViews.dir.New(m);
    v2:=TextViews.dir.New(m);
    Views.OpenView( v1 );
    Views.OpenView( v2 );
  END Do1;

END TestTest.Do1

Автор:  GameHunter [ Вторник, 09 Август, 2022 20:05 ]
Заголовок сообщения:  Re: Как правильно открыть модель в разных документах?

Спасибо. Ясно.

Ворчание: у меня, как у пользователя (а не разработчика) системы, создаётся впечатление, что от этих domain'ов только вред, т.к. пользы от них никакой, а при взаимодействии разных документов то и дело приходится обходить ограничения этих domain'ов: делать копии моделей и вьюшек без видимой необходимости.

Автор:  Иван Денисов [ Среда, 10 Август, 2022 21:48 ]
Заголовок сообщения:  Re: Как правильно открыть модель в разных документах?

От доменов большая польза, когда у вас составные документы появляются в проектах. И вам не приходится писать сложные интеграционные механизмы, чтобы они восстанавливались потом после загрузки с диска. А также домены делают Блэкбокс таким быстрым. Сообщения от модели видим идут только внутри доменов, а не как попало. И это экономит кучу ресурсов. Поэтому сообщения в Блэкбоксе недорогие вычислительно. Используйте чаще сообщения.

Автор:  adimetrius [ Воскресенье, 23 Октябрь, 2022 17:11 ]
Заголовок сообщения:  Re: Как правильно открыть модель в разных документах?

Цитата:
Вопрос: как открыть модель в разных документах, чтобы они по настоящему были независимыми?

В разных документах можно открыть по-настоящему независимые (несцепленные) виды на одну модель:
Код:
PROCEDURE Do* ();
   PROCEDURE Do*;
      VAR t: TextModels.Model; v1, v2: TextViews.View; doc: Documents.Document;
   BEGIN
      t := TextModels.dir.NewFromString('Make it as simple as possible, but not simpler');
      v1 := TextViews.dir.New(t);
      Views.OpenView(v1);
      
      v2 := TextViews.dir.New(t);
      doc := Documents.dir.New(v2, Views.undefined, Views.undefined);
      Windows.dir.Open(Windows.dir.New(), doc, {}, 'Title', Files.dir.This(''), 'file.name', Converters.list);
   END Do;


Т.е. Views.OpenView сцепляет вид с ранее открытыми видами в том же домене. Если это нежелательно - можно использовать другие средства.

Однако, кмк, это не поможет решить поставленную задачу.

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

Разберу ситуацию.

Вид А на модель МА в окне 1; это отдельный (я полагаю) документ/файл => отдельный домен ДА.
Вид Б на модель МБ в окне 2; это отдельный документ/файл => отдельный домен ДБ.

В оба вида А и Б вы вставляете вид В на модель МВ.
Тут не возникнет проблем, но есть нюанс. Модельные и видовые сообщения рассылаются не "повсюду", а в рамках домена; при этом считается, что одно окно = один домен. Выходит, что если вы отправите модельное сообщение для модели МВ, а вид В встроен в окно 1 в домене ДА, то вид В не получит этого сообщения. Так же и в окне 2 в домене ДБ. То же касается и видовых сообщений; а если учесть, что Views.Update работает с помощью видовых сообщений, то визуально будет картинка, что вид В перестал рисоваться и обновляться вообще.

Как же решить задачу?
1) Использовать широковещательную рассылку для всех своих нужд. Но: TextModels.StdModel не будет делать широковещательную - а вы же хотите текст использовать? поэтому на них нельзя будет полагаться, нужно будет дополнительно отправлять ШВсообщение после важных изменений в МВ. Это доп. нагрузка на систему, но м.б. вполне допустимой в вашем приложении.
2) Вставить в ваш текст МВ приборы (контролы). Их обновление уже сделано на ШВ-сообщениях, им все равно, в каком домене они оказались. Ограничение: приборы привязываются к глобально-достижимым переменным; но это может подходить для вашей задачи, т.к. вы пишете "отражать состояние моей подсистемы".
3) Подправить ручками реализацию, чтобы при некоторых условиях виды получали сообщения нужных доменов, независимо от того, в какой домен сами эти виды вставлены. Если интересно - я могу показать, где и как.

И кстати, обратите внимание: в ББ20 можно вставлять в окна произвольные панели в верхнюю и нижнюю часть. Строка состояния в большом окне ББ20 сделана именно так, и это же можно сделать с любым окном. При этом (ВНИМАНИЕ!) не нужно ничего делать с тем видом, который открыт в документе.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/