//edit1.text:='abc,def,ghi';procedure TForm1.Button1Click(Sender: TObject); var sList:TStringList; i,j:Integer; NodeList:TList; procedure GetLevelNodes(ALevel:Integer); var i:Integer; begin NodeList.Clear; for i:=0 to TreeView1.Items.Count-1 do if TreeView1.Items[i].Level=ALevel then NodeList.Add(TreeView1.Items[i]); end;
procedure AddNode(const ATxt:string;APNode:TTreeNode); var i:Integer; begin if trim(ATxt)='' then exit; for i:=1 to length(ATxt) do TreeView1.Items.AddChild(APNode,ATxt[i]); end; begin sList:=TStringList.Create; try sList.Delimiter:=','; sList.DelimitedText:=edit1.Text; if sList.Count<=0 then exit; TreeView1.Items.Clear; AddNode(sList[0],nil); NodeList:=TList.Create; try for i:=1 to sList.Count-1 do begin GetLevelNodes(i-1); for j:=0 to NodeList.Count-1 do AddNode(sList[i],TTreeNode(NodeList[j])); end; finally NodeList.Free; end; finally sList.Free; end; TreeView1.FullExpand; end;
这个问题像是算法考试题,是一个指针递归遍历的算法。 我的看法是:题目让你把一个父节点的全部儿子节点找出来。//定义节点 TpNode=^TaNode; TaNode=record Data:array of yourDataType;//每层的元素 Next:TpNode;//下一层指针 end;//至于节点的赋值,我不详细写了,就是每层的元素赋值完成之后NEW一下,把NEXT指向NEW //下面的过程简单演示了递归的方法,我学艺不精,你自己也研究一下吧 procedure crNode(aNode:TpNode); var i:Integer; begin for i:=Low(aNode.Data) to High(aNode.Data) do if aNode.Next<>nil then crNode(aNode.Next) else //添加节点; end;
procedure TForm1.Button2Click(Sender: TObject); var A,B,C:TStringList; i,j,k:Integer; NowNode,NowNode1,NowNode2:TTreeNode; begin A:=TStringList.Create; B:=TStringList.Create; C:=TStringList.Create; A.Delimiter:=','; B.Delimiter:=','; C.Delimiter:=','; A.DelimitedText:='A,B,C'; B.DelimitedText:='D,E,F'; C.DelimitedText:='H,I,J'; if A.Count<=0 then exit; TreeView1.Items.Clear; For i:=0 to A.Count-1 do begin NowNode:=TreeView1.Items.Add(nil,A.Strings[i]); For j:=0 to B.Count-1 do begin NowNode1:=TreeView1.Items.AddChild(NowNode,B.Strings[j]); For k:=0 to C.Count-1 do begin NowNode2:=TreeView1.Items.AddChild(NowNode1,C.Strings[k]); end; end; end; TreeView1.FullExpand; end;
//edit1.text:='abc,def,ghi';procedure TForm1.Button1Click(Sender: TObject);
var
sList:TStringList;
i,j:Integer;
NodeList:TList; procedure GetLevelNodes(ALevel:Integer);
var
i:Integer;
begin
NodeList.Clear;
for i:=0 to TreeView1.Items.Count-1 do
if TreeView1.Items[i].Level=ALevel then
NodeList.Add(TreeView1.Items[i]);
end;
procedure AddNode(const ATxt:string;APNode:TTreeNode);
var
i:Integer;
begin
if trim(ATxt)='' then exit;
for i:=1 to length(ATxt) do
TreeView1.Items.AddChild(APNode,ATxt[i]);
end;
begin
sList:=TStringList.Create;
try
sList.Delimiter:=',';
sList.DelimitedText:=edit1.Text;
if sList.Count<=0 then exit;
TreeView1.Items.Clear;
AddNode(sList[0],nil); NodeList:=TList.Create;
try
for i:=1 to sList.Count-1 do
begin
GetLevelNodes(i-1);
for j:=0 to NodeList.Count-1 do
AddNode(sList[i],TTreeNode(NodeList[j]));
end;
finally
NodeList.Free;
end;
finally
sList.Free;
end; TreeView1.FullExpand;
end;
我的看法是:题目让你把一个父节点的全部儿子节点找出来。//定义节点
TpNode=^TaNode;
TaNode=record
Data:array of yourDataType;//每层的元素
Next:TpNode;//下一层指针
end;//至于节点的赋值,我不详细写了,就是每层的元素赋值完成之后NEW一下,把NEXT指向NEW
//下面的过程简单演示了递归的方法,我学艺不精,你自己也研究一下吧
procedure crNode(aNode:TpNode);
var i:Integer;
begin
for i:=Low(aNode.Data) to High(aNode.Data) do
if aNode.Next<>nil then
crNode(aNode.Next)
else
//添加节点;
end;
var A,B,C:TStringList;
i,j,k:Integer;
NowNode,NowNode1,NowNode2:TTreeNode;
begin
A:=TStringList.Create;
B:=TStringList.Create;
C:=TStringList.Create;
A.Delimiter:=',';
B.Delimiter:=',';
C.Delimiter:=',';
A.DelimitedText:='A,B,C';
B.DelimitedText:='D,E,F';
C.DelimitedText:='H,I,J';
if A.Count<=0 then exit;
TreeView1.Items.Clear;
For i:=0 to A.Count-1 do
begin
NowNode:=TreeView1.Items.Add(nil,A.Strings[i]);
For j:=0 to B.Count-1 do
begin
NowNode1:=TreeView1.Items.AddChild(NowNode,B.Strings[j]);
For k:=0 to C.Count-1 do
begin
NowNode2:=TreeView1.Items.AddChild(NowNode1,C.Strings[k]);
end;
end;
end;
TreeView1.FullExpand;
end;
A.Free;
B.Free;
C.Free;