模型编码 模型名称 标题 模型描述 父节点
MO1          
MO1.1
MO1.2
MO1.2.1
MO2
MO2.1
MO2.1.1
MO2.2
MO3
MO3.1
MO3.2
MO3.3
MO3.4
MO3.4.1
MO3.4.2
MO4
MO4.1
MO4.1.1
MO4.2
MO5
M06

解决方案 »

  1.   

    看样子还是顺序的,那就逐行的处理吧,遇到第一级,添加第一级node,记住它,然后向下,遇到二级添加子节点,直至碰到下一个一级node,再循环之前
      

  2.   

    用treeview或者treelist
    至于树节点可以从文本的长度或者点的个数来判断,很简单
    http://www.baidu.com/s?bs=delphi+treelistview&f=8&rsv_bp=1&wd=delphi+treeview&inputT=262
      

  3.   

    文本读入ss:Tstringlist
    每行前面加n个空格(n=(本行长度-3) div 2)
    保存ss到内存流m
    m.position:=0;
    treeview.loadfromstream(m);
      

  4.   

    MO1
     MO1.1
     MO1.2
      MO1.2.1 
    MO2
     MO2.1
      MO2.1.1
     MO2.2
    MO3
     MO3.1
     MO3.2
     MO3.3
     MO3.4
      MO3.4.1
      MO3.4.2
    MO4
     MO4.1
      MO4.1.1
     MO4.2
    MO5
    M06方便的话,直接把文本编辑成这样,上级和下级空一格,然后TreeView.LoadFromFile('文本路径');
    否则就逐个处理,找到它的父ID,一个个添加进来
      

  5.   

    刚好我也在弄,看看可以吗
    var
      tv: TTreeView;
      lines: TStringList;
      row: int;procedure CreateTreeView;
    var
      tmpnode: TTreeNode;
      i: Integer;
    begin
      tmpnode := tv.Items.AddChild(nil, '加载中...');
      row := 0;
      while row <= lines.Count - 1 do begin
        tv.Items.BeginUpdate;
        RecAddNode(tmpnode, 0); //开始添加节点
        row := row + 1;
      end;
      //移至根节点
      for i := tmpnode.Count - 1 downto 0 do
        tmpnode.Item[i].MoveTo(nil, naAddFirst);
      tmpnode.Delete;
    end;//递归添加节点
    procedure RecAddNode(node: TTreeNode; lv: Integer);
    var
      DataPtr: TDataPtr;
      sl: TStringList;
      _node: TTreeNode;
      _lv: Integer;
    begin
      sl := TStringList.Create;
      //遍历记录
      while row <= lines.Count - 1 do begin
        sl.Clear;
        _lv := ExtractStrings(['.'], [], PChar(qry.FieldByName('code').AsString), sl);
        if _lv = lv + 1 then begin
            //直接添加节点
          _node := tv.Items.AddChild(node, qry.FieldByName('name').AsString);
            //递归添加子节点
          qry.Next;
          RecAddNode(_node, _lv);
        end
        else if _lv > lv + 1 then begin
          ShowMessage('遇到不符合规则的节点!');
          row := row + 1;
        end
        else Exit;
      end;
    end;
      

  6.   

    写错了
    var
      tv: TTreeView;
      lines: TStringList;
      row: int;procedure CreateTreeView;
    var
      tmpnode: TTreeNode;
      i: Integer;
    begin
      tmpnode := tv.Items.AddChild(nil, '加载中...');
      row := 0;
      while row <= lines.Count - 1 do begin
        tv.Items.BeginUpdate;
        RecAddNode(tmpnode, 0); //开始添加节点
        row := row + 1;
      end;
      //移至根节点
      for i := tmpnode.Count - 1 downto 0 do
        tmpnode.Item[i].MoveTo(nil, naAddFirst);
      tmpnode.Delete;
    end;//递归添加节点
    procedure TMainForm.RecAddNode(node: TTreeNode; lv: Integer);
    var
      DataPtr: TDataPtr;
      sl: TStringList;
      _node: TTreeNode;
      _lv: Integer;
    begin
      sl := TStringList.Create;
      //遍历记录
      while row <= lines.Count - 1 do begin
        sl.Clear;
        _lv := ExtractStrings(['.'], [], PChar(lines[row]), sl);
        if _lv = lv + 1 then begin
            //直接添加节点
          _node := tv.Items.AddChild(node, lines[row]);
            //递归添加子节点
          qry.Next;
          RecAddNode(_node, _lv);
        end
        else if _lv > lv + 1 then begin
          ShowMessage('遇到不符合规则的节点!');
          row := row + 1;
        end
        else Exit;
      end;
    end;
      

  7.   

    郁闷,回复了怎么不能改。
        第一个方法里少个tv.Items.EndUpdate。
        第二个方法里qry.Next应该是row:=row+1。