15.5 TDataSource部件及其應(yīng)用
TDataSource部件是開發(fā)數(shù)據(jù)庫應(yīng)用程序中用到的非常重要的部件,它是連接數(shù)據(jù)集部件TTable或TQuery和數(shù)據(jù)瀏覽部件的橋梁。TDataSource部件本身十分簡單,它所擁有的屬性、事件和方法都比較少,在使用該部件時無需作太多的工作,它主要是為數(shù)據(jù)瀏覽部件服務(wù)的,如果在應(yīng)用程序中沒有使用數(shù)據(jù)瀏覽部件,我們也沒有必要為應(yīng)用程序設(shè)置TDataSource部件。
15.5.1 TDataSource部件的屬性
TDataSource部件除了其他部件都擁有的Name屬性和Tag屬性之外,主要有下面幾個屬性:
DataSet屬性:該屬性說明TDataSource部件從中獲取數(shù)據(jù)的數(shù)據(jù)集的名字,它可以是TTable部件的名字,也可以是TQuery部件的名字,甚至還可以指定其他窗體內(nèi)的數(shù)據(jù)集作為該屬性的值,如在下面的程序中我們指定窗體Form2中的table1作為窗體Form1中的DataSource1的DataSet屬性值:
TForm1.Formcreate(Sender : Tobject);
Begin
DataSource1.DataSet := Form2.Table1;
end;
Enable屬性:Enable屬性可以暫時性地切斷TDataSource部件和與之相連的數(shù)據(jù)集部件的連接。這是一個布爾型變量。當(dāng)它的值為False時,TDataSource部件和數(shù)據(jù)集部件的連接被切斷,且所有與TDataSource部件相連的數(shù)據(jù)瀏覽部件中將變?yōu)橐黄瞻,不顯示任何數(shù)據(jù)信息。當(dāng)Enabled的值變?yōu)門rue時,TDataSource部件和數(shù)據(jù)集部件的連接恢復(fù),且與TDataSource部件相連的數(shù)據(jù)瀏覽部件恢復(fù)顯示數(shù)據(jù)。不過要實(shí)現(xiàn)上述這些功能,一般不使用TDataSource部件的Enabled屬性,而是調(diào)用數(shù)據(jù)集部件的DisableControls方法和EnableControls 方法,因?yàn)檎{(diào)用這兩個方法可以方便地控制與數(shù)據(jù)集部件相連的所有TDataSource部件以及與TDataSource部件相連的數(shù)據(jù)瀏覽部件。
AutoEdit屬性:這是一個布爾型變量,它用于說明是否將與TDataSource部件相連的數(shù)據(jù)集置于編輯狀態(tài)。當(dāng)AutoEdit的值為True時,應(yīng)用程序運(yùn)行時,與TDataSource相連的數(shù)據(jù)集部件自動地被設(shè)置成編輯狀態(tài),當(dāng)用戶在與TDataSource部件相連的數(shù)據(jù)瀏覽部件中輸入新的值時,數(shù)據(jù)集部件中的記錄也隨之改變。如果AutoEdit的值為False,用戶想通過數(shù)據(jù)瀏覽部件或程序修改數(shù)據(jù)集中的記錄,必須要調(diào)用數(shù)據(jù)集部件的Edit方法,將其置為編輯狀態(tài)之后才能夠進(jìn)行。
15.5.2 TDataSource部件的事件
TDataSource部件具有三個事件:
● OnDataChange事件
● OnStateChange
● OnUpdataData
OnDataChange事件:當(dāng)與TDataSource相連的數(shù)據(jù)集中的記錄指針的位置發(fā)生改變時,該事件就被觸發(fā),也就是說當(dāng)程序調(diào)用數(shù)據(jù)集部件的Next、Previous、Insert、Append等方法導(dǎo)致記錄指針的位置發(fā)生改變時,便會觸發(fā)該事件。該事件一般用于保持應(yīng)用中多個部件之間的同步。
OnUpdataData事件:當(dāng)數(shù)據(jù)集部件中當(dāng)前記錄將要被修改時,觸發(fā)該事件。例如在程序調(diào)用post方法之后但在修改后的數(shù)據(jù)記錄真正被寫回磁盤中的數(shù)據(jù)庫文件之前觸發(fā)該事件,在應(yīng)用中使用非數(shù)據(jù)瀏覽部件時要它與數(shù)據(jù)集保持同步時常使用該事件進(jìn)行相關(guān)的處理。
OnStateChange事件:當(dāng)與TDataSource部件相連的數(shù)據(jù)集部件的狀態(tài)發(fā)生改變時,便觸發(fā)該事件。因?yàn)閿?shù)據(jù)集部件的State屬性標(biāo)明了數(shù)據(jù)集部件當(dāng)前所處的狀態(tài),當(dāng)數(shù)據(jù)集的狀態(tài)發(fā)生變化時,使用該事件進(jìn)行有關(guān)的處理是很有用的,在一個具體的應(yīng)用中,數(shù)據(jù)集部件的狀態(tài)常常是頻繁地變化的,為了跟蹤數(shù)據(jù)集部件的狀態(tài)變化,可以用下面例子中的程序代碼將數(shù)據(jù)集部件當(dāng)前的狀態(tài)顯示在一個標(biāo)簽上:
TForm1.DataSource1OnStateChange(Sender : Tobject);
var
S : String;
begin
Case Table1,State of
dsInactive : S := 'Inactive';
dsBrowse : S := 'Browse';
dsEdit : S := 'Edit';
dsInsert : S := 'SetKey';
dsSetKey : S := 'SetKey';
end;
Label1.Caption := S;
end;
類似地我們也可以通過檢測數(shù)據(jù)集部件的狀態(tài)來控制有關(guān)的按鈕和菜單項(xiàng)是否有效。例如:在一個應(yīng)用窗體中有一個InsertBtn按鈕,用于控制向數(shù)據(jù)集部件table1對應(yīng)的數(shù)據(jù)庫表中插入記錄;還有一個CancelBtn按鈕用于控制是否取消用戶對當(dāng)前記錄的修改或插入新記錄。下面的程序代碼根據(jù)Table1的狀態(tài)來控制這兩個按鈕的功能(是否有效,在窗體是否變灰暗)。
Form1.DataSource1OnStateChange(Sender : Tobject);
begin
InsertBtn.Enabled := (Table1.State = dsBrowse);
CancelBtn.Enabled := Table1.State in [dsInsert,dsEdit,dsSetKey]
end;
上面的代碼中,當(dāng)Table1處于瀏覽狀態(tài)(Browse狀態(tài)時),用戶是不能夠向數(shù)據(jù)庫表中插入新記錄的,此時InsertBtn按鈕將變灰暗即無效。當(dāng)Table1不處于Browse狀態(tài)時,InsertBtn按鈕有效,用戶是可以向表中插入新記錄。同理,只有當(dāng)Table1處于特入狀態(tài)(Insert狀態(tài))或編輯狀態(tài)(Edit狀態(tài))或查找狀態(tài)(SetKey狀態(tài))時,CancelBtn按鈕才有效,也即用戶可以取消當(dāng)前插入的記錄、修改當(dāng)前的記錄以及查找到的結(jié)果等。
相關(guān)推薦:2010年9月計(jì)算機(jī)等級考試試題及答案解析專題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |