| 後一頁 前一頁 回目錄 回首頁 |
在TDBGrid部件中顯示資料庫表中的記錄資訊時,如果TDBGrid使用數據集部件在執行過程中動態產生的欄位部件時,TDBGrid顯示資料庫表中的記錄是按表中記錄的缺省順序和欄位的缺省順序顯示表中的記錄資訊,而且要顯示表中各個記錄的全部欄位的值。而在大多數情況下,用戶可能希望按自己喜歡的欄位順序顯示記錄的各個欄位,有時還希望只顯示記錄的部分欄位值,要達到這一目的,必須在設計階段使用欄位編輯器來建立永久性的欄位部件,並且還要設定各個欄位部件有關的屬性。 當使用欄位編輯器(Fields Editor)建立永久性的欄位部件提供給TDBGrid部件來使用時,我們可以在TDBGrid部件中更靈活地顯示資料庫表中的記錄資訊。例如在欄位編輯器中的Fields列示方塊中我們可以設定欄位部件的顯示順序,在設定好欄位的顯示順序之後,TDBGrid部件便按這個順序顯示記錄的各個欄位值,當我們設定欄位部件的DisplayFormat和EditFormat屬性之後,在TDBGrid部件中便相應地以設定的顯式和編輯格式顯示欄位值和編輯欄位值;當設定某一個欄位部件的Required屬性為True時,當插入一條新記錄時,必須要為該欄位輸入相應的欄位值,否則會出錯;通過設定欄位部件的Visible屬性,可以確定相應的欄位值是否在TDBGrid群群元件中顯示。有關使用欄位編輯器來建立欄位部件,設定欄位部件的屬性請參看3.6.2節。 16.4.1 TDBGrid部件的主要屬性及應用 TDBGrid部件是用於顯示和編輯資料庫表中的記錄資訊的重要部件,它是我們在程式設計過程當中要經常使用的、靈活地用於顯示和編輯資料庫表中的記錄資訊的一個強有力的工具。TDBGrid具有很多重要的屬性,我們可以在程式設計階段和程式執行過程中進行設定。TDBGrid部件的一些重要屬性及其設定方法請參看連線輔助敘述文件。TDBGrid部件中一些重要的屬性是Option屬性、DrawMode屬性和DefaultDrawing屬性,我們重點對兩個屬性進行闡述。 Options屬性:它是TDBGrid部件的一個擴展屬性,在程式設計階段設定Options屬性可以控制TDBGrid部件的顯示特性和對事件的響應特性。Options屬性在TDBGrid部件的屬性欄中顯示時,它的前面帶有一個“+”標誌,連續按兩下“+”標誌,便可以展開一個布爾型屬性清單,用戶可以逐個地修改其中的各個屬性值,修改完畢後可以連續按兩下Options屬性前的“-”標誌,使TDBGrid部件的屬性清單恢復到原來的顯示狀態。 表16.5列出了Options屬性中包含的所有的擴展屬性項以及它們對TDBGrid部件的影響。 表16.5 TDBGrid部件的Options屬性中的擴展屬性項 ───────────────────────────────── 屬 性 名 取 值 及 影 響 ————————————————————————————————— dbEditing True: 缺省情況下為此值,確保用戶能夠在網格中編輯插 入和解除資料庫表中的記錄 False:在網格中不能編輯、插入和解除表中的記錄 ————————————————————————————————— dbAlwaysShow True: 當用戶選中記錄中的一個欄位時,自動地使該欄位 Editor 處於編輯狀態 False:缺省情況下為此值。當一個欄位被選中,它不能 自動地變成編輯狀態 ————————————————————————————————— dgTitles True: 缺省情況下為此值。在網格的第一行中顯示欄位名 或欄位標題 False:在網格中不顯示欄位名或欄位對應的標題 ————————————————————————————————— dgIndicator True: 缺省情況下為此值。在網格的最左邊用一個黑箭頭 標注目前記錄指標所在的位置,在插入狀態時,箭 頭變成星狀,在編輯狀時,箭頭變成"I"頭。 False:在網格中不標識目前記錄指標的位置 ————————————————————————————————— dgColumnResize True: 缺省情況下為此值。通過拖拉網格的垂直分隔線可 以改變網格中各列的寬度,在具體操作時要拖拉各 列中顯示欄位標題區欄位中的垂直分隔線。 False:網格中各列的寬度不能改變 ————————————————————————————————— dgCloLines True: 缺省情況下為此值。在網格中顯示各列之間的垂直 分隔線。 False:在網格中不顯示垂直分隔線 ————————————————————————————————— dgRowLines True: 缺省情況下為此值。在網格中顯示各行之間的水準 分隔線。 False:在網格中不顯示水準分隔線。 ————————————————————————————————— dgTabs True: 缺省情況下為此值。可以在記錄的各欄位之間移動 輸入焦點(也即選擇提示棒) False:不能在記錄的名欄位之間移動輸入焦點,在網格中 按Tab鍵時,直接跳出網格 ————————————————————————————————— dgRowSelect True: 選擇提示棒覆蓋整條記錄中的全部欄位 False:缺省情況下為此值。選擇提示棒一次只覆蓋記錄中 的一個欄位 ————————————————————————————————— dgAlwaysShow True: 缺省情況下為此值。在網格始終顯示選擇提示棒,即 -Selection 使其控件獲得焦點時,也是如此。 False:只在當網格獲得焦點時,才顯示選擇提示棒。 ————————————————————————————————— dbConfirmDelete True: 缺省情況下為此值。當在網格中解除記錄時,彈出確 認資訊。 False:在網格中解除記錄時不彈出確認資訊。 ───────────────────────────────────
用戶想了解這些可選屬性項的作用和影響,還可以參看連線輔助敘述資訊。 DragMode屬性:該屬性有兩個可選的屬性值。當它的值被設定為dmManual時,在應用程式執行過程中,用戶可以用滑鼠拖放網格中的各列,改變各列在網格中的顯示順序和位置。當用滑鼠拖放網格中的一列、改變它在網格中的位置時,只是改變了該列在數據集中的位置,並沒有改變它對應的資料庫表中的位置。當該屬性的值被設定成dmAutomatic時,用戶不能用滑鼠拖放網格中的各列而改變它在網格中的位置。 DefalultDrawing屬性:該屬性是布爾型屬性,它用於控制網格中各網格單元的繪制方式。在缺省情況下,該屬性的值為True,也就是說Delphi使用網格本身缺省的方法繪制網格中各網格單元,並填充各網格單元中的內容,各網格單元中的數據根據其對應的欄位部件的DisplayFormat屬性和EidtFormat屬性進行顯示和繪制。如果DefaulDrawing屬性被設定為False時,Delphi不會自動地繪制網格中各網格單元和網格單元中的數據,用戶必須自己為TDBGrid部件的OnDrawDataCell事件編寫相應的程式用於繪制各網格單元和其中的數據。 在了解了TDBGrid部件的各個屬性之後,我們便可以使用TDBGrid部件來顯示和編輯資料庫表中的數據了。圖16.5所示的應用窗體中各部件的屬性設定如表16.6所示。
表16.6 各部件的屬性設定 ──────────────────── 屬 性 名 屬 性 值 ———————————————————— Table1.DatabaseName DEMOS Table1.TableName Customer.DB Table1.CanModify True DataSource1.DataSet Table1 DataSource1.AutoEdit True DBGrid1.Datasource DataSource1 DBGrid1.ReadOnly False ────────────────────
在其他數據瀏覽部件(如TDBEdit)中編輯修改其中的內容時,只要用戶用Tab鍵或滑鼠將焦點移到其他部件時,用戶對該欄位的修改會自動地寫回到資料庫表中,使用TDBGrid部件編輯修改資料庫表時,Delphi是以記錄為基本單位將修改寫回磁碟上的資料庫表的。用戶在編輯和修改表中的目前記錄時,只有用戶將記錄指標移到其他的記錄時,Delphi才將用戶對目前記錄的修改寫回到磁碟上的資料庫表,否則,用戶即使改變焦點到窗體中的其他部件,Dephi也不會投寄用戶對目前記錄的修改。Delphi在向資料庫表投寄TDBGrid部件中的被修改的記錄時,它會自動地檢查所有與目前資料庫相連的數據瀏覽部件的狀態,只要其中有任何一數據瀏覽部件正在修改數據,這時會彈出出錯資訊,並且目前記錄的修改不會被投寄(即被寫回磁碟上的資料庫表)。
16.4.2 TDBGrid部件的事件及應用
TDBGrid部件在具有很多重要屬性的同時,Delphi也為它賦予了一些事件,以用於控制用戶在TDBGrid部件中的操作,我們通過為其中的一些事件編寫處理程式,可以有效地控制TDBGrid部件的行為。因為在TDBGrid部件中一次是顯示多條記錄和記錄中的多個欄位,也許在實際應用中,不同的用戶各有自己特殊的需要,如只想改變其中某一列的值或者控制用戶每次只能進出網格中指定的列等等。表16.7列出了TDBGrid部件的主要事件及目的用途。
表16.7 TDBGrid部件中的主要事件 ──────────────────────────────── 事 件 名 目 的 用 途 ———————————————————————————————— OnColEntor 當用戶進入網格各列時,觸發該事件 OnColExit 當用戶離開網格各列時,觸發該事件 OnDblClick 當用戶在網格中連續按兩下滑鼠左鍵時,觸發該事件 OnDragDrop 當用戶在網格中用滑鼠進行拖放操作時,觸發該事件 OnDragOver 當用戶在網格中用滑鼠拖動網格時,觸發該事件 OnDrawDataCell 用於定制繪制網格中各網格單元,當向網格中填充數 據時觸發該事件 OnEndDrag 當用戶停止拖動網格時,觸發該事件 OnEnter 當網格獲得焦點時,觸發該事件 OnExit 當網格失去焦點時,觸發該事件 OnKeyDown 當用戶在網格中按下任何鍵或群群組合鍵時,觸發該事件 OnKeyPress 當用戶在網格中按了任何一個數字鍵或字母鍵時,觸 發該事件 OnKeyUp 當用戶在網格中釋放任何被按下的鍵時,觸發該事件 ────────────────────────────────
上述這些事件在我們開發實際的應用程式時,是很有用處的,讀者們可以仔細地研究這些事件的用途,並參看連線輔助敘述資訊。 例如,我們可以為TDBGrid部件的OnDblClick事件編寫處理程式,當用戶在網格中連續按兩下滑鼠左鍵時,彈出一個列示方塊供用戶為網格中某一列選擇一個欄位值。在例16.1中我們建立如圖16.5所示的應用,在Object Inspector中設定各欄位部件的Visible屬性,在網格中只顯示CustNo、Company、Country和City欄位。我們為DBGrid編寫OnDblclick事件處理過程,當用戶編輯修改Country欄位時,連續按兩下滑鼠左鍵便彈出一個列示方塊ListBox1,其中顯示“中國”、“美國”、“日本”、“英國”、“法國”、“俄羅斯”供用戶選擇,用戶按一下其中的國家標簽後,將相應的洲名選入網格中。 其中ListBox1的Items屬性寫入上述國家的標簽,並且設定其Visible屬性為False。 6.5 TDBNavigator部件及其應用 TDBNavigator 部件主要用於在數據集中進行記錄導航和為用戶操縱數據集中的記錄提供了一群群組簡單明了的控制按鈕。TDBNavigator部件中包含一群群組控制按鈕,用戶按一下其中的按鈕可以向前向後移動記錄指標、插入記錄、修改現存記錄、投寄對記錄的修改、取消修改、解除記錄;以及刷新記錄的顯示等。 圖16.7為TDBNavigator部件中的控制按鈕。 下表描述了TDBNavigator部件中的各個控制按鈕。 表16.8 TDBNavigator部件中的控制按鈕 ───────────────────────────────── 按鈕標簽 主 要 功 能 ————————————————————————————————— First 將目前記錄指標移到資料庫表中第一條記錄處 Prior 將記錄指標移到目前記錄的前一條記錄處 Next 將記錄指標移到目前記錄的後一條記錄處 Last 將目前記錄指標移到資料庫表中最後一條記錄處 Insert 呼叫數據集部件的Insert方法,在目前記錄的前面 插入一條新記錄,並將數據集部件置為插入狀態 Delete 解除目前記錄,如果TDBNavigator部件的ConfirmDelete 屬性設定為true時,會彈出解除確認對話方塊 Edit 將數據集部件置為編輯狀態,以便用戶修改目前的記錄 Post 投寄對目前記錄的修改 Cancel 取消對目前記錄的修改,並將數據集部件置為瀏覽狀態 Refresh 清除數據瀏覽部件的顯示緩衝區,並用與其相連的數據 集部件(TTable或TQuery)中的記錄刷新顯示緩衝區。 ─────────────────────────────────
TDBNavigator部件的屬性較少。下面我們作一簡單的介紹:TDBNavigator部件的一個重要屬性是VisibleButtons屬性,該屬性中包含著多個可選的擴展子屬性,主要用於選擇TDBNavigator部件中各個控制按鈕的顯示與否的。因為在實際的應用當中,我們並不需要那麼多的控制按鈕。如在一個瀏覽資料庫表的應用中,我們一般只需要First、Prior、Next、Last四個按鈕就行了,那麼我們便在VisibleButtons屬性中設定其它的按鈕為False即可。 ShowHint屬性:該屬性是布爾型屬性,它用於控制是否顯示TDBNavigator部件中各按鈕的動態提示資訊。缺省情況下該屬性的值為False,當設定它的值為True時,當用戶將滑鼠遊標停留在TDBNavigator部件中某一個控制按鈕上,超過1秒鐘時間後,Delphi便會自動顯示有關該控制按鈕的提示資訊。 Hints屬性:在缺省情況下,TDBNavigator部件中的各控制按鈕都有相應的動態提示資訊,如First、Prior、Next、Last等,用戶可以根據自己的需要,通過設定Hints屬性可以為各控制按鈕設定其他的動態提示資訊,用戶自己設定的動態提示資訊會覆蓋原來的提示資訊。 16.6 TDBMemo部件及其應用 TDBMemo部件主要用於顯示和編輯資料庫表中的大二進制(BLOB)型式的欄位值。TDBMemo部件能夠顯示多行文本,也允許用戶在其中輸入和修改多行文本資訊,它是Delphi中用來顯示和編輯資料庫表中的大二進制型式的文本欄位的唯一的數據瀏覽部件。 TDBMemo部件的主要屬性和作用如下: ReadOnly屬性:這是布爾型屬性,為True時,用戶只能在TDBMemo部件中顯示BLOB型文本資訊,如Paradox和dBASE資料庫表中的備註型欄位。當為False時,用戶在TDBMemo 部件中不僅可以顯示BLOB文本資訊而且還允許用戶編輯修改其中的文本資訊。 MaxLength屬性:該屬性是整數型屬性,設定該屬性的值用於限制用戶向TDBMemo 部件中輸入字元的個數。若設定該值為0時,表示輸入字元的個數沒有限制。 SCrollBar屬性:敘述TDBMemo部件是否顯示卷軸。 WordWrap屬性:敘述在TDBMemo部件中輸入文本資訊時,輸入到右邊界時,是否換行。 Alignment屬性:敘述文本資訊在TDBMemo部件中的對齊方式,有三種可選值:taLeftJustify、taCenter和taRightJustify。其含義分別是左對齊,居中和右對齊。 在執行過程中,用戶對TDBMemo部件中顯示的文本資訊是不能夠進行剪下來、拷貝和貼上去操作的,要想具備這些功能,用戶必須程式設計呼叫CutToClipboard、CopyToClipboard 和PasteFromClipboard方法分別來實現剪下來,拷貝和貼上去操作。 AutoDisplay屬性:因為TDBMemo部件中包含著大量的文本資訊。應用程式在執行過程中要顯示其中的資訊需要花費很多的時間,特別是當用戶移動記錄指標時,都要更新TDBMemo部件中顯示的資訊,這樣會大大減慢程式的執行速度。為此Delphi為TDBMemo部件設定了AutoDisplay屬性,用來控制是否自動顯示表中的備註型欄位。當AutoDisplay設定為False時,在TDBMemo部件中只顯示其對應表中的欄位名而不顯示欄位中的文本資訊,用戶如果想瀏覽欄位中的文本資訊,用滑鼠左鍵連續按兩下TDBMemo部件的內部即可;當設定AutoDisplay屬性為True時,在TDBMemo部件中會自動地顯示其對應資料庫表中的欄位值。 這�堶n注意的是,TDBMemo部件中顯示和編輯文本資訊的最大位元群組數為32K,在使用過程中不要超過這一限制。 圖16.8是TDBMemo顯示資料庫表中備註型欄位的情形。該例子在C:\Delphi\DEMOS\DA子目錄中,項目標簽為FashFact.dpr。 用TDBMemo部件顯示備註型欄位 16.7 TDBImage部件及其應用 TDBImage部件與TDBMemo部件具有很多相似的屬性,它是用來顯示和編輯資料庫表中的BLOB型式的點陣圖圖像欄位的。 圖16.8中同時也使用了一個TDBImage部件來顯示資料庫表中的點陣圖圖像。 缺省情況下,在TDBImage部件中是允許用戶對點陣圖圖像進行編輯的,如將圖像剪下來或拷貝到剪帖板上或從剪帖板上粘帖到TDBImage部件中等操作,同時也可以在程式中呼叫CutToClipboard、CopyToClipboard和PasteFromClipboard方法來實現剪下來、拷貝、粘帖操作,當然要進行上述操作必須確保TDBImage的ReadOnly屬性值為False。 TDBImage部件也具有一個AutoDisplay屬性,該屬性的控制和作用與TDBMemo 部件的AutoDisplay屬性是一樣的。 16.8 數據瀏覽部件中的列示方塊和群群組合框 在數據瀏覽部件中有四個部件類似於標準部件中的列示方塊和群群組合框,這些列示方塊和群群組合框主要是在資料庫應用程式中為用戶提供一系列的可選擇的欄位值。注意這些部件只能與TTable部件配合使用,而不能與TQuery部件配合使用。 表16.9 數據瀏覽部件中的列示方塊和群群組合框 ────────────────────────────────── 部 件 名 用 途 —————————————————————————————————— TDBlistBox 在用戶修改目前記錄中指定的欄位值時,可用該部件顯示 一個欄位值清單供用戶選擇 TDBComboBox 把一個TDBEdit部件與一個可選的欄位值清單結合在一起, 當用戶修改目前記錄中的欄位時,可以直接從部件中輸入 新的欄位,也可以打開下拉式列示方塊選擇其中的一個可選項。 TDBLookapList 當用戶要編輯修改資料庫表目前記錄的指定欄位時,使用 該部件提供多個可選項,這多個可選項是從相關的其它數 據庫表中讀取的,且以列示方塊的形式提供給用戶 TDBLookupCombo 該部件結合了TDBEdit部件和TDBComboBOx部件的功能,用 戶可以直接向該部件中輸入欄位值,也可以從下拉式清單 框中選擇一個可選項,只是下拉式列示方塊中的可選項是從 相關的其他資料庫表中讀取來的。 ────────────────────────────────── 16.9 TDBComboBox部件 TDBComboBox部件中包含了TDBEdit部件的全部功能,它們具有相似性,不同的是在執行過程中TDBComboBox部件同時有一個下拉式列示方塊,在下拉式列示方塊中有一群群組可供選擇的項供用戶選擇,這些可選項是在設計階段由程式設計人員提供給TDBComboBox部件的Items屬性的。圖16.9是TDBComboBox部件的下拉式列示方塊中的內容,注意TDBComboBox部件一定要對應資料庫表中的一個欄位。 圖16.9 TDBComboBox部件在執行過程中 TDBComboBox部件的一個重要的屬性是Items屬性,該屬性中包含著TDBComboBox部件在執行過程中下拉式列示方塊中的可選項,Items中的內容可以在設計階段指定。 如果一個TDBComboBox部件對應著資料庫表中一個欄位,那麼當用戶要編輯修改該欄位中的值時,可以打開下拉式列示方塊,從中選擇一個可選項作為欄位值,也可以自己在TDBComboBox部件中輸入一個其他的欄位值。 TDBComboBox部件還有下列一些重要的屬性,主要用來控制TDBComboBox部件的顯示模式和風格的。 Style屬性:控制TDBComboBox部件列示方塊的顯示格式的,當它的取值為: ● CSDropDown 缺省情況下為此值,顯示一個下拉式列示方塊和一個編輯框,下拉式列示方塊中的可選項都是字元串且各選擇項佔居的高度一樣。 ● CsSimple 只顯示一個列示方塊,列示方塊中的可選項都是字元串,且各選項佔居一樣的高度。 ● CSDropDownList 顯示一個下拉式列示方塊和一個編輯框,但用戶不能向編輯框中輸入一個在列示方塊中 沒有的值。 ● CSOwnerDrawFixed和CSOWnerDrawVariable 在列示方塊中不僅有字元串選項而且還允許有其他型式的選項,如點陣圖圖像等,這方 面的詳細資訊請參看連線輔助敘述。 DropDownCount屬性:允許列示方塊中顯示可選項的最大數目,當可選項數目大於該屬性值時,用戶可以用卷軸察看全部的可選項,當可選項數小於該屬性值時,列示方塊會自動調整其大小以足夠顯示全部可選項。 ItemHeight屬性:當TDBComboBox部件的Style屬性被設定為CSOwnerDrawFixed時,用此屬性來設定列示方塊中每個可選項佔居的高度。 Sorted屬性:布爾型屬性,它決定列示方塊中的可選項是否按字母的排列順序排序。 16.10 TDBListBox部件 TDBListBox部件的基本功能與TDBComboBox部件基本上是一樣的,它們的不同之處在於TDBListBox部件沒有下拉式列示方塊而是一個列示方塊,在列示方塊中顯示一群群組供用戶選擇的可選項,在執行過程中,用戶按一下其中的可選項可以為TDBListBox 部件對應的欄位賦一個欄位值,但用戶不能自己從鍵盤上輸入一個列示方塊中不存在的欄位值。 如果在應用程式中,TDBListBox對應資料庫表中一個具體的欄位,那麼當在數據集中移動記錄指標時,目前記錄中對應TDBListBox部件的欄位的值在TDBListBox部件的列示方塊中將以高光度顯示,如果目前記錄的該欄位值不在列示方塊中,那麼列示方塊中的可選項沒有一項是高光度地顯示的。 TDBListBox的幾個屬性: IntegralHeight屬性:該屬性是用來控制TDBListBox部件中的列示方塊的顯示格式的。當該屬性值為True(缺省情況下為此值)時,列示方塊底部的可選項自動地移到上一次被選用過的可選項的上面。當該屬性的值為False時,列示方塊底部的可選項的顯示方式取決於TDBListBox部件的ItemHeight屬性,並且列示方塊底部可選項可能不能被全部地顯示出來。
|
後一頁 前一頁 回目錄 回首頁 |