Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перехватить уничтожение контрола при закрытии приложения [D7]


mfender ©   (2006-12-25 12:25:00) 

Здравия желаю!

У меня опять вопрос: имеется TTreeView. При закрытии приложения он уничтожается, начиная с самого нижнего TTreeNode. Т.е. получается, что к деструктору всего TreeView очередь доходит уже когда нет ни одного узла. А мне нужно поймать этот момент (пока все node'ы целы) и записать в TStringList все, у которых Expanded = True.

Конечно, самое простое - использовать OnClose формы. Но мне хочется это сделать внутри объекта TTreeView (на самом деле, он не TTreeView, но его наследник).


Ega23   (2006-12-25 16:32:00) [1]


> перекрыть в наследнике саму DestroyWnd и сохранять данные
> в ней.
>


Я именно так и сделал: перекрыл CreateWnd и destroyWnd с собственным алгоритмом сохранения-считывания карты узлов


umbra   (2006-12-25 16:23:00) [2]

вопрос с DestroyWnd можно решить двумя способами:

1) у TCustomTreeView есть protected свойство CreateWndRestores, которое по умолчанию равно True. Именно от него зависит, будут ли ноды сохраняться в отдельный поток. У наследника  его можно менять по своему усмотрению. Правда, подозреваю, что если его сделать False, то в таком случае не будут сохраняться выделенные элементы и отрисовка будет медленнее.

2) перекрыть в наследнике саму DestroyWnd и сохранять данные в ней.


Ega23   (2006-12-25 15:44:00) [3]


> вот я смотрю в код деструктора TCustomTreeView. Первая строчка
> в нем - FTreeNodes.Free;, т.е. ноды, по видимости, до деструктора
> доживают.


Если DestroyWnd по каким-то причинам раньше отработала (Parent убрали или программу "свернули"), то это ничего не даст; посмотри как она реализована


Ega23   (2006-12-25 15:43:00) [4]


> До него ноды не доживают.


Это если inherited сразу после begin ставить, а не перед end.


umbra   (2006-12-25 15:42:00) [5]

вот я смотрю в код деструктора TCustomTreeView. Первая строчка в нем - FTreeNodes.Free;, т.е. ноды, по видимости, до деструктора доживают.


umbra   (2006-12-25 15:34:00) [6]

а что мешает проделать нужные действия в деструкторе наследника?


Loginov Dmitry   (2006-12-25 15:34:00) [7]

> что мешает проделать нужные действия в деструкторе наследника?


До него ноды не доживают.


Ega23   (2006-12-25 15:28:00) [8]


> Больное место TTreeView в Delphi. Была проблема, связанная
> с освобождением памяти, занятой под объекты, ссылки на которые
> хранятся в TTreeNode.Data. OnDeletion нельзя было использовать,
>  пришлось все освобождать в FormClose.
>


Ничего больного.
Просто этот гад (TCustomTreeView) на DestroyWnd сохраняет данные о нодах во втутренний Stream, а на CreateWnd - восстанавливает.


Loginov Dmitry   (2006-12-25 15:24:00) [9]

Больное место TTreeView в Delphi. Была проблема, связанная с освобождением памяти, занятой под объекты, ссылки на которые хранятся в TTreeNode.Data. OnDeletion нельзя было использовать, пришлось все освобождать в FormClose.


Ega23   (2006-12-25 12:28:00) [10]

Попробуй TTreeView.BeforeDestruction


Наверх

Титульная страница Поиск, карта сайта Написать письмо