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]http://files.cnblogs.com/edrp/Demo.rar[/url]
總結
以上是生活随笔為你收集整理的delphi开发日志——注入“思想”,让程序操纵数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Magento: Beginner’s
- 下一篇: 55个好习惯可令世界更美好(2)