Не выгружается User Control

Создание, использование компонентов ActiveX
SunnyVa
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 29.08.2005 (Пн) 9:30
Откуда: Москва

Не выгружается User Control

Сообщение SunnyVa » 08.09.2005 (Чт) 10:13

Добрый день!
Подскажите, пожалуйста, где возможно ошибка:
При закрытии определенной формы, в которой используется User Control не срабатывает событие UserControl_Terminate(). Оно срабатывает только при закрытии полностью приложения.
У меня подозрение, что событие не срабатывает, так как какая-то переменная ещё где-то используется.
Мои подозрения верны или у кого-то из вас есть другие подозрения?
Именно из-за этого начинаются проблемы с памятью, т. е. если долго запускать/закрывать приложение, то в определенный момент VB начинает ругаться: Out of memory

SunnyVa
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 29.08.2005 (Пн) 9:30
Откуда: Москва

Сообщение SunnyVa » 08.09.2005 (Чт) 13:51

неужели никто не может мне ничего дельного посоветывать :roll:

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 08.09.2005 (Чт) 15:03

Это потому что у тебя форма, скорее всего, не выгружается, а всего лишь скрывается. Ну или каким-то еще образом подвисает в памяти.

Учить наизусть - Understanding Control Lifetime and Key Events.

SunnyVa
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 29.08.2005 (Пн) 9:30
Откуда: Москва

Сообщение SunnyVa » 09.09.2005 (Пт) 8:19

2Ennor, хорошо сейчас буду смотреть... спасибо за совет...

SunnyVa
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 29.08.2005 (Пн) 9:30
Откуда: Москва

Сообщение SunnyVa » 09.09.2005 (Пт) 10:50

да у меня подозрение и до этого были, что форма подвисает в памяти... при её закрытии событие Form_Unload вызывается...
но где же она подвисла???
эту форму я открываю вызывая процедуру из класса...
Раньше было так:
Код: Выделить всё

Public Sub FormLoad(FormName As String)
Dim f As Form
Select Case FormName
    Case "frmSelection"
        Set f = frmSelection
    Case "frmSelectionView"
        Set f = New frmSelectionView
    Case "frmSubActionsAdd"
        Set f = frmSubActionsAdd
    Case "frmSubActionsOpportunitiesAdd"
        Set f = frmSubActionsOpportunitiesAdd
    Case "frmIcons"
        Set f = frmIcons
    Case "frmTest"
        Set f = frmTest

    Case Else
   
        Exit Sub
End Select

f.ObjectID = ObjectID
Load f
f.Show

End Sub

Переменная f локальная, по идие должна выгружаться сама...
Пробывала после команды f.Show обнулять переменную f (Set f=nothing) тоже не помагает - так же событие Terminate срабатывает только при закрытии полностью приложения...
Если посмотрите выше код открытия формы, то не срабатывает событие Terminate у контрола, который находится на форме frmSelectionView...
В проекте форма frmSelectionView может быть открыта в нескольких экземплярах... и если я открываю, допустим, три экземпляра этой формы, то при закрытии приложения начинает три раза срабатывать событие Terminate у контрола...

Пробывала в событии Form_Unload формы frmSelectionView вызывать процедуру FormUnLoad... Т.е. при открытии формы срабатывала процедура FormLoad (соответсвенно переменную f я сделала глобальной в этом классе) а при закрытии вызывала FormUnLoad
Вот код:
Код: Выделить всё

Dim f As Form

Public Sub FormLoad(FormName As String)
Select Case FormName
    Case "frmSelection"
        Set f = frmSelection
    Case "frmSelectionView"
        Set f = New frmSelectionView
    Case "frmSubActionsAdd"
        Set f = frmSubActionsAdd
    Case "frmSubActionsOpportunitiesAdd"
        Set f = frmSubActionsOpportunitiesAdd
    Case "frmIcons"
        Set f = frmIcons
    Case "frmTest"
        Set f = frmTest

    Case Else
   
        Exit Sub
End Select

f.ObjectID = ObjectID
Load f
f.Show

End Sub

Public Sub FormUnLoad(FormName As String)
Unload f
Set f = Nothing

End Sub

И все равно все так же - не выгружается форма frmSelectionView правильно при её закрытии и соответсвенно контрол тоже :cry: :cry: :cry:

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 09.09.2005 (Пт) 11:59

Что ж, попробую.
Про коллекцию Forms слыхала? Если вкратце, то это встроенная глобальная коллекция, из которой у тебя есть только Count и итератор для For Each ... Next. В нее автоматом заносится референс на любую загруженную форму в приложении. Именно из-за нее работа с формами ведется не так, как с обычными классами. Настоятельно рекомендуется вычитать эту тему здесь, например. После усвоения материала многие вещи станут понятнее, в частности следующий пункт.

SunnyVa писал(а):Переменная f локальная, по идие должна выгружаться сама...
Абсолютно неверное предположение - если непонятно почему, см. выше. В принципе, дальше уже можно то же самое сказать про все написанное. Разбирайся, если не поймешь, сделай тестовый проектик и позагружай/повыгружай формы, одновременно следя за состоянием коллекции Forms. Оченно проясняет дело.


Вернуться в Компоненты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

    TopList