Delphi下Treeview控件基于节点编号的访问[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 jckchj 的 blog

   有时我们需要保存和重建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);

本文关键:Delphi Treeview 重建Treeview
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top