powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / FormSet
15 сообщений из 15, страница 1 из 1
FormSet
    #33311063
Роман Новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем. Поздравляю всех с пятницей. Сбит с толку. Не могу закрыть FormSet. Подробнее:
Использую VFP 8.0 SP1
Имеется FormSet (Modal). В нем 2 формы (Modeless)
Form1-основная
Form2-скрытая и вызывается по кнопке в Form1 методом Show(1)
На Form1 есть кнопка <<Выход>> Там прописанно ThisFormSet.Release(), а Form1.Destroy - close database all
Так вот почему-то все источники закрываются, а Form1 остается активной и некуда не девается. Уже почти сошел с ума, т.к. у меня есть еще FormSet, так вот там все нормально отрабатывает. Пожалуйста, укажите на возможные причины.
...
Рейтинг: 0 / 0
FormSet
    #33311195
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ничего не помогает, прочтите, наконец, инструкцию!

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. Не завершен метод.
...
Рейтинг: 0 / 0
FormSet
    #33311240
Роман Новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению, я не срабатывает. Я тут поэксперементировал. В FormSet.AutoRelease=.T. В Form1 в кнопке <<Выход>> в методе Click прописал
THISFORMSET.Form2.Release()
THISFORM.Release.
Form1.Destroy не трогал. Так вот эта зараза вообще никак не реагирует, такое ощущение что до Destroy вообще не доходит.
...
Рейтинг: 0 / 0
FormSet
    #33311256
Роман Новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибку допустил. Не "я не срабатывает", а "не срабатывает". И по поводуShow понял. Убрал.
...
Рейтинг: 0 / 0
FormSet
    #33311282
Роман Новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убрал к чертовой матери вообще FormSet. А проблема осталась. Источники закрываются а форма нет
...
Рейтинг: 0 / 0
FormSet
    #33311321
Роман Новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поставил точку останова в Click на кнопке <Выход>. Так происходит Close Database, Release, а потом в окне Trace все очищается и остается откуда не возьмись надпись DO FORM mainForm (это и есть та самая форма, которая не закрывается)
...
Рейтинг: 0 / 0
FormSet
    #33311334
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз.

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

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

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

ModalForm.Hide()
ModalForm.Release()

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

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

Последовательность закрытия форм внутри FormSet прямо противоположная той, что Вы использовали. Надо сначала уничтожить формы, и только потом уничтожать уже сам FormSet. Объект-контейнер не может быть уничтожен, пока не уничтожены объекты, находящиеся внутри этого объекта-контейнера.
...
Рейтинг: 0 / 0
FormSet
    #33311342
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман НовичекПоставил точку останова в Click на кнопке <Выход>. Так происходит Close Database, Release, а потом в окне Trace все очищается и остается откуда не возьмись надпись DO FORM mainForm (это и есть та самая форма, которая не закрывается)
На самой форме есть объекты ActiveX (TreeView, например)?
...
Рейтинг: 0 / 0
FormSet
    #33311346
Роман Новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StatusBar
...
Рейтинг: 0 / 0
FormSet
    #33311443
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй удалить StatusBar вручную перед закрытием формы

Код: plaintext
ThisForm.RemoveObject("MyStatusBar")
...
Рейтинг: 0 / 0
FormSet
    #33311499
Роман Новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удалается. Все удаляется, а вот Форма не хочет
...
Рейтинг: 0 / 0
FormSet
    #33311550
Роман Новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал следующие в Click
RELEASE THISFORM
THISFORM.Release()

Так гадина на последнюю строку ругнулась, типа объект уже удален. Тогда какого хрена он на экране торчит, если он удален. Я уже не знаю что и делать.
...
Рейтинг: 0 / 0
FormSet
    #33311648
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит, осталось "что-то", что не удалось удалить. Т.е. сама форма действительно удалилась, но не удалился какой-то ее объект. Либо остался незавершенным какой-то метод.

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

ThisForm.Release()

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

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

Далее отслеживаем всю цепочку событий при открытии формы (надеюсь, у тебя в INIT-формы не стоит READ EVENTS) и по очереди удаляем все команды в этих событиях методах.
...
Рейтинг: 0 / 0
FormSet
    #33311664
Роман Новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понял, ща буду ломать и крушить
...
Рейтинг: 0 / 0
FormSet
    #33311850
Роман Новичек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
УРА, ЗАРАБОТАЛО!!!!!! Вот в чем был подвох. В методе Init Формы было:

PUBLIC oCommand
oCommand=THIS.Commandgroup1

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

RELEASE oCommand Extended

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

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

ThisForm.Release()

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

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

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

я многое успел попортить. Спасибо.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / FormSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]