:: Visual Foxpro, Foxpro for DOS
Восстановить цепочку форм
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Есть основная форма для некой задачи.
Она вызывает другую форму, передает ей ссылку на себя, та может вызвать еще форму, со ссылкой на себя.
Т.е. Parent->Child1->Child2->...->ChildN
Реализована псевдо модальность, т.е. Child дизаблит свой Parent (Init)- enbled (destroy)

И вот при открытии некой цепочки, юзера отвлекают, и он начинает другую задачу.
И открывает для другой задачи аналогичную цепочку. И незакончив новую, требуется вернуться к 1й.
А весь экран забит формами второй задачи.
На тулбаре вызывает первую задачу. Легко показать основную форму.
Но она задизаблена))), что крайне пугает юзера)))
Как восстановить всю цепочку?. Т.е. найти последнюю форму, а там восстановить последовательность не сложно.
Повторюсь, каждый ребенок, хранит ссылку на родителя.
Но в тулбаре есть ссылка только на самую первую форму задачи.
Путанно возможно изложил...

Наверняка у кого то подобное реализовано.
Куча вариантов в голове, но как то все не айс...


------------------




Исправлено 1 раз(а). Последнее : Аспид, 21.10.17 19:24
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
Chemberzhy

Сообщений: 13142
Откуда: Измаил
Дата регистрации: 28.04.2009
При попытке запуска сызнова уже открытого окна необходимо проверять, открыто ли уже это окно и, если да, то надо его вынести наперед (можно мигнуть им пару раз для наглядности). А "цепочку" несложно и в курсор писать, я думаю.
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Chemberzhy
При попытке запуска сызнова уже открытого окна необходимо проверять, открыто ли уже это окно и, если да, то надо его вынести наперед
Это реализовано.
Курсор, скорее нет. Он привязан к ДС, а все формы в своей.
Скорее коллекция...
Не соображу как.

Собственно не важно куда писать.
Вопрос, как узнать в записанном, что эта запись относится к нужной задаче?
Добавлю. В двух цепочках могут быть вызваны объекты одного и того же класса.
Например контрагент, и первой цепочке, и во второй.
А при переключении, надо восстановить именно форму выбранной цепочки (задачи)


------------------




Исправлено 2 раз(а). Последнее : Аспид, 22.10.17 09:30
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Эти ваши "цепочки" у вас реально существуют?
Если "да", то попробуйте раскрашивать их в разные цвета.
Ratings: 2 negative/0 positive
Re: Восстановить цепочку форм
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Да. Ввел в заблуждение.
Приведенная задача решается довольно элементарно.
Просто у базового класса есть свойство oChild, куда прописывается ссылка на вызванный объект.
И в описанном виде, все решается просто пройдясь по цепочке до конца (пока oChild нулл).

Фактически сложность вызывает более нетривиальный вариант.
Основная форма задачи, позволяет (иногда такое бывает) вызывать несколько форм.
т.е цепочка может выглядеть так
Parent->Child1->Child2->...->ChildN
->Child1->Child2->...->ChildN
->Child1->Child2->...->ChildN

Восстановление этого вызывает затруднения.
lulgu
попробуйте раскрашивать их в разные цвета.
Сильно!
А какая разница, во что окрашено невидимое?)))


------------------
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Поясню откуда возникла задача.
У юзера есть несколько приложений.
Они выполняют разную задачу.
Но вызывается 1 ехе, с разными параметрами.
Т.е. это один проект.
В виндах она открывает любое приложение из панели задач, и либо запускается новое, либо продолжает работать с прерванного места.

Сейчас переделка все в одно приложение, вместо виндовой панели задач - тулбар.
Думаю яснее стало.


------------------
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Реализована псевдо модальность, т.е. Child дизаблит свой Parent (Init)- enbled (destroy)
> На тулбаре вызывает первую задачу. Легко показать основную форму. Но она задизаблена))), что крайне пугает юзера)))

А какой видеоэффект надо достигнуть? Найти последнюю (энабленую) форму в задаче 1 и сделать на нее фокус ?
Можно не только хранить ссылку на Parent (ребенок вероятно хранит ссылку на Parent), но пусть вызывающая форма хранит также ссылку на созданного ребенка. Тогда можно перемещаться по цепочке и вверх и вниз...
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
of63
Можно не только хранить ссылку на Parent (ребенок вероятно хранит ссылку на Parent), но пусть вызывающая форма хранит также ссылку на созданного ребенка. Тогда можно перемещаться по цепочке и вверх и вниз...
Все точно. Так и есть.
И простой случай реализовал.
Все достаточно банально получилось.
Просто в базовом классе создал метод Recovery
this.frm.show()
IF VARTYPE(this.fedit)="O"
this.fedit.Recovery
endif
Здесь fedit - ссылка на child
this.frm - ссылка на форму
И все работает.
Есть нюансы, допиливаю.

Проблема, когда из основной задачи, запускается несколько форм.
Тогда в fedit видимо нужна коллекция...
Пока на этом остановился, дальше и не пойму что с ней делать)


------------------




Исправлено 1 раз(а). Последнее : Аспид, 22.10.17 12:20
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Как что с ней делать? Перебирать, видимо, и для каждой выполнять то, что придумал для единственной ссылки. (Я вместо коллекции массивы использую до сих пор...)
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Если по логике приложения запускающие формы блокируются, то нормально "переключится на другую задачу" будет невозможно. Ну найдёшь ты первую цепочку и что? Отменять всё что там было сделано для возврата в "главную" форму? Или просто принудительно разблокировать главную форму, но при этом, очевидно, "сломается" первая цепочка (там то ожидается что главная форма заблокирована и в ней "ничего не происходит").
Тут можно пойти с 2 сторон - либо убирать практически всюду эту самую "псевдо-модальность", т.е. изначально рассчитывать на то что вызывающая форма НЕ блокируется, и что там что-то могут сделать просто переключившись на неё из "вызванной". При том, естественно, у вызывающей формы будет не одна ссылка на Child а коллекция ссылок (кстати, плюс коллекции по сравнению с массивом - если объект-форма уничтожается, то он автоматом пропадает из коллекции, не нужно выискивать как в случае массива null-ы, и/или "сжимать/дефрагментировать" массив).
Другой вариант - не пытаться активировать первый экземпляр "главной" формы, а запустить ещё одну копию - тогда обе "цепочки" будут вполне себе цельными и проблем с текущим кодом не возникнет - проблемы вызванные тем что на экране будет 2 "одинаковые" главные формы, да и данные для них, скорее всего, будут одинаковыми - полагаю и так решены, если программа многопользовательская, ну или как написано "ранее представляла собой кучу независимых exe-ников".
Я бы сказал что это похуже решение, зато намного "дешевле" в реализации.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
С конца начну)))
Igor Korolyov
Другой вариант - не пытаться активировать первый экземпляр "главной" формы, а запустить ещё одну копию - тогда обе "цепочки" будут вполне себе цельными и проблем с текущим кодом не возникнет - проблемы вызванные тем что на экране будет 2 "одинаковые" главные формы, да и данные для них, скорее всего, будут одинаковыми - полагаю и так решены, если программа многопользовательская, ну или как написано "ранее представляла собой кучу независимых exe-ников".
Это равносильно запуску еще одной копии программы сегодня. Это не то что хочется.
Igor Korolyov
Если по логике приложения запускающие формы блокируются, то нормально "переключится на другую задачу" будет невозможно.
Это же не модальность. А модальность в рамках задачи. На самом деле и псевдомодальность не нужна, просто надо что бы вызванная форма, не могла спрятаться за вызвавшую ее.
Мне кажется это самый простой вариант.
Сомнения по поводу восстановления цепочки, то же не ясны.
Я просто нахожу главную форму, а далее запускаю метод Recovery в ней, и все восстанавливается.

И все гораздо хуже, с возможностью запуска нескольких дочек.
Я уже увидел косяк у себя, по этому поводу.
Если открываю 2 формы от главной, то закрытие любой дочки, снимает псевдомодальность с главной!

Это работает не один год, и никаких жалоб... даже непонятно почему))) Не используют эту возможность видимо.

Видно решать надо в "одном" флаконе.
И блокировку и восстановление.
Все в 1й коллекции. Тока... пока не соображу.
Надо прогуляться, выпить пива, подумать)))


------------------
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> плюс коллекции по сравнению с массивом - если объект-форма уничтожается, то он автоматом пропадает из коллекции, не нужно выискивать как в случае массива null-ы, и/или "сжимать/дефрагментировать" массив/

m.o = CREATEOBJECT("custom")
* Пример из хелпа:
oCol=CREATEOBJECT("collection")
oCol.Add(123)
oCol.Add("AAA")
oCol.Add(.NULL.) && разве коллекция не добавит этот элемент NULL ?
oCol.Add(CREATEOBJECT("custom")) && добавляем обьект, созданный "на лету" (т.е. нигде, кроме как в коллекции указателя на этот обьект нет)
oCol.Add(m.o) && добавляем ранее созданный обьект (т.е. создаем вторую ссылку на обьект, и эта ссылка будет лежать в коллекции)
m.o.Release && уничтожаем обьект. Здесь количество элементов в коллекции уменьшится на 1 ? Что-то не верится, что "он автоматом пропадает из коллекции"...
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
А что не верится. Проверь?)))
Тока поправь немного
m.o = CREATEOBJECT("form")
* Пример из хелпа:
oCol=CREATEOBJECT("collection")
? oCol.count
oCol.Add(123)
? oCol.count
oCol.Add("AAA")
? oCol.count
oCol.Add(.NULL.) && разве коллекция не добавит этот элемент NULL ?
? oCol.count
oCol.Add(CREATEOBJECT("custom")) && добавляем обьект, созданный "на лету" (т.е. нигде, кроме как в коллекции указателя на этот обьект нет)
? oCol.count
oCol.Add(m.o) && добавляем ранее созданный обьект (т.е. создаем вторую ссылку на обьект, и эта ссылка будет лежать в коллекции)
? oCol.count
m.o.Release && уничтожаем обьект. Здесь количество элементов в коллекции уменьшится на 1 ? Что-то не верится, что "он автоматом пропадает из коллекции"...
? oCol.count

А вот у меня такой вопрос.
Есть 2 ссылки на один и тот же объект. Как проверить, узнать, что они на один объект указывают?


------------------
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Сравни, операторм =
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
of63
m.o.Release && уничтожаем обьект. Здесь количество элементов в коллекции уменьшится на 1 ? Что-то не верится, что "он автоматом пропадает из коллекции"...

oCol = CREATEOBJECT("Collection")
* Можно и в переменных создавать ссылки на формы, это не имеет значения для коллекции.
DIMENSION aForms[2]
aForms[1] = CREATEOBJECT("Form")
oCol.Add(aForms[1], "f1")
aForms[2] = CREATEOBJECT("Form")
oCol.Add(aForms[2], "f2")
FOR EACH oFrm IN oCol
oFrm.Show()
ENDFOR
? oCol.Count && 2 формы на экране, 2 объекта в коллекции
aForms[1].Release()
? oCol.Count && 1 форма на экране, 1 объект в коллекции. В массиве, конечно, по прежнему 2 элемента, первый из которых NULL.
* Закрываем оставшуюся форму "крестиком"
? oCol.Count && нет форм на экране, коллекция пустая. В массиве по прежнему 2 элемента, оба NULL. Массив с количеством элементов 0 (т.е. "пустой") в фоксе невозможен - "пустая" коллекция же, вполне.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Аспид
Это равносильно запуску еще одной копии программы сегодня. Это не то что хочется.
Да, только в рамках одного процесса, одного общего "управителя" приложением... Что "не хочется" - вопрос субъективный. По "цене" этот вариант в 10 раз "дешевле" чем переделывать всю твою систему связки форм - с "линейной" на "древовидную". Ну и плюс отказ от "блокировки" родительских форм.

Аспид
Я просто нахожу главную форму, а далее запускаю метод Recovery в ней, и все восстанавливается.
У тебя в формах "линейная" связь сделала. 1 родитель - 1 дочерняя. Если ты "возвращаешься в главную", то не можешь запустить другую дочернюю не поломав связи с первой запущенной. И да, этот возврат как раз и приведёт к тому против чего ты борешься - дочерние формы упадут "под" главную (ну и под "новые дочерние" поначалу тоже).
Если у пользователя нет средств навигации между формами (в т.ч. у них "в голове" - ну не знают они там про подменю "Окна" или кнопки ctrl+f1) то адекватно решить задачу вообще никак нельзя будет.

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


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Действительно, при o.Release уничтожает и элемент в коллекции. Оказывается, написано в хелпе про Release-метод. Перевод путаный, если не знать о чем речь, то непонятно что сначала удалять: то ли ссылку в коллекции, то ли сам обьект. Поскольку не использовал коллекции, то и не нарывался... Бум знать.

В хелпе:



Исправлено 1 раз(а). Последнее : of63, 22.10.17 17:29
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Что то мы не понимаем друг-друга.
Igor Korolyov
У тебя в формах "линейная" связь сделала. 1 родитель - 1 дочерняя. Если ты "возвращаешься в главную", то не можешь запустить другую дочернюю не поломав связи с первой запущенной. И да, этот возврат как раз и приведёт к тому против чего ты борешься - дочерние формы упадут "под" главную (ну и под "новые дочерние" поначалу тоже).
Видимо Ты описываешь случай, когда с главной может запуститься несколько форм?
Форма остается недоступной после запуска первой дочки.
Просто у этой формы свой тулбар, и он запускает другие формы, зная о контексте главной, и со ссылкой на нее.

И в общем то решение видно, как все восстановить.
Олег правильно сказал, просто мое свойство fEdit, на главной форме, надо сделать ссылкой на коллекцию.
И перебирать ее, для восстановления цепочки, так же как для 1:1

Небольшая проблема в том, что у меня взаимодействие между формами, реализовано прямо в формах.
Metod SetShow
...
.MasterForm.enabled = .f.
...
Metod UnLoad
IF VARTYPE(.MasterForm)="O"
.MasterForm.enabled = .t.
.MasterForm.activate
ENDIF
А порождают формы, объекты custom. Собственно и вся логика в custom.
Придется из формы, вызывать некие методы контороллера, который будет разруливать эту хрень.

А линейное восстановление отлично работает. Восстанавливается вся цепочка.


------------------
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну мне твоего кода не видно Но в общем случае если расчёт был на одну цепочку, и "звенья" связаны чрез перекрёстные ссылки как 1-к-1, то "по простому" переделать взаимодействие на схему 1-ко-много не получится. Disable/Enable это лишь один из вопросов, не самый важный при этом. Гораздо важнее способ обмена данными - что "возвращает" дочерняя форма, и как это на родительской сказывается. Теперь то возвращать нечто будут разные формы, в разные моменты времени...

2 of63
Там оригинал "путанный", а точнее не совсем адекватный. Скажем
of63
you can release an object only when its reference count is 0
Это неправда. СИСТЕМА удалит/освободит объект ЕСЛИ его счётчик =0. Не "вы" и не "можете удалить". Следующая фраза вообще "не в дугу".
В общем в фоксе нет прямого способа "удалить объект". Но есть 2 важных исключения:
1) метод Release() у формы/формсета и тулбара - он действительно пытается удалить объект формы/формсета/тулбара. Правда "без гарантии", т.к. могут помешать живые ссылки на "вложенные подобъекты" - например на какой текстбокс или кнопку на этой форме.
2) команда RELEASE This в некотором пользовательском методе уже для любого класса. Она тоже попытается удалить соответствующий объект, и тоже может "не сработать" по тем же причинам. По сути при помощи этой команды можно эмулировать метод Release для тех классов для которых он не предусмотрен.
При этом ОБА эти "исключения" выполняют очень хитрую работу. Они проходятся по всем объектным ссылкам в процессе, и если это ссылка на "объект-жертву", то они её обнуляют (записывают в соответствующую переменную/свойство null). В коллекции же все элементы неизменны, поэтому вместо обнуления они просто удаляются из коллекции.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Восстановить цепочку форм
Аспид
Автор

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Теперь понятны твои сомнения.
Igor Korolyov
. Disable/Enable это лишь один из вопросов, не самый важный при этом. Гораздо важнее способ обмена данными - что "возвращает" дочерняя форма, и как это на родительской сказывается. Теперь то возвращать нечто будут разные формы, в разные моменты времени...
Видимо не внятно объяснил с самого начала.
Проблема только в UI.
Все связи никуда не деваются! Если б экран был метр на метр. ТО можно было бы не закрывая формы, работать одновременно во всех задачах.
Из-за того что моник маловат, одни задачи (текущие) перекрываю визуально другие.
Вся логика как работала, так и работает.

Но по факту, для 1:много действительно многовато переделок. Достаточно фундаментальных.
Надо править слишком глубоко, а это всегда чревато. )))

1:1 решил. Получилось складненько и внятно.
И это покрывает 90% потребности. Пока успокоюсь)


------------------
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 24 (Гостей: 24)

© 2000-2024 Fox Club 
Яндекс.Метрика