模型编码 模型名称 标题 模型描述 父节点
MO1
MO1.1
MO1.2
MO1.2.1
MO2
MO2.1
MO2.1.1
MO2.2
MO3
MO3.1
MO3.2
MO3.3
MO3.4
MO3.4.1
MO3.4.2
MO4
MO4.1
MO4.1.1
MO4.2
MO5
M06
MO1
MO1.1
MO1.2
MO1.2.1
MO2
MO2.1
MO2.1.1
MO2.2
MO3
MO3.1
MO3.2
MO3.3
MO3.4
MO3.4.1
MO3.4.2
MO4
MO4.1
MO4.1.1
MO4.2
MO5
M06
至于树节点可以从文本的长度或者点的个数来判断,很简单
http://www.baidu.com/s?bs=delphi+treelistview&f=8&rsv_bp=1&wd=delphi+treeview&inputT=262
每行前面加n个空格(n=(本行长度-3) div 2)
保存ss到内存流m
m.position:=0;
treeview.loadfromstream(m);
MO1.1
MO1.2
MO1.2.1
MO2
MO2.1
MO2.1.1
MO2.2
MO3
MO3.1
MO3.2
MO3.3
MO3.4
MO3.4.1
MO3.4.2
MO4
MO4.1
MO4.1.1
MO4.2
MO5
M06方便的话,直接把文本编辑成这样,上级和下级空一格,然后TreeView.LoadFromFile('文本路径');
否则就逐个处理,找到它的父ID,一个个添加进来
var
tv: TTreeView;
lines: TStringList;
row: int;procedure CreateTreeView;
var
tmpnode: TTreeNode;
i: Integer;
begin
tmpnode := tv.Items.AddChild(nil, '加载中...');
row := 0;
while row <= lines.Count - 1 do begin
tv.Items.BeginUpdate;
RecAddNode(tmpnode, 0); //开始添加节点
row := row + 1;
end;
//移至根节点
for i := tmpnode.Count - 1 downto 0 do
tmpnode.Item[i].MoveTo(nil, naAddFirst);
tmpnode.Delete;
end;//递归添加节点
procedure RecAddNode(node: TTreeNode; lv: Integer);
var
DataPtr: TDataPtr;
sl: TStringList;
_node: TTreeNode;
_lv: Integer;
begin
sl := TStringList.Create;
//遍历记录
while row <= lines.Count - 1 do begin
sl.Clear;
_lv := ExtractStrings(['.'], [], PChar(qry.FieldByName('code').AsString), sl);
if _lv = lv + 1 then begin
//直接添加节点
_node := tv.Items.AddChild(node, qry.FieldByName('name').AsString);
//递归添加子节点
qry.Next;
RecAddNode(_node, _lv);
end
else if _lv > lv + 1 then begin
ShowMessage('遇到不符合规则的节点!');
row := row + 1;
end
else Exit;
end;
end;
var
tv: TTreeView;
lines: TStringList;
row: int;procedure CreateTreeView;
var
tmpnode: TTreeNode;
i: Integer;
begin
tmpnode := tv.Items.AddChild(nil, '加载中...');
row := 0;
while row <= lines.Count - 1 do begin
tv.Items.BeginUpdate;
RecAddNode(tmpnode, 0); //开始添加节点
row := row + 1;
end;
//移至根节点
for i := tmpnode.Count - 1 downto 0 do
tmpnode.Item[i].MoveTo(nil, naAddFirst);
tmpnode.Delete;
end;//递归添加节点
procedure TMainForm.RecAddNode(node: TTreeNode; lv: Integer);
var
DataPtr: TDataPtr;
sl: TStringList;
_node: TTreeNode;
_lv: Integer;
begin
sl := TStringList.Create;
//遍历记录
while row <= lines.Count - 1 do begin
sl.Clear;
_lv := ExtractStrings(['.'], [], PChar(lines[row]), sl);
if _lv = lv + 1 then begin
//直接添加节点
_node := tv.Items.AddChild(node, lines[row]);
//递归添加子节点
qry.Next;
RecAddNode(_node, _lv);
end
else if _lv > lv + 1 then begin
ShowMessage('遇到不符合规则的节点!');
row := row + 1;
end
else Exit;
end;
end;
第一个方法里少个tv.Items.EndUpdate。
第二个方法里qry.Next应该是row:=row+1。