OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 01:40

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




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 27 Июль, 2022 20:39 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
Здравствуйте.

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

Код:
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), то при его закрывании не выдаётся запрос на сохранение.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 27 Июль, 2022 20:41 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
BB 1.8-b1 build number 166


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Июль, 2022 07:33 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1428
GameHunter писал(а):
Вопрос: как открыть модель в разных документах, чтобы они по настоящему были независимыми?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 28 Июль, 2022 17:34 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
Цитата:
Модель это и есть документ...

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 30 Июль, 2022 17:09 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Нужно чуть больше подробностей того, что вы хотите.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 31 Июль, 2022 16:19 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
Хочу к некоторым документам приделать снизу что-то вроде продвинутого статусбара - это будет вьюшка, отображающая текстовую модель. Этот "статусбар" и будет себя вести как статусбар - т.е. он не будет сохраняться в документ. Проблема в том, что если в разные документы внедрить общую модель (при этом получается, что оба документа принадлежат одному domain'у), то появляются описанные выше побочные эффекты.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 01 Август, 2022 23:28 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Ну а отображаемый статус глобален?

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 02 Август, 2022 03:51 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
То есть надо копировать текст, отражающий глобальное состояние, в каждый документ, правильно я понял?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 03 Август, 2022 20:11 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
То, что вы хотите сделать, называется обертка "wrapper".
Посмотрите пример ObxWrappers.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Август, 2022 00:53 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
Обёртки я уже освоил. Дело не в этом. Проблема, кажется, в том, что если открывать модель в разных вьюшках, а эти вьюшки открывають в разных документах, то получается, что разные документы принадлежат к одному Domain'у, и тогда имеют место описанные выше побочные эффекты. Запустите процедурку, которую я привёл в самом начале, - и сразу увидите проблему.


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

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

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


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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 09 Август, 2022 20:05 

Зарегистрирован: Вторник, 22 Май, 2007 15:38
Сообщения: 220
Откуда: Питер
Спасибо. Ясно.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 10 Август, 2022 21:48 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 23 Октябрь, 2022 17:11 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 660
Цитата:
Вопрос: как открыть модель в разных документах, чтобы они по настоящему были независимыми?

В разных документах можно открыть по-настоящему независимые (несцепленные) виды на одну модель:
Код:
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 сделана именно так, и это же можно сделать с любым окном. При этом (ВНИМАНИЕ!) не нужно ничего делать с тем видом, который открыт в документе.


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

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


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

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


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

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