一个表,三个字段
Id : 结点的ID,整型的
ParentId : 父结点的ID,没有父结点则为0
Name : 结点的文本。{ 装入目录 }
procedure TMainForm.LoadFolder;
  function GetParentNode(Id: integer): TTreeNode;
  var
    i, iCount:integer;
  begin
    result := nil;
    with TreeView do
    begin
      iCount := Items.Count - 1;
      for i := iCount downto 0 do
        if integer(Items[i].Data) = Id then
        begin
          result := Items[i];
          break;
        end;
    end;
  end;var
  i, iCount: integer;
  iFolderId, iParentId: integer;
  sFolderName: string;
begin
  with tblFolder, TreeView1 do
  begin
    iCount := RecordCount;
    Items.BeginUpdate;
    Items.Clear;
    for i := 1 to iCount do
    begin
      RecNo := i;
      iFolderId := FieldByName('Id').AsInteger;
      iParentId := FieldByName('ParentId').AsInteger;
      sFolderName := FieldByName('Name').AsString;
      Items.AddChild(GetParentNode(iParentId), sFolderName);
      Items[i - 1].Data := Pointer(iFolderId);
    end;
    Items.EndUpdate;
  end;
end;{ 重新保存TreeView中的索引 }
procedure TMainForm.ReSaveFolderIndex;
var
  i, iCount: integer;
begin
  with tblFolder, TreeView1 do
  begin
    iCount := RecordCount;
    for i := 0 to iCount - 1 do
    begin
      RecNo := i + 1;
      Edit;
      FieldByName('Id').AsInteger := integer(Items[i].Data);
      FieldByName('Name').AsString := Items[i].Text;
      if Items[i].Parent = nil then
        FieldByName('ParentId').AsInteger := 0
      else
        FieldByName('ParentId').AsInteger := integer(Items[i].Parent.Data);
      Post;
    end;
  end;
end;
//当你新增、移动、删除结点时执行过程ReSaveFolderIndex;

解决方案 »

  1.   

    提供两种方法供选择,
    1。加一个父节点字段(Parent),用来存父节点的关键字,最顶级的父节点字段用个特殊的字符或编号表示
    2。加一体现自己祖先链的字段(这里命名为A),最顶级的节点的A字段值为起关键字,后代节点的A字段为“父节点的A字段+自己的关键字”
    这样就可以很方便地存储和操作你的TreeView了
      

  2.   

    最简单的办法
    SaveToStream
    LoadFromStream
    搞定:)
      

  3.   

    joney1(不懂编程),什么意思哦,用那方法可以把TreeView中各个节点之间的关系(也就是正个树型结构)存起来?又不是存图片
      

  4.   

    呵呵,taxi(游少爷),flg(房派)都是高手。
    不过我还有一个问题http://www.csdn.net/expert/Topic/412/412780.shtm,该怎么解决呢?请高手帮忙!
      

  5.   

    ///////Begin 非常同意
    回复人: joney1(不懂编程) (2001-12-10 13:31:52)  得0分 
    最简单的办法
    SaveToStream
    LoadFromStream
    搞定:)
    ///////End 非常同意在数据表里用memo(text)类型的字段var
      vStream: TMemoryStream;
    begin
      vStream := TMemoryStream.Create;
      try
        TreeView1.SaveToStream(vStream);
        vStream.Position := 0;
        Table1.Edit;
        TBlobField(Table1.FieldByName('<树>')).LoadFromStream(vStream);
        Table1.Post;
      finally
        vStream.Free;
      end;
    end;