Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.14;
Скачать: CL | DM;

Вниз

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

 
mfender ©   (2006-12-25 12:25) [0]

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

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

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


 
Ega23 ©   (2006-12-25 12:28) [1]

Попробуй TTreeView.BeforeDestruction


 
Loginov Dmitry ©   (2006-12-25 15:24) [2]

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


 
Ega23 ©   (2006-12-25 15:28) [3]


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


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


 
umbra ©   (2006-12-25 15:34) [4]

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


 
Loginov Dmitry ©   (2006-12-25 15:34) [5]

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


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


 
umbra ©   (2006-12-25 15:42) [6]

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


 
Ega23 ©   (2006-12-25 15:43) [7]


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


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


 
Ega23 ©   (2006-12-25 15:44) [8]


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


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


 
umbra ©   (2006-12-25 16:23) [9]

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

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

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


 
Ega23 ©   (2006-12-25 16:32) [10]


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


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



Страницы: 1 вся ветка

Текущий архив: 2007.01.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.052 c
15-1166870445
lookin
2006-12-23 13:40
2007.01.14
Посмотрел Список Шиндлера....


2-1166703886
Галинка
2006-12-21 15:24
2007.01.14
XML -> DataSet


15-1165745073
Интересующийся
2006-12-10 13:04
2007.01.14
Сканер Epson 3490/3590 Poto и работа с пленкой


1-1164362650
dimass
2006-11-24 13:04
2007.01.14
Приложение VСL.Net + компонент и сразу Exception почему ???


2-1167038783
D@Nger
2006-12-25 12:26
2007.01.14
Поиск в БД Парадокс