delphi中递归算法构建treeView(查询数据库在递归函数内部)

原创 2006年05月17日 09:20:00

delphi中递归算法构建treeView

过程:
通过读取数据库中table1的数据,来构建一颗树。table1有两个字段:ID,preID,即当前结点标志和父结点标志。所以整个树的表示为父母表示法。本递归算法不难写,但是要注意:程序内部的变量都应使用局部变量!比如当Query是外部变量(函数外定义或者直接通过控件拖拽得来)时就会得到错误的结果。代码如下:

 


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    tree: TTreeView;
    Query1: TADOQuery;
    procedure Button1Click(Sender: TObject);
    procedure CreateTree;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  PTNodeInfo=^TNodeInfo;
  TNodeInfo=record
   id,preId:string;
   end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.CreateTree;

  procedure CreateTree(Pre:string;preNode:TTreeNode);
  var
    pInfo:PTNodeInfo;
    node:TTreeNode;
    sql:string;
    Query:TADOQUery;
  begin
    Query:=TADOQuery.Create(nil);
    Query.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:/实验/递归父母表示/新建 Microsoft Office Access 应用程序.mdb;Persist Security Info=False';
    sql:= Format('select * from table1 where preId=%s', [QuotedStr(pre)]);
    Query.Close;
    Query.SQL.Clear;
    Query.SQL.Add(sql);
    Query.Open;
    Query.First;
    while not Query.Eof do
    begin
      new(pInfo);
      pInfo.id:=Query.Fields[0].AsString;
      pInfo.preId:=Query.Fields[1].AsString;
      node:=tree.Items.AddChild(preNode,pInfo.id);
      node.Data:=pInfo;
      CreateTree(pInfo.id,node);
      Query.Next;
    end;
    Query.Close;
    Query.Free;
  end;
begin
  createTree('000',nil);
  tree.FullExpand;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  createtree;
end;

end.

 

createTree函数也可以这么写:
procedure TForm1.CreateTree;
var
  p:pTNodeInfo;
  procedure CreateTree(Pre:PTNodeInfo;preNode:TTreeNode);
  var
    pInfo:pTNodeInfo;
    node:TTreeNode;
    sql:string;
    Query:TADOQuery;
  begin
    Query:=TADOQuery.Create(nil);
    Query.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:/实验/递归父母表示/新建 Microsoft Office Access 应用程序.mdb;Persist Security Info=False';
    sql:= 'select * from table1';
    Query.Close;
    Query.SQL.Clear;
    Query.SQL.Add(sql);
    Query.Open;
    Query.First;
    while not Query.Eof do
    begin
      new(pInfo);
      pInfo.id:=Query.Fields[0].AsString;
      pInfo.preId:=Query.Fields[1].AsString;
      if pInfo.preId=pre.id then
      begin
        node:=tree.Items.AddChild(preNode,pInfo.id);
        node.Data:=pInfo;
        CreateTree(pInfo,node);
      end;
      Query.Next;
    end;
  end;
begin
  new(p);
  p.id:='000';
  createTree(p,nil);
  tree.FullExpand;
end;

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi 中递归生成TreeView节点的方法

在数据库中建一张表,包含:NodeName,NodeId,ParentId 3个字段,具体什么含义,一看就知了。 过程如下: procedure TFRM_channel.formtreenode...

根据数据库结构生成TreeView

现在大多数的方法是采用递归,但这种操作会频繁的去select数据库,降低了执行效率,稍微改动一些,效果会好不少,这里介绍一种方法,即一次性select出所有数据,然后按照ParentID排序,逐条添加...

在DELPHI中用TreeView控件从数据库中动态装载信息

1.PInfo表结构ID VARCHAR(50)FullName VARCHAR(50)ParentID VARCHAR(50)2.Unit文件unit Info;interfaceuses  Win...

Delphi 7 中使用RAVE报表(七)

Delphi 7 中使用RAVE报表(七)----  一些技巧作为《Delphi 7 中使用RAVE报表》的最后,整理一些技巧给大家。1.设计好的Rave报表文件如何打包到EXE文件中?       ...

一个方便有用的Delphi数据库操作类(转)

unit MyADO;interfaceusesSysUtils, Classes,ADODB,DB,Variants,StdCtrls,Dialogs;typeTMyADO = class(TCom...

C#中处理treeview相关的类函数和过程汇总(采用递归算法,支持无限级节点)

using System.Data; using System.Data.Common; using System.IO; using System.IO.Compression; using...
  • postfxj
  • postfxj
  • 2014年10月08日 16:25
  • 613

winform treeview checkbox----递归算法利用

现勒,请看 using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat...

delphi编写的数独递归算法

  • 2017年07月04日 00:03
  • 499KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:delphi中递归算法构建treeView(查询数据库在递归函数内部)
举报原因:
原因补充:

(最多只允许输入30个字)