操作TreeView(咏南工作室)
{*******************************************************}
{ }
{ 操作TreeView }
{ }
{ 版权所有 (C) 2008 咏南工作室 }
{ }
{*******************************************************}
//==============================================================================
// 本单元实现了TreeView与数据的关联,各方法形参如下:
//
// AId:为自增字段,用于标识节点的编号。
// AParentId:用来表示当前节点的父节点。
// ACaption:用来表示在树中所要显示的内容。
//==============================================================================
unit dbtree;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, ComCtrls, DB, ADODB;
{-------------------------------------------------------------------------------
过程名: MakeTree
说明: 创建树
作者: cxg
日期: 2008.08.21
参数: Query: TADOQuery; TableName: string; TreeView: TTreeView;AParentId,AId:string
返回值: 无
-------------------------------------------------------------------------------}
procedure MakeTree(Query: TADOQuery; TableName: string; TreeView: TTreeView;AParentId,AId:string);
{-------------------------------------------------------------------------------
过程名: AddNode
说明: 增加树的节点
作者: cxg
日期: 2004.12.07
参数: Query: TADOQuery; TreeView: TTreeView
参数说明: Query:相关联的数据库;TreeView: 所使用的树
返回值: 无
-------------------------------------------------------------------------------}
procedure AddNode(Query: TADOQuery; TreeView: TTreeView;AParentId,ACaption:string);
{-------------------------------------------------------------------------------
过程名: AddChildNode
说明: 增加树的子节点
作者: cxg
日期: 2004.12.07
参数: Query: TADOQuery; TreeView: TTreeView
参数说明: Query:相关联的数据库;TreeView: 所使用的树
返回值: 无
-------------------------------------------------------------------------------}
procedure AddChildNode(Query: TADOQuery; TreeView: TTreeView;AParentId,AId,ACaption:string);
{-------------------------------------------------------------------------------
过程名: AddTreeNode
说明: 增加节点(内部使用的过程)
作者: cxg
日期: 2004.12.07
参数: Query: TADOQuery; TreeView: TTreeView; bj: boolean = false
参数说明: Query:相关联的数据库;TreeView: 所使用的树;bj:是否将焦点移到当前选择的节点
返回值: 无
-------------------------------------------------------------------------------}
procedure AddTreeNode(Query: TADOQuery; TreeView: TTreeView; bj: boolean = false);
{-------------------------------------------------------------------------------
过程名: DelTree
说明: 删除节点(包括删除本节点下的所有子节点)
作者: cxg
日期: 2004.12.07
参数: query: TAdoQuery; TreeView: TTreeView
参数说明: Query:相关联的数据库;TreeView: 所使用的树
返回值: 无
-------------------------------------------------------------------------------}
procedure deltree(query: TAdoQuery; TreeView: TTreeView;AID:string);
{-------------------------------------------------------------------------------
过程名: Treechange
说明: 在树中选择了一个节点,将数据库的游标移动到所选择的节点所对应记录
作者: cxg
日期: 2004.12.07
参数: query: TADOQuery; node: TTreenode
参数说明: Query:相关联的数据库;TreeView: 所使用的树
返回值: 无
-------------------------------------------------------------------------------}
procedure Treechange(query: TADOQuery; node: TTreenode);
{-------------------------------------------------------------------------------
过程名: Treeedit
说明: 树中的节点内容已经作了修改,将所修改的内容更新回数据库
作者: cxg
日期: 2004.12.07
参数: query: TADOQuery; text: string
参数说明: Query:相关联的数据库;TreeView: 所使用的树
返回值: 无
-------------------------------------------------------------------------------}
procedure TreeEdit(query: TADOQuery; text: string;ACaption:string);
{-------------------------------------------------------------------------------
过程名: treeselect
说明: 数据库中的游标已经移动,将焦点移到树中对应的节点
作者: cxg
日期: 2004.12.07
参数: query: Tadoquery; TreeView: TTreeView
参数说明: Query:相关联的数据库;TreeView: 所使用的树
返回值: 无
-------------------------------------------------------------------------------}
procedure treeselect(query: Tadoquery; TreeView: TTreeView;AId:string);
{-------------------------------------------------------------------------------
函数名: TreeFind
说明: 找出给定的内容,并移动数据库中的游标,同时将焦点移到树中对应的节点
作者: cxg
日期: 2004.12.07
参数: TreeView: TTreeView; text: string
参数说明: TreeView: 所使用的树 text: 要查找的内容
返回值: True:找到 False:找不到
-------------------------------------------------------------------------------}
function TreeFind(TreeView: TTreeView; text: string): boolean;
implementation
var
List: TStringList; //用于记录各个id及其在树中所对应的节点,从而实现快速查找
procedure MakeTree(Query: TADOQuery; TableName: string; TreeView: TTreeView;AParentId,AId:string);
begin
TreeView.Items.BeginUpdate;
list.Clear;
TreeView.items.clear;
if query.Active then query.Close;
Query.SQL.Text := 'SELECT * FROM ' + TableName + ' ORDER BY '+AParentId+','+AId;
Query.Open;
query.DisableControls;
TreeView.Items.Clear;
list.Clear;
List.Sorted := True;
query.First;
while not Query.Eof do
begin
addtreenode(Query, TreeView); //依次增加所有的节点
Query.Next;
end;
TreeView.Items.EndUpdate;
query.EnableControls;
if treeview.Items.Count < 1 then exit;
treeview.Select(treeview.Items.Item[0]);
treeview.SetFocus;
end;
procedure addtreenode(Query: TADOQuery; TreeView: TTreeView; bj: boolean = false);
var
index: integer;
Node: TTreeNode;
begin
if Query.FieldByName('PID').AsInteger = 0 then { ParentID=0,顶层节点 }
Node := TreeView.Items.AddChildObject(nil, Query.FieldByName('CAPTION').AsString, query.GetBookmark)
//增加节点,并将本节点所对应的记录标签数据放到节点所提供的附加数据中
else
begin
Index := List.IndexOf(Query.FieldByName('PID').AsString);
Node := TreeView.Items.AddChildObjectFirst(TTreeNode(List.Objects[Index]),
Query.FieldByName('CAPTION').AsString, query.GetBookmark);
//增加子节点,并将本节点所对应的记录标签数据放到节点所提供的附加数据中
end;
//增加当前节点的信息到列表中,以实现在列表中快速查找节点的功能。
List.AddObject(Query.FieldByName('ID').AsString, Node);
if bj then
begin
treeview.Select(node);
treeview.SetFocus;
end;
end;
procedure deltree(query: TAdoQuery; TreeView: TTreeView;AID:string);
var
node: TTreenode;
//删除当前选择的节点下的所有节点(不删除当前选择的节点)
procedure delnode(node: TTreenode);
var
i: integer;
childnode: TTreenode;
begin
for i := 0 to node.Count - 1 do
begin
childnode := node.Item[i]; //取当前节点下的所有节点
query.GotoBookmark(childnode.Data); //移到节点所对应的记录
list.Delete(list.IndexOf(query.FieldByName(AID).AsString)); //删除列表中的数据
query.Delete; //删除对应的记录
if node.HasChildren then delnode(childnode); //有子节点则递归直到所有的数据删除完毕
end;
end;
begin
node := treeview.Selected;
if node = nil then exit;
//删除当前选择的节点下的所有节点(不删除当前选择的节点)
delnode(node);
//删除当前选择的节点
query.GotoBookmark(node.Data);
list.Delete(list.IndexOf(query.FieldByName(AID).AsString));
query.Delete;
node.Delete;
TreeView.SetFocus;
end;
procedure AddChildNode(Query: TADOQuery; TreeView: TTreeView;AParentId,AId,ACaption:string);
var
id: integer;
begin
id := query.FieldByName(AId).AsInteger; //记下当前的节点编号
query.Append;
query.FieldByName(AParentId).AsInteger := id; //新增加的子节点的父节点编号即为id
query.FieldByName(ACaption).AsString := '新子节点';
query.post;
addtreenode(query, treeview, true);
end;
procedure AddNode(Query: TADOQuery; TreeView: TTreeView;AParentId,ACaption:string);
var
pid: integer;
begin
pid := query.FieldByName(AParentId).AsInteger; //记下当前节点的父节点编号
query.Append;
query.FieldByName(AParentId).AsInteger := pid; //新增加的子节点的父节点编号即为pid
query.FieldByName(ACaption).AsString := '新节点';
query.post;
addtreenode(query, treeview, true);
end;
procedure Treechange(query: TADOQuery; node: TTreenode);
begin
query.GotoBookmark(node.Data);
end;
procedure TreeEdit(query: TADOQuery; text: string;ACaption:string);
begin
query.Edit;
query.FieldByName(ACaption).AsString := text;
query.post;
end;
procedure treeselect(query: Tadoquery; TreeView: TTreeView;AId:string);
var
index: integer;
Node: TTreeNode;
begin
Index := List.IndexOf(Query.FieldByName(AId).AsString);
Node := TTreeNode(List.Objects[Index]);
treeview.Selected := Node;
treeview.SetFocus;
end;
function TreeFind(TreeView: TTreeView; text: string): boolean;
var
i: integer;
begin
Result := false;
for i := 0 to treeview.Items.Count - 1 do
begin
if treeview.Items.Item[i].Text = text then
begin
treeview.Select(treeview.Items.Item[i]);
treeview.SetFocus;
Result := true;
exit;
end;
end;
end;
initialization
List := TStringList.Create;
finalization
list.Free;
end.
//调用演示(鼠标拖放移动节点)---------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
DB, ADODB, StdCtrls, ExtCtrls, Grids, DBGrids, ComCtrls, dialogs;
type
TForm1 = class(TForm)
TreeView1: TTreeView;
DBGrid1: TDBGrid;
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Splitter1: TSplitter;
Splitter2: TSplitter;
btn2: TButton;
Button4: TButton;
Edit1: TEdit;
ADOQuery: TADOQuery;
ds1: TDataSource;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
procedure Button3Click(Sender: TObject);
procedure TreeView1Edited(Sender: TObject; Node: TTreeNode; var S: string);
procedure btn2Click(Sender: TObject);
procedure DBGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button4Click(Sender: TObject);
procedure TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses dbtree;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
MakeTree(ADOQuery, 'dir', TreeView1,'pid','id'); //创建树
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
addnode(adoquery, treeview1,'pid','caption'); //增加节点
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
addchildnode(adoquery, treeview1,'pid','id','caption'); //增加子节点
end;
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
treechange(adoquery, node);
end;
procedure TForm1.TreeView1Edited(Sender: TObject; Node: TTreeNode;
var S: string);
begin
Treeedit(adoquery, s, 'caption');
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
deltree(adoquery, treeview1,'id'); //删除树
end;
procedure TForm1.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
treeselect(adoquery, treeview1,'id');
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if not TreeFind(treeview1,edit1.text) then
showmessage('找不到。');
end;
procedure TForm1.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := False ;
if (source is TTreeView) or (source is TListview) then
Accept := true ;
end;
procedure TForm1.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
tSrcNode ,tDesNode: TTreeNode ;
tSrcID ,tDesID : Integer ;
sSql : String ;
lSrcItem : TListItem ;
DestNodeId:string;
begin
tSrcID := 0 ;tDesID := 0 ;
tDesNode := TTreeview(Sender).GetNodeAt(X,Y);
Treechange(ADOQuery,tDesNode);
DestNodeId:=ADOQuery.FieldValues['id'];
if Source is TTreeview then
begin
TTreeview(Sender).Items.BeginUpdate;
tSrcNode := TTreeview(Source).Selected ;
tSrcNode.Moveto(tDesNode,naAddChild);
Treechange(ADOQuery,tSrcNode);
ADOQuery.Edit;
ADOQuery.FieldValues['pid']:=DestNodeId;
ADOQuery.Post;
TTreeview(Sender).Items.EndUpdate;
end
end;
end.
操作TreeView(咏南工作室)的更多相关文章
- SQL 数据库开发一些精典的代码(转自 咏南工作室)
1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as 2.数据库加密: s ...
- 咏南新CS三层开发框架
咏南新CS三层开发框架 咏南WEB桌面框架演示:47.106.93.126:9999 咏南WEB手机框架本地:47.106.93.126:8077 咏南CS框架下载:https://pan.baidu ...
- 咏南APP(手机)开发框架
咏南APP(手机)开发框架 有意者可向咏南索取DEMO. 基于DELPHI官方的FIREMONKEY类库构建,不使用任何三方控件. 原生手机框架,支持各种手机硬件操作. 主界面 聊天 照相并分享 短信 ...
- 咏南CS开发框架新的界面风格
咏南CS开发框架新的界面风格 这种风格完全和WINDOWS桌面一样,符合用户的操作习惯. 我的桌面的图标和WINDOWS桌面一样分为二类:1)快捷方式 2)文件夹. 如果快捷方式较多,看得人眼花缭乱 ...
- 咏南IOCP REST中间件
咏南IOCP REST中间件 让DELPHI7也能编写REST服务. 使用IOCP通信+UNIDAC数据库引擎. 客户端跨开发语言调用.
- 咏南IOCP中间件支持海量并发方案(集群)
咏南IOCP中间件支持海量并发方案(集群) 支持D7~XE10.1.1开发 支持负载均衡,自动故障转移 可以在不停机的状态下,根据负载情况灵活增加中间件机器 中间件使用IOCP通信,单中间件支持并发数 ...
- 咏南IOCP中间件
咏南IOCP中间件 特大好消息,咏南中间件系列新增加——咏南IOCP中间件.咏南IOCP中间件完全兼容咏南DATASNAP中间件的远程方法接口. 中间件DELPHI7~DELPHI XE10.1.1都 ...
- 咏南中间件+开发框架支持最新的DELPHI XE10.1(BERLIN) UPDATE1
咏南中间件+开发框架支持最新的DELPHI XE10.1(BERLIN) UPDATE1 购买提供:中间件源码,价格十分优惠!有意者请向本人索取演示程序! 附带福利(赠送): CS开发框架源码BS开发 ...
- 咏南WEB开发框架(FOR XE10.1 BERLIN)
咏南WEB开发框架(FOR XE10.1 BERLIN) 1)支持最新的XE10.1 BERLIN开发WEB程序 2)如同开发VCL WIN32程序一样的速度 3)WEB框架通过咏南中间件和数据库打交 ...
随机推荐
- linux(3)
一.用户和组的管理 Linux/Unix是多用户系统: root是超级用户,拥有最高权限.其它用户及权限由root来管理.对比Windows系统: 控制面板 -> 管理工具 -> 计算机管 ...
- linux 确定端口使用情况
lsof -i:3533 确定端口已经在使用
- 利用tycho插件自动生成pom文件
mvn org.eclipse.tycho:tycho-pomgenerator-plugin:generate-poms -DgroupId=com.vogella.tychoexample com ...
- [Google Guava] 7-原生类型
原文链接 译文链接 译者:沈义扬,校对:丁一 概述 Java的原生类型就是指基本类型:byte.short.int.long.float.double.char和boolean. 在从Guava查找原 ...
- 1、python--第一天练习题
#1.使用while循环输入 1 2 3 4 5 6 8 9 10 k = 0 while k < 10: k += 1 if k == 7: continue print(k) #2.求1-1 ...
- [AH2017/HNOI2017]抛硬币(扩展lucas)
推式子+exlucas. 题意: 小 A 和小 B 是一对好朋友,两个人同时抛 b 次硬币,如果小 A 的正面朝上的次数大于小 B 正面朝上的次数,则小 A 获胜. 小 A 决定在小 B 没注意的时候 ...
- ora-28002
1.查看指定概要文件(如default)的密码有效期设置: SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_na ...
- [Luogu] 矩形覆盖
https://www.luogu.org/problemnew/show/P1034 数据太水 爆搜过掉 #include <iostream> #include <cstdio& ...
- [Luogu] 消息扩散
https://www.luogu.org/problemnew/show/2002 Tarjan 缩点 + 入度判断 #include <iostream> #include <c ...
- 2018 Nowcoder Multi-University Training Contest 10
Practice Link J. Rikka with Nickname 题意: 给出\(n\)个字符串,要求依次合并两个串\(s, t\),满足将\(t\)合并到\(s\)中变成\(r\),使得\( ...