yndbtree控件
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控件的更多相关文章
- JS调用Android、Ios原生控件
在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...
- HTML5 progress和meter控件
在HTML5中,新增了progress和meter控件.progress控件为进度条控件,可表示任务的进度,如Windows系统中软件的安装.文件的复制等场景的进度.meter控件为计量条控件,表示某 ...
- 百度 flash html5自切换 多文件异步上传控件webuploader基本用法
双核浏览器下在chrome内核中使用uploadify总有302问题,也不知道如何修复,之所以喜欢360浏览器是因为帮客户控制渲染内核: 若页面需默认用极速核,增加标签:<meta name=& ...
- JS与APP原生控件交互
"热更新"."热部署"相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显 ...
- UWP开发必备:常用数据列表控件汇总比较
今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...
- 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~
一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...
- 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)
前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...
- Windows API 设置窗口下控件Enable属性
参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-put.html http://www.yuanjiaocheng.net/we ...
- VB.NET设置控件和窗体的显示级别
前言:在用VB.NET开发射频检测系统ADS时,当激活已存在的目标MDI子窗体时,被其他子窗体遮住了,导致目标MDI子窗体不能显示. 这个问题怎么解决呢?网上看到一篇帖子VB.NET设置控件和窗体的显 ...
随机推荐
- (转)TreeSet简单介绍与使用方法
TreeSet简介 TreeSet是JAVA中集合的一种,TreeSet 是一个有序的集合,它的作用是提供有序的Set集合.它继承于AbstractSet抽象类,实现了NavigableSet< ...
- C++ 实例化对象 p->printX()
一.从栈实例化对象 我们首先定义一个类,类的名字叫TV,里面包括两个成员变量,两个成员函数. class TV // 定义一个电视的类TV { public: ]; // 定义类的属性,一个数组 in ...
- 利用spring的CommonsMultipartResolver上传文件
1.CommonsMultipartResolver是spring里面提供的一个上传方式,效率我不知道,但是加入spring容器管理还是很不错的. 2.先看依赖包pom.xml <project ...
- Oracle DSI系列 01 DSI初识BBED
DSI是Data Server Internals的缩写,是Oracle公司内部用来培训Oracle售后工程师使用的教材. 1 bbed工具使用BBED工具介绍BBED stands for Bloc ...
- pythonNet08
线程通信 通信方法:多个线程共用进程空间,所以进程的全局变量对进程内线程均可见.线程往往使用全局变量进行通信 注意事项:线程间使用全局变量进行通信,全局变量为共享资源,往往需要同步互斥机制 线程的同步 ...
- Oracle数据库LOGGING&NOLOGGING模式概述
1.日志记录模式(LOGGING .FORCE LOGGING .NOLOGGING) 1.1三者的含义 LOGGING:当创建一个数据库对象时将记录日志信息到联机重做日志文件.LOGGING实际上是 ...
- dd命令的conv=fsync,oflag=sync/dsync
conv的参数有 1.sync Pad every input block to size of 'ibs' with trailing zero bytes. When used with 'blo ...
- pdf转换成可在线浏览的电子杂志zmaker_pdf
zmaker是曾经国内最流行的电子杂志制作软件,可惜可惜,不过幸好有人给发布了 最新版的 其实主要是2个流程 一个是软件的安装 软件的下载和安装请参考 官方教材 http://bbs.emaghome ...
- SQL Server数据库partition by 与ROW_NUMBER()函数使用详解[转]
关于SQL的partition by 字段的一些用法心得 先看例子: if object_id('TESTDB') is not null drop table TESTDB create table ...
- .NET 同步 异步 委托
1.定义委托: using System; using System.Collections.Generic; using System.IO; using System.Linq; using Sy ...