最好记录下,每个结点的level和父结点的index(parent.index)
这样可以唯一确定要添加的结点的位置,下面是我刚做的,拿来探讨一下
    for i:=1 to aTable.RecordCount-1 do
      begin
       iLevel:= aTable.FieldByName('Level').Asinteger;
       iParent:=aTable.fieldByname('ParentIndex').AsInteger;
       strNodename:= aTable.fieldByname('NodeName').AsString;       while (iLevel <> oldNode.Level+1) do
        begin
          if ( iLevel > oldNode.Level) then
             oldNode:=oldNode.getFirstChild
          else
             oldNode:=oldNode.Parent;
        end;
        if (iParent<>oldNode.Index) then
            oldNode:=oldNode.Parent.Item[iParent];
          aTree.Items.AddChild(oldNode,aTable.fieldbyName('NodeName').AsString);
        aTable.Next;
      end;oldNode是要添加的结点的父结点,相应的要有个数据表,其中字段有level,parentindex,nodename

解决方案 »

  1.   

    1.先定义一个自己的record
    如:
      Type
         MyNodeInfo=Record
           SelfCode,ParentCode:string;
           IsUse:Boolean;
           .
           ..
           ...
         end;
    2.定义一个指针类
      PMyNodeInfo:MyNodeInfo^;
    3.用一个递归将表中的节点加上,在添加节点的同时,将当前纪录的field内容读如record,并将node.data := pointer(PMyNodeInfo1)
    如:
    var
      PTemp:PMyNodeInfo;
      node:TTreeNode;
    begin
      ...
      node := TreeView1.Items.Add(ParentNode,'test');
      ...
      PTemp^.SelfCode := FieldByName('SelfCode').asstring;
      ...
      node.data := pointer(PTemp);
      ...
    end;
      

  2.   

    a9a9a9() 说得方法可以直接用一个函数就可以了
    TreeView1.Items.AddObject(ParentNode,'test',PTemp);
    如果添加子结点就是AddChildObject,可以看帮助,有详细介绍