如下的字符串转换:
'11(人事管理)'#8'1101(考勤)'#8'1102(福利)'#8'12(销售管理)'#8'13(财务管理)'#8'1301(工资)'#8'1302(差旅费)'#8'14(客户管理)'#8// 它会生成如下的树:
11(人事管理)|
            |-1101(考勤)     //11是上级的编号
            |-1102(福利)     //11是上级的编号
12(销售管理)
13(财务管理)|-1301(工资)     //13是上级的编号
            |-1302(差旅费)   //13是上级的编号
14(客户管理)  请问该如何处理?
先谢谢了!

解决方案 »

  1.   

    用一个循环就可以完成。
    var
      RootNode,CNode:TTreeNode;for i:=1 to Length(字符串a) do
      begin
        //分解读取,用一个循环就可以了。  end;
      

  2.   

    to  ZyxIp(绝望中...) 
    如果我的树有多层的话,你怎么分层呢?
      

  3.   

    to heshantxwd(无为) 
    我知道#8是分隔符,但是生成树(主要是有多层的树)我就没办法了,
    帮帮忙吧
      

  4.   

    to zhuoyuesky(卓越) 
    帮帮忙啊,大家都来看看吧
      

  5.   

    可以将部门的id存入TTreeView.data,再写一个函数专门用于生成部门id。你留下e-mail我把代码发给你,自己看吧。
      

  6.   

    谢谢你zhuoyuesky(卓越),搞定就结帖,
      

  7.   

    人家已经告诉你解题思路了你自己也不动, 永远也不会进步
    procedure TForm1.Button1Click(Sender: TObject);
    const
      s = '11(人事管理)' + #8+ '1101(考勤)'+ #8+ '1102(福利)'+ #8 + '12(销售管理)'+ #8 + '13(财务管理)' + #8 + '1301(工资)'+ #8 + '1302(差旅费)' + #8 +'14(客户管理)'+ #8;
    var
      sPrev, sCur: string;
      I: Integer;
      StrList: TStrings;
      RootNode: TTreeNode;
    begin
      StrList := TStringList.Create;
      try
        StrList.Text := StringReplace(s, #8, #13#10, [rfReplaceAll]);
        for I := 0 to StrList.Count - 1 do
        begin
          sCur := Copy(StrList[I], 1, 2);
          if sPrev = sCur then
            TreeView1.Items.AddChild(RootNode, Copy(StrList[I], 5, Length(StrList[I]) -4))
          else
            RootNode := TreeView1.Items.Add(TreeView1.Items.GetFirstNode, Copy(StrList[I], 3, Length(StrList[I]) - 2));
          sPrev := sCur;
        end;
      finally
        StrList.Free;
      end;end;
      

  8.   

    to : DWGZ() 不好意思,假如我的树有N级呢?帮一下忙了,谢谢你!
      

  9.   

    什么挑战高手,不知道为什么把很简单的东西想得太复杂
    不就用个WHILE循环,再结合动态数组或直接丢TREEVIEW里面就可以搞定啦
    楼上有个朋友说得对,自己要多动脑呀
    要不,我们不都成编程机器啦
    呵呵,说说楼主可别生气
      

  10.   

    chenquan(嘉威王子) 
    我到不生气,但是好象非用递归不可哦,因为树是N层的,
    这个字符串是我用递归从数据库表取得的,应该用递归回去
      

  11.   

    zhuoyuesky(卓越)说的不错,我就是这么干的。 DWGZ说的更好,思路有了,为什么不自己试试呢?这样你会有什么进步呢?懒人一个!
      

  12.   

    我刚学delphi的菜鸟一个
     DWGZ() ( ) 信誉:100 的代码我如果 实验,需要加一个Win32/treeview吧?加了以后还要干什么啊?我怎么实验不成呢?
      

  13.   

    superdullwolf(超级大笨狼)DWGZ() 的代码是要加一个Win32/treeview,但是他的代码只实现了两层的树,
    如果是N层的树呢?
      

  14.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      i         : Integer;
      Str       : string;
      Param     : string;
      FLevel    : Integer;
      TreeStrs  : string;
      function SplitStr(var Strs : string;var Param : string) : Boolean;
      var
        FPos : Integer;
      begin
        if Strs = '' then
        begin
          Result := False;
          Exit;
        end;
        FPos := Pos(#8,Strs);
        Strs := Copy(Strs,FPos +1 ,Length(Strs));
        Param := Copy(Strs,1,FPos -1 );
        Result := True;
      end;
    begin
      while SplitStr(TreeStrs,Param) do
      begin
        with TreeView1 do
        begin
          FLevel := Length(Param) div 2;
          if FLevel = 1 then
          begin
            Items.AddChild(nil,Param);
            Continue;
          end;
          for i := 0 to Items.Count -1 do
          begin
            if (Items[i].level = FLevel -2) and (Items[i].Text = (Copy(Param,1,FLevel * 2 -2))) then
              Items.AddChild(Items[i],Param);
          end;
        end;
      end;
    end;
      

  15.   

    to: ZyxIp(绝望中...) 这个字符串是我自己从数据库表生成的,
    子串永远在父串之后,这是肯定的,
    可以保证有效字符串中没有#8,这也是肯定的,
    有没有更好的方法,我还不知道呢?
      

  16.   

    to DelphiBoy2003(一朵梨花压海棠,玉树临风胜潘安) 
    我要的是N层树,好象没那么简单哦?
      

  17.   

    N 层树须指明父节点的编号。用个
    TNode = record 
        iParent : Integer;
        sText : String;
    end;
    这样的结构,立刻就搞定了。
      

  18.   

    恭喜,恭喜,恭喜!!!!
    wsforqyc(大海)
    挑战成功!!!!