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;TryCustTable First;While not CustTable EOF DoBegin CustTable Next;End;FinallyCustTable EnableControls;End;
手動刷新數據
調用數據集的Refresh可以讀取數據集中最新的數據並刷新數據控制項 這個功能在多用戶環境尤其有用 因為其他用戶有可能已改變了數據集中的數據 有時候 調用Refresh可能會導致意想不到的結果 例如 如果另一個用戶已經刪除了一條記錄 調用Refresh後 這條記錄將從數據控制項中消失
顯示單個欄位的數據控制項
有的數據控制項以資料庫的一個或幾個欄位作為工作內容 如TDBText和TDBEdit 而有的數據控制項以整個數據集為工作內容 如TDBGrid和TDBNavigator 顯示單個欄位的數據控制項往往是從一個標準的Windows控制項演化而來的 例如 TDBEdit構件就可以認為是TEdit的數據感知版本
把數據作為標簽顯示
TDBText構件是一個只讀的數據控制項 它非常類似於TLabel構件和TStaticText構件 TDBText構件能夠把數據作為標簽顯示 用來標注其他控制項 例如 可以用一個TDBText構件顯示名稱(Common_Name欄位)
TDBText構件需要指定一個欄位 當用戶使用導航器或其他手段瀏覽記錄時 TDBText構件顯示的數據將自動變化 因為TDBText構件總是顯示當前記錄的數據
TDBText構件的AutoSize屬性一般要設為True 這是因為欄位的內容長度可能是不同的 如果AutoSize屬性設為False 有些較長的內容可能會被截斷
顯示和編輯數據
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屬性 如果這個屬性設為 表示沒有限制
此外 ScrollBars屬性可以設置要不要加上滾動欄 WordWrap屬性可以設置是否允許自動繞回 Alignment屬性可以設置文本的對齊方式 在運行期 您可以調用CutToClipboard和CopyToClipboard函數把選擇的文本剪切和復制到剪貼板中 調用PasteFromClipboard能夠粘貼剪貼板中的文本
lishixin/Article/program/Delphi/201311/8453
㈡ Delphi資料庫控制項使用入門(三)
使用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 會自動把TDBGridColumns的State屬性設為csDefault並且動態生成所有的列
要調整列在柵格中顯示的順序 可以用滑鼠把列對象前移或後移 對於永久的列對象來說 它的屬性的默認值仍然取自於欄位 除非您修改了永久列對象的屬性 例如 默認的情況下 列的標題就是欄位的DisplayLabel屬性 如果修改欄位的DisplayLabel屬性畢彎 列的標題將隨之改變 但是 一旦您修改了列對象的Caption屬性 列的標題不再與欄位的DisplayLabel屬性存在聯動關系 它們彼此是獨立的
前面講過 創建一個永久的列對象時 需要設置FieldName屬性指定一個欄位 不過 您也可以讓FieldName屬性為空 此時 TColumn對象的Field屬性將返回NULL 並且該列在柵格中是空白的 空白的列往往用於用戶顯示一些自定義的內容 如圖像或圖表等 幾個列對象的FieldName屬性可以設為同一個欄位 由此可見 TDBGrid的FieldCount屬性可能小於柵格的列數
數據源
TDataSource構件是一個非可視的構件 它充當了數據集和數據控制項之間的橋梁 每一個數據控制項都必須指定一個數據源(TDataSource構件) 相應地 TDataSource構件的DataSet屬性必須指定一個數據集 下面簡單介紹一下TDataSource構件的屬性和事件 DataSet屬性用於指定一個數據集 在設計期 可以在對象觀察器中為DataSet屬性選擇一個數據集 在運行期 可以通過代碼動態地選擇數據集 程序示例如下
With CustSource DoBeginIf DataSet = Customers thenDataSet := Orders ElseDataSet := Customers ;End;
也可以指定另一個窗體上的數據集構件 例如
Procere TForm FormCreate (Sender : TObject);BeginDataSource Dataset := Form Table ;End;
一般情況下 TDataSource構件的名稱是無關緊要的 不過 TDataSource構件的名稱應當能反映它所連接的數據集 例如 假設TDataSource構件連接的數據集叫Customers 相應地 TDataSource構件的名稱最好叫CustomersSource
Enabled屬性用於控制TDataSource構件是否與數據集連接 設為True表示連接 設為False表示暫時斷開連接 如果Enabled屬性設為False 凡是連接於這個數據源的數據控制項將變成空白 如果AutoEdit屬性設為True 當用戶在數據控制項中鍵入字元時 數據集就自動進入dsEdit狀態 如果AutoEdit屬性設為False 程序必須調用Edit函數才能進入dsEdit狀態
lishixin/Article/program/Delphi/201311/8450
㈢ Delphi資料庫控制項使用入門(二)
以RTF格式顯示文本
TDBRichEdit構件可以認為是TRichEdit構件的數據感知版本 用於以RTF格式顯示BLOB欄位中的格式化文本 它的用法類似於TDBMemo構件 也能顯示多行文本
注意 盡管TDBRichEdit構件能夠顯示RTF格式的文本 並且提供了很強的編輯功能 但是 它本身並沒有提供用戶界面 應用程序必須設計出相應的用戶界面 才能把TDBRichEdit 構件強大的功能發揮出來
默認情況下 TDBRichEdit構件允許用戶鍵入新的文本 如果不想讓用戶修改文本 可以把ReadOnly屬性設為True 要允許用戶在文本中插入一個製表符 應當把WantTabs屬性設為True 否則 當用戶按下Tab鍵 將把輸入焦點移走 而不是插入製表符
要限制用戶最多可輸入的字元數 可以設置MaxLength屬性 如果這個屬性設為 表示沒有限制 如果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來刷新數據
用列表框和組合框顯示和編輯數據
有 個特殊的數據控制項可以用列表框和組合框顯示和編輯數據 它們可以認為是標準的列表框和組合框的數據感知版本 下面簡單介紹這 個數據控制項
TDBListBox用列表框顯示一組數據 讓用戶從中選擇一個值
TDBComboBox用組合框顯示一組數據 讓用戶從中選擇一個值
TDBLookupListBox用列表框顯示另一個數據集中的一組數據 讓用戶從中選擇一個值
TDBLookupComboBox用組合框顯示另一個數據集中的一組數據 讓用戶從中選擇一個值
TDBComboBox
TDBComboBox構件實仔舉際上是TComboBox構件的數據感知版本 它能以組合框的形式顯示一組數據 讓用戶從列表中選擇一個值或直接輸入一個值
Items屬性用於設置列表中要顯示的一組數據 在設計期 可以單擊Items屬性邊上的省略號按鈕打開一個字元串列表編輯器 然後輸入一些字元串
DropDownCount屬性用於設置當用戶下拉組合框時不需要加滾動欄就能顯示的項的個數 默認是 表示用戶下拉組合框時如果項的個蘆擾數超過 個才加上滾動欄 如果實際的項數還沒有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 之類的字元串 但也可以是其他任意的字元串 甚至是一組字元串 彼此之間要用分號隔開 例如
DBCheckBox ValueChecked := True;Yes;On ;
lishixin/Article/program/Delphi/201311/8451