Восстановить цепочку форм | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Есть основная форма для некой задачи.
Она вызывает другую форму, передает ей ссылку на себя, та может вызвать еще форму, со ссылкой на себя. Т.е. Parent->Child1->Child2->...->ChildN Реализована псевдо модальность, т.е. Child дизаблит свой Parent (Init)- enbled (destroy) И вот при открытии некой цепочки, юзера отвлекают, и он начинает другую задачу. И открывает для другой задачи аналогичную цепочку. И незакончив новую, требуется вернуться к 1й. А весь экран забит формами второй задачи. На тулбаре вызывает первую задачу. Легко показать основную форму. Но она задизаблена))), что крайне пугает юзера))) Как восстановить всю цепочку?. Т.е. найти последнюю форму, а там восстановить последовательность не сложно. Повторюсь, каждый ребенок, хранит ссылку на родителя. Но в тулбаре есть ссылка только на самую первую форму задачи. Путанно возможно изложил... Наверняка у кого то подобное реализовано. Куча вариантов в голове, но как то все не айс... ------------------ Исправлено 1 раз(а). Последнее : Аспид, 21.10.17 19:24 |
Re: Восстановить цепочку форм | |
---|---|
Chemberzhy Сообщений: 13142 Откуда: Измаил Дата регистрации: 28.04.2009 |
При попытке запуска сызнова уже открытого окна необходимо проверять, открыто ли уже это окно и, если да, то надо его вынести наперед (можно мигнуть им пару раз для наглядности). А "цепочку" несложно и в курсор писать, я думаю.
|
Re: Восстановить цепочку форм | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Это реализовано. Курсор, скорее нет. Он привязан к ДС, а все формы в своей. Скорее коллекция... Не соображу как. Собственно не важно куда писать. Вопрос, как узнать в записанном, что эта запись относится к нужной задаче? Добавлю. В двух цепочках могут быть вызваны объекты одного и того же класса. Например контрагент, и первой цепочке, и во второй. А при переключении, надо восстановить именно форму выбранной цепочки (задачи) ------------------ Исправлено 2 раз(а). Последнее : Аспид, 22.10.17 09:30 |
Re: Восстановить цепочку форм | |
---|---|
lulgu Сообщений: 1838 Дата регистрации: 30.11.2016 |
Эти ваши "цепочки" у вас реально существуют?
Если "да", то попробуйте раскрашивать их в разные цвета. |
Re: Восстановить цепочку форм | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Да. Ввел в заблуждение.
Приведенная задача решается довольно элементарно. Просто у базового класса есть свойство oChild, куда прописывается ссылка на вызванный объект. И в описанном виде, все решается просто пройдясь по цепочке до конца (пока oChild нулл). Фактически сложность вызывает более нетривиальный вариант. Основная форма задачи, позволяет (иногда такое бывает) вызывать несколько форм. т.е цепочка может выглядеть так Parent->Child1->Child2->...->ChildN ->Child1->Child2->...->ChildN ->Child1->Child2->...->ChildN Восстановление этого вызывает затруднения. Сильно! А какая разница, во что окрашено невидимое?))) ------------------ |
Re: Восстановить цепочку форм | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Поясню откуда возникла задача.
У юзера есть несколько приложений. Они выполняют разную задачу. Но вызывается 1 ехе, с разными параметрами. Т.е. это один проект. В виндах она открывает любое приложение из панели задач, и либо запускается новое, либо продолжает работать с прерванного места. Сейчас переделка все в одно приложение, вместо виндовой панели задач - тулбар. Думаю яснее стало. ------------------ |
Re: Восстановить цепочку форм | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
> Реализована псевдо модальность, т.е. Child дизаблит свой Parent (Init)- enbled (destroy)
> На тулбаре вызывает первую задачу. Легко показать основную форму. Но она задизаблена))), что крайне пугает юзера))) А какой видеоэффект надо достигнуть? Найти последнюю (энабленую) форму в задаче 1 и сделать на нее фокус ? Можно не только хранить ссылку на Parent (ребенок вероятно хранит ссылку на Parent), но пусть вызывающая форма хранит также ссылку на созданного ребенка. Тогда можно перемещаться по цепочке и вверх и вниз... |
Re: Восстановить цепочку форм | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Все точно. Так и есть. И простой случай реализовал. Все достаточно банально получилось. Просто в базовом классе создал метод Recovery
this.frm - ссылка на форму И все работает. Есть нюансы, допиливаю. Проблема, когда из основной задачи, запускается несколько форм. Тогда в fedit видимо нужна коллекция... Пока на этом остановился, дальше и не пойму что с ней делать) ------------------ Исправлено 1 раз(а). Последнее : Аспид, 22.10.17 12:20 |
Re: Восстановить цепочку форм | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Как что с ней делать? Перебирать, видимо, и для каждой выполнять то, что придумал для единственной ссылки. (Я вместо коллекции массивы использую до сих пор...)
|
Re: Восстановить цепочку форм | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Если по логике приложения запускающие формы блокируются, то нормально "переключится на другую задачу" будет невозможно. Ну найдёшь ты первую цепочку и что? Отменять всё что там было сделано для возврата в "главную" форму? Или просто принудительно разблокировать главную форму, но при этом, очевидно, "сломается" первая цепочка (там то ожидается что главная форма заблокирована и в ней "ничего не происходит").
Тут можно пойти с 2 сторон - либо убирать практически всюду эту самую "псевдо-модальность", т.е. изначально рассчитывать на то что вызывающая форма НЕ блокируется, и что там что-то могут сделать просто переключившись на неё из "вызванной". При том, естественно, у вызывающей формы будет не одна ссылка на Child а коллекция ссылок (кстати, плюс коллекции по сравнению с массивом - если объект-форма уничтожается, то он автоматом пропадает из коллекции, не нужно выискивать как в случае массива null-ы, и/или "сжимать/дефрагментировать" массив). Другой вариант - не пытаться активировать первый экземпляр "главной" формы, а запустить ещё одну копию - тогда обе "цепочки" будут вполне себе цельными и проблем с текущим кодом не возникнет - проблемы вызванные тем что на экране будет 2 "одинаковые" главные формы, да и данные для них, скорее всего, будут одинаковыми - полагаю и так решены, если программа многопользовательская, ну или как написано "ранее представляла собой кучу независимых exe-ников". Я бы сказал что это похуже решение, зато намного "дешевле" в реализации. ------------------ WBR, Igor |
Re: Восстановить цепочку форм | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
С конца начну)))
Это равносильно запуску еще одной копии программы сегодня. Это не то что хочется. Это же не модальность. А модальность в рамках задачи. На самом деле и псевдомодальность не нужна, просто надо что бы вызванная форма, не могла спрятаться за вызвавшую ее. Мне кажется это самый простой вариант. Сомнения по поводу восстановления цепочки, то же не ясны. Я просто нахожу главную форму, а далее запускаю метод Recovery в ней, и все восстанавливается. И все гораздо хуже, с возможностью запуска нескольких дочек. Я уже увидел косяк у себя, по этому поводу. Если открываю 2 формы от главной, то закрытие любой дочки, снимает псевдомодальность с главной! Это работает не один год, и никаких жалоб... даже непонятно почему))) Не используют эту возможность видимо. Видно решать надо в "одном" флаконе. И блокировку и восстановление. Все в 1й коллекции. Тока... пока не соображу. Надо прогуляться, выпить пива, подумать))) ------------------ |
Re: Восстановить цепочку форм | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
> плюс коллекции по сравнению с массивом - если объект-форма уничтожается, то он автоматом пропадает из коллекции, не нужно выискивать как в случае массива null-ы, и/или "сжимать/дефрагментировать" массив/
|
Re: Восстановить цепочку форм | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
А что не верится. Проверь?)))
Тока поправь немного
А вот у меня такой вопрос. Есть 2 ссылки на один и тот же объект. Как проверить, узнать, что они на один объект указывают? ------------------ |
Re: Восстановить цепочку форм | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Сравни, операторм =
|
Re: Восстановить цепочку форм | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
------------------ WBR, Igor |
Re: Восстановить цепочку форм | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Да, только в рамках одного процесса, одного общего "управителя" приложением... Что "не хочется" - вопрос субъективный. По "цене" этот вариант в 10 раз "дешевле" чем переделывать всю твою систему связки форм - с "линейной" на "древовидную". Ну и плюс отказ от "блокировки" родительских форм. У тебя в формах "линейная" связь сделала. 1 родитель - 1 дочерняя. Если ты "возвращаешься в главную", то не можешь запустить другую дочернюю не поломав связи с первой запущенной. И да, этот возврат как раз и приведёт к тому против чего ты борешься - дочерние формы упадут "под" главную (ну и под "новые дочерние" поначалу тоже). Если у пользователя нет средств навигации между формами (в т.ч. у них "в голове" - ну не знают они там про подменю "Окна" или кнопки ctrl+f1) то адекватно решить задачу вообще никак нельзя будет. Ну и да - НЕмодальные интерфейсы в некотором роде сложнее реализовать нежели модальные (в т.ч. и псевдо-модальные). Т.к. всяческая "последовательность" пропадает, и нужно очень аккуратно организовывать взаимодействие между формами. В т.ч. позволять и такие "странные" сценарии как работа дочерней формы после закрытия родительской. В общем это надо у себя в голове поворот сделать в первую очередь ------------------ WBR, Igor |
Re: Восстановить цепочку форм | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Действительно, при o.Release уничтожает и элемент в коллекции. Оказывается, написано в хелпе про Release-метод. Перевод путаный, если не знать о чем речь, то непонятно что сначала удалять: то ли ссылку в коллекции, то ли сам обьект. Поскольку не использовал коллекции, то и не нарывался... Бум знать.
В хелпе: Исправлено 1 раз(а). Последнее : of63, 22.10.17 17:29 |
Re: Восстановить цепочку форм | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Что то мы не понимаем друг-друга.
Видимо Ты описываешь случай, когда с главной может запуститься несколько форм? Форма остается недоступной после запуска первой дочки. Просто у этой формы свой тулбар, и он запускает другие формы, зная о контексте главной, и со ссылкой на нее. И в общем то решение видно, как все восстановить. Олег правильно сказал, просто мое свойство fEdit, на главной форме, надо сделать ссылкой на коллекцию. И перебирать ее, для восстановления цепочки, так же как для 1:1 Небольшая проблема в том, что у меня взаимодействие между формами, реализовано прямо в формах.
Придется из формы, вызывать некие методы контороллера, который будет разруливать эту хрень. А линейное восстановление отлично работает. Восстанавливается вся цепочка. ------------------ |
Re: Восстановить цепочку форм | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ну мне твоего кода не видно Но в общем случае если расчёт был на одну цепочку, и "звенья" связаны чрез перекрёстные ссылки как 1-к-1, то "по простому" переделать взаимодействие на схему 1-ко-много не получится. Disable/Enable это лишь один из вопросов, не самый важный при этом. Гораздо важнее способ обмена данными - что "возвращает" дочерняя форма, и как это на родительской сказывается. Теперь то возвращать нечто будут разные формы, в разные моменты времени...
2 of63 Там оригинал "путанный", а точнее не совсем адекватный. Скажем Это неправда. СИСТЕМА удалит/освободит объект ЕСЛИ его счётчик =0. Не "вы" и не "можете удалить". Следующая фраза вообще "не в дугу". В общем в фоксе нет прямого способа "удалить объект". Но есть 2 важных исключения: 1) метод Release() у формы/формсета и тулбара - он действительно пытается удалить объект формы/формсета/тулбара. Правда "без гарантии", т.к. могут помешать живые ссылки на "вложенные подобъекты" - например на какой текстбокс или кнопку на этой форме. 2) команда RELEASE This в некотором пользовательском методе уже для любого класса. Она тоже попытается удалить соответствующий объект, и тоже может "не сработать" по тем же причинам. По сути при помощи этой команды можно эмулировать метод Release для тех классов для которых он не предусмотрен. При этом ОБА эти "исключения" выполняют очень хитрую работу. Они проходятся по всем объектным ссылкам в процессе, и если это ссылка на "объект-жертву", то они её обнуляют (записывают в соответствующую переменную/свойство null). В коллекции же все элементы неизменны, поэтому вместо обнуления они просто удаляются из коллекции. ------------------ WBR, Igor |
Re: Восстановить цепочку форм | |
---|---|
Аспид Автор Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Теперь понятны твои сомнения.
Видимо не внятно объяснил с самого начала. Проблема только в UI. Все связи никуда не деваются! Если б экран был метр на метр. ТО можно было бы не закрывая формы, работать одновременно во всех задачах. Из-за того что моник маловат, одни задачи (текущие) перекрываю визуально другие. Вся логика как работала, так и работает. Но по факту, для 1:много действительно многовато переделок. Достаточно фундаментальных. Надо править слишком глубоко, а это всегда чревато. ))) 1:1 решил. Получилось складненько и внятно. И это покрывает 90% потребности. Пока успокоюсь) ------------------ |
© 2000-2024 Fox Club  |