如何在一级目录下动态新增二级目录,例如:
 --主材料
 ---- 二级目录
 ---- 二级目录
 --辅材
 ---- 二级目录
要求自动判断新增到所属一级目录下,烦请附个简短代码,谢谢!
已有Combobox选取一级目录 Edit1,Edit2为二级目录输入框,Button为添加按钮。

解决方案 »

  1.   

    直接操作treeview就可以了http://www.delphifans.com/InfoView/Article_452.html
      

  2.   


    看了你的链接,那里有能判断如何添加到对应的哪个父结点吗?TreeView已显示数据库记录
      

  3.   

    采用遍历思想啊,先将form编号存入数据库中,如 01
                                              0101
                                              0102
                                            02
                                              0201
                                             ……
    然后再在写代码逐个比较form编号 插入就可以了。
    var
      NodeMsg:pNodeMsg;   // Ö¸Õë±äÁ¿
      lnCurLevel,lnOperMode:Integer;
      lsPrmpt:String;
    procedure Tfm_Main.RefreshPowerTreesys(trvPowerTreeView:TcxTreeView;lnType:Integer;lsFindFunCD:String;lbNeedLocateFunCD:Boolean);
    var
      nodRoot,nodParentNode,nodCurNode,nodPreNode,nodFindChargeCD:TTreeNode;
      lsCurPowerCD,lsPrePowerCD:String;
    begin
      trvPowerTreeView.Items.Clear;
      nodRoot:=trvPowerTreeView.Items.Add(trvPowerTreeView.TopItem,'²ÍÒûϵͳ');
      nodRoot.ImageIndex:=42;
      nodRoot.SelectedIndex:=42;
      New(NodeMsg);
      NodeMsg^.FunCD:='';
      nodRoot.Data:=NodeMsg;
      nodPreNode:=nodRoot;
      trvPowerTreeView.FullCollapse;
      with aqPowerList do
        begin
          Close;
          Parameters.ParamByName('type').Value :=0;
          Parameters.ParamByName('funid').Value:=0;
          Parameters.ParamByName('branch').Value:=lsBranch;
          Open;
          while not eof do
            begin
              if Trim(FieldByName('FunCD').AsString)='' then
                begin
                  nodParentNode:=nodRoot;
                  lsCurPowerCD:='';
                  lsPrePowerCD:='';
                end
              else
                begin
                  lsCurPowerCD:=Trim(FieldByName('FunCD').AsString);
                  lsPrePowerCD:=Trim(pNodeMsg(nodPreNode.Data)^.FunCD);
                  if Length(lsCurPowerCD)>Length(lsPrePowerCD) then
                    begin
                      if (lsPrePowerCD='') or (Copy(lsCurPowerCD,1,Length(lsPrePowerCD))=lsPrePowerCD) then nodParentNode:=nodPreNode;
                    end
                  else
                    if Length(lsCurPowerCD)=Length(lsPrePowerCD) then
                      begin
                        nodPreNode:=nodPreNode.Parent;
                        lsPrePowerCD:=Trim(pNodeMsg(nodPreNode.Data)^.FunCD);
                        if (lsPrePowerCD='') or (Copy(lsCurPowerCD,1,Length(lsPrePowerCD))=lsPrePowerCD) then nodParentNode:=nodPreNode;
                      end
                    else
                      if Length(lsCurPowerCD)<Length(lsPrePowerCD) then
                        begin
                          nodCurNode:=nodPreNode;
                          while (nodCurNode<>nil) and (nodCurNode.Level>0) do
                            begin
                              if nodCurNode.Parent<>nil then
                                begin
                                  nodPreNode:=nodCurNode.Parent;
                                  lsPrePowerCD:=Trim(pNodeMsg(nodPreNode.Data)^.FunCD);
                                  if (lsPrePowerCD='') or (Copy(lsCurPowerCD,1,Length(lsPrePowerCD))=lsPrePowerCD) then
                                    begin
                                      nodParentNode:=nodPreNode;
                                      Break;
                                    end
                                  else
                                    nodCurNode:=nodPreNode;
                                end;
                            end;
                        end;
                end;
              if nodParentNode<>nil then
                begin
                  New(NodeMsg);
                  NodeMsg^.FunCD:=FieldValues['FunCD'];
                  NodeMsg^.FunID:=FieldValues['FunID'];
                  NodeMsg^.BeEnd  :=FieldValues['BeEnd'];
                  NodeMsg^.Fundesc:=FieldValues['Fundesc'];
                 // nodCurNode:=trvPowerTreeView.Items.AddChild(nodParentNode,FieldValues['FunCD']+'  '+Trim(Trim(FieldValues['FunDesc'])));
                 nodCurNode:=trvPowerTreeView.Items.AddChild(nodParentNode,FieldValues['FunCD']+Trim(Trim(FieldValues['FunDesc'])));
                  nodCurNode.Data:=NodeMsg;
                  if nodCurNode.Parent<>nil then
                    begin
                      if nodCurNode.Parent.Level>1 then nodCurNode.Parent.ImageIndex:=41
                        else if nodCurNode.Parent.Level<>0 then nodCurNode.Parent.ImageIndex:=39
                            else nodCurNode.Parent.ImageIndex:=42;
                    end;
                  nodCurNode.ImageIndex:=40;
                  nodCurNode.SelectedIndex:=38;
                  nodPreNode:=nodCurNode;
                  if Trim(lsFindFunCD)<>'' then
                    if Trim(pNodeMsg(nodPreNode.Data)^.FunCD)=lsFindFunCD then nodFindChargeCD:=nodCurNode;
                end;
              Next;
            end;
        end;
      nodRoot.Expanded:=True;
      if nodFindChargeCD<>nil then
        begin
          trvPowerTreeView.Selected:=nodFindChargeCD;
          if lbNeedLocateFunCD then
            begin
              nodCurNode:=trvPowerTreeView.Selected;
              if nodCurNode.Parent<>nil then trvPowerTreeView.Selected:=nodCurNode.Parent;
            end;
        end
      else
        trvPowerTreeView.TopItem;
      

  4.   


    var
      s1,s2,s3,s4,s:string;
      i,m,n:Integer;
      tn:TTreeNode;
    begin
      s1:=self.Edit1.Text;
      s2:=self.Edit2.Text;
      if (s1='') or (s2='') then
      begin
        MessageBox(Application.Handle,'信息填写不完整','信息',MB_OK or MB_ICONINFORMATION);
        Exit;
      end;
      i:=Length(s1);
      if i=2 then//说明是一级目录
      begin
        m:=self.TreeView1.Items.Count;
        if m>0 then
        begin
          for n:=0 to m-1 do
          begin
            if self.TreeView1.Items[n].Parent<>nil then
              Continue;
            s:=self.TreeView1.Items[n].Text;
            s:=Copy(s,1,2);
            if s=s1 then
            begin
              MessageBox(Application.Handle,'编号已经存在','信息',MB_OK or MB_ICONINFORMATION);
              Exit;
            end;
          end;
          self.TreeView1.Items.AddChild(nil,s1+' '+s2);
        end
        else
          self.TreeView1.Items.AddChild(nil,s1+' '+s2);
        Exit;
      end;
      if i=4 then//说明是二级目录
      begin
        s3:=Copy(s1,1,2);//对应的一级目录
        m:=Self.TreeView1.Items.Count;
        if m=0 then
        begin
          MessageBox(application.Handle,'未找到对应的一级目录','信息',MB_OK or MB_ICONINFORMATION);
          Exit;
        end;
        tn:=nil;
        for n:=0 to m-1 do
        begin
          if self.TreeView1.Items[n].Parent<>nil then
            Continue;
          s:=self.TreeView1.Items[n].Text;
          s4:=Copy(s,1,2);
          if s4<>s3 then//不是对应的一级目录
            Continue;
          tn:=self.TreeView1.Items[n];//这个就是对应的一级目录
          Break;
        end;
        if tn=nil then
        begin
          MessageBox(application.Handle,'未找到对应的一级目录','信息',MB_OK or MB_ICONINFORMATION);
          Exit;
        end;
        m:=tn.Count;
        if m=0 then
          self.TreeView1.Items.AddChild(tn,s1+' '+s2)
        else
        begin
          for n:=0 to m-1 do
          begin
            s:=tn.Item[n].Text;
            s:=Copy(s,1,4);
            if s=s1 then
            begin
              MessageBox(Application.Handle,'输入的编号已经存在','信息',MB_OK or MB_ICONINFORMATION);
              Exit;
            end;
          end;
          self.TreeView1.Items.AddChild(tn,s1+' '+s2);
        end;
        Exit;
      end;
      MessageBox(application.Handle,'输入的编号不合法','信息',MB_OK or MB_ICONINFORMATION);
    end;