Type
  //树结构
  //------------------------------------------------
  PUserInfo= ^TUserInfo;
  TUserInfo= record
    name:String;
    fChild:TList;//子结点
  end;
  //------------------------------------------------var
  fUser:TList;procedure TFomr1.ShowTree(fList: TList);
var
  i: Integer;
  node: PUserInfo;
begin
  if fList <> nil then
  begin
    node := New(PUserInfo);
    for i := 0 to fList.Count - 1 do
    begin
      node := PUserInfo(fList.Items[i]);
      ShowTree(node^.fChild);
    end;
  end;
end;procedure TFomr1.UserClick(Sender: TObject);
begin
  ShowTree(fUser);
end;谁能告诉我代码错在哪里?当我遍历到叶结点再第一次递归往上级结点返回时提示资源访问出错!

解决方案 »

  1.   

    代码不全
    node := New(PUserInfo); 这句不要,有内存泄露
    TUserInfo创建时要将fChild设置为nil,否则 fList <> nil 判断成立,临时变量是不会初始化的
      

  2.   

    procedure TFomr1.ShowTree(fList: TList); 
    var 
      i: Integer; 
      node: PUserInfo; 
    begin 
      if fList  < > nil then 
      begin 
        node := New(PUserInfo); 
        //这里出错。每次递归进来i=0(即始终在递归fList.Items[0]的子结点)
        for i := 0 to fList.Count - 1 do 
        begin 
          node := PUserInfo(fList.Items[i]); 
          ShowTree(node^.fChild); 
        end; 
      end; 
    end; 
      

  3.   

    不好意思,刚看错了fList是ShowTree(fList: TList)里的参数,上面的语句没错。
    试一下下面的语句。
        for i := 0 to fList.Count - 1 do  
        begin  
          if assinged(fList.Items[i]) then
          begin
            node := PUserInfo(fList.Items[i]);  
            ShowTree(node^.fChild);
          end;  
        end;  
      

  4.   

    缺创建这个树结构的代码啊。二楼说得很清楚了:TUserInfo创建时要将fChild设置为nil,否则 fList  < > nil 判断成立,临时变量是不会初始化的。由于没有看到创建这个树结构的代码,所以不能排除二楼所描述的这种问题的可能性。
      

  5.   

    这样看不出具体问题出在哪,只能一个一个试。再试试下面的看看。。
    procedure TFomr1.ShowTree(fList: TList); 
    var 
      i: Integer; 
      node: PUserInfo; 
    begin 
      if fList  < > nil then 
      begin 
        //node := New(PUserInfo); 
        for i := 0 to fList.Count - 1 do 
        begin 
          node := PUserInfo(fList.Items[i])^.fChild;
          if node<> nil then 
            ShowTree(node); 
        end; 
      end; 
    end; 
      

  6.   

    PUserInfo的初始化是不是有问题