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

📄 entitytreeview.pas

📁 pde专用vcl
💻 PAS
字号:
unit ENTITYTreeView;

interface

uses
  SysUtils, Classes, Controls, ComCtrls, DB, ADODB, Windows;

type
  TENTITYTreeView = class(TTreeView)
  private
    { Private declarations }
    FADOconn: TADOConnection;
    FENSort: string;
    function TreeFindItem(NodeItem: TTreeNode; ID: string): TTreeNode;
    procedure TreeAddFirstItem();
    procedure TreeAddChildItem(ParentNode: TTreeNode);
  protected
    { Protected declarations }
  public
    { Public declarations }
    procedure TreeAddItem(ItemList: TStrings);
    procedure TreeModifyItem(ItemList: TStrings);
    procedure TreeRemoveItem(); overload;
    procedure TreeRemoveItem(ID: string); overload;
    procedure TreeCreate();
    procedure TreeLocation(ID: string);
    procedure TreeMoveItem(ParentID: string; ID: string);

    function GetTreeNodeID(): string; overload;
    function GetTreeNodeENCode(): string; overload;
    function GetTreeNodeENName(): string; overload;
    function GetTreeNodeParentID(): string; overload;
    function GetTreeNodeKeepTime(): string; overload;
    function GetTreeNodeID(ID: string): string; overload;
    function GetTreeNodeENCode(ID: string): string; overload;
    function GetTreeNodeENName(ID: string): string; overload;
    function GetTreeNodeParentID(ID: string): string; overload;
    function GetTreeNodeKeepTime(ID: string): string; overload;
  published
    { Published declarations }
    property ADOconn: TADOConnection read FADOconn write FADOconn;
    property ENSort: string read FENSort write FENSort;
  end;

procedure Register;

implementation
type
  PTNKEY = ^TTREENODEKEY;
  TTREENODEKEY = record
    ID: string;
    ENCode: string;
    ENName: string;
    ParentID: string;
    KeepTime: string;
  end;

procedure Register;
begin
  RegisterComponents('PDE', [TENTITYTreeView]);
end;

procedure TENTITYTreeView.TreeAddFirstItem();
var
  NewNode: TTreeNode;
  FKey: PTNKEY;
begin
  New(FKey);
  FKey^.ID := '0';
  Self.Items.BeginUpdate;
  try
    NewNode := Self.items.AddObject(nil, FENSort, FKey);
    NewNode.ImageIndex := 0;
    NewNode.SelectedIndex := 0;
    NewNode.Selected := true;
  finally
    Self.Items.EndUpdate;
  end;
end;

procedure TENTITYTreeView.TreeAddItem(ItemList: TStrings);
var
  NewNode, ThisNode: TTreeNode;
  FKey: PTNKEY;
  sText: string;
begin
  New(FKey);
  FKey^.ID := ItemList[0];
  FKey^.ENCode := ItemList[1];
  FKey^.ENName := ItemList[2];
  FKey^.ParentID := ItemList[3];
  FKey^.KeepTime := ItemList[4];
  Self.Items.BeginUpdate;
  try
    ThisNode := TreeFindItem(nil, ItemList[3]);
    if ItemList[4] = '' then
      sText := ItemList[1] + '    ' + ItemList[2]
    else
      sText := ItemList[1] + '    ' + ItemList[2] + '    ' + ItemList[4];
    if ThisNode <> nil then
    begin
      NewNode := Self.items.AddChildObject(ThisNode, sText, FKey);
    end
    else
    begin
      NewNode := Self.items.AddObject(nil, sText, FKey);
    end;
    NewNode.ImageIndex := 1;
    NewNode.SelectedIndex := 1;
    NewNode.Selected := true;
  finally
    Self.Items.EndUpdate;
  end;
end;

//修改树节点

procedure TENTITYTreeView.TreeModifyItem(ItemList: TStrings);
var
  FKey: PTNKEY;
  sText: string;
begin
  New(FKey);
  FKey^.ID := ItemList[0];
  FKey^.ENCode := ItemList[1];
  FKey^.ENName := ItemList[2];
  FKey^.ParentID := ItemList[3];
  FKey^.KeepTime := ItemList[4];
  Self.Items.BeginUpdate;
  try
    if ItemList[4] = '' then
      sText := ItemList[1] + '    ' + ItemList[2]
    else
      sText := ItemList[1] + '    ' + ItemList[2] + '    ' + ItemList[4];
    Self.Selected.Data := FKey;
    Self.Selected.Text := sText;
    //Self.Selected.ImageIndex:=1;
    //Self.Selected.SelectedIndex:=1;
  finally
    Self.Items.EndUpdate;
  end;
end;

//移除节点

procedure TENTITYTreeView.TreeRemoveItem();
begin
  Self.Items.BeginUpdate;
  try
    Self.Selected.Delete;
  finally
    Self.Items.EndUpdate;
  end;
end;

procedure TENTITYTreeView.TreeRemoveItem(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 TENTITYTreeView.TreeCreate();
var
  adoquery: TADOQuery;
  itemList: TStrings;
  iLoop: Integer;
  strSql: string;
begin
  if FENSort = '' then
    Exit;
  try
    Self.Items.Clear;
    TreeAddFirstItem;
    TreeAddChildItem(Self.Items[0]);
    {    itemList := TStringList.Create;
        adoquery := TADOQuery.Create(self);
        adoquery.Connection := FADOconn;
        strSql := 'SELECT ID,C_ENTITYCODE,C_ENTITYNAME,I_PARENTID,C_KEEPTIME FROM SYS_ENTITY WHERE C_ENTITYSORTNAME = '''
          + FENSort + ''' ORDER BY I_PARENTID,C_ENTITYCODE';
        adoquery.SQL.add(strSql);
        adoquery.Open;
        Self.Items.Clear;
        TreeAddFirstItem;
        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.Items.Item[0].Selected := true;
      Self.FullCollapse;
      Self.Items.Item[0].Expand(false);
    end;
  except
    on E: Exception do
      Messagebox(self.Handle,
        PAnsiChar('数据库操作失败!请检查数据连接是否正常。' + chr(10) + chr(13)
        + '详细错误信息如下:' + chr(10) + chr(13) + E.Message),
        PAnsiChar('信息'), MB_OK + MB_ICONINFORMATION);
  end;
end;

//移动节点

procedure TENTITYTreeView.TreeMoveItem(ParentID: string; ID: string);
begin
  if ParentID = PTNKEY(TreeFindItem(nil, ID).Parent.Data)^.ID then
    Exit;
  TreeFindItem(nil, ID).MoveTo(TreeFindItem(nil, ParentID), naAddChild);
end;

//查找父节点

function TENTITYTreeView.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 TENTITYTreeView.TreeLocation(ID: string);
begin
  TreeFindItem(nil, ID).Selected := true;
end;

//得到节点ID值

function TENTITYTreeView.GetTreeNodeID(): string;
begin
  if Self.Items.Count = 0 then
    Result := '0'
  else
    Result := PTNKEY(Self.Selected.Data)^.ID;
end;

function TENTITYTreeView.GetTreeNodeID(ID: string): string;
begin
  if Self.Items.Count = 0 then
    Result := '0'
  else
    Result := PTNKEY(TreeFindItem(nil, ID).Data)^.ID;
end;
//得到节点ENCode值

function TENTITYTreeView.GetTreeNodeENCode(): string;
begin
  if Self.Items.Count = 0 then
    Result := ''
  else
    Result := PTNKEY(Self.Selected.Data)^.ENCode;
end;

function TENTITYTreeView.GetTreeNodeENCode(ID: string): string;
begin
  if Self.Items.Count = 0 then
    Result := ''
  else
    Result := PTNKEY(TreeFindItem(nil, ID).Data)^.ENCode;
end;
//得到节点ENName值

function TENTITYTreeView.GetTreeNodeENName(): string;
begin
  if Self.Items.Count = 0 then
    Result := ''
  else
    Result := PTNKEY(Self.Selected.Data)^.ENName;
end;

function TENTITYTreeView.GetTreeNodeENName(ID: string): string;
begin
  if Self.Items.Count = 0 then
    Result := ''
  else
    Result := PTNKEY(TreeFindItem(nil, ID).Data)^.ENName;
end;
//得到节点ParentID值

function TENTITYTreeView.GetTreeNodeParentID(): string;
begin
  if Self.Items.Count = 0 then
    Result := ''
  else
    Result := PTNKEY(Self.Selected.Data)^.ParentID;
end;

function TENTITYTreeView.GetTreeNodeParentID(ID: string): string;
begin
  if Self.Items.Count = 0 then
    Result := ''
  else
    Result := PTNKEY(TreeFindItem(nil, ID).Data)^.ParentID;
end;
//得到节点KeepTime值

function TENTITYTreeView.GetTreeNodeKeepTime(): string;
begin
  if Self.Items.Count = 0 then
    Result := ''
  else
    Result := PTNKEY(Self.Selected.Data)^.KeepTime;
end;

function TENTITYTreeView.GetTreeNodeKeepTime(ID: string): string;
begin
  if Self.Items.Count = 0 then
    Result := ''
  else
    Result := PTNKEY(TreeFindItem(nil, ID).Data)^.KeepTime;
end;

procedure TENTITYTreeView.TreeAddChildItem(ParentNode: TTreeNode);
var
  NewNode: TTreeNode;
  FKey: PTNKEY;
  sText: string;
  adoquery: TADOQuery;
  strSQL: string;
begin
  {New(FKey);
  FKey^.ID := ItemList[0];
  FKey^.ENCode := ItemList[1];
  FKey^.ENName := ItemList[2];
  FKey^.ParentID := ItemList[3];
  FKey^.KeepTime := ItemList[4];
  Self.Items.BeginUpdate;   }
  try
    //ParentNode := TreeFindItem(nil, ItemList[3]);
    {if ItemList[4] = '' then
      sText := ItemList[1] + '    ' + ItemList[2]
    else
      sText := ItemList[1] + '    ' + ItemList[2] + '    ' + ItemList[4];
    if ParentNode <> nil then
    begin
      NewNode := Self.items.AddChildObject(ParentNode, sText, FKey);
    end
    else
    begin
      NewNode := Self.items.AddObject(nil, sText, FKey);
    end; }

    //获取子结点数据
    adoquery := TADOQuery.Create(self);
    adoquery.Connection := FADOconn;
    strSql := 'SELECT ID,C_ENTITYCODE,C_ENTITYNAME,I_PARENTID,C_KEEPTIME FROM SYS_ENTITY WHERE C_ENTITYSORTNAME = '''
      + FENSort + ''' AND I_PARENTID=' + PTNKEY(ParentNode.Data).ID +
      ' ORDER BY I_PARENTID,C_ENTITYCODE';
    adoquery.SQL.add(strSql);
    adoquery.Open;
    while not adoquery.Eof do
    begin
      New(FKey);
      FKey^.ID := adoquery.FieldByName('ID').AsString; //ItemList[0];
      FKey^.ENCode := adoquery.FieldByName('C_ENTITYCODE').AsString;
      //ItemList[1];
      FKey^.ENName := adoquery.FieldByName('C_ENTITYNAME').AsString;
      //ItemList[2];
      FKey^.ParentID := adoquery.FieldByName('I_PARENTID').AsString;
      //ItemList[3];
      FKey^.KeepTime := adoquery.FieldByName('C_KEEPTIME').AsString;
      //ItemList[4];
      if FKey^.KeepTime = '' then
        sText := FKey^.ENCode + '    ' + FKey^.ENName
      else
        sText := FKey^.ENCode + '    ' + FKey^.ENName + '    ' + FKey^.KeepTime;
      NewNode := Self.items.AddChildObject(ParentNode, sText, FKey);
      NewNode.ImageIndex := 1;
      NewNode.SelectedIndex := 1;
      NewNode.Selected := true;
      TreeAddChildItem(NewNode);
      adoquery.Next;
    end;
    adoquery.Close;
    adoquery.Destroy;
  finally
    //Self.Items.EndUpdate;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -