编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Delphi Login 窗体实现方案

wxchong 2025-01-07 16:29:16 开源技术 20 ℃ 0 评论

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.窗体的创建顺序

以下操作均在应用程序的项目文件中执行:

  1. 创建闪屏窗体并显示
  2. 创建数据模块
  3. 创建主窗体,并在闪屏窗体上显示提示信息
  4. 关闭闪屏窗体
  5. 创建并显示登录窗体



Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表