在treeview的展开事件根据数据库中相应数据初使化节点,取父节点的值时通不过,以下代码中带“?”的一处语句为通不过的语句
procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode;
  var AllowExpansion: Boolean);
var
  GroupId:integer;
  RecordNode:TTreeNode;
  PtrMyData:PpMyData;
  RecordName:string;
begin
  if(node.Parent<>nil)and(node.Parent.Text='通讯录') then
  begin
    node.getFirstChild.Delete;
    //
    GroupId:=(PMydata(node.Data))^.id;//?
    //GroupId:=recordnode.Level;
    with adoquery1 do
    begin
      sql.Clear;
      sql.Add('select txl_map.record_id,txl_record.name');
      sql.Add('from txl_map,txl_record');
      sql.Add('where txl_map.group_id='+inttostr(GroupId));
      sql.Add('and txl_map.record_id=txl_record.id');
      open;
      while not eof do
      begin
        recordname:=fieldbyname('name').AsString;
        new(PtrMydata);
        PtrMydata.Id:=fieldbyname('record_id').AsInteger;
        PtrMydata.NodeType:=1;//记录节点
        recordnode:=TreeView1.items.addchildobject(node,recordname,ptrmydata);
        recordnode.ImageIndex:=2;
        recordnode.SelectedIndex:=2;
        next;
      end;
      close;
    end;
  end;
end;

解决方案 »

  1.   

    PMydata为记录类型,以下为其定义
    type
      pPMyData=^PMyData; //定义指针
      PMyData=Record     //定义记录
      Id:integer;
      NodeType:integer;
    end;
      

  2.   

    你需要检测一下这个节点的指针是否为空。如:
    var
      GroupId:integer;
      RecordNode:TTreeNode;
      PtrMyData:PpMyData;
      RecordName:string;
    begin
      if(node.Parent<>nil)and(node.Parent.Text='通讯录') then
      begin
        node.getFirstChild.Delete;
        //需要测试这个节点是否存放了指针哦,如果为空就跳过。
        if Node.Data = nil then Exit; 
        GroupId:=(PMydata(node.Data))^.id;//?
        //GroupId:=recordnode.Level;
        with adoquery1 do
        begin
      

  3.   

    是这一句根本就通不过编译呀
    GroupId:=(PMydata(node.Data))^.id;//?