14.1.3 運行程序
保存文件,命名代碼單元為Cust.pas,命名工程名為CustPRJ.DPR,然後按F9編譯並運行程序。程序執行之後,我們可以使用滾動條或鍵盤移動鍵在字段和記錄間移動。但不能修改表中的數據,因為Datasouc1.AutoEdit1屬性已被設置為False。
Cust程序中的三個部件都有各自的特殊用途,三個部件的相關屬性在內部相互聯系生成最終的應用程序。TTable部件連接磁盤上的實際數據庫表和應用程序中其他部件的通道。TTable部件具有打開和關閉、讀取、更新以及其他處理磁盤數據庫文件的方法。
TDatasource部件是連接TTable部件和數據浏覽部件如TDBGrid部件的橋梁。 TDBGrid部件用於顯示數據庫表中的數據信息,它為應用程序提供一個直觀的界面。圖14.2闡述了這三個部件之間的關系。
Cust程序中三個部件之間的內部關系
TDBGrid 部件的奇妙之處在於它知道如何去獲取數據庫表中的下一條或前一條記錄,我們使用滾動條或箭頭鍵便可以完成這項任務。TDBGrid部件不知道如何增加、刪除和修改記錄。如果想讓 Cust 程序能夠修改數據庫表中的記錄,只要把 Datasource1 部件的AutoEdit屬性設置成True ,並重新編譯和運行程序就可以達到目的。 使用箭頭鍵, 把DBGrid的高亮度條定位到某一個字段上,然後鍵入新值,該字段中的值將被鍵入的新值所取代,並且當移動到另一條記錄時,健入的信息會自動寫入數據庫表中。如果想放棄所做的改動,只需在離開該字段前按一下Escape鍵。
如果想在表中增加新記錄,可以把高亮度條移到網格底端的空白記錄上並輸入新記錄的有關字段值。也可以在用戶指定的某一條記錄的後面插入一條新記錄,只要把高亮度條定位到指定的記錄上,按Ins鍵,使可以在該記錄的後面插入新記錄。
刪除某一條記錄時,把高亮度條定位在想刪除的記錄的任何字段上,按Ctrl+ del鍵,這時會出現保護信息,我們可以確認是否真的想刪除該項記錄。
TDBGrid為用戶提供了較完備的功能,用於控制是否編輯、增加或刪除記錄。若想禁止對數據庫表作任何修改,設置TDBGrid部件的Readonly屬性為 True , 並設置 Option.dgEDiting為False(這將為我們提供一個只讀的數據庫表浏覽器而不是數據庫編輯器,但它隱含著增加、編輯和刪除記錄的能力)。TDBGrid部件的這些屬性和Option屬性其它選項的各種不同組合可以讓我們很方便地對數據庫表進行有效的浏覽、編輯等操作。
如果我們經常使用像電子表格那樣的界面來顯示和編輯數據記錄,TDBGrid 部件便是一個很方便的工具,但那並不是最友好的用戶界面,如果想擁有更優美更直觀的界面,我們還可以使用單獨的數據浏覽部件來顯示數據庫表中各個字段的值,並利用TDBNavigator部件控制對數據庫表的存取。
14.2 利用TDBNavigator部件創建存取程序
我們可以改進一下Cust程序以便它一次只在對話框中顯示一個客戶的記錄信息,並用一個TDBNavigator部件控制對記錄存取──允許我們選擇一個記錄來顯示或編輯以及增加和刪除記錄。完成的應用窗體。
增強的Cust程序
14.2.1 創建應用程序窗體
我們可以非常迅速地創建起來,因為到目前為止我們對創建窗體的方法已經比較熟悉,我們首先把所有的部件都放到窗體中,然後再設置它們的屬性。
開始一個新工程,設置窗體Form1的Name 屬性為 Customerform2 , Caption 屬性為 CustomerForm2。然後從部件選擇板上的Data Access頁上選取一個Datasource部件和一個Table部件放在窗體的右上角。再從Data Controls頁上選取DBNatvigator部件放在窗體的左上角。
窗體中其余的部件如圖14.3所示。它們是TDBEdit和TLabel部件,按圖14.3 所示創建並布置部件,分別命名DBEdit部件為EditCustno、 Editcompany 、 EditAddr1 、EditAddr2、EditCity、EditState、EditZip、EditCountry、EditPhone 、EditFAX、EditTaxRate、EditContact。
現在我們來連接TTable部件和 TDataSource 部件, 然後連接所有的數據浏覽部件和DataSource部件。設置TBNavigator部件和TDBEdit部件的屬性,它們的DataSource屬性都設置為DataSouce1。我們最後要做的事是連接窗體中各個TDBEdit 部件和它們在數據庫表中對應的字段名,通過設置TDBEdit 部件的 DataField 屬性來完成。 例如要連接命名為EditCustNo的TDBEdit部件和數據庫表中的CustNo字段,具體步驟如下:
①選中窗體中的EditCustNo部件。
②在Object Inspector窗體中,單擊DataField屬性右邊的箭頭。
③從下拉列表中選中CustNo字段名。
對窗體中的其他TDBEdit部件執行以上操作連接到其對應的字段,然後保存文件。命名代碼單元名為Cust2.pas,命名工程名為Cusprj2.DPR。
14.2.2 使用TDBNavigator部件移動記錄指針
上述程序運行之後,在數據浏覽部件中會顯示數據庫表中的第一條記錄。利用Tab 鍵可以在字段之間移動,但是不能編輯字段。因為我們為了防止意外修改,設置了Table1的AutoEdit屬性值為False。如果想對數據庫表中的記錄進行編輯、插入和刪除操作或者想顯示數據庫表中另一條記錄, 需要按 TDBNvigator 部件上這些功能所對應的功能按鈕。TDBNavigator部件上的按鈕和它們的功能如圖14.4所示。
TDBNavigator中的按鈕
TDBNavigator部件的絕大多數功能都可以根據其按鈕的圖標能夠很容易地識別出來,而且TDBNavigator部件本身能感知到很多事情,如當前指針是否在數據庫表的開頭或尾部。如果用戶正在查看數據庫表中的最後一個記錄,Next和Last按鈕將會變灰成為非活動狀態。同樣,如果用戶當前正在浏覽數據庫表中的第一條記錄, TDBNavigator 上的 First 和Previous按鈕會變灰而成為非活動狀態。有關各個按鈕的作用的更詳細說明請查看聯機幫助。
如果用戶想修改當前的記錄,單擊TDBNavigator部件的Edit按鈕,然後完成需要做的修改,在做完修改之後,單擊Post按鈕以便將作的修改寫入實際的數據庫表中(更新實際的數據庫表中的記錄在數據庫術語中叫作“投寄”記錄即PostT)。如果想取消所做的修改,單擊Cancel按鈕。Cancel按鈕只取消自從上一次往數據庫表中投寄記錄以來對記錄所做的修改。例如,如果用戶曾修改了CustNo字段並單擊了Post按鈕投寄了修改,然後再修改Company字段並按Cancel,那麼只有對Company所做的修改將會被取消。也就是說,一旦修改被寫入了數據庫表中,再按Cancle按鈕是無法取消對記錄的修改的,要想恢復到以前的狀態,用戶必須要重新編輯修改記錄。值得注意的是,當用戶修改了當前的記錄,並移動到其他記錄時,TDBNavigaator部件會自動地投寄用戶對記錄的修改。例如:如果我們修改了記錄的Company字段,並沒有按Post按鈕以更新表中的記錄,而是移動到下一條記錄,這時用戶對記錄的修改也會自動地被寫入數據庫表中。
14.2.3 定制TDBNavigator部件
TDBNavigator部件中的按鈕對我們開發人員來說是很方便的,但對於程序的最終用戶來說不一定那麼一目了然。為了幫助最終用戶或初級用戶更方便有效地使用TDBNavigator部件,我們可以設置TDBNavigator部件的ShowHint屬性為True,這樣當鼠標光標停留在TDBNavigator部件上的某一個按鈕上超過大約1秒鐘,在屏幕上便會出現該按鈕的提示信息。如果我們不想使用TDBNavigator部件本身嵌入的提示信息,我們還可以設置TDBNavigtor部件的Hints屬性,為每個按鈕指定特定的提示信息,以幫助用戶使用TDBNavigator部件。
TDBNavigator部件中有多個功能按鈕,但並不是所有的按鈕對每一個數據庫應用程序都是需要的,特別是那些不允許修改表中的數據,或修改只是在很嚴格的控制下進行的數據庫應用程序。我們可以通過設置TDBNavigator部件的 VisibleButtons 屬性來確定要在TDBNavigator中顯示哪些按鈕步顯示哪些按鈕。例如,如果我們不允許用戶修改表中的記錄,我們就不需要Add、Delete、Post、Cancel 或 Refresh 按鈕, 我們設置這些按鈕的VisibleButtons屬性為False,這樣在TDBNavigator部件中將不會出現這些按鈕。
TDBNavigator部件的ConfirmDelete屬性和Delete 按鈕配合使用對用戶刪除數據庫表中的記錄是非常有用的,當ConfirmDelete屬性設置為 True (缺省設置), 當用戶單擊Delete按鈕試圖刪除當前記錄時,Delphi會彈出一個確認框,要用戶確認是否真的想刪除當前記錄。這樣,在用戶進行刪除記錄的操作時,會更安全一些。如果用戶不希望在按下Delete按鈕時出現確認框,只要把ConfirmDelete設置為False就可以了。
還有一些屬性可以用來定制TDBNavigator部件的外觀和性能,有關這方面的詳細信息請參看聯機幫助。