📄 userpower.~pas
字号:
unit UserPower;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls,ADODB, CheckLst, ImgList,CommCtrl,Menus,
TFlatButtonUnit;
type
TfrmUserPower = class(TForm)
tvMenu: TTreeView;
btnRight: TButton;
btnLeft: TButton;
ImageList1: TImageList;
ImageList2: TImageList;
btnCancel: TFlatButton;
btnSure: TFlatButton;
lvPower: TListView;
procedure FormShow(Sender: TObject);
procedure tvMenuClick(Sender: TObject);
procedure tvMenuMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure tvMenuMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure btnRightClick(Sender: TObject);
procedure btnLeftClick(Sender: TObject);
procedure lvPowerDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure lvPowerDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure btnCancelClick(Sender: TObject);
procedure btnSureClick(Sender: TObject);
// procedure btnSureClick(Sender: TObject);
private
procedure AddAMenuItem(AMenuItem:TMenuItem;aNode:TTreeNode); //添加menu到treeview中
{ Private declarations }
public
function GetNodeChecked(ANode:TTreeNode):boolean;
procedure SetNodeChecked(ANode:TTreeNode;IsSetToChecked:bool);
procedure SetChildChecked(ANode:TTreeNode;yn:bool);
{ Public declarations }
end;
var
frmUserPower: TfrmUserPower;
ClickNode:^TTreeNode;
tmpNode:TTreeNode;
NodeChecked:BOOLEAN; // 保存点中的节点checked
implementation
uses usermgt, dbConn, userLogin, ManagerUser;
{$R *.dfm}
procedure TfrmUserPower.FormShow(Sender: TObject);
var
root_node,cur_node : TTreeNode;
BarCount,ItemCount,TempIndex,i:integer;
menuCaption,subMenuCaption:String;
rsYHQX:TADODataSet;
rsMenu,rsQXLB:String;
tle:TStrings;
listcol:TListColumn;
listitem:TListItem;
dw: DWORD; //添加结点
a:Integer;
rs:TADODataset; //show power for current select user
rsItem,rsMain:String;
begin
{
for BarCount:=0 to frmUserManager.mm.Items.Count -1 do
begin
if frmUserManager.mm.Items[BarCount].Visible then
begin
menuCaption:=frmUserManager.mm.Items[BarCount].Caption ;
if pos('(',menuCaption)-1>0 then
menuCaption:=copy(menuCaption,1,pos('(',menuCaption)-1);
root_node:=tvMenu.Items.AddFirst(nil,menuCaption);
root_node.ImageIndex := BarCount;
end;
for ItemCount:=0 to frmUserManager.mm.Items.Items[BarCount].Count -1 do
begin
if frmUserManager.mm.Items.Items[BarCount].Items[ItemCount].Visible then
begin
subMenuCaption:=frmUserManager.mm.Items.Items[BarCount].Items[ItemCount].Caption ;
tvMenu.Items.AddChild(root_node,subMenuCaption);
end;
end;
end;
}
//清空数据
tvMenu.Items.Clear ;
root_node := tvMenu.Items.GetFirstNode; //取Treeview的根
for a:=0 to frmUserManager.mm.Items.Count-1 do
begin
AddAMenuItem(frmUserManager.mm.Items[a],root_node);
end;
{//给TreeView添加CheckBox
dw := GetWindowLong(tvMenu.Handle,GWL_STYLE);
dw := dw or TVS_CHECKBOXES;
SetWindowLong(tvMenu.Handle,GWL_STYLE,dw);
}
tle:=TStringList.Create;
tle.Delimiter:='/';
tle.DelimitedText:='权限列表/所属类别';
lvPower.Items.Clear;
lvPower.ViewStyle:=vsReport;
lvPower.GridLines:=True;
For i:= 0 To tle.Count-1 do begin
listcol:= lvPower.Columns.Add;
listcol.Width:=length(tle[i])*13;
listcol.Caption:=tle[i];
end;
/////仍需要将当前所选择用户的已被分配的权限显示出来:as follow work
try
rs:=TADODataSet.Create(nil);
rs.Connection:=cn_public;
rs.CommandText :='SELECT USERID FROM photocheck.P_USER WHERE USERNAME='''+CurrentByOperator+'''';
rs.Open ;
if not rs.Recordset.EOF then
begin
CurrentByOperatorID:=rs.Recordset.Fields[0].Value ;
end;
rs.Close ;
rs.CommandText :='SELECT MENUITEM,MENUMAIN FROM photocheck.P_USERPOWER WHERE USERID='''+CurrentByOperatorID+'''';
rs.Open;
if rs.Recordset.RecordCount<>0 then
begin
rs.Recordset.MoveFirst ;
while not rs.Recordset.EOF do
begin
if rs.Fields[0].IsNull then
rsItem:='NULL'
ELSE
rsItem:=rs.Recordset.Fields[0].Value ;
if rs.Fields[1].IsNull then
rsMain:='NULL'
else
rsMain:=rs.Recordset.Fields[1].Value ;
ListItem:=lvPower.Items.Add ;
ListItem.Caption :=rsItem;
ListItem.SubItems.Add(rsMain);//所属于的类别
rs.Recordset.MoveNext; //记录集合向下移动
end;
end;
finally
rs.Close ;
end;
end;
//
procedure TfrmUserPower.AddAMenuItem(AMenuItem: TMenuItem;aNode:TTreeNode); ////////添加menu到treeview中
var
i,j,k,h:Integer;
s:String;
curNode:TTreeNode;
begin
curNode := nil;
s:=AMenuItem.Caption; //取菜单的caption!
//s:=copy(s,1,pos('(',s)-1);
k:=Pos('&',s);
if k > 0 then
Delete(s,k,1); //?除菜单中的"&"符
h:=Pos('(',s);
if h>0 then
s:=Copy(s,0,Pos('(',s)-1);
if s <> '-' then //如果是菜?分隔符"-"就不?理!
curNode := tvMenu.Items.AddChild(aNode,s);
J:=AMenuItem.Count; /////////理解這個函數的關鍵 MenuItem.Items.Count為同級的項數量,而MenuItem.Items[1].Count則表示該級中第二個項的字項的數量
if J > 0 then //有子菜单,就遍历
for i := 0 to j - 1 do
begin
//curNode.ImageIndex := i;
// tvMenu.Items.Item[i].ImageIndex := i;
AddAMenuItem(AMenuItem.Items[i],curNode);
end;
end;
procedure TfrmUserPower.tvMenuClick(Sender: TObject);
begin
{ if tvMenu.Selected.StateIndex <> 3 then
tvMenu.Selected.StateIndex :=3
else
tvMenu.Selected.StateIndex :=-1;
//改变状态
if TreeView2.Selected.StateIndex <> 3 then
TreeView2.Selected.StateIndex :=3
else
TreeView2.Selected.StateIndex := -1;
}
end;
//判断一个节点是否处于Checked状态
function TfrmUserPower.GetNodeChecked(ANode:TTreeNode):boolean;
var
tvItem:^TTVItem;
begin
tvItem.mask := TVIF_HANDLE or TVIF_STATE;
tvItem.hItem :=ANode.ItemId ;
tvItem.stateMask := TVIS_STATEIMAGEMASK;
TreeView_GetItem(ANode.TreeView.Handle ,tvItem^);
Result:= (boolean((tvItem.state shr 12)-1));
{
好像只有
逻辑左移 shl
逻辑右移 shr
}
end;
//设置一个节点为Checked状态或者Unchecked状态,由参数IsSetToChecked来确定
procedure TfrmUserPower.SetNodeChecked(ANode:TTreeNode;IsSetToChecked:bool);
var
tvItem:^TTVITEM;
tmp:Integer;
begin
tvItem.mask := TVIF_HANDLE or TVIF_STATE;
tvItem.hItem := ANode.ItemId;
tvItem.stateMask := TVIS_STATEIMAGEMASK;
if IsSetToChecked=true then
tmp:=2
else
tmp:=1;
tvItem.state := INDEXTOSTATEIMAGEMASK(tmp);
TreeView_SetItem(ANode.TreeView.Handle ,tvItem^);
end;
//把它的子孙都置成一样
procedure TfrmUserPower.SetChildChecked(ANode:TTreeNode;yn:bool);
var
i,count:Integer;
begin
count:=ANode.Count ;
SetNodeChecked(ANode,yn);
if count<>0 then
begin
for i:=0 to count do
begin
SetChildChecked(ANode.Item[i],yn);
end;
end;
end;
procedure TfrmUserPower.tvMenuMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
{
if ClickNode<>nil then
begin
if GetNodeChecked(ClickNode^)<>NodeChecked then
begin
NodeChecked:=not NodeChecked;
SetChildChecked(ClickNode^,NodeChecked);
end;
end;
}
end;
procedure TfrmUserPower.tvMenuMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var
Point:TPoint;
xx,yy:Integer;
begin
{
yy:=frmUserPower.tvMenu.Top ;
xx:=frmUserPower.tvMenu.Left ;
GetCursorPos(Point);
tmpNode:= tvMenu.GetNodeAt(Point.X-xx,Point.Y -yy);
ClickNode:=@tmpNode;
//ClickNode^:=nil;
// ClickNode:=@(tvMenu.GetNodeAt(Point.X-xx,Point.Y -yy));
//ClickNode:=tvMenu.GetNodeAt(X,Y);
if ClickNode<>nil then
NodeChecked:=GetNodeChecked(ClickNode^);
}
end;
procedure TfrmUserPower.btnRightClick(Sender: TObject);
var
i,j:Integer;
node,child: TTreeNode;
listItem: TListItem;
begin
///
for i:=0 to tvMenu.Items.Count-1 do
begin
node:=tvMenu.Items[i];
if node.Selected=true then
begin
if node.HasChildren=true then //判断是否有子接点
begin
//判断根节点是否已添加
for j:=0 to lvPower.Items.Count-1 do
begin
if lvPower.Items.Item[j].SubItems[0]=node.Text then
begin
messagebox(0,'已添加!','权限管理',64);
exit;
end;
end;
//若没有添加则添加根节点中所有字节点
child:=node.getFirstChild;
while child<>nil do
begin
ListItem:=lvPower.Items.Add;
ListItem.Caption:=child.Text;
ListItem.SubItems.Add(child.Parent.Text);
child:=child.GetNextChild(child);
end;
end
else //若节点为子节点
begin
//判断子节点是否已添加
for j:=0 to lvPower.Items.Count-1 do
begin
if lvPower.Items.Item[j].Caption=node.Text then
begin
messagebox(0,'已添加!','权限管理',64);
exit;
end;
end;
//添加字节点
ListItem:=lvPower.Items.Add;
ListItem.Caption:=Node.Text;
//if node.HasChildren=true then
ListItem.SubItems.Add(node.Parent.Text)
// else
// ListItem.SubItems.Add(node.Text);
end;
end;
end;
end;
procedure TfrmUserPower.btnLeftClick(Sender: TObject);
var
i:Integer;
ListItem:TListItem;
begin
for i:=0 to lvPower.SelCount-1 do
begin
ListItem:=lvPower.Selected;
ListItem.Delete;
end;
end;
procedure TfrmUserPower.lvPowerDragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := (Source=tvMenu);// and (sender=ListView1);
end;
procedure TfrmUserPower.lvPowerDragDrop(Sender, Source: TObject; X,
Y: Integer);
var
node,child:TTreeNode;
listItem:TListItem;
j:integer;
begin
node:=tvMenu.GetNodeAt(X,Y);
if node<>nil then
begin
if node.HasChildren then
begin
//判断根节点是否已添加
for j:=0 to lvPower.Items.Count-1 do
begin
if lvPower.Items.Item[j].SubItems[0]=node.Text then
begin
ShowMessage('已添加!');
exit;
end;
end;
child:=node.getFirstChild;
while child<>nil do
begin
listItem:=lvPower.Items.Add;
listItem.Caption:=child.Text;
listItem.SubItems.Add(child.Parent.Text);
child:=child.GetNextChild(Child);
end;
end
else
begin
//判断子节点是否已添加
for j:=0 to lvPower.Items.Count-1 do
begin
if lvPower.Items.Item[j].Caption=node.Text then
begin
ShowMessage('已添加!');
exit;
end;
end;
listItem:=lvPower.Items.Add;
listItem.Caption:=node.Text;
listItem.SubItems.Add(node.Parent.Text);
end;
end;
end;
procedure TfrmUserPower.btnCancelClick(Sender: TObject);
begin
Close;
end;
procedure TfrmUserPower.btnSureClick(Sender: TObject);
var
sql:String;
i:Integer;
begin
//保存权限列表:首先需要删除原有数据,在将新数据全部保存
sql:='DELETE FROM photocheck.P_USERPOWER WHERE USERID='''+CurrentByOperatorID+'''';
dbConn.Execute_SQL(sql);
sql:='';
for i:=0 to lvPower.Items.Count -1 do
begin
sql:='INSERT INTO photocheck.P_USERPOWER (USERID,MENUITEM,MENUMAIN) VALUES(';
sql:= sql + ' '''+CurrentByOperatorID+''',';
sql:= sql + ' '''+lvPower.Items[i].Caption+''',';
sql:= sql + ' '''+Trim(lvPower.Items[i].SubItems.Text)+''')';
dbConn.Execute_SQL(sql);
sql:=''; //Clear sql body
end;
messagebox(0,'此用户权限已经分配成功!','用户权限分配',64);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -