Текущий архив: 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.47 MB
Время: 0.012 c