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/ |