经常看到一些新手在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. Windows下安装Tensorflow—GPU版本

    https://blog.csdn.net/weixin_39290638/article/details/80045236

  2. Android Bundle传递对象

    首先Android的Bundle是可以传递对象的.我们可以用Bundle b = new Bundle():b.putSerializable("key", 对象引用); 但是这样 ...

  3. Android 使用正则表达式验证身份证号是否符合规则

    我国当前的身份证号分为三种: 一.15位身份证号 二.18位身份证号(前17位位数字,最后一位为字母x) 三.18为身份证号(18位都是数字) 具体验证请参考下面代码: /** * 验证身份证号是否符 ...

  4. Luogu P1273 有线电视网

    最近写DP写得比较多了 但是POJ上的题目太傻比了而且不想看英文的题面,然后就在Luogu的试炼场里找了一个DP EX专题写了一下(大概3days吧,一天一题差不多) 这是一道比较简单的DP 话说树形 ...

  5. 第五节 HTML&CSS -- 关于浮动和清除浮动的解说,以及两个大坑不要踩

    1.随便唠叨几句   这一节课我会对浮动元素和怎样清除浮动相关的技术进行一个讲解,同时,我会列举一些我们前端开发中常见的坑,希望大家以后不要在这些地方犯错.在开始今天的课程之前,有一个东西我需要先讲一 ...

  6. 2_C语言中的数据类型 (十)数组

    1          字符串与字符数组 1.1       字符数组定义 char array[100]; 1.2       字符数组初始化 char array[100] = {'a', 'b', ...

  7. opencv配置(转)

    1. 下载安装Opencv,去官网http://opencv.org/即可下载最新版本的Opencv,此处用的是Opencv 2.4.10 安装时傻瓜式的,最新版本的安装就是相当于解压到你指定的安装目 ...

  8. libgdx学习记录15——音乐Music播放

    背景音乐是游戏中必备的元素,好的背景音乐能为游戏加分不少,使人更容易融入到游戏的氛围中去. Music类中主要有以下函数: play()播放 stop()停止 pause()暂停 setVolume( ...

  9. SpringBoot整合EHcache学习笔记

    为了提高系统的运行效率,引入缓存机制,减少数据库访问和磁盘IO.下面说明一下ehcache和SpringBoot整合配置 前言介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特 ...

  10. 移动端效果之ScrollList

    写在前面 列表一直是展示数据的一个重要方式,在手机端的列表展示又和PC端展示不同,毕竟手机端主要靠滑.之前手机端之前一直使用的IScroll,但是IScroll本身其实有很多兼容性BUG,想改动一下需 ...