delphi 顶用treeview控件读出数据库中的数据

delphi 中用treeview控件读出数据库中的数据
我数据库里是个多层次关系,用一个parent_id和id关联,比如系统管理-用户管理-增加。。层次关系
我现在要实现的就是进入窗体的时候将数据库中的数据按层次显示在treeview控件里

------解决方案--------------------
可以用循环,也可以用递归,也可以用现成的第三方控件(如cxDBTreeList)
要看你数据库是怎么设计的了
------解决方案--------------------
了解下xml的解析,就行了,原理类似
------解决方案--------------------
SQL: string;
vDRec, vGRec: integer;
vDNode, vGNode, vUNode: TTreeNode;
vRDept: PrDepartment;
vRGroup: PrGroup;
vRUser: PrUser;
begin
SQL := 'SELECT D.RecordID DRecID,D.DepartmentID,D.DName,D.DDescription,'
+ 'D.DepartmentPopedom,G.RecordID GRecID,G.GroupID,G.GName,G.GDescription,'
+ 'G.GroupPopedom,U.RecordID URecID,U.UserID,U.OName,U.OPassword,'
+ 'U.UserPopedom,U.CreateTime,U.ModifyTime FROM ODEPARTMENT D'
+ ' LEFT JOIN OGROUP G ON G.DepartmentID = D.DepartmentID'
+ ' LEFT JOIN OUSER U ON D.DepartmentID = U.DepartmentID and U.GroupID = G.GroupID'
+ ' ORDER BY D.RecordID,G.RecordID,U.RecordID';
qrUser.SQL.Text := SQL;
qrUser.Open;
vDRec := 0;
vGRec := 0;
vGNode := nil;
vDNode := nil;
while not qrUser.Eof do
begin
if vDRec <> qrUser.FieldByName('DRecID').AsInteger then
begin //增加部门节点
vRDept := New(PrDepartment);
vRDept.RecID := qrUser.FieldByName('DRecID').AsInteger;
vRDept.DeptID := qrUser.FieldByName('DepartmentID').AsString;
vRDept.Name := qrUser.FieldByName('DName').AsString;
vRDept.Desc := qrUser.FieldByName('DDescription').AsString;
vRDept.Popedom := Trim(qrUser.FieldByName('DepartmentPopedom').AsString);
vRDept.Popedom := TCommFun.DencryptStr(vRDept.Popedom, vRDept.Name);
vDNode := tvUser.Items.AddChildObject(nil, vRDept.Name, vRDept);
vDNode.SelectedIndex := 0;
vDNode.ImageIndex := 0;
vDRec := vRDept.RecID;
vGRec := 0;
end;
if vGRec <> qrUser.FieldByName('GRecID').AsInteger then
begin //增加班组节点
vRGroup := New(PrGroup);
vRGroup.RecID := qrUser.FieldByName('GRecID').AsInteger;
vRGroup.GroupID := qrUser.FieldByName('GroupID').AsString;
vRGroup.DeptID := qrUser.FieldByName('DepartmentID').AsString;
vRGroup.Name := qrUser.FieldByName('GName').AsString;
vRGroup.Desc := qrUser.FieldByName('GDescription').AsString;
vRGroup.Popedom := Trim(qrUser.FieldByName('GroupPopedom').AsString);
vRGroup.Popedom := TCommFun.DencryptStr(vRGroup.Popedom, vRGroup.Name);
vGNode := tvUser.Items.AddChildObject(vDNode, vRGroup.Name, vRGroup);
vGNode.SelectedIndex := 1;
vGNode.ImageIndex := 1;
vGRec := vRGroup.RecID;
end;
//增加用户节点
vRUser := New(PrUser);
vRUser.RecID := qrUser.FieldByName('URecID').AsInteger;
vRUser.UserID := qrUser.FieldByName('UserID').AsString;
vRUser.DeptID := qrUser.FieldByName('DepartmentID').AsString;
vRUser.GroupID := qrUser.FieldByName('GroupID').AsString;
vRUser.Name := qrUser.FieldByName('OName').AsString;
vRUser.Pwd := TCommFun.DencryptStr(qrUser.FieldByName('OPassword').AsString, vRUser.Name);
vRUser.Popedom := Trim(qrUser.FieldByName('UserPopedom').AsString);
vRUser.Popedom := TCommFun.DencryptStr(vRUser.Popedom, vRuser.Name);
vRUser.CreateTime := qrUser.FieldByName('CreateTime').AsString;
vRUser.ModifiedTime := qrUser.FieldByName('ModifyTime').AsString;

vUNode := tvUser.Items.AddChildObject(vGNode, vRUser.Name, vRUser);
vUNode.SelectedIndex := 2;
vUNode.ImageIndex := 2;
qrUser.Next;
end;