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设置控件和窗体的显 ...
随机推荐
- java之mail发送
一.邮箱的应用在实际的Java开发过程中,也是非常常见的.我这里就是写了一个简单的邮箱发送功能. 二.邮箱的基本配置,使用的是JavaMailSender的提供的方式来实现邮件的发送 1)qq邮箱的配 ...
- 软件测试——等价类划分(EditText * 3)
一.程序要求 EditBox 同时允许输入三个1到6个英文字符或数字,点击确定结束. 二.测试分析 编号 第一个输入框 第二个输入框 第三个输入框 输出 1 null null null 三个输入框均 ...
- ubuntu,debian root密码忘记破解
开机启动的时候在grub引导时,按住e进行启动项编辑,修改开头有linux字符及最后又ro字符的行,将ro字符改为rw single init=/bin/bash按F10键进行启动即可进入单用户模式, ...
- 「小程序JAVA实战」小程序的分享和下载功能(69)
转自:https://idig8.com/2018/09/25/xiaochengxujavashizhanxiaochengxudefenxianghexiazaigongneng68/ 在小程序上 ...
- 「小程序JAVA实战」小程序视频组件与api介绍(51)
转自:https://idig8.com/2018/09/22/xiaochengxujavashizhanxiaochengxushipinzujianyuapijieshao50/ 这次说下,小程 ...
- php使用curl库进行ssl双向认证
官方文档: http://www.php.net/manual/zh/function.curl-setopt.php#10692 官方举例: <?phpcurl_setopt($ch, CUR ...
- XMLHttpRequest.status 返回服务器状态码
XMLHttpRequest.status: 1xx-信息提示 这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个1xx响应. 100-继续. 101-切换协议. 2xx-成功 ...
- 向ArcGIS的ToolBarControl中添加任意的windows组建的方法[转]
向ArcGIS的ToolBarControl中添加任意的windows组建的方法[转] Link: http://www.cnblogs.com/mymhj/archive/2012/10/12/27 ...
- 新手C#重载、重写的学习2018.08.04
重载:在同一类(class)中,使用相同的方法名称,不同的参数和(不一定)不同的返回值类型构造成的方法. 举例: class OverLoadTest { public void Hello() { ...
- better-scroll的用法,及其中的一个属性event._constructed详解
better-scroll是一个页面滚动插件,用它可以很方便的实现下拉刷新,锚点滚动等功能. 实现原理:父容器固定高度,并设置overflow:hidden,子元素超出父元素高度后将被隐藏,超出部分可 ...