有时我们需要保存和重建treeview控件,本文提供一种方法,通过以树结构节点的编号访问树结构,该控件主要提供的方法如下:
function getglobenumcode(innode:ttreenode):string;
功能:返回当前节点的编号,编号规则见源码内说明。
function locatorgeneratenode(innumcode:string):ttreenode;
功能:以编号返回节点,假如节点的父节点和它的前继兄弟节点不存在,该方法会创建它们,名称为'temp',当然假如已经存在,就不执行创建工作。
通过以上两个函数,这样我们就可以不加限制的创建和访问节点。该控件在我以前开发的,现在提供给大家做一个参考,希望能对你有帮助。
源码:
// ***********************************************
//
// 用于实现对treeview控件的树结构的保存和重建
// 编写该控件主要用于实现对行政文件等具有树的层次结构的对象
// 实现保存和显示
// 节点编号规则:
// + ***** ->1
// + ***** ->1.1
// + ***** ->1.1.1
// + ***** ->1.2
// 作者:jack
// 最后修改日期:2002-12-24
//
// **********************************************
unit ctrltree;
interface
uses
windows, messages, sysutils, classes, graphics, controls, forms, dialogs,
comctrls;
type
tctrltree = class(ttreeview)
private
{ private declarations }
function getposatbound(instring:string;instart:integer):integer;
function getthelastpointpos(instring:string):integer;
protected
{ protected declarations }
public
{ public declarations }
function getnuminsamelevel(innode:ttreenode):integer;
function getglobenumcode(innode:ttreenode):string;
function getparent(innumcode:string):ttreenode;
function locatenodeinlevel(parnode:ttreenode;levelcode:integer):ttreenode;
published
{ published declarations }
function locatorgeneratenode(innumcode:string):ttreenode;
function insertasfinalchild(instring:string;innode:ttreenode):ttreenode;
function insertasprevioussibling(instring:string;innode:ttreenode):ttreenode;
end;
procedure register;
implementation
procedure register;
begin
registercomponents('standard', [tctrltree]);
end;
{ tctrtree }
function tctrltree.getnuminsamelevel(innode: ttreenode): integer;
{功能:产生已存在节点在兄弟节点层中对应的编号,从1起编
入口参数:incode:ttreenode节点
返回:同层编号
}
var
i:integer;
tmp:ttreenode;
begin
i:=0;
tmp:=innode;
while tmp<>nil do
begin
tmp:=tmp.getprevsibling;
i:=i+1;
end;
result:=i;
end;
function tctrltree.getglobenumcode(innode: ttreenode): string;
{功能:产生已存在节点对应的全局编号
入口参数:incode:ttreenode节点
返回:全局编号
}
var
nocode:string;
tmp:ttreenode;
begin
tmp:=innode;
nocode:=inttostr(getnuminsamelevel(tmp));
while tmp.level<>0 do
begin
tmp:=tmp.parent;
nocode:=inttostr(getnuminsamelevel(tmp))+'.'+nocode;
end;
result:=nocode;
end;
function tctrltree.locatorgeneratenode(innumcode: string): ttreenode;
{功能:根据提供的全局编号进行定位,如路径不全,则创建路径
在定位过程产生的节点的text为temp
最终返回对应于全局编号的子节点
入口参数:innumcode:string为全局编号
返回:全局编号对应的字节点
}
var
i,j:cardinal;
numinlevel:integer;
tmp:ttreenode;
par:ttreenode;
begin
tmp:=nil;
i:=1;
while i<=strlen(pchar(innumcode)) do
begin
//得到下一个点号的开始位
j:=getposatbound(innumcode,i);
//得到在兄弟节点中的排行数
numinlevel:=strtoint(copy(innumcode,i,j-i+1));
//定位父节点
par:=getparent(copy(innumcode,1,j));
//得到对应的节点
tmp:=locatenodeinlevel(par,numinlevel);