|
Тема
|
Плаха надеждица
|
|
Автор |
bass (so deep!) |
Публикувано | 11.11.03 19:01 |
|
От хелпа за TTreeNode:
"Use the DeleteChildren method to delete all children of a tree node, freeing all associated memory.
Това как би трябвало да се тълкува по отношение на обектите, асоциирани с TTreeNode.Data - чисти ли ги, или няма спасение от изричното забърсване в цикъл?
| |
Тема
|
Забрави!
[re: bass]
|
|
Автор |
Formal (невежа) |
Публикувано | 11.11.03 19:45 |
|
...freeing all associated memory - има се предвид паметта, заемана от обектите TTreeNode, които са му деца.
полето Data мисля, че e Pointer, а не TObject и класа TTreeNode няма как да знае дали си асоциирал данни (^record) или обект в него и съответно не може да ти освободи паметта.
Няма спасение от изричното забърсване в рекурсивна процедура.
| |
Тема
|
Re: Забрави!
[re: Formal]
|
|
Автор |
bass (so deep!) |
Публикувано | 11.11.03 20:59 |
|
ХъХъХъ, надеждата умира последна :-)
TTreeNode.Data (наистина) е поинтър - към динамично създаден обект, и по всички правила този обект трябва да се зачисти след употреба, което и правя досега. Не ползвам рекурсия, а цикъл по абсолютните номера
for nCurrent := 0 to TreeView.Items.Count-1 do Dispose(TTreeView.Items[nCurrent].Data),
което обхожда всички нива.
В хелпа обаче препоръчват да се избягва този подход, понеже ходенето по индекса на Items било много времеемко... Btw, с рекурсията не опираш ли пак до пряко индексиране (в TTreeNode.Item[xxx] за всеки клон)?
Редактирано от bass на 11.11.03 20:59.
| |
Тема
|
Re: Забрави!
[re: bass]
|
|
Автор |
NDeu (динозавър) |
Публикувано | 11.11.03 22:29 |
|
Най-добре е освобождаването на TTreeNode.Data да става в
OnDeletion event (TCustomTreeView)
Write an OnDeletion event handler to respond when a node is deleted from the tree view control.
Там ти се сервира точно това Node: TTreeNode, което се изтрива.
| |
Тема
|
Re: Забрави!
[re: NDeu]
|
|
Автор |
bass (so deep!) |
Публикувано | 12.11.03 12:49 |
|
А! Чудесно!
Не се сетих за очевидния факт, че при дистройване на TTreeView ще се вика и OnDelete за всеки Node.
10x
| |
|
|
|
|