Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=36537024&tid=2160010]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 379ms |

| 0 / 0 |
