動態的列對象
如果TDBGridColumns的State屬性設為csDefault,列是動態生成的,列的屬性取決於字段的屬性。當字段的屬性發生變化時,列的屬性也跟著變化。讓列動態生成的好處是,可以在運行期動態地選擇其他數據集,而不用擔心柵格是否適合於顯示新的數據集。例如,可以用同一個TDBGrid構件先顯示一個Paradox表,再顯示查詢另一個數據庫的結果。在設計期,無法直接修改動態列對象的屬性,只能修改字段對象的屬性,從而間接地修改動態列對象的屬性。
動態列對象的生存期也取決於字段對象的生存期。如果數據集沒有建立永久的字段對象,那麼,當數據集關閉時,所有的動態列對象也將消失。注意:如果在運行期把TDBGridColumns的State屬性設為csDefault,將刪除所有的列對象,然後根據數據集中的字段對象重建列對象。
要能夠在設計期自定義柵格,就要用到永久的列對象。建立了永久的列對象後,如果TDBGridColumns的State屬性設為csCustomized,就可以獨立設置每一列的屬性。例如,默認情況下,列的標題顯示字段的標簽即DisplayLabel屬性,通過修改TColumnTitle的Caption屬性可以重新指定列的標題,而TFIEld的DisplayLabel屬性則不會受到影響。TDBGridColumns的State屬性設為csCustomized適合於那些數據集的結構是固定不變的情況。如果需要在運行期切換不同的數據集,就不能把State屬性設為csCustomized。要創建永久的列對象,首先要在窗體上選擇TDBGrid構件,然後對象觀察器中單擊Columns屬性邊上的省略號按鈕將打開編輯器。
剛開始的時候,這個編輯器是空白的,這是因為,默認情況下,柵格中的列對象都是動態生成的,還沒有永久的列對象。要基於數據集中的每一個字段分別創建一個永久的列對象,可以單擊鼠標右鍵,在彈出的菜單中選擇“Add All Fields”命令。要創建一個獨立的永久列對象,可以單擊工具欄上的(Add New)按鈕。選擇這個剛創建的列對象,然後在對象觀察器中設置FIEldName屬性指定一個字段,設置Caption屬性指定列的標題。要刪除一個列對象,可以單擊工具欄上的(Delete Selected)按鈕。如果把永久的列都刪掉,柵格反而能顯示數據集中所有的字段,這是因為,永久的列刪掉以後,Delphi 4會自動把TDBGridColumns的State屬性設為csDefault並且動態生成所有的列。
要調整列在柵格中顯示的順序,可以用鼠標把列對象前移或後移。對於永久的列對象來說,它的屬性的默認值仍然取自於字段,除非您修改了永久列對象的屬性。例如,默認的情況下,列的標題就是字段的DisplayLabel屬性。如果修改字段的DisplayLabel屬性,列的標題將隨之改變。但是,一旦您修改了列對象的Caption屬性,列的標題不再與字段的DisplayLabel屬性存在聯動關系,它們彼此是獨立的。
前面講過,創建一個永久的列對象時,需要設置FieldName屬性指定一個字段。不過,您也可以讓FieldName屬性為空,此時,TColumn對象的Field屬性將返回NULL,並且該列在柵格中是空白的。空白的列往往用於用戶顯示一些自定義的內容,如圖像或圖表等。幾個列對象的FieldName屬性可以設為同一個字段。由此可見,TDBGrid的FIEldCount屬性可能小於柵格的列數。
數據源
TDataSource構件是一個非可視的構件,它充當了數據集和數據控件之間的橋梁。每一個數據控件都必須指定一個數據源(TDataSource構件),相應地,TDataSource構件的DataSet屬性必須指定一個數據集。下面簡單介紹一下TDataSource構件的屬性和事件。DataSet屬性用於指定一個數據集。在設計期,可以在對象觀察器中為DataSet屬性選擇一個數據集。在運行期,可以通過代碼動態地選擇數據集。程序示例如下:
With CustSource Do
Begin
If DataSet = 'Customers' then
DataSet := 'Orders'
Else
DataSet := 'Customers';
End;
也可以指定另一個窗體上的數據集構件,例如:
Procedure TForm2. FormCreate (Sender : TObject);
Begin
DataSource1.Dataset := Form1.Table1;
End;
一般情況下,TDataSource構件的名稱是無關緊要的。不過,TDataSource構件的名稱應當能反映它所連接的數據集,例如,假設TDataSource構件連接的數據集叫Customers,相應地,TDataSource構件的名稱最好叫CustomersSource。
Enabled屬性用於控制TDataSource構件是否與數據集連接,設為True表示連接,設為False表示暫時斷開連接。如果Enabled屬性設為False,凡是連接於這個數據源的數據控件將變成空白。如果AutoEdit屬性設為True,當用戶在數據控件中鍵入字符時,數據集就自動進入dsEdit狀態。如果AutoEdit屬性設為False,程序必須調用Edit函數才能進入dsEdit狀態。
當數據集的當前記錄的位置發生變化時將觸發OnDataChange事件,這可能是因為程序調用了Next、Previous、Insert等方法。當前記錄的數據將要被更新時將觸發OnUpdateData事件,這可能是因為調用了Post。在處理這個事件的句柄中,可以對數據進行校驗。