zoukankan      html  css  js  c++  java
  • 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(格式化代码插件)-本站下载

    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    (转)如何最佳地使用memcached?
    win7 安装 memcached
    (转)怎么把主机的文件复制到虚拟机上
    memcache和redis本质区别在哪里?
    关于memcached
    (转)memcached注意事项
    (转)Memcached深度分析
    《项目架构那点儿事》——快速构建Junit用例
    《项目架构那点儿事》——工具类,你喜欢你就拿去
    《项目架构那点儿事》——Hibernate泛型Dao,让持久层简洁起来
  • 原文地址:https://www.cnblogs.com/jijm123/p/15252849.html
Copyright © 2011-2022 走看看