Finalize
Я часто работаю с VirtualTreeView. Очень удобный и мощный компонент, да еще бесплатный и с открытым кодом. Работу с данными я обычно веду следующим образом:
type
PData = ^TData;
TData = record
Caption: WideString;
Data: WideString;
Count: Integer;
end;
var
lData: PData;
begin
lData := VT.GetNodeData(Node);
if Assigned(lData) then
begin
// Тут код
end;
end;
Т.е., все данные храню в самом дереве. Знаю, что это не самый лучший способ. Например, во многих случаях, особенно когда необходима не стандартная сортировка или нестандартная обработка данных, правильнее было бы хранить данные в отдельном массиве, а в дереве держать только указатели на нужные данные, но так уж я привык.
И у моего подхода есть один минус. Точнее он есть у любого подхода, связанного с VT - необходимо при удалении узла, удалить и данные, связанные с этим узлом. Я всегда делал так:
var
lData: PData;
begin
lData := VT.GetNodeData(Node);
if Assigned(lData) then
begin
lData^.Caption := EmptyWideStr;
lData^.Data := EmptyWideStr;
end;
end;
А если стринговых полей будет пара сотен? Сегодня узнал, что можно все делать проще:
var
lData: PData;
begin
lData := VT.GetNodeData(Node);
if Assigned(lData) then
Finalize(lData^);
end;
И все. Действительно - "век живи - век учись". Спасибо VICTAR за подсказку и Codegear за прекрасный инструмент.
Спонсор поста: пропонуємо вам переглянути блог, який веде блогер mcreper про партнерські програми в інтернеті.
+0