帮我看看哪错了;
type
   PMyNodeDataInfo=^TMyNodeDataInfo;
   TMyNodeDataInfo =Record
     MyDataName:string;
     MyDataNumber:integer;
end;procedure TFrmMain.createtreeviewitem ;
var 
  Pinfo:PMyNodeDataInfo;
  functionnode,stationnode:ttreenode;
begin
   new(Pinfo);
    with treeview1 do
   begin
      items.clear;
      StationNode := Items.Add(nil,'XXXXXXXXX');
      functionNode:=items.AddChild(StationNode,'系统管理');
      functionnode.ImageIndex := 2;
      Pinfo^.MyDataName:='XTSZGL';
      Pinfo^.MyDataNumber:=1;
      //functionnode.Data:=Pointer(1);
      functionnode.Data:=Pinfo;
   end;
   dispose(Pinfo);
end;在一个主菜单中有一个项是'系统管理',我想和树结构里的'系统管理'关联,所以我在点击主菜单中的系统管理时这样做function TFrmMain.FindNodeNumber(MyNodeData:integer):integer;//根据data值找到相应的项
var
  i:integer;
  MyNode:TTreeNode;
  tmpstr:string;
  info:PMyNodeDataInfo;
begin
    New(info);
    with TreeView1 do
    for i:=0 to items.count-1 do
    begin
        MyNode:=TreeView1.Items.Item[i];
        info:=MyNode.Data;
        if info=nil then continue;
        if  (info^.MyDataNumber=MyNodeData)and (info^.MyDataName='XTSZGL')   then               //MyNodeData= 1;
           MyNode.Selected :=true;
    end;
    dispose(info);
end;
为什么在这里读不出data里面的值呢?

解决方案 »

  1.   

    粗略看了一下,如果只是定义一个指针p,然后通过p^访问是不行的,因为没有为他分配内存空间我一般这样做
    定义
    type
       PMyNodeDataInfo=^TMyNodeDataInfo;
       TMyNodeDataInfo =Record
         MyDataName:string;
         MyDataNumber:integer;
    end;使用
    var
      d: TMyNodeDataInfo;
      p: PMyNodeDataInfo;
    begin
      d.MyDataName := ...;
      d.MyDataNumber := ...;
      p := @d;
      //然后让树的节点数据  functionnode.Data:=P;
    end;能明白吗?
      

  2.   

    还有在其他子函数中取出data值呢?我那样写有错吗?
      

  3.   

    //这样修改
    procedure TFrmMain.createtreeviewitem ;
    var 
      Pinfo:PMyNodeDataInfo;
      functionnode,stationnode:ttreenode;
    begin
       new(Pinfo);
        with treeview1 do
       begin
          items.clear;
          Pinfo^.MyDataName:='XTSZGL';
          Pinfo^.MyDataNumber:=1;
          StationNode := Items.Add(nil,'XXXXXXXXX');
          functionNode:=items.AddChildobject(StationNode,'系统管理',Pinfo);
          functionnode.ImageIndex := 2;
       end;
       dispose(Pinfo);
    end;
      

  4.   

    procedure TFrmMain.createtreeviewitem ;
    var 
      Pinfo:PMyNodeDataInfo;
      functionnode,stationnode:ttreenode;
    begin
       new(Pinfo);
        with treeview1 do
       begin
          items.clear;
          StationNode := Items.Add(nil,'XXXXXXXXX');
          functionNode:=items.AddChild(StationNode,'系统管理');
          functionnode.ImageIndex := 2;
          Pinfo^.MyDataName:='XTSZGL';
          Pinfo^.MyDataNumber:=1;
          //functionnode.Data:=Pointer(1);
          functionnode.Data:=Pinfo;
       end;
       dispose(Pinfo);///////##这块不应释放掉Pinfo不然地址就释放掉了。
    end;
      

  5.   

    怎么都在说赋值,我要在判断子函数中把data值取出来
    怎么取出来呀?New(info);
        with TreeView1 do
        for i:=0 to items.count-1 do
        begin
            MyNode:=TreeView1.Items.Item[i];
            info:=MyNode.Data;
            if info=nil then continue;
            if  (info^.MyDataNumber=MyNodeData)and (info^.MyDataName='XTSZGL')   then               //MyNodeData= 1;
               MyNode.Selected :=true;
        end;
        dispose(info);
     这样取错在哪里呀?
    急死我了
      

  6.   

    procedure TFrmMain.createtreeviewitem ;
    var 
      Pinfo:PMyNodeDataInfo;
      functionnode,stationnode:ttreenode;
    begin
       new(Pinfo);
        with treeview1 do
       begin
          items.clear;
          StationNode := Items.Add(nil,'XXXXXXXXX');
          functionNode:=items.AddChild(StationNode,'系统管理');
          functionnode.ImageIndex := 2;
          Pinfo^.MyDataName:='XTSZGL';
          Pinfo^.MyDataNumber:=1;
          //functionnode.Data:=Pointer(1);
          functionnode.Data:=Pinfo;
       end;
       //dispose(Pinfo);///////##把这注释掉就可以了.
    end;
      

  7.   

    New(info);//此处将info替换为另一个变量试试.不用重新为info分配内存了.
        with TreeView1 do
        for i:=0 to items.count-1 do
        begin
            MyNode:=TreeView1.Items.Item[i];
            info:=MyNode.Data;
            if info=nil then continue;
            if  (info^.MyDataNumber=MyNodeData)and (info^.MyDataName='XTSZGL')   then               //MyNodeData= 1;
               MyNode.Selected :=true;
        end;
        dispose(info);