Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Разбираюсь с очисткой TTreeView


Автор: кварк 7.12.2004, 08:51
Меня тревожит вопрос, хочу разобраться:

Создаю свой тип:
Код

TMyData = record
 ShortName: String;
 FullName: String;
 Type: Integer;
end;


Заполняю TTreeView примерно так:
Код

var
 tv: TTreeView;
 tn: TTreeNode;
 p: ^TMyData;

. . .
   tn := tv.Items.AddChild(nil, 'Надпись ' + IntToStr(tv.Items.Count));
   GetMem(p, Sizeof(TMyData));
   p^.ShortName := 'ShortName';
   p^.FullName := 'FullName';
   p^. Type := 138;
   tn.Data := p;


Как его очищать? tv.Items.Clear?
В справке написано "Deletes all tree nodes contained from the list managed by TTreeNodes."
А память Data освобождается? А если строки длинные (Список ведь большой может быть)?

Скажите пожалуйста, как все-таки правильно очищать этот список?

Автор: ~FoX~ 7.12.2004, 09:13
TreeView1.Items.Clear - очистит дерево.
А TMyData - очиститься само, по завершении работы.

Автор: кварк 7.12.2004, 09:39
То есть если я хочу перестроить дерево, то перед отчисткой надо пробегаться по всем элементам и делать FreeMem(Item.Data, Sizeof(TMyData));? А если там строки были килобайт по 100, как их грохнуть? Может, не со string надо запись делать, а с каким-нибудь классом-оберткой (типа CString). Тогда уж вместо записи надо класс писать. А если String - поле класса, оно уничтожится по free класса или останется висеть до завершения приложения?

Чего-то я совсем запутался под утро :-)

Автор: кварк 7.12.2004, 11:59
Я, пожалуй, упустил самое простое решение: TTreeView.OnDeletion. :-(

Буду копать в этом направлении.

Автор: ~FoX~ 7.12.2004, 12:46
Цитата
А если String - поле класса, оно уничтожится по free класса

Конечно.

Цитата
с каким-нибудь классом-оберткой (типа CString)

Только не CString, а TStrings или TStringList.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)