我要用TreeView显示三级科目,每一个节点我希望显示名称,不显示ID号,但我可以随时取出。
我希望当点击一级和二级科目时根据ID号能动态地从数据库查出它的下一级科目。
刚开始我想节点的Text显示为:id_名称,这样就可以很容易取出ID号。但客户希望不显示ID号。后来我采用如下方式:
type
  PCustomNode = ^TCustmoNode;
  TCustmoNode = record
    id: string;
    name: string;
  end;
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    btAdd: TButton;
    Query1: TQuery;
    btSelect: TButton;
    procedure btAddClick(Sender: TObject);
    procedure btSelectClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.DFM}procedure TForm1.btAddClick(Sender: TObject);
var
   PNode: PCustomNode;
   Name: string;
begin
  while not query1.Eof do
  begin
    new(PNode);
    PNode.id := query1.FieldByName('id').asString;
    TreeView1.Items.AddObject(nil,query1.FieldByName('name').asString,PNode);
    //dispose(PNode);
    query1.next;
  end;
end;procedure TForm1.btSelectClick(Sender: TObject);
var
  s: string;
begin
  s:= pCustomNode(TreeView1.Selected.Data)^.id;
  showMessage(s);
end;end;使用这种方法可以取出ID号,而且又不显示在窗口上,但这种方法在创建节点时分配的内存该在那里释放。我试过,如果在创建节点时释放,不会出错,但取ID号时要报错.请问该不该释放内存,在那里释放

解决方案 »

  1.   

    这个问题啊,当你关闭Form时,即写在窗体的OnClose事件里,因已赋于树节点,释放其就OK;你可以在里面这样写:
    for i := 0 to tv.Items.Count - 1 do
      if tv.Items[i].Data <> nil then
        Dispose(tv.items[i].data)
      

  2.   

    处理树的OnDeletion事件,内存是一定要释放的
      

  3.   

    楼上的,处理树的OnDeletion事件,你能不能说清楚一点。
    一楼的
    在delphi 的在线帮助里有对函数AddObject(...)这样描述的:
    function AddObject(Node: TTreeNode; const S: string; Ptr: Pointer): TTreeNode;DescriptionThe node is added as the last sibling of the node specified by the Node parameter. The S parameter specifies the Text property of the new node. The Ptr parameter specifies the Data property value of the new node. AddObject returns the node that has been added. Note: The memory referenced by Ptr is not freed when the tree nodes object is freed.最后一句话意思好象是接点释放而指针指向的内存不释放。
    谢谢