如提呀

解决方案 »

  1.   

    var
        a:Pchar;
    begin
    tv1.Items.AddObject(TTreeNode.Create(nil),'adf',a);
      

  2.   

    Ttreenode本身有一个data属性可以用来存储指针。用他来指向你的字符串吧
      

  3.   

    就是用data来指向字符串,也可以自己写一个类来存放很多你要保存的字符串或者其他类型信息,然后用data指针来指向该类的一个实例即可
      

  4.   

    我用过data属性,在treeview1添加TreeNode时,把Data属性指向一个字符串是可以的。但在OnChange事件想访问时出错Procedure Tf_main.CodeRecursion(parent:Ttreenode;GoodsCode:String);
    var
       Node:TtreeNode;
       Scode:string;
    begin
       while not (qgoods.eof()) do begin
         if not (qGoods.FieldByName('goodstype').AsString='原材料') then  begin
            Node:=Treeview1.Items.Addchild(Parent,
                  qGoods.fieldbyname('GoodsName').AsString);
            Scode:=qGoods.fieldbyname('goodscode').AsString;
            Node.Data:=@Scode;
         end;//if
       end; //while
    endprocedure Tf_main.TreeView1Change(Sender: TObject; Node: TTreeNode);
    begin
        Showmessage(pstring(Node.Data)^); //出错呀
    end;大家给我指点一下。要怎样访问才可以。
      

  5.   

    TTreeNode的data属性可以用来存储指针的
      

  6.   

    这个好像是因为你这里的Scode是局部变量,CodeRecursion完成后它被释放,所以@Scode地址指向的内容变成不确定的了。你可以这样写:
    Procedure Tf_main.CodeRecursion(parent:Ttreenode;GoodsCode:String);
    var
       Node:TtreeNode;
       PScode:^string;  //注意声明成指针
    begin
       while not (qgoods.eof()) do begin
         if not (qGoods.FieldByName('goodstype').AsString='原材料') then  begin
            Node:=Treeview1.Items.Addchild(Parent,
                  qGoods.fieldbyname('GoodsName').AsString);
            New(PScode);  //分配内存
            PScode^:=qGoods.fieldbyname('goodscode').AsString; //注意是PScode^
            Node.Data:=PScode; //不要@
         end;//if
       end; //while
    endprocedure Tf_main.TreeView1Change(Sender: TObject; Node: TTreeNode);
    begin
        Showmessage(String(Node.Data^)); //应该这样写
    end;
      

  7.   

    同意 rongrongGsr() 不过要注意的是,关闭窗口时最好是对这些指针,进行Dispose操作,以释放掉内存,尽管delphi有自动化,但好象还是有些不干净
      

  8.   

    感谢 rongrongGsr() 的指点
    结贴