经常看到一些新手在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用户登录窗口框架的更多相关文章

  1. SourceTree不出现用户登录窗口,提示错误fatal: unable to access'...'; error setting certificate verify locations

    SourceTree不出现用户登录窗口,提示错误fatal: unable to access'...'; error setting certificate verify locations; .. ...

  2. 用户登录安全框架shiro—用户的认证和授权(一)

     ssm整合shiro框架,对用户的登录操作进行认证和授权,目的很纯粹就是为了增加系统的安全线,至少不要输在门槛上嘛. 这几天在公司独立开发一个供公司内部人员使用的小管理系统,客户不多但是登录一直都是 ...

  3. asp.net -mvc框架复习(7)-基于MVC搭建用户登录项目框架

    整体框架: 一.搭建Model层 1.添加通用数据访问类 2.添加实体类(封装和传递数据,和数据库中数据表对应) 3.添加数据访问类(通常和实体类同名,但是后缀名发生改变) 二.搭建控制器层Contr ...

  4. php基础系列:从用户登录处理程序学习mysql扩展基本操作

    用户注册和登录是网站开发最基本的功能模块之一,现在通过登录处理程序代码来学些下php对mysql的基本操作. 本身没有难点,主要是作为开发人员,应该能做到手写这些基本代码,算是自己加强记忆,同时希望能 ...

  5. 高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

    上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输 ...

  6. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计     ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)    ...

  7. ssh框架的小实例(用户登录)

    刚学SSH框架写一个小实例,以便以后查看: 本案例简单的实现一个用户登录: 数据库方面就不写了,自己领悟吧!哈哈(根据user.hbm.xml文件就知道了) 我们一般可以创建下面几个包,什么意思呢,自 ...

  8. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  9. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(四)——对 run.py 的调整

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

随机推荐

  1. Posts Tagged ‘This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register问题的解决办法

    HowTo Install redhat package with YUM command without RHN February 26, 2014 in Redhat / Linux Tips a ...

  2. Maven私有仓库-使用docker部署Nexus

    查看官方镜像说明 nexus2 nexus3 建议使用nexus2,可能网上的资料这个版本居多. 我选择的是nexus3,~~~ 启动容器 官方说明中提到的是使用docker直接启动.我选择用dock ...

  3. Cloud Foundry 组件

    原文:https://blog.csdn.net/little_crab_0924/article/details/78022391 Cloud Foundry 组件概述 Cloud Foundry ...

  4. Android应用安全之脆弱的加密

    程序员希望通过加密来提升程序的安全性性,但却缺乏专业的密码学背景知识,使得应用对数据的保护非常薄弱.本文将介绍可能出现在Android应用中的一些脆弱的加密方式,以及对应的攻击方法. 造成脆弱加密的主 ...

  5. HW 2017 12 17可禾大佬神题

    好不容易搞来的题目,不写一写怎么行呢. 不过难度真心不高(一小时K掉),都是老题+暴力题,没有欧洲玄学. 再说一句,这试卷是叶可禾出的吧. T1 好老的题目,看到有多组数据我还怕了,以为有更流弊的算法 ...

  6. [2016北京集训测试赛15]statement-[线段树+拆环]

    Description Solution 由于题目要求,将a[i]->b[i](边权为i)后所得的图应该是由森林和环套树组合而成. 假如是树形结构,所有的t[i]就直接在线段树t[i]点的dfs ...

  7. PHP7添加opcache.so模块

    启动php报错如下: # /usr/local/php7/sbin/php-fpm [-Apr- ::] NOTICE: PHP message: PHP Warning: PHP Startup: ...

  8. ajax传参data里面的键是一个变量的解决方法

    直接用这种方式来传参,比如bean中有字段 username password,则是 data[username] = "用户名"; data[password] = " ...

  9. centos7 php性能调优

    php-ini优化 vi /etc/php.ini 打开php的安全模式,控制php执行危险函数, 默认是Off,改为On sql.safe_mode = Off 关闭php头部信息, 隐藏版本号, ...

  10. 使用顽灯浏览器执行H5游戏辅助挂机

    前一篇<使用Fidder从安卓模拟器获取APP内H5游戏网址>我们获取到了APP内H5游戏的网址,那么接下来我们使用辅助工具做一些日常任务,如:每天晚上20点做副本,定时喊话,自动清理包裹 ...