VB6: Как помочь убиться юзерконтролу.

Узнай цену своей работы

Формулировка задачи:

Вводные:
Есть форма

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>

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.615 из 5
Похожие ответы