:: Visual Foxpro, Foxpro for DOS
Как закрыть формы
lili
Автор

Сообщений: 436
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
Приветствую всех!
Из главной формы открыто несколько других.
Мне нужно принудительно закрыть все формы, кроме главной. Делаю так:
lFrm=_screen.Formcount
DO WHILE lFrm>1
FOR i=1 to lFrm
IF not _screen.Forms(i).caption='ГЛАВНАЯ'
_screen.Forms(i).release
exit
ENDIF
ENDFOR
lFrm=_screen.Formcount
ENDDO
Если перед удалением активной была главная форма, то все работает.
Но если активной была одна из дочерних форм, то она не удаляется,
то есть команда _screen.Forms(i).release на ней отрабатывает, но форма открыта по-прежнему.
Как это побороть?
Ratings: 0 negative/0 positive
Re: Как закрыть формы
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Бывает, что главная форма запустила дочернюю и забыла о ней (форма не модальная, главная также не сохранила ссылку на дочернюю)
Может ссылки остаются в главной форме на дочерние. Их надо тоже убивать. А о них знает только главная форма.
Тот, кто формы породил, пусть тот и убивает (метод в главной форме)
Ratings: 0 negative/0 positive
Re: Как закрыть формы
lili
Автор

Сообщений: 436
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
Формы все модальные. Закрывать надо из специальной процедуры, а не из главной формы.
Дочерняя активная форма из этой процедуры определяется - _screen.Forms(i).caption определяется правильно,
но вот метлод закрытия _screen.Forms(i).release не срабатывает ((
Как-то сделать активной главную форму у меня не получилось.
Ratings: 0 negative/0 positive
Re: Как закрыть формы
of63

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

Сами-то они могут закрываться, если, например, имеют внутри себя таймер, который опрашивает PUBLIC-переменную, или сигнал ОС получают. Но надо переделывать эти формы.

forum.foxclub.ru - ссылки на это дело
forum.foxclub.ru
forum.foxclub.ru
forum.foxclub.ru



Исправлено 4 раз(а). Последнее : of63, 20.03.19 16:14
Ratings: 0 negative/0 positive
Re: Как закрыть формы
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
of63
Никак вы модальные формы не закроете, если не сэмулировать ручную последовательность действий закрытия (нажимать на кнопки "выход", отвечать на вопросы формы "а точно закрыть без сохранения изменений?"), также в нужной последовательности, если модальные формы вызваны одна из другой, цепочкой...
Сами-то они могут закрываться, если, например, имеют внутри себя таймер, который опрашивает PUBLIC-переменную, или сигнал ОС получают. Но надо переделывать эти формы.

forum.foxclub.ru - ссылки на это дело
forum.foxclub.ru
forum.foxclub.ru
forum.foxclub.ru

> Формы все модальные. Закрывать надо из специальной процедуры, а не из главной формы
Доб. Как вы "попадаете" в эту специальную процедуру (из которой вы пытаетесь выключить модальные формы), по какому событию? Просто интересно, это не просто выдать такую команду, типа "всем окнам Релизуться", извне модального окна...

Что за событие возникло в программе, в которй выполниятся код "релизнуть все формы, включая модальные, без разбора, просто убить"
Ratings: 0 negative/0 positive
Re: Как закрыть формы
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
lili
Из главной формы открыто несколько других.
lili
Формы все модальные.
Пугающее описание.
Но из этого следует, что формы открывались одна за другой.
Почему вдруг понадобилось их закрывать программно?

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

Все же _screen.Forms(i).release немного... для опрометчивых))) , для закрытия проги, когда много независимых форм из меню, и ссылок на них нигде нет.
Ratings: 0 negative/0 positive
Re: Как закрыть формы
lili
Автор

Сообщений: 436
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
Из главной формы (со списком документов) открыты несколько дочерних форм (с документами) в разных DataSession.
1) В главной форме при обновлении списка документов сначала вызывается "процедура проверки соединения с сервером данных", в которой: если соединение оборвалось и не может восстановиться, то выполняется закрытие всех открытых форм и затем главной формы. Это работает по коду, представленному выше.
2) В дочерней форме при записи данных опять же сначала вызывается "процедура проверки соединения с сервером данных". Так вот в этом случае закрытие форм из этой процедуры по такому коду не выполняется.
Ratings: 0 negative/0 positive
Re: Как закрыть формы
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
если из формы1 вызвать форму2, и на форму1 заполнить ссылку на форму2.
То закрыть форму1 пока открыта форма2 никоим образом не удастся
Я не просто так указал LIFO )))
Скорее всего в этом проблема.

Если бы все это было в классах, я бы в release прописал закрытие всего, что наоткрывал.
Ratings: 0 negative/0 positive
Re: Как закрыть формы
akvvohinc

Сообщений: 4222
Откуда: Москва
Дата регистрации: 11.11.2008
lili
Формы все модальные.
lili
Если перед удалением активной была главная форма, то все работает.
А эти два сообщения не противоречат друг другу?
Каким способом вы делаете активной главную форму, не закрывая прочие модальные?
Ratings: 0 negative/0 positive
Re: Как закрыть формы
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Аспид
lili
Из главной формы открыто несколько других.
lili
Формы все модальные.
Пугающее описание.
И скорее всего некорректное - если из главной формы открыть модальную, то ещё какие-то формы (которые тоже будут показаны в модальном виде, независимо от того как выставлено для них свойство WindowType) можно запускать лишь из этой дочерней модальной формы (ну или из меню, которое хитрым трюком можно разблокировать) - сама "главная" форма будет заблокирована (на то вторая форма и "модальная" чтобы заблокировать все другие). Конечно же есть формсеты (которые использовать никогда не надо), и можно в принципе нагородить г*нокода для програмного переключения/активации форм и по сути "обхода" модальности (но назачем тогда вообще делать формы модальными?)... Надеюсь что этого у автора темы нет, а есть лишь ошибка в описании "кто для кого модальный"

Аспид
Ну и как упоминал офф, если на форму есть где то ссылка, вы ее закрыть не сможете.
Нет, проблем закрыть формы на которую есть ссылка нет - именно .Release() это и делает. Ссылки (все) будет занулены (заполнены null значением). Проблема будет в том случае если есть ссылка на внутренние компоненты формы - вот тогда действительно .Release() не сможет закрыть форму, т.к. он обнулит лишь ссылки на саму форму, но не ссылки на её компоненты -> форма будет существовать пока эти "плохие" ссылки не будут тем или иным образом уничтожены. Полагаю что где-то тут и кроется проблема автора темы.
Другая вероятная причина - наличие в стеке вызовов незавершённого метода одной из "убиваемых" форм. Это вполне возможно, если формы модальны, и запускают "друг друга". Исправить ситуацию может правильный порядок закрытия форм, а лучше - отказ от модальности.

Аспид
Все же _screen.Forms(i).release немного... для опрометчивых))) , для закрытия проги, когда много независимых форм из меню, и ссылок на них нигде нет.
Ну да, по сути это для кода принудительного закрытия программы чаще всего и применяется. При том обычно всё же делают проход в обратном порядке - от FormCount до 1-цы, попутно проверяя на каждом шаге что очередной _SCREEN.Forms(i) всё ещё существует - т.к. довольно часто закрытие одной формы влечёт автоматическое закрытие и одной или более других форм (скажем если это "дочерние" формы или тулбары и ссылка на них была лишь в свойстве этой самой закрываемой на данном шаге цикла форме).
Код с "бесконечным" хождением по коллекции "пока не останется только один" (c) - ну не самый хороший подход. Тем более для "модальных цепочек форм".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как закрыть формы
lili
Автор

Сообщений: 436
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
Во-первых, всем большое спасибо за участие.
Во-вторых, очень извиняюсь, всех обманула - дочерние формы НЕ модальные, все вызываются из главной в Private Data Session.
Кстати, если я стою на главной форме, то _SCREEN.Forms(1) - главная, если же в любой дочерней, то _SCREEN.Forms(1) - эта дочерняя форма.
Возможно, проблема именно в этом:
Igor Korolyov
Другая вероятная причина - наличие в стеке вызовов незавершённого метода одной из "убиваемых" форм.
, так как процедура проверки связи выполняеттся при нажатии на дочерней форме кнопки "Записать".
Ratings: 0 negative/0 positive
Re: Как закрыть формы
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
lili
так как процедура проверки связи выполняеттся при нажатии на дочерней форме кнопки "Записать"
Мне кажется, у вас в приложении, небольшой хаос)
Мне непонятны, из ваших сообщений, что и зачем?
Ну проверили коннект (зачем непонятно), его нет. И что?
Что сделать хотите?
Если закрыть приложение, так закройте, как закрываете.
если переконнектится, так и сделайте незаметно для юзера, и если не удается, скажите ему, и закройте приложение.

Если следовать (не знаю зачем) вашей хотелке, то дочь, наверное знает про папу? так и закрывайте последовательно прямо из форм. Попробуйте уйти от _SCREEN.Forms() и взять все в свои руки.
100% еще какие то плюсы поимеете.
Ratings: 0 negative/0 positive
Re: Как закрыть формы
lili
Автор

Сообщений: 436
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
Связь довольно не надежная, часто отваливается, поэтому перед записью данных в дочерней форме выполняется
проверка связи, чтобы не вываливалась куча ошибок: если связь оборвана, пробуем переподключиться,
если не получилось, закрываем приложение.
Аспид
так и закрывайте последовательно прямо из форм. Попробуйте уйти от _SCREEN.Forms() и взять все в свои руки.
Можно конкретнее? Как закрывать последовательно, если не через _SCREEN.Forms()?
Ratings: 0 negative/0 positive
Re: Как закрыть формы
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Тут трудно судить как у вас построено.
У меня любая форма, это минимум 3 класса))))

Постараюсь "вообще".
Из формы проверяете доступ коннекта. Если недоступен,
lili
если связь оборвана, пробуем переподключиться,
если не получилось, закрываем приложение.
Начинаете процедуру уничтожения (например drop())
Смотрите, есть ли кто то с ней связанный, и уничтожаете их.
Потом уничтожаете себя (форму инициализатор процесса).
Может где то и перепутал порядок))) Вы сами увидите в каком порядке надо.
Ну а потом можно, для очистки совести и _SCREEN.Forms, что бы уничтожить независимо открытые формы. (полагаю это у вас работает)

Все это реализовать в классе (пусть формы). И кода будет немного, 1 раз отладите, и забудете о проблеме
Ratings: 0 negative/0 positive
Re: Как закрыть формы
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Если формы переделывать, то можно сохранять в условленом свойстве формы "указатель" на родителя:

в родителе:
DO FORM дочка WITH ThisForm
в дочке, в Init:
LPARAMETERS m.parParentForm
IF PCOUNT()>=1
ThisForm.ParentForm = m.parParentForm && запомнили в условленом месте указатель на форму-родителя
ENDIF
После такой переделки можно, перебирая формы в коллекции _SCREEN.Forms (и анализируя .ParentForm) можно построить последовательность запущенных друг из друга форм. А вот уже правильно упорядочив эту последовательность, можно найти голову и хвост последовательностей запуска, и далее уничтожать формы начиная с хвоста...
Еще способ: обяжем каждую форму (в коде в .Init) записать в некий "спулер" запущенных форм {ThisForm, текущее_датавремя}.. Далее, при необходимости аварийно загасить формы, перебираем записи в спулере, упорядочиваем их по датевремени, начинаем гасить с самых последних форм - может повезёт, и они загасятся )
Доб. Да, _SCREEN.Forms - это уже коллекция, не хватает только в каждой форме свойства .датавремя_запуска, и "спулер" (коллекцию) создавать не надо.

...
youtu.be - Сколько путей, сколько дорог! )



Исправлено 1 раз(а). Последнее : of63, 22.03.19 12:22
Ratings: 0 negative/0 positive


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

On-line: 19 akvvohinc  (Гостей: 18)

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