// 树节点类型记录
 TNodeLocalParam = ^TLocalParam;
 TLocalParam = record
   FProjectID: Integer;
   FVersionID: Integer;
   FSubItemID: Integer;
   FSubItemParentID: Integer;
   FUnitID: Integer;
 end;

{-------------------------------------------------------------------------------
 过程名:    ReadProjectToView
 功能:      加载项目、版本、子项、测试单元信息,并分级显示生成树形结构
 参数:      TreeView: TsuiTreeView  生成的树    只输入
            ProjectStatus:string  项目的状态(在在ReadType为Project有用)只输入
                           0:全部1:使用2:暂停;3:停用4:未开始
            ReadType: string  加载类型    只输入
                      Project: 按项目状态加载 Task:按任务状态加载
 返回值:    无
-------------------------------------------------------------------------------}
procedure TMainForm.ReadProjectToView(TreeView: TsuiTreeView;
 ProjectStatus, ReadType: string);
var
 ProjectIDStr, ProjectNameStr, FilterStr: string;
 NodeCur: TTreeNode;
 ClientDSTemp: TClientDataSet;
NodeLocaParam: TNodeLocalParam;
begin
 TreeView.Items.Clear;

 try
   if not GetServer.IsUserExist(PUserID, PAppIP) then
   begin
     MyShowMessage('服务器连接断开,暂不能进行任何操作,请重新登录。', 1);
     Exit;
   end;
 except
   MyShowMessage('服务器连接异常', 1);
   Exit;
 end;        

 if not DMCaseClient.ClientDsProject.Active then
   exit;

 ClientDSTemp := TClientDataSet.create(nil);
 try
   FilterStr := '';

   if (ReadType = 'Project') and (Trim(ProjectStatus) <> '0') then // 按项目状态加载
   begin
     FilterStr := 'ProjectStatus = ' + Trim(ProjectStatus);
   end
   else if (ReadType = 'Task') then // 按任务状态加载,应该排除停用的项目
   begin
     FilterStr := 'ProjectStatus <> 3 ';
   end
   else
   begin
     Exit;
   end;

   with ClientDSTemp do
   begin
     Data := DMCaseClient.ClientDsProject.Data;
     Filtered := False;
     Filter := FilterStr;
     Filtered := True;

 while not Eof do
     begin
       ProjectIDStr := fieldByName('ProjectID').AsString;
       ProjectNameStr := fieldByName('ProjectName').AsString;

       if IsNeedLoad('ProjectID', ProjectIDStr, PUserID) then
       begin
// 创建Data信息,当释放结点的时候,会释放它
         New(NodeLocaParam);
         NodeLocaParam.FProjectID := fieldByName('ProjectID').AsInteger;
         NodeLocaParam.FVersionID := 0;
         NodeLocaParam.FSubItemID := 0;
         NodeLocaParam.FSubItemParentID := 0;
         NodeLocaParam.FUnitID := 0;

         // 创建结点
         NodeCur := TreeView.Items.AddChild(nil, ProjectNameStr);
         NodeCur.Data := Pointer(NodeLocaParam);
         NodeCur.StateIndex := 1;
         NodeCur.ImageIndex := 0;
         NodeCur.SelectedIndex := 1;

         // 读取版本信箱
         ReadVersionToView(TreeView, NodeCur);
       end;
       Next;
     end;
   end;
 finally
   ClientDSTemp.Free;
 end;
end;

2、读取TreeView结点中的数据:

1.  TNodeType(tvUnitInfo.Items[i].Data).UserID ;

2.  Integer(NodeCur.Data)  对应于: NodeCur.Data := Pointer(UserID);

3、释放TreeView的结点Data指向的内存:防止内存泄露

procedure TMainForm.tvShowByTaskDeletion(Sender: TObject; Node: TTreeNode);
begin
 // 释放结点的Data指向的信息
if Assigned(Node.Data) then
   dispose(TNodeLocalParam(Node.Data));
end;