Как закрыть формы | |
---|---|
lili Автор Сообщений: 436 Откуда: Сыктывкар Дата регистрации: 07.11.2005 |
Приветствую всех!
Из главной формы открыто несколько других. Мне нужно принудительно закрыть все формы, кроме главной. Делаю так:
Но если активной была одна из дочерних форм, то она не удаляется, то есть команда _screen.Forms(i).release на ней отрабатывает, но форма открыта по-прежнему. Как это побороть? |
Re: Как закрыть формы | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Бывает, что главная форма запустила дочернюю и забыла о ней (форма не модальная, главная также не сохранила ссылку на дочернюю)
Может ссылки остаются в главной форме на дочерние. Их надо тоже убивать. А о них знает только главная форма. Тот, кто формы породил, пусть тот и убивает (метод в главной форме) |
Re: Как закрыть формы | |
---|---|
lili Автор Сообщений: 436 Откуда: Сыктывкар Дата регистрации: 07.11.2005 |
Формы все модальные. Закрывать надо из специальной процедуры, а не из главной формы.
Дочерняя активная форма из этой процедуры определяется - _screen.Forms(i).caption определяется правильно, но вот метлод закрытия _screen.Forms(i).release не срабатывает (( Как-то сделать активной главную форму у меня не получилось. |
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 |
Re: Как закрыть формы | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
> Формы все модальные. Закрывать надо из специальной процедуры, а не из главной формы Доб. Как вы "попадаете" в эту специальную процедуру (из которой вы пытаетесь выключить модальные формы), по какому событию? Просто интересно, это не просто выдать такую команду, типа "всем окнам Релизуться", извне модального окна... Что за событие возникло в программе, в которй выполниятся код "релизнуть все формы, включая модальные, без разбора, просто убить" |
Re: Как закрыть формы | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Пугающее описание. Но из этого следует, что формы открывались одна за другой. Почему вдруг понадобилось их закрывать программно? Ну и как упоминал офф, если на форму есть где то ссылка, вы ее закрыть не сможете. Т.е. идите по ссылкам с конца (LIFO) все обнуляйте, и уничтожайте формы. Все же _screen.Forms(i).release немного... для опрометчивых))) , для закрытия проги, когда много независимых форм из меню, и ссылок на них нигде нет. |
Re: Как закрыть формы | |
---|---|
lili Автор Сообщений: 436 Откуда: Сыктывкар Дата регистрации: 07.11.2005 |
Из главной формы (со списком документов) открыты несколько дочерних форм (с документами) в разных DataSession.
1) В главной форме при обновлении списка документов сначала вызывается "процедура проверки соединения с сервером данных", в которой: если соединение оборвалось и не может восстановиться, то выполняется закрытие всех открытых форм и затем главной формы. Это работает по коду, представленному выше. 2) В дочерней форме при записи данных опять же сначала вызывается "процедура проверки соединения с сервером данных". Так вот в этом случае закрытие форм из этой процедуры по такому коду не выполняется. |
Re: Как закрыть формы | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
если из формы1 вызвать форму2, и на форму1 заполнить ссылку на форму2.
То закрыть форму1 пока открыта форма2 никоим образом не удастся Я не просто так указал LIFO ))) Скорее всего в этом проблема. Если бы все это было в классах, я бы в release прописал закрытие всего, что наоткрывал. |
Re: Как закрыть формы | |
---|---|
akvvohinc Сообщений: 4222 Откуда: Москва Дата регистрации: 11.11.2008 |
А эти два сообщения не противоречат друг другу? Каким способом вы делаете активной главную форму, не закрывая прочие модальные? |
Re: Как закрыть формы | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
И скорее всего некорректное - если из главной формы открыть модальную, то ещё какие-то формы (которые тоже будут показаны в модальном виде, независимо от того как выставлено для них свойство WindowType) можно запускать лишь из этой дочерней модальной формы (ну или из меню, которое хитрым трюком можно разблокировать) - сама "главная" форма будет заблокирована (на то вторая форма и "модальная" чтобы заблокировать все другие). Конечно же есть формсеты (которые использовать никогда не надо), и можно в принципе нагородить г*нокода для програмного переключения/активации форм и по сути "обхода" модальности (но назачем тогда вообще делать формы модальными?)... Надеюсь что этого у автора темы нет, а есть лишь ошибка в описании "кто для кого модальный" Нет, проблем закрыть формы на которую есть ссылка нет - именно .Release() это и делает. Ссылки (все) будет занулены (заполнены null значением). Проблема будет в том случае если есть ссылка на внутренние компоненты формы - вот тогда действительно .Release() не сможет закрыть форму, т.к. он обнулит лишь ссылки на саму форму, но не ссылки на её компоненты -> форма будет существовать пока эти "плохие" ссылки не будут тем или иным образом уничтожены. Полагаю что где-то тут и кроется проблема автора темы. Другая вероятная причина - наличие в стеке вызовов незавершённого метода одной из "убиваемых" форм. Это вполне возможно, если формы модальны, и запускают "друг друга". Исправить ситуацию может правильный порядок закрытия форм, а лучше - отказ от модальности. Ну да, по сути это для кода принудительного закрытия программы чаще всего и применяется. При том обычно всё же делают проход в обратном порядке - от FormCount до 1-цы, попутно проверяя на каждом шаге что очередной _SCREEN.Forms(i) всё ещё существует - т.к. довольно часто закрытие одной формы влечёт автоматическое закрытие и одной или более других форм (скажем если это "дочерние" формы или тулбары и ссылка на них была лишь в свойстве этой самой закрываемой на данном шаге цикла форме). Код с "бесконечным" хождением по коллекции "пока не останется только один" (c) - ну не самый хороший подход. Тем более для "модальных цепочек форм". ------------------ WBR, Igor |
Re: Как закрыть формы | |
---|---|
lili Автор Сообщений: 436 Откуда: Сыктывкар Дата регистрации: 07.11.2005 |
Во-первых, всем большое спасибо за участие.
Во-вторых, очень извиняюсь, всех обманула - дочерние формы НЕ модальные, все вызываются из главной в Private Data Session. Кстати, если я стою на главной форме, то _SCREEN.Forms(1) - главная, если же в любой дочерней, то _SCREEN.Forms(1) - эта дочерняя форма. Возможно, проблема именно в этом: , так как процедура проверки связи выполняеттся при нажатии на дочерней форме кнопки "Записать". |
Re: Как закрыть формы | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Мне кажется, у вас в приложении, небольшой хаос) Мне непонятны, из ваших сообщений, что и зачем? Ну проверили коннект (зачем непонятно), его нет. И что? Что сделать хотите? Если закрыть приложение, так закройте, как закрываете. если переконнектится, так и сделайте незаметно для юзера, и если не удается, скажите ему, и закройте приложение. Если следовать (не знаю зачем) вашей хотелке, то дочь, наверное знает про папу? так и закрывайте последовательно прямо из форм. Попробуйте уйти от _SCREEN.Forms() и взять все в свои руки. 100% еще какие то плюсы поимеете. |
Re: Как закрыть формы | |
---|---|
lili Автор Сообщений: 436 Откуда: Сыктывкар Дата регистрации: 07.11.2005 |
Связь довольно не надежная, часто отваливается, поэтому перед записью данных в дочерней форме выполняется
проверка связи, чтобы не вываливалась куча ошибок: если связь оборвана, пробуем переподключиться, если не получилось, закрываем приложение. Можно конкретнее? Как закрывать последовательно, если не через _SCREEN.Forms()? |
Re: Как закрыть формы | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Тут трудно судить как у вас построено.
У меня любая форма, это минимум 3 класса)))) Постараюсь "вообще". Из формы проверяете доступ коннекта. Если недоступен, Начинаете процедуру уничтожения (например drop()) Смотрите, есть ли кто то с ней связанный, и уничтожаете их. Потом уничтожаете себя (форму инициализатор процесса). Может где то и перепутал порядок))) Вы сами увидите в каком порядке надо. Ну а потом можно, для очистки совести и _SCREEN.Forms, что бы уничтожить независимо открытые формы. (полагаю это у вас работает) Все это реализовать в классе (пусть формы). И кода будет немного, 1 раз отладите, и забудете о проблеме |
Re: Как закрыть формы | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Если формы переделывать, то можно сохранять в условленом свойстве формы "указатель" на родителя:
в родителе:
Еще способ: обяжем каждую форму (в коде в .Init) записать в некий "спулер" запущенных форм {ThisForm, текущее_датавремя}.. Далее, при необходимости аварийно загасить формы, перебираем записи в спулере, упорядочиваем их по датевремени, начинаем гасить с самых последних форм - может повезёт, и они загасятся ) Доб. Да, _SCREEN.Forms - это уже коллекция, не хватает только в каждой форме свойства .датавремя_запуска, и "спулер" (коллекцию) создавать не надо. ... youtu.be - Сколько путей, сколько дорог! ) Исправлено 1 раз(а). Последнее : of63, 22.03.19 12:22 |
© 2000-2024 Fox Club  |