function TFrmBSourceDefine.CreateClassTree(aParent: TTreeNode;
  Level: integer; SLevel, SText: TStrings;aClassTree:TRZTreeview): boolean;
var
  I:integer;
  TempNode:TTreeNode;
begin
  Result:=False;  //TempNode:=TTreeNode.Create(Nil);  For i:=0 to Slevel.Count-1 do
     begin
       //添加子结点
       //是否符合级别
       if length(Slevel.Strings[i])=(level+1)*3 then
          if level=0 then
            begin
              TempNode:=aclassTree.Items.Add(aparent,sText.Strings[i]);
              CreateClassTree(tempnode,level+1,Slevel,stext,aclasstree);
              Result:=True;
            end
          else
            begin
              if copy(slevel.Strings[i],0,level*3)=aparent.Text then
                begin
                  TempNode:=aclassTree.Items.AddChild(aparent,sText.Strings[i]);
                  CreateClassTree(tempnode,level+1,Slevel,stext,aclasstree);
                  Result:=True;
                end;
            end;
     end;
     //tempnode.Free;end;调用部分如下
 InitCmbstring(dm2.ADOConn,'Select * from Hx_StructClass order by S_ClassLevel','S_ClassLevel',StrLevel);         Isok:=InitCmbString(Dm2.ADOConn,'Select * from HX_structClass order by S_ClassLevel','struct_Class',StrName);
                    if ISok then
                       createclasstree(nil,0,strlevel,strname,RzTR_Struct_Class);
数据库中参数如下
      name    level
             a       001
             b       001001
             c       001001002
             d       001001003
             e       005 为什么这个函数只能读出a 和 e
跟踪发现 第二层调用是Slevel 和 Stext 变成了空值
为什么?

解决方案 »

  1.   

    可能树的TEXT问题,你的这个赋值好像不对。我你这样做,没有办法确定节点的父节点和子节点以及兄弟节点。^_^
      

  2.   

    else
                begin
                  if copy(slevel.Strings[i],0,level*3)=aparent.Text then
    ////////////////////////这里错误,aparent.text增加的是name字段,而这里判断却是用level字段来比较,所以这个判断一直为假,所以不能增加子结点。
      

  3.   

    将level的信息也增加到树结点中就行了。
    type
        PTreeInfo=^TTreeInfo;
        TTreeInfo=record
            strName:string;
            strLevel:string;
        end;
    ////////////////////////////自定义结点信息用来记录结点级别function TFrmBSourceDefine.CreateClassTree(aParent: TTreeNode;
      Level: integer; SLevel, SText: TStrings;aClassTree:TRZTreeview): boolean;
    var
      I:integer;
      TempNode:TTreeNode;
      p:PTreeInfo;///////////////////////////
    begin
      Result:=False;  //TempNode:=TTreeNode.Create(Nil);  For i:=0 to Slevel.Count-1 do
         begin
           //添加子结点
           //是否符合级别
           if length(Slevel.Strings[i])=(level+1)*3 then
              if level=0 then
                begin
                  new(p);/////////////////////////////////////////
                  p^.strName:=sText.Strings[i];//////////////////////////
                  p^.strLevel:=sLevel.Strings[i];//////////////////////
                  TempNode:=aclassTree.Items.AddObject(aparent,sText.Strings[i],p);//////////
                  CreateClassTree(tempnode,level+1,Slevel,stext,aclasstree);
                  Result:=True;
                end
              else
                begin
                  if copy(slevel.Strings[i],0,level*3)=PTreeInfo(aparent.data)^.strLevel then
                    begin
                      new(p);/////////////////////////////
                      p^.strName:=sText.Strings[i];////////////////
                      p^.strLevel:=sLevel.Strings[i];/////////////////////
                      TempNode:=aclassTree.Items.AddChildObject(aparent,sText.Strings[i],p);/
                      CreateClassTree(tempnode,level+1,Slevel,stext,aclasstree);
                      Result:=True;
                    end;
                end;
         end;
         //tempnode.Free;end;
    ////////////////////////////////
    试过,绝对可用。