📄 role_m.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 + -