15.5.2 TDataSource部件的事件
TDataSource部件具有三個(gè)事件:
● OnDataChange事件
● OnStateChange
● OnUpdataData
OnDataChange事件:當(dāng)與TDataSource相連的數(shù)據(jù)集中的記錄指針的位置發(fā)生改變時(shí),該事件就被觸發(fā),也就是說當(dāng)程序調(diào)用數(shù)據(jù)集部件的Next、Previous、Insert、Append等方法導(dǎo)致記錄指針的位置發(fā)生改變時(shí),便會觸發(fā)該事件。該事件一般用于保持應(yīng)用中多個(gè)部件之間的同步。
OnUpdataData事件:當(dāng)數(shù)據(jù)集部件中當(dāng)前記錄將要被修改時(shí),觸發(fā)該事件。例如在程序調(diào)用post方法之后但在修改后的數(shù)據(jù)記錄真正被寫回磁盤中的數(shù)據(jù)庫文件之前觸發(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;
類似地我們也可以通過檢測數(shù)據(jù)集部件的狀態(tài)來控制有關(guān)的按鈕和菜單項(xiàng)是否有效。例如:在一個(gè)應(yīng)用窗體中有一個(gè)InsertBtn按鈕,用于控制向數(shù)據(jù)集部件table1對應(yīng)的數(shù)據(jù)庫表中插入記錄;還有一個(gè)CancelBtn按鈕用于控制是否取消用戶對當(dāng)前記錄的修改或插入新記錄。下面的程序代碼根據(jù)Table1的狀態(tà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ù)庫表中插入新記錄的,此時(shí)InsertBtn按鈕將變灰暗即無效。當(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é)果等。
15.6 字段部件和字段編輯器的使用
字段部件有時(shí)又稱字段對象它對應(yīng)著數(shù)據(jù)庫表中的列即字段,字段對象是不可見的部件,在Delphi中有兩種方式創(chuàng)建字段部件:
①在應(yīng)用程序運(yùn)行過程中,隨著數(shù)據(jù)集部件被激活,對應(yīng)于數(shù)據(jù)庫表中每一列的字段部件便動(dòng)態(tài)地被創(chuàng)建。
②在設(shè)計(jì)過程中,程序設(shè)計(jì)人員利用字段編輯器(Fields Editor)可以創(chuàng)建永久性的字段部件,即使字段對象對應(yīng)的數(shù)據(jù)庫表的結(jié)構(gòu)發(fā)生了變化時(shí),這些字段部件也不會發(fā)生變化。
既然字段部件是對應(yīng)于數(shù)據(jù)庫表中的各個(gè)字段的,而數(shù)據(jù)庫表中的字段有多種數(shù)據(jù)類型,所以字段部件相應(yīng)也有多種類型,字段部件的類型與數(shù)據(jù)庫表中的字段的數(shù)據(jù)類型的對應(yīng)關(guān)系如表15.5所示。
表15.5 字段部件的類型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
字段部件的類型 對應(yīng)的數(shù)據(jù)類型
────────────────────────────
TStringField 字符串類型的字段
TSmallIntField 短整數(shù)類型的字段 -32768-32767
TIntegerField 整數(shù)類型的字段
TWordField 正整數(shù)類型的字段0-65535
TBooleanField 布爾型字段
TFloatField 浮點(diǎn)數(shù)類型的字段
TCurrenCyField 貨幣型字段
TDataField 日期型
TTimeField 時(shí)間型
TBCDField 小數(shù)位數(shù)固定的浮點(diǎn)數(shù)
TDataTimeField 日期時(shí)間型字段
━━━━━━━━━━━━━━━━━━━━━━━━━━━
我們在本書中只介紹一些常見類型的字段部件的使用,其他類型字段部件的使用可以參看聯(lián)機(jī)幫助文件。
TDataSource部件具有三個(gè)事件:
● OnDataChange事件
● OnStateChange
● OnUpdataData
OnDataChange事件:當(dāng)與TDataSource相連的數(shù)據(jù)集中的記錄指針的位置發(fā)生改變時(shí),該事件就被觸發(fā),也就是說當(dāng)程序調(diào)用數(shù)據(jù)集部件的Next、Previous、Insert、Append等方法導(dǎo)致記錄指針的位置發(fā)生改變時(shí),便會觸發(fā)該事件。該事件一般用于保持應(yīng)用中多個(gè)部件之間的同步。
OnUpdataData事件:當(dāng)數(shù)據(jù)集部件中當(dāng)前記錄將要被修改時(shí),觸發(fā)該事件。例如在程序調(diào)用post方法之后但在修改后的數(shù)據(jù)記錄真正被寫回磁盤中的數(shù)據(jù)庫文件之前觸發(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;
類似地我們也可以通過檢測數(shù)據(jù)集部件的狀態(tài)來控制有關(guān)的按鈕和菜單項(xiàng)是否有效。例如:在一個(gè)應(yīng)用窗體中有一個(gè)InsertBtn按鈕,用于控制向數(shù)據(jù)集部件table1對應(yīng)的數(shù)據(jù)庫表中插入記錄;還有一個(gè)CancelBtn按鈕用于控制是否取消用戶對當(dāng)前記錄的修改或插入新記錄。下面的程序代碼根據(jù)Table1的狀態(tà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ù)庫表中插入新記錄的,此時(shí)InsertBtn按鈕將變灰暗即無效。當(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é)果等。
15.6 字段部件和字段編輯器的使用
字段部件有時(shí)又稱字段對象它對應(yīng)著數(shù)據(jù)庫表中的列即字段,字段對象是不可見的部件,在Delphi中有兩種方式創(chuàng)建字段部件:
①在應(yīng)用程序運(yùn)行過程中,隨著數(shù)據(jù)集部件被激活,對應(yīng)于數(shù)據(jù)庫表中每一列的字段部件便動(dòng)態(tài)地被創(chuàng)建。
②在設(shè)計(jì)過程中,程序設(shè)計(jì)人員利用字段編輯器(Fields Editor)可以創(chuàng)建永久性的字段部件,即使字段對象對應(yīng)的數(shù)據(jù)庫表的結(jié)構(gòu)發(fā)生了變化時(shí),這些字段部件也不會發(fā)生變化。
既然字段部件是對應(yīng)于數(shù)據(jù)庫表中的各個(gè)字段的,而數(shù)據(jù)庫表中的字段有多種數(shù)據(jù)類型,所以字段部件相應(yīng)也有多種類型,字段部件的類型與數(shù)據(jù)庫表中的字段的數(shù)據(jù)類型的對應(yīng)關(guān)系如表15.5所示。
表15.5 字段部件的類型
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
字段部件的類型 對應(yīng)的數(shù)據(jù)類型
────────────────────────────
TStringField 字符串類型的字段
TSmallIntField 短整數(shù)類型的字段 -32768-32767
TIntegerField 整數(shù)類型的字段
TWordField 正整數(shù)類型的字段0-65535
TBooleanField 布爾型字段
TFloatField 浮點(diǎn)數(shù)類型的字段
TCurrenCyField 貨幣型字段
TDataField 日期型
TTimeField 時(shí)間型
TBCDField 小數(shù)位數(shù)固定的浮點(diǎn)數(shù)
TDataTimeField 日期時(shí)間型字段
━━━━━━━━━━━━━━━━━━━━━━━━━━━
我們在本書中只介紹一些常見類型的字段部件的使用,其他類型字段部件的使用可以參看聯(lián)機(jī)幫助文件。