我要生成一个树(treeview),然后通过数据库动态增加节点,设置每个节点的caption,还有data,我发现data是pointer 的类型,但是在表中,都是一般的数据类型,然后通过点击,判断每个节点的data 属性并显示,我发现不能直接赋值,要通过转化,但 不知道怎么转化,怎么做啊

解决方案 »

  1.   

    类似这样:桌面上一个Treeview1,一个按钮
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls;
    type
      pperson = ^Tperson;
      TPerson = record
        id: string;
        name: string;
      end;type
      TForm1 = class(TForm)
        Button1: TButton;
        TreeView1: TTreeView;
        procedure Button1Click(Sender: TObject);
        procedure TreeView1Click(Sender: TObject);
      private
        { Private declarations }
        FPerson: PPerson;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      TNode1: TTreeNode;
    begin
      New(FPerson);
      FPerson.id := '001';
      FPerson.name := '张三';
      TNode1 := TreeView1.Items.Add(nil,FPerson.name);
      TNode1.Data := FPerson;  New(FPerson);
      FPerson.id := '002';
      FPerson.name := '李四';
      TNode1 := TreeView1.Items.Add(nil,FPerson.name);
      TNode1.Data := FPerson;
    end;procedure TForm1.TreeView1Click(Sender: TObject);
    begin
      if TreeView1.Selected.Count=1 then
      New(FPerson);
      FPerson := TreeView1.Selected.Data;
      showMessage('您选择了'+FPerson.id+'/'+FPerson.name);
    end;end.
      

  2.   

    1.定义结构体与结构体指针
    2.在AddObject时把结构体指针送过去,用Pointer(结构体指针)
      

  3.   

    如果那个Treeview 的节点 是动态变化的,可能在程序运行过程中增加,删除,不是说那个 Treeview 的data 属性的指针在退出程序时 需要删除吗,不知当节点发生变化时,是否也需要删除,然后在重新分配指针
      

  4.   

    存储在 data 中的 pointer,除非是系统负责自动分配回收的,否则必须释放。不然就泄露了。
    比如:ListView1.Items[0].AddObject('aaa', TButton.Create(nil));那在删除 这个 Item 之前,必须 释放这个buttonTButton(ListView1.Items[0].Data).Free;当然如果你像下面这样添加
    ListView1.Items[0].AddObject('aaa', TButton.Create(Form1)); 
    那么在 Form1 被 释放之前, 这个 TButton 也会被释放。
    但如果form1 是主窗体的话,那就只有在程序退出之前,内存才会释放,这也是浪费。
      

  5.   

    --------------------
    楼上老大正解~
    Delphi中只有TObjectList才能实现释放宿主后将列表中的对象删除,其它List均不可~