function TFrmBSourceDefine.CreateClassTree(aParent: TTreeNode;
Level: integer; SLevel, SText: TStrings;aClassTree:TRZTreeview): boolean;
var
I:integer;
TempNode:TTreeNode;
begin
Result:=False; //TempNode:=TTreeNode.Create(Nil); For i:=0 to Slevel.Count-1 do
begin
//添加子结点
//是否符合级别
if length(Slevel.Strings[i])=(level+1)*3 then
if level=0 then
begin
TempNode:=aclassTree.Items.Add(aparent,sText.Strings[i]);
CreateClassTree(tempnode,level+1,Slevel,stext,aclasstree);
Result:=True;
end
else
begin
if copy(slevel.Strings[i],0,level*3)=aparent.Text then
begin
TempNode:=aclassTree.Items.AddChild(aparent,sText.Strings[i]);
CreateClassTree(tempnode,level+1,Slevel,stext,aclasstree);
Result:=True;
end;
end;
end;
//tempnode.Free;end;调用部分如下
InitCmbstring(dm2.ADOConn,'Select * from Hx_StructClass order by S_ClassLevel','S_ClassLevel',StrLevel); Isok:=InitCmbString(Dm2.ADOConn,'Select * from HX_structClass order by S_ClassLevel','struct_Class',StrName);
if ISok then
createclasstree(nil,0,strlevel,strname,RzTR_Struct_Class);
数据库中参数如下
name level
a 001
b 001001
c 001001002
d 001001003
e 005 为什么这个函数只能读出a 和 e
跟踪发现 第二层调用是Slevel 和 Stext 变成了空值
为什么?
begin
if copy(slevel.Strings[i],0,level*3)=aparent.Text then
////////////////////////这里错误,aparent.text增加的是name字段,而这里判断却是用level字段来比较,所以这个判断一直为假,所以不能增加子结点。
type
PTreeInfo=^TTreeInfo;
TTreeInfo=record
strName:string;
strLevel:string;
end;
////////////////////////////自定义结点信息用来记录结点级别function TFrmBSourceDefine.CreateClassTree(aParent: TTreeNode;
Level: integer; SLevel, SText: TStrings;aClassTree:TRZTreeview): boolean;
var
I:integer;
TempNode:TTreeNode;
p:PTreeInfo;///////////////////////////
begin
Result:=False; //TempNode:=TTreeNode.Create(Nil); For i:=0 to Slevel.Count-1 do
begin
//添加子结点
//是否符合级别
if length(Slevel.Strings[i])=(level+1)*3 then
if level=0 then
begin
new(p);/////////////////////////////////////////
p^.strName:=sText.Strings[i];//////////////////////////
p^.strLevel:=sLevel.Strings[i];//////////////////////
TempNode:=aclassTree.Items.AddObject(aparent,sText.Strings[i],p);//////////
CreateClassTree(tempnode,level+1,Slevel,stext,aclasstree);
Result:=True;
end
else
begin
if copy(slevel.Strings[i],0,level*3)=PTreeInfo(aparent.data)^.strLevel then
begin
new(p);/////////////////////////////
p^.strName:=sText.Strings[i];////////////////
p^.strLevel:=sLevel.Strings[i];/////////////////////
TempNode:=aclassTree.Items.AddChildObject(aparent,sText.Strings[i],p);/
CreateClassTree(tempnode,level+1,Slevel,stext,aclasstree);
Result:=True;
end;
end;
end;
//tempnode.Free;end;
////////////////////////////////
试过,绝对可用。