?? rxlogin.pas
字號(hào):
procedure TRxCustomLogin.UnlockOkClick(Sender: TObject);
var
Ok: Boolean;
begin
with TRxLoginForm(Sender) do begin
Ok := False;
try
Ok := CheckUnlock(UserNameEdit.Text, PasswordEdit.Text);
except
Application.HandleException(Self);
end;
if Ok then ModalResult := mrOk
else ModalResult := mrCancel;
end;
end;
function TRxCustomLogin.CheckUnlock(const UserName, Password: string): Boolean;
begin
Result := True;
if Assigned(FOnUnlockApp) then
FOnUnlockApp(Self, UserName, Password, Result)
else if Assigned(FOnUnlock) then
Result := FOnUnlock(Password);
end;
function TRxCustomLogin.CreateLoginForm(UnlockMode: Boolean): TRxLoginForm;
begin
Result := TRxLoginForm.Create(Application);
with Result do begin
FUnlockMode := UnlockMode;
if FUnlockMode then begin
FormStyle := fsNormal;
FSelectDatabase := False;
end
else FormStyle := fsStayOnTop;
if Assigned(Self.FOnIconDblClick) then begin
with AppIcon do begin
OnDblClick := DoIconDblClick;
Cursor := crHand;
end;
with KeyImage do begin
OnDblClick := DoIconDblClick;
Cursor := crHand;
end;
end;
PasswordEdit.MaxLength := FMaxPasswordLen;
AttemptNumber := Self.AttemptNumber;
end;
end;
function TRxCustomLogin.DoUnlockDialog: Boolean;
begin
with CreateLoginForm(True) do
try
OnFormShow := nil;
OnOkClick := UnlockOkClick;
with UserNameEdit do begin
Text := LoggedUser;
ReadOnly := True;
Font.Color := clGrayText;
end;
Result := ShowModal = mrOk;
finally
Free;
end;
end;
function TRxCustomLogin.UnlockHook(var Message: TMessage): Boolean;
function DoUnlock: Boolean;
var
Popup: HWnd;
begin
with Application do
if IsWindowVisible(Handle) and IsWindowEnabled(Handle) then
{$IFDEF WIN32}
SetForegroundWindow(Handle);
{$ELSE}
BringWindowToTop(Handle);
{$ENDIF}
if FUnlockDlgShowing then begin
Popup := GetLastActivePopup(Application.Handle);
if (Popup <> 0) and IsWindowVisible(Popup) and
(WindowClassName(Popup) = TRxLoginForm.ClassName) then
begin
{$IFDEF WIN32}
SetForegroundWindow(Popup);
{$ELSE}
BringWindowToTop(Popup);
{$ENDIF}
end;
Result := False;
Exit;
end;
FUnlockDlgShowing := True;
try
Result := DoUnlockDialog;
finally
FUnlockDlgShowing := False;
end;
if Result then begin
Application.UnhookMainWindow(UnlockHook);
FLocked := False;
end;
end;
begin
Result := False;
if not FLocked then Exit;
with Message do begin
case Msg of
WM_QUERYOPEN:
begin
UnlockHook := not DoUnlock;
end;
WM_SHOWWINDOW:
if Bool(WParam) then begin
UnlockHook := not DoUnlock;
end;
WM_SYSCOMMAND:
if (WParam and $FFF0 = SC_RESTORE) or
(WParam and $FFF0 = SC_ZOOM) then
begin
UnlockHook := not DoUnlock;
end;
end;
end;
end;
{ TRxLoginDialog }
procedure TRxLoginDialog.Loaded;
var
Loading: Boolean;
begin
Loading := csLoading in ComponentState;
inherited Loaded;
if not (csDesigning in ComponentState) and Loading then begin
if Active and not Login then
TerminateApplication;
end;
end;
procedure TRxLoginDialog.OkButtonClick(Sender: TObject);
var
SetCursor: Boolean;
begin
with TRxLoginForm(Sender) do begin
{$IFDEF WIN32}
SetCursor := GetCurrentThreadID = MainThreadID;
{$ELSE}
SetCursor := True;
{$ENDIF}
try
if SetCursor then Screen.Cursor := crHourGlass;
try
if DoCheckUser(UserNameEdit.Text, PasswordEdit.Text) then
ModalResult := mrOk
else ModalResult := mrNone;
finally
if SetCursor then Screen.Cursor := crDefault;
end;
except
Application.HandleException(Self);
end;
end;
end;
function TRxLoginDialog.DoCheckUser(const UserName, Password: string): Boolean;
begin
Result := True;
if Assigned(FOnCheckUser) then
FOnCheckUser(Self, UserName, Password, Result);
end;
procedure TRxLoginDialog.WriteUserName(const UserName: string);
var
Ini: TObject;
begin
try
{$IFDEF WIN32}
if UseRegistry then Ini := TRegIniFile.Create(IniFileName)
else Ini := TIniFile.Create(IniFileName);
{$ELSE}
Ini := TIniFile.Create(IniFileName);
{$ENDIF}
try
IniWriteString(Ini, keyLoginSection, keyLastLoginUserName, UserName);
finally
Ini.Free;
end;
except
end;
end;
function TRxLoginDialog.ReadUserName(const UserName: string): string;
var
Ini: TObject;
begin
try
{$IFDEF WIN32}
if UseRegistry then begin
Ini := TRegIniFile.Create(IniFileName);
{$IFDEF RX_D5}
TRegIniFile(Ini).Access := KEY_READ;
{$ENDIF}
end
else
Ini := TIniFile.Create(IniFileName);
{$ELSE}
Ini := TIniFile.Create(IniFileName);
{$ENDIF}
try
Result := IniReadString(Ini, keyLoginSection, keyLastLoginUserName,
UserName);
finally
Ini.Free;
end;
except
Result := UserName;
end;
end;
function TRxLoginDialog.DoLogin(var UserName: string): Boolean;
begin
try
with CreateLoginForm(False) do
try
OnOkClick := Self.OkButtonClick;
UserName := ReadUserName(UserName);
UserNameEdit.Text := UserName;
Result := (ShowModal = mrOk);
if Result then begin
UserName := UserNameEdit.Text;
WriteUserName(UserName);
end;
finally
Free;
end;
except
Application.HandleException(Self);
Result := False;
end;
end;
{ TRxLoginForm }
procedure TRxLoginForm.FormCreate(Sender: TObject);
begin
Icon := Application.Icon;
if Icon.Empty then Icon.Handle := LoadIcon(0, IDI_APPLICATION);
AppIcon.Picture.Assign(Icon);
AppTitleLabel.Caption := FmtLoadStr(SAppTitleLabel, [Application.Title]);
PasswordLabel.Caption := LoadStr(SPasswordLabel);
UserNameLabel.Caption := LoadStr(SUserNameLabel);
OkBtn.Caption := ResStr(SOKButton);
CancelBtn.Caption := ResStr(SCancelButton);
end;
procedure TRxLoginForm.OkBtnClick(Sender: TObject);
begin
Inc(FAttempt);
if Assigned(FOnOkClick) then FOnOkClick(Self)
else ModalResult := mrOk;
if (ModalResult <> mrOk) and (FAttempt >= AttemptNumber) then
ModalResult := mrCancel;
end;
procedure TRxLoginForm.FormShow(Sender: TObject);
var
I: Integer;
S: string;
begin
if FSelectDatabase then begin
ClientHeight := CustomCombo.Top + PasswordEdit.Top - UserNameEdit.Top;
S := LoadStr(SDatabaseName);
I := Pos(':', S);
if I = 0 then I := Length(S);
CustomLabel.Caption := '&' + Copy(S, 1, I);
end
else begin
ClientHeight := PasswordEdit.Top + PasswordEdit.Top - UserNameEdit.Top;
CustomLabel.Visible := False;
CustomCombo.Visible := False;
end;
if not FUnlockMode then begin
HintLabel.Caption := LoadStr(SHintLabel);
Caption := LoadStr(SRegistration);
end
else begin
HintLabel.Caption := LoadStr(SUnlockHint);
Caption := LoadStr(SUnlockCaption);
end;
if (UserNameEdit.Text = EmptyStr) and not FUnlockMode then
ActiveControl := UserNameEdit
else
ActiveControl := PasswordEdit;
if Assigned(FOnFormShow) then FOnFormShow(Self);
FAttempt := 0;
end;
end.
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -