Delphi实现树型结构具体实例

代码如下:

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, DB, ADODB;
type
  PNodeInfoEx = ^TNodeInfoEx;
  TNodeInfoEx = Packed Record
      NodeID    : Integer;
      ParentID  : Integer;
      NodeType  : Integer;
      ChnNodeTitle : String;
      ImageIndex: SmallInt;
      SelectedIndex: SmallInt;
   end;
  TForm1 = class(TForm)
    tv1: TTreeView;
    btn1: TButton;
    qry1: TADOQuery;
    procedure btn1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    function StaticBuildTree(TreeView:TTreeView ):Boolean;
    function AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
    function FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}

function TForm1.StaticBuildTree(TreeView:TTreeView ):Boolean;
var
  AddNodeInfo : PNodeInfoEx;
begin
  Result := False;
  qry1.LoadFromFile('c:/AdminixTree.xml');//这里以XML文件做为数据源
  Treeview.Items.BeginUpdate;//记住:在进行批量添加数据时要使用BeginUpdate,来暂时关闭由于添加数据而触发的某些事件(如OnChange事件等)
  Treeview.Items.Clear;//清空Treeview
  try
    try
      if qry1.RecordCount >0 then
        begin
          qry1.First;
          while Not qry1.Eof do
          begin
            New(AddNodeInfo) ;//生成结构体
            AddNodeInfo^.NodeID := qry1.FieldByName('NODE_ID').AsInteger;
            AddNodeInfo^.ParentID := qry1.FieldByName('PARENT_ID').AsInteger;
            AddNodeInfo^.NodeType := qry1.FieldByName('NodeType').AsInteger;
            AddNodeInfo^.ChnNodeTitle := qry1.FieldByName('ChnNodeTitle').AsString;
            AddNodeInfo^.ImageIndex := qry1.FieldByName('ImageIndex').AsInteger;
            AddNodeInfo^.SelectedIndex := qry1.FieldByName('SelectedIndex').AsInteger;
            AddTreeItem(Treeview,AddNodeInfo);//把结构体的指针存到Treeview中
            qry1.Next;
          end;
        end;
    except
      Application.MessageBox('生成树结点失败',MB_ICONSTOP+MB_OK);
      raise;//向上级抛异常
    end;
    qry1.Close;
    Result := True;
  finally
    Treeview.Items.EndUpdate;
  end;
end;
//在加入结点时,应先判断加入的是父结点还是子结点,判断的依据是在已存在的树结点中是否存在该结点的ParentID
function TForm1.AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
var
    ParentNode: TTreeNode;
begin
    ParentNode := FindTreeItem(Treeview,AddNodeInfo^.ParentID);
    If ParentNode <> nil then
        Result := Treeview.Items.AddChildObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo))
    else
        Result := Treeview.Items.AddObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo));
    if Result<>nil then
    begin
        Result.ImageIndex    := AddNodeInfo.ImageIndex;
        Result.SelectedIndex := AddNodeInfo.SelectedIndex;
    end;
end;
//这里是判断是否存在其父结点
function TForm1.FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
var
    i : Integer;
begin
  Result := nil;
  for i := 0 to Treeview.Items.Count-1 do
  begin
      if CurNodeID=PNodeInfoEx(Treeview.Items[i].Data)^.NodeID then
      begin
          Result := Treeview.Items[i];
          Exit;
      end;
  end;
end;
//生成树结构
procedure TForm1.btn1Click(Sender: TObject);
begin
   StaticBuildTree (tv1)
end;
//在窗体释放时一定要把树结点中的结构体指针给释放掉,对于在Dispose时为什么要进行强制转型后释放,以前有专门的讲解,在此不在累述
procedure TForm1.FormDestroy(Sender: TObject);
var
    i : Integer;
begin
  for i := 0 to tv1.Items.Count-1 do
  begin
       Dispose( PNodeInfoEx(tv1.Items[i].Data)  )
  end;
end;
end.

代码如下:

//如何访问树结点?
procedure TForm1.tv1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  pNode:TTreeNode;
begin
  pNode:=tv1.GetNodeAt(x,y);
  if (pNode<>nil) and  (Button=mbleft) then
   ShowMessage(PNodeInfoEx(pNode.Data)^.ChnNodeTitle);
end;

(0)

相关推荐

  • Delphi下OpenGL2d绘图之初始化流程详解

    一.前言: Delphi默认支持OpenGl,可以使用uses OpenGL单元进行引用,之后就可以使用OpenGL的函数.OpenGl是跨平台的,而且Windows很早就支持并集成在系统中,存在于system32中的opengl32.dll,不需要再额外进行安装.虽然windows本身有d3d,但是其能力有限,相关学习资料页相对较少. 通常OpenGL仅仅支持以下几种基本几何图形:点,线和多边形.没有表面或者更高级的图形(比如球状图形)能被作为基本图形元素绘制.但是它们能够用多边形来完美的模仿

  • Delphi7中Listview的常用功能汇总

    有些时候我们在使用Delphi7的Listview过程中总是要改一些默认的设置,现在把它们集中起来汇总如下. MultiSelect := True;   使Listview可以同时选择多行 GridLines := True;     使Listview显示格线 ViewStyle := vsReport; 显示数据项的详细列表 HideSelection := True;  使listview失去焦点时,选中行不高亮 //设置颜色 procedure TForm1.ListView1Cust

  • Delphi下OpenGL2d绘图之画点的方法

    一.前言 Delphi图形的绘制可以在glBegin().glEnd()之间完成,绘制的框架代码可以使用Delphi下OpenGL2d绘图的初始化代码,具体内容可参考本站http://www.jb51.net/article/52141.htm.修改的部份为 Draw 函数的内容. 二.画点 使用glPointSize 函数指定栅格化点的直径.默认为1.0,只在GL_POINTS下起作用,关于消锯齿等功能以后再研究.使用glBegin(GL_POINTS)告诉OpenGL画点,参数GL_POIN

  • Delphi下OpenGL2d绘图之画四边形的方法

    一.前言: Delphi实现画四边形的方法基本上与前几遍文字代码是相同的.其区别知识在于glBegin()的参数"GL_QUADS".绘制的框架代码可以使用Delphi下OpenGL2d绘图初始化中的代码,地址为http://www.jb51.net/article/52141.htm.修改的部份为 Draw 函数的内容. 二.画四边形方法: 使用GL_QUADS:绘制由四个顶点组成的一组单独的四边形.顶点4n-3.4n-2.4n-1和4n定义了第n个四边形.总共绘制N/4个四边形.这

  • delphi7连接mysql5的实现方法

    本文简单介绍了Delphi7连接MySQL数据库的实现方法,具体步骤如下: 首先先去下载:http://www.justsoftwaresolutions.co.uk/delphi/dbexpress_and_mysql_5.html 然后将下载到的dbxopenmysql5_dll.zip解压出来,再把dbxopenmysql50.dll和libmysql.dll都放到工程文件夹下. 在Form上放上TSQLConnection.TSQLQuery.TStringGrid.3个TButton.

  • Delphi下OpenGL2d绘图之画线的方法

    一.前言: Delphi画线方法与画点基本上是相同的.区别在于glBegin()的参数.绘制的框架代码可以参考Delphi下OpenGL2d绘图初始化中的代码,地址为http://www.jb51.net/article/52141.htm.修改的部份为 Draw 函数的内容. 二.画线步骤: GL_LINES:把每一个顶点作为一个独立的线段,顶点2n-1和2n之间共定义了n条线段,总共绘制N/2条线段 GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个

  • Delphi使用OpenGL2d绘图之画图片Bmp的方法

    一.前言: 对于Delphi来说,要画图片要先处理一下,需要引用别的单元,而Delphi中没带,需要另外下载Gl.pas.网上常见自带的OpenGl单元封装的是1.0版的,有此函数未声明.网上可以找到Gl.pas单元.另外需要一个Glaux.pas单元与glaux.dll,是辅助库.在本文最后会提供下载. 二.实现流程: 绘画图片需要以下几个流程.Window本身的绘图是以位图为基础的,png,jpg等,绘画时,可以转为bmp再画. 1.加载bmp图片:使用auxDIBImageLoadA或其他

  • Delphi 生成excel中饼图的实例代码

    复制代码 代码如下: var  i,j,m,n,count1:integer;  str:string;  Jdate:tdatetime;  channellist,potBstrtime,potEstrtime,Jchannelname:string;  Rres:boolean;  JSHR:double;  Excelid,achart1,cell1,cell2,cell3,cell4,cellMiddle,Range1,Range2,series1:variant;  ExRowsVa

  • C# 调用Delphi dll 实例代码

    delphi dll 源码: 复制代码 代码如下: library dllres; type     char10 = array[0..9] of char;     TMydata = packed record       id: Integer;       name: char10;       married: Boolean;       salary: Double;     end;    PMydata = ^TMydata; const    RESSTR: array[0

  • Delphi实现树型结构具体实例

    复制代码 代码如下: unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ComCtrls, DB, ADODB;type  PNodeInfoEx = ^TNodeInfoEx;  TNodeInfoEx = Packed Record      NodeID    : Integer;      Pare

  • JavaScript解析任意形式的json树型结构展示

    在页面展示json成树形结构时,往往得到的json不是ztree的规范格式,需要对json循环迭代解析.即使不规范的json也可以树形展现: var arrayJsonContent=[]; //节点类 var JsonNodes = { id:"", name:"", pId:"", content:"", //location:"", linklocation:"", open:fa

  • 实现论坛树型结构的具体算法

    实现论坛树型结构的算法很多,具体你可以去www.chinaasp.com的全文搜索中查询.我现在的JSP论坛采用的也是当中的一种:不用递归实现树型结构的算法,现在我将论坛树型结构的具体算法和大家介绍一下,和大家一起交流. 1.演示表的结构: 表名:mybbslist 字段 数据类型 说明 BBSID 自动编号  RootID Int 根帖ID,本身为根帖则RootID = ID FID Int 父帖ID,上一层帖子的ID,如是根帖则FID = 0 DEPTH Int 根帖Level=0,其他依据

  • asp实现树型结构

    蛙蛙推荐:asp实现树型结构     选择自 onlytiancai 的 Blog   关键字   蛙蛙推荐:asp实现树型结构  出处 <!--  -----------[test]表生成脚本--------------- if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo

  • 创建无限极分类树型结构的简单方法

    先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类信息(id:该分类的ID值,cate_name:该分类的名称,pid:父ID,sorts:为显示标题顺序排序做准备,可不写.) public function cate_display() { $cate = D('Cate'); $field = array('id','cate_name','p

  • 树型结构列出指定目录里所有文件的PHP类

    <? //以树型结构列出指定目录里的所有文件,如果你想知道自己某个目录里有哪些子目录和文件,可以调用这个类来查看,很方便的. # 演示的例子:     $t = new TreeClimber( "asp" ); //新建物件,设置需要列出的目录:在此为asp目录     echo arrayValuesToString( $t->getFileList( $t->getPath() ), "<BR>\n" ); function ar

  • PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例

    我们经常需要在关系型数据库中保存一些树状结构数据,比如分类.菜单.论坛帖子树状回复等.常用的方法有两种: 1. 领接表的方式: 2. 预排序遍历树方式: 假设树状结构如下图: 领接表方式 主要依赖于一个 parent 字段,用于指向上级节点,将相邻的上下级节点连接起来,id 为自动递增自动,parent_id 为上级节点的 id.一目了然,"Java"是"Language"的子节点. 我们要显示树,PHP 代码也可以很直观,代码如下: 复制代码 代码如下: <

  • SQL Server 通过with as方法查询树型结构

    一.with as 公用表表达式 类似VIEW,但是不并没有创建对象,WITH AS 公用表表达式不创建对象,只能被后随的SELECT语句,其作用: 1. 实现递归查询(树形结构) 2. 可以在一个语句中多次引用公用表表达式,使其更加简洁 二.非递归的公共表达式 可以是定义列或自动列和select into 效果差不多 --指定列 with withTmp1 (code,cName) as ( select id,Name from ClassUnis ) select * from withT

  • ajax+asp无限级分类树型结构(带数据库)

    IE测试通过,FF有点小BUG Cls_Leibie.asp 复制代码 代码如下: <% '数据库字段为类属性,添加.删除.修改.操作检查等函数为类的方法 Class Cls_Leibie Private nClassID,sClassName,nParentID,sParentPath,nDepth,nRootID,nChild,nOrderID,sFilePath '定义私有变量(类的属性,即数据库字段对应的变量) Private rs,sql,ErrorStr Private Sub Cl

  • ajax+asp无限级分类树型结构的代码

    复制代码 代码如下: <% '数据库字段为类属性,添加.删除.修改.操作检查等函数为类的方法 Class Cls_Leibie     Private nClassID,sClassName,nParentID,sParentPath,nDepth,nRootID,nChild,nOrderID,sFilePath '定义私有变量(类的属性,即数据库字段对应的变量)     Private rs,sql,ErrorStr Private Sub Class_Initialize()       

随机推荐