📄 pdetreeview.pas
字号:
//SQL语句规则:
//第一列为节点ID;
//第二列为父节点ID;
//第三列为当前节点Caption;
//第四列为节点类型(决定Imageindex);
//第五列如果存在为节点Key;
//第六列如果存在为节点Tag;
unit PDETreeView;
interface
uses
SysUtils, Classes, Controls, ComCtrls, ADODB, Windows;
type
TPDETreeView = class(TTreeView)
private
{ Private declarations }
FADOconn:TADOConnection;
function TreeFindItem(NodeItem: TTreeNode; ID: String): TTreeNode;
protected
{ Protected declarations }
public
{ Public declarations }
procedure TreeAddItem(ItemList: TStrings);
procedure TreeModifyItem(ItemList: TStrings);
procedure TreeRemoveItem();
procedure TreeRemoveItemByID(ID:String);
procedure TreeMoveItem(ParentID:string;ID:String);
procedure TreeCreate(strSql: String);
procedure TreeLocation(ID:String);
function GetTreeNodeID():String;overload;
function GetTreeNodeKey():String;overload;
function GetTreeNodeTag():String;overload;
function GetTreeNodeID(ID:string):String;overload;
function GetTreeNodeKey(ID:string):String;overload;
function GetTreeNodeTag(ID:string):String;overload;
function GetParentTreeNodeID():String;
function GetParentTreeNodeKey():String;
function GetParentTreeNodeTag():String;
published
{ Published declarations }
property ADOconn:TADOConnection Read FADOconn Write FADOconn;
end;
procedure Register;
implementation
type
PTNKEY = ^TTREENODEKEY;
TTREENODEKEY = record
ID:string;
Key:string;
Tag:string;
End;
procedure Register;
begin
RegisterComponents('PDE', [TPDETreeView]);
end;
//查找父节点
function TPDETreeView.TreeFindItem(NodeItem: TTreeNode; ID: String): TTreeNode;
begin
if NodeItem = nil then NodeItem := Self.items.getfirstnode
else NodeItem := NodeItem.getfirstchild;
if (NodeItem <> nil) and (PTNKEY(NodeItem.Data)^.ID <> ID) then
repeat
NodeItem := NodeItem.GetNext;
until (NodeItem = nil) or (PTNKEY(NodeItem.Data)^.ID = ID);
Result := NodeItem;
end;
//增加树节点
procedure TPDETreeView.TreeAddItem(ItemList: TStrings);
var
NewNode,ThisNode: TTreeNode;
FKey: PTNKEY;
begin
New(FKey);
FKey^.ID := ItemList[0];
if ItemList.Count >= 5 then
FKey^.Key := ItemList[4]
else
FKey^.Key := '';
if ItemList.Count >= 6 then
FKey^.tag := ItemList[5]
else
FKey^.tag := '';
Self.Items.BeginUpdate;
try
ThisNode := TreeFindItem(nil, ItemList[1]);
if ThisNode <> nil then
begin
NewNode:=Self.items.AddChildObject(ThisNode, ItemList[2], FKey);
end
else
begin
NewNode:=Self.items.AddObject(nil, ItemList[2], FKey);
End;
NewNode.ImageIndex:=StrToInt(ItemList[3]);
NewNode.SelectedIndex:=StrToInt(ItemList[3]);
NewNode.Selected:=true;
finally
Self.Items.EndUpdate;
end;
End;
//修改树节点
procedure TPDETreeView.TreeModifyItem(ItemList: TStrings);
var
FKey: PTNKEY;
begin
New(FKey);
FKey^.ID := ItemList[0];
if ItemList.Count >= 5 then
FKey^.Key := ItemList[4]
else
FKey^.Key := '';
if ItemList.Count >= 6 then
FKey^.tag := ItemList[5]
else
FKey^.tag := '';
Self.Items.BeginUpdate;
try
Self.Selected.Data:= FKey;
Self.Selected.Text:= ItemList[2];
Self.Selected.ImageIndex:=StrToInt(ItemList[3]);
finally
Self.Items.EndUpdate;
end;
end;
//移除节点
procedure TPDETreeView.TreeRemoveItem();
begin
Self.Items.BeginUpdate;
try
Self.Selected.Delete;
finally
Self.Items.EndUpdate;
end;
end;
//移除节点byID
procedure TPDETreeView.TreeRemoveItemByID(ID:String);
var
STreeNode:TTreeNode;
begin
Self.Items.BeginUpdate;
try
STreeNode := TreeFindItem(nil,ID);
if not (STreeNode = nil) then STreeNode.Delete;
finally
Self.Items.EndUpdate;
end;
end;
//移动节点
procedure TPDETreeView.TreeMoveItem(ParentID:string;ID:String);
begin
TreeFindItem(nil,ID).MoveTo(TreeFindItem(nil,ParentID),naAddChild);
end;
//节点定位
procedure TPDETreeView.TreeLocation(ID:String);
begin
TreeFindItem(nil,ID).Selected:=true;
end;
//创建树
procedure TPDETreeView.TreeCreate(strSql: String);
var
adoquery:TADOQuery;
itemList:TStrings;
iLoop:Integer;
begin
try
adoquery := TADOQuery.Create(self);
adoquery.Connection:=FADOconn;
adoquery.SQL.add(strSql);
adoquery.Open;
Self.Items.Clear;
itemList:=TStringList.Create;
while not adoquery.Eof do
Begin
for iLoop := 0 to adoquery.FieldCount-1 do
begin
itemList.Add(adoquery.Fields[iLoop].AsString);
end;
TreeAddItem(itemList);
itemList.Clear;
adoquery.Next;
End;
adoquery.Close;
adoquery.Destroy;
if Self.Items.Count > 0 then
begin
Self.FullCollapse;
Self.Items.Item[0].Selected:=true;
Self.Items.Item[0].Expand(false);
end;
except
Messagebox(self.Handle,PAnsiChar('数据库操作失败!请检查数据连接是否正常。'),PAnsiChar('信息'),MB_OK+MB_ICONINFORMATION);
end;
end;
//得到节点ID值
function TPDETreeView.GetTreeNodeID():String;
begin
if Self.Items.Count = 0 then
Result:='0'
else
Result:=PTNKEY(Self.Selected.Data)^.ID;
end;
function TPDETreeView.GetTreeNodeID(ID:string):String;
begin
if Self.Items.Count = 0 then
Result:='0'
else
Result:=PTNKEY(TreeFindItem(nil,ID).Data)^.ID;
end;
//得到节点KEY值
function TPDETreeView.GetTreeNodeKey():String;
begin
if Self.Items.Count = 0 then
Result:=''
else
Result:=PTNKEY(Self.Selected.Data)^.key;
end;
function TPDETreeView.GetTreeNodeKey(ID:string):String;
begin
if Self.Items.Count = 0 then
Result:=''
else
Result:=PTNKEY(TreeFindItem(nil,ID).Data)^.key;
end;
//得到节点tag值
function TPDETreeView.GetTreeNodeTag():String;
begin
if Self.Items.Count = 0 then
Result:=''
else
Result:=PTNKEY(Self.Selected.Data)^.Tag;
end;
function TPDETreeView.GetTreeNodeTag(ID:string):String;
begin
if Self.Items.Count = 0 then
Result:=''
else
Result:=PTNKEY(TreeFindItem(nil,ID).Data)^.Tag;
end;
//Parent
//得到节点ID值
function TPDETreeView.GetParentTreeNodeID():String;
begin
if Self.Items.Count = 0 then
Result:='0'
else if Self.Selected.Level=0 then
Result:='0'
else
Result:=PTNKEY(Self.Selected.Parent.Data)^.ID;
end;
//得到节点KEY值
function TPDETreeView.GetParentTreeNodeKey():String;
begin
if Self.Items.Count = 0 then
Result:=''
else if Self.Selected.Level=0 then
Result:=''
else
Result:=PTNKEY(Self.Selected.Parent.Data)^.key;
end;
//得到节点tag值
function TPDETreeView.GetParentTreeNodeTag():String;
begin
if Self.Items.Count = 0 then
Result:=''
else if Self.Selected.Level=0 then
Result:=''
else
Result:=PTNKEY(Self.Selected.Parent.Data)^.Tag;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -