• DELPHI用户登录窗口框架


    经常看到一些新手在CSDN上问登录窗口如何写,也看到N多人form1.show/form1.create/…中做form2.show之类。实在看不下去了。这种写法实在不是很好,于是还是把自己理解的登录框架来写写吧。希望能给新人一些引导(可不要误导了呀!)

    1.登录窗口在什么地方调用?

    我说:最好在项目文件中,splash窗口显示过,一些需要加载的资源、窗口加载过后,Application.Run之前,进行用户登录。此时,可能用到的数据连接已经建立起来了,登录就可以进系统。

    2.如何调用登录窗口?

    我说:在登录窗口单元提供一个函数出来吧,比如Login():Boolean; 这样在要到的地方直接调用LoginF.Login()就可以呼叫登录窗口,并使用标准逻辑了。毕竟,你的登录窗口在系统中至少有两个地方要用到(启动时、重新登录时).

    //项目文件代码
    program KBS;
    
    uses
      Forms,
      Windows,
      MainF in 'MainF.pas' {frmMain},
      SplashF in 'SplashF.pas' {frmSplash},
      mainDM in 'mainDM.pas' {dmMain: TDataModule},
      LoginF in 'LoginF.pas' {frmLogin};
    
    {$R *.RES}
    
    var
      frmMain: TfrmMain;
      dmMain: TdmMain;
    begin
      Application.Initialize;
      //显示封面
      SplashF.Show;
      try
        //创建需要的资源
        Application.CreateForm(TdmMain, dmMain);
        Application.CreateForm(TfrmMain, frmMain);
        //...其它
      finally
        SplashF.Close;
      end;
    
      if LoginF.Login() then  //呼叫登录窗口:就这一行,简单吧!
        Application.Run;
    end.
    

    3.登录窗口如何写?

    我说:这个比较简单,直接上代码吧。有不懂的再交流。

    unit LoginF;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, StdCtrls, Buttons;
    
    type
      TfrmLogin = class(TForm)
        pnl1: TPanel;
        edUserName: TEdit;
        lblUserName: TLabel;
        edPasswd: TEdit;
        lblPasswd: TLabel;
        btnOK: TBitBtn;
        btnCancel: TBitBtn;
        procedure FormCreate(Sender: TObject);
        procedure btnOKClick(Sender: TObject);
      private
        FTryTimes: Integer;
        function CheckUserInfo(AUserName, APassword: string): Boolean;
      public
      end;
    
    function Login: Boolean;  //登录函数
    
    implementation
    
    {$R *.DFM}
    
    function Login: Boolean;
    begin
      //动态创建登录窗口
      with TfrmLogin.Create(nil) do
      begin
        //只有返回OK的时候认为登录成功
        Result := ShowModal() = mrOk;
        Free;
      end;
    end;
    
    function TfrmLogin.CheckUserInfo(AUserName, APassword: string): Boolean;
    begin
      //简单的验证,可以修改为其它的方式
      Result := (AUserName = 'lihd' ) and (APassword = 'P@ssw0rd');
    end;
    
    procedure TfrmLogin.FormCreate(Sender: TObject);
    begin
      //尝试登录的次数,初始化为0
      FTryTimes := 0;
    end;
    
    procedure TfrmLogin.btnOKClick(Sender: TObject);
    begin
      Inc(FTryTimes); //尝试登录的次数 + 1
      
      if CheckUserInfo(edUserName.Text, edPasswd.Text) then
      begin
        //如果通过检查,返回OK
        Self.ModalResult := mrOk;
      end else
      begin
        if (FTryTimes > 2) then
        begin
          MessageBox(self.Handle, '你已经尝试登录3次,请联系系统管理员。', '错误', MB_OK + MB_ICONERROR);
          Self.ModalResult := mrCancel;
          Exit;
        end;
    
        //通不过,报错
        MessageBox(self.Handle, '错误的用户名或密码,请重新输入!', '错误', MB_OK + MB_ICONERROR);
        edUserName.SetFocus();
        edUserName.SelectAll();
      end;    
    end;
    
    end.
    

    最后,啰嗦一句:一定要好好命名函数和控件!不要一大篇form1/form2/…edit1/edit2/…要多写注释!代码缩进要有章法!

    对新手推荐两个Delphi插件:CnPack(插件包,很强!) 和 DelForEx(格式化代码插件)-本站下载

    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    linux清理缓存
    HTMl5的sessionStorage和localStorage
    jQueryValidation插件API 学习
    notepad++去空格空行技巧
    关于前端的一些疑问
    ios上传图片遇见了一个TimeoutError(DOM Exception 23)异常
    js不执行的问题
    input type=file 怎么样调取用户手机照相机
    在调用方法给安卓传参遇到的问题
    canvas压缩图片成base64,传到后台解码需要注意的问题
  • 原文地址:https://www.cnblogs.com/jijm123/p/15252849.html
Copyright © 2020-2023  润新知