第6章-數(shù)據(jù)庫(kù)操作-《數(shù)據(jù)庫(kù)應(yīng)用技術(shù)-Delphi應(yīng)用系統(tǒng)開(kāi)發(fā)》課件-電子教案_第1頁(yè)
第6章-數(shù)據(jù)庫(kù)操作-《數(shù)據(jù)庫(kù)應(yīng)用技術(shù)-Delphi應(yīng)用系統(tǒng)開(kāi)發(fā)》課件-電子教案_第2頁(yè)
第6章-數(shù)據(jù)庫(kù)操作-《數(shù)據(jù)庫(kù)應(yīng)用技術(shù)-Delphi應(yīng)用系統(tǒng)開(kāi)發(fā)》課件-電子教案_第3頁(yè)
第6章-數(shù)據(jù)庫(kù)操作-《數(shù)據(jù)庫(kù)應(yīng)用技術(shù)-Delphi應(yīng)用系統(tǒng)開(kāi)發(fā)》課件-電子教案_第4頁(yè)
第6章-數(shù)據(jù)庫(kù)操作-《數(shù)據(jù)庫(kù)應(yīng)用技術(shù)-Delphi應(yīng)用系統(tǒng)開(kāi)發(fā)》課件-電子教案_第5頁(yè)
已閱讀5頁(yè),還剩133頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第6章數(shù)據(jù)庫(kù)操作本章學(xué)習(xí)要點(diǎn)l

學(xué)習(xí)數(shù)據(jù)庫(kù)組件的作用及其設(shè)計(jì)l

學(xué)習(xí)ADO組件的使用方法l

掌握Delphi中SQL編程l

掌握字段對(duì)象的使用方法l

掌握數(shù)據(jù)庫(kù)操作第6章數(shù)據(jù)庫(kù)操作本章學(xué)習(xí)要點(diǎn)

數(shù)據(jù)庫(kù)是數(shù)據(jù)表的集合(特指關(guān)系型數(shù)據(jù)庫(kù))。因此,數(shù)據(jù)庫(kù)應(yīng)用程序就是處理各種數(shù)據(jù)表的應(yīng)用程序。這些數(shù)據(jù)表以行(記錄)和列(字段)的形式來(lái)組織信息。它們能夠用一些簡(jiǎn)單的關(guān)系運(yùn)算符進(jìn)行操作。設(shè)計(jì)一個(gè)數(shù)據(jù)庫(kù)應(yīng)用程序時(shí),必須完整地了解數(shù)據(jù)的結(jié)構(gòu),才能設(shè)計(jì)出一個(gè)合適的界面來(lái)顯示數(shù)據(jù)庫(kù)中的數(shù)據(jù),并且允許用戶輸入新的數(shù)據(jù)或者修改已有的數(shù)據(jù)。Delphi集成開(kāi)發(fā)工具中包括了創(chuàng)建數(shù)據(jù)庫(kù)應(yīng)用程序的所有通用元素,可以方便地實(shí)現(xiàn)諸如數(shù)據(jù)庫(kù)查詢這樣的數(shù)據(jù)庫(kù)功能。

12/12/2022212/11/202226.1數(shù)據(jù)庫(kù)組件

Delphi使用VCL類將數(shù)據(jù)庫(kù)引擎BDE(BorlandDatabaseEngine)封裝成對(duì)象,為數(shù)據(jù)庫(kù)應(yīng)用程序開(kāi)發(fā)人員提供一致的訪問(wèn)接口。一個(gè)數(shù)據(jù)庫(kù)應(yīng)用程序在邏輯上通常由兩部分組成,即數(shù)據(jù)訪問(wèn)鏈路和用戶界面。Delphi的數(shù)據(jù)庫(kù)組件也相應(yīng)地包括數(shù)據(jù)訪問(wèn)組件和數(shù)據(jù)控制組件,它們分別實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)鏈路和用戶界面的功能。Delphi提供的可使用BDE數(shù)據(jù)庫(kù)引擎訪問(wèn)數(shù)據(jù)庫(kù)的組件可以分成下面的3類。l

BDE組件:該組件集提供了以BDE方式訪問(wèn)數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)表和查詢等數(shù)據(jù)集組件。l

數(shù)據(jù)訪問(wèn)(DataAccess)組件:該組件集提供了數(shù)據(jù)源(DataSource)等連接組件。l

數(shù)據(jù)控制(DataControls)組件:該組件集用來(lái)瀏覽和編輯數(shù)據(jù),它們?yōu)橛脩羰褂脭?shù)據(jù)庫(kù)提供接口。12/12/202236.1數(shù)據(jù)庫(kù)組件

Delphi使用VCL類將數(shù)據(jù)組件面板中的DataAccess、DataControls和BDE頁(yè)中有不同的數(shù)據(jù)庫(kù)對(duì)象,其中DataAccess和BDE頁(yè)中的對(duì)象為非可視化對(duì)象,而DataControls頁(yè)中包含的為可視化對(duì)象。6.1.1數(shù)據(jù)庫(kù)引擎組件頁(yè)簡(jiǎn)介BDE數(shù)據(jù)集部件包含了用于各種BDE數(shù)據(jù)引擎的數(shù)據(jù)集構(gòu)件,這些構(gòu)件封裝了數(shù)據(jù)庫(kù)連接、數(shù)據(jù)表格、數(shù)據(jù)查詢等特性。如圖6-1所示。圖6-1BDE數(shù)據(jù)集部件當(dāng)要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫(kù)應(yīng)用時(shí),首先在窗體中選擇一個(gè)BDE數(shù)據(jù)集部件,然后為BDE數(shù)據(jù)集部件設(shè)置有關(guān)的屬性,說(shuō)明要訪問(wèn)的數(shù)據(jù)庫(kù)、數(shù)據(jù)表以及表中的記錄等,BDE數(shù)據(jù)集部件為數(shù)據(jù)控制部件與數(shù)據(jù)源建立了一條通道。12/12/20224組件面板中的DataAccess、DataCont表6-1BDE數(shù)據(jù)集部件12/12/20225表6-1BDE數(shù)據(jù)集部件12/11/20225需要指出的是在絕大多數(shù)數(shù)據(jù)庫(kù)應(yīng)用程序中,一般都是使用數(shù)據(jù)集部件Table、Query或StoredProc與磁盤(pán)上的數(shù)據(jù)庫(kù)進(jìn)行連接,用DataSource組件連接數(shù)據(jù)控制部件和數(shù)據(jù)集部件,當(dāng)然用戶也可以自定義數(shù)據(jù)集部件,用于數(shù)據(jù)庫(kù)應(yīng)用當(dāng)中,Table、Query和StoredProc部件中都包含一個(gè)不可見(jiàn)的Fields,F(xiàn)ields是一個(gè)串列表,它對(duì)應(yīng)于數(shù)據(jù)庫(kù)表或一個(gè)查詢結(jié)果的列表字段。6.1.2Table組件Table組件是Delphi數(shù)據(jù)庫(kù)編程中要經(jīng)常使用的最重要的部件之一,是數(shù)據(jù)庫(kù)應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)時(shí)必須使用的數(shù)據(jù)集組件之一。Table組件可以訪問(wèn)數(shù)據(jù)庫(kù)表格中的每一行和每一列。它既可以訪問(wèn)本地的數(shù)據(jù)庫(kù)如(Paradox、dBASE、Access、Foxpro),還可以訪問(wèn)遠(yuǎn)程數(shù)據(jù)庫(kù)如InterBase、Sybase和SQLServer。它不但可以顯示和編輯表格的所有行和所有列,而且可以選擇一定范圍內(nèi)的行,或者用過(guò)濾技術(shù)檢索出其中一部分行,可以搜索記錄,復(fù)制、換名或刪除一個(gè)表格。12/12/20226需要指出的是在絕大多數(shù)數(shù)據(jù)庫(kù)應(yīng)用程序中,一般都是使用數(shù)利用Table組件程序員甚至可以不需要編寫(xiě)任何程序便可對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn),在一個(gè)應(yīng)用程序窗體中放置一個(gè)Table組件的過(guò)程如下:l

在組件選擇板上選擇DataAccess頁(yè)。l

單擊Table圖標(biāo)。l

在窗體內(nèi)單擊鼠標(biāo),獲得一個(gè)Table組件。l

為T(mén)able組件設(shè)置有關(guān)的屬性。DatabaseName屬性指定要訪問(wèn)的數(shù)據(jù)庫(kù)所在的路徑名,路徑名可以用別名來(lái)表示。TableName屬性指定要訪問(wèn)數(shù)據(jù)庫(kù)中具體的數(shù)據(jù)庫(kù)表。Acitve屬性設(shè)置為T(mén)rue時(shí),表示打開(kāi)要訪問(wèn)的數(shù)據(jù)庫(kù)表;設(shè)置為False時(shí),暫時(shí)不打開(kāi)要訪問(wèn)的數(shù)據(jù)庫(kù)表。12/12/20227利用Table組件程序員甚至可以不需要編寫(xiě)任何程序便可對(duì)數(shù)據(jù)l

指定字段顯示的順序。l

為每個(gè)字段指定一個(gè)用于顯示的字符串。l

為字段增加合法性檢驗(yàn)。l

為顯示的需要還可以建立新的字段(如可計(jì)算的字段),具體的使用方法見(jiàn)6.5節(jié)的內(nèi)容。Table組件是Delphi所提供的對(duì)數(shù)據(jù)庫(kù)最簡(jiǎn)單而快捷的訪問(wèn)方法。對(duì)于大多數(shù)本地?cái)?shù)據(jù)庫(kù)和簡(jiǎn)單的遠(yuǎn)程數(shù)據(jù)庫(kù)應(yīng)用程序,一般使用Table組件,當(dāng)需要使用SQL查詢語(yǔ)言或訪問(wèn)大型的SQL服務(wù)器時(shí),則通常使用Query組件。下面通過(guò)一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)應(yīng)用程序講述Table組件的用法。例子用于查詢雇員數(shù)據(jù)庫(kù),程序是通過(guò)輸入雇員的編號(hào)后查詢出該雇員的有關(guān)信息,首先新建一個(gè)應(yīng)用程序(Application),放置一個(gè)Table組件、一個(gè)DataSource組件、三個(gè)Label組件和兩個(gè)Button組件,按表6-2的要求調(diào)整組件的一些關(guān)鍵屬性,實(shí)例程序的設(shè)計(jì)界面如圖6-2所示。12/12/20228l

指定字段顯示的順序。12/11/2022圖6-2程序設(shè)計(jì)界面表6-2組件的屬性設(shè)置

12/12/2022912/11/20229單擊“”按鈕Button1的事件處理過(guò)程代碼如下:procedureTForm1.Button1Click(Sender:TObject);beginwithtable1dobeginlabel3.Caption:='';indexfieldnames:='empno';setkey;//調(diào)用table1的setkey方法把與表對(duì)應(yīng)的數(shù)據(jù)集設(shè)置成查詢狀態(tài)ifedit1.Text=''thenshowmessage('請(qǐng)輸入查詢雇員號(hào)')elsetable1.FieldByName('empno').AsString:=edit1.Text;ifgotokeythen//調(diào)用table1的gotokey方法查找符合條件的記錄beginlabel3.Caption:='查找成功';edit2.Text:=table1.fieldbyname('lastname').AsString+'-'+table1.fieldbyname('firstname').AsString;//標(biāo)簽姓名后的文本框顯示雇員的最后一個(gè)名字和第一個(gè)名字,中間用減號(hào)格開(kāi)12/12/202210單擊“”按鈕Button1的事件處理過(guò)程代碼如下:12/11memo1.Lines[0]:='雇員號(hào):'+table1.fieldbyname('empno').AsString;memo1.Lines[1]:='姓名:'+table1.fieldbyname('lastname').AsString+'-'+table1.fieldbyname('firstname').AsString;endelsebeginedit2.Text:='此人不存在';label3.Caption:='查找失敗';memo1.Lines[0]:='此人不存在';memo1.Lines[1]:='';end;end;end;程序的執(zhí)行結(jié)果如圖6-3所示。12/12/202211memo1.Lines[0]:='雇員號(hào):'+table圖6-3程序的執(zhí)行結(jié)果6.1.3Query組件Query組件提供一種使用SQL語(yǔ)句進(jìn)行數(shù)據(jù)訪問(wèn)的方法。該方法可以指定一個(gè)表中需要使用的記錄集合或列集合,也可以指定需要同時(shí)訪問(wèn)的多個(gè)數(shù)據(jù)庫(kù)表。Query組件是程序員使用SQL語(yǔ)句開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序的有力工具,因?yàn)槭褂肧QL語(yǔ)言,可以非常方便靈活地對(duì)一個(gè)或多個(gè)數(shù)據(jù)庫(kù)表中的記錄進(jìn)行訪問(wèn),所以利用Query可以查詢本地的數(shù)據(jù)庫(kù)如Paradox和dBASE數(shù)據(jù)庫(kù)系統(tǒng)中的數(shù)據(jù),還可以使用Query組件對(duì)一個(gè)遠(yuǎn)程的數(shù)據(jù)庫(kù)SQL服務(wù)器進(jìn)行訪問(wèn),建立客戶/服務(wù)模式的應(yīng)用程序,SLMIS為典型的客戶端/服務(wù)器模式的應(yīng)用系統(tǒng)。12/12/20221212/11/202212SQL屬性:指定對(duì)數(shù)據(jù)庫(kù)表進(jìn)行訪問(wèn)的SQL語(yǔ)句,它可以是一條查詢語(yǔ)句也可以是一條修改語(yǔ)句或插入語(yǔ)句等。在對(duì)象瀏覽器上,單擊SQL屬性時(shí),會(huì)打開(kāi)一個(gè)字符串編輯器供程序設(shè)計(jì)者輸入SQL語(yǔ)句。注意:在Query組件中,不是用TableName屬性來(lái)指定要訪問(wèn)的數(shù)據(jù)庫(kù)中的數(shù)據(jù)庫(kù)表,而是在SQL屬性中,通過(guò)SQL語(yǔ)句靜態(tài)地指定將要訪問(wèn)的數(shù)據(jù)庫(kù)表。SQL屬性也可以在程序中動(dòng)態(tài)地設(shè)置,程序員進(jìn)行設(shè)計(jì)時(shí)常常是采用動(dòng)態(tài)設(shè)置的方法。下面舉一個(gè)例子來(lái)說(shuō)明如何使用Query組件進(jìn)行動(dòng)態(tài)SQL語(yǔ)句的程序設(shè)計(jì)。本例將創(chuàng)建一個(gè)供用戶使用的SQL編輯器界面,當(dāng)用戶輸入SQL語(yǔ)句后.如果沒(méi)有語(yǔ)法錯(cuò)誤,可以直接得到SQL執(zhí)行的結(jié)果。實(shí)例程序的設(shè)計(jì)界面如圖6-4所示。設(shè)計(jì)界面中各個(gè)組件的屬性如表6-3所示。由于設(shè)置Query的DatabaseName屬性時(shí)將其設(shè)置為DBDEMOS,所以設(shè)計(jì)的這個(gè)SQL程序編輯器只能對(duì)DBDEMOS中的數(shù)據(jù)庫(kù)表進(jìn)行操作。12/12/202213SQL屬性:指定對(duì)數(shù)據(jù)庫(kù)表進(jìn)行訪問(wèn)的SQL語(yǔ)句,它可以圖6-4程序設(shè)計(jì)界面表6-3組件的屬性設(shè)置12/12/20221412/11/202214單擊“”按鈕Button1的事件處理過(guò)程代碼如下:procedureTForm1.Button1Click(Sender:TObject);begintryQuery1.Close;Query1.SQL.Clear;Query1.SQL.Add(memo1.Text);Query1.Open;exceptonedatabaseerrordoQuery1.execsqlend;end;在上面的代碼中,使用了“異?!碧幚斫Y(jié)構(gòu)進(jìn)行編程?!爱惓!碧幚斫Y(jié)構(gòu)包括兩種格式:Try…Finally格式和Try…Except格式。其中Try…Except格式如下。12/12/202215單擊“”按鈕Button1的事件處理過(guò)程代碼如下:12/11try<程序代碼段1>excepton異常類型1do處理方式1;on異常類型2do處理方式2;on異常類型3do處理方式3;

…<其他代碼段>end;如果在程序代碼段1中出現(xiàn)了異常,系統(tǒng)將轉(zhuǎn)向Except部分尋找解決辦法。如果在Except部分給出了此種異常類型的解決分支,就執(zhí)行該分支中的程序,否則就按缺省方式處理。12/12/202216try12/11/202216圖6-5執(zhí)行SQL編輯器在Query組件中,SQL查詢語(yǔ)句使用Open方法執(zhí)行,而其他類型的SQL語(yǔ)句(例如Insert、Delete、Update等)需要使用ExecSQL方法執(zhí)行。如果在程序中只使用Open方法執(zhí)行SQL語(yǔ)句,在使用程序執(zhí)行非查詢的SQL語(yǔ)句的時(shí)候,系統(tǒng)將產(chǎn)生Edatabaseerror異常。

使用Try…Except異常結(jié)構(gòu),將ExecSQL方法置于Except部分,就可以使程序適用于兩種不同情況的需要。下面給出單擊“”按鈕Button2的事件處理過(guò)程。

12/12/20221712/11/202217procedureTForm1.Button2Click(Sender:TObject);beginmemo1.Clear;Query1.Close;end;單擊“”按鈕時(shí),備注框中的內(nèi)容將被清除,同時(shí)Query1組件被關(guān)閉,窗體中的數(shù)據(jù)控制組件DBGrid1將處于空白狀態(tài)。這樣一個(gè)簡(jiǎn)單的SQL編輯器的設(shè)計(jì)就完成了。該例子執(zhí)行之后如圖6-5所示。6.1.4StoredProc組件在數(shù)據(jù)庫(kù)應(yīng)用程序中,有時(shí)候需要對(duì)大量的記錄進(jìn)行操作,此時(shí)應(yīng)用程序的效率往往受到影響。存儲(chǔ)過(guò)程正是用來(lái)解決這一問(wèn)題的,因?yàn)榇鎯?chǔ)過(guò)程是在數(shù)據(jù)庫(kù)服務(wù)器上,所以它的執(zhí)行效率比較高,從而可以改善應(yīng)用程序的性能。12/12/202218procedureTForm1.Button2Click(Delphi中可以使用StoredProc組件來(lái)訪問(wèn)和操縱服務(wù)器上的存儲(chǔ)過(guò)程。StoredProc組件是數(shù)據(jù)集組件,從TDataSet派生而來(lái)。但是,用它們來(lái)訪問(wèn)存儲(chǔ)過(guò)程時(shí)是有很多差別的。StoredProc組件適合于執(zhí)行那些不需要返回?cái)?shù)據(jù),并且通過(guò)輸出參數(shù)來(lái)返回信息的存儲(chǔ)過(guò)程。Params屬性:此屬性用來(lái)儲(chǔ)存存儲(chǔ)過(guò)程中輸入和輸出的參數(shù)。Params的屬性值是一個(gè)參數(shù)值的數(shù)組。在運(yùn)行時(shí)可以通過(guò)訪問(wèn)Params屬性值來(lái)動(dòng)態(tài)地設(shè)置參數(shù)名、參數(shù)值和數(shù)據(jù)類型。在執(zhí)行了存儲(chǔ)過(guò)程之后,應(yīng)用程序也可以通過(guò)訪問(wèn)Params屬性值來(lái)獲得服務(wù)器返回給過(guò)程的輸出參數(shù)。StoredProcName屬性:通過(guò)設(shè)置StoredProcName屬性來(lái)指明服務(wù)器調(diào)用的存儲(chǔ)過(guò)程名。如果StoredProcName屬性中指明的存儲(chǔ)過(guò)程名與服務(wù)器上存在的存儲(chǔ)過(guò)程名不相符,則當(dāng)應(yīng)用程序?yàn)榇鎯?chǔ)過(guò)程作準(zhǔn)備時(shí),會(huì)產(chǎn)生一個(gè)異常事件。12/12/202219Delphi中可以使用StoredProc組件來(lái)訪問(wèn)和6.1.5數(shù)據(jù)訪問(wèn)組件頁(yè)簡(jiǎn)介數(shù)據(jù)訪問(wèn)(DataAccess)組件和特定的數(shù)據(jù)訪問(wèn)機(jī)制有關(guān),要設(shè)計(jì)一個(gè)好的數(shù)據(jù)庫(kù)應(yīng)用程序,就必須用好數(shù)據(jù)訪問(wèn)組件。數(shù)據(jù)訪問(wèn)組件組共有六種組件,如圖第1章的1-5所示。DataSource組件是開(kāi)發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序中用到的非常重要的組件,它用在DataSet(數(shù)據(jù)集)組件(包括Table、Query和StoredProc等)和數(shù)據(jù)控制組件之間提供一個(gè)連接的紐帶。DataSource組件本身十分簡(jiǎn)單,它所擁有的屬性、事件和方法都比較少,它主要是為數(shù)據(jù)控制組件服務(wù)的。下面介紹DataSource組件的幾個(gè)主要屬性。Dataset屬性:該屬性值是DataSource組件從中獲取數(shù)據(jù)的數(shù)據(jù)集的名字,它可以是Table的名字,也可以是Query組件的名字,甚至還可以指定其他窗體內(nèi)的數(shù)據(jù)集作為該屬性值。Enable屬性:此屬性是一個(gè)布爾變量,它決定了與此數(shù)據(jù)源組件相連的數(shù)據(jù)瀏覽組件是否顯示數(shù)據(jù)。12/12/2022206.1.5數(shù)據(jù)訪問(wèn)組件頁(yè)簡(jiǎn)介12/11/202220AutoEdit屬性:此屬性也是一個(gè)布爾型變量,它用于說(shuō)明是否將與DataSource組件相連的數(shù)據(jù)集組件自動(dòng)地被設(shè)置成編輯狀態(tài),當(dāng)用戶在與DataSource組件相連的數(shù)據(jù)瀏覽組件中輸入新的值時(shí),數(shù)據(jù)集組件中的記錄也隨之改變。如其值為False,用戶不能改變記錄中的數(shù)據(jù),如想修改記錄,必須調(diào)用數(shù)據(jù)集組件的Edit方法來(lái)完成對(duì)當(dāng)前數(shù)據(jù)的編輯。以下介紹DataSource組件的幾個(gè)主要事件。OnDataChange事件:當(dāng)與DataSource組件相連接的數(shù)據(jù)集的記錄指針的位置發(fā)生變化時(shí),OnDataChange事件就被觸發(fā)。OnUpdataData事件:如果數(shù)據(jù)集組件中的當(dāng)前記錄將要被修改時(shí),觸發(fā)OnUpdateData事件。OnStateChange事件:當(dāng)DataSource組件相連的數(shù)據(jù)集組件的狀態(tài)發(fā)生改變時(shí),便觸發(fā)OnStateChange事件。procedureTForm1.DataSource1StateChange(Sender:TObject);beginInsertButton.Enabled:=(table1.State=dsbrowse);CancelButton.Enabled:=table1.Statein[dsinsert,dsedit,dssetkey];end;12/12/202221AutoEdit屬性:此屬性也是一個(gè)布爾型變量,它用于上面的代碼中,當(dāng)Table1處于瀏覽狀態(tài)(Browse狀態(tài))時(shí),用戶是不能夠向數(shù)據(jù)庫(kù)表中插入新記錄,此時(shí)InsertButton按鈕將變灰暗,即無(wú)效。當(dāng)Table1不處干瀏覽狀態(tài)時(shí),InsertButton按鈕有效,用戶可以向表中插入新記錄。DataSource組件的幾個(gè)主要方法如下。Create方法:調(diào)用Create方法在運(yùn)行時(shí)建立一個(gè)DataSource組件。在設(shè)計(jì)階段向數(shù)據(jù)模塊中添加一個(gè)數(shù)據(jù)源組件時(shí),Delphi自動(dòng)地插入一個(gè)對(duì)Create方法的調(diào)用。調(diào)用Create方法產(chǎn)生了一個(gè)數(shù)據(jù)連接列表,并將該組件的Enabled和AutoEdit屬性值設(shè)為T(mén)rue。Edit方法:調(diào)用Edit方法允許用戶對(duì)與該數(shù)據(jù)源組件相連的數(shù)據(jù)集進(jìn)行編輯修改。6.1.6數(shù)據(jù)控制組件頁(yè)簡(jiǎn)介數(shù)據(jù)控制組件頁(yè)上的組件,主要用于設(shè)計(jì)用戶界面,對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行瀏覽、編輯、插入、刪除等操作。因而數(shù)據(jù)控制組件常常又被稱為數(shù)據(jù)瀏覽組件,數(shù)據(jù)控制組件其實(shí)是在Standard頁(yè)和Additional頁(yè)上的組件的基礎(chǔ)上,相應(yīng)地增加了數(shù)據(jù)控制功能,使得它們能夠顯示和編輯數(shù)據(jù)庫(kù)中數(shù)據(jù)信息。12/12/202222上面的代碼中,當(dāng)Table1處于瀏覽狀態(tài)(Browse與數(shù)據(jù)訪問(wèn)組件不同的是,數(shù)據(jù)控制組件都是可視的,也就是說(shuō),如果修改了它的屬性,在Form上將立即顯示出來(lái)。在特定的條件下.在設(shè)計(jì)期間就可以看到數(shù)據(jù)。數(shù)據(jù)控制組件在組件選擇板中的DataControls頁(yè)上,第1章圖1-6顯示的是DataControls頁(yè)上的全部數(shù)據(jù)控制組件,其中的DBGrid組件用于全屏幕顯示和編輯數(shù)據(jù)庫(kù)表中的記錄,DBNavigator用于在數(shù)據(jù)記錄之間導(dǎo)航、插人記錄、刪際記錄、提交被修改的記錄。

6.1.7DBGrid組件DBGrid組件的作用是將一個(gè)數(shù)據(jù)集記錄顯示在網(wǎng)格中,并且,可以對(duì)其中的數(shù)據(jù)進(jìn)行編輯修改。在窗體中放置網(wǎng)格DBGrid對(duì)象來(lái)顯示和編輯一個(gè)數(shù)據(jù)集(Table或Query)中的記錄。應(yīng)用程序可以通過(guò)數(shù)據(jù)網(wǎng)格組件來(lái)插入、刪除或編輯數(shù)據(jù)集中的數(shù)據(jù),或者只是簡(jiǎn)單地利用它來(lái)顯示數(shù)據(jù)集中的數(shù)據(jù)記錄。網(wǎng)格中的各字段值可以使用字段編輯器來(lái)設(shè)定,也可以在運(yùn)行時(shí)動(dòng)態(tài)地設(shè)置。在運(yùn)行時(shí),用戶可以使用DBNavigator在數(shù)據(jù)網(wǎng)格中移動(dòng),也可以插入、刪除和編輯數(shù)據(jù)。編輯的結(jié)果在移動(dòng)記錄指針到另一條記錄或者結(jié)束應(yīng)用程序時(shí)提交給數(shù)據(jù)庫(kù)。下面介紹DBGrid組件的幾個(gè)重要屬性。12/12/202223與數(shù)據(jù)訪問(wèn)組件不同的是,數(shù)據(jù)控制組件都是可視的,也就是Columns屬性:用來(lái)讀取和設(shè)置網(wǎng)格中列的特性。它可以在設(shè)計(jì)階段由ColumnsEditor對(duì)話框設(shè)定,也可以在應(yīng)用程序運(yùn)行時(shí)動(dòng)態(tài)地設(shè)置。在設(shè)計(jì)階段,如果已經(jīng)建立了DBGrid組件與數(shù)據(jù)集的聯(lián)系,并且,此數(shù)據(jù)集處于打開(kāi)狀態(tài),則單擊對(duì)象觀察器的Columns屬性會(huì)激活ColumnsEditor對(duì)話框。單擊工具條中的【AddAll】按鈕或在快捷菜單中選取【AddAll】命令,對(duì)話框中就會(huì)出現(xiàn)此數(shù)據(jù)集的所有字段,可以通過(guò)對(duì)話框中的工具條,或單擊右鍵彈出的快捷菜單,對(duì)這些字段進(jìn)行增添或刪除的操作。在選擇了對(duì)話框中的某一字段后,在對(duì)象觀察器中會(huì)出現(xiàn)網(wǎng)格中該字段對(duì)象的一些屬性。DataSource屬性:此屬性可以說(shuō)是DBGrid組件最重要的一個(gè)屬性,用來(lái)指明DBGrid組件中顯示數(shù)據(jù)的來(lái)源。DefaultDrawing屬性:將DefaultDrawing屬性設(shè)置為T(mén)rue時(shí),允許DBGrid組件自動(dòng)在每一單元格中顯示數(shù)據(jù)。而將DefaultDrawing屬性設(shè)置為False會(huì)取消自動(dòng)顯示,只有當(dāng)用戶觸發(fā)OnDrawColumnCell事件或OnDrawDataCell事件時(shí),才會(huì)顯示相應(yīng)單元格的數(shù)據(jù)內(nèi)容。

12/12/202224Columns屬性:用來(lái)讀取和設(shè)置網(wǎng)格中列的特性。ReadOnly屬性:用來(lái)標(biāo)志網(wǎng)格是否只用來(lái)顯示記錄,還是允許用戶通過(guò)它來(lái)編輯數(shù)據(jù)。設(shè)置ReadOnly屬性值為T(mén)rue,可防止用戶更改數(shù)據(jù)集中的數(shù)據(jù)。設(shè)置ReadOnly屬性值為False,允許用戶使用網(wǎng)格編輯數(shù)據(jù)集中的數(shù)據(jù)。當(dāng)ReadOnly屬性值為T(mén)rue時(shí),用戶無(wú)法使用【Inset】鍵來(lái)插入一條記錄或者使用【DownArrow】鍵在網(wǎng)格末尾添加一條記錄。SelectedField屬性:說(shuō)明了當(dāng)前選擇單元格的字段,設(shè)置SelectedField屬性可將焦點(diǎn)移至網(wǎng)格中一個(gè)特定的字段。讀取SelectedField屬性來(lái)訪問(wèn)當(dāng)前選中的字段對(duì)象。如果當(dāng)前沒(méi)有選中任何單元格,SelectedField屬性值為空。例如,當(dāng)整行被選中后,SelectedField屬性值就為空。表6-5列出了DBGird組件的重要事件。表6-5DBGird組件的重要事件12/12/202225ReadOnly屬性:用來(lái)標(biāo)志網(wǎng)格是否只用來(lái)顯示記12/12/20222612/11/202226第4章4.6.2節(jié)中介紹了房屋基本信息錄入的批量信息窗體設(shè)計(jì),由于信息量多,可以使用DBGird組件的OnDrawColumnCell事件,實(shí)現(xiàn)動(dòng)態(tài)地以不同的顏色交替顯示各記錄行,這樣可以根據(jù)顏色很直觀地查看表格的內(nèi)容,當(dāng)數(shù)據(jù)信息較多時(shí),可以起到醒目的作用,防止用戶瀏覽數(shù)據(jù)時(shí)行與行之間信息的錯(cuò)位。程序中根據(jù)房屋基本信息表的數(shù)字字段i_houid的奇偶特征來(lái)改變單元格文字的顏色,代碼如下:procedureTdfmbasehouse.DBGrid1DrawColumnCell(Sender:TObject;constRect:TRect;DataCol:Integer;Column:TColumn;State:TGridDrawState);beginifADOQuery1.FieldByName('i_houid').AsIntegermod2=0thenDBGrid1.Canvas.font.Color:=cltealELSEDBGrid1.Canvas.font.Color:=clred;DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column,State);end;12/12/202227第4章4.6.2節(jié)中介紹了房屋基本信息錄入的批量信息房屋基本信息錄入的批量信息顯示在DBGrid網(wǎng)格中,一般用戶在使用DBGrid組件時(shí)輸入完一個(gè)單元格后,習(xí)慣于使用回車表示跳轉(zhuǎn)到下一單元格或者下一行,但是在Windows中默認(rèn)是用Tab表示的,所以用戶感覺(jué)使用不方便,可以使用DBGird組件的OnKeyPress事件把原來(lái)由Tab實(shí)現(xiàn)的跳轉(zhuǎn)轉(zhuǎn)移到回車鍵上,同時(shí)還可以控制在房屋信息批量錄入時(shí),實(shí)現(xiàn)代碼如下:procedureTdfmbasehouse.DBGrid1KeyPress(Sender:TObject;varKey:Char);beginifkey=#13thenbeginif(ActiveControlisTDbgrid)Then//是在TDbgrid控件內(nèi)beginWithTDbgrid(ActiveControl)Doif(Selectedindex<(FieldCount-1))thenbegin12/12/202228房屋基本信息錄入的批量信息顯示在DBGrid網(wǎng)格中,if(Selectedindex=0)thenbeginifnot(keyin['0'..'9',#8])then//過(guò)濾非數(shù)字?jǐn)?shù)據(jù)key:=#0;end;if(Selectedindex=2)thenbeginifnot(keyin['0'..'9',#8])thenkey:=#0;end;if(Selectedindex=3)thenbeginif(pos(',',DBGrid1.SelectedField.Text)>0)or(pos('、',DBGrid1.SelectedField.Text)>0)or(pos('.',DBGrid1.SelectedField.Text)>0)or(pos('/',DBGrid1.SelectedField.Text)>0)thenshowmessage('輸入的樓層中含非法字符,請(qǐng)重新輸入!')elseSelectedindex:=Selectedindex+1;//移動(dòng)到下一字段

12/12/202229if(Selectedindex=0)theendelsebeginSelectedindex:=Selectedindex+1;//移動(dòng)到下一字段end;if(Selectedindex=8)thenbeginifnot(keyin['0'..'9',#8])thenkey:=#0;end;if(Selectedindex=9)thenbeginifnot(keyin['0'..'9',#8])thenkey:=#0;end;if(Selectedindex=11)thenbeginifnot(keyin['0'..'9',#8])thenkey:=#0;12/12/202230end12/11/202230end;if(Selectedindex=12)thenbeginifnot(keyin['0'..'9',#8])thenkey:=#0;end;if(Selectedindex=14)thenbeginifnot(keyin['0'..'9',#8])thenkey:=#0;end;endelsebeginifADOQuery1.Eofthen//如果返回True,則到了批量數(shù)據(jù)錄入信息中數(shù)據(jù)集的末尾beginADOQuery1.append;//添加新的記錄Selectedindex:=0;//光標(biāo)定制到0列上end12/12/202231end;12/11/202231elsebeginDBNavigator1.BtnClick(nbnext);//未到數(shù)據(jù)集的末尾,則定位到下一條Selectedindex:=0;end;end;end;end;end;6.1.8DBNavigator組件DBNavigator組件(又稱為數(shù)據(jù)庫(kù)導(dǎo)航器)用來(lái)在數(shù)據(jù)集中瀏覽數(shù)據(jù)和編輯數(shù)據(jù),例如,插入一條空記錄或者提交記錄等。DBNavigator組件是由一組控制按鈕組成。通過(guò)這些控制按鈕,用戶可以完成在數(shù)據(jù)集中移動(dòng)記錄指針,增加或刪除一項(xiàng)記錄,編輯修改數(shù)據(jù)記錄以及向數(shù)據(jù)庫(kù)提交對(duì)數(shù)據(jù)集記錄的修改等工作。DBNavigator組件一般與其他數(shù)據(jù)控制組件(DBGrid或DBEdit)一起使用。DBNavigator組件提供給用戶在編輯或?yàn)g覽數(shù)據(jù)時(shí)對(duì)數(shù)據(jù)集的控制。當(dāng)用戶使用DBNavigator組件中的按鈕時(shí),與此DBNavigator組件相連的數(shù)據(jù)集會(huì)發(fā)生相應(yīng)的變化。12/12/202232else12/11/202232ConfirmDelete屬性:使用DBNavigator組件ConfirmDelete屬性是用來(lái)決定用戶在刪除記錄時(shí)是否顯示要求用戶確認(rèn)的消息框。DataSource屬性:通過(guò)設(shè)置DBNavigator組件的DataSource屬性,將它與其控制的數(shù)據(jù)集聯(lián)系起來(lái)。ShowHint與Hints屬性:ShowHint屬性決定是否顯示DBNavigator組件中各按鈕的提示信息。Hints屬性用來(lái)設(shè)置提示信息,單擊對(duì)象觀察器的Hints屬性框會(huì)激活StringListEditor對(duì)話框,在對(duì)話框中輸入提示信息的順序與DBNavigator組件中各按鈕的先后順序一樣。另外,Hints屬性也可以在運(yùn)行程序時(shí)通過(guò)Add方法實(shí)現(xiàn),例如下面的語(yǔ)句:DBNavigator1.Hints.Items.Add(第一條記錄);VisibleButtons屬性:用來(lái)確定DBNavigator組件中需要顯示哪些按鈕,它包括10個(gè)選項(xiàng):nbFirst,nbPrior,ndNext,nbLast,nbInsert,nbDelete,nbEdit,nbPost,nbCabcel和nbRefresh,它們分別對(duì)應(yīng)著10個(gè)按鈕。該例子的設(shè)計(jì)界面如圖6-6所示,應(yīng)用窗體中各組件的屬性設(shè)置如表6-6所示。12/12/202233ConfirmDelete屬性:使用DBNavigat圖6-6程序設(shè)計(jì)界面

12/12/20223412/11/202234表6-6組件的屬性設(shè)置

12/12/202235表6-6組件的屬性設(shè)置12/11/202235選中設(shè)計(jì)界面Table1組件,單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇“FieldsEditor…”,則彈出如圖6-7所示的字段編輯器界面,接著選擇某一字段,在ObjectInspector中設(shè)置其Visible屬性,只需將CustNo、Company、Country和City字段的Visible屬性設(shè)置為T(mén)rue(默認(rèn)的),其余字段的Visible屬性設(shè)置為False,那么在DBGrid1網(wǎng)格中只顯示CustNo、Company、Country和City字段。圖6-7字段編輯器12/12/202236選中設(shè)計(jì)界面Table1組件,單擊鼠標(biāo)右鍵,在彈出的可以為DBGrid1組件的OnDblClick事件編寫(xiě)處理程序,其語(yǔ)句為:ListBox1.Visible:=true;當(dāng)用戶在網(wǎng)格中雙擊鼠標(biāo)左鍵時(shí),彈出一個(gè)列表框用戶為網(wǎng)格中某一列選擇一個(gè)字段值。接著為L(zhǎng)istBox1組件編寫(xiě)OnDblClick事件處理過(guò)程,當(dāng)用戶編輯修改Country字段時(shí),雙擊鼠標(biāo)左鍵便彈出列表框供用戶選擇,單擊其中的國(guó)家名稱后,將相應(yīng)的國(guó)家名選入網(wǎng)格中。其代碼如下:procedureTForm1.ListBox1DblClick(Sender:TObject);vari:integer;beginfori:=0to(listbox1.Items.Count-1)dobeginiflistbox1.Selected[i]thenbegintable1.Edit;//將在Listbox列表框中的內(nèi)容賦給當(dāng)前記錄的country字段table1.FieldByName('country').AsString:=Listbox1.Items.Strings[i];table1.Post;end;end;12/12/202237可以為DBGrid1組件的OnDblClick事件編寫(xiě)處理程ListBox1.Visible:=false;//修改完畢,將Listbox列表框隱藏起來(lái)end;圖6-8程序運(yùn)行界面單擊“”按鈕Button1的事件處理過(guò)程代碼如下:12/12/202238ListBox1.Visible:=false;//修procedureTForm1.Button1Click(Sender:TObject);beginDBNavigator1.Visible:=[nbFirst,nbPrior,nbNext,nbLast];end;單擊“”按鈕之前DBNavigator1按鈕的顯示與設(shè)計(jì)時(shí)一樣,單擊“”按鈕之后運(yùn)行界面如圖6-8所示。以下介紹DBNavigator組件的重要事件:DBNavigator組件的重要事件是OnClick事件,它在DBNavigator組件的某個(gè)按鈕被單擊并執(zhí)行完相應(yīng)的操作之后觸發(fā)。它的基本格式如下:ProcedureTForn1.DBNavigator1Click(Sender:Tobject;Button:TNavigateBtn);其中Button參數(shù)的值可以為nbFirst,nbPrior,ndNext,nbLast,nbInsert,nbDelete,nbEdit,nbPost,nbCabcel和nbRefresh。它們分別對(duì)應(yīng)著DBNavigator組件中的各按鈕。OnClick事件在下列情況下被觸發(fā)?!?/p>

用戶單擊了DBNavigator組件上的按鈕?!?/p>

當(dāng)焦點(diǎn)在DBNavigator組件上時(shí),用戶按下了空格鍵。●

調(diào)用了BtnClick方法。12/12/202239procedureTForm1.Button1Click(6.1.9DBText組件DBText組件用來(lái)顯示數(shù)據(jù)集里當(dāng)前記錄中一個(gè)特定字段值的數(shù)據(jù)控制組件。用DBText組件顯示的字段值是只讀屬性的,即用戶不能通過(guò)這個(gè)組件來(lái)修改數(shù)據(jù)。如果用戶要修改數(shù)據(jù),就需要使用DBEdit組件或者DBMemo組件。DBText組件顯示的是當(dāng)前記錄中特定字段的值,所以隨著記錄指針的移動(dòng),其顯示的內(nèi)容也不斷變化,這也就是它與Lable組件不同的地方。下面介紹DBText組件的幾個(gè)重要屬性。DataSource屬性:設(shè)置為一個(gè)數(shù)據(jù)源組件的名稱,通過(guò)此數(shù)據(jù)源組件與數(shù)據(jù)集取得聯(lián)系,從而讀取數(shù)據(jù)集中的數(shù)據(jù)。DataField屬性:用來(lái)確定DBText組件顯示的是當(dāng)前記錄中哪個(gè)特定字段的值。在完成DBText組件與特定數(shù)據(jù)集的聯(lián)系后,對(duì)象觀察器中的DataField屬性框會(huì)自動(dòng)產(chǎn)生一個(gè)下拉列表,包含了當(dāng)前打開(kāi)數(shù)據(jù)集中的所有字段。6.1.10DBEdit組件DBEdit組件用來(lái)顯示和編輯數(shù)據(jù)集里當(dāng)前記錄中一個(gè)特定字段值的數(shù)據(jù)控制組件。用DBText組件顯示的字段值是只讀屬性的,而使用DBEdit組件允許用戶編輯修改數(shù)據(jù),這也是它們之間惟一的區(qū)別。DBText組件顯示和編輯修改的是當(dāng)前記錄中特定字段的值,所以隨著記錄指針的移動(dòng),其顯示的內(nèi)容也不斷變化。但與DBGrid組件不同,它一次只能顯示及編輯修改當(dāng)前記錄中特定的一個(gè)字段值。下面介紹DBEdit組件的幾個(gè)重要屬性。12/12/2022406.1.9DBText組件12/11/202240DataSource屬性:DBEdit組件的DataSource屬性與與其他數(shù)據(jù)控制組件一樣,設(shè)置為窗體中的一個(gè)數(shù)據(jù)源組件的名稱。通過(guò)此數(shù)據(jù)源組件與數(shù)據(jù)集取得聯(lián)系,從而對(duì)數(shù)據(jù)集中的數(shù)據(jù)進(jìn)行操作。DataField屬性:DataField屬性用來(lái)確定DBEdit組件顯示與編輯是當(dāng)前記錄中哪個(gè)特定字段的值。6.1.11DBMemo組件DBMemo組件用來(lái)顯示和編輯數(shù)據(jù)集中的多行文本。DBMemo組件組件允許用戶顯示和編輯一個(gè)包含多行文本內(nèi)容的字段。DBMemo的Text屬性代表了該字段的內(nèi)容。DBMemo的顯示與編輯數(shù)據(jù)集字段內(nèi)容的功能與DBEdit類似,只不過(guò)DBMemo允許多行文本,并主要用于大二進(jìn)制類型的文本對(duì)象(BLOBs),而DBEdit組件顯示較少內(nèi)容的文本字段。DBMemo組件的重要屬性除了和其他數(shù)據(jù)控制組件一樣的DataSource和DataField屬性以外,還具有以下不同的屬性。AutoDisplay屬性:用來(lái)決定是否自動(dòng)顯示一個(gè)數(shù)據(jù)集中備注類型的字段值。當(dāng)AutoDisplay屬性值為T(mén)rue時(shí),DBMemo組件將隨著當(dāng)前記錄的改變自動(dòng)顯示該字段的新的內(nèi)容。如果AutoDisplay屬性值為False,DBMemo組件在當(dāng)前記錄改變時(shí)只顯示字段名12/12/202241DataSource屬性:DBEdit組件的Data注意,AutoDisplay屬性只能應(yīng)用于BLOB類型的字段。對(duì)于其他類型的文本字段,AutoDisplay沒(méi)有任何作用。圖6-9程序設(shè)計(jì)界面Alignment屬性:Alignment屬性用來(lái)說(shuō)明在DBMemo組件中顯示文本時(shí)的對(duì)齊方式。可以有左對(duì)齊、右對(duì)齊和居中三種方式。MaxLength屬性:MaxLength屬性用來(lái)限定可以輸入DBMemo組件中的最大字符數(shù)。此屬性值為0時(shí),表明不限定字符數(shù)。WordWrap屬性:WordWrap屬性是一個(gè)布爾值,用來(lái)指明向DBMemo組件中輸入的文本到了右邊界處是否自動(dòng)換行。ReadOnly屬性:ReadOnly屬性限定了DBMemo組件中顯示的文本是只讀類型的,不能編輯修改。下面舉一個(gè)使用DBText、DBEdit、DBMemo這三個(gè)組件的例子。程序的設(shè)計(jì)界面如圖6-9所示。其中主要組件的屬性設(shè)置如表6-7所示。12/12/202242注意,AutoDisplay屬性只能應(yīng)用于BLOB類型的字段表6-7組件的屬性設(shè)置

12/12/202243表6-7組件的屬性設(shè)置12/11/202243程序運(yùn)行時(shí)只需在窗體創(chuàng)建時(shí),編寫(xiě)如下代碼即可。procedureTForm1.FormShow(Sender:TObject);beginTable1.Active:=true;end;圖6-10程序運(yùn)行界面所有組件屬性設(shè)置正確之后,直接運(yùn)行程序就可以了,程序運(yùn)行后的界面如圖6-10所示。在運(yùn)行界面中,當(dāng)用戶通過(guò)DBNavigator導(dǎo)航組件移動(dòng)指針時(shí),可以看到記錄也在發(fā)生變化,其中SpeciesNo標(biāo)簽后的種類號(hào)不能修改,其他文本框在記錄集處于編輯狀態(tài)時(shí)均可以修改。12/12/202244程序運(yùn)行時(shí)只需在窗體創(chuàng)建時(shí),編寫(xiě)如下代碼即可。12/11/26.2基于ADO的組件在Delphi的組件面板上有一個(gè)ADO組件頁(yè),如圖第1章1-4所示,大部分的ADO組件都有相類似的基于BDE的連接和數(shù)據(jù)集組件。如ADOConnection組件與Database組件類似,ADOTable與Table,ADOQuery與Query,以及ADOStoredProc和StoredProc之間也都具有這種類似關(guān)系。利用ADO組件編寫(xiě)的ADO應(yīng)用程序使用的數(shù)據(jù)源組件(DataSource)與BDE的一樣,用于連接用戶界面的數(shù)據(jù)控制組件和ADO數(shù)據(jù)集組件,沒(méi)有專門(mén)的ADO數(shù)據(jù)源組件。12/12/2022456.2基于ADO的組件在Delphi的組件面板上6.3字段對(duì)象

字段對(duì)象是數(shù)據(jù)庫(kù)編程里的一個(gè)重要概念,它描述了數(shù)據(jù)集控件(Table和Query)里的數(shù)據(jù)的類型、當(dāng)前值、顯示格式、編輯格式和其他特性。Delphi用TField控件對(duì)象及其派生類來(lái)創(chuàng)建數(shù)據(jù)集中的字段。Table和Query控件中有一個(gè)屬性Fields,F(xiàn)ields是一組TField類型(包括派生類)的對(duì)象的組合列表,如Table、Query一樣,TField也是非可視的,甚至在設(shè)計(jì)期都不能直接看到它,只能通過(guò)數(shù)據(jù)訪問(wèn)控件和數(shù)據(jù)控制控件間接地訪問(wèn)它。TField對(duì)象是在打開(kāi)數(shù)據(jù)庫(kù)時(shí)動(dòng)態(tài)產(chǎn)生的,在數(shù)據(jù)庫(kù)關(guān)閉時(shí)自動(dòng)消失。當(dāng)然,可以通過(guò)第6.1節(jié)圖6-7所示的字段編輯器(FieldsEditor)建立永久字段來(lái)代替動(dòng)態(tài)字段,使用永久字段來(lái)顯示編輯數(shù)據(jù)。永久字段對(duì)象被保存在應(yīng)用程序中,即使數(shù)據(jù)庫(kù)表的基本結(jié)構(gòu)發(fā)生了改變,它也會(huì)被保留,但如果修改后的表中不再有原來(lái)的所定義的字段對(duì)象,Delphi應(yīng)用程序在運(yùn)行過(guò)程中會(huì)給出錯(cuò)誤信息。12/12/2022466.3字段對(duì)象字段對(duì)象是數(shù)據(jù)庫(kù)編程里的一個(gè)重要6.4.1理解字段對(duì)象一般來(lái)說(shuō),一個(gè)簡(jiǎn)單字段組件用來(lái)表示數(shù)據(jù)庫(kù)字段中一列的特征,如數(shù)據(jù)類型和大小。它也用于表示字段的顯示特征,如排列對(duì)齊方式、顯示格式、編輯格式等。最后,當(dāng)在數(shù)據(jù)集的記錄之間滾動(dòng)時(shí),字段組件將更新當(dāng)前字段的值,并顯示給用戶查看。Delphi7創(chuàng)建的字段對(duì)象與字段的數(shù)據(jù)類型有關(guān)。例如,對(duì)于字符串類型的字段,創(chuàng)建的是TStringField對(duì)象;對(duì)于浮點(diǎn)類型的字段,創(chuàng)建的是TFloatField對(duì)象。表6-10以TFloatField為例,描述了直接影響字段顯示外觀的4個(gè)屬性。表6-10FloatField的直接影響字段顯示的4個(gè)屬性12/12/2022476.4.1理解字段對(duì)象12/11/202247對(duì)于不同類型的字段對(duì)象來(lái)說(shuō),它們的屬性大部分是相同的,例如DisplayWidth和Alignment。但也有一些屬性是專用的,例如TFloatField的Precision屬性就是其他字段對(duì)象所沒(méi)有的。字段對(duì)象的大部分屬性只能影響數(shù)據(jù)在窗體上的顯示屬性,但也有些屬性,如Precision還影響用戶輸入和修改數(shù)據(jù)的格式。6.4.2顯示、轉(zhuǎn)換和訪問(wèn)字段的值數(shù)據(jù)組件能夠自動(dòng)顯示字段的值。在允許編輯的情況下,用戶可以在數(shù)據(jù)組件中修改字段的值,并且把修改后的值寫(xiě)回到數(shù)據(jù)集中,這些都不需要寫(xiě)代碼。應(yīng)用程序可以通過(guò)Field的Value屬性訪問(wèn)字段的值。例如,下面這行代碼把Table1Company字段的值顯示在文本框Edit1中。Edit1.Text:=Table1Company.Value;從理論上講,Value屬性可以訪問(wèn)任何數(shù)據(jù)類型的字段值。不過(guò),很多數(shù)據(jù)組件只能傳遞字符串類型的值,因此需要對(duì)Value屬性進(jìn)行轉(zhuǎn)換。Field中提供了眾多的轉(zhuǎn)換功能,可以按特定的數(shù)據(jù)類型訪問(wèn)一個(gè)字段的值。例如AsString可以把數(shù)字或布爾型的字段按字符串類型進(jìn)行訪問(wèn)。12/12/202248對(duì)于不同類型的字段對(duì)象來(lái)說(shuō),它們的屬性大部分是相同的,AsVariant適用于所有的數(shù)據(jù)類型,但轉(zhuǎn)換并不總是成功的。例如,AsDateTime可以把一個(gè)字符串轉(zhuǎn)換為日期、時(shí)間,但該字符串本身必須能識(shí)別出是日期時(shí)間格式,還是一個(gè)普通的字符串。有些情況下,雖然轉(zhuǎn)換可以進(jìn)行,但也可能丟失精度。用Value屬性訪問(wèn)字段的值需要事先知道字段對(duì)象的名稱。很多情況下,不知道字段對(duì)象的名稱,卻知道字段的名稱。因此,應(yīng)用程序往往通過(guò)字段的序號(hào)或名稱來(lái)訪問(wèn)字段的值。數(shù)據(jù)集組件都有一個(gè)Fields屬性,這是一個(gè)數(shù)組,它的每一個(gè)元素代表一個(gè)字段。這樣就可以按序號(hào)來(lái)訪問(wèn)某個(gè)字段的值,序號(hào)從0開(kāi)始。例如,下面的代碼把Customers表的第7個(gè)字段顯示到文本框Edit1中。Edit1.Text:=CustTable.Fields[6].AsString;下面的代碼把第7個(gè)字段的值設(shè)為文本框Edit1中的內(nèi)容。Customers.Edit;Customers.Fields[6].AsString:=Edit1.Text;Customers.Post;12/12/202249AsVariant適用于所有的數(shù)據(jù)類型,但轉(zhuǎn)換并不總是不過(guò),按序號(hào)來(lái)訪問(wèn)字段的值不是很安全的,因?yàn)槿绻涘e(cuò)了序號(hào),就得不到正確的結(jié)果。因此,最好按字段名稱訪問(wèn)字段的值。這時(shí),就要用到FieldByName函數(shù)。調(diào)用FieldByName函數(shù),需把字段的名稱作為參數(shù)傳遞給FieldByName函數(shù)。例如,下面的代碼把Customers表的CustNo字段顯示在文本框Edit2中。Edit2.Text:=Customers.FieldByName(‘CustNo’).Asstring;下面的代碼把CustNo字段的值設(shè)為文本框Edit2中的內(nèi)容。Customers.Edit;Customers.FieldByName(‘CustNo’).Asstring:=Edit2.Text;Customers.Post;在多層體系結(jié)構(gòu)的應(yīng)用程序中,客戶程序向應(yīng)用服務(wù)器申請(qǐng)更新數(shù)據(jù)時(shí)有可能出錯(cuò)。這是可以用CurValue屬性檢查字段當(dāng)前的值,因?yàn)樽侄蔚闹惦S時(shí)有可能修改,尤其是在多用戶的環(huán)境下。因此,知道字段當(dāng)前的值很有必要。12/12/202250不過(guò),按序號(hào)來(lái)訪問(wèn)字段的值不是很安全的,因?yàn)槿绻涘e(cuò)了6.4在運(yùn)行窗體中對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作

通過(guò)窗體可以對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行一些基本的操作,例如數(shù)據(jù)的添加、刪除和更新等。第4.6節(jié)介紹了包含數(shù)據(jù)源的房源信息錄入窗體界面設(shè)計(jì),下面結(jié)合ADO組件針對(duì)該窗體中要實(shí)現(xiàn)的功能,講解如何進(jìn)行數(shù)據(jù)的各種操作。

12/12/2022516.4在運(yùn)行窗體中對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作

通過(guò)窗體可以6.5.1查看并修改數(shù)據(jù)數(shù)據(jù)庫(kù)中要對(duì)大量的數(shù)據(jù)信息進(jìn)行處理,通過(guò)設(shè)計(jì)網(wǎng)格可以操作這些信息。4.6.2節(jié)表4-14列出了房源信息錄入窗體主要控件屬性,由于售樓系統(tǒng)涉及的數(shù)據(jù)量非常大,因此將數(shù)據(jù)按區(qū)和棟進(jìn)行了篩選,工作人員輸入要查看和修改的房源所在區(qū)和棟,然后按下鍵盤(pán)上的回車鍵即可,此時(shí)數(shù)據(jù)以批量更新方式打開(kāi),也就是把對(duì)數(shù)據(jù)集的修改先放到緩存里,接著一次全部提交給數(shù)據(jù)庫(kù),或者撤消這些修改??梢?jiàn),批量更新可以作為一種數(shù)據(jù)集控件的事務(wù)處理,因?yàn)橐话愕氖聞?wù)處理是針對(duì)ADOConnection控件的。設(shè)置好這些屬性后,打開(kāi)ADO數(shù)據(jù)集時(shí)就是以更新的方式打開(kāi)的了。當(dāng)然也可以在運(yùn)行期設(shè)置好這些屬性,再打開(kāi)數(shù)據(jù)集,如下所示:12/12/2022526.5.1查看并修改數(shù)據(jù)12/11/202252WithADODataSet1doBeginCursorType:=ctKeyset;LockType:=ltbatchoptimistic;CommandType:=cmdText;CommandText:=’select*fromAnimals’;Open;End;查看并修改房源信息是通過(guò)調(diào)用窗體上棟標(biāo)簽后的文本框Edit2的OnKeyDown事件來(lái)實(shí)現(xiàn)的,即當(dāng)用戶在文本框Edit2中按下任何鍵都產(chǎn)生OnKeyDown事件,代碼如下:ProcedureTdfmbasehousenew.Edit2KeyDown(Sender:TObject;varKey:Word;Shift:TShiftState);Beginifkey=13then//如果按下的是回車鍵beginifedit2.Text=''thenbeginshowmessage('未輸入房屋棟號(hào),請(qǐng)輸入');Edit2.SetFocus;//讓文本框Edit2重新獲得焦點(diǎn),以便用戶輸入棟號(hào)end12/12/202253WithADODataSet1do12/11/20elseif(trim(edit1.Text)<>'')and(trim(edit2.Text)<>'')thenbeginifADOQuery1.ActivethenADOQuery1.Active:=false;ADOQuery1.Close;ADOQuery1.SQL.Clear;ADOQuery1.SQL.Add('select*fromhou_bahouse');ADOQuery1.SQL.Add('wherei_qu=:quandc_dong=:dongorderbyi_danyuan,c_louceng,c_fanghao');//按用戶輸入的區(qū)、棟篩選房源,并依次以單元、樓層、房號(hào)為序顯示ADOQuery1.Parameters.ParamByName('qu').DataType:=ftinteger;//定義參數(shù)為整型類型ADOQuery1.Parameters.ParamByName('qu').Value:=trim(edit1.text);//給參數(shù)賦值A(chǔ)DOQuery1.Parameters.ParamByName('dong').DataType:=ftstring;//定義參數(shù)為字符串類型ADOQuery1.Parameters.ParamByName('dong').Value:=trim(edit2.text);//給參數(shù)賦值12/12/202254else12/11/202254ADOQuery1.CursorType:=ctKeyset;ADOQuery1.LockType:=ltbatchoptimistic;//數(shù)據(jù)以批量更新方式打開(kāi)ADOQuery1.Open;//窗體中將DataSource1組件的AutoEdit屬性設(shè)置為T(mén)rue,則該組件對(duì)應(yīng)ADOQuery1中的數(shù)據(jù)集打開(kāi)時(shí)即可對(duì)它進(jìn)行修改ifadoquery1.IsEmptythenbeginBitBtn2.Enabled:=false;BitBtn3.Enabled:=false;//無(wú)指定區(qū)、棟房源信息時(shí),刪除和修改按鈕變灰即不可用endelsebeginBitBtn2.Enabled:=true;BitBtn3.Enabled:=true;//有指定區(qū)、棟房源信息時(shí),刪除和修改按鈕可用end;dbedit1.ReadOnly:=true;//單套房屋信息錄入頁(yè)面中所有組件均設(shè)置為只讀//dbedit2到dbedit13的ReadOnly屬性均設(shè)置為trueDBLookupComboBox1.ReadOnly:=true;DBLookupComboBox2.ReadOnly:=true;12/12/202255ADOQuery1.CursorType:=ctKeysetDBMemo1.ReadOnly:=true;end;BitBtn1.Enabled:=true;end;end;房屋基本信息錄入窗體中分?jǐn)偯娣e這一項(xiàng)是數(shù)據(jù)庫(kù)里沒(méi)有的字段,但是它是可計(jì)算的,是建筑面積和套內(nèi)面積之差,因此可以把分?jǐn)偯娣escgt視為程序中的一個(gè)字段,而且把它稱做計(jì)算字段。要定義一個(gè)新的計(jì)算字段,首先選中ADOQuery1組件,單擊鼠標(biāo)右鍵選擇FieldsEditor…項(xiàng),出現(xiàn)字段編輯器,在字段編輯器上右擊,在彈出的菜單中選擇NewField命令,彈出NewField對(duì)話框,按如圖6-13所示創(chuàng)建分?jǐn)偯娣escgt這一計(jì)算字段,其字段名為scgt,字段類型為Float,字段控件名為ADOQuery1scgt。這時(shí)生成的scgt字段位于字段列表中的最后一個(gè),調(diào)整它的位置,使它位于套內(nèi)面積f_eniarea之后,相應(yīng)地在單套房屋信息錄入頁(yè)面有一個(gè)Label組件,Caption屬性為“分?jǐn)偯娣e”,一個(gè)DBEdit組件,名稱為DBEdit9,其DataSource屬性為DataSource1,DataField屬性為scgt,用于顯示scgt字段的值。編寫(xiě)ADOQuery1組件的OnCalcFields事件句柄處理代碼如下:12/12/202256DBMemo1.ReadOnly:=true;12/11/2圖6-13創(chuàng)建計(jì)算字段scgtprocedureTdfmbasehousenew.ADOQuery1CalcFields(DataSet:TDataSet);beginADOQuery1.FieldByName('scgt').Value:=ADOQuery1.FieldByName('f_enarea').Value-ADOQuery1.FieldByName('f_eniarea').Value;ADOQuery1.FieldByName('zongjia').Value:=ADOQuery1.FieldByName('f_enarea').Value*ADOQuery1.FieldByName('m_price').Valueend;12/12/20225712/11/202257

用戶錄入數(shù)據(jù)時(shí),錄入了建筑面積和套內(nèi)面積,則分?jǐn)偯娣e馬上自動(dòng)計(jì)算出來(lái)了。按照同樣的方法可以設(shè)置總價(jià)字段為一個(gè)計(jì)算字段zongjia,用建筑面積f_enarea和單價(jià)m_price相乘得到。在圖6-18中還可以設(shè)置檢索(Lookup)類型的字段,即它的值能且只能從另一個(gè)數(shù)據(jù)集的字段中獲取,因此是只讀的不能更改。房屋基本信息錄入窗體中的用途字段為檢索字段yt,檢索數(shù)據(jù)表hou_use中的c_use字段值。在NewField對(duì)話框中按照?qǐng)D6-14設(shè)置yt字段,類型為String,在FieldType選項(xiàng)組內(nèi)選擇“Lookup”,此時(shí)將激活下面的“LookupDefinition”選項(xiàng)組。窗體中事先要加入數(shù)據(jù)集ADOQuery2,其Connection屬性為DataModule1.ADOConnection1,SQL屬性為“select*fromhou_use”。在LookupDefinition選項(xiàng)組的KeyFields框內(nèi)選擇當(dāng)前數(shù)據(jù)集ADOQuery1的c_use字段,在LookupKeys框內(nèi)選擇數(shù)據(jù)集ADOQuery2中的c_use字段作為關(guān)鍵字段,用于與KeyFields框內(nèi)的c_use字段匹配,ResultField框內(nèi)選擇數(shù)據(jù)集ADOQuery2中的c_use字段,該字段的值將返回給新增加的檢索字段yt。相應(yīng)地在單套房屋信息錄入頁(yè)面有一個(gè)Label組件,Caption屬性為“用途”,一個(gè)DBLookupComboBox組件,名稱為DBLookupComboBox1,其DataSource屬性為DataSource1,DataField屬性為yt,用于顯示yt檢索字段的值,而KeyField和ListField屬性均為c_use。12/12/202258

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論