网站首页 > 开源技术 正文
Delphi Login 窗体实现方案
对于 Login 窗体,大家再熟悉不过了吧!在 Delphi C/S 应用程序中,一般都会使用到登录窗体和闪屏窗体,通常情况下是先显示闪屏窗体,然后显示登录窗体,如果用户和密码保存在数据库中,在应用程序中使用数据模块的情况下,应合理安排其启动顺序,当然还包括主窗体的创建等。下面,我们通过示例来实现一个 Login 窗体。
1.新建登录窗体
设计如下图:
2.创建数据模块
设计如下图:
设置对象及属性:
组件 | 属性 | 值 |
TZConnection | Name | DBConnection |
Protocal | firebird | |
LibraryLocation | E:\workspace_of_codetyphon\expertmanagement\fbembed.dll | |
Database | E:\workspace_of_codetyphon\expertmanagement\expertdb.fdb | |
Connected | True | |
TZReadOnlyQuery | Name | LoginReadOnlyQuery |
SQL | select usr_id, name, sex, is_admin, acc, pwd, salt, is_disable from c_usrs where acc = :ACC | |
Connection | DBConnection | |
编写数据模块的创建和销毁事件,代码如下:
procedure TDBDataModule.DataModuleCreate(Sender: TObject);
begin
DBConnection.Protocol:='firebird';
DBConnection.Database:='expertdb.fdb';
DBConnection.LibraryLocation:='fbembed.dll';
DBConnection.Connected:=True;
end;
procedure TDBDataModule.DataModuleDestroy(Sender: TObject);
begin
DBConnection.Connected:=False;
end;
3.在项目文件中打开登录窗体
代码如下:
begin
RequireDerivedFormResource:=True;
Application.Scaled:=True;
Application.Initialize;
// 闪屏窗体显示
SplashForm := TSplashForm.Create(nil);
SplashForm.Show;
SplashForm.Update;
SplashForm.SetStatusText('系统初始化...');
// 创建数据模块
Application.CreateForm(TDBDataModule, DBDataModule);
// 创建主窗体
Application.CreateForm(TMainForm, MainForm);
// 关闭闪屏窗体
SplashForm.Close;
SplashForm.Free;
// 显示登录窗体,因登录窗体需要调用数据库操作,所以数据模块必须在此之前创建
LoginForm:=TLoginForm.Create(nil);
if LoginForm.ShowModal <> mrOk then
begin
// 如果取消登录,则终止应用程序
Application.Terminate;
end
else
begin
// 登录成功则运行应用程序
Application.Run;
end;
end.
4.实现登录窗体
登录窗体实现代码:
unit loginunit;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, dbunit, md5, globalunit;
type
{ TLoginForm }
TLoginForm = class(TForm)
AccEdit: TEdit; // 用户名
LoginButton: TButton; // 登录按钮
CancelButton: TButton; // 取消按钮
PwdEdit: TEdit; // 密码
Label1: TLabel;
Label2: TLabel;
procedure AccEditKeyPress(Sender: TObject; var Key: char);
procedure CancelButtonClick(Sender: TObject);
procedure LoginButtonClick(Sender: TObject);
procedure PwdEditKeyPress(Sender: TObject; var Key: char);
private
public
end;
var
LoginForm: TLoginForm;
implementation
{$R *.frm}
{ TLoginForm }
procedure TLoginForm.CancelButtonClick(Sender: TObject);
begin
// 取消登录
ModalResult:=mrCancel;
end;
procedure TLoginForm.AccEditKeyPress(Sender: TObject; var Key: char);
begin
// 当在用户输入组件中回车时,调用登录操作
if Key=#13 then
LoginButtonClick(Sender);
end;
procedure TLoginForm.PwdEditKeyPress(Sender: TObject; var Key: char);
begin
// 当在密码输入组件中回车时,调用登录操作
if Key=#13 then
LoginButtonClick(Sender);
end;
procedure TLoginForm.LoginButtonClick(Sender: TObject);
var
IsDisable: Integer;
Salt, SavedPassword, HashPassword: String;
begin
// 登录
if Length(AccEdit.Text) <= 0 then
begin
MessageDlg('提示', '请输入用户!', mtInformation, [mbOk], '');
Exit;
end;
if Length(PwdEdit.Text) <= 0 then
begin
MessageDlg('提示', '请输入密码!', mtInformation, [mbOk], '');
Exit;
end;
// 密码校验
with DBDataModule do
begin
LoginReadOnlyQuery.Close;
LoginReadOnlyQuery.Prepare;
LoginReadOnlyQuery.Params.ParamByName('ACC').AsString:=AccEdit.Text;
LoginReadOnlyQuery.Open;
if LoginReadOnlyQuery.EOF then
begin
MessageDlg('提示', '用户不存在!', mtInformation, [mbOk], '');
Exit;
end
else
begin
LoginReadOnlyQuery.First;
IsDisable:=LoginReadOnlyQuery.FieldByName('is_disable').AsInteger;
if IsDisable=1 then
begin
MessageDlg('提示', '用户被禁用!', mtInformation, [mbOk], '');
Exit;
end;
Salt:=LoginReadOnlyQuery.FieldByName('salt').AsString;
SavedPassword:=LoginReadOnlyQuery.FieldByName('pwd').AsString;
HashPassword := MD5Print(MD5String(Salt+PwdEdit.Text));
if HashPassword <> SavedPassword then
begin
MessageDlg('提示', '密码错误!', mtInformation, [mbOk], '');
Exit;
end
else
// 登录成功后,在全局变量 CurrentUser 中设置当前用户的信息
CurrentUser.usr_id:=LoginReadOnlyQuery.FieldByName('usr_id').AsString;
CurrentUser.name:=LoginReadOnlyQuery.FieldByName('name').AsString;
CurrentUser.sex:=LoginReadOnlyQuery.FieldByName('sex').AsString;
CurrentUser.acc:=LoginReadOnlyQuery.FieldByName('acc').AsString;
CurrentUser.is_admin:=LoginReadOnlyQuery.FieldByName('is_admin').AsInteger;
CurrentUser.is_disable:=LoginReadOnlyQuery.FieldByName('is_disable').AsInteger;
ModalResult:=mrOk;
end;
end;
end;
end.
5.窗体的创建顺序
以下操作均在应用程序的项目文件中执行:
- 创建闪屏窗体并显示
- 创建数据模块
- 创建主窗体,并在闪屏窗体上显示提示信息
- 关闭闪屏窗体
- 创建并显示登录窗体
- 上一篇: phpunit 中的mock
- 下一篇: 统信UOS服务器操作系统离线安装postgresql数据库
猜你喜欢
- 2025-01-07 多库操作2:终于实现多个数据库操作
- 2025-01-07 天线知识图解(Antenna)
- 2025-01-07 统信UOS服务器操作系统离线安装postgresql数据库
- 2025-01-07 phpunit 中的mock
- 2025-01-07 「asp.net core 系列」9 实战之 UnitOfWork以及自定义代码生成
- 2024-08-06 Kotlin、JUnit5、Database Rider数据库动态测试实践
- 2024-08-06 Java开发过程中必不可少的10个工具、框架和库推荐
- 2024-08-06 JAVA 程序员需要用到 10 个测试框架和库
- 2024-08-06 软件测试中的数据库测试(软件测试数据库有什么)
- 2024-08-06 Java开发人员的10个单元测试工具和库
你 发表评论:
欢迎- 05-16东契奇:DFS训练时喷了我很多垃圾话 我不懂他为什么比赛不这么干
- 05-16这两球很伤!詹姆斯空篮拉杆不中 DFS接里夫斯传球空接也没放进
- 05-16湖人自媒体调查:89%球迷希望DFS回归79%希望詹姆斯回归
- 05-16Shams:湖人得到全能球员DFS 节省了1500万奢侈税&薪金空间更灵活
- 05-16G5湖人胜率更高!詹姆斯不满判罚,DFS谈5人打满下半场:这很艰难
- 05-16DFS:当东契奇进入状态 所有防守者在他面前都像个圆锥桶
- 05-16上一场9中6!DFS:不能让纳兹-里德这样的球员那么轻松地投三分
- 05-16WIDER FACE评测结果出炉:滴滴人脸检测DFS算法获世界第一
- 最近发表
-
- 东契奇:DFS训练时喷了我很多垃圾话 我不懂他为什么比赛不这么干
- 这两球很伤!詹姆斯空篮拉杆不中 DFS接里夫斯传球空接也没放进
- 湖人自媒体调查:89%球迷希望DFS回归79%希望詹姆斯回归
- Shams:湖人得到全能球员DFS 节省了1500万奢侈税&薪金空间更灵活
- G5湖人胜率更高!詹姆斯不满判罚,DFS谈5人打满下半场:这很艰难
- DFS:当东契奇进入状态 所有防守者在他面前都像个圆锥桶
- 上一场9中6!DFS:不能让纳兹-里德这样的球员那么轻松地投三分
- WIDER FACE评测结果出炉:滴滴人脸检测DFS算法获世界第一
- 湖人自媒体调查:89%球迷希望DFS回归 79%希望詹姆斯回归
- 一觉醒来湖人苦盼的纯3D终于到位 DFS能带给紫金军多少帮助
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)