// 树节点类型记录
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;
转载于:https://blog.51cto.com/jxyx521/1280867