15.3.5 數(shù)據(jù)集部件與數(shù)據(jù)瀏覽部件的連接
數(shù)據(jù)集部件TTabel和TQuery具有三個(gè)方法,DisableControls 方法、EnableControls方法、Refresh方法用于控制數(shù)據(jù)集部件和與其相連的數(shù)據(jù)瀏覽部件之間的連接,以及控制數(shù)據(jù)瀏覽部件的顯示。在用戶修改和更新以及遍歷數(shù)據(jù)庫(kù)表中的記錄時(shí),調(diào)用DisableControls方法具有重要意義,調(diào)用DisbaleControls方法以切斷TTable或TQuery部件與數(shù)據(jù)瀏覽部件的連接,使數(shù)據(jù)瀏覽部件暫時(shí)失效,否則,在對(duì)TTable或TQuery部件的每次修改之后,窗體中所有與它們相連的數(shù)據(jù)瀏覽部件都要更新其顯示內(nèi)容,這親顯然會(huì)減慢處理速度。當(dāng)遍歷表中的記錄時(shí)記錄指針每移動(dòng)一下,窗體中的數(shù)據(jù)瀏覽部件也隨之更新一下其中的顯示內(nèi)容,在屏幕上產(chǎn)生閃爍。
EnableControls方法的作用與DisbaleControls方法的作用是相反的,調(diào)用EnableControls方法,使TTable或TQuery部件恢復(fù)與數(shù)據(jù)瀏覽部件的連接,使暫時(shí)失效的數(shù)據(jù)瀏覽部件恢復(fù)到正常顯示表中記錄信息的狀態(tài)。
Refresh方法用于刷新數(shù)據(jù)瀏覽部件中的顯示。在調(diào)用Refresh方法時(shí),必須要確保TTable或TQuery部件是打開(kāi)的。當(dāng)數(shù)據(jù)集中的記錄被修改之后,調(diào)用Refresh方法,數(shù)據(jù)瀏覽部件中顯示的信息也隨之改變。
15.3.6 數(shù)據(jù)集部件的事件
數(shù)據(jù)集部件TTable或TQuery具有很多的事件。為這些事件編寫(xiě)相應(yīng)的程序代碼可以進(jìn)行有效性驗(yàn)證、計(jì)算可計(jì)算字段的值、確認(rèn)對(duì)數(shù)據(jù)庫(kù)表的多種操作等等。這些事件及其描述如表15.4所示。
表15.4 數(shù)據(jù)集部件常用的事件
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
事 件 描 述
───────────────────────────────────
BeforeOpen,Afteropen 在數(shù)據(jù)集部件被打開(kāi)之前/之后被觸發(fā)
───────────────────────────────────
BeforeClose,Afterclose 在數(shù)據(jù)集部件被關(guān)閉之前/之后被觸發(fā)
───────────────────────────────────
BeforeInsert,AfterInsert 在數(shù)據(jù)集部件進(jìn)入插入狀態(tài)之前/之后被觸發(fā)
───────────────────────────────────
BeforeEdit,AfterEdit 在數(shù)據(jù)集部件被編輯之前/之后被觸發(fā)
───────────────────────────────────
BeforePost,AfterPost 在數(shù)據(jù)集部件投寄被修改的記錄之前/之后被觸發(fā)
───────────────────────────────────
BeforeCancel,AfterCancel 在數(shù)據(jù)集部件取消前一步操作之前/之后被觸發(fā)
───────────────────────────────────
BeforeDelete,AfterDelete 在數(shù)據(jù)集部件刪除當(dāng)前記錄之前/之后被觸發(fā)
───────────────────────────────────
OnNewRecord 當(dāng)建立一條新記錄時(shí)被觸發(fā)
───────────────────────────────────
OnCalcFields 當(dāng)為表中的計(jì)算字段計(jì)算字段值時(shí)被觸發(fā)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
15.4 TTable部件及應(yīng)用
在前一節(jié)里我們介紹了數(shù)據(jù)集部件TTable 和TQuery 的共同的一些屬性和方法。TTable部件是Delphi數(shù)據(jù)庫(kù)編程中要經(jīng)常使用的最重要的部件之一,它是數(shù)據(jù)庫(kù)應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)時(shí)必須使用的數(shù)據(jù)集部件之一,在這一節(jié)里,我們重點(diǎn)介紹TTable部件特有的屬性和方法,TTable部件所有的屬性、方法和事件都可以在聯(lián)機(jī)幫助中查到。
15.4.1 TTabel部件主要的屬性
DatabaseName屬性和TableName屬性:
DatabaseName屬性是說(shuō)明數(shù)據(jù)庫(kù)應(yīng)用程序所操作的數(shù)據(jù)庫(kù)的名字,它可以是由BDE定義的數(shù)據(jù)庫(kù)的別名、顯式說(shuō)明的數(shù)據(jù)庫(kù)文件所在的磁盤(pán)路徑或者由TDatabase部件定義的一個(gè)數(shù)據(jù)庫(kù)名。DatabaseName屬性常常是一個(gè)由BDE定義的數(shù)據(jù)庫(kù)的別名。使用由BDE定義的數(shù)據(jù)庫(kù)的別名代替數(shù)據(jù)庫(kù)實(shí)際所在的路徑和名字,好處是當(dāng)實(shí)際的數(shù)據(jù)庫(kù)存放的位置發(fā)生變化時(shí),只需利用BDE簡(jiǎn)單地設(shè)置一下該數(shù)據(jù)庫(kù)的別名,而數(shù)據(jù)庫(kù)應(yīng)用程序無(wú)需修改。有關(guān)BDE的使用請(qǐng)參看BDE的設(shè)置應(yīng)用。TabelName屬性用以說(shuō)明當(dāng)前TTable部件所連接的實(shí)際的數(shù)據(jù)庫(kù)表。這兩個(gè)屬性一般都在設(shè)計(jì)階段指定,當(dāng)然在程序運(yùn)行過(guò)程中也可以設(shè)置,但是要修改這兩個(gè)屬性時(shí),必須要在TTabel的Active屬性為False時(shí)進(jìn)行,當(dāng)TTable的Active屬性為T(mén)rue時(shí),這兩個(gè)屬性是不能被修改和設(shè)置的。
TableType屬性:
該屬性說(shuō)明與TTable部件相連接的數(shù)據(jù)庫(kù)表的類(lèi)型。當(dāng)TableType屬性設(shè)置成Default時(shí),該屬性所說(shuō)明的數(shù)據(jù)庫(kù)表的類(lèi)型由數(shù)據(jù)庫(kù)文件的擴(kuò)展名決定。
● 若數(shù)據(jù)庫(kù)文件的擴(kuò)展名為.DB或沒(méi)有擴(kuò)展名,表的類(lèi)型是Paradox表
● 若數(shù)據(jù)庫(kù)文件的擴(kuò)展名為.DBF時(shí),表的類(lèi)型是dBASE表
● 若數(shù)據(jù)庫(kù)文件的擴(kuò)展名為.TXT時(shí),表的類(lèi)型是ASCII表
如果TableType屬性不設(shè)定為Default,那么與TTable 部件相連的數(shù)據(jù)庫(kù)表的類(lèi)型由TableType中的設(shè)置的值決定,不用考慮數(shù)據(jù)庫(kù)文件的擴(kuò)展名。
KeyExclusive屬性:
該屬性的一個(gè)作用是說(shuō)明在數(shù)據(jù)庫(kù)表中查找記錄時(shí),將記錄移到與查找值相匹配的記錄處還是將記錄指針移到與查找值相匹配的記錄后面一條記錄處。該屬性是布爾型變量,當(dāng)它的值為False時(shí)(缺省情況下為False),將記錄指針移到相匹配的記錄處,為T(mén)rue時(shí),將記錄指針移到相匹配記錄的后面一條記錄處。該屬性另一個(gè)作用是在表中指定檢索范圍時(shí),用來(lái)說(shuō)明是否包括滿足過(guò)濾條件的邊界記錄。當(dāng)KeyExclusive的值為False時(shí),檢索范圍包括邊界記錄,否則不包括邊界記錄,有關(guān)詳細(xì)的操作請(qǐng)參看“限定表中記錄的檢索范圍”。
IndexFields屬性和IndexFieldsCount屬性:
IndexFields的屬性值是數(shù)據(jù)庫(kù)表中字段名列表,它包含與TTable部件相連的數(shù)據(jù)庫(kù)表中的全部索引字希。IndexFieldsCount屬性說(shuō)明表中索引字段的個(gè)數(shù)。這兩個(gè)屬性值都是只讀的,只有在程序運(yùn)行過(guò)程中可用。
IndexName屬性和IndexFieldNames屬性:
IndexName屬性中存放著在建立數(shù)據(jù)庫(kù)表時(shí)為數(shù)據(jù)庫(kù)表定義的所有輔助索引名,它是一個(gè)輔助索引名列表,是只讀屬性。IndexFieldNames屬性指定用于數(shù)據(jù)庫(kù)表索引排序的字段名,多個(gè)字段名之間用分號(hào)隔開(kāi)。例如對(duì)Customer.DB表中的客戶記錄按郵政編碼ZipCode和客戶號(hào)碼CustNo排序時(shí)可以設(shè)定IndexFieldNames的值為:
ZipCode ; CustNo
在IndexFieldNames屬性中指定的字段必須存在于相應(yīng)的數(shù)據(jù)庫(kù)表中,否則會(huì)導(dǎo)致錯(cuò)誤。IndexName和IndexFieldName是互斥的,每次只能指定其中一個(gè)屬性的值,不能同時(shí)為兩個(gè)屬性都指定屬性值。
Exclusive屬性:
該屬性是一個(gè)布爾型屬性,它標(biāo)明是否以共享方式打開(kāi)數(shù)據(jù)庫(kù)表,如果Exclusive的值為T(mén)rue,當(dāng)打開(kāi)一個(gè)數(shù)據(jù)庫(kù)表時(shí),其他用戶就不能訪問(wèn)該表了,若Exclusive的值為False,將以共享方式打開(kāi)一個(gè)數(shù)據(jù)庫(kù)表。顯然不能將其他用戶正在訪問(wèn)的表以互斥方式打開(kāi)(設(shè)定Exclusive的值為T(mén)rue)。對(duì)于SQL數(shù)據(jù)庫(kù)服務(wù)器上的數(shù)據(jù)庫(kù)表,當(dāng)以互斥方式被一個(gè)用戶打開(kāi)時(shí),其他用戶可以讀取該表中的數(shù)據(jù),但不能修改表中的數(shù)據(jù),當(dāng)然有些數(shù)據(jù)庫(kù)服務(wù)器不支持這種方式,這要具體參看有關(guān)的數(shù)據(jù)庫(kù)服務(wù)器的文檔。
ReadOnly屬性和CanModify屬性:
這兩個(gè)屬性都是布爾型屬性,ReadOnly屬性決定用戶是否能夠?qū)Ρ碇械臄?shù)據(jù)進(jìn)行讀寫(xiě)。ReadOnly為T(mén)rue 時(shí),用戶只能讀取表中的數(shù)據(jù),ReadOnly為False時(shí),用戶可以讀寫(xiě)表中的數(shù)據(jù)(假設(shè)數(shù)據(jù)庫(kù)已授權(quán)用戶能夠讀寫(xiě)其中的數(shù)據(jù)庫(kù)表)。CanModify屬性是一個(gè)只讀屬性,用戶不能夠修改其屬性值,它反映了用戶對(duì)數(shù)據(jù)庫(kù)表?yè)碛械膶?shí)際特權(quán),當(dāng)ReadOnly為T(mén)rue時(shí)CanModify將自動(dòng)地被置為False,當(dāng)ReadOnly為False時(shí),如果數(shù)據(jù)庫(kù)允許用戶對(duì)表進(jìn)行讀寫(xiě)時(shí),CanModify為T(mén)rue,否則CanModify為False。當(dāng)CanModify為False時(shí),數(shù)據(jù)庫(kù)表是只讀的,但不能將其置成編輯狀態(tài)或插入狀態(tài);當(dāng)CanModify屬性為T(mén)rue時(shí),雖然數(shù)據(jù)庫(kù)表對(duì)應(yīng)的數(shù)據(jù)集部件可以置成編輯和插入狀態(tài),但是這并不意味著用戶能夠插入和修改表中的數(shù)據(jù),因?yàn)檫@還要受到其他因素的限制,如用戶對(duì)SQL數(shù)據(jù)庫(kù)服務(wù)器的訪問(wèn)權(quán)限等的限制。
TTable部件還有其他一些屬性請(qǐng)參看聯(lián)機(jī)幫助
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專(zhuān)題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |