轉(zhuǎn)帖|其它|編輯:郝浩|2010-08-06 11:50:38.000|閱讀 1365 次
概述:在數(shù)據(jù)庫(kù)應(yīng)用程序中,數(shù)據(jù)控件是經(jīng)常要用到的。數(shù)據(jù)控件都是可視的。也就是說,如果修改了這些構(gòu)件的屬性,能在窗體上馬上反映出來。如果這些構(gòu)件的Enabled屬性設(shè)為True并且數(shù)據(jù)集的Active屬性也設(shè)為True,在設(shè)計(jì)期就可以看到數(shù)據(jù)。下面就來介紹一下這些控件的簡(jiǎn)單應(yīng)用。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在數(shù)據(jù)庫(kù)應(yīng)用程序中,數(shù)據(jù)控件是經(jīng)常要用到的。數(shù)據(jù)控件都是可視的。也就是說,如果修改了這些構(gòu)件的屬性,能在窗體上馬上反映出來。如果這些構(gòu)件的Enabled屬性設(shè)為True并且數(shù)據(jù)集的Active屬性也設(shè)為True,在設(shè)計(jì)期就可以看到數(shù)據(jù)。
下面就來介紹一下這些控件的簡(jiǎn)單應(yīng)用:
指定一個(gè)數(shù)據(jù)源
數(shù)據(jù)控件必須通過TDataSource構(gòu)件連接數(shù)據(jù)集。TDataSource構(gòu)件扮演的角色實(shí)際上就是數(shù)據(jù)控件與數(shù)據(jù)集之間的橋梁。首先,把一個(gè)數(shù)據(jù)集構(gòu)件放到窗體或數(shù)據(jù)模塊上,設(shè)置它的DatabaseName屬性指定要訪問的數(shù)據(jù)庫(kù),設(shè)置它的TableName屬性指定要訪問的表。接著,把一個(gè)TDataSource構(gòu)件放到窗體或數(shù)據(jù)模塊上,設(shè)置它的DataSet屬性指定數(shù)據(jù)集。然后,把一個(gè)數(shù)據(jù)控件放到窗體上,設(shè)置它的DataSource屬性指定TDataSource構(gòu)件,而這個(gè)TDataSource構(gòu)件的DataSet屬性已經(jīng)指定了一個(gè)數(shù)據(jù)集。最后,設(shè)置數(shù)據(jù)控件的DataField屬性指定要顯示的字段。不過,對(duì)于TDBGrid、TDBCtrlGrid和TDBNavigator構(gòu)件來說,不需要設(shè)置DataField屬性,因?yàn)檫@幾個(gè)控件是以整個(gè)數(shù)據(jù)集為工作內(nèi)容的。
編輯和更新數(shù)據(jù)
除了TDBNavigator構(gòu)件外,其他數(shù)據(jù)控件都是用來顯示和編輯數(shù)據(jù)的。這里要介紹怎樣編輯數(shù)據(jù)。
要使用戶能編輯數(shù)據(jù),數(shù)據(jù)集必須進(jìn)入dsEdit狀態(tài)。如果TDataSource的AutoEdit屬性設(shè)為False,用戶不能直接編輯數(shù)據(jù),除非程序調(diào)用Edit函數(shù)。
要使用戶能夠在數(shù)據(jù)控件中修改數(shù)據(jù),必須把數(shù)據(jù)控件的ReadOnly屬性設(shè)為False。如果ReadOnly屬性設(shè)為True,數(shù)據(jù)控件中顯示的數(shù)據(jù)就是只讀的。一般情況下,TDataSource構(gòu)件的Enabled屬性設(shè)為True。如果這個(gè)屬性設(shè)為False,數(shù)據(jù)控件就無(wú)法顯示數(shù)據(jù),更不能修改數(shù)據(jù)。
如果數(shù)據(jù)集構(gòu)件的ReadOnly屬性設(shè)為True,數(shù)據(jù)集就是只讀的,用戶在數(shù)據(jù)控件中所作的修改不能寫到數(shù)據(jù)集中。除了TDBGrid構(gòu)件外,當(dāng)用戶修改了一個(gè)字段的值,還需要把輸入焦點(diǎn)移走,新的數(shù)據(jù)才寫到數(shù)據(jù)集中。在移走輸入焦點(diǎn)之前,用戶隨時(shí)可以按ESC鍵取消修改。在TDBGrid構(gòu)件建立的柵格中,當(dāng)用戶修改了一個(gè)字段的值,還需要把輸入焦點(diǎn)移到另一條記錄上,新的數(shù)據(jù)才寫到數(shù)據(jù)集中。 禁止和允許數(shù)據(jù)刷新
當(dāng)程序正在遍歷整個(gè)數(shù)據(jù)集或者搜索一個(gè)特定的記錄時(shí),應(yīng)當(dāng)暫時(shí)禁止數(shù)據(jù)控件刷新數(shù)據(jù),這樣能加快遍歷或搜索的速度,防止屏幕總是在閃爍。調(diào)用數(shù)據(jù)集的DisableControls可以暫時(shí)禁止連接這個(gè)數(shù)據(jù)集的數(shù)據(jù)控件刷新數(shù)據(jù)。DisableControls函數(shù)通常在循環(huán)操作前調(diào)用。等循環(huán)結(jié)束后,程序應(yīng)當(dāng)立即調(diào)用數(shù)據(jù)集構(gòu)件的EnableControls函數(shù)重新允許刷新數(shù)據(jù)。為了確保最后總是能恢復(fù)刷新,建議采用Try...Finally結(jié)構(gòu)。這樣,即使在循環(huán)中出現(xiàn)異常,也可以保證總能調(diào)用EnableControls。
下面的代碼演示了怎樣調(diào)用DisableControls和EnableControls函數(shù):
CustTable.DisableControls; Try CustTable.First; While not CustTable.EOF Do Begin ... CustTable.Next; End; Finally CustTable.EnableControls; End; |
手動(dòng)刷新數(shù)據(jù)
調(diào)用數(shù)據(jù)集的Refresh可以讀取數(shù)據(jù)集中最新的數(shù)據(jù)并刷新數(shù)據(jù)控件,這個(gè)功能在多用戶環(huán)境尤其有用,因?yàn)槠渌脩粲锌赡芤迅淖兞藬?shù)據(jù)集中的數(shù)據(jù)。有時(shí)候,調(diào)用Refresh可能會(huì)導(dǎo)致意想不到的結(jié)果。例如,如果另一個(gè)用戶已經(jīng)刪除了一條記錄,調(diào)用Refresh后,這條記錄將從數(shù)據(jù)控件中消失。
顯示單個(gè)字段的數(shù)據(jù)控件
有的數(shù)據(jù)控件以數(shù)據(jù)庫(kù)的一個(gè)或幾個(gè)字段作為工作內(nèi)容,如TDBText和TDBEdit,而有的數(shù)據(jù)控件以整個(gè)數(shù)據(jù)集為工作內(nèi)容,如TDBGrid和TDBNavigator。顯示單個(gè)字段的數(shù)據(jù)控件往往是從一個(gè)標(biāo)準(zhǔn)的Windows控件演化而來的,例如,TDBEdit構(gòu)件就可以認(rèn)為是TEdit的數(shù)據(jù)感知版本。
1、把數(shù)據(jù)作為標(biāo)簽顯示
TDBText構(gòu)件是一個(gè)只讀的數(shù)據(jù)控件,它非常類似于TLabel構(gòu)件和TStaticText構(gòu)件。TDBText構(gòu)件能夠把數(shù)據(jù)作為標(biāo)簽顯示,用來標(biāo)注其他控件。例如,可以用一個(gè)TDBText構(gòu)件顯示名稱(Common_Name字段)。
TDBText構(gòu)件需要指定一個(gè)字段。當(dāng)用戶使用導(dǎo)航器或其他手段瀏覽記錄時(shí),TDBText構(gòu)件顯示的數(shù)據(jù)將自動(dòng)變化,因?yàn)門DBText構(gòu)件總是顯示當(dāng)前記錄的數(shù)據(jù)。
TDBText構(gòu)件的AutoSize屬性一般要設(shè)為True,這是因?yàn)樽侄蔚膬?nèi)容長(zhǎng)度可能是不同的。如果AutoSize屬性設(shè)為False,有些較長(zhǎng)的內(nèi)容可能會(huì)被截?cái)唷?br />
2、顯示和編輯數(shù)據(jù)
TDBText構(gòu)件只能顯示數(shù)據(jù),不能編輯數(shù)據(jù)。要既能顯示數(shù)據(jù),又能編輯數(shù)據(jù),就要用到TDBEdit構(gòu)件。TDBEdit可以認(rèn)為是TEdit的數(shù)據(jù)感知(Data-Aware)版本。例如,有一個(gè)TDataSource構(gòu)件叫CustomersSource,它的DataSet屬性指向一個(gè)TTable構(gòu)件叫CustomersTable。把一個(gè)TDBEdit構(gòu)件放在窗體上,其DataSource屬性設(shè)為CustomersSource,把它的DataField屬性設(shè)為CustNo。這個(gè)TDBEdit構(gòu)件馬上就能顯示CustNo字段的值。用戶可以在編輯框中鍵入新的值。
顯示和編輯多行文本
TDBMemo構(gòu)件是TMemo構(gòu)件的數(shù)據(jù)感知版本,可以顯示dBASE和Paradox數(shù)據(jù)庫(kù)中備注字段的內(nèi)容。
與TDBEdit不同的是,TDBMemo能夠以多行的形式顯示文本,同時(shí)也允許用戶鍵入多行文本。
默認(rèn)情況下,TDBMemo允許用戶修改它顯示的文本。如果不想讓用戶修改文本,只要把ReadOnly屬性設(shè)為True即可。
要允許用戶在文本中插入一個(gè)制表符,應(yīng)當(dāng)把WantTabs屬性設(shè)為True,否則,當(dāng)用戶按下Tab鍵,將把輸入焦點(diǎn)移走,而不是插入制表符。要限制用戶最多可輸入的字符數(shù),可以設(shè)置MaxLength屬性。如果這個(gè)屬性設(shè)為0,表示沒有限制。
此外,ScrollBars屬性可以設(shè)置要不要加上滾動(dòng)欄,WordWrap屬性可以設(shè)置是否允許自動(dòng)繞回,Alignment屬性可以設(shè)置文本的對(duì)齊方式。在運(yùn)行期,您可以調(diào)用CutToClipboard和CopyToClipboard函數(shù)把選擇的文本剪切和復(fù)制到剪貼板中,調(diào)用PasteFromClipboard能夠粘貼剪貼板中的文本。
如果AutoDisplay屬性設(shè)為True,當(dāng)DataField屬性所指定的字段的內(nèi)容改變了時(shí),TDBMemo構(gòu)件會(huì)自動(dòng)刷新。如果AutoDisplay屬性設(shè)為False,TDBMemo構(gòu)件上只顯示字段名,用戶必須雙擊這個(gè)構(gòu)件或程序調(diào)用LoadMemo才能刷新數(shù)據(jù)。
以RTF格式顯示文本
TDBRichEdit構(gòu)件可以認(rèn)為是TRichEdit構(gòu)件的數(shù)據(jù)感知版本,用于以RTF格式顯示BLOB字段中的格式化文本。它的用法類似于TDBMemo構(gòu)件,也能顯示多行文本。
注意:盡管TDBRichEdit構(gòu)件能夠顯示RTF格式的文本,并且提供了很強(qiáng)的編輯功能,但是,它本身并沒有提供用戶界面,應(yīng)用程序必須設(shè)計(jì)出相應(yīng)的用戶界面,才能把TDBRichEdit 構(gòu)件強(qiáng)大的功能發(fā)揮出來。
默認(rèn)情況下,TDBRichEdit構(gòu)件允許用戶鍵入新的文本。如果不想讓用戶修改文本,可以把ReadOnly屬性設(shè)為True。要允許用戶在文本中插入一個(gè)制表符,應(yīng)當(dāng)把WantTabs屬性設(shè)為True,否則,當(dāng)用戶按下Tab鍵,將把輸入焦點(diǎn)移走,而不是插入制表符。
要限制用戶最多可輸入的字符數(shù),可以設(shè)置MaxLength屬性。如果這個(gè)屬性設(shè)為0,表示沒有限制。如果AutoDisplay屬性設(shè)為True,當(dāng)DataField屬性所指定的字段的內(nèi)容改變了時(shí),TDBRichEdit構(gòu)件會(huì)自動(dòng)刷新。如果AutoDisplay屬性設(shè)為False,TDBRichEdit構(gòu)件上只顯示字段名,用戶必須雙擊這個(gè)構(gòu)件或程序調(diào)用LoadMemo函數(shù)才能刷新數(shù)據(jù)。 顯示和編輯圖像
TDBImage構(gòu)件可以認(rèn)為是TImage構(gòu)件的數(shù)據(jù)感知版本,它可以顯示BLOB字段的內(nèi)容。TDBImage構(gòu)件從數(shù)據(jù)集中檢索了圖像后,在本地以DIB格式建立一個(gè)副本。
可以調(diào)用CutToClipboard或CopyToClipboard函數(shù)把圖像剪切或復(fù)制到剪貼板中,調(diào)用 PasteFromClipboard可以從剪貼板中粘貼圖像。
如果Stretch屬性設(shè)為True,圖像將自動(dòng)縮放,以適應(yīng)TDBImage構(gòu)件的大小,這樣就可能造成圖像變形。
如果AutoDisplay屬性設(shè)為True,當(dāng)DataField屬性所指定的字段的內(nèi)容改變了時(shí),TDBImage構(gòu)件會(huì)自動(dòng)刷新。如果這個(gè)屬性設(shè)為False,TDBImage構(gòu)件上只顯示字段名,用戶必須雙擊這個(gè)構(gòu)件才能刷新數(shù)據(jù),當(dāng)然也可以調(diào)用LoadPicture來刷新數(shù)據(jù)。
用列表框和組合框顯示和編輯數(shù)據(jù)
有4個(gè)特殊的數(shù)據(jù)控件可以用列表框和組合框顯示和編輯數(shù)據(jù),它們可以認(rèn)為是標(biāo)準(zhǔn)的列表框和組合框的數(shù)據(jù)感知版本。下面簡(jiǎn)單介紹這4個(gè)數(shù)據(jù)控件:
1、TDBListBox用列表框顯示一組數(shù)據(jù),讓用戶從中選擇一個(gè)值。
2、TDBComboBox用組合框顯示一組數(shù)據(jù),讓用戶從中選擇一個(gè)值。
3、TDBLookupListBox用列表框顯示另一個(gè)數(shù)據(jù)集中的一組數(shù)據(jù),讓用戶從中選擇一個(gè)值。
4、TDBLookupComboBox用組合框顯示另一個(gè)數(shù)據(jù)集中的一組數(shù)據(jù),讓用戶從中選擇一個(gè)值。
TDBComboBox
TDBComboBox構(gòu)件實(shí)際上是TComboBox構(gòu)件的數(shù)據(jù)感知版本,它能以組合框的形式顯示一組數(shù)據(jù),讓用戶從列表中選擇一個(gè)值或直接輸入一個(gè)值。
Items屬性用于設(shè)置列表中要顯示的一組數(shù)據(jù)。在設(shè)計(jì)期,可以單擊Items屬性邊上的省略號(hào)按鈕打開一個(gè)字符串列表編輯器,然后輸入一些字符串。
DropDownCount屬性用于設(shè)置當(dāng)用戶下拉組合框時(shí)不需要加滾動(dòng)欄就能顯示的項(xiàng)的個(gè)數(shù),默認(rèn)是8,表示用戶下拉組合框時(shí)如果項(xiàng)的個(gè)數(shù)超過8個(gè)才加上滾動(dòng)欄。如果實(shí)際的項(xiàng)數(shù)還沒有DropDownCount屬性指定的值多,下拉的組合框的高度自動(dòng)縮小。
在Style屬性設(shè)為csOwnerDrawFixed的情況下,ItemHeight屬性用于設(shè)置項(xiàng)的高度。
顯示另一個(gè)數(shù)據(jù)集中的數(shù)據(jù)
TDBLookupListBox構(gòu)件和TDBLookupComboBox構(gòu)件分別以列表框和組合框的形式顯示另一個(gè)數(shù)據(jù)集中的數(shù)據(jù)。
假設(shè)有一個(gè)表格叫OrdersTable,其中包含一個(gè)CustNo字段,用于表達(dá)客戶的編號(hào),但OrdersTable表中除了客戶的編號(hào)外,不包含客戶的其他信息。而另一個(gè)表格假設(shè)叫CustomersTable,除了有CustNo字段外,還有諸如客戶的公司名稱、地址等信息。
TDBLookupListBox構(gòu)件可以實(shí)現(xiàn)這樣的功能,當(dāng)用戶在OrdersTable中瀏覽記錄時(shí),程序首先在CustomersTable中查找與CustNo字段匹配的記錄,如果找不到,就從列表中查找與Company字段匹配的字符串;如果找到,就選擇這一項(xiàng)。
用復(fù)選框處理布爾類型的字段
TDBCheckBox構(gòu)件可以認(rèn)為是TCheckBox構(gòu)件的數(shù)據(jù)感知版本,用于處理布爾類型的字段。例如,可以用一個(gè)復(fù)選框來表示客戶是否已付帳。
TDBCheckBox構(gòu)件實(shí)際上是把字段的值與預(yù)設(shè)的兩個(gè)字符串比較,這兩個(gè)字符串分別由ValueChecked和ValueUnChecked屬性指定。如果字段的值與ValueChecked屬性指定的字符串匹配,就選中復(fù)選框。如果字段的值與ValueUnchecked屬性指定的字符串匹配,就不選中復(fù)選框。注意:ValueChecked屬性和ValueUnchecked屬性所指定的字符串不能相同。
一般情況下,ValueChecked屬性設(shè)為“True”、“Yes”之類的字符串,但也可以是其他任意的字符串,甚至是一組字符串,彼此之間要用分號(hào)隔開,例如:
DBCheckBox1.ValueChecked := True;Yes;On;
上述情況下,當(dāng)字段的值只要與其中一個(gè)字符串匹配,就選中復(fù)選框。要說明的是,ValueChecked屬性指定的字符串是大小寫敏感的。一般情況下,ValueUnchecked屬性設(shè)為“False”、“No”之類的字符串,但也可以是其他任意的字符串,甚至是一組字符串,彼此之間用分號(hào)隔開。如果字段的值既不與ValueChecked屬性指定的字符串匹配,也不與ValueUnchecked屬性指定的字符串匹配,復(fù)選框就變灰。
使用TDBGrid
TDBGrid構(gòu)件以柵格的形式顯示和編輯數(shù)據(jù)集中的數(shù)據(jù)。它的外觀很大程度上取決于下面三個(gè)因素:l 一是永久的列對(duì)象。 二是永久的字段對(duì)象。 三是數(shù)據(jù)集構(gòu)件的ObjectView屬性將影響ADT和數(shù)組字段的顯示方式。對(duì)于TDBGrid構(gòu)件來說,最重要的屬性是Columns,這是一個(gè)TDBGridColumns對(duì)象,用于管理一組TColumn對(duì)象。在設(shè)計(jì)期,可以打開一個(gè)編輯器建立永久的列對(duì)象,然后在對(duì)象觀察器中設(shè)置列對(duì)象的屬性。
動(dòng)態(tài)的列對(duì)象
如果TDBGridColumns的State屬性設(shè)為csDefault,列是動(dòng)態(tài)生成的,列的屬性取決于字段的屬性。當(dāng)字段的屬性發(fā)生變化時(shí),列的屬性也跟著變化。讓列動(dòng)態(tài)生成的好處是,可以在運(yùn)行期動(dòng)態(tài)地選擇其他數(shù)據(jù)集,而不用擔(dān)心柵格是否適合于顯示新的數(shù)據(jù)集。例如,可以用同一個(gè)TDBGrid構(gòu)件先顯示一個(gè)Paradox表,再顯示查詢另一個(gè)數(shù)據(jù)庫(kù)的結(jié)果。在設(shè)計(jì)期,無(wú)法直接修改動(dòng)態(tài)列對(duì)象的屬性,只能修改字段對(duì)象的屬性,從而間接地修改動(dòng)態(tài)列對(duì)象的屬性。
動(dòng)態(tài)列對(duì)象的生存期也取決于字段對(duì)象的生存期。如果數(shù)據(jù)集沒有建立永久的字段對(duì)象,那么,當(dāng)數(shù)據(jù)集關(guān)閉時(shí),所有的動(dòng)態(tài)列對(duì)象也將消失。注意:如果在運(yùn)行期把TDBGridColumns的State屬性設(shè)為csDefault,將刪除所有的列對(duì)象,然后根據(jù)數(shù)據(jù)集中的字段對(duì)象重建列對(duì)象。
要能夠在設(shè)計(jì)期自定義柵格,就要用到永久的列對(duì)象。建立了永久的列對(duì)象后,如果TDBGridColumns的State屬性設(shè)為csCustomized,就可以獨(dú)立設(shè)置每一列的屬性。例如,默認(rèn)情況下,列的標(biāo)題顯示字段的標(biāo)簽即DisplayLabel屬性,通過修改TColumnTitle的Caption屬性可以重新指定列的標(biāo)題,而TField的DisplayLabel屬性則不會(huì)受到影響。TDBGridColumns的State屬性設(shè)為csCustomized適合于那些數(shù)據(jù)集的結(jié)構(gòu)是固定不變的情況。如果需要在運(yùn)行期切換不同的數(shù)據(jù)集,就不能把State屬性設(shè)為csCustomized。要?jiǎng)?chuàng)建永久的列對(duì)象,首先要在窗體上選擇TDBGrid構(gòu)件,然后對(duì)象觀察器中單擊Columns屬性邊上的省略號(hào)按鈕將打開編輯器。
剛開始的時(shí)候,這個(gè)編輯器是空白的,這是因?yàn)椋J(rèn)情況下,柵格中的列對(duì)象都是動(dòng)態(tài)生成的,還沒有永久的列對(duì)象。要基于數(shù)據(jù)集中的每一個(gè)字段分別創(chuàng)建一個(gè)永久的列對(duì)象,可以單擊鼠標(biāo)右鍵,在彈出的菜單中選擇“Add All Fields”命令。要?jiǎng)?chuàng)建一個(gè)獨(dú)立的永久列對(duì)象,可以單擊工具欄上的(Add New)按鈕。選擇這個(gè)剛創(chuàng)建的列對(duì)象,然后在對(duì)象觀察器中設(shè)置FieldName屬性指定一個(gè)字段,設(shè)置Caption屬性指定列的標(biāo)題。要?jiǎng)h除一個(gè)列對(duì)象,可以單擊工具欄上的(Delete Selected)按鈕。如果把永久的列都刪掉,柵格反而能顯示數(shù)據(jù)集中所有的字段,這是因?yàn)椋谰玫牧袆h掉以后,Delphi 4會(huì)自動(dòng)把TDBGridColumns的State屬性設(shè)為csDefault并且動(dòng)態(tài)生成所有的列。
要調(diào)整列在柵格中顯示的順序,可以用鼠標(biāo)把列對(duì)象前移或后移。對(duì)于永久的列對(duì)象來說,它的屬性的默認(rèn)值仍然取自于字段,除非您修改了永久列對(duì)象的屬性。例如,默認(rèn)的情況下,列的標(biāo)題就是字段的DisplayLabel屬性。如果修改字段的DisplayLabel屬性,列的標(biāo)題將隨之改變。但是,一旦您修改了列對(duì)象的Caption屬性,列的標(biāo)題不再與字段的DisplayLabel屬性存在聯(lián)動(dòng)關(guān)系,它們彼此是獨(dú)立的。
前面講過,創(chuàng)建一個(gè)永久的列對(duì)象時(shí),需要設(shè)置FieldName屬性指定一個(gè)字段。不過,您也可以讓FieldName屬性為空,此時(shí),TColumn對(duì)象的Field屬性將返回NULL,并且該列在柵格中是空白的。空白的列往往用于用戶顯示一些自定義的內(nèi)容,如圖像或圖表等。幾個(gè)列對(duì)象的FieldName屬性可以設(shè)為同一個(gè)字段。由此可見,TDBGrid的FieldCount屬性可能小于柵格的列數(shù)。
數(shù)據(jù)源
TDataSource構(gòu)件是一個(gè)非可視的構(gòu)件,它充當(dāng)了數(shù)據(jù)集和數(shù)據(jù)控件之間的橋梁。每一個(gè)數(shù)據(jù)控件都必須指定一個(gè)數(shù)據(jù)源(TDataSource構(gòu)件),相應(yīng)地,TDataSource構(gòu)件的DataSet屬性必須指定一個(gè)數(shù)據(jù)集。下面簡(jiǎn)單介紹一下TDataSource構(gòu)件的屬性和事件。DataSet屬性用于指定一個(gè)數(shù)據(jù)集。在設(shè)計(jì)期,可以在對(duì)象觀察器中為DataSet屬性選擇一個(gè)數(shù)據(jù)集。在運(yùn)行期,可以通過代碼動(dòng)態(tài)地選擇數(shù)據(jù)集。程序示例如下:
With CustSource Do Begin If DataSet = Customers then DataSet := Orders Else DataSet := Customers; End; |
也可以指定另一個(gè)窗體上的數(shù)據(jù)集構(gòu)件,例如:
Procedure TForm2. FormCreate (Sender : TObject); Begin DataSource1.Dataset := Form1.Table1; End; |
一般情況下,TDataSource構(gòu)件的名稱是無(wú)關(guān)緊要的。不過,TDataSource構(gòu)件的名稱應(yīng)當(dāng)能反映它所連接的數(shù)據(jù)集,例如,假設(shè)TDataSource構(gòu)件連接的數(shù)據(jù)集叫Customers,相應(yīng)地,TDataSource構(gòu)件的名稱最好叫CustomersSource。
Enabled屬性用于控制TDataSource構(gòu)件是否與數(shù)據(jù)集連接,設(shè)為True表示連接,設(shè)為False表示暫時(shí)斷開連接。如果Enabled屬性設(shè)為False,凡是連接于這個(gè)數(shù)據(jù)源的數(shù)據(jù)控件將變成空白。如果AutoEdit屬性設(shè)為True,當(dāng)用戶在數(shù)據(jù)控件中鍵入字符時(shí),數(shù)據(jù)集就自動(dòng)進(jìn)入dsEdit狀態(tài)。如果AutoEdit屬性設(shè)為False,程序必須調(diào)用Edit函數(shù)才能進(jìn)入dsEdit狀態(tài)。
當(dāng)數(shù)據(jù)集的當(dāng)前記錄的位置發(fā)生變化時(shí)將觸發(fā)OnDataChange事件,這可能是因?yàn)槌绦蛘{(diào)用了Next、Previous、Insert等方法。當(dāng)前記錄的數(shù)據(jù)將要被更新時(shí)將觸發(fā)OnUpdateData事件,這可能是因?yàn)檎{(diào)用了Post。在處理這個(gè)事件的句柄中,可以對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載