程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi數據庫控件使用入門

Delphi數據庫控件使用入門

編輯:Delphi

在數據庫應用程序中,數據控件是經常要用到的。數據控件都是可視的。也就是說,如果修改了這些構件的屬性,能在窗體上馬上反映出來。如果這些構件的Enabled屬性設為True並且數據集的Active屬性也設為True,在設計期就可以看到數據。

下面就來介紹一下這些控件的簡單應用:

指定一個數據源

數據控件必須通過TDataSource構件連接數據集。TDataSource構件扮演的角色實際上就是數據控件與數據集之間的橋梁。首先,把一個數據集構件放到窗體或數據模塊上,設置它的DatabaseName屬性指定要訪問的數據庫,設置它的TableName屬性指定要訪問的表。接著,把一個TDataSource構件放到窗體或數據模塊上,設置它的DataSet屬性指定數據集。然後,把一個數據控件放到窗體上,設置它的DataSource屬性指定TDataSource構件,而這個TDataSource構件的DataSet屬性已經指定了一個數據集。最後,設置數據控件的DataField屬性指定要顯示的字段。不過,對於TDBGrid、TDBCtrlGrid和TDBNavigator構件來說,不需要設置DataField屬性,因為這幾個控件是以整個數據集為工作內容的。

編輯和更新數據

除了TDBNavigator構件外,其他數據控件都是用來顯示和編輯數據的。這裡要介紹怎樣編輯數據。

要使用戶能編輯數據,數據集必須進入dsEdit狀態。如果TDataSource的AutoEdit屬性設為False,用戶不能直接編輯數據,除非程序調用Edit函數。

要使用戶能夠在數據控件中修改數據,必須把數據控件的ReadOnly屬性設為False。如果ReadOnly屬性設為True,數據控件中顯示的數據就是只讀的。一般情況下,TDataSource構件的Enabled屬性設為True。如果這個屬性設為False,數據控件就無法顯示數據,更不能修改數據。

如果數據集構件的ReadOnly屬性設為True,數據集就是只讀的,用戶在數據控件中所作的修改不能寫到數據集中。除了TDBGrid構件外,當用戶修改了一個字段的值,還需要把輸入焦點移走,新的數據才寫到數據集中。在移走輸入焦點之前,用戶隨時可以按ESC鍵取消修改。在TDBGrid構件建立的柵格中,當用戶修改了一個字段的值,還需要把輸入焦點移到另一條記錄上,新的數據才寫到數據集中。

禁止和允許數據刷新

當程序正在遍歷整個數據集或者搜索一個特定的記錄時,應當暫時禁止數據控件刷新數據,這樣能加快遍歷或搜索的速度,防止屏幕總是在閃爍。調用數據集的DisableControls可以暫時禁止連接這個數據集的數據控件刷新數據。DisableControls函數通常在循環操作前調用。等循環結束後,程序應當立即調用數據集構件的EnableControls函數重新允許刷新數據。為了確保最後總是能恢復刷新,建議采用Try...Finally結構。這樣,即使在循環中出現異常,也可以保證總能調用EnableControls。

下面的代碼演示了怎樣調用DisableControls和EnableControls函數:

CustTable.DisableControls;
Try
CustTable.First;
While not CustTable.EOF Do
Begin
...
CustTable.Next;
End;
Finally
CustTable.EnableControls;
End;

手動刷新數據

調用數據集的Refresh可以讀取數據集中最新的數據並刷新數據控件,這個功能在多用戶環境尤其有用,因為其他用戶有可能已改變了數據集中的數據。有時候,調用Refresh可能會導致意想不到的結果。例如,如果另一個用戶已經刪除了一條記錄,調用Refresh後,這條記錄將從數據控件中消失。

顯示單個字段的數據控件

有的數據控件以數據庫的一個或幾個字段作為工作內容,如TDBText和TDBEdit,而有的數據控件以整個數據集為工作內容,如TDBGrid和TDBNavigator。顯示單個字段的數據控件往往是從一個標准的Windows控件演化而來的,例如,TDBEdit構件就可以認為是TEdit的數據感知版本。

1、把數據作為標簽顯示

TDBText構件是一個只讀的數據控件,它非常類似於TLabel構件和TStaticText構件。TDBText構件能夠把數據作為標簽顯示,用來標注其他控件。例如,可以用一個TDBText構件顯示名稱(Common_Name字段)。

TDBText構件需要指定一個字段。當用戶使用導航器或其他手段浏覽記錄時,TDBText構件顯示的數據將自動變化,因為TDBText構件總是顯示當前記錄的數據。

TDBText構件的AutoSize屬性一般要設為True,這是因為字段的內容長度可能是不同的。如果AutoSize屬性設為False,有些較長的內容可能會被截斷。

2、顯示和編輯數據

TDBText構件只能顯示數據,不能編輯數據。要既能顯示數據,又能編輯數據,就要用到TDBEdit構件。TDBEdit可以認為是TEdit的數據感知(Data-Aware)版本。例如,有一個TDataSource構件叫CustomersSource,它的DataSet屬性指向一個TTable構件叫CustomersTable。把一個TDBEdit構件放在窗體上,其DataSource屬性設為CustomersSource,把它的DataField屬性設為CustNo。這個TDBEdit構件馬上就能顯示CustNo字段的值。用戶可以在編輯框中鍵入新的值。

顯示和編輯多行文本

TDBMemo構件是TMemo構件的數據感知版本,可以顯示dBASE和Paradox數據庫中備注字段的內容。

與TDBEdit不同的是,TDBMemo能夠以多行的形式顯示文本,同時也允許用戶鍵入多行文本。

默認情況下,TDBMemo允許用戶修改它顯示的文本。如果不想讓用戶修改文本,只要把ReadOnly屬性設為True即可。

要允許用戶在文本中插入一個制表符,應當把WantTabs屬性設為True,否則,當用戶按下Tab鍵,將把輸入焦點移走,而不是插入制表符。要限制用戶最多可輸入的字符數,可以設置MaxLength屬性。如果這個屬性設為0,表示沒有限制。

此外,ScrollBars屬性可以設置要不要加上滾動欄,WordWrap屬性可以設置是否允許自動繞回,Alignment屬性可以設置文本的對齊方式。在運行期,您可以調用CutToClipboard和CopyToClipboard函數把選擇的文本剪切和復制到剪貼板中,調用PasteFromClipboard能夠粘貼剪貼板中的文本。

如果AutoDisplay屬性設為True,當DataField屬性所指定的字段的內容改變了時,TDBMemo構件會自動刷新。如果AutoDisplay屬性設為False,TDBMemo構件上只顯示字段名,用戶必須雙擊這個構件或程序調用LoadMemo才能刷新數據。

以RTF格式顯示文本

TDBRichEdit構件可以認為是TRichEdit構件的數據感知版本,用於以RTF格式顯示BLOB字段中的格式化文本。它的用法類似於TDBMemo構件,也能顯示多行文本。

注意:盡管TDBRichEdit構件能夠顯示RTF格式的文本,並且提供了很強的編輯功能,但是,它本身並沒有提供用戶界面,應用程序必須設計出相應的用戶界面,才能把TDBRichEdit 構件強大的功能發揮出來。

默認情況下,TDBRichEdit構件允許用戶鍵入新的文本。如果不想讓用戶修改文本,可以把ReadOnly屬性設為True。要允許用戶在文本中插入一個制表符,應當把WantTabs屬性設為True,否則,當用戶按下Tab鍵,將把輸入焦點移走,而不是插入制表符。

要限制用戶最多可輸入的字符數,可以設置MaxLength屬性。如果這個屬性設為0,表示沒有限制。如果AutoDisplay屬性設為True,當DataField屬性所指定的字段的內容改變了時,TDBRichEdit構件會自動刷新。如果AutoDisplay屬性設為False,TDBRichEdit構件上只顯示字段名,用戶必須雙擊這個構件或程序調用LoadMemo函數才能刷新數據。

顯示和編輯圖像

TDBImage構件可以認為是TImage構件的數據感知版本,它可以顯示BLOB字段的內容。TDBImage構件從數據集中檢索了圖像後,在本地以DIB格式建立一個副本。

可以調用CutToClipboard或CopyToClipboard函數把圖像剪切或復制到剪貼板中,調用 PasteFromClipboard可以從剪貼板中粘貼圖像。

如果Stretch屬性設為True,圖像將自動縮放,以適應TDBImage構件的大小,這樣就可能造成圖像變形。

如果AutoDisplay屬性設為True,當DataField屬性所指定的字段的內容改變了時,TDBImage構件會自動刷新。如果這個屬性設為False,TDBImage構件上只顯示字段名,用戶必須雙擊這個構件才能刷新數據,當然也可以調用LoadPicture來刷新數據。

用列表框和組合框顯示和編輯數據

有4個特殊的數據控件可以用列表框和組合框顯示和編輯數據,它們可以認為是標准的列表框和組合框的數據感知版本。下面簡單介紹這4個數據控件:

1、TDBListBox用列表框顯示一組數據,讓用戶從中選擇一個值。

2、TDBComboBox用組合框顯示一組數據,讓用戶從中選擇一個值。

3、TDBLookupListBox用列表框顯示另一個數據集中的一組數據,讓用戶從中選擇一個值。

4、TDBLookupComboBox用組合框顯示另一個數據集中的一組數據,讓用戶從中選擇一個值。

TDBComboBox

TDBComboBox構件實際上是TComboBox構件的數據感知版本,它能以組合框的形式顯示一組數據,讓用戶從列表中選擇一個值或直接輸入一個值。

Items屬性用於設置列表中要顯示的一組數據。在設計期,可以單擊Items屬性邊上的省略號按鈕打開一個字符串列表編輯器,然後輸入一些字符串。

DropDownCount屬性用於設置當用戶下拉組合框時不需要加滾動欄就能顯示的項的個數,默認是8,表示用戶下拉組合框時如果項的個數超過8個才加上滾動欄。如果實際的項數還沒有DropDownCount屬性指定的值多,下拉的組合框的高度自動縮小。

在Style屬性設為csOwnerDrawFixed的情況下,ItemHeight屬性用於設置項的高度。 

顯示另一個數據集中的數據

TDBLookupListBox構件和TDBLookupComboBox構件分別以列表框和組合框的形式顯示另一個數據集中的數據。

假設有一個表格叫OrdersTable,其中包含一個CustNo字段,用於表達客戶的編號,但OrdersTable表中除了客戶的編號外,不包含客戶的其他信息。而另一個表格假設叫CustomersTable,除了有CustNo字段外,還有諸如客戶的公司名稱、地址等信息。

TDBLookupListBox構件可以實現這樣的功能,當用戶在OrdersTable中浏覽記錄時,程序首先在CustomersTable中查找與CustNo字段匹配的記錄,如果找不到,就從列表中查找與Company字段匹配的字符串;如果找到,就選擇這一項。

用復選框處理布爾類型的字段

TDBCheckBox構件可以認為是TCheckBox構件的數據感知版本,用於處理布爾類型的字段。例如,可以用一個復選框來表示客戶是否已付帳。

TDBCheckBox構件實際上是把字段的值與預設的兩個字符串比較,這兩個字符串分別由ValueChecked和ValueUnChecked屬性指定。如果字段的值與ValueChecked屬性指定的字符串匹配,就選中復選框。如果字段的值與ValueUnchecked屬性指定的字符串匹配,就不選中復選框。注意:ValueChecked屬性和ValueUnchecked屬性所指定的字符串不能相同。

一般情況下,ValueChecked屬性設為“True”、“Yes”之類的字符串,但也可以是其他任意的字符串,甚至是一組字符串,彼此之間要用分號隔開,例如:

DBCheckBox1.ValueChecked := 'True;Yes;On';

上述情況下,當字段的值只要與其中一個字符串匹配,就選中復選框。要說明的是,ValueChecked屬性指定的字符串是大小寫敏感的。一般情況下,ValueUnchecked屬性設為“False”、“No”之類的字符串,但也可以是其他任意的字符串,甚至是一組字符串,彼此之間用分號隔開。如果字段的值既不與ValueChecked屬性指定的字符串匹配,也不與ValueUnchecked屬性指定的字符串匹配,復選框就變灰。

使用TDBGrid

TDBGrid構件以柵格的形式顯示和編輯數據集中的數據。它的外觀很大程度上取決於下面三個因素:l 一是永久的列對象。 二是永久的字段對象。 三是數據集構件的ObjectView屬性將影響ADT和數組字段的顯示方式。對於TDBGrid構件來說,最重要的屬性是Columns,這是一個TDBGridColumns對象,用於管理一組TColumn對象。在設計期,可以打開一個編輯器建立永久的列對象,然後在對象觀察器中設置列對象的屬性。

動態的列對象

如果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。在處理這個事件的句柄中,可以對數據進行校驗。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved