程序虽然已经具有启动画面,然后登录进入主窗体,可是没有任何灵魂,不能与数据库进行交互,这次我们来让程序来操纵数据。
接着前面,先创建一个DataModule1容器,用于存放数据组件,并命名为:frmDM,单元名为untDM.pas。
在frmDM窗口放入数据库连接组件,用于连接数据库,ADOConnection1,并命名为:conDB,然后设置它的属性:ConnectionString为Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=xfsoft;Data Source=.;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=SYZ;Use Encryption for Data=False;Tag with column collation when possible=False,可以通过窗口一步一步来设置,这连接数据库的字符串,再设置LoginPrompt=False,登录时不弹出登录窗口。
我们需要程序可以在运行时设计连接数据库的一些信息,使用INI文件的形式来现实读写程序在运行时需要连接数据库的配置文件,在程序目录下创建一个dbConfig.ini,文件内容为:[DataBase]
DBconstr=Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=xfsoft;Data Source=.;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=SYZ;Use Encryption for Data=False;Tag with column collation when possible=False

在程序加入INI读写单元文件:untIniFile.pas 功能是读写刚才建立的INI文件。代码可以参考源码。
下面开始设置登录窗体与数据的绑定,首先要用户可以出现在下拉列表框中,这样不需要客户输入,那么需要在登录窗体创建后就可以选择下拉列表框中的用户,因此在窗体创建事件中初始列表框中的数据,代码如下:
procedure TfrmLogin.FormCreate(Sender: TObject);
var
  i:integer;
  testStr:string;
begin
  LoginCount:=1;
  with qryLogin do
  begin
    Connection:=frmDM.conDB;
    Close;
    SQL.Clear;
    SQL.Add('select * from [User]');
    testStr:=SQL.Text;
    Open;
    for i:=1 to RecordCount do
    begin
      cbbUserName.Items.Add(FieldbyName('username').AsString);
      next;
    end;
  end;
end;
此时调试程序将会出错,问题是我们没有连接到数据,因为是程序运行时读取INI文件中的连接字符串的,所以,要在数据窗体创建时连接数据库,我们在untGlobal中创建一个ConnectDB过程,并在数据窗体的DataModuleCreate事件中调用。ConnectDB过程代码如下:
Procedure ConnectDB;
begin
  if FileExists(ExtractFilePath(paramStr(0))+'dbConfig.ini') then
  begin
    IniOptions.LoadFromFile(ExtractFilePath(paramStr(0))+'dbConfig.ini');  //ExtractFilePath函数引用SysUtils单元文件
    frmDM.conDB.Connected:=False;
    frmDM.conDB.ConnectionString:=IniOptions.DataBaseDBconstr;;
    try
       frmDM.conDB.Connected:=True;
    except
       MsgBox('无法连接到数据库,请设置数据库!', MB_ICONINFORMATION);  //MB_ICONINFORMATION常量引用Windows 单元文件
       Application.Terminate;
    end;
  end else begin
     MsgBox('数据库配置dbConfig.ini不存在,程序终止!', MB_ICONINFORMATION);  //MB_ICONINFORMATION常量引用Windows 单元文件
     Application.Terminate;
  end;
end;
函数中用到untIniFile来读取连接字符串,MsgBox函数是在untGlobal中自定义的一个信息提示框函数。
此时再运行程序,可以在登录窗体的用户下拉框中选择用户名了。但是如何在单击确定后可以和密码匹配?如何设置三次登录限制?如何使用回车键跳到下个焦点?我们一个个来实现这些功能,先来实现回车的功能,只用在窗体中的FormKeyPress事件中加入如下代码即可:
  if key=#13 then{ 判断是按执行键}
  Begin
    key:=#0;
    perform(WM_NEXTDLGCTL,0,0);{移动到下一个控件}
  end
但是一定要将登录按钮的Default的属性设置为False。
便当按钮事件的代码如下:
  gOKPress:=True;
  qryLogin.Close;
  qryLogin.SQL.Clear;
  qryLogin.SQL.Add(format('select * from [User] where UserName=''%s'' and Password=''%s''',[cbbUserName.Text,edtPassword.Text]));
  qryLogin.Open;
  if not qryLogin.IsEmpty then
  begin
    gCanLogin:=True;
    {SysInfo.UserName :=ADOQuery1.FieldByName('username').AsString;
    SysInfo.UserID :=ADOQuery1.FieldByName('userID').AsString;
    sysInfo.NO:=UserEdit.Text ; }
  end;
  close;
  exit;
注释掉的以后说明。
gOKPress用于取消登录时的判断。
在FormCloseQuery中加入下面的代码即可实现三次登录的判断:
  if gOKPress and Not gCanLogin then
  begin
     gLoginCount:=gLoginCount+1;
     gOKPress:=False;
       if (gLoginCount<4) and (gLoginCount>0) then
       begin
        Application.MessageBox ('用户编号或密码不正确,请重新输入。','提示信息',MB_ICONINFORMATION);
        cbbUserName.SetFocus ;
        cbbUserName.SelectAll;
        CanClose:=False;
       end
       else
       if gLoginCount>=4 then
    Application.MessageBox ('三次输入不正确,登录失败。','提示信息',MB_ICONINFORMATION)
  end
至此,和数据库交互的登录窗体全部完成。
新的源码下载:
[url]http://files.cnblogs.com/edrp/Demo.rar[/url]

delphi开发日志——注入“思想”,让程序操纵数据相关推荐

  1. delphi开发日志——基窗体,使用面向对象编程的编程思想创建基类

    delphi的VCL就是面向对象的,因此我无论我们是使用她来开发数据库的管理信息系统,还是网络应用,都可以说是面向对象,虽然可能很多人都像我当初一样,不知道什么时面向对象,如何使用面向对象来编程.在这 ...

  2. 开发日志:微信小程序太阳码传入参数解析

    通过二维码进入小程序的时候,可以在 onload 函数里面获取参数. onLoad(options) {console.log(options) } 这个是打印出来的结果.所以,在这里我们需要用到的是 ...

  3. windows mobile开发循序渐进(4)移动应用程序的数据存储之本地数据存储第二篇

    之所以分解来写,是因为在写的过程中会有些穿插的工作,希望能够尽量写的更细节一些. 上篇说的是本地存储的XML和DataSet之间的交互,现在我们来看看windows mobile 是如何与数据库进行交 ...

  4. 我的Delphi开发经验谈(转)

    --2010年09月28日 星期二 下午 05:26 我的Delphi开发经验谈 -------- 开发环境 -------- Delphi 7是一个很经典的版本,在Win2000/XP下推荐安装De ...

  5. zt我的Delphi开发经验谈

    我的Delphi开发经验谈 -------- 开发环境 --------     Delphi 7是一个很经典的版本,在Win2000/XP下推荐安装Delphi 7来开发软件,在Vista下推荐使用 ...

  6. 【转】新思想、新技术、新架构——更好更快的开发现代ASP.NET应用程序(续1)

    上周星期天开通了博客并发布了第一篇文章<新思想.新技术.新架构--更好更快的开发现代ASP.NET应用程序>,汇集了一些比较流行的技术和开源项目,也把自己的程序架构.部分代码风格.前端表现 ...

  7. 微信小程序开发日志——面向对象的JS编程

    微信小程序开发日志--面向对象的JS编程 前言 不知道有多少小伙伴和之前的我一样,微信小程序的js部分都是用面向过程的方式写的,最后的结果就是代码非常长,其实刚刚写完还好,自己也都清楚哪些部分是做什么 ...

  8. Delphi开发的数据库程序在C:\PDOXUSRS.NET生成文件,拒绝访问及读写权限

    Delphi开发的数据库程序在C:\PDOXUSRS.NET生成文件,拒绝访问及读写权限, "无法打开 PARADOX.NET.这个文件可以随便删除的,下次会自动产生. Permission ...

  9. Delphi开发单机瘦数据库程序要点

    Delphi开发单机瘦数据库程序要点 日期:2004年12月30日 作者:loveghb 人气: 2736 查看:[大字体 中字体 小字体] 一.概述 Delphi作为Windows下的一种快速开发工 ...

最新文章

  1. 使用 WordPress 插件模板开发高质量插件
  2. [洛谷P1438] 无聊的数列
  3. 惊!Kubernetes 将弃用 Docker,开发者们怎么办?
  4. Oracle 数据库中较为复杂或典型的 SQL 语句的解读
  5. 计算1到100的整数和
  6. Maple:把计算结果保存出来
  7. js把base64串解析成中文_26日大嘴足球:晚场5中3/中2串+1比分,早场(意甲+西甲)2场解析!!...
  8. c语言 判断一个图是否全连通_【连载】(判断执行语句)乐创DIY C语言讲义——3.8节(2)...
  9. [公告]决定博客园杂志所采用的标题
  10. [2018.04.23 T1] 数学
  11. 路畅畅云固件升级教程_【图】【折腾导航】路畅导航固件升级、刷机、实现一机多图教程!...
  12. 软件项目版本管理规范总结
  13. 华为进不了美国,并不是贸易保护这么简单
  14. 20191107 关于mui的app打包
  15. 织梦cms里面文章里面的HTML,dede源码在其它页面调用单页文章内容并过滤HTML代码的方法...
  16. 云大使推广的返利规则是什么
  17. 分享一个好用的屏幕截取动图的工具
  18. Python学多久才能独立接单赚钱?一个月足够了,本人私藏的学习计划分享给大家
  19. 一套打通 Github 搜索语法
  20. 【python脚本】linux中编写运行python脚本

热门文章

  1. 百度链接提交php获取状态码,新网站,在百度提交了首页链接,但是一直没有收录,也没有爬虫抓取,怎么回事呢?(悬赏1元) - 搜外SEO问答...
  2. gbdt 回归 特征重要性 排序_gbdt、xgb、lgb、cat面经整理——from牛客
  3. django配置在MySQL_怎么在Django中安装与配置mysql
  4. mysql查看服务器版本sql_警告:您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解使用n的正确语法...
  5. 服务器安全之iptables iptables
  6. Druid 介绍及配置
  7. 2021年信用卡行业发展报告
  8. 劳动节快乐 | 5月1日 星期六 | 喜马拉雅赴美递交IPO招股书;拼多多年活跃买家7.884亿;抖音电商开启“抖音55潮购季”
  9. 一文讲透B端产品/C端产品、SaaS/PaaS/IaaS的区别
  10. 大规模异构数据并行处理系统的设计、实现与实践