procedure TCustFormX.LoadGroupDir(billid: Integer; node: TTreeNode); var i: Integer; nodechild, nodeparent: TTreeNode; begin AGroupFram.tvGroup.Items.BeginUpdate; if billid = 0 then begin if node = nil then begin for i := 0 to AGroupDirs.Count - 1 do begin //根节点 if TAGroupDir(AGroupDirs[i]).Parent = 0 then begin nodeparent := AGroupFram.tvGroup.Items.Add(node, TAGroupDir(AGroupDirs[i]).CName); nodeparent.Data := AGroupDirs[i]; LoadGroupDir(billid, nodeparent); end; end; end else begin for i := 0 to AGroupDirs.Count - 1 do begin //子节点 if TAGroupDir(AGroupDirs[i]).Parent = TAGroupDir(node.Data).TreeId then begin nodechild := AGroupFram.tvGroup.Items.AddChild(node, TAGroupDir(AGroupDirs[i]).CName); nodechild.Data := AGroupDirs[i]; LoadGroupDir(billid, nodechild); end; end; end; end else begin if node = nil then begin for i := 0 to AGroupDirs.Count - 1 do begin //根节点 if (TAGroupDir(AGroupDirs[i]).Parent = 0) and (TAGroupDir(AGroupDirs[i]).BillId = billid) then begin nodeparent := AGroupFram.tvGroup.Items.Add(node, TAGroupDir(AGroupDirs[i]).CName); nodeparent.Data := AGroupDirs[i]; LoadGroupDir(billid, nodeparent);//递归调用 end; end; end else begin for i := 0 to AGroupDirs.Count - 1 do begin //子节点 if (TAGroupDir(AGroupDirs[i]).Parent = TAGroupDir(node.Data).TreeId) and (TAGroupDir(AGroupDirs[i]).BillId = billid) then begin nodechild := AGroupFram.tvGroup.Items.AddChild(node, TAGroupDir(AGroupDirs[i]).CName); nodechild.Data := AGroupDirs[i]; LoadGroupDir(billid, nodechild));//递归调用 end; end; end; end; AGroupFram.tvGroup.Items.EndUpdate; AGroupFram.tvGroup.FullExpand; end;
有些设计是只用id,比如父节点的id是01,然后id是0101,0102....的就是它的子节点
procedure TCustFormX.LoadGroupDir(billid: Integer; node: TTreeNode);
var
i: Integer;
nodechild, nodeparent: TTreeNode;
begin
AGroupFram.tvGroup.Items.BeginUpdate;
if billid = 0 then
begin
if node = nil then
begin
for i := 0 to AGroupDirs.Count - 1 do
begin //根节点
if TAGroupDir(AGroupDirs[i]).Parent = 0 then
begin
nodeparent := AGroupFram.tvGroup.Items.Add(node, TAGroupDir(AGroupDirs[i]).CName);
nodeparent.Data := AGroupDirs[i];
LoadGroupDir(billid, nodeparent);
end;
end;
end
else
begin
for i := 0 to AGroupDirs.Count - 1 do
begin //子节点
if TAGroupDir(AGroupDirs[i]).Parent = TAGroupDir(node.Data).TreeId then
begin
nodechild := AGroupFram.tvGroup.Items.AddChild(node, TAGroupDir(AGroupDirs[i]).CName);
nodechild.Data := AGroupDirs[i];
LoadGroupDir(billid, nodechild);
end;
end;
end;
end
else
begin
if node = nil then
begin
for i := 0 to AGroupDirs.Count - 1 do
begin //根节点
if (TAGroupDir(AGroupDirs[i]).Parent = 0) and (TAGroupDir(AGroupDirs[i]).BillId = billid) then
begin
nodeparent := AGroupFram.tvGroup.Items.Add(node, TAGroupDir(AGroupDirs[i]).CName);
nodeparent.Data := AGroupDirs[i];
LoadGroupDir(billid, nodeparent);//递归调用
end;
end;
end
else
begin
for i := 0 to AGroupDirs.Count - 1 do
begin //子节点
if (TAGroupDir(AGroupDirs[i]).Parent = TAGroupDir(node.Data).TreeId) and (TAGroupDir(AGroupDirs[i]).BillId = billid) then
begin
nodechild := AGroupFram.tvGroup.Items.AddChild(node, TAGroupDir(AGroupDirs[i]).CName);
nodechild.Data := AGroupDirs[i];
LoadGroupDir(billid, nodechild));//递归调用
end;
end;
end;
end;
AGroupFram.tvGroup.Items.EndUpdate;
AGroupFram.tvGroup.FullExpand;
end;
不知道这两个方案哪个更合适一些。深入思考中。比如这样的结构:中国大陆,华南区,广东,广州。
01
0101
0102
010201
02
0201
...
因为只要一排序,父节点总在子节点前面,只要看自身id的长度跟上一条id的长度关系就知道是父子还是兄弟了
到你选择的时候,你把它的data取出来,取到id就可以啦,
data的类型为指针,你最好构造一个Record,再定义一个指针。type
PR : ^R ;
R = record
id : integer ; //id
NodeText : string ;//节点Text值
end ;var
p : PR ;
node : TTreeNode ;
begin
new(p) ; try
p^.id := .. ;
p^.NodeText := .. ;
node := TreeView1.Items.Add(....) ;或者 node := TreeView1.Items.AddChild(....) ;
node.Data := p ;end;
到你选择的时候,你把它的data取出来,取到id就可以啦,
data的类型为指针,你最好构造一个Record,再定义一个指针。 type
PR : ^R ;
R = record
id : integer ; //id
NodeText : string ;//节点Text值
end ; var
p : PR ;
node : TTreeNode ;
begin
new(p) ; try
p^.id := .. ;
p^.NodeText := .. ;
node := TreeView1.Items.Add(....) ;或者 node := TreeView1.Items.AddChild(....) ;
node.Data := p ;
finally
dispose(p) ;
end; end;
读取时,
var
p : PR ;
id :integer ;
nodeText : String ;
begin
new(p) ;
try
if TreeView1.Selected <> nil then
begin
if (TreeView1.Selected.Data <> nil ) then
betin
p :=(PR)TreeView1.Selected.Data ;
id := p^.id ;
nodeText := p^.NodeText ;
end;
end;
finally
dispose(p) ;
end; end;直接在这里面写的,你自己看看,我也不知道有没有问题,家里没有环境写。