Страница: 1 |
Страница: 1 |
Вопрос: Пара вопросов по закрытию формы
Добавлено: 07.11.05 13:33
Автор вопроса: Pantalone
Есть форма, у нее кнопка, через которую вызываю вторую форму:
frmF2.Show vbModal
Set frmF2 = Nothing
Т.е. как только вторую форму закроют, за ней подчистится автоматом.
Но как эту вторую форму закрывать корректно? И Me.Hide и Unload Me и Me.Visible = False передают выполнение кода в первую форму где выполняется
Set frmF2 = Nothing
Получается все равно как?
И еще вопрос, при закрытии второй формы у нее (или в модуле) выполняется некий код в цикле, как его корректно прекратить с закрытием формы, чтобы не получилось что формы нет, а он продолжает работать?
Ответы
Всего ответов: 11
Номер ответа: 1
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #1
Добавлено: 07.11.05 15:12
Ни один из перечисленных методов не уничтожает форму. Nothing лишь "обнуляет" указатель. Форма остается в памяти и если там есть цикл он будет работать. Сборщик мусора тут не причем, потому что ресурс не освобожден.
Испоьзуй например метод Close.
Номер ответа: 2
Автор ответа:
Pantalone
Вопросов: 32
Ответов: 104
Профиль | | #2
Добавлено: 07.11.05 16:40
Close какого объекта?
Номер ответа: 3
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #3
Добавлено: 07.11.05 17:10
Формы.
Номер ответа: 4
Автор ответа:
Pantalone
Вопросов: 32
Ответов: 104
Профиль | | #4
Добавлено: 07.11.05 17:22
Разве есть такой метод у формы?
Номер ответа: 5
Автор ответа:
«UL.eXe»
ICQ: 197.895.916.247
Вопросов: 72
Ответов: 540
Профиль | | #5
Добавлено: 07.11.05 17:54
)
Номер ответа: 6
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #6
Добавлено: 07.11.05 17:58
Я с NET перепутал
Номер ответа: 7
Автор ответа:
el-paso
Вопросов: 3
Ответов: 164
Профиль | | #7
Добавлено: 07.11.05 18:15
Ага. Проблема ясна как день
Если у тебя в после закрытия 2-ой формы, где-то ещё сохраняется ссылка на
эту форму (как ты говоришь, где-то выполняется код, работающий с формой), то
сама форма не может выгрузиться из памяти, пока эта ссылка
проинициализирована.
Это связано с тем, что объекты в VB используют счётчики ссылок на себя.
Когда ты какой-то переменной присваиваешь ссылку на объект, этот объект
увеличивает свой счётчик ссылок на 1, а когда эта переменная устанавливается
в Nothing, то счётчик ссылок уменьшается на единицу. Если счётчик ссылок
равен нулю, то объект самоуничтожается.
Твоя задача - при закрытии формы, просигналить коду, который её использует,
что действо надо прекратить, и убрать все ссылки на эту форму, чтобы она
могла выгрузиться из памяти.
Номер ответа: 8
Автор ответа:
Pantalone
Вопросов: 32
Ответов: 104
Профиль | | #8
Добавлено: 07.11.05 18:19
Так в общем и сделал, думал можно универсальнее как-то, взять и бац - никого нету
Номер ответа: 9
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #9
Добавлено: 07.11.05 19:51
Unload. и все тут.
А цикл можно завершить, написав его соответствующим образом.
Например:
Static EndFlag As Boolean
endflag=endit
do
'тот самый цикл
loop until endflag
end sub
А в коде формы написать.
ProcLoop EndIt:=True
End Sub
Номер ответа: 10
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #10
Добавлено: 08.11.05 11:06
Тут весь прикол в том что у тебя за форма. Если ты её создавал, скажем, как Set Form2=New Form1, тогда выгрузить не проблема. Ежели ты юзаешь ту форму что у тебя в проекте как Form1 - выгружать без толку. Насколько можно понять, она что-то вроде GlobalMultiUse
Номер ответа: 11
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #11
Добавлено: 08.11.05 21:20
А вот я знаю как форму выгрузить ) Абсолютно легко. Настолько легко, что прога может (и скорее всего) вылетить ))
DestroyWindow(hWnd as Long)