+ A
| |--1
| |--2
| |--3
| |+B
| |--1
| |--2
| |--3
| |+C
| |--1
| |--2
| |--3
+ D
|--1
|--2
|--3
| |--1
| |--2
| |--3
| |+B
| |--1
| |--2
| |--3
| |+C
| |--1
| |--2
| |--3
+ D
|--1
|--2
|--3
用循环链表?具体如何定义?to pandarus(Delphi/Asp里流浪的云) :
能否说详细点?
給一個遞歸函數的例子你:表結構
父阶 子阶 名稱
a b 1
a c 3
b d 1
c g 2
c E 8遞歸函數:
procedure TFm_main.treeviwe(treenode:ttreenode;roods:string);
var mytreenode:Ttreenode;
book1:Tbook;
begin
while not adoquery1.Eof do
begin
if treenode=nil then
begin
mytreenode:=treeview1.Items.Add(nil,adoquery1.Fieldbyname('node_text').AsString);
treeviwe(mytreenode,adoquery1.Fieldbyname('node_id').AsString);
end
else
begin
if adoquery1.Fieldbyname('parent_node_id').AsString=roods then
begin
mytreenode:=treeview1.Items.AddChild(treenode,adoquery1.Fieldbyname('node_text').AsString);
Book1:=adoquery1.GetBook;
treeviwe(mytreenode,adoquery1.Fieldbyname('node_id').AsString);
adoquery1.GotoBook(Book1);
adoquery1.FreeBook(Book1);
end;
end;
adoquery1.Next;
end;
end;
TreeView1.LoadFromFile();
procedure TTreeStrings.LoadTreeFromStream(Stream: TStream);
var
List: TStringList;
ANode, NextNode: TTreeNode;
ALevel, i: Integer;
CurrStr: string;
begin
List := TStringList.Create;
Owner.BeginUpdate;
try
try
Clear;
List.LoadFromStream(Stream);
ANode := nil;
for i := 0 to List.Count - 1 do
begin
CurrStr := GetBufStart(PChar(List[i]), ALevel);
if ANode = nil then
ANode := Owner.AddChild(nil, CurrStr)
else if ANode.Level = ALevel then
ANode := Owner.AddChild(ANode.Parent, CurrStr)
else if ANode.Level = (ALevel - 1) then
ANode := Owner.AddChild(ANode, CurrStr)
else if ANode.Level > ALevel then
begin
NextNode := ANode.Parent;
while NextNode.Level > ALevel do
NextNode := NextNode.Parent;
ANode := Owner.AddChild(NextNode.Parent, CurrStr);
end
else TreeViewErrorFmt(sInvalidLevelEx, [ALevel, CurrStr]);
end;
finally
Owner.EndUpdate;
List.Free;
end;
except
Owner.Owner.Invalidate; // force repaint on exception
raise;
end;
end;procedure TTreeStrings.SaveTreeToStream(Stream: TStream);
const
TabChar = #9;
EndOfLine = #13#10;
var
i: Integer;
ANode: TTreeNode;
NodeStr: string;
begin
if Count > 0 then
begin
ANode := Owner[0];
while ANode <> nil do
begin
NodeStr := '';
for i := 0 to ANode.Level - 1 do NodeStr := NodeStr + TabChar;
NodeStr := NodeStr + ANode.Text + EndOfLine;
Stream.Write(Pointer(NodeStr)^, Length(NodeStr));
ANode := ANode.GetNext;
end;
end;
end;
我想用记录+动态数组可以吗?
TreeView1.LoadFromFile();
可以的吧