kms писал(а) 21. Февраля 2008 :: 20:34:Ну, схема комбинируется из описаний, данных разными авторами в предыдущих постах
ИМХО, не совсем правильно она у тебя комбинируется
kms писал(а) 21. Февраля 2008 :: 20:34:Короче, 1С действительно не хранит ссылок на CWnd.
Зуб даешь?
kms писал(а) 21. Февраля 2008 :: 20:34:Но тем не менее у нее есть массив CGetField*, а заодно и массив CGetCtrl*.
Впрочем, не суть, достаточно того, что она знает CtrlID этих окон.
При разрушении формы она проходит по списку CtrlID и как раз методом GetDescendantWindow/FromHandle получает CWnd*.
Это предположение или факт? Можешь сказать конкретную dll и адрес кода, который делает вышеописанное? Есть сомнения по этому поводу.
kms писал(а) 21. Февраля 2008 :: 20:34:FromHandle может, конечно, возвращать CTempWnd, но как правило не возвращает, ибо существуют перманентные объекты, а у них приоритет.
Ну, дальше уничтожение объектов - дело техники.
Не очевидно.
kms писал(а) 21. Февраля 2008 :: 20:34:В итоге получается такая картина:
Если delete текст или кнопку, а на ее месте создать другое окно - проблем не будет, ибо при разрушении формы FromHandle вернет указатель на другое окно и удалит его.
Не подтверждается. Перечитай эту тему внимательней. Мой объект CWnd 1С не удаляет. В частности, указатель на него можно удерживать в глобальном модуле - и спокойно обращаться к методам моего объекта. Удаление объекта происходит именно тогда, когда Я этого хочу.
kms писал(а) 21. Февраля 2008 :: 20:34:Если delete CBtnEdit (у которого bAutoDestroy == TRUE) - мы очень красиво разрушаем кучу, как раз методом двойного удаления объекта.
Есть мнение, что все нетривиальные CWnd 1С используют механизм автоудаления. Ибо зачем плодить сущности сверх необходимого? Пусть самоудаляются после WM_DESTROY и все. Тогда циклы по CWnd * в деструкторе не нужны вообще.
kms писал(а) 21. Февраля 2008 :: 20:34:Если DestroyWindow текст или кнопку, то сам объект CWnd остается с нулевым хендлом, FromHandle его не найдет никогда - это memory leak.
Если это временный объект, то он удалится MFC автоматически. Если это объект 1С, то зависит от объекта. Мне кажется, что в случае кнопок и надписей будут использоваться временные объекты MFC. Ибо для 1С не ни малейшего смысла создавать собственные объекты - логика надписи и кнопки тривиальна, тут нет необходимости навешивать дополнительный функционал. В этом случае при вызове delete мы уничтожим временный объект MFC, который потом повторно удалиться - со всеми вытекающими.
kms писал(а) 21. Февраля 2008 :: 20:34:Если DestroyWindow CBtnEdit - это одновременно и уничтожение CWnd - все ок.
Здесь есть вопрос, который я сам могу задать, себе же в основном.
Каким образом, при проходе по списку CtrlID, 1С определяет метод, которым надо уничтожать объекты?
Ну, потом разберемся, наверное, для полноты картины.
Считаю, (пока не доказано обратное), что:
- либо указатели на некоторые объекты 1С все же хранит
- либо нетривиальные объекты 1С самоуничтожаются
- либо комбинация двух вышеуказанных методов.
В любом случае DestroyWindow - наиболее корректный способ удаления окна. В лучшем случае все будет работать ПОЛНОСТЬЮ корректно. В худшем случае возможен лик (в чем я сомневаюсь), но лучше сделать лик, чем разрушить кучу.