ComCtrls.pas
.... 
TTreeNode = class(TPersistent)
  private
  //加入以下兩行
    FCity:string;
    FSchool:string;    FOwner: TTreeNodes;
    FText: string;
    FData: Pointer;
    ...
  public
   //增加如下兩屬性,可適當擴充
    propery City:string read FCity write Fcity;
    propery School:string read FSchool write FSchool;    constructor Create(AOwner: TTreeNodes);
    ...
  end;
这种办法可以方便的在treeview增加属性,这样作了,不用管资源释放吗?安全吗?
  

解决方案 »

  1.   

    应该管释放资源,用inherid不安全
      

  2.   

    实际上我们可以完全不要修改VCL的代码:
    首先在自己的单元中加入下面的类定义:
      TNodeEx = class(TTreeNode)
      private
        FCity:string;
        FSchool:string;
      public
        constructor Create(AOwner: TTreeNodes);
        
        propery City:string read FCity write Fcity;
        propery School:string read FSchool write FSchool;
      end;constructor TNodeEx.Create(AOwner: TTreeNodes);
    begin
      inherited;
      FCity:='';
      FSchool:='';
    end;然后在
    procedure TForm1.TreeView1CreateNodeClass(
      Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
    begin
      NodeClass:=TNodeEx;
    end;然后我们就可以这样访问代码了;
    (TreeView.Selected AS TNodeEx).School:='asdfasdf';
      

  3.   

    String类型的资源可以不用释放!
      

  4.   

    我这么做是为了实现类似treeview的data的功能,增加一个属性用来记录信息,到底需不需要关心资源释放呢?
      

  5.   

    把属性放在ttreenode::data里好了,不需要手工free
      

  6.   

    如果只是为了实现DATA,完全没有必要自己去改VCL,不推荐这种方式,就算要改也应该继承下来自己写,你可以自己定义一个结构指针,把它指到DATA上就可以了
    TMyData = packed record
      City:string;
      School:string;
    end;
    PMyData =^TMyData;
    ...
    ...
    MyData:PMyData;MyData^.School := 'fdasdfas';
    TreeView.Selected.Data := MyData;或者用xthmpro_cn(安徽农民*在外打工) 的办法也可以
      

  7.   

    放在data中,是谁说不用手工释放的?拖出来打