常用下列语法为Treeview携带参数:
TreeView1.Items.AddChildObject(Node,'aaaa', Pointer(1));
TreeView1.Items.AddChildObject(Node,'bbbb', Pointer(3));
TreeView1.Items.AddChildObject(Node,'cccc', Pointer(19));用下列语法为Treeview提取参数:
n:=Integer(TreeView1.selected.data);//(1 3 19)问题:
1  在 TreeView1.itmes.clear时 需要释放DATA吗?
2  一般情况下,我用data简单的携带数据的id,我用当前方式可以携带strings吗?  

解决方案 »

  1.   

    此时不用
    如果要带string的话,就要注意声明周期,特别是局部变量,本过程结束后,就over了,有可能访问出错
      

  2.   

    data就是个指针,看你clear后那个指针还用不用了,不用就需要释放
    放strings没问题的,对象、指针都可以放,不过要考虑生存期问题
      

  3.   

    简单点说,指针就是个地址,通常可以定义个全局数组,数组存放结构体
    如: g_Data: array [0..N] of StructData;
         Node.data := @g_Data[i];
    这样clear后就不用释放了
         
      

  4.   

    个人认为需要释放DATA.(如果是Integer\String\等简单数据类型时,不需要释放)
    TreeView不会释放Data指针指向的对象.//Form1代码
    var
        p3: Pointer;
        d: TStrings;
    begin
        Form2 := TForm2.Create(self);
        Form2.ShowModal;
        p3 := Form2.p;
        FreeAndNil(Form2);    d := TStringList(p3);
        ShowMessage(d.Strings[2]);
    end;//Form2代码
    //增加节点
    var
        a: TStrings;
    begin
        a := TStringList.Create;
        a.Add('1'); a.Add('2'); a.Add('3');
        p := Pointer(a);
        TreeView1.Items.AddChildObject(nil, '123', p);
    end;
    //测试节点
    var
        b: TStrings;
        node: TTreeNode;
        p2: Pointer;
    begin
        p2 := TreeView1.Selected.Data;
        b := TStringList(p2);
        ShowMessage(b.Strings[2]);
    end;
      

  5.   

    主要还是生命周期的问题,1,2可以认为是系统常量。因此在此程式中是没有问题的,如果是变量的话,就要注意了。string也同理。