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

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1998 Master-Bank                }
  6. {                                                       }
  7. {*******************************************************}
  8. unit RxRemLog;
  9. interface
  10. {$I RX.INC}
  11. {$IFDEF RX_D3}
  12. {$IFDEF RX_MIDAS}
  13. uses SysUtils, Windows, Messages, Classes, Graphics, Controls, Forms,
  14.   Dialogs, RxLogin, DBClient;
  15. { TRxRemoteLogin }
  16. type
  17.   TRxRemoteLogin = class(TRxCustomLogin)
  18.   private
  19.     FRemoteServer: TCustomRemoteServer;
  20.     FPrepared: Boolean;
  21.     FUsername: string;
  22.     FInLogin: Boolean;
  23.     FOnCheckUser: TRxLoginEvent;
  24.     FSaveAfterConnect: TNotifyEvent;
  25.     procedure AbortConnection;
  26.     procedure OkButtonClick(Sender: TObject);
  27.     procedure PrepareRemoteServer;
  28.     procedure UnprepareRemoteServer;
  29.     procedure ServerAfterConnect(Sender: TObject);
  30.     procedure SetRemoteServer(Value: TCustomRemoteServer);
  31.     procedure WriteUserName(const UserName: string);
  32.     function ReadUserName(const UserName: string): string;
  33.   protected
  34.     function DoCheckUser(const UserName, Password: string): Boolean; dynamic;
  35.     function DoLogin(var UserName: string): Boolean; override;
  36.     procedure Loaded; override;
  37.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  38.   public
  39.     constructor Create(AOwner: TComponent); override;
  40.     destructor Destroy; override;
  41.   published
  42.     property RemoteServer: TCustomRemoteServer read FRemoteServer write SetRemoteServer;
  43.     property Active;
  44.     property AllowEmptyPassword;
  45.     property AttemptNumber;
  46.     property IniFileName;
  47.     property MaxPasswordLen;
  48.     property UpdateCaption;
  49.     property UseRegistry;
  50.     property OnCheckUser: TRxLoginEvent read FOnCheckUser write FOnCheckUser;
  51.     property AfterLogin;
  52.     property BeforeLogin;
  53.     property OnUnlock;
  54.     property OnUnlockApp;
  55.     property OnIconDblClick;
  56.   end;
  57. {$ENDIF RX_MIDAS}
  58. {$ENDIF RX_D3}
  59. implementation
  60. {$IFDEF RX_D3}
  61. {$IFDEF RX_MIDAS}
  62. uses IniFiles, Registry, AppUtils, VclUtils {$IFDEF RX_D4}, MConnect {$ENDIF};
  63. const
  64.   keyLoginSection  = 'Remote Login';
  65.   keyLastLoginUserName = 'Last User';
  66. type
  67.   TServer = class(TCustomRemoteServer);
  68. { TRxRemoteLogin }
  69. constructor TRxRemoteLogin.Create(AOwner: TComponent);
  70. begin
  71.   inherited Create(AOwner);
  72. end;
  73. destructor TRxRemoteLogin.Destroy;
  74. begin
  75.   UnprepareRemoteServer;
  76.   inherited Destroy;
  77. end;
  78. procedure TRxRemoteLogin.Notification(AComponent: TComponent; Operation: TOperation);
  79. begin
  80.   inherited Notification(AComponent, Operation);
  81.   if (Operation = opRemove) and (AComponent = RemoteServer) then
  82.     RemoteServer := nil;
  83. end;
  84. procedure TRxRemoteLogin.Loaded;
  85. var
  86.   Loading: Boolean;
  87. begin
  88.   Loading := csLoading in ComponentState;
  89.   inherited Loaded;
  90.   if not (csDesigning in ComponentState) and Loading and
  91.     Assigned(FRemoteServer) then
  92.   begin
  93.     if not Active then PrepareRemoteServer
  94.     else if not Login then TerminateApplication;
  95.   end;
  96. end;
  97. procedure TRxRemoteLogin.SetRemoteServer(Value: TCustomRemoteServer);
  98. begin
  99.   if FRemoteServer <> Value then begin
  100.     UnprepareRemoteServer;
  101.     FRemoteServer := Value;
  102.     if Value <> nil then begin
  103.       Value.FreeNotification(Self);
  104.       if not (csLoading in ComponentState) then PrepareRemoteServer;
  105.     end;
  106.   end;
  107. end;
  108. procedure TRxRemoteLogin.PrepareRemoteServer;
  109. begin
  110.   if Assigned(FRemoteServer) and not FPrepared then
  111.     with TServer(RemoteServer) do begin
  112. {$IFDEF RX_D4}
  113.       if RemoteServer is TDispatchConnection then
  114.         TDispatchConnection(RemoteServer).LoginPrompt := False;
  115. {$ENDIF}
  116.       FSaveAfterConnect := AfterConnect;
  117.       AfterConnect := ServerAfterConnect;
  118.       FPrepared := True;
  119.     end;
  120. end;
  121. procedure TRxRemoteLogin.UnprepareRemoteServer;
  122. begin
  123.   if Assigned(FRemoteServer) and FPrepared then
  124.     with TServer(RemoteServer) do begin
  125.       AfterConnect := FSaveAfterConnect;
  126.       FPrepared := False;
  127.     end;
  128. end;
  129. procedure TRxRemoteLogin.OkButtonClick(Sender: TObject);
  130. var
  131.   SetCursor: Boolean;
  132. begin
  133.   with TRxLoginForm(Sender) do begin
  134.     SetCursor := GetCurrentThreadID = MainThreadID;
  135.     try
  136.       if SetCursor then Screen.Cursor := crHourGlass;
  137.       try
  138.         if DoCheckUser(UserNameEdit.Text, PasswordEdit.Text) then
  139.           ModalResult := mrOk
  140.         else ModalResult := mrNone;
  141.       finally
  142.         if SetCursor then Screen.Cursor := crDefault;
  143.       end;
  144.     except
  145.       Application.HandleException(Self);
  146.     end;
  147.   end;
  148. end;
  149. procedure TRxRemoteLogin.ServerAfterConnect(Sender: TObject);
  150. {$IFDEF RX_D4}
  151. var
  152.   OnGetUser: TGetUsernameEvent;
  153. {$ENDIF}
  154. begin
  155.   if Sender = FRemoteServer then begin
  156.     if not FInLogin then DoBeforeLogin;
  157.     with CreateLoginForm(False) do
  158.     try
  159.       OnOkClick := Self.OkButtonClick;
  160.       FUsername := ReadUserName(FUsername);
  161. {$IFDEF RX_D4}
  162.       if FRemoteServer is TDispatchConnection then begin
  163.         OnGetUser := TDispatchConnection(FRemoteServer).OnGetUsername;
  164.         if Assigned(OnGetUser) then OnGetUser(FRemoteServer, FUsername);
  165.       end;
  166. {$ENDIF}
  167.       UserNameEdit.Text := FUsername;
  168.       if ShowModal = mrOk then begin
  169.         FUsername := UserNameEdit.Text;
  170.         WriteUserName(FUsername);
  171.         if not FInLogin then begin
  172.           SetLoggedUser(FUsername);
  173.           DoUpdateCaption;
  174.           DoAfterLogin;
  175.         end;
  176.       end
  177.       else begin
  178.         AbortConnection;
  179.         SysUtils.Abort;
  180.       end;
  181.     finally
  182.       Free;
  183.     end;
  184.   end;
  185. end;
  186. function TRxRemoteLogin.DoCheckUser(const UserName, Password: string): Boolean;
  187. begin
  188.   Result := True;
  189.   if Assigned(FOnCheckUser) then
  190.     FOnCheckUser(Self, UserName, Password, Result);
  191. end;
  192. procedure TRxRemoteLogin.WriteUserName(const UserName: string);
  193. var
  194.   Ini: TObject;
  195. begin
  196.   try
  197.     if UseRegistry then Ini := TRegIniFile.Create(IniFileName)
  198.     else Ini := TIniFile.Create(IniFileName);
  199.     try
  200.       IniWriteString(Ini, keyLoginSection, keyLastLoginUserName, UserName);
  201.     finally
  202.       Ini.Free;
  203.     end;
  204.   except
  205.   end;
  206. end;
  207. function TRxRemoteLogin.ReadUserName(const UserName: string): string;
  208. var
  209.   Ini: TObject;
  210. begin
  211.   try
  212.     if UseRegistry then begin
  213.       Ini := TRegIniFile.Create(IniFileName);
  214. {$IFDEF RX_D5}
  215.       TRegIniFile(Ini).Access := KEY_READ;
  216. {$ENDIF}
  217.     end
  218.     else Ini := TIniFile.Create(IniFileName);
  219.     try
  220.       Result := IniReadString(Ini, keyLoginSection, keyLastLoginUserName,
  221.         UserName);
  222.     finally
  223.       Ini.Free;
  224.     end;
  225.   except
  226.     Result := UserName;
  227.   end;
  228. end;
  229. procedure TRxRemoteLogin.AbortConnection;
  230. var
  231.   OnAfterDisconnect, OnBeforeDisconnect: TNotifyEvent;
  232. begin
  233.   if Assigned(FRemoteServer) and TServer(FRemoteServer).Connected then
  234.   try
  235.     OnAfterDisconnect := TServer(FRemoteServer).AfterDisconnect;
  236.     OnBeforeDisconnect := TServer(FRemoteServer).BeforeDisconnect;
  237.     try
  238.       TServer(FRemoteServer).AfterDisconnect := nil;
  239.       TServer(FRemoteServer).BeforeDisconnect := nil;
  240.       TServer(FRemoteServer).Connected := False;
  241.     finally
  242.       TServer(FRemoteServer).AfterDisconnect := OnAfterDisconnect;
  243.       TServer(FRemoteServer).BeforeDisconnect := OnBeforeDisconnect;
  244.     end;
  245.   except
  246.   end;
  247. end;
  248. function TRxRemoteLogin.DoLogin(var UserName: string): Boolean;
  249. begin
  250.   Result := False;
  251.   if not Assigned(FRemoteServer) then Exit;
  252.   PrepareRemoteServer;
  253.   FUsername := UserName;
  254.   try
  255.     FInLogin := True;
  256.     try
  257.       TServer(FRemoteServer).Connected := True;
  258.       Result := TServer(FRemoteServer).Connected;
  259.       UserName := FUsername;
  260.       FUsername := '';
  261.     finally
  262.       FInLogin := False;
  263.     end;
  264.   except
  265.     Application.HandleException(Self);
  266.     Result := False;
  267.     FUsername := '';
  268.     AbortConnection;
  269.   end;
  270.   if Result and Assigned(FSaveAfterConnect) then
  271.     FSaveAfterConnect(FRemoteServer);
  272. end;
  273. {$ENDIF RX_MIDAS}
  274. {$ENDIF RX_D3}
  275. end.