как вариант, может быть примерно такой подход :
Код:
Type
PRec_Attr = ^TRec_Attr; //Атрибуты узла в дереве
TRec_Attr = packed record
FileName : string;
.. и если что-то еще, что надо ...
end;
function ???.Tree_InsertThis_Node(NodeParent : TTreeNode; sNodeName : string; sFileName : string) : boolean;
//Вставка узла :
Var
PRec : PRec_Attr;
begin
...
if NodeParent<>NIL then begin
New(PRec);
PRec^.FileName := sFileName;
MyTree.Selected:=MyTree.Items.AddChildObject(NodeParent,sNodeName,PRec);
...
...
end;
end;
function ???.Tree_DeleteThis_Node(Node : TTreeNode) : boolean;
//Удалить узел дерева
Var
sFileName : string;
begin
Result:=false;
if Assigned(Node) then begin
sFileName:=Get_FileName(Node);
if FileExists(sFileName) then begin
//что-то делаем с файлом и др.атрибутами, если надо
end;
if Node.Data<>NIL then begin
//освобождаем ресурсы (занятые под атрибуты узла дерева)
PRec_Attr(Node.Data)^.FileName:='';
Dispose(PRec_Attr(Node.Data));
Node.Data:=NIL;
end;
MyTree.Items.Delete(Node); //удаляем узел
Result:=true;
end;
end;
function ???.Get_FileName(Node: TTreeNode) : string;
//Прочитать имя файла (в контексте данного узла)
begin
Result:='';
if Assigned(Node) then begin
if Node.Data<>NIL then begin
Result:=Trim(PRec_Attr(Node.Data)^.FileName);
end;
end;
end;
Освободить ресурсы (если дерево уничтожается) :
for i:=0 to (MyTree.Items.Count-1) do
begin
if MyTree.Items[i]<>NIL then begin
if MyTree.Items[i].Data<>NIL then begin
PRec_Attr(MyTree.Items[i].Data)^.FileName:='';
Dispose(PRec_Attr(MyTree.Items[i].Data));
MyTree.Items[i].Data:=NIL;
end;
end;
end;