自己写的一个有关树形结构的函数,与大家共享.

procedure MakeTreeEx(Query: TadoQuery; TreeView: TTreeView;
  DisplayName:string;Id:string;pid:string);
type
  recNode=record
    Id:string;
    Name:string;
    PId:string;
  end;
  PRecNode=^recnode;
  {递归算法要有终止的条件}
  procedure AppendChild(var treeview:TTreeView;node:TTreeNode;
    var strlst:TStringList);
  var
    strTmp:string;
    i:Integer;
    nodeTmp:TTreeNode; {子结点}
    ps:pstring;
  begin

//ShowMessage(strlst.Text+'要查找的PID是:'+pstring(node.Data)^);

while strlst.IndexOf(trim(pstring(node.Data)^))<>-1 do
    begin
      i:=strlst.IndexOf(pstring(node.Data)^);
      ps:=NewStr(precnode(strlst.Objects[i])^.Id);
      nodetmp:=TreeView.Items.AddChildObject(node,precnode(strLst.Objects[i])^.Name,
        ps);
      Dispose(precnode(strlst.objects[i]));
      strlst.Delete(i);
      {原先此处误写成node,让我调试了半天,郁闷}
      AppendChild(treeview,nodetmp,strlst);
    end;  
  end;
var
  List: TStringList;
  Node: TTreeNode;
  Index: Integer;
  ps:pstring;//指针
  prec:PRecNode;
  i:Integer;
begin
  TreeView.Items.BeginUpdate;
  try
    TreeView.Items.Clear;

List := TStringList.Create;
    try
      List.Sorted := True;
      {此句非常重要,默认为dupIgnore,如有重复记录则忽略}
      list.Duplicates:=dupAccept;
      {先遍历一边query,获取所有记录}
      Query.First;
      while not Query.Eof do
      begin
        {保存数据}
        New(prec); {每删除一条记录时,要保证将其保存的数据也一同删除}
        prec^.Id:=Query.fieldbyname(Id).AsString;
        prec^.PId:=Query.fieldbyname(pid).asstring;
        prec^.Name:=Query.fieldbyname(DisplayName).asstring;
        List.AddObject(Query.FieldByName(pid).AsString,TObject(prec));
        Query.Next;
      end;
      showint(list.count);
      while List.IndexOf('0')<>-1 do
      begin
        i:=List.IndexOf('0');

ps:=NewStr(Trim(precnode(List.Objects[i])^.Id));
        node:=TreeView.Items.AddChildObject(nil,precnode(List.Objects[i])^.Name,
          ps);
        Dispose(precnode(List.Objects[i]));
        List.Delete(i);
        AppendChild(TreeView,node,list);
        //AppendChild(list,node);
      end;

finally
      for i:=0 to List.Count-1 do
      begin
        Dispose(precnode(List.objects[i]));
      end;
      List.Free;
    end;
  finally
    TreeView.Items.EndUpdate;
  end;
end;

一个自己写的有关数据库的treeview.相关推荐

  1. shell备份mysql思路_写一个shell脚本备份mysql数据库的步骤

    写一个shell脚本备份mysql数据库的步骤 发布时间:2020-05-25 15:47:41 来源:51CTO 阅读:221 作者:三月 下文我给大家简单讲讲关于写一个shell脚本备份mysql ...

  2. 一个好用的ODBC数据库类CMYODBC

    一个好用的ODBC数据库类CMYODBC 一.引言 感觉MFC的CRecordset类不是很好用,因为我们要想使用的话必须为每个查询从CRecordset类派生出一个新类,或者进行动态数据交换.在VC ...

  3. PolarFS :一个用于共享存储云数据库的超低延迟和容错分布式文件系统

    目录 1. 简介 2. 背景 3. 架构 4. I/O 执行模型 5. 一致性模型 6. FS中层的实现 7. 设计选择和经验教训 8. 价值评估 9. 相关工作 10. 结论 PolarFS : A ...

  4. 数据库创建(利用写好的数据库表生成创建表的sql语句+利用生成的数据库创建表加同步数据sql)

    一.利用写好的数据库表生成创建表的sql语句 1.简单创建一个数据库,并建一个表,并编辑数据. a.建库 b.建表 c.编辑表,保存时输入表名 d.刷新一下,出来了 e.转存导出sql文件. 二.利用 ...

  5. TiFlash:并非另一个 T + 1 列存数据库

    摘要:TiFlash 是配合 TiDB 体系的列存引擎,它和 TiDB 无缝结合,在线 DDL.无缝扩容.自动容错等等方便运维的特点也在 TiFlash 中得到继承,此外,TiFlash 可以实时与行 ...

  6. 数据库表TreeView树的快速生成

    数据库表TreeView树的快速生成 根据数据表的内容生成TreeView树状结构,通常的做法就是从顶级开始,然后逐项递归查询遍历生成.这种方法在实现上容易做到,也很容易想到,但是效率比较低,因为数据 ...

  7. 破解一个已经连接好的数据库密码

    如果想要破解一个已经连接好的数据库密码,可以参考这个方法. 一.查看navicat保存的密码 1. 进入注册表 win + R 输入 regedit 回车 2.找到 navicat 中存储的密码 HK ...

  8. 匪夷所思!意念「返生」熟鸡蛋论文引争议,新华社:一个敢写一个敢发

    来源|雷锋网 文|付静 近日,一篇来自郑州市春霖职业培训学校的研究成果引发网友热议.该校一篇题为<熟鸡蛋变成生鸡蛋(鸡蛋返生)-孵化雏鸡的实验报告>的论文,收录在 2020 年 6 月第 ...

  9. redis进阶:mysql,redis双写一致性,数据库更新后再删除缓存就够了吗?

    0. 引言 最近线上的一个状态修改功能出现了问题,一开始是运营找了过来,运营告知某条数据的状态已经开启了的,但是实际使用起来还是没有生效,于是拿到这个问题后,首先就去数据库查了这条数据,发现确实如他所 ...

最新文章

  1. 汇编语言---冒泡排序
  2. 算法-----最大子序和(Java 版本)
  3. ML_Random_Forests
  4. Introduction to the Service Provider Interfaces--官方文档
  5. Tip:强制执行exchange DAG节点之间的数据库副本移动
  6. [NodeJs] 如果发现node_modules中有个模块代码有bug,你该怎么办?
  7. visual c++ 技术资料(网络收集)
  8. Spring MVC重定向和转发
  9. 字符数组的初始化与赋值
  10. python爬虫菜鸟教程-Python 应该怎么学?
  11. python 正则表达式语法大全_Python正则表达式知识汇总
  12. CIO如何计算信息化的投资回报率?
  13. Horner规则求多项式
  14. java 判断域密码到期提醒_域帐号密码过期邮件提醒
  15. mac中idea使用createNewFile创建文件
  16. ESC云服务器搭建自己的图床
  17. 手动设置网页cookie的值
  18. 浅析多元回归中的“三差”:离差(Deviation)、残差(Residual)与误差(Error)
  19. 计算机启动如何改变默认硬盘,如何把硬盘设置为第一启动项怎么修改的
  20. ATX安装及简单使用

热门文章

  1. 字体中字号,磅值和mm之间的转换
  2. hdu 3790(最短路)
  3. hdu-5068 Harry And Math Teacher
  4. NYOJ 514 1的个数
  5. linux 使用buildroot制作文件系统
  6. 用JPA在测试的时候无法创建EntityManager Factory无法创建的几个可能因素!
  7. 使用Amanda ZRM备份远程MySQL数据库
  8. Android sendevent/getevent 用法
  9. mac之brew安装卸载使用
  10. js数据类型判断和数组判断