使用的Access数据库结构是:
ID       Name         parentID       Memo          IsDirectory
1  项目管理         0          根           TRUE
2  软件开发管理      1          软件管理     TRUE
3 人员修改         2          人员修改管理  TRUE
4  增加人员         3          增加人员    FALSE
5  减少人员         3          减少人员    FALSE
6 成本管理         2          人员修改管理  TRUE设计意图如下:
点击《项目管理》->《软件开发管理》->《人员修改》->《增加人员》->具体操作界面
                                                   ->《减少人员》->具体操作界面
                                    ->《成本管理》等等类似的操作每一节点下的子节点都不定,因为数据库随时都可能增加;只有记录的IsDirectory值为false才实现具体的操作。
琢磨了挺长时间,就是不知道这个界面如何实现?谁使用过TreeView控件?不知道用它行不行?
除此以为还有其他实现方式吗?对我来说真是超难啊~~~不知道这个帖子该放在“数据库”还是“VCL”分坛,只好都发一贴了,好在现在分数每天都增加,呵呵~

解决方案 »

  1.   

    我有,但是太长了.兄弟自己在大富翁里查查吧,我也是在那里面找到的.要是不行给我
    Email:[email protected]
      

  2.   

    在TREEVIEW控件的ONEXPANDED中生成结点.
    研究一下ONEXPANDING和ONDELETE事件.
      

  3.   

    function LoadFolders(tree: TTreeView; user_id: String;
        currentFolder: String): TTreeNode;
      procedure ClearFolderTree(tree: TTreeView);
        procedure RClearSubs(TreeNode: TTreeNode);
        var
          tmpFolder: TftsFolder;
        begin
          if TreeNode = nil then exit;
          while TreeNode.Count > 0 do
          begin
            tmpfolder := Tftsfolder(TreeNode.item[0].Data);
            RClearSubs(TreeNode.Item[0]);
            TreeNode.Owner.Delete(TreeNode.Item[0]);
            tmpFolder.Free;
          end;
        end;
      var
        tmpFolder: TftsFolder;
      begin
        while tree.Items.Count > 0 do
        begin
          tmpFolder := TftsFolder(tree.Items[0].Data);
          RClearSubs(tree.Items[0]);
          tree.Items.Delete(tree.Items[0]);
          tmpFolder.Free;
        end;
      end;
    var
      tqr: TADOQuery;
      tmpNode: TTreeNode;
      tmpFolder: TFtsFolder;
      curFolderNode : TtreeNode;
    begin
      curFolderNode := nil;
      ClearFolderTree(tree);
      tqr := TADOQuery.Create(nil);
      tqr.Connection := pubCnn;
      try
        tqr.SQL.Add('select * from folders where parent_id=''''');
        tqr.Open;
        while not tqr.Eof do
        begin
          ftsFolderGeter.Get(tqr, TftsObject(tmpFolder));
          tmpNode := tree.Items.Add(nil, tmpFolder.name);
          tmpNode.Text := tmpFolder.name;
          tmpNode.Data := tmpFolder;
          if curFolderNode = nil then
          begin
            curFolderNode := tmpNode;
            tmpNode.StateIndex := ord(ftsfsOpen);
          end
          else
            tmpNode.StateIndex := ord(ftsfsClose);
          LoadSubFolders(tmpFolder.id, tmpNode);
          tqr.Next;
        end;
      finally
        result := curFolderNode;
        tqr.Free;
      end;
    end;
    procedure LoadSubFolders(parentFolder: String; Node: TTreeNode);
    var
      tqr: TADOQuery;
      tmpFolder: TFtsFolder;
      tmpNode: TTreeNode;
    begin
      tqr := TADOQuery.Create(nil);
      tqr.Connection := pubCnn;
      try
        tqr.SQL.Add('select * from folders where parent_id=''' + parentFolder + '''');
        tqr.Open;
        while not tqr.Eof do
        begin
          FtsFolderGeter.Get(tqr, TftsObject(tmpFolder));
          tmpNode := node.Owner.AddChild(node, tmpFolder.name);
          tmpNode.Text := tmpFolder.name;
          tmpNode.Data := tmpFolder;
          tmpNode.StateIndex := ord(ftsfsClose);
          LoadSubFolders(tmpFolder.id, tmpNode);
          tqr.Next;
        end;
      finally
        tqr.Free;
      end;
    end;
      

  4.   

    应该可以的,在数据库中搜出相应的字段内容,把相应的字段内容加进去,下面是往Treeview添加的代码:
    if self.TreeView1.Selected.HasChildren=false then
                 repeat
                   begin
                         name:=copy(Self.Query.FieldByName(‘你的字段名’).asstring,0,2);
                         TreeView1.Items.AddChild(TreeView1.Selected, name).ImageIndex:=1;
                         Query.Next;
                          i:=i+1;
                    end;
                 until i= Query.RecordCount
      

  5.   

    //刚才原版复制的,忘了是不同的系统,哈哈,下面是改写的,其实可以合并为一个过程,当时这么写是有原因的,你自己合并一个吧。
    //pubCnn是一个全局的数据连接,可以使用一个返回数据连接的函数取代他。
    procedure LoadFolders(tree: TTreeView);
    var
      tqr: TADOQuery;
      tmpNode: TTreeNode;
    begin
      Tree.Items.Clear;
      tqr := TADOQuery.Create(nil);
      tqr.Connection := pubCnn;
      try
        tqr.SQL.Add('select * from ##表名## where parentID=''0''');  //此处假设parentID为0的是顶级结点
        tqr.Open;
        while not tqr.Eof do
        begin
          tmpNode := tree.Items.Add(nil, tqr.FieldByName('name').asString);
          tmpNode.Text := tqr.FieldByName('name').asString;
          LoadSubFolders(tqr.FieldByName('id').AsString, tmpNode);
          tqr.Next;
        end;
      finally
        tqr.Free;
      end;
    end;
    procedure LoadSubFolders(parentID: String; Node: TTreeNode);
    var
      tqr: TADOQuery;
      tmpNode: TTreeNode;
    begin
      tqr := TADOQuery.Create(nil);
      tqr.Connection := pubCnn;
      try
        tqr.SQL.Add('select * from ##表名## where parentID=''' + parentID + '''');
        tqr.Open;
        while not tqr.Eof do
        begin
          tmpNode := node.Owner.AddChild(node, tqr.fieldByName('name').asstring);
          tmpNode.Text := tqr.fieldByName('name').asstring;
          LoadSubFolders(tqr.fieldByName('id').asstring, tmpNode);
          tqr.Next;
        end;
      finally
        tqr.Free;
      end;
    end;
      

  6.   

    非常感谢,研究一下,11号考试以后再说。
    看来只有用TreeView控件了~~
      

  7.   

    To: twfldy(青竹)TftsFolder是个什么东西?
      

  8.   

    TftsFolder不是什么东西,因为第一段代码是我未加修改的直接从我的系统中搬出来的,所以有Tfts系列的东东,那是我的那个系统中自编写的专用类。