Chpswdlg.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:6k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1995, 1996 AO ROSNO             }
  6. {                                                       }
  7. {*******************************************************}
  8. unit ChPswDlg;
  9. {$I RX.INC}
  10. interface
  11. uses
  12.   SysUtils, {$IFDEF WIN32} Windows, {$ELSE} WinTypes, WinProcs, {$ENDIF}
  13.   Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons,
  14.   DBTables, DB;
  15. type
  16.   TChangePasswordEvent = function(UsersTable: TTable;
  17.     const OldPassword, NewPassword: string): Boolean of object;
  18.   TChPswdForm = class(TForm)
  19.     OldPswdLabel: TLabel;
  20.     OldPswd: TEdit;
  21.     NewPswdLabel: TLabel;
  22.     NewPswd: TEdit;
  23.     ConfirmLabel: TLabel;
  24.     ConfirmNewPswd: TEdit;
  25.     OkBtn: TButton;
  26.     CancelBtn: TButton;
  27.     procedure OkBtnClick(Sender: TObject);
  28.     procedure FormShow(Sender: TObject);
  29.     procedure FormCreate(Sender: TObject);
  30.     procedure PswdChange(Sender: TObject);
  31.   private
  32.     { Private declarations }
  33.     FAttempt: Integer;
  34.     FEnableEmpty: Boolean;
  35.     procedure ClearEdits;
  36.     procedure OkEnabled;
  37.   protected
  38.     procedure CreateParams(var Params: TCreateParams); override;
  39.   public
  40.     { Public declarations }
  41.     Database: TDatabase;
  42.     AttemptNumber: Integer;
  43.     UsersTableName: string;
  44.     UserNameField: string;
  45.     LoginName: string;
  46.     OnChangePassword: TChangePasswordEvent;
  47.   end;
  48. function ChangePasswordDialog(Database: TDatabase; AttemptNumber: Integer;
  49.   const UsersTableName, UserNameField, LoginName: string;
  50.   MaxPwdLen: Integer; EnableEmptyPassword: Boolean;
  51.   ChangePasswordEvent: TChangePasswordEvent): Boolean;
  52. implementation
  53. uses Consts, RXDConst, VCLUtils;
  54. {$R *.DFM}
  55. function ChangePasswordDialog(Database: TDatabase; AttemptNumber: Integer;
  56.   const UsersTableName, UserNameField, LoginName: string;
  57.   MaxPwdLen: Integer; EnableEmptyPassword: Boolean;
  58.   ChangePasswordEvent: TChangePasswordEvent): Boolean;
  59. var
  60.   Form: TChPswdForm;
  61.   SaveCursor: TCursor;
  62. begin
  63.   SaveCursor := Screen.Cursor;
  64.   Screen.Cursor := crDefault;
  65.   try
  66.     Form := TChPswdForm.Create(Application);
  67.     try
  68.       Form.Database := Database;
  69.       Form.AttemptNumber := AttemptNumber;
  70.       Form.UsersTableName := UsersTableName;
  71.       Form.UserNameField := UserNameField;
  72.       Form.LoginName := LoginName;
  73.       Form.OldPswd.MaxLength := MaxPwdLen;
  74.       Form.NewPswd.MaxLength := MaxPwdLen;
  75.       Form.ConfirmNewPswd.MaxLength := MaxPwdLen;
  76.       Form.FEnableEmpty := EnableEmptyPassword;
  77.       Form.OnChangePassword := ChangePasswordEvent;
  78.       Result := (Form.ShowModal = mrOk);
  79.     finally
  80.       Form.Free;
  81.     end;
  82.   finally
  83.     Screen.Cursor := SaveCursor;
  84.   end;
  85. end;
  86. { TChPswdForm }
  87. procedure TChPswdForm.CreateParams(var Params: TCreateParams);
  88. begin
  89.   inherited CreateParams(Params);
  90. end;
  91. procedure TChPswdForm.FormCreate(Sender: TObject);
  92. begin
  93.   Caption := LoadStr(SChangePassword);
  94.   OldPswdLabel.Caption := LoadStr(SOldPasswordLabel);
  95.   NewPswdLabel.Caption := LoadStr(SNewPasswordLabel);
  96.   ConfirmLabel.Caption := LoadStr(SConfirmPasswordLabel);
  97.   OkBtn.Caption := ResStr(SOKButton);
  98.   CancelBtn.Caption := ResStr(SCancelButton);
  99. end;
  100. procedure TChPswdForm.ClearEdits;
  101. begin
  102.   OldPswd.Text := '';
  103.   NewPswd.Text := '';
  104.   ConfirmNewPswd.Text := '';
  105.   OkBtn.Enabled := FEnableEmpty;
  106. end;
  107. procedure TChPswdForm.OkEnabled;
  108. begin
  109.   OkBtn.Enabled := FEnableEmpty or ((OldPswd.Text <> '') and (NewPswd.Text <> '')
  110.     and (ConfirmNewPswd.Text <> ''));
  111. end;
  112. procedure TChPswdForm.OkBtnClick(Sender: TObject);
  113. type
  114.   TChangePasswordError = (peMismatch, peOther);
  115. var
  116.   Table: TTable;
  117.   Ok: Boolean;
  118.   Error: TChangePasswordError;
  119. begin
  120.   Ok := False;
  121.   Inc(FAttempt);
  122.   try
  123.     if not (FAttempt > AttemptNumber) then begin
  124.       if UsersTableName <> '' then Table := TTable.Create(Self)
  125.       else Table := nil;
  126.       try
  127.         Error := peOther;
  128.         if Table <> nil then begin
  129.           Table.DatabaseName := Database.DatabaseName;
  130. {$IFDEF WIN32}
  131.           Table.SessionName := Database.SessionName;
  132. {$ENDIF}
  133.           Table.TableName := UsersTableName;
  134.           Table.IndexFieldNames := UserNameField;
  135.           Table.Open;
  136.           if Table.FindKey([LoginName]) then begin
  137.             if NewPswd.Text <> ConfirmNewPswd.Text then
  138.               Error := peMismatch
  139.             else begin
  140.               if Assigned(OnChangePassword) then
  141.                 Ok := OnChangePassword(Table, OldPswd.Text, NewPswd.Text);
  142.             end;
  143.           end;
  144.         end
  145.         else begin
  146.           if NewPswd.Text <> ConfirmNewPswd.Text then
  147.             Error := peMismatch
  148.           else begin
  149.             if Assigned(OnChangePassword) then
  150.               Ok := OnChangePassword(Table, OldPswd.Text, NewPswd.Text);
  151.           end;
  152.         end;
  153.         if Ok then
  154.           MessageDlg(LoadStr(SPasswordChanged), mtInformation, [mbOk], 0)
  155.         else
  156.           if Error = peMismatch then
  157.             MessageDlg(LoadStr(SPasswordsMismatch), mtError, [mbOk], 0)
  158.           else MessageDlg(LoadStr(SPasswordNotChanged), mtError, [mbOk], 0);
  159.       finally
  160.         if Table <> nil then Table.Free;
  161.       end;
  162.     end;
  163.   finally
  164.     if Ok then ModalResult := mrOk
  165.     else begin
  166.       if FAttempt > AttemptNumber then ModalResult := mrCancel
  167.       else ModalResult := mrNone;
  168.     end;
  169.   end;
  170. end;
  171. procedure TChPswdForm.FormShow(Sender: TObject);
  172. begin
  173.   ClearEdits;
  174. end;
  175. procedure TChPswdForm.PswdChange(Sender: TObject);
  176. begin
  177.   OkEnabled;
  178. end;
  179. end.