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

📄 role_m.pas

📁 DELPHI计算机科学系教务管理系统,带论文设计,不错的参考
💻 PAS
字号:
unit Role_M;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, fcTreeView, ExtCtrls, StdCtrls, Buttons, DB,
  ADODB;

type
  TRoleForm = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    fcTreeView: TfcTreeView;
    Panel4: TPanel;
    Panel5: TPanel;
    DataSource1: TDataSource;
    ADOQuery1: TADOQuery;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    BitBtn4: TBitBtn;
    BitBtn5: TBitBtn;
    BitBtn6: TBitBtn;
    Panel6: TPanel;
    DBGrid1: TDBGrid;
    Label4: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
    procedure fcTreeViewToggleCheckbox(TreeView: TfcCustomTreeView;
      Node: TfcTreeNode);
    procedure ADOQuery1AfterScroll(DataSet: TDataSet);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn4Click(Sender: TObject);
    procedure BitBtn5Click(Sender: TObject);
    procedure BitBtn6Click(Sender: TObject);
    procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure Label4Click(Sender: TObject);
  private
    function getAutoRno: string;//自动获取角色编号
    procedure ControlTheEnablePro(isSaved: Boolean);//控制按钮面板的Enable属性
    procedure SaveTvToRoleFunc();//通过树增加角色功能

 ////鼠标滚动 DBGrid  的数据跟着改变
    procedure GridMouseWheel(Sender: TObject; Shift: TShiftState;
    WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
    
    { Private declarations }
  public
    procedure CheckTv();
    function isRnameExist(Rname: string): Boolean;

    { Public declarations }
  end;
   TControlAccess = class(TControl);
var
  RoleForm: TRoleForm;
  Isparentnode:Boolean=false;
  flag: integer=0;
implementation

uses DataModul, mainunit,Math, public_unit, User_M;

{$R *.dfm}

procedure TRoleForm.FormCreate(Sender: TObject);
begin
  adoquery1.Open;
  ControlTheEnablePro(true);
  with adoquery1 do
  begin
    edit1.Text := fieldByName('Rno').AsString;
    edit2.Text := fieldByName('Rname').AsString;
    edit3.Text := fieldByname('Rmemo').AsString;
  end;

  TControlAccess(DBGrid1).OnMouseWheel := GridMouseWheel;

end;

procedure TRoleForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  adoquery1.Close;
  Action := caFree;
  RoleForm := nil;
end;

//procedure RoleForm.ControlTheEnablePro(isSaved: Boolean);
//begin

//end;

//自动获取角色编号
//*******************************************
function TRoleForm.getAutoRno: string;
var
  adoqury: TADOQuery;
  t: integer;
begin
  adoqury := TADOQuery.Create(self);
  with adoqury do
  begin
    Connection := dm.ADOConnection1;
    SQL.Text := 'SELECT MAX(Rno) as Rno FROM TRole';
    Open;
    t := StrToInt(fieldbyName('Rno').AsString);
    t := 1000 + t + 1;
    result := Copy(IntToStr(t), 2, 3);
  end;
  adoqury.Free;
end;
//*******************************************

procedure TRoleForm.SaveTvToRoleFunc;
var
  sqlStr: string;
  Node: TfcTreeNode;
  i: integer;
begin
  for i := 0 to fcTreeView.Items.Count - 1 do
  begin
    Node := fcTreeView.Items[i];
    if Node.Checked then
    begin
      sqlStr := 'INSERT TRoleFunction(Rno, Fno) VALUES('
                +QuotedStr(edit1.Text) + ','
                +QuotedStr(Node.StringData)
                +')';
      ToExecSQL(sqlStr, DM.ADOConnection1);
    end;
  end;

end;

procedure TRoleForm.FormShow(Sender: TObject);
var
  PNode, CNode: TfcTreeNode;
  PRoleFunQry, CRoleFunQry: TADOQuery;
  pFname, pFno, cFname, cFno: string;
begin
  PRoleFunQry := TADOQuery.Create(self);
  CRoleFunQry := TADOQuery.Create(self);
  with PRoleFunQry do
  begin
    Connection := DM.ADOConnection1;
    SQL.Text := 'SELECT FNO, FName From TFunction WHERE Flevel=0';
    open;
    while not Eof do
    begin
      pFname := fieldByName('FName').AsString;
      pFno := fieldByName('FNo').AsString;
      PNode := fcTreeView.Items.Add(nil, pFname);
      PNode.StringData := pFno;
      PNode.StringData2 := pFname;
      PNode.CheckboxType := tvctCheckbox;
      with CRoleFunQry do
      begin
        Connection := DM.ADOConnection1;
        SQL.Text := 'SELECT FNO, FName From TFunction '
                    + 'WHERE Flevel=1 AND Fpater=' + QuotedStr(pFno);
        Open;
        While not Eof do
        begin
          cFname := fieldByName('FName').AsString;
          cFno   := fieldByName('FNo').AsString;
          CNode := fcTreeView.Items.AddChild(PNode, cFname);
          CNode.StringData := CFno;
          CNode.StringData2 := cFname;
          CNode.CheckboxType := tvctCheckbox;
          Next;
        end;
      end;
      Next;
    end;
  end;
  PRoleFunQry.Free;
  CRoleFunQry.Free;
  CheckTv;
  fcTreeView.FullExpand;
end;

procedure TRoleForm.fcTreeViewToggleCheckbox(TreeView: TfcCustomTreeView;
  Node: TfcTreeNode);
var
  i:integer;
  Ischildnode:integer;
begin
  if isparentnode=true then
    exit;
  if node.Parent=nil then
  begin
    if node.Checked then
      for i:=0 to node.Count-1 do
        node.Item[i].Checked:=true
    else
      for i:=0 to node.Count-1 do
        node.Item[i].Checked:=false;
  end
  else
  begin
    Ischildnode:=0;
    for i:=0 to node.Parent.Count - 1 do
      if node.Parent.Item[i].Checked=true then
        Ischildnode:=1;
    isparentnode:=true;
    if Ischildnode=1 then
      node.Parent.Checked:=true
    else
      node.Parent.Checked:=false;
    Isparentnode:=false;
  end;

end;

procedure TRoleForm.CheckTv;
var
  RoleFunQry: TADOQuery;
  Fno: string;
  i: Integer;
begin
  RoleFunQry := TADOQuery.Create(self);
  with RoleFunQry do
  begin
    Connection := DM.ADOConnection1;
    SQL.Text := 'SELECT FNO FROM TRoleFunction WHERE Rno='
                + QuotedStr(adoquery1.fieldByName('Rno').AsString);
    Open;
    While not Eof do
    begin
      Fno := fieldbyName('Fno').AsString;
      for i := 0 to fcTreeView.Items.Count - 1 do
      begin
        if(fcTreeView.Items[i].StringData = Fno) and (fcTreeView.Items[i].Parent<>nil)then
          fcTreeView.Items[i].Checked := True;
      end;
      Next;
    end;
  end;
  RoleFunQry.Free;

end;

procedure TRoleForm.ADOQuery1AfterScroll(DataSet: TDataSet);
var
  i: integer;
begin
  for i := 0 to fcTreeView.Items.Count - 1 do
  begin
    fcTreeView.Items[i].Checked := False;
  end;
  CheckTv;
  with adoquery1 do
  begin
    edit1.Text := fieldByName('Rno').AsString;
    edit2.Text := fieldByName('Rname').AsString;
    edit3.Text := fieldByname('Rmemo').AsString;
  end;
end;

procedure TRoleForm.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
  if key=#13 then
  begin
    if edit2.Text = '' then
      application.MessageBox('请输入角色名称', '提示消息', MB_ICONINFORMATION)
    else
      if isRnameExist(edit2.Text) then
        Application.MessageBox('角色名已存在,角色名不可以重复!', '提示消息', MB_ICONINFORMATION)
    else
     Perform(WM_NEXTDLGCTL, 0, 0);
  end;
end;

procedure TRoleForm.BitBtn1Click(Sender: TObject);
var
  i: integer;
begin
  flag:=1;
  for i := 0 to fcTreeView.Items.Count - 1 do
  begin
    fcTreeView.Items[i].Checked := false;
  end;
  ControlTheEnablePro(false);
  clearText(self);
  edit1.Text := getAutoRno;
  edit2.SetFocus;
end;

procedure TRoleForm.BitBtn2Click(Sender: TObject);
var
  sqlStr: string;
  RoleQry:Tadoquery;
begin
  if messagebox(handle,'您确定要删除吗?','提示',MB_YESNO + MB_ICONQUESTION)=ID_yes  then
  begin
  RoleQry:= Tadoquery.Create(self);
  with RoleQry do
  begin
    Connection := DM.ADOConnection1;
    sql.Text :='select distinct R.Rno from TRole R '
    +'inner join TUserRole UR on R.Rno=UR.Rno '
    +'inner join TUser U on UR.Uno=U.Uno '
    +'where R.Rno ='+ QuotedStr(adoquery1.fieldbyname('Rno').AsString);
    Open;
  if(adoquery1.FieldByName('Rno').AsString = '001') then
              application.MessageBox('系统管理员不能被删除!','警告', mb_IconError)
    else          
    if RoleQry.RecordCount>0 then
       begin
        application.MessageBox('该角色暂时不能被删除!','警告', mb_IconError);
       end
    else
        if Application.MessageBox('确认删除', '删除消息', MB_ICONQUESTION
          + MB_YESNO) = ID_YES then
        begin
          sqlStr:= 'DELETE TRoleFunction WHERE Rno='
                    + QuotedStr(adoquery1.fieldbyname('Rno').AsString);
          ToExecSQL(sqlStr, DM.ADOConnection1);
          sqlStr := 'DELETE TRole WHERE Rno='
                     + QuotedStr(adoquery1.fieldbyname('Rno').AsString);
          adoquery1.Close;
          ToExecSQL(sqlStr, DM.ADOConnection1);
          adoquery1.Open;
          Application.MessageBox('删除成功', '提示消息',MB_ICONINFORMATION);
        end;
   end;
   RoleQry.Free;
  ControlTheEnablePro(true);
 end; 
end;

procedure TRoleForm.BitBtn3Click(Sender: TObject);
begin
//if(adoquery1.FieldByName('Rno').AsString = '001') then
 // application.MessageBox('系统管理员不能被修改!','警告', mb_IconError)
 // else
 // begin
  flag:=2;
  ControlTheEnablePro(false);
  edit2.SetFocus;
 // end;
end;

procedure TRoleForm.BitBtn4Click(Sender: TObject);
begin
  flag:=0;
  ControlTheEnablePro(true);
  adoquery1.Close;
  adoquery1.Open;
  CheckTv;
end;

procedure TRoleForm.BitBtn5Click(Sender: TObject);
var
  sqlStr: string;
begin

  if edit2.Text='' then
  begin
    Application.MessageBox('输入角色名称', '提示消息', MB_ICONINFORMATION);
    edit2.SetFocus;
  end
  else
  If isTvChecked(fcTreeView)=false then
    begin
      application.MessageBox('请选择树分配权限', '提示消息', MB_ICONINFORMATION);
      fcTreeView.SetFocus;
    end
  else
    begin
      if flag=1 then
      begin
          if isRnameExist(edit2.Text) then
            begin
              Application.MessageBox('角色名已存在!', '提示消息', MB_ICONINFORMATION);
              edit2.SetFocus;
            end
          else
            begin
              adoquery1.Close;
              sqlStr := 'INSERT TRole(Rno, Rname, RMemo) VALUES('
                        + QuotedStr(edit1.Text) + ','
                        + QuotedStr(edit2.Text) + ','
                        + QuotedStr(edit3.Text)
                        +')';
              ToExecSQL(sqlStr, DM.adoconnection1);
              SaveTvToRoleFunc;//对角色 功能表 的编号同时添加上去
              adoquery1.Open;
              Application.MessageBox('角色添加成功', '提示消息',MB_ICONINFORMATION);
            end;

      end;
     if flag=2 then  
            begin

              adoquery1.Close;
              sqlStr := 'UPDATE TRole SET Rname='
                        + QuotedStr(edit2.Text) + ','
                        + 'Rmemo='
                        + QuotedStr(edit3.Text) +
                        'WHERE Rno=' + QuotedStr(edit1.Text);
              ToExecSQL(sqlStr, DM.adoconnection1);
              //删除角色功能
              sqlStr := 'DELETE TRolefunction WHERE Rno='
                        + QuotedStr(edit1.Text);
              ToExecSQL(sqlStr, DM.adoconnection1);
              //增加角色功能
              SaveTvToRoleFunc;
              adoquery1.Open;
              Application.MessageBox('角色修改成功', '提示消息',MB_ICONINFORMATION);
            end;
    ControlTheEnablePro(true);
    flag:=0;
    end; 
end;

function TRoleForm.isRnameExist(Rname: string): Boolean;
var
    SqlStr: string;
    tempQry: TADOQuery;
  begin
    sqlStr := ' SELECT * FROM TRole WHERE Rname=' + QuotedStr(edit2.Text);
    tempQry := ToGetDataSQL(SqlStr, DM.adoconnection1);
    if tempQry.RecordCount > 0 then
      result := true
    else
      result := false;

  end;

procedure TRoleForm.BitBtn6Click(Sender: TObject);
begin
  close;
end;

procedure TRoleForm.ControlTheEnablePro(isSaved: Boolean);
begin
  if isSaved = true then
  begin
    panel6.Enabled:=true;       Panel2.Enabled:=false;
    Panel5.Enabled:=false;
    BitBtn1.Enabled:=True;      BitBtn2.Enabled:=true;
    BitBtn3.Enabled:=true;      BitBtn4.Enabled:=false;
    BitBtn5.Enabled:=false;     BitBtn6.Enabled:=true;
    edit1.Enabled:=false;       edit2.Enabled:=false;
    edit3.Enabled:=false;
  end
  else
  begin
    panel6.Enabled:=false;       Panel2.Enabled:=true;
    Panel5.Enabled:=true;
    BitBtn1.Enabled := false;    BitBtn2.Enabled:=false;
    BitBtn3.Enabled:=false;      BitBtn4.Enabled:=true;
    BitBtn5.Enabled:=true;       BitBtn6.Enabled:=false;
    edit2.Enabled:=true;        edit3.Enabled:=true;
  end;
end;

procedure TRoleForm.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
 if gdSelected in State then Exit;  //隔行改变网格背景色:
  if adoquery1.RecNo mod 2 = 0 then
    (Sender as TDBGrid).Canvas.Brush.Color := clinfobk //定义背景颜色
  else
    (Sender as TDBGrid).Canvas.Brush.Color := RGB(191, 255, 223);  //定义背景颜色

  //定义网格线的颜色:
  DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
  with (Sender as TDBGrid).Canvas do //画 cell 的边框
  begin
    Pen.Color := $00ff0000; //定义画笔颜色(蓝色)
    MoveTo(Rect.Left, Rect.Bottom); //画笔定位
    LineTo(Rect.Right, Rect.Bottom); //画蓝色的横线
    Pen.Color := clbtnface; //定义画笔颜色(兰色)
    MoveTo(Rect.Right, Rect.Top); //画笔定位
    LineTo(Rect.Right, Rect.Bottom); //画绿色
  end;
end;
//鼠标滚动 DBGrid  的数据跟着改变


procedure TRoleForm.GridMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  TDBGrid(Sender).DataSource.DataSet.MoveBy(-WheelDelta div WHEEL_DELTA);
  Handled := True;
end;

procedure TRoleForm.Label4Click(Sender: TObject);
begin
 if panel2.Width>10 then
  panel2.Width:=0
  else
  panel2.Width:=176;
end;




end.

⌨️ 快捷键说明

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