Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 FormSet  [new]
Роман Новичек
Member

Откуда:
Сообщений: 219
Привет всем. Поздравляю всех с пятницей. Сбит с толку. Не могу закрыть FormSet. Подробнее:
Использую VFP 8.0 SP1
Имеется FormSet (Modal). В нем 2 формы (Modeless)
Form1-основная
Form2-скрытая и вызывается по кнопке в Form1 методом Show(1)
На Form1 есть кнопка <<Выход>> Там прописанно ThisFormSet.Release(), а Form1.Destroy - close database all
Так вот почему-то все источники закрываются, а Form1 остается активной и некуда не девается. Уже почти сошел с ума, т.к. у меня есть еще FormSet, так вот там все нормально отрабатывает. Пожалуйста, укажите на возможные причины.
7 окт 05, 11:28    [1947681]     Ответить | Цитировать Сообщить модератору
 Re: FormSet  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Если ничего не помогает, прочтите, наконец, инструкцию!

HEP VFP3

Метод Show принимает параметр, который может отменить установку WindowType.

Установка WindowType объекта FormSet отменяет действие установок WindowType входящих в его состав объектов Form. Например, если значение свойства WindowType объекта FormSet установлено равным 0, все содержащиеся в нем объекты Form будут немодальными, каковы бы ни были их индивидуальные установки свойства WindowType.

Т.е. тут явное противоречие. Метод Show() должен изменить настройку WindowType текущей формы, но если форма находится внутри FormSet сделать это невозможно. Вот у FoxPro "крыша и едет".

Внутри FormSet надо отказаться от использования Show() для активизации форм. Вместо этого надо давать пару команд

Visible = .T.
Enabled = .T.

Ну, а в данном конкретном случае это стандартная ситуация. Объект не может быть уничтожен, пока не закончилось выполнение одного из его методов. Команда Show(1) останавливает выполнение того метода, в котором она была дана до закрытия модальной формы.

Т.е. пока не будет закрыта (или скрыта по команде Hide()) форма, активизированная через Show(1) ты не сможешь закрыть FormSet. Не завершен метод.
7 окт 05, 11:57    [1947879]     Ответить | Цитировать Сообщить модератору
 Re: FormSet  [new]
Роман Новичек
Member

Откуда:
Сообщений: 219
К сожалению, я не срабатывает. Я тут поэксперементировал. В FormSet.AutoRelease=.T. В Form1 в кнопке <<Выход>> в методе Click прописал
THISFORMSET.Form2.Release()
THISFORM.Release.
Form1.Destroy не трогал. Так вот эта зараза вообще никак не реагирует, такое ощущение что до Destroy вообще не доходит.
7 окт 05, 12:07    [1947936]     Ответить | Цитировать Сообщить модератору
 Re: FormSet  [new]
Роман Новичек
Member

Откуда:
Сообщений: 219
Ошибку допустил. Не "я не срабатывает", а "не срабатывает". И по поводуShow понял. Убрал.
7 окт 05, 12:11    [1947954]     Ответить | Цитировать Сообщить модератору
 Re: FormSet  [new]
Роман Новичек
Member

Откуда:
Сообщений: 219
Убрал к чертовой матери вообще FormSet. А проблема осталась. Источники закрываются а форма нет
7 окт 05, 12:18    [1947992]     Ответить | Цитировать Сообщить модератору
 Re: FormSet  [new]
Роман Новичек
Member

Откуда:
Сообщений: 219
Поставил точку останова в Click на кнопке <Выход>. Так происходит Close Database, Release, а потом в окне Trace все очищается и остается откуда не возьмись надпись DO FORM mainForm (это и есть та самая форма, которая не закрывается)
7 окт 05, 12:31    [1948059]     Ответить | Цитировать Сообщить модератору
 Re: FormSet  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Еще раз.

Объект не может быть удален, пока не завершился какой-либо метод этого объекта.

Вы вызваете модальный FormSet. Откуда? Из другой формы? Вот эта-то "другая" форма и не может закрыться. Ее модальный FormSet "держит".

Удаление модальных объектов из вне этих объектов имеет определенную специфику. Надо предварительно их делать невидимыми.

ModalForm.Hide()
ModalForm.Release()

Закрытие вообще всех таблиц и баз данных напрямую из формы - крайне неразумное решение. Это накладывает существенные ограничения на работу с формой.

Надо сначала закрыть все формы и только потом закрывать все таблицы. Это два разных процесса.

Последовательность закрытия форм внутри FormSet прямо противоположная той, что Вы использовали. Надо сначала уничтожить формы, и только потом уничтожать уже сам FormSet. Объект-контейнер не может быть уничтожен, пока не уничтожены объекты, находящиеся внутри этого объекта-контейнера.
7 окт 05, 12:34    [1948073]     Ответить | Цитировать Сообщить модератору
 Re: FormSet  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Роман Новичек
Поставил точку останова в Click на кнопке <Выход>. Так происходит Close Database, Release, а потом в окне Trace все очищается и остается откуда не возьмись надпись DO FORM mainForm (это и есть та самая форма, которая не закрывается)

На самой форме есть объекты ActiveX (TreeView, например)?
7 окт 05, 12:37    [1948085]     Ответить | Цитировать Сообщить модератору
 Re: FormSet  [new]
Роман Новичек
Member

Откуда:
Сообщений: 219
StatusBar
7 окт 05, 12:40    [1948094]     Ответить | Цитировать Сообщить модератору
 Re: FormSet  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Попробуй удалить StatusBar вручную перед закрытием формы

ThisForm.RemoveObject("MyStatusBar")
7 окт 05, 13:15    [1948225]     Ответить | Цитировать Сообщить модератору
 Re: FormSet  [new]
Роман Новичек
Member

Откуда:
Сообщений: 219
Удалается. Все удаляется, а вот Форма не хочет
7 окт 05, 13:33    [1948304]     Ответить | Цитировать Сообщить модератору
 Re: FormSet  [new]
Роман Новичек
Member

Откуда:
Сообщений: 219
Сделал следующие в Click
RELEASE THISFORM
THISFORM.Release()

Так гадина на последнюю строку ругнулась, типа объект уже удален. Тогда какого хрена он на экране торчит, если он удален. Я уже не знаю что и делать.
7 окт 05, 13:48    [1948386]     Ответить | Цитировать Сообщить модератору
 Re: FormSet  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Значит, осталось "что-то", что не удалось удалить. Т.е. сама форма действительно удалилась, но не удалился какой-то ее объект. Либо остался незавершенным какой-то метод.

Здесь тебе остается только по шагам отслеживать. Сделай так. Создай копию своей формы и начинай вручную удалять на ней объекты. Запускаешь форму и тут же жмешь на кнопку "Закрыть" где пропиши одну единственную команду

ThisForm.Release()

Как только форма начнет нормально закрываться, значит нашли "сомнительный" объект. Надо разобраться с ним особо.

Если на форме осталас только кнопка "Удалить", а форма по прежнему не закрывается "копаем" дальше. Смотрим, какие Properties (созданные вручную) есть у этой формы и нет ли где-либо в этих Properies значения типа "Object". Может ссылка на саму себя.

Далее отслеживаем всю цепочку событий при открытии формы (надеюсь, у тебя в INIT-формы не стоит READ EVENTS) и по очереди удаляем все команды в этих событиях методах.
7 окт 05, 14:11    [1948527]     Ответить | Цитировать Сообщить модератору
 Re: FormSet  [new]
Роман Новичек
Member

Откуда:
Сообщений: 219
понял, ща буду ломать и крушить
7 окт 05, 14:16    [1948547]     Ответить | Цитировать Сообщить модератору
 Re: FormSet  [new]
Роман Новичек
Member

Откуда:
Сообщений: 219
УРА, ЗАРАБОТАЛО!!!!!! Вот в чем был подвох. В методе Init Формы было:

PUBLIC oCommand
oCommand=THIS.Commandgroup1

Это для ON KEY LABEL. Как только я прописал в Click кнопки <<Выход>> :

RELEASE oCommand Extended

Все стало работать.
Жаль что придется многое заново писать, т.к. до мысли:

ВладимирМ
Здесь тебе остается только по шагам отслеживать. Сделай так. Создай копию своей формы и начинай вручную удалять на ней объекты. Запускаешь форму и тут же жмешь на кнопку "Закрыть" где пропиши одну единственную команду

ThisForm.Release()

Как только форма начнет нормально закрываться, значит нашли "сомнительный" объект. Надо разобраться с ним особо.

Если на форме осталас только кнопка "Удалить", а форма по прежнему не закрывается "копаем" дальше. Смотрим, какие Properties (созданные вручную) есть у этой формы и нет ли где-либо в этих Properies значения типа "Object". Может ссылка на саму себя.

Далее отслеживаем всю цепочку событий при открытии формы (надеюсь, у тебя в INIT-формы не стоит READ EVENTS) и по очереди удаляем все команды в этих событиях методах.


я многое успел попортить. Спасибо.
7 окт 05, 14:59    [1948831]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить