Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Thisform.Release() уничтожает все объекты на форме? / 16 сообщений из 16, страница 1 из 1
11.12.2006, 22:16
    #34191733
men dea
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
На форме: комбобокс и Грид. Грид питается из ЛВ, получаемое из таблицы А, которая фильтруется через выбор в Комбобоксе. Комбобокс роется в справочнике Б.

Для закрытия формы стоит:

Код: plaintext
1.
Thisform.Release()
Close Tables All

Если Комбик не трогал - все ОК.
Если полистал - выскакивает ошибка "нет доступа к таблице Б".

Исправляется все добавлением строчки
Код: plaintext
Thisform.RemoveObject('Combo1')

Любопытно: Почему такой идивидуальный подход?
Разве
Код: plaintext
Thisform.Release() 
не уничтожает все объекты на форме?
...
Рейтинг: 0 / 0
12.12.2006, 09:15
    #34192154
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
ВладимирМ уже не раз пояснял по поводу порядка инициализации и удалении объектов на форме в VFP. Поищите...не хочется все это рассматривать еще раз.
Для вашего случае проще всего между командами Thisform.Release() и Close Tables All добавивить "отвязку" ComboBox от данных :
Код: plaintext
1.
2.
3.
Thisform.Release()
Thisform.Combo1.RowSource = ""
Close Tables All 
С уважением, Алексей
...
Рейтинг: 0 / 0
12.12.2006, 09:15
    #34192156
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
men dea.....
Исправляется все добавлением строчки
Код: plaintext
Thisform.RemoveObject('Combo1')

Любопытно: Почему такой идивидуальный подход?
Разве
Код: plaintext
Thisform.Release() 
не уничтожает все объекты на форме?

Да, в общем случае Thisform.Release() не уничтожает все ссылки на обьекты.

В конкретном случае, надо смотреть Ваш код (контрольный пример в студию), скорее всего ошибка возникает из-за блокировки записи в таблице, так же надо увидеть set('exclu')
...
Рейтинг: 0 / 0
13.12.2006, 13:17
    #34196329
men dea
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
Да, собственно, читал я статьи Владимира М. Но, вроде, не мой случай.
И файл вам "в студию" посылаю.
...
Рейтинг: 0 / 0
13.12.2006, 16:01
    #34197179
HES
HES
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
A ne zabil zakrit "lvOTDEL"?

SELECT lvOTDEL
USE

*Close Tables All
Thisform.Release()
...
Рейтинг: 0 / 0
13.12.2006, 18:40
    #34197794
men dea
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
Да, я раньше пробовал lvOTEL закрыть через USE IN lvOTDEL, но все равно требуется индивидуальное уничтожение комбобокса.
...
Рейтинг: 0 / 0
14.12.2006, 14:49
    #34200201
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
Лично у меня вложенная форма закрывается без проблем командой ThisForm.Release() Ничего дополнительно нигде писать не надо. VFP9SP1

Общий принцип закрытия формы - форма не может быть закрыта, если:

-) Осталась не удаленная ссылка на саму форму или на COM-объект, находящийся внутри формы (например, ссылка на node объекта TreeView)

-) Не завершено событие или метод самой формы

Для определения проблемы, вставь точку останова в событие Unload формы. В отладчике в этот момент сама форма все еще должна существовать, но не должно быть ни одного объекта внутри формы.

Из замеченных ошибок:

Событие QueryUnload()

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

Надо просто перенаправить вызов на тот метод, который и занимается организацией закрытия формы

Код: plaintext
1.
2.
3.
*Событие Form.QueryUnload()
NODEFAULT
ThisForm.Command1.Click()

В событии закрытия формы команда CLOSE ALL - явно лишняя. Закрытие источников данных никак не может повлиять на факт уничтожения объектов формы.

Событие Form.Init()

Давать здесь команду ThisForm.Refresh() - бессмысленно. Эта команда обновляет "картинку". Изображение на форме. Но все дело в том, что в событии Form.Init собственно картинки еще нет. Форма еще не отображена.

Кстати, именно этот метод и может приводить к глюкам. Точнее, его вызов из Init() формы. Возможно, Release() зависает из-за незавершенности либо собственно метода Init(), либо Refresh() вызванного из Init() формы
...
Рейтинг: 0 / 0
14.12.2006, 23:52
    #34201507
men dea
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
Итак, у меня VFP9+SP1.

Я заменил код в Form.QueryUnload() на рекомендуемый вами, г-н Максимов:

NODEFAULT
Thisfrom.Command1.Click()

Убрал из Form.Init() обновление формы: Thisform.Refresh()
Я даже для чистоты из Thisform.Grid1.AfterColRowChange() удалил Thisform.Refresh(), хотя без него никуда... :))

CLOSE TABLES не убираю по понятным причинам: исчезнет основа этого вопроса, ибо таблица filial естественно найдется. Хотя, собственно, эта строка и вызывает ошибку.

Поставил точку останова в Thisform.Unload(). Но ошибка все равно проявляется, хотя, там объектов и нет.

После Thisform.Release() остается только пара public-переменных, от которых можно, конечно, избавиться, если вместо них использовать свойства формы. *Экспериментировал. Ничего не меняется)
А еще остается combogrid=.NULL. типа "О" И все... Но ошибка выскакивает. И почему?

Ну, жутко интересно...
...
Рейтинг: 0 / 0
15.12.2006, 11:35
    #34202351
valeryka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
Чтобы не париться по этому поводу больше никогда вставь в release

Код: plaintext
1.
2.
3.
4.
5.
6.
local lncontrcount
lncontrcount=thisform.controlcount
for kkk= 1  to lncontrcount
	thisform.removeobject(alltrim(thisform.controls( 1 ).name))
next
dodefault()
...
Рейтинг: 0 / 0
15.12.2006, 11:40
    #34202372
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
men deaCLOSE TABLES не убираю по понятным причинам: исчезнет основа этого вопроса, ибо таблица filial естественно найдется. Хотя, собственно, эта строка и вызывает ошибку.

....

Но ошибка выскакивает. И почему?
Вы сами-то читаете, то что пишите? Сами же нашли причину ошибки, но исправлять не желаете по понятным только Вам причинам. И что Вы хотите услышать в ответ?

Либо так и продолжайте получать ошибку, либо меняйте логику работы.

Повторяю, у меня ошибки нет. Либо напишите пошаговую инструкцию что и в какой последовательности надо нажимать в Вашей форме чтобы получить ошибку, либо ищите, что же у Вас есть такого, что не попало в тестовую форму.
...
Рейтинг: 0 / 0
15.12.2006, 14:03
    #34203099
men dea
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
valetyka спасибо. Но на мой вопрос почему это происходит, вы не отвечаете. У меня тоже самое, но не в цикле.

Я знаю, как избежать ошибку, но не понимаю почему она вообще в том месте возникает.

Владимиру М. Я руководствовался логикой: вышел из формы - закрыл все связанные с ней таблицы. Где еще, как не в Unload и т.п. писать это? Разве толко форму запускать из подпрограммку и после ее стирания давать строчку на закрытие таблиц?

Последовательность действий, ведущих к ошибке:
1. Запускаете Форму,
2. В комбобоксе выбираете другой филиал
после этого изменятся сведения в Гриде.
3. нажимаете на кнопку Выход
Должна появиться ошибка: нет доступа к filial.filial и не свформируется Грид. Будет белая зона.

У меня так. Да, и у знакомого ставил - тоже самое...
...
Рейтинг: 0 / 0
15.12.2006, 14:34
    #34203259
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
Теперь понятно. Так вот, если ничто не помогает ПРОЧТИТЕ НАКОНЕЦ ИНСТРУКЦИЮ! В данном случае, прочтите HELP по ошибке 1152. Вот ссылка на ее перевод на русском

Невозможно обратиться к выбранной таблице (Ошибка 1152)

В данном случае логика закрытия формы должна быть следующая

Код: plaintext
1.
2.
3.
Thisform.Release()
ThisForm.Combo1.RowSource=""
Close Tables All
...
Рейтинг: 0 / 0
15.12.2006, 16:02
    #34203671
valeryka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
Если у тебя появится fatal error c0000005 при закрытии формы, мне тоже пытаться разобраться с причиной?
...
Рейтинг: 0 / 0
15.12.2006, 17:31
    #34204094
men dea
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
И чего это вы такие "Р-р-р-р-р...?" :))

За ссылку спасибо. Правда, я ее читал еще раньше и там про манипуляции с формой ничего не сказано. Там отдельно есть комбобокс, у которого отбирают таблицу. Тут даже аскет бы возмутился: "Не только лисе, но и ежику понятно, что таблица закрылась и найти значение негде!" Вопрос состоял-то в другом: "Почему уже удаленная форма со всякими объектами (ведь с точкой останова в Debug не видно никаких объектов. Я так понимаю, что они почили в бозе? ) требует эти закрывшиеся таблицы? "

Тогда переформулирую вопрос в просьбу.

Будьте любезны, дайте ссылочку на то, где описаны особенности удаления объектов на форме при ее закрытии. Не нашел. :(
Порядок создания я видел. Полагаю, что централизованное удаление формы в порядке "LIFO". Но тогда в Дебагере должен быть виден либо Грид, либо Комбобокс. Но их же там нет, а запрос на закрытую табличку имеется.
...
Рейтинг: 0 / 0
15.12.2006, 17:42
    #34204142
men dea
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
Кстати, в той же ссылке прямо сказано: чтобы не было ошибки, "цитирую":

Установите свойство RowSource в пустое значение (" ").
-ИЛИ-
Закройте форму, содержащую элементы управления ComboBox или ListBox .

и ничего ДОПОЛНИТЕЛЬНО, стоит "ИЛИ".

А разве Thisform.Release() ее не закрывает ее?
...
Рейтинг: 0 / 0
15.12.2006, 19:01
    #34204345
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Thisform.Release() уничтожает все объекты на форме?
men deaКстати, в той же ссылке прямо сказано: чтобы не было ошибки, "цитирую":

Установите свойство RowSource в пустое значение (" ").
-ИЛИ-
Закройте форму, содержащую элементы управления ComboBox или ListBox .

и ничего ДОПОЛНИТЕЛЬНО, стоит "ИЛИ".

А разве Thisform.Release() ее не закрывает ее?

Только здесь неявно подразумевается фраза "ПЕРЕД закрытием таблиц". Помнишь, с чего там начинается текст?

"Если Вы хотите закрыть таблицу ..."

А у тебя это все происходит "ПОСЛЕ". Т.е. ты СНАЧАЛА закрываешь таблицы, а ПОТОМ пытаешся что-то сделать с ComboBox. Точнее, в данном случае, с раскрывающимся списком.

Combo.Deactivate() происходит после Form.Release(). Т.е. Form.Release() работает как некий "диспетчер" запускающий некую последовательность событий по саморазрушению формы.

Кроме того, в данном случае речь идет не об уничтожении собственно объектов формы, а об уничтожении объектов внутри объектов. Т.е. очистке некоего внутреннего списка ComboBox.List. Как этот массив наполняется и как поддерживается его актуальность, насколько я знаю, нигде прямо не говорится. Вот с освобождением этого массива, видимо, и возникают проблемы.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Thisform.Release() уничтожает все объекты на форме? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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