📄 szkl.pas
字号:
unit szkl;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, Menus, Buttons, Db, DBTables, ExtCtrls;
type
Tf_szkl = class(TForm)
ImageList1: TImageList;
qxgb: TGroupBox;
qxtree: TTreeView;
klgb: TGroupBox;
re_pw: TEdit;
Label2: TLabel;
Label3: TLabel;
ok: TBitBtn;
cancel: TBitBtn;
new_pw: TEdit;
GroupBox3: TGroupBox;
retmess: TMemo;
Label1: TLabel;
old_pw: TEdit;
chtime: TTimer;
qx_new: TSpeedButton;
qx_delete: TSpeedButton;
qx_help: TSpeedButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure cancelClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure okClick(Sender: TObject);
procedure new_pwKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure re_pwKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure InitQxtree;
procedure old_pwKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure qxtreeDblClick(Sender: TObject);
procedure qxtreeEditing(Sender: TObject; Node: TTreeNode; var AllowEdit: Boolean);
procedure qxtreeEdited(Sender: TObject; Node: TTreeNode; var S: String);
procedure chtimeTimer(Sender: TObject);
procedure qx_newClick(Sender: TObject);
procedure qx_deleteClick(Sender: TObject);
procedure qx_helpClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
f_szkl: Tf_szkl;
qxcount,pcount : integer; //权限总数,操作员总数
qx,qxx,qxg : string; //权限,权限内容,管理员权限内容
qxNode,qxNode1,chNode,newNode : TTreeNode; //权限树,权限树1,改变的权限树,新建权限树
chCheck : integer; //权限树改变状态
nr : string; //改变前权限的内容
i,j : integer;
implementation
uses jfos, gbv, data, qxhelp;
{$R *.DFM}
procedure Tf_szkl.FormClose(Sender: TObject; var Action: TCloseAction);
begin
f_jfos.Enabled:=True;
end;
procedure Tf_szkl.cancelClick(Sender: TObject);
begin
f_szkl.Close;
end;
procedure Tf_szkl.FormShow(Sender: TObject);
begin
//得到权限号和管理员权限
qx:=f_gbv.pass_qx.Caption;
qxg:=f_gbv.pass_qxx.Caption;
//设置管理员和操作员的初始化状态
if (qx='0') or (qx='2') then
begin //管理员设置
qxgb.Enabled:=True; //允许操作管理员系统
retmess.Text:=' 管理员可以新建或删除多个操作员,并可以将自己所拥有的权限加以限制的分配给操作员,并建立和修改他们的口令。';
klgb.Caption:='管理员口令设置';
InitQxtree;
end
else
begin //操作员设置
qxgb.Enabled:=False; //禁止操作管理员系统
//收起权限树
qxtree.Items[0].Text:='管理员系统';
qxtree.Items[0].Collapse(True);
retmess.Text:=' 操作员只能修改自己的口令,无权修改管理员系统。';
klgb.Caption:='操作员口令设置';
end;
//初始化口令框
old_pw.Text:='';
new_pw.Text:='';
re_pw.Text:='';
old_pw.SetFocus;
end;
procedure Tf_szkl.InitQxtree();
begin //初始化权限树
//删除旧管理员
qxtree.Items.Delete(qxtree.Items[1]);
//新建、修改管理员类型和姓名
if qx='0' then
qxtree.Items[0].Text:='用户管理员'
else
qxtree.Items[0].Text:='设备管理员';
qxNode:=qxtree.Items.AddChild(qxtree.Items[0],f_gbv.pass_name.Caption);
qxNode.StateIndex:=6;
//得到权限总数
with ds_data.Qu_qxcount do
begin
Close;
Open;
qxcount:=RecordCount;
end;
//打开权限数据库
with ds_data.Qu_chqx do
begin
//参数设置
Close;
ParamByName('qx').value:=IntToStr(StrToInt(qx)+1);
Open;
pcount:=RecordCount; //得到操作员总数
//添加操作员
for i:=1 to pcount do
begin
ds_data.Qu_qxcount.First;
qxx:=FieldByName('qxx').AsString; //得到权限内容
//添加操作员姓名
qxNode:=qxtree.Items.AddChild(qxtree.Items[1],FieldByName('name').AsString);
qxNode.StateIndex:=5;
//添加操作员口令
qxNode1:=qxtree.Items.AddChild(qxNode,'设置口令');
qxNode1.StateIndex:=4;
qxtree.Items.AddChild(qxNode1,FieldByName('passwd').AsString);
//添加操作员权限
for j:=1 to qxcount do
begin //添加操作员权限
qxNode1:=qxtree.Items.AddChild(qxNode,ds_data.Qu_qxcount.FieldByName('name').AsString);
ds_data.Qu_qxcount.Next; //下一个权限内容
//更新权限
if qxx[j]='1' then
qxNode1.StateIndex:=1
else
if qxg[j]='1' then
qxNode1.StateIndex:=2
else
qxNode1.StateIndex:=3;
end;
Next; //下一个操作员
end;
Close; //关闭权限数据库
end;
ds_data.Qu_qxcount.Close; //关闭权限内容数据库
//展开权限树
qxtree.Items[0].Expand(False);
qxtree.Items[1].Expand(False);
end;
procedure Tf_szkl.okClick(Sender: TObject);
var index : integer; //权限树索引
begin
if (qx='0') or (qx='2') then //更新口令数据库
with ds_data.Qu_chqx do
begin
//修改管理员姓名
//参数设置
Close;
ParamByName('qx').value:=qx;
Open;
//修改管理员姓名
Edit;
FieldByName('name').AsString:=qxtree.Items[1].Text;
Post;
Close;
//更新保存姓名
f_gbv.pass_name.Caption:=qxtree.Items[1].Text;
//修改操作员内容
//参数设置
Close;
ParamByName('qx').value:=IntToStr(StrToInt(qx)+1);
Open;
//删除所有操作员
for i:=1 to RecordCount do
Delete;
//添加所有操作员
for i:=1 to Pcount do
begin
index:=(i-1)*(qxcount+3)+2; //得到操作员索引
//初始化权限内容
qxx:='';
for j:=1 to qxcount do
begin
if qxtree.Items[index+j+2].StateIndex=1 then
qxx:=qxx+'1'
else
qxx:=qxx+'0';
end;
//更新操作员口令数据库
Append;;
FieldByName('name').AsString:=qxtree.Items[index].Text;
FieldByName('passwd').AsString:=qxtree.Items[index+2].Text;
FieldByName('qx').AsString:=IntToStr(StrToInt(qx)+1);
FieldByName('qxx').AsString:=qxx;
Post;
end;
Close; //关闭口令数据库
end;
//是否改变口令
if (old_pw.Text='') and (new_pw.Text='') and (re_pw.Text='') then
begin //不改变口令
f_szkl.Close;
Exit;
end;
//改变口令
if (old_pw.Text=f_gbv.pass_passwd.Caption) and (new_pw.Text=re_pw.Text) then
begin
//空口令判断
if new_pw.Text='' then
begin //空口令提示
Application.MessageBox('口令不能为空。', '错误', Mb_OK);
new_pw.SetFocus;
exit;
end;
//改变口令
with ds_data.Qu_chpw do
begin
//参数设置
Close;
ParamByName('name').value:=f_gbv.pass_name.Caption;
ParamByName('passwd').value:=f_gbv.pass_passwd.Caption;
//判断登录方式
if (qx='2') or (qx='3') then
DatabaseName:='sbos' //设备登录
else
DatabaseName:='yhos'; //用户登录
//打开数据库、更改口令
Open;
Edit;
FieldByName('passwd').AsString:=new_pw.Text;
Post;
Close;
//更新保存口令
f_gbv.pass_passwd.Caption:=new_pw.Text;
end;
//关闭窗口
f_szkl.Close;
end
else
begin //口令检查错误
Application.MessageBox('口令检查错误,请重新输入口令。', '错误', Mb_OK);
old_pw.Text:='';
new_pw.Text:='';
re_pw.Text:='';
old_pw.SetFocus;
end;
end;
procedure Tf_szkl.old_pwKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
//更改焦点
if (Key=13) or (Key=40) then new_pw.SetFocus;
end;
procedure Tf_szkl.new_pwKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
//更改焦点
if (Key=13) or (Key=40) then re_pw.SetFocus;
if Key=38 then old_pw.SetFocus;
end;
procedure Tf_szkl.re_pwKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
//更改焦点
if Key=38 then new_pw.SetFocus;
//更改口令
if Key=13 then okClick(nil);
end;
procedure Tf_szkl.qxtreeDblClick(Sender: TObject);
var EditState : integer; //更改权限索引
begin
//得到更改权限索引
EditState:=qxtree.Selected.StateIndex;
//判断修改权限
if ((EditState=1) or (EditState=2)) and (qxtree.Selected.Level=3) then
begin //修改权限
qxtree.Selected.StateIndex:=3-qxtree.Selected.StateIndex;
qxtree.Refresh;
end;
end;
procedure Tf_szkl.qxtreeEditing(Sender: TObject; Node: TTreeNode; var AllowEdit: Boolean);
var EditLev : integer; //更改权限内容级别判断
begin
EditLev:=qxtree.Selected.Level; //得到更改权限内容级别
if (EditLev=0) or (EditLev=3) then
AllowEdit:=False; //放弃修改
end;
procedure Tf_szkl.qxtreeEdited(Sender: TObject; Node: TTreeNode; var S: String);
begin
chCheck:=0; //权限树改变状态置0
if s='' then
begin //改变内容为空
chCheck:=1; //权限树改变状态置1
Application.MessageBox('姓名和口令不能为空。', '错误', Mb_OK);
end;
//初始化改变的权限树
chNode:=Node;
nr:=Node.Text;
//打开对改变权限树的判断
if (Node.Level=1) or (Node.Level=2) or (Node.Level=4) then
chTime.Enabled:=True;
end;
procedure Tf_szkl.chtimeTimer(Sender: TObject);
var index : integer; //权限树索引
begin
chTime.Enabled:=False;
if chCheck=1 then
chNode.Text:=nr //更改内容为空的复原
else
//姓名重复判断
if chNode.Level<>4 then
for i:=0 to pcount do
begin //判断管理员和每一个操作员
if i=0 then
index:=1 //管理员索引
else
index:=(i-1)*(qxcount+3)+2; //操作员索引
if chNode.AbsoluteIndex<>index then //避免对自己的判断
if chNode.Text=qxtree.Items[index].Text then
begin //姓名重复
Application.MessageBox('姓名不能重复。', '错误', Mb_OK);
chNode.Text:=nr; //复原姓名
end;
end;
end;
procedure Tf_szkl.qx_newClick(Sender: TObject);
var newName : string;
index : integer; //权限树索引
namecount,succ : integer; //姓名树、姓名不重复标志
begin //新建操作员
//展开权限树
qxtree.Items[0].Expand(False);
qxtree.Items[1].Expand(False);
//打开权限内容数据库
ds_data.Qu_qxcount.Close;
ds_data.Qu_qxcount.Open;
//操作员总数+1
pcount:=pcount+1;
//新建操作员的权限和管理员一样
qxx:=f_gbv.pass_qxx.Caption;
//姓名初始化判断
namecount:=1;
succ:=0;
while (succ=0) do
begin
//姓名初始化
newName:='新建操作员'+IntToStr(namecount);
succ:=1;
//判断操作员姓名是否重复
for i:=0 to pcount-1 do
begin //判断管理员和每一个操作员
if i=0 then
index:=1 //管理员索引
else
index:=(i-1)*(qxcount+3)+2; //操作员索引
if newName=qxtree.Items[index].Text then
succ:=0; //姓名重复
end;
if succ=0 then namecount:=namecount+1;
end;
//添加操作员姓名
newNode:=qxtree.Items.AddChild(qxtree.Items[1],newName);
newNode.StateIndex:=5;
//添加操作员口令
qxNode1:=qxtree.Items.AddChild(newNode,'设置口令');
qxNode1.StateIndex:=4;
qxtree.Items.AddChild(qxNode1,'jfos');
//添加操作员权限
for j:=1 to qxcount do
begin //添加操作员权限
qxNode1:=qxtree.Items.AddChild(newNode,ds_data.Qu_qxcount.FieldByName('name').AsString);
ds_data.Qu_qxcount.Next; //下一个权限内容
//更新权限
if qxx[j]='1' then
qxNode1.StateIndex:=1
else
qxNode1.StateIndex:=3;
end;
//关闭权限内容数据库
ds_data.Qu_qxcount.Close;
//手动修改姓名
newNode.Selected:=True;
newNode.EditText;
end;
procedure Tf_szkl.qx_deleteClick(Sender: TObject);
begin //删除操作员
if qxtree.Selected.AbsoluteIndex>1 then
if qxtree.Selected.Level=2 then
if Application.MessageBox(PChar('删除操作员 '+qxtree.Selected.Text), '询问', Mb_OKCancel)=IdOk then
begin
qxtree.Items[qxtree.Selected.AbsoluteIndex].Delete;
pcount:=pcount-1; //操作员总数-1
end;
end;
procedure Tf_szkl.qx_helpClick(Sender: TObject);
begin
f_szkl.Enabled:=False;
f_qxhelp.Show;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -