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