建一棵树是使用递归调用的,可是在递归的时候ADODaTaSet改变了!这个dataset是公有的。
代码如下:
procedure TFrmExpert.CreatTree(var TVSpeciality : TTreeView);
var
  NodePointer: speciality;
  Node,SNode : TTreeNode;
  adodata : TADODataSet;
begin
  //ADOCommandSpec.CommandText := 'select * from proffdb where id = 0';
  //adodata.Recordset := ADOCommandSpec.Execute;
  node := TVSpeciality.GetNodeAt(0,0);
  snode := TVSpeciality.Items.AddChild(node,'专业');
  new(NodePointer);
  NodePointer.Specialityid := 100;
 // NodePointer.Pspecialityid := 0;
  NodePointer.SpecialityName := '专业';
  sNode.Data := NodePointer;
  AddChildren(snode,100,TVSpeciality);
end;procedure TFrmExpert.AddChildren(var PNode : TTreeNode;Pid : integer;STree : Ttreeview);
var
  NodePointer: speciality;
  Node,SNode : TTreeNode;
  adodata1 : TADODataSet;
  i ,j: integer;
  //list:List
begin
  //Tadodataset.Create(adodata1);
  ADOCommandSpec.CommandText := 'select * from proffdb where pid = :pid order by id';
  ADOCommandSpec.Parameters[0].Value := pid;
  adoData1.Recordset := ADOCommandSpec.Execute;  for i := 0 to adoData1.Recordset.RecordCount - 1 do
  begin
    Node :=  STree.Items.AddChild(PNode,adoData1.fieldbyname('pname').AsString);
    new(nodepointer);
    nodepointer.Specialityid := adoData1.fieldbyname('id').AsInteger;
    NodePointer.Pspecialityid := adoData1.fieldbyname('pid').AsInteger;
    NodePointer.SpecialityName := adoData1.fieldbyname('pname').AsString;
    node.Data := NodePointer;
    AddChildren(node,adoData1.fieldbyname('id').AsInteger,STree);
    adoData1.Next;
    j :=  adoData1.fieldbyname('id').AsInteger;
    j :=  adoData1.fieldbyname('pid').AsInteger;
  end;
end;