亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? core12.htm

?? Delphi4核心編程技術
?? HTM
?? 第 1 頁 / 共 3 頁
字號:
<html><head><title>第十二章 使用數據控件 http://jjlzg.yeah.net</title><meta http-equiv=Content-Type content="text/html; charset=gb2312"></head><body bgcolor="#00000" text="#00cc66"><b>第十二章 使用數據控件</b><br>   在數據庫應用程序中,數據控件是經常要用到的。與前面介紹的數據集構件如TTable、TQuery、TStoredProc、TClientDataSet不同的是,數據控件都是可視的。也就是說,如果修改了這些構件的屬性,能在窗體上馬上反映出來。如果這些構件的Enabled屬性設為True并且數據集的Active屬性也設為True,在設計期就可以看到數據。<br> <b>12.1 Delphi 4中有哪些數據控件</b><br>   在Delphi 4的IDE中,數據控件都位于構件選項板的“Data Controls”頁上。下面簡單介紹這些數據控件:<br> .TDBGrid以行和列組成的柵格顯示數據。<br> .TDBNavigator用于對整個數據庫的記錄進行導航,如向前翻一個記錄、向后翻一個記錄、翻到第一個記錄、翻到最后一個記錄等。<br> .TDBText把字段的內容作為標簽顯示。<br> .TDBEdit以編輯框的形式顯示一個字段的內容。<br> .TDBMemo以多行文本編輯器的形式顯示備注字段的內容。<br> .TDBImage用于顯示數據庫中的圖像字段。<br> .TDBListBox以列表框的形式顯示數據。<br> .TDBComboBox以組合框的形式顯示數據。<br> .TDBCheckBox以復選框的形式顯示數據。<br> .TDBRadioGroup以單選框分組框的形式顯示數據。<br> .TDBLookupListBox以列表框的形式顯示這個表的Lookup表的數據。<br> .TDBLookupComboBox以組合框的形式顯示這個表的Lookup表的數據。<br> .TDBRichEdit以RTF格式顯示備注字段的內容。<br> .TDBCtrlGrid與TDBGrid相似,但每一個單元都可以分別設置屬性。<br> .TDBChart以圖表的形式顯示數據庫的數據,用法與TChart相似。<br>   上述數據控件在設計期具有數據感知的特點。如果正確設置了DataSource屬性指定了一個數據源,馬上就能看到數據,而不需要編譯和運行程序。<br> <b>12.2 數據控件的基本用法</b><br>   這一節介紹數據控件的基本用法,包括怎樣指定一個數據源、怎樣編輯和更新數據、怎樣禁止和允許數據刷新。<br> <b>12.2.1 指定一個數據源</b><br>   數據控件必須通過TDataSource構件連接數據集。TDataSource構件扮演的角色實際上就是數據控件與數據集之間的橋梁。<br>   首先,把一個數據集構件放到窗體或數據模塊上,設置它的DatabaseName屬性指定要訪問的數據庫,設置它的TableName屬性指定要訪問的表。<br>   接著,把一個TDataSource構件放到窗體或數據模塊上,設置它的DataSet屬性指定數據集。<br>   然后,把一個數據控件放到窗體上,設置它的DataSource屬性指定TDataSource構件,而這個TDataSource構件的DataSet屬性已經指定了一個數據集。<br>   最后,設置數據控件的DataField屬性指定要顯示的字段。不過,對于TDBGrid、TDBCtrlGrid和TDBNavigator構件來說,不需要設置DataField屬性,因為這幾個控件是以整個數據集為工作內容的。<br> <b>12.2.2 編輯和更新數據</b><br>   除了TDBNavigator構件外,其他數據控件都是用來顯示和編輯數據的。這里要介紹怎樣編輯數據。<br>   要使用戶能編輯數據,數據集必須進入dsEdit狀態。如果TDataSource的AutoEdit屬性設為False,用戶不能直接編輯數據,除非程序調用Edit函數。<br>   要使用戶能夠在數據控件中修改數據,必須把數據控件的ReadOnly屬性設為False。如果ReadOnly屬性設為True,數據控件中顯示的數據就是只讀的。<br>   一般情況下,TDataSource構件的Enabled屬性設為True。如果這個屬性設為False,數據控件就無法顯示數據,更不能修改數據。<br>   如果數據集構件的ReadOnly屬性設為True,數據集就是只讀的,用戶在數據控件中所作的修改不能寫到數據集中。<br>   除了TDBGrid構件外,當用戶修改了一個字段的值,還需要把輸入焦點移走,新的數據才寫到數據集中。在移走輸入焦點之前,用戶隨時可以按ESC鍵取消修改。<br>   在TDBGrid構件建立的柵格中,當用戶修改了一個字段的值,還需要把輸入焦點移到另一條記錄上,新的數據才寫到數據集中。<br> <b>12.2.3 禁止和允許數據刷新</b><br>   當程序正在遍歷整個數據集或者搜索一個特定的記錄時,應當暫時禁止數據控件刷新數據,這樣能加快遍歷或搜索的速度,防止屏幕總是在閃爍。<br>   調用數據集的DisableControls可以暫時禁止連接這個數據集的數據控件刷新數據。DisableControls函數通常在循環操作前調用。等循環結束后,程序應當立即調用數據集構件的EnableControls函數重新允許刷新數據。<br>   為了確保最后總是能恢復刷新,建議采用Try...Finally結構。這樣,即使在循環中出現異常,也可以保證總能調用EnableControls。<br>   下面的代碼演示了怎樣調用DisableControls和EnableControls函數:<br> CustTable.DisableControls;<br> Try<br>   CustTable.First;<br>   While not CustTable.EOF Do<br>   Begin<br>    ...<br>    CustTable.Next;<br>   End;<br> Finally<br>   CustTable.EnableControls;<br> End;<br> <b>12.2.4 手動刷新數據</b><br>   調用數據集的Refresh可以讀取數據集中最新的數據并刷新數據控件,這個功能在多用戶環境尤其有用,因為其他用戶有可能已改變了數據集中的數據。<br>   有時候,調用Refresh可能會導致意想不到的結果。例如,如果另一個用戶已經刪除了一條記錄,調用Refresh后,這條記錄將從數據控件中消失。<br> <b>12.3 顯示單個字段的數據控件</b><br>   有的數據控件以數據庫的一個或幾個字段作為工作內容,如TDBText和TDBEdit,而有的數據控件以整個數據集為工作內容,如TDBGrid和TDBNavigator。<br>   顯示單個字段的數據控件往往是從一個標準的Windows控件演化而來的,例如,TDBEdit構件就可以認為是TEdit的數據感知版本。<br>   圖12.1 用TDBText構件把數據作為標簽顯示 <br> <b>12.3.1 把數據作為標簽顯示</b><br>   TDBText構件是一個只讀的數據控件,它非常類似于TLabel構件和TStaticText構件。TDBText構件能夠把數據作為標簽顯示,用來標注其他控件。例如,可以用一個TDBText構件在魚的圖片下顯示魚的名稱(Common_Name字段),如圖12.1所示。<br>   TDBText構件需要指定一個字段。當用戶使用導航器或其他手段瀏覽記錄時,TDBText構件顯示的數據將自動變化,因為TDBText構件總是顯示當前記錄的數據。例如,在圖12.1中,當用戶用鼠標單擊柵格的滾桿兩端的箭頭時,魚的圖片將自動變化,魚的名稱也相應改變,這一切都不需要編程。<br>   TDBText構件的AutoSize屬性一般要設為True,這是因為字段的內容長度可能是不同的。如果AutoSize屬性設為False,有些較長的內容可能會被截斷。<br> <b>12.3.2 顯示和編輯數據</b><br>   TDBText構件只能顯示數據,不能編輯數據。要既能顯示數據,又能編輯數據,就要用到TDBEdit構件。TDBEdit可以認為是TEdit的數據感知(Data-Aware)版本。<br>   例如,有一個TDataSource構件叫CustomersSource,它的DataSet屬性指向一個TTable構件叫CustomersTable。把一個TDBEdit構件放在窗體上,其DataSource屬性設為CustomersSource,把它的DataField屬性設為CustNo。這個TDBEdit構件馬上就能顯示CustNo字段的值。用戶可以在編輯框中鍵入新的值。<br> <b>12.3.3 顯示和編輯多行文本</b><br>   TDBMemo構件是TMemo構件的數據感知版本,可以顯示dBASE和Paradox數據庫中備注字段的內容。<br>   與TDBEdit不同的是,TDBMemo能夠以多行的形式顯示文本,同時也允許用戶鍵入多行文本。<br>   默認情況下,TDBMemo允許用戶修改它顯示的文本。如果不想讓用戶修改文本,只要把ReadOnly屬性設為True即可。要允許用戶在文本中插入一個制表符,應當把WantTabs屬性設為True,否則,當用戶按下Tab鍵,將把輸入焦點移走,而不是插入制表符。<br>   要限制用戶最多可輸入的字符數,可以設置MaxLength屬性。如果這個屬性設為0,表示沒有限制。<br>   此外,ScrollBars屬性可以設置要不要加上滾動欄,WordWrap屬性可以設置是否允許自動繞回,Alignment屬性可以設置文本的對齊方式。<br>   在運行期,您可以調用CutToClipboard和CopyToClipboard函數把選擇的文本剪切和復制到剪貼板中,調用PasteFromClipboard能夠粘貼剪貼板中的文本。如果AutoDisplay屬性設為True,當DataField屬性所指定的字段的內容改變了時,TDBMemo構件會自動刷新。如果AutoDisplay屬性設為False,TDBMemo 構件上只顯示字段名,用戶必須雙擊這個構件或程序調用LoadMemo才能刷新數據。<br> <b>12.3.4 以RTF格式顯示文本</b><br>   TDBRichEdit構件可以認為是TRichEdit構件的數據感知版本,用于以RTF格式顯示BLOB字段中的格式化文本。它的用法類似于TDBMemo構件,也能顯示多行文本。<br>   注意:盡管TDBRichEdit構件能夠顯示RTF格式的文本,并且提供了很強的編輯功能,但是,它本身并沒有提供用戶界面,應用程序必須設計出相應的用戶界面,才能把TDBRichEdit 構件強大的功能發揮出來。<br>   默認情況下,TDBRichEdit構件允許用戶鍵入新的文本。如果不想讓用戶修改文本,可以把ReadOnly屬性設為True。<br>   要允許用戶在文本中插入一個制表符,應當把WantTabs屬性設為True,否則,當用戶按下Tab鍵,將把輸入焦點移走,而不是插入制表符。<br>   要限制用戶最多可輸入的字符數,可以設置MaxLength屬性。如果這個屬性設為0,表示沒有限制。<br>   如果AutoDisplay屬性設為True,當DataField屬性所指定的字段的內容改變了時,TDBRichEdit構件會自動刷新。如果AutoDisplay屬性設為False,TDBRichEdit構件上只顯示字段名,用戶必須雙擊這個構件或程序調用LoadMemo函數才能刷新數據。<br> <b>12.3.5 顯示和編輯圖像</b><br>   TDBImage構件可以認為是TImage構件的數據感知版本,它可以顯示BLOB字段的內容。TDBImage構件從數據集中檢索了圖像后,在本地以DIB格式建立一個副本。<br>   可以調用CutToClipboard或CopyToClipboard函數把圖像剪切或復制到剪貼板中,調用 PasteFromClipboard可以從剪貼板中粘貼圖像。<br>   如果Stretch屬性設為True,圖像將自動縮放,以適應TDBImage構件的大小,這樣就可能造成圖像變形。如果AutoDisplay屬性設為True,當DataField屬性所指定的字段的內容改變了時,TDBImage構件會自動刷新。如果這個屬性設為False,TDBImage構件上只顯示字段名,用戶必須雙擊這個構件才能刷新數據,當然也可以調用LoadPicture來刷新數據。<br> <b>12.4 用列表框和組合框顯示和編輯數據</b><br>   有4個特殊的數據控件可以用列表框和組合框顯示和編輯數據,它們可以認為是標準的列表框和組合框的數據感知版本。下面簡單介紹這4個數據控件:<br> .TDBListBox用列表框顯示一組數據,讓用戶從中選擇一個值。<br> .TDBComboBox用組合框顯示一組數據,讓用戶從中選擇一個值。<br> .TDBLookupListBox用列表框顯示另一個數據集中的一組數據,讓用戶從中選擇一個值。<br> .TDBLookupComboBox用組合框顯示另一個數據集中的一組數據,讓用戶從中選擇一個值。<br> <b>12.4.1 TDBListBox</b><br>   TDBListBox構件能夠用列表框顯示一組數據,用戶可以從中選擇一個數據。當用戶瀏覽記錄時,程序將自動在列表框中搜索與字段的值匹配的項,如果找到就選擇這一項,如圖12.2所示。<br>   在列表框中選擇匹配的項反過來,當用戶在列表框中選擇了某個項,程序就自動把當前記錄的該字段的值改為列表框中選擇的值。當然,要使修改有效還必須調用Post函數。<br>   要在設計期設置列表框中顯示的項,可以單擊Items屬性邊上的省略號按鈕打開一個字符串列表編輯器,然后輸入一些字符串。<br>   如果IntegralHeight屬性設為True,列表框的高度將總是項的高度的整數倍。<br> <b>12.4.2 TDBComboBox</b><br>   TDBComboBox構件實際上是TComboBox構件的數據感知版本,它能以組合框的形式顯示一組數據,讓用戶從列表中選擇一個值或直接輸入一個值。<br>   Items屬性用于設置列表中要顯示的一組數據。在設計期,可以單擊Items屬性邊上的省略號按鈕打開一個字符串列表編輯器,然后輸入一些字符串。<br>   DropDownCount屬性用于設置當用戶下拉組合框時不需要加滾動欄就能顯示的項的個數,默認是8,表示用戶下拉組合框時如果項的個數超過8個才加上滾動欄。如果實際的項數還沒有DropDownCount屬性指定的值多,下拉的組合框的高度自動縮小。<br>   在Style屬性設為csOwnerDrawFixed的情況下,ItemHeight屬性用于設置項的高度。<br> <b>12.4.3 顯示另一個數據集中的數據</b><br>   TDBLookupListBox構件和TDBLookupComboBox構件分別以列表框和組合框的形式顯示另一個數據集中的數據。<br>   假設有一個表格叫OrdersTable,其中包含一個CustNo字段,用于表達客戶的編號,但OrdersTable表中除了客戶的編號外,不包含客戶的其他信息。而另一個表格假設叫CustomersTable,除了有CustNo字段外,還有諸如客戶的公司名稱、地址等信息。<br>   TDBLookupListBox構件可以實現這樣的功能,當用戶在OrdersTable中瀏覽記錄時,程序首先在CustomersTable中查找與CustNo字段匹配的記錄,如果找不到,就從列表中查找與Company字段匹配的字符串;如果找到,就選擇這一項,如圖12.3所示。 <br>   圖12.3 TDBLookupListBox構件的用法<br>   當用戶在列表中選擇了一項,程序就在CustomersTable中查找與字符串匹配的Company字段,如果找到,就用CustNo字段的值替換OrdersTable表中的CustNo字段。<br> <b>12.5 用復選框處理布爾類型的字段</b><br>    TDBCheckBox構件可以認為是TCheckBox構件的數據感知版本,用于處理布爾類型的字段。例如,可以用一個復選框來表示客戶是否已付帳。<br>    TDBCheckBox構件實際上是把字段的值與預設的兩個字符串比較,這兩個字符串分別由ValueChecked和ValueUnChecked屬性指定。如果字段的值與ValueChecked屬性指定的字符串匹配,就選中復選框。如果字段的值與ValueUnchecked屬性指定的字符串匹配,就不選中復選框。注意:ValueChecked屬性和ValueUnchecked屬性所指定的字符串不能相同。<br>   一般情況下,ValueChecked屬性設為“True”、“Yes”之類的字符串,但也可以是其他任意的字符串,甚至是一組字符串,彼此之間要用分號隔開,例如:<br>   DBCheckBox1.ValueChecked := 'True;Yes;On';<br>   上述情況下,當字段的值只要與其中一個字符串匹配,就選中復選框。要說明的是,ValueChecked屬性指定的字符串是大小寫敏感的。<br>   一般情況下,ValueUnchecked屬性設為“False”、“No”之類的字符串,但也可以是其他任意的字符串,甚至是一組字符串,彼此之間用分號隔開。<br>   如果字段的值既不與ValueChecked屬性指定的字符串匹配,也不與ValueUnchecked屬性指定的字符串匹配,復選框就變灰。<br> <b>12.6 用單選分組框限制字段的值</b><br>    TDBRadioGroup構件可以認為是TRadioGroup構件的數據感知版本,它可以限制用戶從一組數據中選擇字段的值。<br>    與TRadioGroup構件一樣,首先要設置Items屬性指定單選分組框中要顯示哪些項。Items屬性是一個典型的TStrings對象,每一個字符串對應著單選分組框中的一個按鈕。<br>   當用戶瀏覽記錄時,如果字段的值與單選分組框中的某個按鈕的標簽匹配,就選擇這個按鈕,如圖12.4所示。 <br>   圖12.4 選擇與CustNo字段的值匹配的單選框<br>   反過來,當用戶在單選分組框中選擇一個按鈕,程序就用這個按鈕的標簽賦值給DataField屬性指定的字段。<br>   如果不想使按鈕的標簽與字段的值匹配,可以另外指定其他字符串,這就要用到Values屬性。Values屬性也是一個TStrings對象,用于指定一組字符串。當用戶在單選分組框中選擇一個按鈕,程序就用Values屬性中的一個字符串賦值給DataField屬性指定的字段,而不是按鈕的標簽。<br> <b>12.7 使用TDBGridTDBGrid構件</b><br>   以柵格的形式顯示和編輯數據集中的數據。它的外觀很大程度上取決于下面三個因素:<br> .一是永久的列對象。<br> .二是永久的字段對象。<br> .三是數據集構件的ObjectView屬性將影響ADT和數組字段的顯示方式。<br>   對于TDBGrid構件來說,最重要的屬性是Columns,這是一個TDBGridColumns對象,用于管理一組TColumn對象。在設計期,可以打開一個編輯器建立永久的列對象,然后在對象觀察器中設置列對象的屬性。<br> <b>12.7.1動態的列對象</b><br>   如果TDBGridColumns的State屬性設為csDefault,列是動態生成的,列的屬性取決于字段的屬性。當字段的屬性發生變化時,列的屬性也跟著變化。<br>   讓列動態生成的好處是,可以在運行期動態地選擇其他數據集,而不用擔心柵格是否適合于顯示新的數據集。例如,可以用同一個TDBGrid構件先顯示一個Paradox表,再顯示查詢另一個數據庫的結果。<br>   在設計期,無法直接修改動態列對象的屬性,只能修改字段對象的屬性,從而間接地修改動態列對象的屬性。 <br>   動態列對象的生存期也取決于字段對象的生存期。如果數據集沒有建立永久的字段對象,那么,當數據集關閉時,所有的動態列對象也將消失。<br>   注意:如果在運行期把TDBGridColumns的State屬性設為csDefault,將刪除所有的列對象,然后根據數據集中的字段對象重建列對象。<br> <b>12.7.2 永久的列對象</b><br>   要能夠在設計期自定義柵格,就要用到永久的列對象。建立了永久的列對象后,如果TDBGridColumns的State屬性設為csCustomized,就可以獨立設置每一列的屬性。例如,默認情況下,列的標題顯示字段的標簽即DisplayLabel屬性,通過修改TColumnTitle的Caption屬性可以重新指定列的標題,而TField的DisplayLabel屬性則不會受到影響。<br>   TDBGridColumns的State屬性設為csCustomized適合于那些數據集的結構是固定不變的情況。如果需要在運行期切換不同的數據集,就不能把State屬性設為csCustomized。<br>   要創建永久的列對象,首先要在窗體上選擇TDBGrid構件,然后對象觀察器中單擊Columns屬性邊上的省略號按鈕將打開如圖12.5所示的編輯器。<br>   圖12.5 創建永久的列對象<br>   剛開始的時候,這個編輯器是空白的,這是因為,默認情況下,柵格中的列對象都是動態生成的,還沒有永久的列對象。<br>   要基于數據集中的每一個字段分別創建一個永久的列對象,可以單擊鼠標右鍵,在彈出的菜單中選擇“Add All Fields”命令。<br>   要創建一個獨立的永久列對象,可以單擊工具欄上的(Add New)按鈕。選擇這個剛創建的列對象,然后在對象觀察器中設置FieldName屬性指定一個字段,設置Caption屬性指定列的標題。<br>   要刪除一個列對象,可以單擊工具欄上的(Delete Selected)按鈕。如果把永久的列都刪掉,柵格反而能顯示數據集中所有的字段,這是因為,永久的列刪掉以后,Delphi 4會自動把TDBGridColumns的State屬性設為csDefault并且動態生成所有的列。  要調整列在柵格中顯示的順序,可以用鼠標把列對象前移或后移。<br>   對于永久的列對象來說,它的屬性的默認值仍然取自于字段,除非您修改了永久列對象的屬性。例如,默認的情況下,列的標題就是字段的DisplayLabel屬性。如果修改字段的DisplayLabel屬性,列的標題將隨之改變。但是,一旦您修改了列對象的Caption屬性,列的標題不再與字段的DisplayLabel屬性存在聯動關系,它們彼此是獨立的。<br>   前面講過,創建一個永久的列對象時,需要設置FieldName屬性指定一個字段。不過,您也可以讓FieldName屬性為空,此時,TColumn對象的Field屬性將返回NULL,并且該列在柵格中是空白的。空白的列往往用于用戶顯示一些自定義的內容,如圖像或圖表等。<br>   幾個列對象的FieldName屬性可以設為同一個字段。由此可見,TDBGrid的FieldCount屬性可能小于柵格的列數<br> <b>12.7.3 讓用戶編輯數據</b><br>   對于永久的列對象來說,可以提供幾種方式讓用戶編輯數據。一是以組合框的方式顯示另一個數據集的數據,二是建立一個靜態的列表,三是用省略號按鈕打開一個對話框。<br>   要以組合框的方式顯示另一個數據集的數據,首先必須在數據集中增加一個Lookup字段,然后創建一個永久的列對象,設置它的FieldName屬性指定這個Lookup字段,并且把它的ButtonStyle屬性設為cbsAuto。經過上述操作后,柵格的效果如圖12.6所示。<br>   圖12.6 以組合框的形式顯示另一個數據集的數據<br>   要建立一個靜態的列表,不必事先增加一個Lookup字段,只要先創建一個永久的列對象,把ButtonStyle屬性設為cbsAuto,在對象觀察器中單擊Picklist屬性邊上的省略號按鈕打開一個字符串列表編輯器,然后依次鍵入一些字符串。<br>   要用一個對話框讓用戶選擇數據,必須把列對象的ButtonStyle屬性設為cbsEllipsis。當程序運行時,該列將出現一個省略號按鈕,單擊這個省略號按鈕將觸發OnEditButtonClick事件,在處理這個事件的句柄中可以打開一個對話框,讓用戶選擇數據。對于圖像字段來說,當用戶單擊省略號按鈕時,可以顯示一個圖像。<br> <b>12.7.4 在設計期設置列對象的屬性</b><br>   列對象的屬性決定了數據在柵格中的顯示方式。在設計期,可以設置它的下列屬性:<br> .Alignment用于設置數據的對齊方式,默認值是TField的Alignment。<br> .ButtonStyle設為cbsAuto表示加上一個組合框。設為cbsEllipsis表示加上一個省略號按鈕,當用戶單擊此按鈕將觸發OnEditButtonClick。設為cbsNone表示既沒有組合框也沒有省略號按鈕。<br> .Color用于設置背景顏色,默認值是TDBGrid的Color。<br> .DropDownRows 下拉列表框中的項數,默認值是7。<br> .Expanded如果列對象所對應的字段是ADT或數組字段,這個屬性用于控制是否展開。l FieldName用于指定一個字段,可以讓它空著。<br> .ReadOnly設為True表示該列是只讀的,不能編輯。<br> .Width用于設置列的寬度,默認值是TField的DisplayWidth。<br> .Font用于設置該列中字符的字體,默認值是TDBGrid的Font。<br> .PickList用于建立一個靜態的列表。<br> .Title這是個TColumnTitle對象,用于設置列的標題。<br>   其中,TColumnTitle具有下列屬性:<br> .Alignment用于設置標題的對齊方式,設為taLeftJustify表示左對齊,設為taCenter表示居中,設為taRightJustify表示右對齊。<br> .Caption用于指定標題的文字,默認值是TField的DisplayLabel。<br> .Color用于設置標題的背景顏色,默認值是TDBGrid的FixedColor。<br> .Font用于設置標題的字體,默認值是TDBGrid的TitleFont。<br> <b>12.7.5 顯示ADT和數組字段的值</b><br>   Delphi 4的TDBGrid構件完全支持Oracle 8的對象字段。<br>   如果數據集構件的ObjectView屬性設為True,對象字段就可以展開或折疊。當對象字段展開的時候,原來的一列就分為若干列,每一列顯示一個子字段的值,每一個子字段所在的列都有自己的標題欄,這樣可以明顯地看出字段之間的包含關系。當對象字段折疊的時候,就只顯示一個字符串,該字符串列出了每個子字段的值,彼此之間用逗號隔開。<br>   如果數據集構件的ObjectView屬性設為False,每個子字段與對象字段一樣,都單獨占一列。<br>   下面介紹幾個與對象字段有關的屬性。一是TColumn的Expandable屬性,如果設為True,表示該列是可展開的。二是TColumn的Expanded屬性,用于測試列當前是否已展開。三是TDBGrid的MaxTitleRows屬性,用于設置柵格中最多可出現幾行標題。四是TDataSet的ObjectView,這個屬性前面已介紹過了。五是TColumn的ParentColumn屬性,用于返回顯示父字段的列對象。<br>    圖12.7演示了ObjectView屬性設為False的情況:<br>    圖12.7 ObjectView屬性設為False的情況<br>    圖12.8演示了ObjectView屬性設為True但對象字段被折疊的情況:<br>    圖12.8 ObjectView屬性設為True但對象字段被折疊的情況<br>    圖12.9演示了ObjectView屬性設為True但對象字段被展開的情況:<br>    圖12.9 ObjectView屬性設為True但對象字段被展開的情況<br> <b>12.7.6 設置柵格的選項</b><br>   可以在設計期設置柵格的選項,這就要用到TDBGrid構件的Options屬性。Options屬性是一個集合,可以包含下列元素:<br> .dgEditing如果包含這個元素(下同),允許用戶修改柵格中的數據;<br> .dgAlwaysShowEditor柵格自動處于編輯狀態,否則需按F2才進入編輯狀態;<br> .dgTitles顯示列的標題;<br> .dgIndicator當前行的最左端將顯示一個4符號;<br> .dgColumnResize列的寬度可以重設;<br> .dgColLines列與列之間用線分開; <br> .dgRowLines行與行之間用線分開;<br> .dgTabs可以用Tab鍵和Shift+Tab鍵在列與列之間移動輸入焦點;<br> .dgRowSelect用戶可以選擇一整行,否則就只能選擇一個單元;<br> .dgAlwaysShowSelection即使輸入焦點移走,選擇的單元仍然保持選擇狀態;<br> .dgConfirmDelete按Ctrl+Delete刪除一行時將顯示一個確認框,讓用戶確認;<br> .dgCancelOnExit在柵格退出的時候,任何未決的修改將被取消<br> .dgMultiSelect用戶可以在柵格中選擇多行,相當于一個復選的列表框。<br> <b>12.7.7 在運行期響應用戶的動作</b><br>   TDBGrid構件具有幾個事件,用于響應用戶的動作。由于柵格是由行和列構成的,因此,在事件句柄中,首先要區分當前是在哪一列上。下面列出了這些事件:<br> .OnCellClick當用戶單擊一個單元時將觸發這個事件。<br> .OnColEnter當輸入焦點進入某一列時將觸發這個事件。<br> .OnColExit當輸入焦點離開某一列時將觸發這個事件。<br> .OnColumnMoved當用戶把某一列移到另一個位置時將觸發這個事件。<br> .OnDblClick當用戶在柵格中雙擊時將觸發這個事件。<br> .OnDragDrop當用戶在柵格中釋放被拖曳的對象時將觸發這個事件。<br> .OnDragOver當用戶拖著一個對象經過柵格時將觸發這個事件。<br> .OnDrawColumnCell當某個單元需要重畫時將觸發這個事件。<br> .OnDrawDataCell 在State屬性設為csDefault的情況下,當某個單元需要重畫時將觸發這個事件。<br> .OnEditButtonClick當用戶單擊省略號按鈕時將觸發這個事件。<br> .OnEndDrag當用戶釋放了鼠標時將觸發這個事件。<br> .OnEnter當柵格得到輸入焦點時將觸發這個事件。<br> .OnExit當柵格失去輸入焦點時將觸發這個事件。<br> .OnKeyDown當用戶按下一個鍵時將觸發這個事件。<br> .OnKeyPress當用戶按下一個可見的字符鍵時將觸發這個事件。<br> .OnKeyUp當用戶釋放一個鍵時將觸發這個事件。<br> .OnStartDrag當用戶開始進行拖放操作時將觸發這個事件。<br> .OnTitleClick當用戶單擊某一列的標題時將觸發這個事件。<br> <b>12.7.8 一個特殊的數據庫柵格</b><br>   TDBGrid構件的特點是一行只顯示一個記錄,但可以設置每一列的屬性。 TDBCtrlGrid構件的特點是每一行都是一個窗格(TPanel對象),可以在窗格上放一些控件。例如,可以把一個TDBEdit構件放到窗格上,讓它顯示某個字段的值,還可以在編輯框的旁邊加一個TLabel構件作為標簽。TDBCtrlGrid的另一個特點是一行上可以有多個窗格,也就是說,一行可以顯示多個記錄,窗格的高度和寬度都是可以調整的。<br>   首先,要把一個TDBCtrlGrid構件放到窗體上,設置它的DataSource屬性指定一個TDataSource構件。剛開始的時候,TDBCtrlGrid構件有三行和一列。<br>   接著,要把一些數據控件放到TDBCtrlGrid構件的“設計單元”上,設置這些數據控件的DataField屬性指定要顯示的字段。<br>   “設計單元”通常是最上邊或最左邊的那個單元,與其他單元在外觀上的區別是它沒有斜線底紋。<br>   注意:只能把數據控件放到TDBCtrlGrid構件的“設計單元”上,當程序編譯運行后,會自動把“設計單元”上的數據控件復制到其他單元,每個單元顯示不同的記錄。<br>   圖12.10演示了TDBCtrlGrid構件的用法: <br>   圖12.10 TDBCtrlGrid構件的用法<br>   下面列出了TDBCtrlGrid構件的屬性:<br> .AllowDelete設為True表示允許刪除記錄。<br> .AllowInsert設為True表示允許插入記錄。<br> .ColCount用于設置每一行的窗格數,默認是1。<br> .Orientation設為goVertical表示從上到下顯示記錄,設為goHorizontal表示從左到右顯示記錄。 <br> .PanelHeight用于設置窗格的高度,默認是72。<br> .PanelWidth用于設置窗格的寬度,默認是200。<br> .RowCount用于設置行數,默認是3。<br> .ShowFocus如果設為True,顯示當前記錄的窗格上有一個虛線邊框。<br> .SelectedColor用于設置顯示當前記錄的窗格的背景顏色。<br> <b>12.8 導 航 器</b><br>   導航器是用TDBNavigator構件實現的,它可以讓用戶方便地瀏覽和操縱記錄。導航器最多可由10個按鈕組成,包括:<br> .First第一個記錄;<br> .Prior前一個記錄;<br> .Next后一個記錄;<br> .Last最后一個記錄;<br> .Insert插入一個空白的記錄;<br> .Delete刪除當前記錄;<br> .Edit允許編輯當前記錄;<br> .Post使未決的編輯操作有效;<br> .Cancel取消未決的編輯操作;<br> .Refresh用數據集中的最新的數據刷新記錄。<br>   可以根據需要,在導航器上有選擇地顯示部分按鈕,這就要用到VisibleButtons屬性。<br>   在設計期,可以在對象觀察器中選擇要顯示在導航器上的按鈕。在運行期,您可以通過編程選擇要顯示在導航器上的按鈕。例如,假設要用同一個導航器為兩個數據集導航,其中一個允許用戶編輯數據,另一個不允許用戶編輯數據。當在兩個數據集之間切換時,應當動態地改變導航器上的按鈕,因為對于不允許用戶編輯數據的數據集來說,導航器上不應當出現Insert、Delete、Edit、Post、Cancel和Refresh等按鈕。下面代碼把這些按鈕隱藏:<br> Procedure TForm1.CustomerCompanyEnter(Sender :TObject);<br> Begin<br> If Sender = CustomerCompany then<br> Begin<br> DBNavigatorAll.DataSource := CustomerCompany.DataSource;<br> DBNavigatorAll.VisibleButtons := [nbFirst,nbPrior,nbNext,nbLast];<br> End<br> Else<br> Begin<br> DBNavigatorAll.DataSource := OrderNum.DataSource;<br> DBNavigatorAll.VisibleButtons := DBNavigatorAll.VisibleButtons + [nbInsert,nbDelete,nbEdit,nbPost,nbCancel,nbRefresh]; <br> End;<br> End;<br>   這里順便說一下,當同一個導航器需要為幾個數據集導航時,就要動態地設置DataSource屬性。假設窗體上有兩個TDataSource構件,分別叫CustomersSource和OrdersSource,它們的DataSet屬性分別指定CustomersTable表和OrdersTable表,另外,窗體上有兩個TDBEdit構件,分別叫CustomersEdit和OrdersEdit,它們的DataSource屬性分別指向CustomersSource和OrdersSource。下面這段程序為這兩個TDBEdit構件寫了一個公共的事件句柄來處理OnEnter事件,當用戶在CustomersEdit 上編輯時,導航器將為CustomersTable導航,當用戶在OrdersEdit上編輯時,導航器將為OrdersTable導航。<br> Procedure TForm1. CustomerEditEnter(Sender: TObject);<br> Begin<br> If Sender = CustomerEdit Then<br>    DBNavigatorl.DataSource := CustomerEdit.DataSource;<br> Else<br> DBNavigator1.DataSource := OrderEdit.DataSource;<br> End;<br> <b>12.9 數 據 源</b><br>   TDataSource構件是一個非可視的構件,它充當了數據集和數據控件之間的橋梁。每一個數據控件都必須指定一個數據源(TDataSource構件),相應地,TDataSource構件的DataSet屬性必須指定一個數據集。下面簡單介紹一下TDataSource構件的屬性和事件。<br>   DataSet屬性用于指定一個數據集。在設計期,可以在對象觀察器中為DataSet屬性選擇一個數據集。在運行期,可以通過代碼動態地選擇數據集。程序示例如下:<br> With CustSource Do<br> Begin<br> If DataSet = 'Customers' then<br> DataSet := 'Orders'<br> Else<br> DataSet := 'Customers';<br> End;<br>   也可以指定另一個窗體上的數據集構件,例如:<br> Procedure TForm2. FormCreate (Sender : TObject);<br> Begin<br> DataSource1.Dataset := Form1.Table1;<br> End;<br>   一般情況下,TDataSource構件的名稱是無關緊要的。不過,TDataSource構件的名稱應當能反映它所連接的數據集,例如,假設TDataSource構件連接的數據集叫Customers,相應地,TDataSource構件的名稱最好叫CustomersSource。 <br>   Enabled屬性用于控制TDataSource構件是否與數據集連接,設為True表示連接,設為False表示暫時斷開連接。如果Enabled屬性設為False,凡是連接于這個數據源的數據控件將變成空白。<br>   如果AutoEdit屬性設為True,當用戶在數據控件中鍵入字符時,數據集就自動進入dsEdit狀態。如果AutoEdit屬性設為False,程序必須調用Edit函數才能進入dsEdit狀態。<br>   當數據集的當前記錄的位置發生變化時將觸發OnDataChange事件,這可能是因為程序調用了Next、Previous、Insert等方法。<br>   當前記錄的數據將要被更新時將觸發OnUpdateData事件,這可能是因為調用了Post。在處理這個事件的句柄中,可以對數據進行校驗。<br>   當State屬性發生變化時將觸發OnStateChange事件。例如,可以用一個標簽動態地顯示當前的狀態。程序示例如下:<br> ProcedureTForm1.DataSource1.StateChange(Sender:TObject);<br> var<br> S:String;<br> Begin<br> Case CustTable.State of<br> dsInactive: S := 'Inactive';<br> dsBrowse: S := 'Browse';<br> dsEdit: S := 'Edit';<br> dsInsert: S := 'Insert';<br> dsSetKey: S := 'SetKey';<br> End; <br> CustTableStateLabel.Caption := S;<br> End;<br>   利用OnStateChange事件也可以動態地允許或禁止按鈕和菜單項,程序示例如下:<br> Procedure Form1.DataSource1.StateChange(Sender: TObject);<br> Begin<br> CustTableEditBtn.Enabled := (CustTable.State = dsBrowse);<br> CustTableCancelBtn.Enabled := CustTable.State in [dsInsert, dsEdit, dsSetKey];<br> ...<br> End;</body></html>

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
26uuu成人网一区二区三区| 在线成人高清不卡| 国产精品一二三区在线| 日本成人在线网站| 美女一区二区三区| 蜜乳av一区二区三区| 国产一区二区按摩在线观看| 久久精品国内一区二区三区| 六月丁香婷婷久久| 国产成人精品亚洲777人妖 | 成人综合在线网站| av亚洲精华国产精华精华| 色综合 综合色| 欧美精品一二三区| 久久噜噜亚洲综合| 国产精品久久99| 亚洲自拍偷拍综合| 午夜亚洲国产au精品一区二区| 亚洲成av人片在www色猫咪| 丝袜a∨在线一区二区三区不卡| 日韩精品高清不卡| 国产成人av自拍| 在线视频一区二区免费| 欧美电视剧在线观看完整版| 久久久国产精品不卡| 中文字幕亚洲欧美在线不卡| 亚洲午夜精品17c| 精品一区二区综合| 91丨porny丨蝌蚪视频| 欧美理论在线播放| 国产女主播在线一区二区| 亚洲欧美区自拍先锋| 日韩电影在线免费看| 国产精品白丝jk黑袜喷水| 91传媒视频在线播放| 精品国产1区二区| 亚洲动漫第一页| 丁香啪啪综合成人亚洲小说| 欧美人xxxx| 综合色中文字幕| 国产精品久久久久久福利一牛影视 | 日韩av一区二区三区| 国产精品一区2区| 欧美伊人久久久久久久久影院| 日韩免费电影一区| 亚洲高清免费观看高清完整版在线观看| 美女在线视频一区| 欧美日韩一区二区在线观看视频| 久久久久88色偷偷免费| 亚洲成人动漫一区| 91麻豆国产在线观看| 久久精品欧美一区二区三区不卡| 亚洲综合精品久久| bt欧美亚洲午夜电影天堂| 26uuu国产电影一区二区| 日本亚洲欧美天堂免费| 欧美午夜精品电影| 亚洲色图欧洲色图婷婷| 成人免费毛片a| 国产欧美日本一区二区三区| 欧美aaa在线| 精品视频1区2区3区| 一区二区三区在线视频免费观看| 丁香婷婷深情五月亚洲| 久久这里只有精品6| 狠狠色丁香久久婷婷综| 日韩视频在线你懂得| 日韩电影在线观看网站| 欧美日韩一区国产| 视频一区二区三区在线| 欧美日韩精品一区二区在线播放| 一区二区高清在线| 欧美午夜一区二区三区免费大片| 亚洲精品欧美激情| 欧美在线啊v一区| 亚洲午夜精品在线| 欧美人妖巨大在线| 免费观看成人av| 欧美一区二区三区思思人| 婷婷开心激情综合| 欧美一区二区三区白人| 蜜臀av亚洲一区中文字幕| 精品嫩草影院久久| 国产风韵犹存在线视精品| 国产精品视频yy9299一区| eeuss鲁片一区二区三区在线观看| 最新国产成人在线观看| 色婷婷久久久久swag精品| 亚洲影院免费观看| 欧美日韩国产大片| 国产一区在线看| 中文字幕亚洲一区二区va在线| 色婷婷综合久久久中文字幕| 亚洲福利视频导航| 欧美videossexotv100| 成人国产精品免费网站| 一区二区三区在线免费观看| 欧美精品乱人伦久久久久久| 国产一区二区美女诱惑| 国产精品国产馆在线真实露脸| 色综合久久中文综合久久97| 日韩vs国产vs欧美| 国产欧美一区二区精品婷婷| 色美美综合视频| 日本大胆欧美人术艺术动态 | 在线亚洲人成电影网站色www| 亚洲国产成人porn| 久久人人爽人人爽| 欧美日韩国产三级| 高清在线不卡av| 日本不卡一区二区| |精品福利一区二区三区| 欧美日韩国产天堂| av网站免费线看精品| 蜜臀av性久久久久蜜臀av麻豆| 国产精品久久久久久久久图文区| 欧美精三区欧美精三区| 成人动漫中文字幕| 青青草精品视频| 亚洲综合区在线| 国产精品久久久久三级| 91精品国产综合久久精品性色| av亚洲精华国产精华精华| 久久国产精品99久久人人澡| 亚洲精品久久久久久国产精华液| 久久综合国产精品| 884aa四虎影成人精品一区| www.激情成人| 国产一区二区三区电影在线观看| 午夜精品福利视频网站| 中文字幕一区二区三区不卡| 久久综合色综合88| 欧美va亚洲va香蕉在线| 欧美日韩你懂得| 欧美综合久久久| 在线不卡的av| 欧美中文一区二区三区| av网站一区二区三区| 国产精一品亚洲二区在线视频| 日韩—二三区免费观看av| 亚洲二区在线观看| 亚洲超碰97人人做人人爱| 亚洲综合在线视频| 亚洲精品成人a在线观看| 国产精品传媒在线| 一色屋精品亚洲香蕉网站| 国产午夜精品一区二区三区嫩草| 精品奇米国产一区二区三区| 91精品国产美女浴室洗澡无遮挡| 欧美无砖专区一中文字| 日本精品一级二级| 91福利在线看| 欧美日韩中文国产| 欧美一区二区视频在线观看| 91精品国产色综合久久不卡蜜臀| 欧美日韩一区高清| 日韩一区二区三区观看| 精品国产乱码91久久久久久网站| 日韩欧美一区二区视频| 精品裸体舞一区二区三区| 久久亚洲精精品中文字幕早川悠里 | 亚洲国产中文字幕在线视频综合 | 懂色av噜噜一区二区三区av| 国产成人在线视频网址| 成人一区二区三区中文字幕| 成人永久免费视频| 97精品国产露脸对白| 欧美亚日韩国产aⅴ精品中极品| 欧美系列在线观看| 欧美变态口味重另类| 国产欧美一二三区| 亚洲精品国产高清久久伦理二区 | 精品日韩欧美在线| 久久精品视频一区二区| 国产精品久久久久久亚洲伦| 亚洲精品视频在线看| 日韩福利电影在线| 国产超碰在线一区| 欧美日韩一二三| 精品国产亚洲一区二区三区在线观看| 日本一区二区三级电影在线观看| 亚洲视频香蕉人妖| 日本亚洲电影天堂| 懂色av一区二区在线播放| 欧美日韩一区在线观看| 国产色综合一区| 亚洲小说春色综合另类电影| 精品一区二区三区在线播放视频| 成人精品免费视频| 欧美一区二区精品| 亚洲视频一区在线| 久久精品国产精品青草| 91蜜桃网址入口| 久久综合色婷婷| 亚州成人在线电影| 9色porny自拍视频一区二区| 日韩一区二区三区观看| 一区二区在线看| 国产高清久久久久| 欧美一区二区三区公司|