OberonCore
https://forum.oberoncore.ru/

Привязка контрола не к интерактору, а к экземпляру?
https://forum.oberoncore.ru/viewtopic.php?f=24&t=530
Страница 1 из 1

Автор:  Иван Кузьмицкий [ Понедельник, 25 Июнь, 2007 09:58 ]
Заголовок сообщения:  Привязка контрола не к интерактору, а к экземпляру?

Всем привет.
Вот, натолкнулся на такую задачу. Концептуальное описание примерно такое: понадобилась форма, контролы которой связаны не с интеракторами,а с экземплярами некой RECORD. То бишь, форма использует свою "модель".
Думаю, что средствами ББ вполне можно решить такую проблему, но ещё не понял, как. А пока решил опубликовать вопрос, вдруг не туда рою.

Автор:  Александр Ильин [ Понедельник, 25 Июнь, 2007 10:55 ]
Заголовок сообщения: 

А зачем это? Хочется открыть несколько одинаковых окон с разным содержанием?

Автор:  Иван Кузьмицкий [ Понедельник, 25 Июнь, 2007 11:45 ]
Заголовок сообщения: 

Александр Ильин писал(а):
А зачем это? Хочется открыть несколько одинаковых окон с разным содержанием?


Да-да, точно. Есть два справочника субъектов (физические и юридические лица), которые открываются каждый в своей форме. Тут проблем никаких. Но все субъекты используют одинаковый механизм связей, поэтому удобно было бы редактирование связей делать одной формой.
Тут-то и засада - форма одна, а к ней обращаются разные субъекты.

Автор:  Иван Кузьмицкий [ Четверг, 20 Март, 2008 20:55 ]
Заголовок сообщения:  Re: Привязка контрола не к интерактору, а к экземпляру?

Привязать контрол не к глобальному интерактору, а к полю объекта можно, только вот прилинкованные методы не работают.
Придётся, видимо, подмену объекта делать внутри прилинкованной процедуры. Как-то кривокосо выходит... :(

Автор:  Пётр Кушнир [ Четверг, 20 Март, 2008 21:07 ]
Заголовок сообщения:  Re: Привязка контрола не к интерактору, а к экземпляру?

Вот как я решил подобную ситуацию в одной из своих программ(тема Wizarder в форуме GUI :) ).

У меня есть динамический массив объектов типа Инфо. При открытии нового окна создаётся новый экземпляр Инфо, и ссылка на него присваивается глобальной переменной типа Инфо объявленной в модуле, к полям которой присоединены контролы на форме.
Запоминаю переменную открывшегося окна(можно получить стандартными методами модуля Windows), а на событие Activate окна вешаем стандартный хук. Теперь, в процедуре хука, мы получаем переменную текущего окна, ищем её в массиве и получаем нужный нам экземпляр объекта. Объявленной глобальной переменной мы присваиваем найденный объект из масива. Получается некая динамика "глобальных" интеракторов.

Известно, что все контролы прекрасно работают с интеракторами из указателя на запись итд. То есть понимают указатели. А все охранники, увеомители и интеракторы кнопок работают с глобальными процедурами, в обычном порядке, которые работают с глобальной переменной Инфо.

Полезно так же применить некую процедуру-семафор, чтобы избежать обращений к NIL-ной глобальной переменной.

Автор:  Иван Кузьмицкий [ Пятница, 21 Март, 2008 19:30 ]
Заголовок сообщения:  Re: Привязка контрола не к интерактору, а к экземпляру?

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

Но это просто так не сделать, поскольку в BlackBox-реализации схемы MVC, представление диалога привязано к модели с помощью имени модели (а имя - это есть название переменной). На этом построена связь диалогов с интеракторами.

Теперь нужно получить другую модель, и другой набор представлений, с сохранением внутренней логики. В рамках концепции BlackBox, надо завести новую переменную и новый набор диалогов.

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

Отсюда вытекает простое решение - надо открыть копию документа, поменять имена интеракторов и восстановить связь с новыми моделями. Единственная проблема, которую тут необходимо решить, заключается в том, что надо знать, что на что заменять. Я думаю, что достаточно будет задать строку замены.
ParseDialog('MyModule.myInteractor', 'MyModule.myNextInteractor'),
и строка MyModule.myInteractor заменится на MyModule.myNextInteractor, а всё, что после MyModule.myInteractor, останется.

Это есть простейшее и надёжное решение, схема с подменой имени прямо на старте.
Всё остальное будет просто усложнением этой схемы. Надо попробовать.

Автор:  Иван Кузьмицкий [ Вторник, 25 Март, 2008 17:48 ]
Заголовок сообщения:  Re: Привязка контрола не к интерактору, а к экземпляру?

Наваял тут примерчик.

Процедура OpenClonedForm вытаскивает из формы представление-контейнер, перебирает все диалоги, вложенные в него и заменяет поля link, label, guard, notifier согласно заданному шаблону. Затем открывает представление в новом окне.

Пример прилагается.

P.S. Версия примера обновлена, убрана зависимость от SternString и поправлены некоторые ошибки.

Вложения:
Obx.7z [2.85 КБ]
Скачиваний: 424

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