⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pdetreeview.pas

📁 pde专用vcl
💻 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 + -