我在做一个实例时,遇到以下代码,通不过,不明白问题出在哪里,在此愿诸位大侠解惑
procedure TForm1.LoadDataForTreeView;
var
  RootNode,GroupNode,RecordNode:TTreeNode;
  PtrMyData:PMyData;
  NodeName:String;
begin
  TreeView1.Color:=rgb($FF,$FF,$E0);
  //
  RootNode:=treeview1.Items.Add(Nil,'通讯录');
  RootNode.ImageIndex:=0;
  RootNode.SelectedIndex:=0;
  //
  with tblgroup do
  begin
    open;
    while not eof do
    begin
      PtrMyData:=new(PMyData);//?
      PtrMyData.Id:=fieldbyname('group_id').asinteger;
      PtrMyData.NodeType:=0;
      NodeName:=fieldbyname('group_name').asstring;
      //
      groupnode:=treeview1.Items.AddChildObject(RootNode,NodeName,PtrMyData);//?
      groupnode.ImageIndex:=1;
      groupnode.SelectedIndex:=1;
      RecordNode:=TreeView1.Items.AddChild(groupnode,'none');
      next;
    end;
    //destroy PMyData;
    close;
  end;
  RootNode.Expanded:=true;
end;
//以上代码中带"?"的是通不过的地方
//以下为TMyData的定义
//定义记录类型TMyData
type
  PMyData=Record
  Id:integer;
  NodeType:integer;
end;

解决方案 »

  1.   

    new只能是指针应该加上PPMyData=6Pmydata然后new(PPMyData)
      

  2.   

    procedure TForm1.LoadDataForTreeView;
    var
      RootNode,GroupNode,RecordNode:TTreeNode;
      PtrMyData:pPMyData;
      NodeName:String;
    begin
      TreeView1.Color:=rgb($FF,$FF,$E0);
      //
      RootNode:=treeview1.Items.Add(Nil,'通讯录');
      RootNode.ImageIndex:=0;
      RootNode.SelectedIndex:=0;
      //
      with tblgroup do
      begin
        open;
        while not eof do
        begin
          new(PtrMyData);
          PtrMyData.Id:=fieldbyname('group_id').asinteger;
          PtrMyData.NodeType:=0;
          NodeName:=fieldbyname('group_name').asstring;
          //
          groupnode:=treeview1.Items.AddChildObject(RootNode,NodeName,PtrMyData);//?
          groupnode.ImageIndex:=1;
          groupnode.SelectedIndex:=1;
          RecordNode:=TreeView1.Items.AddChild(groupnode,'none');
          next;
        end;
        //destroy PMyData;
        close;
      end;
      RootNode.Expanded:=true;
    end;
    //以上代码中带"?"的是通不过的地方
    //以下为TMyData的定义
    //定义记录类型TMyData
    type
      pPMyData=^PMyData;
      PMyData=Record
      Id:integer;
      NodeType:integer;
    end;
      

  3.   

    给你一个从数据库创建出树的代码:
    function TMyTreeView.DataSetToTreeNode(
       mDataSet:  TDataSet;         //数据源
       mFieldNameParent:  string;  //父节点字段名--Tree(树表)表中的ParentNodeID字段
       mFieldNameTreeText:  string;  //节点文本字段名--Tree表中的NodeText
       mFieldNameTreeId:  string;  //每个节点标识字段名--Tree表中的DodeID
       mTreeView:TRztreeView;       //要操作的树
       mTreeNode:  TTreeNode;   //要添加的节点      (递归对象)
       mParentText:  string):  Boolean;   //第一个父节点
    var
       vTreeNode:  TTreeNode;
       vFieldValues:  Variant;
       vFieldNames:  string;
    begin
       Result  :=  False;
       if  not  Assigned(mDataSet)  then  Exit;
       if  not  Assigned(mTreeView)  then  Exit;
       if  not  mDataSet.Active  then  Exit;
       vFieldNames  :=  Format('%s;%s;%s',
           [mFieldNameParent,  mFieldNameTreeText,  mFieldNameTreeId]);
       mDataSet.Filtered  :=  False;
       mDataSet.Filter  :=  Format('%s=%s',  [mFieldNameParent,  QuotedStr(mParentText)]);
       mDataSet.Filtered  :=  True;
       if  mDataSet.RecordCount  =  0  then  Exit;
       mDataSet.First;
       while  not  mDataSet.Eof  do  begin
           vTreeNode  :=  mTreeView.Items.AddChild(mTreeNode,
               mDataSet.FieldByName(mFieldNameTreeText).AsString);       vFieldValues  :=  mDataSet[vFieldNames];
           DataSetToTreeNode(mDataSet,  mFieldNameParent,  mFieldNameTreeText,
               mFieldNameTreeId,  mTreeView,  vTreeNode,
               mDataSet.FieldByName(mFieldNameTreeId).AsString);
           ///////Begin  恢复位置
           mDataSet.Filtered  :=  False;
           mDataSet.Filter  :=  Format('%s=%s',  [mFieldNameParent,  QuotedStr(mParentText)]);
           mDataSet.Filtered  :=  True;
           mDataSet.Locate(vFieldNames,  vFieldValues,  []);
           ///////End  恢复位置
           mDataSet.Next;
       end;
       //下面的一定要,否则修改的时候不能定位
       mDataSet.Filtered  :=  False;
       Result  :=  True;
    //下面是整个Tree的属性设置,可以根据不同需要而进行设置。
       mTreeView.FullExpand;//全部展开
       mTreeView.HideSelection:=false;//是否自动隐藏所选项
       mTreeView.hotTrack:=true;//鼠标移动到控件上时,是否显示特殊的鼠标符号?
       mTreeView.Items[0].Selected:=true;
    end;
      

  4.   

    TO:swimming8243
    用你的代码,问题马上解决,谢谢,不过有些地方不是太明白,我刚学DELPH,恳请大侠多多解惑
    1、该段代码是用来定义记录的,pPMyData=^PMyData;是干什么的,是不是定义指针类型
    type
      pPMyData=^PMyData;
      PMyData=Record
      Id:integer;
      NodeType:integer;
    end;
    2、以下代码中PtrMyData:pPMyData;
    procedure TForm1.LoadDataForTreeView;
    var
      RootNode,GroupNode,RecordNode:TTreeNode;
      PtrMyData:pPMyData;
      NodeName:String;
    3、
    new(PtrMyData);
    //
    这三处代码应该是一系列整体,都是为了new(PtrMyData);
    能否给我详细介绍一下,new的用法,及这三处代码的关系,为什么这样写
    谢谢