📄 loginfrm.pas
字号:
unit LoginFrm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SJCustomProperty, cxLookAndFeelPainters, PropStorageEh,
StdCtrls, cxButtons, ExtCtrls, cxControls, cxContainer, cxEdit, Registry,
cxTextEdit, cxMaskEdit, cxDropDownEdit, cxLookupEdit, cxDBLookupEdit,
cxDBLookupComboBox, cxDBEdit, fcLabel;
type
TfrmPropertyLogin = class(TSJCustomPropertyForm)
Label1: TLabel;
Label2: TLabel;
edtUser: TcxLookupComboBox;
edtPassword: TcxMaskEdit;
btnChangePassword: TcxButton;
labHint: TfcLabel;
Timer: TTimer;
Image1: TImage;
fcLabel39: TfcLabel;
procedure FormShow(Sender: TObject);
procedure TimerTimer(Sender: TObject);
procedure btnOKClick(Sender: TObject);
procedure btnChangePasswordClick(Sender: TObject);
procedure edtUserPropertiesEditValueChanged(Sender: TObject);
private
FIsFirstLogin: Boolean;
Fflag: Boolean;
FLoginCount: Integer;
public
{ Public declarations }
end;
var
frmPropertyLogin: TfrmPropertyLogin;
implementation
uses InvPrintDM, MainFrm, SJInvPrintGlobal, Encryption, sjUtils,
ChangePasswordFrm;
{$R *.dfm}
procedure TfrmPropertyLogin.FormShow(Sender: TObject);
// 显示最后一次登录的用户名
begin
inherited;
with TRegistry.Create do
try
RootKey := HKEY_LOCAL_MACHINE;
if OpenKey(GREGsysPath, False) then
if ValueExists('Default User') then
begin
edtUser.EditValue := ReadString('Default User');
edtPassword.SetFocus;
end;
CloseKey;
finally
Free;
end;
// 默认为超级用户
if edtUser.EditText = '' then
edtUser.EditValue := '00000';
FLoginCount := 1;
//edtUserPropertiesEditValueChanged(Sender);
edtPassword.SetFocus;
end;
procedure TfrmPropertyLogin.TimerTimer(Sender: TObject);
// 提示用户更改密码
begin
inherited;
Fflag := not Fflag;
if Fflag then
btnChangePassword.Font.Style := btnChangepassword.Font.Style + [fsBold]
else
btnChangePassword.Font.Style := btnChangepassword.Font.Style - [fsBold];
end;
procedure TfrmPropertyLogin.btnOKClick(Sender: TObject);
var
APassword: string;
begin
inherited;
// 对用户输入密码进行校验计数
if FLoginCount < gLoginCount then with dmInvPrint do
begin
Inc(FLoginCount);
// 检查是否是系统默认的密码或密码为空
if (edtPassword.Text = GDefaultPassword) and FIsFirstLogin then
begin
ModalResult := mrOK;
Exit;
end;
// 校验用户密码
try
if (Length(edtPassword.Text) = 0) and (Length(AtabUsers['Pwd']) = 0) then
begin
ModalResult := mrOK;
Exit;
end;
if edtPassword.Text = '' then
Apassword := ' '
else
Apassword := edtPassword.Text;
AtabUsers.Refresh;
if SimpleEnDecrypt(APassword, gKey) = AtabUsers['Pwd'] then
begin
// 用户输入了正确的密码,退出登录控制过程
ModalResult := mrOK;
Exit;
end else
// 用户终止程序的运行
begin
ShowMessage('您输入的口令不正确。');
edtPassword.SetFocus;
Exit;
end;
except
edtPassword.SetFocus;
Exit;
end;
end else // 非法用户
begin
ShowMessage('你没有取得正确的口令,请与系统管理员联系。');
Application.Terminate;
end;
end;
procedure TfrmPropertyLogin.btnChangePasswordClick(Sender: TObject);
// 用户修改密码
var
APassword: string;
begin
inherited;
with TfrmPropertyChangePassword.Create(Application) do
try
labUser.Caption := edtUser.EditText;
UserID := dmInvPrint.AtabUsers['UserID'];
if ShowModal = mrOK then
begin
APassword := '';
if edtNewPassword.Text <> '' then
begin
APassword := SimpleEnDecrypt(edtNewPassword.Text, GKey);
end;
// 如果用户输入的密码为空,则不对其进行加密转换
dmInvPrint.ChangePassword(edtUser.EditValue, APassword);
Timer.Enabled := False;
labHint.Caption := '';
btnChangePassword.Font.Style := btnChangepassword.Font.Style - [fsBold];
end;
finally
Free;
end;
end;
procedure TfrmPropertyLogin.edtUserPropertiesEditValueChanged(
Sender: TObject);
// 检查用户密码和用户当前状态
var
Avaliddays: Integer;
begin
inherited;
FIsFirstLogin := False;
Timer.Enabled := False;
labHint.Visible := False;
btnChangePassword.Font.Style := [];
if not dmInvPrint.AtabUsers.Locate('UserID', edtUser.EditValue, []) then
Exit;
// Check if the user has been locked
with dmInvPrint do
begin
if AtabUsers['Locked'] = True then
begin
ShowMessage('您的帐户已经被锁定,请与系统管理员联系解除锁定状态!');
btnChangePassword.Enabled := False;
btnOk.Enabled := False;
Application.Terminate;
end;
// If a user is the first use this system, hint him change password
if (AtabUsers['Createdate'] = AtabUsers['LastChangedate'])
and (AtabUsers['LoginChange'] = True) then
begin
labHint.Visible := True;
labHint.Caption := '您是第一次使用系统,建议修改密码';
FisFirstLogin := True;
Fflag := False;
Timer.Enabled := FIsFirstLogin;
Exit;
end;
// 检查用户密码是否需要更新了
Avaliddays := AtabUsers['Validday']; // 如果密码有效时间为0天则是永不过期设置
if Avaliddays = 0 then
Exit;
Avaliddays := AtabUsers['Validday'] - (Date - AtabUsers['LastChangedate']);
if Avaliddays < 0 then
begin
labHint.Visible := True;
labHint.Caption := '您的密码已经过期,建议您修改密码';
Fflag := False;
//btnChangePassword.Enabled := False;
//btnOk.Enabled := False;
Timer.Enabled := True;
end else if Avaliddays <= 7 then
begin
labHint.Visible := True;
labHint.Caption := Format('您的密码还有%d天就要过期了', [Avaliddays]);
Fflag := False;
Timer.Enabled := True;
end;
// 更新用户当前登录时间
try
AtabUsers.Edit;
AtabUsers['LastLogindate'] := Now;
AtabUsers['LoginChange'] := False;
AtabUsers.Post;
except
// 保存失败
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -