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

📄 szkl.pas

📁 计算机房管理系统 V0.9 源代码
💻 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 + -