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 и поправлены некоторые ошибки.
|
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |