?? 033.htm
字號(hào):
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=GB2312"><TITLE>-->DELPHI基礎(chǔ)教程-->第十四章 簡單數(shù)據(jù)庫應(yīng)用的創(chuàng)建及MASTAPP介紹(一)</TITLE>
<META NAME="keywords" CONTENT=" DELPHI基礎(chǔ)教程 第十四章 簡單數(shù)據(jù)庫應(yīng)用的創(chuàng)建及MASTAPP介紹(一)">
<META NAME="description" CONTENT=" - DELPHI基礎(chǔ)教程 - 第十四章 簡單數(shù)據(jù)庫應(yīng)用的創(chuàng)建及MASTAPP介紹(一)">
<style>
<!--
#page {position:absolute; z-index:0; left:0px; top:0px}
.tt3 {font: 9pt/12pt "宋體"}
.tt2 {font: 12pt/15pt "宋體"}
a {text-decoration:none}
a:hover {color: blue;text-decoration:underline}
-->
</style>
</HEAD>
<body text="#000000" aLink=#9900ff link=#006699 vLink=#006699 background="bg.gif" leftmargin="3" topmargin="3" marginheight="3" marginwidth="3">
<TR>
<TD CLASS="tt3" VALIGN="top" width="8%" background="bg.gif"><strong><A HREF="034.htm" ><FONT style="FONT-SIZE: 9pt">后一頁</font></A><BR>
<A HREF="032.htm" ><FONT style="FONT-SIZE: 9pt">前一頁</font></A><BR>
<A HREF="index.html" ><FONT style="FONT-SIZE: 9pt">回目錄</font></A><BR>
<A HREF="../../../../../index.htm"><FONT style="FONT-SIZE: 9pt">回首頁</font></A><BR>
</strong>
</TD>
<TD class="tt2" background="bg.gif" width="84%"><center><B><FONT style="FONT-SIZE: 16.5pt" COLOR="#FF6666" FACE="楷體_GB2312">第十四章 簡單數(shù)據(jù)庫應(yīng)用的創(chuàng)建及MASTAPP介紹(一)</FONT></B></center>
<hr color="#EE9B73" size="1" width="94%">
<p> Delphi中嵌入的數(shù)據(jù)庫應(yīng)用開發(fā)工具如Database
Form Expert具有很強(qiáng)大的功能,我們不需要編寫任何程序代碼便可以快速地創(chuàng)建一個(gè)簡單的數(shù)據(jù)庫應(yīng)用程序,甚至還能創(chuàng)建基于多個(gè)數(shù)據(jù)庫表的主要──明細(xì)型數(shù)據(jù)庫應(yīng)用程序。</p>
<p> 本章主要介紹用Delphi開發(fā)簡單的數(shù)據(jù)庫應(yīng)用程序的一般方法和步驟,首先讓讀者對(duì)Delphi強(qiáng)勁的數(shù)據(jù)庫應(yīng)用開發(fā)工具有一個(gè)直觀的印象,然后在此基礎(chǔ)上進(jìn)行復(fù)雜的數(shù)據(jù)庫應(yīng)用程序的設(shè)計(jì),本章主要包括以下內(nèi)容:</p>
<p>● 創(chuàng)建數(shù)據(jù)庫應(yīng)用窗體</p>
<p> 包括用Database Form Expert
或手工方式創(chuàng)建簡單的無需編寫程序代碼的應(yīng)用程序或者利用多個(gè)部件并編寫功能復(fù)雜的程序代碼創(chuàng)建主要──明細(xì)型數(shù)據(jù)庫應(yīng)用程序。</p>
<p>● 在應(yīng)用程序中控制字段有關(guān)的屬性</p>
<p>
描述怎樣讀寫數(shù)據(jù)庫表中字段的值和控制字段的顯示格式等。</p>
<p> </p>
<p>
本章所介紹的例子中用到的窗體、數(shù)據(jù)庫表以及相關(guān)的文件都是在安裝Delphi時(shí)缺省安裝在C:\DELPHI\DEMOS\DB\MASTAPP目錄中,并且用別名DBDEMOS表示這一子目錄。
在本章例子中,除特殊聲明外,所有的TTable和 TQuery 部件的 DatabaseName
屬性都設(shè)置為DBDEMOS。</p>
<p align="center">14.1 簡單的基于單表的據(jù)庫應(yīng)用 </p>
<p> 用Decphi創(chuàng)建顯示一個(gè)數(shù)據(jù)庫表中的內(nèi)容的應(yīng)用非常簡單和方便,只需要三個(gè)部件,只要將這三個(gè)部件通過相關(guān)的屬性相互聯(lián)系起來,不需要編寫任何程序代碼便可以實(shí)現(xiàn)。例如,用戶想查看數(shù)據(jù)庫表Customer.DB中的內(nèi)容時(shí),可以按下面步驟來實(shí)現(xiàn): </p>
<p>14.1.1 選擇相關(guān)的部件: </p>
<p> 選擇菜單Project/New開始一個(gè)新工程,并修改Form1的Caption屬性為CustomerFrom1并把Name屬性設(shè)置為CustomerForm1,然后從部件選擇板上的Data
Access 頁上選取一個(gè)Datasounce部件和一個(gè)Table部件放到窗體的左上角,它們是非可見的部件,
在窗體中我們看到的只是部件的圖標(biāo);從Data Control頁上選取DBGrid部件放到窗體中前兩個(gè)部件的下面。完成這些工作之后,窗體如圖14.1所示。 </p>
<p>圖在CustomerFrom1窗體中放置三個(gè)部件 </p>
<p>14.1.2 設(shè)置部件的屬性 </p>
<p>為了使TDBGrid部件能夠顯示數(shù)據(jù)庫表Customer.DB中的客戶信息,我們必須修改窗體三個(gè)部件相關(guān)的屬性,這些屬性的設(shè)置如表14.1所示。 </p>
<p>表14.1 CustomerFrom1窗體中三個(gè)部件的屬性設(shè)置</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</p>
<p>屬 性 屬 性 值</p>
<p>──────────────────────────────</p>
<p>DataSource1.AutoEdit False</p>
<p>DataSource1.DataSet Table1</p>
<p>Table1.DatabaseName DBDEMOS</p>
<p>Table1.TableName CUSTOMER.DB</p>
<p>Table1.Active True</p>
<p>DBGrid1.DataSource DataSource1</p>
<p>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ </p>
<p> 這里要注意的是:DBDEMOS是Delphi缺省安裝時(shí)C:\Delphi\DEMO\DB\MASTAPP目錄的別名,而且數(shù)據(jù)庫表Customer.DB存在該目錄下,用戶在使用這一例子時(shí),
請(qǐng)注意這兩項(xiàng)設(shè)置都是正確的。另外 Datasource1.Dataset,Table1.TableName和DBGrid1.Datasource屬性都有下拉式列表框允許用戶從可能的值列表中選擇它們的值,這樣能方便我們進(jìn)行屬性的設(shè)置,而且不容易出錯(cuò)。</p>
<p> Datasouuce1.AutoEdit屬性設(shè)置為False是為了防止用戶修改數(shù)據(jù)庫表中的數(shù)據(jù),
在下面的討論中我們將詳細(xì)地進(jìn)行說明。</p>
<p> Table1.Active設(shè)置為True時(shí),Delphi會(huì)打開Table1.TableName所指定的數(shù)據(jù)庫表。如果這個(gè)數(shù)據(jù)庫表不存在(或表中什么也沒有,
即空表), Delphi 會(huì)彈出出錯(cuò)信息并且Table1.Active變成False。當(dāng)Table1.Active被設(shè)置成True之后,Table1
部件的一些屬性就不能再修改了,如Table1.DatabaseName和Table1.Tablename屬性。若要修改它們,
必須首先要將Table1.Active屬性設(shè)置為False,然后再進(jìn)行修改,否則,Delphi會(huì)彈出錯(cuò)誤信息“Cannot
perform this operation on an open database”。當(dāng)看到這個(gè)錯(cuò)誤信息時(shí),只需把Table1.Active置成False,完成相關(guān)的修改后,再把
Table1. Active 屬性設(shè)置為True。</p>
<p> 當(dāng)我們把DBGrid1.DataSource的值設(shè)置成DataSource1時(shí),Delphi會(huì)把Customer.DB中的數(shù)據(jù)填充到DBGrid1部件中,并且可以用DBGrid1中的滾動(dòng)條來瀏覽數(shù)據(jù)庫表中的所有記錄。 </p>
<p>14.1.3 運(yùn)行程序 </p>
<p> 保存文件,命名代碼單元為Cust.pas,命名工程名為CustPRJ.DPR,然后按F9編譯并運(yùn)行程序。程序執(zhí)行之后,我們可以使用滾動(dòng)條或鍵盤移動(dòng)鍵在字段和記錄間移動(dòng)。但不能修改表中的數(shù)據(jù),因?yàn)镈atasouc1.AutoEdit1屬性已被設(shè)置為False。</p>
<p> Cust程序中的三個(gè)部件都有各自的特殊用途,三個(gè)部件的相關(guān)屬性在內(nèi)部相互聯(lián)系生成最終的應(yīng)用程序。TTable部件連接磁盤上的實(shí)際數(shù)據(jù)庫表和應(yīng)用程序中其他部件的通道。TTable部件具有打開和關(guān)閉、讀取、更新以及其他處理磁盤數(shù)據(jù)庫文件的方法。</p>
<p> TDatasource部件是連接TTable部件和數(shù)據(jù)瀏覽部件如TDBGrid部件的橋梁。
TDBGrid部件用于顯示數(shù)據(jù)庫表中的數(shù)據(jù)信息,它為應(yīng)用程序提供一個(gè)直觀的界面。圖14.2闡述了這三個(gè)部件之間的關(guān)系。 </p>
<p> Cust程序中三個(gè)部件之間的內(nèi)部關(guān)系 </p>
<p> TDBGrid
部件的奇妙之處在于它知道如何去獲取數(shù)據(jù)庫表中的下一條或前一條記錄,我們使用滾動(dòng)條或箭頭鍵便可以完成這項(xiàng)任務(wù)。TDBGrid部件不知道如何增加、
刪除和修改記錄。如果想讓 Cust 程序能夠修改數(shù)據(jù)庫表中的記錄,
只要把 Datasource1 部件的AutoEdit屬性設(shè)置成True ,
并重新編譯和運(yùn)行程序就可以達(dá)到目的。 使用箭頭鍵, 把DBGrid的高亮度條定位到某一個(gè)字段上,然后鍵入新值,該字段中的值將被鍵入的新值所取代,并且當(dāng)移動(dòng)到另一條記錄時(shí),健入的信息會(huì)自動(dòng)寫入數(shù)據(jù)庫表中。如果想放棄所做的改動(dòng),只需在離開該字段前按一下Escape鍵。</p>
<p>
如果想在表中增加新記錄,可以把高亮度條移到網(wǎng)格底端的空白記錄上并輸入新記錄的有關(guān)字段值。也可以在用戶指定的某一條記錄的后面插入一條新記錄,只要把高亮度條定位到指定的記錄上,按Ins鍵,使可以在該記錄的后面插入新記錄。</p>
<p>
刪除某一條記錄時(shí),把高亮度條定位在想刪除的記錄的任何字段上,按Ctrl+
del鍵,這時(shí)會(huì)出現(xiàn)保護(hù)信息,我們可以確認(rèn)是否真的想刪除該項(xiàng)記錄。</p>
<p> TDBGrid為用戶提供了較完備的功能,用于控制是否編輯、增加或刪除記錄。
若想禁止對(duì)數(shù)據(jù)庫表作任何修改,設(shè)置TDBGrid部件的Readonly屬性為 True
, 并設(shè)置 Option.dgEDiting為False(這將為我們提供一個(gè)只讀的數(shù)據(jù)庫表瀏覽器而不是數(shù)據(jù)庫編輯器,但它隱含著增加、編輯和刪除記錄的能力)。TDBGrid部件的這些屬性和Option屬性其它選項(xiàng)的各種不同組合可以讓我們很方便地對(duì)數(shù)據(jù)庫表進(jìn)行有效的瀏覽、編輯等操作。</p>
<p>
如果我們經(jīng)常使用像電子表格那樣的界面來顯示和編輯數(shù)據(jù)記錄,TDBGrid
部件便是一個(gè)很方便的工具,但那并不是最友好的用戶界面,如果想擁有更優(yōu)美更直觀的界面,我們還可以使用單獨(dú)的數(shù)據(jù)瀏覽部件來顯示數(shù)據(jù)庫表中各個(gè)字段的值,并利用TDBNavigator部件控制對(duì)數(shù)據(jù)庫表的存取。 </p>
<p align="center">14.2 利用TDBNavigator部件創(chuàng)建存取程序 </p>
<p> 我們可以改進(jìn)一下Cust程序以便它一次只在對(duì)話框中顯示一個(gè)客戶的記錄信息,并用一個(gè)TDBNavigator部件控制對(duì)記錄存取──允許我們選擇一個(gè)記錄來顯示或編輯以及增加和刪除記錄。完成的應(yīng)用窗體。</p>
<p> 增強(qiáng)的Cust程序</p>
<p>14.2.1 創(chuàng)建應(yīng)用程序窗體 </p>
<p>
我們可以非常迅速地創(chuàng)建起來,因?yàn)榈侥壳盀橹刮覀儗?duì)創(chuàng)建窗體的方法已經(jīng)比較熟悉,我們首先把所有的部件都放到窗體中,然后再設(shè)置它們的屬性。</p>
<p> 開始一個(gè)新工程,設(shè)置窗體Form1的Name
屬性為 Customerform2 , Caption 屬性為
CustomerForm2。然后從部件選擇板上的Data
Access頁上選取一個(gè)Datasource部件和一個(gè)Table部件放在窗體的右上角。再從Data
Controls頁上選取DBNatvigator部件放在窗體的左上角。</p>
<p> 窗體中其余的部件如圖14.3所示。它們是TDBEdit和TLabel部件,按圖14.3
所示創(chuàng)建并布置部件,分別命名DBEdit部件為EditCustno、 Editcompany 、
EditAddr1 、EditAddr2、EditCity、EditState、EditZip、EditCountry、EditPhone 、EditFAX、EditTaxRate、EditContact。</p>
<p> 現(xiàn)在我們來連接TTable部件和
TDataSource 部件, 然后連接所有的數(shù)據(jù)瀏覽部件和DataSource部件。設(shè)置TBNavigator部件和TDBEdit部件的屬性,它們的DataSource屬性都設(shè)置為DataSouce1。我們最后要做的事是連接窗體中各個(gè)TDBEdit
部件和它們?cè)跀?shù)據(jù)庫表中對(duì)應(yīng)的字段名,通過設(shè)置TDBEdit 部件的
DataField 屬性來完成。 例如要連接命名為EditCustNo的TDBEdit部件和數(shù)據(jù)庫表中的CustNo字段,具體步驟如下:</p>
<p>①選中窗體中的EditCustNo部件。</p>
<p>②在Object Inspector窗體中,單擊DataField屬性右邊的箭頭。</p>
<p>③從下拉列表中選中CustNo字段名。</p>
<p> 對(duì)窗體中的其他TDBEdit部件執(zhí)行以上操作連接到其對(duì)應(yīng)的字段,然后保存文件。
命名代碼單元名為Cust2.pas,命名工程名為Cusprj2.DPR。 </p>
<p>14.2.2 使用TDBNavigator部件移動(dòng)記錄指針 </p>
<p>
上述程序運(yùn)行之后,在數(shù)據(jù)瀏覽部件中會(huì)顯示數(shù)據(jù)庫表中的第一條記錄。利用Tab
鍵可以在字段之間移動(dòng),但是不能編輯字段。因?yàn)槲覀優(yōu)榱朔乐挂馔庑薷模O(shè)置了Table1的AutoEdit屬性值為False。如果想對(duì)數(shù)據(jù)庫表中的記錄進(jìn)行編輯、
插入和刪除操作或者想顯示數(shù)據(jù)庫表中另一條記錄, 需要按
TDBNvigator 部件上這些功能所對(duì)應(yīng)的功能按鈕。TDBNavigator部件上的按鈕和它們的功能如圖14.4所示。</p>
<p> TDBNavigator中的按鈕 </p>
<p> TDBNavigator部件的絕大多數(shù)功能都可以根據(jù)其按鈕的圖標(biāo)能夠很容易地識(shí)別出來,而且TDBNavigator部件本身能感知到很多事情,如當(dāng)前指針是否在數(shù)據(jù)庫表的開頭或尾部。如果用戶正在查看數(shù)據(jù)庫表中的最后一個(gè)記錄,Next和Last按鈕將會(huì)變灰成為非活動(dòng)狀態(tài)。同樣,
如果用戶當(dāng)前正在瀏覽數(shù)據(jù)庫表中的第一條記錄, TDBNavigator 上的
First 和Previous按鈕會(huì)變灰而成為非活動(dòng)狀態(tài)。有關(guān)各個(gè)按鈕的作用的更詳細(xì)說明請(qǐng)查看聯(lián)機(jī)幫助。</p>
<p>
如果用戶想修改當(dāng)前的記錄,單擊TDBNavigator部件的Edit按鈕,然后完成需要做的修改,在做完修改之后,單擊Post按鈕以便將作的修改寫入實(shí)際的數(shù)據(jù)庫表中(更新實(shí)際的數(shù)據(jù)庫表中的記錄在數(shù)據(jù)庫術(shù)語中叫作“投寄”記錄即PostT)。
如果想取消所做的修改,單擊Cancel按鈕。Cancel按鈕只取消自從上一次往數(shù)據(jù)庫表中投寄記錄以來對(duì)記錄所做的修改。例如,如果用戶曾修改了CustNo字段并單擊了Post按鈕投寄了修改,然后再修改Company字段并按Cancel,那么只有對(duì)Company所做的修改將會(huì)被取消。也就是說,一旦修改被寫入了數(shù)據(jù)庫表中,再按Cancle按鈕是無法取消對(duì)記錄的修改的,要想恢復(fù)到以前的狀態(tài),用戶必須要重新編輯修改記錄。值得注意的是,當(dāng)用戶修改了當(dāng)前的記錄,并移動(dòng)到其他記錄時(shí),TDBNavigaator部件會(huì)自動(dòng)地投寄用戶對(duì)記錄的修改。
例如:如果我們修改了記錄的Company字段,并沒有按Post按鈕以更新表中的記錄,
而是移動(dòng)到下一條記錄,這時(shí)用戶對(duì)記錄的修改也會(huì)自動(dòng)地被寫入數(shù)據(jù)庫表中。 </p>
<p>14.2.3 定制TDBNavigator部件 </p>
<p> TDBNavigator部件中的按鈕對(duì)我們開發(fā)人員來說是很方便的,但對(duì)于程序的最終用戶來說不一定那么一目了然。為了幫助最終用戶或初級(jí)用戶更方便有效地使用TDBNavigator部件,我們可以設(shè)置TDBNavigator部件的ShowHint屬性為True,這樣當(dāng)鼠標(biāo)光標(biāo)停留在TDBNavigator部件上的某一個(gè)按鈕上超過大約1秒鐘,在屏幕上便會(huì)出現(xiàn)該按鈕的提示信息。如果我們不想使用TDBNavigator部件本身嵌入的提示信息,我們還可以設(shè)置TDBNavigtor部件的Hints屬性,為每個(gè)按鈕指定特定的提示信息,以幫助用戶使用TDBNavigator部件。</p>
<p> TDBNavigator部件中有多個(gè)功能按鈕,但并不是所有的按鈕對(duì)每一個(gè)數(shù)據(jù)庫應(yīng)用程序都是需要的,特別是那些不允許修改表中的數(shù)據(jù),或修改只是在很嚴(yán)格的控制下進(jìn)行的數(shù)據(jù)庫應(yīng)用程序。我們可以通過設(shè)置TDBNavigator部件的
VisibleButtons 屬性來確定要在TDBNavigator中顯示哪些按鈕步顯示哪些按鈕。例如,如果我們不允許用戶修改表中的記錄,我們就不需要Add、Delete、Post、Cancel
或 Refresh 按鈕, 我們?cè)O(shè)置這些按鈕的VisibleButtons屬性為False,這樣在TDBNavigator部件中將不會(huì)出現(xiàn)這些按鈕。</p>
<p> TDBNavigator部件的ConfirmDelete屬性和Delete
按鈕配合使用對(duì)用戶刪除數(shù)據(jù)庫表中的記錄是非常有用的,當(dāng)ConfirmDelete屬性設(shè)置為
True (缺省設(shè)置), 當(dāng)用戶單擊Delete按鈕試圖刪除當(dāng)前記錄時(shí),Delphi會(huì)彈出一個(gè)確認(rèn)框,要用戶確認(rèn)是否真的想刪除當(dāng)前記錄。這樣,在用戶進(jìn)行刪除記錄的操作時(shí),會(huì)更安全一些。如果用戶不希望在按下Delete按鈕時(shí)出現(xiàn)確認(rèn)框,只要把ConfirmDelete設(shè)置為False就可以了。</p>
<p> 還有一些屬性可以用來定制TDBNavigator部件的外觀和性能,有關(guān)這方面的詳細(xì)信息請(qǐng)參看聯(lián)機(jī)幫助。</p>
<p align="center">14.3 創(chuàng)建主要──明細(xì)數(shù)據(jù)庫應(yīng)用 </p>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -