powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VB6: Как помочь убиться юзерконтролу.
46 сообщений из 46, показаны все 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
VB6: Как помочь убиться юзерконтролу.
    #36539713
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Konst_One

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




да, но он их юзает не как нормальные ocx. может ему они вообще не нужны и пусть делает классы и тд и тп. UserControl.Parent ему религия не позволяет юзать?
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539752
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносУ автора .ctl контролы. Они и так идут в самом проекте

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

Konst_OneactiveX control (ocx) - это встраиваемый объект, отсюда и все проблемы. он для утилизации часто-используемых интрефейсов был придуман (коробочка с заранее подготовленным функционалом). а то, что вы делаете, это скорее динамическое управление в режиме рантайма. откажитесь от скомпилённых ocx хотя бы, вложите все контролы в один проект и включите отладку. т.е. отдельных проектов для ocx не делайте, добавьте их к как модули в основной проект.

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


Konst_Oneда, но он их юзает не как нормальные ocx. может ему они вообще не нужны и пусть делает классы и тд и тп. UserControl.Parent ему религия не позволяет юзать?

Контролы ВИЗУАЛЬНЫЕ. Как классы решают эту проблему? UserControl.Parent я юзаю, но как это связано с перехватом событий?
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539805
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из контрола обращайтесь к объектам на родительской форме через UserControl.Parent. если передаёте ссылку на внешний контрол внутрь скоего юзерконтрола, то передавайте как ByRef, не делайте копии контрола внутри. у юзерконтрола есть не только события Initialize и Terminate, а InitProperties, ReadProperties. в них стоит проводить основную работу в рантайме/дизайнтайме при инициализации. а также событие Show не забываем. где-то на мсдн были картинки с порядком выполнения событий юзерконтрола в режимах дизайнтайм/рантайм , но можно и просто посмотреть на тестовом контроле через Debug.Print по всем событиям.

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

:)

> может ему они вообще не нужны и пусть делает классы и тд и тп. UserControl.Parent ему религия не позволяет юзать?

А чем здесь поможет Parent? у него произвольная глубина вложенности этих контролов может быть и контрол из любого уровня
может "проталкиватся" на произвольный уровень вложенности, только ниже(это как я понял ) И собственно проблема в
том, что нет события от кого нибудь, что форма, на которой сидит вся матрёшка хочет закрытся и всем нужно почистить
ссылки и выгружатся.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539851
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneиз контрола обращайтесь к объектам на родительской форме через UserControl.Parent. если передаёте ссылку на внешний контрол внутрь скоего юзерконтрола, то передавайте как ByRef, не делайте копии контрола внутри. у юзерконтрола есть не только события Initialize и Terminate, а InitProperties, ReadProperties. в них стоит проводить основную работу в рантайме/дизайнтайме при инициализации. а также событие Show не забываем. где-то на мсдн были картинки с порядком выполнения событий юзерконтрола в режимах дизайнтайм/рантайм , но можно и просто посмотреть на тестовом контроле через Debug.Print по всем событиям.

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

Кстати, решение от автора языка. Видимо другого ничего придумать не
смогли.

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


авторCreate a Public method in the user control that releases allocated memory and then call the method from the Form that hosts the control array during the Form Unload event.

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


авторCreate a Public method in the user control that releases allocated memory and then call the method from the Form that hosts the control array during the Form Unload event.

Ну, собственно, все то же самое предлагается, от чего я уйти хотел.

а хотел terminate отделаться? о чём я и говорил, что не выйдет
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539945
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
В общем, похоже, проблема в поставленном мной варианте нерешаема, так как контролы начинают умирать не изнутри (не с самого вложенного), а снаружи. И внутренний контрол самостоятельно просто никаким образом не может узнать о деструкции, потому что ему никто об этом не сообщает.Нихрена во всем этом не разбираюсь, но может поможет такая идея.
Ввести какую-то глобальную переменную (или ключ в реестре).
А все эти контролы при своей работе, чтобы каждый раз проверяли её значение.
И при определенном значении самоликвидировались.
Хотя конечно и тут есть грабли, всегда ли есть возможность в нужный момент указать нужное значение этой глобальной переменой (ключу в реестре), чтобы дать команду на самоликвидацию.
Может я конечно и глупость сморозил, но вдруг поможет моя идея.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539960
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Речь идет о том, какое событие заставило бы контрол проверить эту переменную.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36539965
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Djon Player

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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36540063
Djon Player
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,

По поводу таймера.
А разве нельзя обойтись одним единственным таймером.
Т.е. один раз при запуске программы запрограммировать, что к примеру через 1 секунду запуститься таймер.
Далее в коде, который сработает при запуске этого таймера сделать нужные дела, затем запрограммировать, что через 1 секунду запуститься другой таймер.
А текущий таймер отключить.
В итоге вроде как всегда будет работать лишь один таймер, ну не считая других таймеров не связанных с данной программой.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36540123
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такая тема для размышления.
Может быть можно решить через API (тут рассчитываю на знания Игоря или Antonary)

Может ли контрол узнать, что он стал невидимым?
(для внешнего срабатывает событие Hide, а для внутреннего - нет, то есть возможно есть какое-то оконное сообщение?)
Далее надо проверить, не повис ли контрол в воздухе , то бишь то, что он стал невидимым не было ли вызвано тем, что он оказался на скрытой закладке SSTab или просто кто-то сделал ему Visible=False.

Ну и соответственно, попытаться самоликвидироваться..., хотя тут тоже вопрос - как....
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36540312
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Djon Player
> Игорь Горбонос,
>
> По поводу таймера.
> А разве нельзя обойтись одним единственным таймером.

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

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

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

Нет! именно сам контрол. Потому что самый старший родитель(форма) нормально терминируется, в то время как контролы
остаются в памяти.

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

Нифига.
см. мой самый первый пример
оба контрола не терминируются до выгрузки всего приложения.

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

Ну а я что сказал? :) что у контролов может "потерятся" контейнер-форма при этом они останутся в памяти пока не
завершится само приложение

Но дело в другом
Вот пример как флагман разруливает похожую
ситуацию :)
Даже здесь ситуация ещё хуже, тут датарепеатер, который размножается пока есть данные в рекордсете, а ты прекрасно
понимаешь, что данных может быть ну оооочень много и показан пример обмена сообщениями между разными контролами
находящимися на датарепеатере


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

Я называю этот прием "коллектор событий" и также использую его в проектах.
В принципе, он тоже решает мою задачу, но требует еще более серьезной переделки уже существующего кода.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36541147
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЯ называю этот прием "коллектор событий" и также использую его в проектах.
у каждого своя терминология
Shocker.ProВ принципе, он тоже решает мою задачу, но требует еще более серьезной переделки уже существующего кода.
От переделки все равно не уйти, и из поставленной тобой задачи, я склоняюсь к доделке каждого контрола универсальным интерфейсом инициализации\деинициализации. Этот процесс можно автоматизировать(добавление объявления метода) а потом руками пройдись и прописать нужный код освобождения объектных ссылок и цикла по всем своим контролам с вызовом известного метода.
...
Рейтинг: 0 / 0
VB6: Как помочь убиться юзерконтролу.
    #36541372
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос у каждого своя терминология

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


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