📄 usertreeview.pas
字号:
unit USERTreeView;
interface
uses
SysUtils, Classes, Controls, ComCtrls, DB, ADODB, Windows;
type
TUSERTreeView = class(TTreeView)
private
{ Private declarations }
FADOconn: TADOConnection;
FHowShow: string;
FUserTBLName: string;
FWhere: string;
FSWhere: string;
//0:全部显示;1:显示到部门;2:显示除档案主管外用户;3:档案主管;
function TreeFindItem(NodeItem: TTreeNode; ID: string): TTreeNode;
procedure SetUserTBLName(const Value: string);
function GetUserTBLName: string;
procedure SetWhere(const Value: string);
protected
{ Protected declarations }
public
{ Public declarations }
procedure TreeAddItem(ItemList: TStrings);
procedure TreeAddItemNew(ParentNode: TTreeNode);
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 GetTreeNodeUserType(): string; overload;
function GetTreeNodeLoginName(): string; overload;
function GetTreeNodeParentID(): string; overload;
function GetTreeNodeID(ID: string): string; overload;
function GetTreeNodeUserType(ID: string): string; overload;
function GetTreeNodeLoginName(ID: string): string; overload;
function GetTreeNodeParentID(ID: string): string; overload;
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
property ADOconn: TADOConnection read FADOconn write FADOconn;
property HowShow: string read FHowShow write FHowShow;
property UserTBLName: string read GetUserTBLName write SetUserTBLName;
property Where: string read FWhere write SetWhere;
end;
procedure Register;
implementation
type
PTNKEY = ^TTREENODEKEY;
TTREENODEKEY = record
ID: string;
UserType: string;
LoginName: string;
ParentID: string;
end;
procedure Register;
begin
RegisterComponents('PDE', [TUSERTreeView]);
end;
procedure TUSERTreeView.TreeAddItem(ItemList: TStrings);
var
NewNode, ThisNode: TTreeNode;
FKey: PTNKEY;
begin
New(FKey);
FKey^.ID := ItemList[0];
FKey^.UserType := ItemList[1];
FKey^.LoginName := ItemList[2];
FKey^.ParentID := ItemList[3];
Self.Items.BeginUpdate;
try
ThisNode := TreeFindItem(nil, ItemList[3]);
if ThisNode <> nil then
begin
NewNode := Self.items.AddChildObject(ThisNode, ItemList[4], FKey);
end
else
begin
NewNode := Self.items.AddObject(nil, ItemList[4], FKey);
end;
//节点类型
if ItemList[1] = '9' then
begin
NewNode.ImageIndex := 0;
NewNode.SelectedIndex := 0;
end
else
begin
//是否离职
if ItemList[5] = '1' then
begin
NewNode.ImageIndex := 2;
NewNode.SelectedIndex := 2;
end
else
begin
NewNode.ImageIndex := 1;
NewNode.SelectedIndex := 1;
end;
end;
NewNode.Selected := true;
finally
Self.Items.EndUpdate;
end;
end;
//修改树节点
procedure TUSERTreeView.TreeModifyItem(ItemList: TStrings);
var
FKey: PTNKEY;
begin
New(FKey);
FKey^.ID := ItemList[0];
FKey^.UserType := ItemList[1];
FKey^.LoginName := ItemList[2];
FKey^.ParentID := ItemList[3];
Self.Items.BeginUpdate;
try
Self.Selected.Data := FKey;
Self.Selected.Text := ItemList[4];
//节点类型
if ItemList[1] = '9' then
begin
Self.Selected.ImageIndex := 0;
Self.Selected.SelectedIndex := 0;
end
else
begin
//是否离职
if ItemList[5] = '1' then
begin
Self.Selected.ImageIndex := 2;
Self.Selected.SelectedIndex := 2;
end
else
begin
Self.Selected.ImageIndex := 1;
Self.Selected.SelectedIndex := 1;
end;
end;
finally
Self.Items.EndUpdate;
end;
end;
//移除节点
procedure TUSERTreeView.TreeRemoveItem();
begin
Self.Items.BeginUpdate;
try
Self.Selected.Delete;
finally
Self.Items.EndUpdate;
end;
end;
procedure TUSERTreeView.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 TUSERTreeView.TreeCreate();
var
adoquery: TADOQuery;
itemList: TStrings;
iLoop: Integer;
strSql: string;
begin
try
{adoquery := TADOQuery.Create(self);
adoquery.Connection := FADOconn;
if FHowShow = '2' then
strSql := 'SELECT ID,C_ADMIN,C_LOGINNAME,I_PARENTID,C_REALNAME,I_LEAVE FROM SYS_USERS WHERE I_PARENTID >-1 AND C_ADMIN <> ''3'' AND C_ADMIN <> ''1'' ORDER BY C_ADMIN desc,I_LEVEL,I_PARENTID,C_LOGINNAME'
else if FHowShow = '1' then
strSql := 'SELECT ID,C_ADMIN,C_LOGINNAME,I_PARENTID,C_REALNAME,I_LEAVE FROM SYS_USERS WHERE I_PARENTID >-1 AND C_ADMIN = ''9'' ORDER BY C_ADMIN desc,I_LEVEL,I_PARENTID,C_LOGINNAME'
else if FHowShow = '3' then
strSql :=
'SELECT ID,C_ADMIN,C_LOGINNAME,I_PARENTID,C_REALNAME,I_LEAVE FROM SYS_USERS WHERE I_PARENTID >-1 AND (C_ADMIN = ''9'' OR C_ADMIN = ''2'') ORDER BY C_ADMIN desc,I_LEVEL,I_PARENTID,C_LOGINNAME'
else
strSql :=
'SELECT ID,C_ADMIN,C_LOGINNAME,I_PARENTID,C_REALNAME,I_LEAVE FROM SYS_USERS WHERE I_PARENTID >-1 AND C_ADMIN <> ''3'' AND C_ADMIN<>''2'' ORDER BY C_ADMIN desc,I_LEVEL,I_PARENTID,C_LOGINNAME';
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;}
Items.Clear;
TreeAddItemNew(nil);
{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 TUSERTreeView.TreeMoveItem(ParentID: string; ID: string);
begin
if TreeFindItem(nil, ID).IsFirstNode then
Exit;
if ParentID = PTNKEY(TreeFindItem(nil, ID).Parent.Data)^.ID then
Exit;
TreeFindItem(nil, ID).MoveTo(TreeFindItem(nil, ParentID), naAddChild);
end;
//查找父节点
function TUSERTreeView.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 TUSERTreeView.TreeLocation(ID: string);
begin
TreeFindItem(nil, ID).Selected := true;
end;
//得到节点ID值
function TUSERTreeView.GetTreeNodeID(): string;
begin
if Self.Items.Count = 0 then
Result := '0'
else
Result := PTNKEY(Self.Selected.Data)^.ID;
end;
function TUSERTreeView.GetTreeNodeID(ID: string): string;
begin
if Self.Items.Count = 0 then
Result := '0'
else
Result := PTNKEY(TreeFindItem(nil, ID).Data)^.ID;
end;
//得到节点UserType值
function TUSERTreeView.GetTreeNodeUserType(): string;
begin
if Self.Items.Count = 0 then
Result := ''
else
Result := PTNKEY(Self.Selected.Data)^.UserType;
end;
function TUSERTreeView.GetTreeNodeUserType(ID: string): string;
begin
if Self.Items.Count = 0 then
Result := ''
else
Result := PTNKEY(TreeFindItem(nil, ID).Data)^.UserType;
end;
//得到节点LoginName值
function TUSERTreeView.GetTreeNodeLoginName(): string;
begin
if Self.Items.Count = 0 then
Result := ''
else
Result := PTNKEY(Self.Selected.Data)^.LoginName;
end;
function TUSERTreeView.GetTreeNodeLoginName(ID: string): string;
begin
if Self.Items.Count = 0 then
Result := ''
else
Result := PTNKEY(TreeFindItem(nil, ID).Data)^.LoginName;
end;
//得到节点ParentID值
function TUSERTreeView.GetTreeNodeParentID(): string;
begin
if Self.Items.Count = 0 then
Result := ''
else
Result := PTNKEY(Self.Selected.Data)^.ParentID;
end;
function TUSERTreeView.GetTreeNodeParentID(ID: string): string;
begin
if Self.Items.Count = 0 then
Result := ''
else
Result := PTNKEY(TreeFindItem(nil, ID).Data)^.ParentID;
end;
//add by zlj:修改建树的方法为递归,提高建树的效率
procedure TUSERTreeView.TreeAddItemNew(ParentNode: TTreeNode);
var
sSQL: string;
itemList: TStringList;
NewNode: TTreeNode;
FKey: PTNKEY;
iLoop: Integer;
adoquery: TAdoQuery;
begin
itemList := TStringList.Create;
adoquery := TAdoQuery.Create(nil);
adoquery.Connection := FADOconn;
if ParentNOde = nil then
sSQL := 'SELECT ID,C_ADMIN,C_LOGINNAME,I_PARENTID,C_REALNAME,I_LEAVE FROM '
+ FUserTBLName +
' WHERE I_PARENTID >-1 AND C_ADMIN <> ''3'' AND C_ADMIN<>''2'''
+ ' AND I_PARENTID=0' + FSWhere
+ ' ORDER BY C_ADMIN desc,I_LEVEL,I_PARENTID,C_LOGINNAME'
else
begin
if FHowShow = '2' then
sSQL :=
'SELECT ID,C_ADMIN,C_LOGINNAME,I_PARENTID,C_REALNAME,I_LEAVE FROM ' + FUserTBLName
+ ' WHERE I_PARENTID >-1 AND C_ADMIN <> ''3'' AND C_ADMIN<>''1'''
+ ' AND I_PARENTID= ' + PTNKEY(ParentNode.Data).ID + FSWhere
+ ' ORDER BY C_ADMIN desc,I_LEVEL,I_PARENTID,C_LOGINNAME'
else if FHowShow = '1' then
sSQL :=
'SELECT ID,C_ADMIN,C_LOGINNAME,I_PARENTID,C_REALNAME,I_LEAVE FROM ' + FUserTBLName
+ ' WHERE I_PARENTID >-1 AND C_ADMIN = ''9'''
+ ' AND I_PARENTID= ' + PTNKEY(ParentNode.Data).ID + FSWhere
+ ' ORDER BY C_ADMIN desc,I_LEVEL,I_PARENTID,C_LOGINNAME'
else if FHowShow = '3' then
sSQL :=
'SELECT ID,C_ADMIN,C_LOGINNAME,I_PARENTID,C_REALNAME,I_LEAVE FROM ' + FUserTBLName
+ ' WHERE I_PARENTID >-1 AND (C_ADMIN = ''9'' OR C_ADMIN = ''2'')'
+ ' AND I_PARENTID= ' + PTNKEY(ParentNode.Data).ID + FSWhere
+ ' ORDER BY C_ADMIN desc,I_LEVEL,I_PARENTID,C_LOGINNAME'
else
sSQL :=
'SELECT ID,C_ADMIN,C_LOGINNAME,I_PARENTID,C_REALNAME,I_LEAVE FROM ' + FUserTBLName
+ ' WHERE I_PARENTID >-1 AND C_ADMIN <> ''3'' AND C_ADMIN<>''2'''
+ ' AND I_PARENTID= ' + PTNKEY(ParentNode.Data).ID + FSWhere
+ ' ORDER BY C_ADMIN desc,I_LEVEL,I_PARENTID,C_LOGINNAME';
end;
adoquery.SQL.Clear;
adoquery.SQL.Add(sSQL);
adoquery.Open;
while not adoquery.Eof do
begin
itemList.Clear;
for iLoop := 0 to adoquery.FieldCount - 1 do
begin
itemList.Add(adoquery.Fields[iLoop].AsString);
end;
New(FKey);
FKey^.ID := ItemList[0];
FKey^.UserType := ItemList[1];
FKey^.LoginName := ItemList[2];
FKey^.ParentID := ItemList[3];
NewNode := Self.items.AddChildObject(ParentNode, ItemList[4], FKey);
if itemList[1] = '9' then
begin
NewNode.ImageIndex := 0;
NewNode.SelectedIndex := 0;
TreeAddItemNew(NewNode);
end
else if ItemList[5] = '1' then
begin
NewNode.ImageIndex := 2;
NewNode.SelectedIndex := 2;
end
else
begin
NewNode.ImageIndex := 1;
NewNode.SelectedIndex := 1;
end;
//if NewNode
adoquery.Next;
end;
adoquery.Free;
itemList.Free;
end;
procedure TUSERTreeView.SetUserTBLName(const Value: string);
begin
FUserTBLName := Value;
end;
function TUSERTreeView.GetUserTBLName: string;
begin
Result := FUserTBLName
end;
constructor TUSERTreeView.Create(AOwner: TComponent);
begin
inherited;
FUserTBLName := 'SYS_USERS';
end;
procedure TUSERTreeView.SetWhere(const Value: string);
begin
FWhere := Value;
FSWhere := '';
if Trim(FWhere) <> '' then
FSWhere := ' AND ' + FWhere + ' ';
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -