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

📄 userpower.~pas

📁 采用Delphi7+Oracle. 该软件是由交警人员对各个路口闯红灯违法照片进行有效保存
💻 ~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 + -