![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перехватить уничтожение контрола при закрытии приложения [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