powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6: Как помочь убиться юзерконтролу.
25 сообщений из 46, страница 1 из 2
VB6: Как помочь убиться юзерконтролу.
    #36535741
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вводные:

Есть форма Form2
На форме лежит юзерконтрол UCExt1
На юзерконтроле лежит кнопка Command1 и юзерконтрол UCInt1
Внутри юзерконтрола UCInt1 есть объектная переменная, которая ссылается на Command1 (так сказать, вовне себя).

Проблема:

При закрытии формы Form2 оба контрола не уничтожаются (так как фактически ссылаются друг на друга) и остаются в памяти. Если несколько раз открыть/закрыть форму - они скапливаются в памяти, сжирая ресурсы.

Можно было бы "расшить" ситуацию, если бы форма при QueryUnload деинициализировала бы цепочку контролов (заставляла бы юзерконтролы очистить ссылки), но во-первых, это неудобно (вложенность контролов, в принципе, может быть произвольной), во-вторых, контролы библиотечные, сами они не местные, не знают, где в какой момент могут оказаться и т.п., в-третьих, они могут быть созданы динамически, то есть и формы-то никакой нет, в-четвертых, написана куча кода и весь его переделывать не хочется.

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

Приложено:

Проект, иллюстрирующий проблему. При закрытии Form2 контролы не терминируются, терминируются только вместе с выгрузкой проекта (закрытием Form1). Если же закомментировать строку:
Set Command = Cmm
то контролы будут как положено терминироваться при выгрузке Form2.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36535931
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На очень скорую руку (спать охота) - см приложенный проект. Хоть и не очень красиво, но работает...
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36536810
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrF,

Не, ну это не о том.
Это тот вариант, который я описал, как нежелательный по четырем причинам.

Есть у кого еще мысли?
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36536966
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shocker.Pro
> Подозреваю, что есть какой-то более простой способ самому контролу узнать о том, что его собираются
> деструктировать и он бы деинициализировал самостоятельно все свои внешние ссылки.

Это на мой взгляд это не возможно в общем случае. Именно по этой причине в спецификацию СОМ в самый главный интерфейс
были введены функции управления ссылками Add и Release. Попробуй сделать систему учета присвоенных объектных ссылок,
через какую-то общую friend функцию, в которой будет производится нужное присваивание и учитыватся кто и кому присвоился

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36536994
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносПопробуй сделать систему учета присвоенных объектных ссылок, через какую-то общую friend функцию, в которой будет производится нужное присваивание и учитыватся кто и кому присвоился

А как мне поможет это знание (учет ссылок)? В любом случае, нужно запускать процесс деиницилизации, отталкиваясь от чего-то (события). Вот это "что-то" пытаюсь нащупать.

ЗЫ:
У контрола UCExt возникает событие Hide. В этот момент можно проверить наличие живого Parent-a - если нету - признак того, что контрол должен быть уничтожен... Однако, для UCInt это событие не возникает...
Может какое-то оконное сообщение пытаться перехватить....
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36537024
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proво-вторых, контролы библиотечные, сами они не местные, не знают, где в какой момент могут оказаться и т.пДля этого существуют интерфейсы.
Можно сделать дополнительную dll с этим интерфейсом, о которой бы знали и контролы и программа, или можно сделать tlb, чтобы не таскать лишний файл в дистрибутиве.
Shocker.Proв-четвертых, написана куча кода и весь его переделывать не хочетсяВ использовании интерфейсов переделка сводится к автоматизированию копипаста.

Остальные пункты проблемой не являются.


Jah loves you.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36537146
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

Я, честно говоря, не очень понял, зачем эти интерфейсы.

Грубо говоря, у каждого моего контрола есть метод по деинициализации всех внешних ссылок. Этот метод можно дополнить тем, чтобы он пробегался по всем вложенным контролам и пытался запустить для них этот метод (невзирая на возможные ошибки). Таким образом все будет сводиться к тому, чтобы каскадно запустить метод деинициализации для самого внешнего уничтожаемого контрола.

А для того, чтобы его запускать вручную, нужно проследить возможные причины уничтожения контрола. Это могут быть:
Выгрузка формы внешними причинами
Уничтожение динамического экземпляра Controls.Remove
Выгрузка из массива Unload
То есть все это надо найти и модифицировать и, главное, не забывать в дальнейшем добавлять вызов этого каскадного метода.
Кроме того, для каждого нового контрола (даже если он сам не инициализирует внешние ссылки) нужно прописывать этот метод каскадирования и опять же не забывать это делать в дальнейшем.

Я-то хотел упростить модификации до того, чтобы изменить только код контролов и только тех, которые создают внешние ссылки.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36537378
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shocker.Pro
> Antonariy,
>
> Я, честно говоря, не очень понял, зачем эти интерфейсы.

Интерфейс стандартизирует интерфейс
Грубо говоря, наследование от интерфейса заставит все наследники иметь одноименные методы. И тогда:

> пытался запустить для них этот метод (невзирая на возможные ошибки).

этот метод будет у всех заинтересованных и он будет запускатся без ошибок, просто потому что он будет

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36538567
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может не надо пытаться присвоить ссылку объекту во внутреннем контроле на кнопку во внешнем, а просто создать в нем Public метод CommandClick и вызывать его при нажатии кнопки?
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36538683
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, при нажатии всех двадцати кнопок и изменениях других тридцати полей сделать столько же вызовов :)
Может вообще не стоит делать юзерконтрол, а весь его код копипастить во все формы?
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36538792
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем, я бы решал бы её так как в приложении. В принципе можно и без класса, но тогда нужно не забывать прорисывать функцию деинициализации во всех контролах имеющих ссылки на внешние объекты
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36538827
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProУничтожение динамического экземпляра Controls.Remove
Выгрузка из массива UnloadТаких мест много?

Jah loves you.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36538853
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТаких мест много?

Как я уже говорил раньше - у меня огромный и достаточно старый проект. Более-менее современные вещи хорошо инкапсулированы и систематизированы, но встречается и код 2000-2001гг (когда деревья были большие, а я глупый).
Кроме того, у меня большое желание не иметь таких вещей, о которых нужно помнить в будущем, то есть очень хочется деструкцию контрола инкапсулировать в сам контрол. Если это невозможно - у меня и вопросов нет к уважаемому сообществу - как сделать без инкапсуляции - я себе представляю.

Помнишь, я говорил. Лечение гильотинированием никто не любит, в том числе и я

ЗЫ: Ща посмотрим, что там Игорь предложил...
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36538898
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда и моих 5 копеек.
Так саказать, минимум телодвижений для достижения эффекта.

Jah loves you.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539241
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyНу тогда и моих 5 копеек.
Так саказать, минимум телодвижений для достижения эффекта.

Оно не работает как надо ;)
===============
Вообще я уже давно использую для форм обработчик контролов, но реализация у меня сделана не на UserControl-ах, а на классах.

При этом код формы выглядит примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Dim WithEvents ExEdit As ExEdit

Private Sub Form_Load()
    Set ExEdit = New ExEdit
    With ExEdit
        Set .Form = Me
        .Source = "SELECT * FROM ...."
        
        .AddTextBox txБИК, lbБИК, "БИК"
        .AddTextBox txБанк, lbБанк, "Банк"
        .AddTextBox txБИК, lbБИК, "БИК"
        ...
        Set .OkButton = btOK
        Set .CancelButton = btCancel

       .Read
    End With
End Sub

Private Sub ExEdit_BeforeUpdate(Cancel As Boolean)
   ...
End Sub

Private Sub ExEdit_AfterUpdate()
   ...
End Sub

И в итоге всей типовой обработкой/проверкой ввода занимаются классы.
Как я понимаю автору нужно нечто подобное, но он решил реализовать на UserControl-ах...
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539512
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносВообщем, я бы решал бы её так как в приложении. В принципе можно и без класса, но тогда нужно не забывать прорисывать функцию деинициализации во всех контролах имеющих ссылки на внешние объекты

Спасибо, но это вариации на тему того, что мы обсуждали - старт идет внешний.

AntonariyНу тогда и моих 5 копеек.
Так саказать, минимум телодвижений для достижения эффекта.

Ext убился
Int убился
Ext убился
Int убился
Int убился

Вот как оно срабатывает при закрытии формы. То есть терминируется внешний контрол. После этого внутренний пытается отвязаться от кнопки внешнего, вызывает его снова к жизни, умирает сам, потом внешний пытается вызвать метод внутреннего, опять вызывает его к жизни... М-да.

AndrF
И в итоге всей типовой обработкой/проверкой ввода занимаются классы.
Как я понимаю автору нужно нечто подобное, но он решил реализовать на UserControl-ах...

Потому что от юзерконтрол имеет собственные визуальные элементы. Но, что интересно, ваш пример будет обладать тем же недостатком. Пока он работает с элементами формы - все хорошо. Как только вы попытаетесь его заставить работать с элементами на юзерконтроле - возникнет ровно та же байда, то есть экземпляр просто класса не будет отличаться от экземпляра юзерконтрола.

===============

В общем, похоже, проблема в поставленном мной варианте нерешаема, так как контролы начинают умирать не изнутри (не с самого вложенного), а снаружи. И внутренний контрол самостоятельно просто никаким образом не может узнать о деструкции, потому что ему никто об этом не сообщает.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539582
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Но, что интересно, ваш пример будет обладать тем же недостатком. Пока он работает с элементами формы - все хорошо. Как только вы попытаетесь его заставить работать с элементами на юзерконтроле - возникнет ровно та же байда, то есть экземпляр просто класса не будет отличаться от экземпляра юзерконтрола.

Вполне возможно - я не припомню чтобы я пытался заставить его работать внутри юзерконтрола. Но с контролами на форме все без проблем.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539588
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProИгорь ГорбоносВообщем, я бы решал бы её так как в приложении. В принципе можно и без класса, но тогда нужно не забывать прорисывать функцию деинициализации во всех контролах имеющих ссылки на внешние объекты

Спасибо, но это вариации на тему того, что мы обсуждали - старт идет внешний.

AntonariyНу тогда и моих 5 копеек.
Так саказать, минимум телодвижений для достижения эффекта.

Ext убился
Int убился
Ext убился
Int убился
Int убился

Вот как оно срабатывает при закрытии формы. То есть терминируется внешний контрол. После этого внутренний пытается отвязаться от кнопки внешнего, вызывает его снова к жизни, умирает сам, потом внешний пытается вызвать метод внутреннего, опять вызывает его к жизни... М-да.

AndrF
И в итоге всей типовой обработкой/проверкой ввода занимаются классы.
Как я понимаю автору нужно нечто подобное, но он решил реализовать на UserControl-ах...

Потому что от юзерконтрол имеет собственные визуальные элементы. Но, что интересно, ваш пример будет обладать тем же недостатком. Пока он работает с элементами формы - все хорошо. Как только вы попытаетесь его заставить работать с элементами на юзерконтроле - возникнет ровно та же байда, то есть экземпляр просто класса не будет отличаться от экземпляра юзерконтрола.

===============

В общем, похоже, проблема в поставленном мной варианте нерешаема, так как контролы начинают умирать не изнутри (не с самого вложенного), а снаружи. И внутренний контрол самостоятельно просто никаким образом не может узнать о деструкции, потому что ему никто об этом не сообщает.

и в чём проблема? в Form_QueryUnload надо вызвать метод/свойство своего юзерконтрола/ов
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539594
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneи в чём проблема?

Konst_One - при всем уважении...
Я уже несколько раз ответил на этот вопрос.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539610
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProKonst_Oneи в чём проблема?

Konst_One - при всем уважении...
Я уже несколько раз ответил на этот вопрос.

код не смотрел, но что-то по описанию немного запутанная у вас ситуация. может стоит отказаться от управления динамическими контролами на парент-объекте из юзерконтрола. обычно юзерконтрол - это вещь в себе и работать должен изоллированно.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539645
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneкод не смотрел, но что-то по описанию немного запутанная у вас ситуация. может стоит отказаться от управления динамическими контролами на парент-объекте из юзерконтрола. обычно юзерконтрол - это вещь в себе и работать должен изоллированно.

На парент-объекте контролы необязательно динамические...

У внутреннего контрола задача такова: он отслеживает события контролов парента (то бишь своих соседей) и в зависимости от этого сам выполняет какие-то действия. При этом он заранее не знает перечень контролов парента, выбирая их по определенному принципу. При этом я категорически минимизирую код самого парента ибо разнообразие парентов довольно велико, все утаптываю ногами внутрь контрола.... как-то так....
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539651
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProKonst_Oneкод не смотрел, но что-то по описанию немного запутанная у вас ситуация. может стоит отказаться от управления динамическими контролами на парент-объекте из юзерконтрола. обычно юзерконтрол - это вещь в себе и работать должен изоллированно.

На парент-объекте контролы необязательно динамические...

У внутреннего контрола задача такова: он отслеживает события контролов парента (то бишь своих соседей) и в зависимости от этого сам выполняет какие-то действия. При этом он заранее не знает перечень контролов парента, выбирая их по определенному принципу. При этом я категорически минимизирую код самого парента ибо разнообразие парентов довольно велико, все утаптываю ногами внутрь контрола.... как-то так....


авторон отслеживает события контролов парента

вот это меня и смущает! обычно для этого используют dll, но никак не activex control (ocx)
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539670
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneвот это меня и смущает! обычно для этого используют dll, но никак не activex control (ocx)

А чем это, собстенно, плохо (кроме, конечно, возникшей проблемы, которая, в принципе, решаема)?
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539687
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProKonst_Oneвот это меня и смущает! обычно для этого используют dll, но никак не activex control (ocx)

А чем это, собстенно, плохо (кроме, конечно, возникшей проблемы, которая, в принципе, решаема)?

activeX control (ocx) - это встраиваемый объект, отсюда и все проблемы. он для утилизации часто-используемых интрефейсов был придуман (коробочка с заранее подготовленным функционалом). а то, что вы делаете, это скорее динамическое управление в режиме рантайма. откажитесь от скомпилённых ocx хотя бы, вложите все контролы в один проект и включите отладку. т.е. отдельных проектов для ocx не делайте, добавьте их к как модули в основной проект.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539705
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Konst_One

У автора .ctl контролы. Они и так идут в самом проекте

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
25 сообщений из 46, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6: Как помочь убиться юзерконтролу.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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