zoukankan      html  css  js  c++  java
  • delphi开发日志——注入“思想”,让程序操纵数据

    程序虽然已经具有启动画面,然后登录进入主窗体,可是没有任何灵魂,不能与数据库进行交互,这次我们来让程序来操纵数据。
    接着前面,先创建一个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]https://files.cnblogs.com/edrp/Demo.rar[/url]

  • 相关阅读:
    声明式编程和命令式编程的比较
    函数式编程
    读《暗时间》
    动态语言和静态语言的比较
    2013第二次实训
    for惠普2013实习生
    bat的大数据
    android stduio优化
    当move手势太快,降低频率
    ANR没root的时候处理*(转)
  • 原文地址:https://www.cnblogs.com/edrp/p/988320.html
Copyright © 2011-2022 走看看