VB6: Как помочь убиться юзерконтролу.
Формулировка задачи:
Вводные:
Есть форма
На форме лежит юзерконтрол
На юзерконтроле лежит кнопка
Внутри юзерконтрола
Проблема:
При закрытии формы
Можно было бы "расшить" ситуацию, если бы форма при QueryUnload деинициализировала бы цепочку контролов (заставляла бы юзерконтролы очистить ссылки), но во-первых, это неудобно (вложенность контролов, в принципе, может быть произвольной), во-вторых, контролы библиотечные, сами они не местные, не знают, где в какой момент могут оказаться и т.п., в-третьих, они могут быть созданы динамически, то есть и формы-то никакой нет, в-четвертых, написана куча кода и весь его переделывать не хочется.
Подозреваю, что есть какой-то более простой способ самому контролу узнать о том, что его собираются деструктировать и он бы деинициализировал самостоятельно все свои внешние ссылки.
Приложено:
Проект, иллюстрирующий проблему. При закрытии Form2 контролы не терминируются, терминируются только вместе с выгрузкой проекта (закрытием Form1). Если же закомментировать строку:
Set Command = Cmm
то контролы будут как положено терминироваться при выгрузке Form2.
Есть форма
Form2
На форме лежит юзерконтрол
UCExt1
На юзерконтроле лежит кнопка
Command1
и юзерконтролUCInt1
Внутри юзерконтрола
UCInt1
есть объектная переменная, которая ссылается наCommand1
(так сказать, вовне себя).Проблема:
При закрытии формы
Form2
оба контрола не уничтожаются (так как фактически ссылаются друг на друга) и остаются в памяти. Если несколько раз открыть/закрыть форму - они скапливаются в памяти, сжирая ресурсы.Можно было бы "расшить" ситуацию, если бы форма при QueryUnload деинициализировала бы цепочку контролов (заставляла бы юзерконтролы очистить ссылки), но во-первых, это неудобно (вложенность контролов, в принципе, может быть произвольной), во-вторых, контролы библиотечные, сами они не местные, не знают, где в какой момент могут оказаться и т.п., в-третьих, они могут быть созданы динамически, то есть и формы-то никакой нет, в-четвертых, написана куча кода и весь его переделывать не хочется.
Подозреваю, что есть какой-то более простой способ самому контролу узнать о том, что его собираются деструктировать и он бы деинициализировал самостоятельно все свои внешние ссылки.
Приложено:
Проект, иллюстрирующий проблему. При закрытии Form2 контролы не терминируются, терминируются только вместе с выгрузкой проекта (закрытием Form1). Если же закомментировать строку:
Set Command = Cmm
то контролы будут как положено терминироваться при выгрузке Form2.
Решение задачи: «VB6: Как помочь убиться юзерконтролу.»
textual
Листинг программы
<font color="blue">Dim</font> <font color="blue">WithEvents</font> ExEdit <font color="blue">As</font> ExEdit <font color="blue">Private</font> <font color="blue">Sub</font> Form_Load() <font color="blue">Set</font> ExEdit = <font color="blue">New</font> ExEdit <font color="blue">With</font> ExEdit <font color="blue">Set</font> .Form = <font color="blue">Me</font> .Source = <font color="teal">"SELECT * FROM ...."</font> .AddTextBox txБИК, lbБИК, <font color="teal">"БИК"</font> .AddTextBox txБанк, lbБанк, <font color="teal">"Банк"</font> .AddTextBox txБИК, lbБИК, <font color="teal">"БИК"</font> ... <font color="blue">Set</font> .OkButton = btOK <font color="blue">Set</font> .CancelButton = btCancel .Read <font color="blue">End</font> <font color="blue">With</font> <font color="blue">End</font> <font color="blue">Sub</font> <font color="blue">Private</font> <font color="blue">Sub</font> ExEdit_BeforeUpdate(Cancel <font color="blue">As</font> <font color="blue">Boolean</font>) ... <font color="blue">End</font> <font color="blue">Sub</font> <font color="blue">Private</font> <font color="blue">Sub</font> ExEdit_AfterUpdate() ... <font color="blue">End</font> <font color="blue">Sub</font>
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д