yndbtree控件

// cxg 2017-4-25

unit yndbtree;

interface

uses
SysUtils, Classes, ComCtrls, DB, Variants
;

type
PNodeRec = ^TNodeRec;

TNodeRec = record
id: string;
name: string;
pid: string;
formname: string; // formclassname
bplname: string;
end;

type
TynDBtree = class(TTreeView)
private
FDataSet: TDataSet;
FKeyID: string;
FKeyName: string;
FParentID: string;
procedure treeclick(sender: TObject);
protected
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure CreateTree;
published
property DataSet: TDataSet read FDataSet write FDataSet;
property KeyID: string read FKeyID write FKeyID;
property KeyName: string read FKeyName write FKeyName;
property ParentID: string read FParentID write FParentID;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('yongnan', [TynDBtree]);
end;

{ TynDBtree }

constructor TynDBtree.Create(AOwner: TComponent);
begin
inherited;
Self.OnClick := treeclick;
end;

procedure TynDBtree.CreateTree;
// table struct example: id,name,pid
var
List: TStringList;
Node: TTreeNode;
Index: Integer;
PNode: PNodeRec;
begin
if not FDataSet.Active or FDataSet.IsEmpty then
Exit;
Self.Items.Clear;
List := TStringList.Create;
try
List.Sorted := True;
FDataSet.First;
while not FDataSet.Eof do
begin
PNode := new(PNodeRec);
PNode^.id := FDataSet.FieldByName(FKeyID).Text;
PNode^.name := FDataSet.FieldByName(FKeyName).Text;
PNode^.pid := FDataSet.FieldByName(FParentID).Text;
if FDataSet.FindField('formname') <> nil then
PNode.formname := FDataSet.FindField('formname').AsString;
if FDataSet.FindField('bplname') <> nil then
PNode.bplname := FDataSet.FindField('bplname').AsString;
if (FDataSet.FieldByName(FParentID).Text = '') or (FDataSet.FieldByName(FKeyID).Text = FDataSet.FieldByName(FParentID).Text) then
// add root node
Node := Self.Items.AddChild(nil, FDataSet.FieldByName(FKeyName).Text)
else
begin
// add child node
Index := List.IndexOf(FDataSet.FieldByName(FParentID).Text);
Node := Self.Items.AddChild(TTreeNode(List.Objects[Index]), FDataSet.FieldByName(FKeyName).Text);
end;
Node.Data := PNode;
List.AddObject(FDataSet.FieldByName(FKeyID).Text, Node);
FDataSet.Next;
end;
finally
List.Free;
end;
end;

destructor TynDBtree.Destroy;
var
i: Integer;
Node: TTreeNode;
begin
for i := Self.Items.Count - 1 downto 0 do
begin
Node := Self.Items[i];
Dispose(PNodeRec(Node.Data));
end;
inherited;
end;

procedure TynDBtree.treeclick(sender: TObject);
begin
if Self.Selected <> nil then
FDataSet.Locate(FKeyID, VarArrayOf([PNodeRec(Self.Selected.Data)^.id]), []);
end;

end.

yndbtree控件的更多相关文章

  1. JS调用Android、Ios原生控件

    在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...

  2. HTML5 progress和meter控件

    在HTML5中,新增了progress和meter控件.progress控件为进度条控件,可表示任务的进度,如Windows系统中软件的安装.文件的复制等场景的进度.meter控件为计量条控件,表示某 ...

  3. 百度 flash html5自切换 多文件异步上传控件webuploader基本用法

    双核浏览器下在chrome内核中使用uploadify总有302问题,也不知道如何修复,之所以喜欢360浏览器是因为帮客户控制渲染内核: 若页面需默认用极速核,增加标签:<meta name=& ...

  4. JS与APP原生控件交互

    "热更新"."热部署"相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显 ...

  5. UWP开发必备:常用数据列表控件汇总比较

    今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...

  6. 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~

    一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...

  7. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  8. Windows API 设置窗口下控件Enable属性

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-put.html http://www.yuanjiaocheng.net/we ...

  9. VB.NET设置控件和窗体的显示级别

    前言:在用VB.NET开发射频检测系统ADS时,当激活已存在的目标MDI子窗体时,被其他子窗体遮住了,导致目标MDI子窗体不能显示. 这个问题怎么解决呢?网上看到一篇帖子VB.NET设置控件和窗体的显 ...

随机推荐

  1. ruby的代码风格

    http://stylesror.github.io/ 大部分同意,有小部分,不敢苟同.

  2. 黄聪:C#程序中判断是否处在DEBUG调试状态或者RELEASE发布状态

    习惯了用老方式(注释的方式)来对程序进行调试,不过昨天才发现这样调试存在很大的隐患:在工程发布的时候如果忘记把该注释的代码注释掉,而让这些调试信息随工程一起发布,如果是可见的调试信息倒好发现,如果不是 ...

  3. Unable to locate \.nuget\NuGet.exe 问题解决办法之一

    问题出现的原因是项目下.nuget文件夹下NuGet.exe文件夹不存在导致的 解决办法: 1.右键编辑NuGet.targets文件 将下载NuGet.exe的配置节点DownloadNuGetEx ...

  4. aix操作系统的版本中TL SP 含义

    AIX 分为四个主要的操作系统级别:版本.发行版.技术级 (TL) 和服务包 (SP).版本和发行版通常指的是 AIX 的名称,例如AIX 7.1.TL 是包含重大更新的操作系统的发行版,而 SP 包 ...

  5. samba性能调优

    不知道有多少公司的内部打印及文件服务器是用的Linux,我想肯定不会太多,因为Windows实现起来更方便,更快速,当然,Windows也 是更Danger. 因为Windows有太多不确定性的东西, ...

  6. ADO.Net学习总结

    一.讲述6个ADO.NET中的常用对象: Connection对象Command对象DataReader对象DataAdapter对象DataSet对象DataTable对象DataRow对象Data ...

  7. 创建标签的两种方法insertAdjacentHTML 和 createElement 创建标签 setAttribute 赋予标签类型 appendChild 插入标签

    1. 建立字符串和insertAdjacentHTML('beforeEnd', ) 2. 通过createElement 创建标签  setAttribute 赋予标签类型 appendChild ...

  8. Java里的堆(heap)栈(stack)和方法区(method)

    基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量 . 方法 ...

  9. javascript中defer的作用

    javascript中defer的作用 <script src="../CGI-bin/delscript.js" defer></script>中的def ...

  10. 【Git】三、工作区、暂存区、版本库

    一.基础概念 工作区:电脑中可以看到的目录,为电脑中的项目文件 暂存区:暂存修改的地方 版本库:存放项目的各个版本文件 二.详细介绍 工作区为我们工作所使用的目录,在工作区我们对项目文件进行增删改查. ...