OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 26 Апрель, 2024 15:17

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: Понедельник, 25 Июнь, 2007 09:58 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Всем привет.
Вот, натолкнулся на такую задачу. Концептуальное описание примерно такое: понадобилась форма, контролы которой связаны не с интеракторами,а с экземплярами некой RECORD. То бишь, форма использует свою "модель".
Думаю, что средствами ББ вполне можно решить такую проблему, но ещё не понял, как. А пока решил опубликовать вопрос, вдруг не туда рою.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 25 Июнь, 2007 10:55 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
А зачем это? Хочется открыть несколько одинаковых окон с разным содержанием?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 25 Июнь, 2007 11:45 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Александр Ильин писал(а):
А зачем это? Хочется открыть несколько одинаковых окон с разным содержанием?


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Март, 2008 20:55 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Привязать контрол не к глобальному интерактору, а к полю объекта можно, только вот прилинкованные методы не работают.
Придётся, видимо, подмену объекта делать внутри прилинкованной процедуры. Как-то кривокосо выходит... :(


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 20 Март, 2008 21:07 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Вот как я решил подобную ситуацию в одной из своих программ(тема Wizarder в форуме GUI :) ).

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 21 Март, 2008 19:30 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Если понадобится в рантайме менять содержимое диалогов без участия пользователя, и одновременно, то этот способ непригоден.
Задача-то простая, и очень часто необходимая - создать клон уже созданного диалога, с сохранением внутренней логики, и позволить с ним работать.

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

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

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 25 Март, 2008 17:48 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Наваял тут примерчик.

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

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

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


Вложения:
Obx.7z [2.85 КБ]
Скачиваний: 346
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

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


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

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


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

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