1 Star 0 Fork 10

joliny/dbooks

forked from mellen/dbooks 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
dbtree.pas 12.62 KB
一键复制 编辑 原始数据 按行查看 历史
sfm 提交于 2023-05-18 08:12 . 控件
{*******************************************************}
{ }
{ 操作TreeView }
{ }
{ 版权所有 (C) 2008 咏南工作室 }
{ }
{*******************************************************}
//==============================================================================
// 本单元实现了TreeView与数据的关联,各方法形参如下:
//
// AId:为自增字段,用于标识节点的编号。
// AParentId:用来表示当前节点的父节点。
// ACaption:用来表示在树中所要显示的内容。
//==============================================================================
unit dbtree;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, ComCtrls, DB, ADODB,UnitData2,UniProvider,SQLiteUniProvider,Uni, MemDS;
{-------------------------------------------------------------------------------
过程名: MakeTree
说明: 创建树
作者: cxg
日期: 2008.08.21
参数: Query: TADOQuery; TableName: string; TreeView: TTreeView;AParentId,AId:string
返回值: 无
-------------------------------------------------------------------------------}
procedure MakeTree(Query: TUniQuery; TableName: string; TreeView: TTreeView;AParentId,AId:string);
{-------------------------------------------------------------------------------
过程名: AddNode
说明: 增加树的节点
作者: cxg
日期: 2004.12.07
参数: Query: TADOQuery; TreeView: TTreeView
参数说明: Query:相关联的数据库;TreeView: 所使用的树
返回值: 无
-------------------------------------------------------------------------------}
procedure AddNode(Query: TUniQuery; TreeView: TTreeView;AParentId,ACaption,s:string);
{-------------------------------------------------------------------------------
过程名: AddChildNode
说明: 增加树的子节点
作者: cxg
日期: 2004.12.07
参数: Query: TADOQuery; TreeView: TTreeView
参数说明: Query:相关联的数据库;TreeView: 所使用的树
返回值: 无
-------------------------------------------------------------------------------}
procedure AddChildNode(Query: TUniQuery; TreeView: TTreeView;AParentId,AId,ACaption,s:string);
{-------------------------------------------------------------------------------
过程名: AddTreeNode
说明: 增加节点(内部使用的过程)
作者: cxg
日期: 2004.12.07
参数: Query: TADOQuery; TreeView: TTreeView; bj: boolean = false
参数说明: Query:相关联的数据库;TreeView: 所使用的树;bj:是否将焦点移到当前选择的节点
返回值: 无
-------------------------------------------------------------------------------}
procedure AddTreeNode(Query: TUniQuery; TreeView: TTreeView; bj: boolean = false);
{-------------------------------------------------------------------------------
过程名: DelTree
说明: 删除节点(包括删除本节点下的所有子节点)
作者: cxg
日期: 2004.12.07
参数: query: TAdoQuery; TreeView: TTreeView
参数说明: Query:相关联的数据库;TreeView: 所使用的树
返回值: 无
-------------------------------------------------------------------------------}
procedure deltree(query: TUniQuery; TreeView: TTreeView;AID:string);
{-------------------------------------------------------------------------------
过程名: Treechange
说明: 在树中选择了一个节点,将数据库的游标移动到所选择的节点所对应记录
作者: cxg
日期: 2004.12.07
参数: query: TADOQuery; node: TTreenode
参数说明: Query:相关联的数据库;TreeView: 所使用的树
返回值: 无
-------------------------------------------------------------------------------}
procedure Treechange(query: TUniQuery; node: TTreenode);
{-------------------------------------------------------------------------------
过程名: Treeedit
说明: 树中的节点内容已经作了修改,将所修改的内容更新回数据库
作者: cxg
日期: 2004.12.07
参数: query: TADOQuery; text: string
参数说明: Query:相关联的数据库;TreeView: 所使用的树
返回值: 无
-------------------------------------------------------------------------------}
procedure TreeEdit(query: TUniQuery; text: string;ACaption:string);
{-------------------------------------------------------------------------------
过程名: treeselect
说明: 数据库中的游标已经移动,将焦点移到树中对应的节点
作者: cxg
日期: 2004.12.07
参数: query: Tadoquery; TreeView: TTreeView
参数说明: Query:相关联的数据库;TreeView: 所使用的树
返回值: 无
-------------------------------------------------------------------------------}
procedure treeselect(query: TUniQuery; TreeView: TTreeView;AId:string);
{-------------------------------------------------------------------------------
函数名: TreeFind
说明: 找出给定的内容,并移动数据库中的游标,同时将焦点移到树中对应的节点
作者: cxg
日期: 2004.12.07
参数: TreeView: TTreeView; text: string
参数说明: TreeView: 所使用的树 text: 要查找的内容
返回值: True:找到  False:找不到
-------------------------------------------------------------------------------}
function TreeFind(TreeView: TTreeView; text: string): boolean;
function checkrecord(): boolean;
function gettopid():string;
function inserttop():boolean;
function getid(caption:string):string;
function getpid(caption:string):string;
implementation
var
List: TStringList; //用于记录各个id及其在树中所对应的节点,从而实现快速查找
procedure MakeTree(Query: TUniQuery; TableName: string; TreeView: TTreeView;AParentId,AId:string);
begin
TreeView.Items.BeginUpdate;
list.Clear;
TreeView.items.clear;
if query.Active then query.Close;
if Trim(TableName)='DocData' then begin
Query.SQL.Text := 'SELECTid,docText,Description,MemoText,Caption,Subject,HtmlMode,UserID ,createTime,LastModified from INdexData ORDER BY '+AParentId+','+AId;
end else if Trim(TableName)='IndexData' then begin
Query.SQL.Text := 'select id,pid,NodeLevel,NodeCaption,NodeKind,NodeIndex,Subject,UserId ORDER BY '+AParentId+','+AId;
end else begin
Query.SQL.Text := 'SELECT * FROM ' + TableName + ' ORDER BY '+AParentId+','+AId;
end;
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: TUniQuery; TreeView: TTreeView; bj: boolean = false);
var
top,index: integer;
Node: TTreeNode;
begin
top:=strtoint(gettopid);
if Query.FieldByName('PID').AsInteger = top 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;
function checkrecord:boolean;
var
q1:TUniQuery;
begin
Q1:=TUniQuery.Create(nil);
//q1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=fxcd.mdb;Persist Security Info=False';
q1.Connection:=datadb2.ADOConnection1;
Q1.SQL.Text := 'SELECT * FROM booklink where id=pid ';
Q1.Open;
if Q1.RecordCount=1 then result:=true
else result:=false;
q1.SQL.Clear;
q1.free;
end;
function gettopid:string;
var
q1:TUniQuery;
begin
Q1:=TUniQuery.Create(nil);
//q1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=fxcd.mdb;Persist Security Info=False';
q1.Connection:=datadb2.ADOConnection1;
Q1.SQL.Text := 'SELECT * FROM booklink where id=pid ';
Q1.Open;
result:=q1.FieldByName('id').AsString;
q1.free;
end;
function inserttop():boolean;
var
q1:TUniQuery;
begin
Q1:=TUniQuery.Create(nil);
//q1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=fxcd.mdb;Persist Security Info=False';
q1.Connection:=datadb2.ADOConnection1;
q1.SQL.Clear;
q1.SQL.add('insert into booklink(caption) values('+''''+'资料'+''''+')');
q1.ExecSQL;
q1.SQL.Clear;
q1.SQL.add('update booklink set pid=id ');
q1.ExecSQL;
q1.SQL.Clear;
q1.free;
end;
function getpid(caption:string):string;
var
q1:TUniQuery;
begin
Q1:=TUniQuery.Create(nil);
//q1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=fxcd.mdb;Persist Security Info=False';
q1.Connection:=datadb2.ADOConnection1;
q1.SQL.Clear;
q1.SQL.add('select pid from booklink where caption='+''''+caption+'''');
q1.open;
result:=q1.FieldByName('pid').AsString;
q1.free;
end;
function getid(caption:string):string;
var
q1:TUniQuery;
begin
Q1:=TUniQuery.Create(nil);
//q1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=fxcd.mdb;Persist Security Info=False';
q1.Connection:=datadb2.ADOConnection1;
q1.SQL.Clear;
q1.SQL.add('select id from booklink where caption='+''''+caption+'''');
q1.open;
result:=q1.FieldByName('id').AsString;
q1.free;
end;
procedure deltree(query: TUniQuery; 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: TUniQuery; TreeView: TTreeView;AParentId,AId,ACaption,s:string);
var
id: integer;
begin
id := query.FieldByName(AId).AsInteger; //记下当前的节点编号
query.Append;
query.FieldByName(AParentId).AsInteger := id; //新增加的子节点的父节点编号即为id
query.FieldByName(ACaption).AsString := (s);
query.post;
addtreenode(query, treeview, true);
end;
procedure AddNode(Query: TUniQuery; TreeView: TTreeView;AParentId,ACaption,s:string);
var
pid: integer;
begin
if checkrecord =true then begin
pid := query.FieldByName(AParentId).AsInteger; //记下当前节点的父节点编号
query.Append;
query.FieldByName(AParentId).AsInteger := pid; //新增加的子节点的父节点编号即为pid
query.FieldByName(ACaption).AsString := (s);
query.post;
addtreenode(query, treeview, true);
end else begin
inserttop();
// addtreenode(query, treeview, true);
end;
end;
procedure Treechange(query: TUniQuery; node: TTreenode);
begin
query.GotoBookmark(node.Data);
end;
procedure TreeEdit(query: TUniQuery; text: string;ACaption:string);
begin
query.Edit;
query.FieldByName(ACaption).AsString := (text);
query.post;
end;
procedure treeselect(query: TUniQuery; 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.
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/jbakwd/dbooks.git
git@gitee.com:jbakwd/dbooks.git
jbakwd
dbooks
dbooks
master

搜索帮助

D67c1975 1850385 1daf7b77 1850385