Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Вводные: Есть форма Form2 На форме лежит юзерконтрол UCExt1 На юзерконтроле лежит кнопка Command1 и юзерконтрол UCInt1 Внутри юзерконтрола UCInt1 есть объектная переменная, которая ссылается на Command1 (так сказать, вовне себя). Проблема: При закрытии формы Form2 оба контрола не уничтожаются (так как фактически ссылаются друг на друга) и остаются в памяти. Если несколько раз открыть/закрыть форму - они скапливаются в памяти, сжирая ресурсы. Можно было бы "расшить" ситуацию, если бы форма при QueryUnload деинициализировала бы цепочку контролов (заставляла бы юзерконтролы очистить ссылки), но во-первых, это неудобно (вложенность контролов, в принципе, может быть произвольной), во-вторых, контролы библиотечные, сами они не местные, не знают, где в какой момент могут оказаться и т.п., в-третьих, они могут быть созданы динамически, то есть и формы-то никакой нет, в-четвертых, написана куча кода и весь его переделывать не хочется. Подозреваю, что есть какой-то более простой способ самому контролу узнать о том, что его собираются деструктировать и он бы деинициализировал самостоятельно все свои внешние ссылки. Приложено: Проект, иллюстрирующий проблему. При закрытии Form2 контролы не терминируются, терминируются только вместе с выгрузкой проекта (закрытием Form1). Если же закомментировать строку: Set Command = Cmm то контролы будут как положено терминироваться при выгрузке Form2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2010, 23:01 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
На очень скорую руку (спать охота) - см приложенный проект. Хоть и не очень красиво, но работает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 04:28 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
AndrF, Не, ну это не о том. Это тот вариант, который я описал, как нежелательный по четырем причинам. Есть у кого еще мысли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 13:24 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
> Автор: Shocker.Pro > Подозреваю, что есть какой-то более простой способ самому контролу узнать о том, что его собираются > деструктировать и он бы деинициализировал самостоятельно все свои внешние ссылки. Это на мой взгляд это не возможно в общем случае. Именно по этой причине в спецификацию СОМ в самый главный интерфейс были введены функции управления ссылками Add и Release. Попробуй сделать систему учета присвоенных объектных ссылок, через какую-то общую friend функцию, в которой будет производится нужное присваивание и учитыватся кто и кому присвоился Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 14:04 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Игорь ГорбоносПопробуй сделать систему учета присвоенных объектных ссылок, через какую-то общую friend функцию, в которой будет производится нужное присваивание и учитыватся кто и кому присвоился А как мне поможет это знание (учет ссылок)? В любом случае, нужно запускать процесс деиницилизации, отталкиваясь от чего-то (события). Вот это "что-то" пытаюсь нащупать. ЗЫ: У контрола UCExt возникает событие Hide. В этот момент можно проверить наличие живого Parent-a - если нету - признак того, что контрол должен быть уничтожен... Однако, для UCInt это событие не возникает... Может какое-то оконное сообщение пытаться перехватить.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 14:12 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Shocker.Proво-вторых, контролы библиотечные, сами они не местные, не знают, где в какой момент могут оказаться и т.пДля этого существуют интерфейсы. Можно сделать дополнительную dll с этим интерфейсом, о которой бы знали и контролы и программа, или можно сделать tlb, чтобы не таскать лишний файл в дистрибутиве. Shocker.Proв-четвертых, написана куча кода и весь его переделывать не хочетсяВ использовании интерфейсов переделка сводится к автоматизированию копипаста. Остальные пункты проблемой не являются. Jah loves you. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 14:21 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Antonariy, Я, честно говоря, не очень понял, зачем эти интерфейсы. Грубо говоря, у каждого моего контрола есть метод по деинициализации всех внешних ссылок. Этот метод можно дополнить тем, чтобы он пробегался по всем вложенным контролам и пытался запустить для них этот метод (невзирая на возможные ошибки). Таким образом все будет сводиться к тому, чтобы каскадно запустить метод деинициализации для самого внешнего уничтожаемого контрола. А для того, чтобы его запускать вручную, нужно проследить возможные причины уничтожения контрола. Это могут быть: Выгрузка формы внешними причинами Уничтожение динамического экземпляра Controls.Remove Выгрузка из массива Unload То есть все это надо найти и модифицировать и, главное, не забывать в дальнейшем добавлять вызов этого каскадного метода. Кроме того, для каждого нового контрола (даже если он сам не инициализирует внешние ссылки) нужно прописывать этот метод каскадирования и опять же не забывать это делать в дальнейшем. Я-то хотел упростить модификации до того, чтобы изменить только код контролов и только тех, которые создают внешние ссылки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 14:45 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
> Автор: Shocker.Pro > Antonariy, > > Я, честно говоря, не очень понял, зачем эти интерфейсы. Интерфейс стандартизирует интерфейс Грубо говоря, наследование от интерфейса заставит все наследники иметь одноименные методы. И тогда: > пытался запустить для них этот метод (невзирая на возможные ошибки). этот метод будет у всех заинтересованных и он будет запускатся без ошибок, просто потому что он будет Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 15:43 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
А может не надо пытаться присвоить ссылку объекту во внутреннем контроле на кнопку во внешнем, а просто создать в нем Public метод CommandClick и вызывать его при нажатии кнопки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 09:06 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Ага, при нажатии всех двадцати кнопок и изменениях других тридцати полей сделать столько же вызовов :) Может вообще не стоит делать юзерконтрол, а весь его код копипастить во все формы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 10:08 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Вообщем, я бы решал бы её так как в приложении. В принципе можно и без класса, но тогда нужно не забывать прорисывать функцию деинициализации во всех контролах имеющих ссылки на внешние объекты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 10:39 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Shocker.ProУничтожение динамического экземпляра Controls.Remove Выгрузка из массива UnloadТаких мест много? Jah loves you. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 10:48 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
AntonariyТаких мест много? Как я уже говорил раньше - у меня огромный и достаточно старый проект. Более-менее современные вещи хорошо инкапсулированы и систематизированы, но встречается и код 2000-2001гг (когда деревья были большие, а я глупый). Кроме того, у меня большое желание не иметь таких вещей, о которых нужно помнить в будущем, то есть очень хочется деструкцию контрола инкапсулировать в сам контрол. Если это невозможно - у меня и вопросов нет к уважаемому сообществу - как сделать без инкапсуляции - я себе представляю. Помнишь, я говорил. Лечение гильотинированием никто не любит, в том числе и я ЗЫ: Ща посмотрим, что там Игорь предложил... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 10:56 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 11:12 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
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. И в итоге всей типовой обработкой/проверкой ввода занимаются классы. Как я понимаю автору нужно нечто подобное, но он решил реализовать на UserControl-ах... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 12:36 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Игорь ГорбоносВообщем, я бы решал бы её так как в приложении. В принципе можно и без класса, но тогда нужно не забывать прорисывать функцию деинициализации во всех контролах имеющих ссылки на внешние объекты Спасибо, но это вариации на тему того, что мы обсуждали - старт идет внешний. AntonariyНу тогда и моих 5 копеек. Так саказать, минимум телодвижений для достижения эффекта. Ext убился Int убился Ext убился Int убился Int убился Вот как оно срабатывает при закрытии формы. То есть терминируется внешний контрол. После этого внутренний пытается отвязаться от кнопки внешнего, вызывает его снова к жизни, умирает сам, потом внешний пытается вызвать метод внутреннего, опять вызывает его к жизни... М-да. AndrF И в итоге всей типовой обработкой/проверкой ввода занимаются классы. Как я понимаю автору нужно нечто подобное, но он решил реализовать на UserControl-ах... Потому что от юзерконтрол имеет собственные визуальные элементы. Но, что интересно, ваш пример будет обладать тем же недостатком. Пока он работает с элементами формы - все хорошо. Как только вы попытаетесь его заставить работать с элементами на юзерконтроле - возникнет ровно та же байда, то есть экземпляр просто класса не будет отличаться от экземпляра юзерконтрола. =============== В общем, похоже, проблема в поставленном мной варианте нерешаема, так как контролы начинают умирать не изнутри (не с самого вложенного), а снаружи. И внутренний контрол самостоятельно просто никаким образом не может узнать о деструкции, потому что ему никто об этом не сообщает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 13:45 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro Но, что интересно, ваш пример будет обладать тем же недостатком. Пока он работает с элементами формы - все хорошо. Как только вы попытаетесь его заставить работать с элементами на юзерконтроле - возникнет ровно та же байда, то есть экземпляр просто класса не будет отличаться от экземпляра юзерконтрола. Вполне возможно - я не припомню чтобы я пытался заставить его работать внутри юзерконтрола. Но с контролами на форме все без проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 14:01 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Shocker.ProИгорь ГорбоносВообщем, я бы решал бы её так как в приложении. В принципе можно и без класса, но тогда нужно не забывать прорисывать функцию деинициализации во всех контролах имеющих ссылки на внешние объекты Спасибо, но это вариации на тему того, что мы обсуждали - старт идет внешний. AntonariyНу тогда и моих 5 копеек. Так саказать, минимум телодвижений для достижения эффекта. Ext убился Int убился Ext убился Int убился Int убился Вот как оно срабатывает при закрытии формы. То есть терминируется внешний контрол. После этого внутренний пытается отвязаться от кнопки внешнего, вызывает его снова к жизни, умирает сам, потом внешний пытается вызвать метод внутреннего, опять вызывает его к жизни... М-да. AndrF И в итоге всей типовой обработкой/проверкой ввода занимаются классы. Как я понимаю автору нужно нечто подобное, но он решил реализовать на UserControl-ах... Потому что от юзерконтрол имеет собственные визуальные элементы. Но, что интересно, ваш пример будет обладать тем же недостатком. Пока он работает с элементами формы - все хорошо. Как только вы попытаетесь его заставить работать с элементами на юзерконтроле - возникнет ровно та же байда, то есть экземпляр просто класса не будет отличаться от экземпляра юзерконтрола. =============== В общем, похоже, проблема в поставленном мной варианте нерешаема, так как контролы начинают умирать не изнутри (не с самого вложенного), а снаружи. И внутренний контрол самостоятельно просто никаким образом не может узнать о деструкции, потому что ему никто об этом не сообщает. и в чём проблема? в Form_QueryUnload надо вызвать метод/свойство своего юзерконтрола/ов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 14:02 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Konst_Oneи в чём проблема? Konst_One - при всем уважении... Я уже несколько раз ответил на этот вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 14:05 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Shocker.ProKonst_Oneи в чём проблема? Konst_One - при всем уважении... Я уже несколько раз ответил на этот вопрос. код не смотрел, но что-то по описанию немного запутанная у вас ситуация. может стоит отказаться от управления динамическими контролами на парент-объекте из юзерконтрола. обычно юзерконтрол - это вещь в себе и работать должен изоллированно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 14:10 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Konst_Oneкод не смотрел, но что-то по описанию немного запутанная у вас ситуация. может стоит отказаться от управления динамическими контролами на парент-объекте из юзерконтрола. обычно юзерконтрол - это вещь в себе и работать должен изоллированно. На парент-объекте контролы необязательно динамические... У внутреннего контрола задача такова: он отслеживает события контролов парента (то бишь своих соседей) и в зависимости от этого сам выполняет какие-то действия. При этом он заранее не знает перечень контролов парента, выбирая их по определенному принципу. При этом я категорически минимизирую код самого парента ибо разнообразие парентов довольно велико, все утаптываю ногами внутрь контрола.... как-то так.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 14:18 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Shocker.ProKonst_Oneкод не смотрел, но что-то по описанию немного запутанная у вас ситуация. может стоит отказаться от управления динамическими контролами на парент-объекте из юзерконтрола. обычно юзерконтрол - это вещь в себе и работать должен изоллированно. На парент-объекте контролы необязательно динамические... У внутреннего контрола задача такова: он отслеживает события контролов парента (то бишь своих соседей) и в зависимости от этого сам выполняет какие-то действия. При этом он заранее не знает перечень контролов парента, выбирая их по определенному принципу. При этом я категорически минимизирую код самого парента ибо разнообразие парентов довольно велико, все утаптываю ногами внутрь контрола.... как-то так.... авторон отслеживает события контролов парента вот это меня и смущает! обычно для этого используют dll, но никак не activex control (ocx) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 14:19 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Konst_Oneвот это меня и смущает! обычно для этого используют dll, но никак не activex control (ocx) А чем это, собстенно, плохо (кроме, конечно, возникшей проблемы, которая, в принципе, решаема)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 14:22 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Shocker.ProKonst_Oneвот это меня и смущает! обычно для этого используют dll, но никак не activex control (ocx) А чем это, собстенно, плохо (кроме, конечно, возникшей проблемы, которая, в принципе, решаема)? activeX control (ocx) - это встраиваемый объект, отсюда и все проблемы. он для утилизации часто-используемых интрефейсов был придуман (коробочка с заранее подготовленным функционалом). а то, что вы делаете, это скорее динамическое управление в режиме рантайма. откажитесь от скомпилённых ocx хотя бы, вложите все контролы в один проект и включите отладку. т.е. отдельных проектов для ocx не делайте, добавьте их к как модули в основной проект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 14:28 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
> Автор: Konst_One У автора .ctl контролы. Они и так идут в самом проекте Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 14:31 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос > Автор: Konst_One У автора .ctl контролы. Они и так идут в самом проекте да, но он их юзает не как нормальные ocx. может ему они вообще не нужны и пусть делает классы и тд и тп. UserControl.Parent ему религия не позволяет юзать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 14:33 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Игорь ГорбоносУ автора .ctl контролы. Они и так идут в самом проекте В принципе, у меня и то и другое. Есть библиотека универсальных контролов, которая идет как ocx (при этом она подключена как проект в группу проектов, так что с отладкой в этом плане проблем нет), а есть и специфические контролы в самом проекте. С точки зрения их эксплуатации и возникновения проблемы они не отличаются. Konst_OneactiveX control (ocx) - это встраиваемый объект, отсюда и все проблемы. он для утилизации часто-используемых интрефейсов был придуман (коробочка с заранее подготовленным функционалом). а то, что вы делаете, это скорее динамическое управление в режиме рантайма. откажитесь от скомпилённых ocx хотя бы, вложите все контролы в один проект и включите отладку. т.е. отдельных проектов для ocx не делайте, добавьте их к как модули в основной проект. Честно говоря, я-таки не сделал выводов. Почему использование dll лучше, чем ocx? Собственно - я их и эксплуатирую в режиме утилизации интерфейсов. Konst_Oneда, но он их юзает не как нормальные ocx. может ему они вообще не нужны и пусть делает классы и тд и тп. UserControl.Parent ему религия не позволяет юзать? Контролы ВИЗУАЛЬНЫЕ. Как классы решают эту проблему? UserControl.Parent я юзаю, но как это связано с перехватом событий? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 14:41 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
из контрола обращайтесь к объектам на родительской форме через UserControl.Parent. если передаёте ссылку на внешний контрол внутрь скоего юзерконтрола, то передавайте как ByRef, не делайте копии контрола внутри. у юзерконтрола есть не только события Initialize и Terminate, а InitProperties, ReadProperties. в них стоит проводить основную работу в рантайме/дизайнтайме при инициализации. а также событие Show не забываем. где-то на мсдн были картинки с порядком выполнения событий юзерконтрола в режимах дизайнтайм/рантайм , но можно и просто посмотреть на тестовом контроле через Debug.Print по всем событиям. зы просто общие рекомендации. может помогут в решении вашей проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 14:51 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
> Автор: Konst_One > да, но он их юзает не как нормальные ocx. :) > может ему они вообще не нужны и пусть делает классы и тд и тп. UserControl.Parent ему религия не позволяет юзать? А чем здесь поможет Parent? у него произвольная глубина вложенности этих контролов может быть и контрол из любого уровня может "проталкиватся" на произвольный уровень вложенности, только ниже(это как я понял ) И собственно проблема в том, что нет события от кого нибудь, что форма, на которой сидит вся матрёшка хочет закрытся и всем нужно почистить ссылки и выгружатся. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 14:53 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Konst_Oneиз контрола обращайтесь к объектам на родительской форме через UserControl.Parent. если передаёте ссылку на внешний контрол внутрь скоего юзерконтрола, то передавайте как ByRef, не делайте копии контрола внутри. у юзерконтрола есть не только события Initialize и Terminate, а InitProperties, ReadProperties. в них стоит проводить основную работу в рантайме/дизайнтайме при инициализации. а также событие Show не забываем. где-то на мсдн были картинки с порядком выполнения событий юзерконтрола в режимах дизайнтайм/рантайм , но можно и просто посмотреть на тестовом контроле через Debug.Print по всем событиям. Последовательность событий я знаю, использую их все. Но не создавая копию ссылки внутри контрола не перехватишь события WithEvents. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 14:59 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
> Автор: Shocker.Pro Кстати, решение от автора языка. Видимо другого ничего придумать не смогли. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 15:01 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Игорь ГорбоносКстати, решение от автора языка. Видимо другого ничего придумать не смогли. автор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. Ну, собственно, все то же самое предлагается, от чего я уйти хотел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 15:05 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
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 отделаться? о чём я и говорил, что не выйдет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 15:07 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro В общем, похоже, проблема в поставленном мной варианте нерешаема, так как контролы начинают умирать не изнутри (не с самого вложенного), а снаружи. И внутренний контрол самостоятельно просто никаким образом не может узнать о деструкции, потому что ему никто об этом не сообщает.Нихрена во всем этом не разбираюсь, но может поможет такая идея. Ввести какую-то глобальную переменную (или ключ в реестре). А все эти контролы при своей работе, чтобы каждый раз проверяли её значение. И при определенном значении самоликвидировались. Хотя конечно и тут есть грабли, всегда ли есть возможность в нужный момент указать нужное значение этой глобальной переменой (ключу в реестре), чтобы дать команду на самоликвидацию. Может я конечно и глупость сморозил, но вдруг поможет моя идея. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 15:24 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Речь идет о том, какое событие заставило бы контрол проверить эту переменную. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 15:29 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
> Автор: Djon Player Эту идею можно использовать, но! должен быть механизм периодической проверки значения. А в случае "подвешивания" контролов может спасти только таймер с которым могут быть такие-же проблемы "подвешивания" форм и к тому-же количество таймеров было ограниченно в системе, т.е. можно нарватся на исчерпание свободных. Поэтому на мой взгляд для данной проблемы это не вариант решения в большом проекте Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 15:31 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос, По поводу таймера. А разве нельзя обойтись одним единственным таймером. Т.е. один раз при запуске программы запрограммировать, что к примеру через 1 секунду запуститься таймер. Далее в коде, который сработает при запуске этого таймера сделать нужные дела, затем запрограммировать, что через 1 секунду запуститься другой таймер. А текущий таймер отключить. В итоге вроде как всегда будет работать лишь один таймер, ну не считая других таймеров не связанных с данной программой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 15:51 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Такая тема для размышления. Может быть можно решить через API (тут рассчитываю на знания Игоря или Antonary) Может ли контрол узнать, что он стал невидимым? (для внешнего срабатывает событие Hide, а для внутреннего - нет, то есть возможно есть какое-то оконное сообщение?) Далее надо проверить, не повис ли контрол в воздухе , то бишь то, что он стал невидимым не было ли вызвано тем, что он оказался на скрытой закладке SSTab или просто кто-то сделал ему Visible=False. Ну и соответственно, попытаться самоликвидироваться..., хотя тут тоже вопрос - как.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 16:01 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
> Автор: Djon Player > Игорь Горбонос, > > По поводу таймера. > А разве нельзя обойтись одним единственным таймером. Ты не понял :) Таймер это ресурс системы, который ограничен. Так как мы не знаем когда он может понадобится(и понадобится ли вообще) то инициализировать его нужно при старте контрола(т.е. отбирать ресурсы у системы, при этом не важно тикает он или просто висит, а он должен тикать с момента инициализации, потому что неизвесно, когда ему начинать тикать, в смысле нет четкого события, по которому можно сказать что сейчас можно начинать тикать). При таком подходе в большом проекте(я видел форму на которой было около 700 контролов) есть риск попасть на нехватку ресурса. И это если не рассматривать кошмар отладки такого количества таймеров :) Поэтому для меня это вообще не вариант, даже как временный, потому что Джонатан СвифтВ мире нет ничего более постоянного, чем временное Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 16:48 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Shocker.ProДалее надо проверить, не повис ли контрол в воздухе Точнее даже не он сам, а его самый старший родитель ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 17:23 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
> Автор: Shocker.Pro > Shocker.Pro > Далее надо проверить, не повис ли контрол в воздухе > > > Точнее даже не он сам, а его самый старший родитель Нет! именно сам контрол. Потому что самый старший родитель(форма) нормально терминируется, в то время как контролы остаются в памяти. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 17:31 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Игорь ГорбоносНет! именно сам контрол. Потому что самый старший родитель(форма) нормально терминируется, в то время как контролы Нифига. см. мой самый первый пример оба контрола не терминируются до выгрузки всего приложения. При этом внутренний контрол вообще чувствует себя хорошо и думает, что все в порядке. Только у самого внешнего контрола пропадает родитель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 17:35 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
> Автор: Shocker.Pro > Игорь Горбонос > Нет! именно сам контрол. Потому что самый старший родитель(форма) нормально терминируется, в то время как > контролы > > > Нифига. > см. мой самый первый пример > оба контрола не терминируются до выгрузки всего приложения. Ну а я что сказал? :) что у контролов может "потерятся" контейнер-форма при этом они останутся в памяти пока не завершится само приложение Но дело в другом Вот пример как флагман разруливает похожую ситуацию :) Даже здесь ситуация ещё хуже, тут датарепеатер, который размножается пока есть данные в рекордсете, а ты прекрасно понимаешь, что данных может быть ну оооочень много и показан пример обмена сообщениями между разными контролами находящимися на датарепеатере Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 18:12 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Игорь Горбонос Вот пример как флагман разруливает похожую ситуацию :) Я называю этот прием "коллектор событий" и также использую его в проектах. В принципе, он тоже решает мою задачу, но требует еще более серьезной переделки уже существующего кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2010, 18:59 |
|
||
|
VB6: Как помочь убиться юзерконтролу.
|
|||
|---|---|---|---|
|
#18+
Shocker.ProЯ называю этот прием "коллектор событий" и также использую его в проектах. у каждого своя терминология Shocker.ProВ принципе, он тоже решает мою задачу, но требует еще более серьезной переделки уже существующего кода. От переделки все равно не уйти, и из поставленной тобой задачи, я склоняюсь к доделке каждого контрола универсальным интерфейсом инициализации\деинициализации. Этот процесс можно автоматизировать(добавление объявления метода) а потом руками пройдись и прописать нужный код освобождения объектных ссылок и цикла по всем своим контролам с вызовом известного метода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2010, 01:06 |
|
||
|
|

start [/forum/moderation_log.php?user_name=mk2910]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 488ms |
| total: | 653ms |

| 0 / 0 |
