Плаха надеждица

4 отговора 148 прегледа
#1

Плаха надеждица

От хелпа за TTreeNode:
"Use the DeleteChildren method to delete all children of a tree node, freeing all associated memory.
Това как би трябвало да се тълкува по отношение на обектите, асоциирани с TTreeNode.Data - чисти ли ги, или няма спасение от изричното забърсване в цикъл?

Отговор
в отговор на bass #2

Забрави!

...freeing all associated memory - има се предвид паметта, заемана от обектите TTreeNode, които са му деца.
полето Data мисля, че e Pointer, а не TObject и класа TTreeNode няма как да знае дали си асоциирал данни (^record) или обект в него и съответно не може да ти освободи паметта.
Няма спасение от изричното забърсване в рекурсивна процедура.

Отговор
в отговор на Formal #3

Re: Забрави!

ХъХъХъ, надеждата умира последна :-)
TTreeNode.Data (наистина) е поинтър - към динамично създаден обект, и по всички правила този обект трябва да се зачисти след употреба, което и правя досега. Не ползвам рекурсия, а цикъл по абсолютните номера
for nCurrent := 0 to TreeView.Items.Count-1 do Dispose(TTreeView.Items[nCurrent].Data),
което обхожда всички нива.
В хелпа обаче препоръчват да се избягва този подход, понеже ходенето по индекса на Items било много времеемко... Btw, с рекурсията не опираш ли пак до пряко индексиране (в TTreeNode.Item[xxx] за всеки клон)?

Редактирано от bass на

Отговор
в отговор на bass #4

Re: Забрави!

Най-добре е освобождаването на TTreeNode.Data да става в
OnDeletion event (TCustomTreeView)
Write an OnDeletion event handler to respond when a node is deleted from the tree view control.

Там ти се сервира точно това Node: TTreeNode, което се изтрива.

Отговор
в отговор на NDeu #5

Re: Забрави!

А! Чудесно!
Не се сетих за очевидния факт, че при дистройване на TTreeView ще се вика и OnDelete за всеки Node.
10x

Отговор