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/…要多写注释!代码缩进要有章法!

  • 相关阅读:
    git 的学习使用记录
    Servlet发送邮件遇到的问题SMTPSendFailedException 554
    如何高效地写CSS--等以后有空多加总结一下
    前端技术科技树梳理
    React了解
    读取Excel文件
    Eclipse不能自动编译 java文件
    破天荒地敲下第一篇
    SRM DIV2 569 TheDeviceDiv2
    SRM DIV2 570 RobotHerbDiv2
  • 原文地址:https://www.cnblogs.com/jijm123/p/7856957.html
Copyright © 2011-2022 走看看